rev 7534 - in branches/kde4/packages/kdelibs/debian: . patches

Fathi Boudra fboudra-guest at alioth.debian.org
Thu Oct 18 18:58:50 UTC 2007


Author: fboudra-guest
Date: 2007-10-18 18:58:49 +0000 (Thu, 18 Oct 2007)
New Revision: 7534

Added:
   branches/kde4/packages/kdelibs/debian/patches/01_kdelibs_branch_r726725.diff
Modified:
   branches/kde4/packages/kdelibs/debian/changelog
   branches/kde4/packages/kdelibs/debian/patches/10_kdehome_kde4.diff
   branches/kde4/packages/kdelibs/debian/patches/13_qt4_designer_plugins_path.diff
   branches/kde4/packages/kdelibs/debian/patches/series
Log:
* svn branch pull to r726725


Modified: branches/kde4/packages/kdelibs/debian/changelog
===================================================================
--- branches/kde4/packages/kdelibs/debian/changelog	2007-10-18 17:58:43 UTC (rev 7533)
+++ branches/kde4/packages/kdelibs/debian/changelog	2007-10-18 18:58:49 UTC (rev 7534)
@@ -1,11 +1,15 @@
 kde4libs (4:3.94.0-2) experimental; urgency=low
 
+  * svn branch pull to r726725.
+
+  +++ Changes by Armin Berres:
+
   * Add debug package.
   * Make kdelibs5-dev depend on recent soprano.
   * Add dependency of kdelibs5 on kde-icons-oxygen. It is needed by nearly
     every KDE4 application.
 
- -- Armin Berres <trigger+debian at space-based.de>  Thu, 18 Oct 2007 01:07:02 +0200
+ -- Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>  Thu, 18 Oct 2007 20:56:22 +0200
 
 kde4libs (4:3.94.0-1) experimental; urgency=low
 

Added: branches/kde4/packages/kdelibs/debian/patches/01_kdelibs_branch_r726725.diff
===================================================================
--- branches/kde4/packages/kdelibs/debian/patches/01_kdelibs_branch_r726725.diff	                        (rev 0)
+++ branches/kde4/packages/kdelibs/debian/patches/01_kdelibs_branch_r726725.diff	2007-10-18 18:58:49 UTC (rev 7534)
@@ -0,0 +1,26733 @@
+--- a/khtml/khtmlview.cpp
++++ b/khtml/khtmlview.cpp
+@@ -73,7 +73,7 @@
+ #include <kiconloader.h>
+ #include <klocale.h>
+ #include <knotification.h>
+-#include <kprinter.h>
++#include <kdeprintdialog.h>
+ #include <kconfig.h>
+ #include <kstandarddirs.h>
+ #include <kstandardshortcut.h>
+@@ -92,6 +92,8 @@
+ #include <QtCore/QAbstractEventDispatcher>
+ #include <QtCore/QVector>
+ #include <QtGui/QAbstractScrollArea>
++#include <QtGui/QPrinter>
++#include <QtGui/QPrintDialog>
+ 
+ //#define DEBUG_FLICKER
+ 
+@@ -2892,29 +2894,32 @@
+     khtml::RenderCanvas *root = static_cast<khtml::RenderCanvas *>(m_part->xmlDocImpl()->renderer());
+     if(!root) return;
+ 
+-    KPrinter *printer = new KPrinter(true, QPrinter::ScreenResolution);
+-    printer->addDialogPage(new KHTMLPrintSettings());
++    KHTMLPrintSettings printSettings; //XXX: doesn't save settings between prints like this
++    QPrinter printer;
++    QPrintDialog *dialog = KdePrint::createPrintDialog(&printer, QList<QWidget*>() << &printSettings, this);
++
+     QString docname = m_part->xmlDocImpl()->URL().prettyUrl();
+     if ( !docname.isEmpty() )
+         docname = KStringHandler::csqueeze(docname, 80);
+-    if(quick || printer->setup(this, i18n("Print %1", docname))) {
++
++    if(quick || dialog->exec()) {
+         viewport()->setCursor( Qt::WaitCursor ); // only viewport(), no QApplication::, otherwise we get the busy cursor in kdeprint's dialogs
+         // set up KPrinter
+-        printer->setFullPage(false);
+-        printer->setCreator(QString("KDE %1.%2.%3 HTML Library").arg(KDE_VERSION_MAJOR).arg(KDE_VERSION_MINOR).arg(KDE_VERSION_RELEASE));
+-        printer->setDocName(docname);
++        printer.setFullPage(false);
++        printer.setCreator(QString("KDE %1.%2.%3 HTML Library").arg(KDE_VERSION_MAJOR).arg(KDE_VERSION_MINOR).arg(KDE_VERSION_RELEASE));
++        printer.setDocName(docname);
+ 
+         QPainter *p = new QPainter;
+-        p->begin( printer );
++        p->begin( &printer );
+         khtml::setPrintPainter( p );
+ 
+-        m_part->xmlDocImpl()->setPaintDevice( printer );
++        m_part->xmlDocImpl()->setPaintDevice( &printer );
+         QString oldMediaType = mediaType();
+         setMediaType( "print" );
+         // We ignore margin settings for html and body when printing
+         // and use the default margins from the print-system
+         // (In Qt 3.0.x the default margins are hardcoded in Qt)
+-        m_part->xmlDocImpl()->setPrintStyleSheet( printer->option("app-khtml-printfriendly") == "true" ?
++        m_part->xmlDocImpl()->setPrintStyleSheet( printSettings.printFriendly() ?
+                                                   "* { background-image: none !important;"
+                                                   "    background-color: white !important;"
+                                                   "    color: black !important; }"
+@@ -2924,19 +2929,19 @@
+ 						  "html { margin: 0px !important; }"
+ 						  );
+ 
+-        kDebug(6000) << "printing: physical page width = " << printer->width()
+-                      << " height = " << printer->height() << endl;
++        kDebug(6000) << "printing: physical page width = " << printer.width()
++                      << " height = " << printer.height() << endl;
+         root->setStaticMode(true);
+         root->setPagedMode(true);
+-        root->setWidth(printer->width());
+-//         root->setHeight(printer->height());
++        root->setWidth(printer.width());
++//         root->setHeight(printer.height());
+         root->setPageTop(0);
+         root->setPageBottom(0);
+         d->paged = true;
+ 
+-        m_part->xmlDocImpl()->styleSelector()->computeFontSizes(printer->logicalDpiY(), 100);
++        m_part->xmlDocImpl()->styleSelector()->computeFontSizes(printer.logicalDpiY(), 100);
+         m_part->xmlDocImpl()->updateStyleSelector();
+-        root->setPrintImages( printer->option("app-khtml-printimages") == "true");
++        root->setPrintImages(printSettings.printImages());
+         root->makePageBreakAvoidBlocks();
+ 
+         root->setNeedsLayoutAndMinMaxRecalc();
+@@ -2945,7 +2950,7 @@
+ 
+         // check sizes ask for action.. (scale or clip)
+ 
+-        bool printHeader = (printer->option("app-khtml-printheader") == "true");
++        bool printHeader = printSettings.printHeader();
+ 
+         int headerHeight = 0;
+         QFont headerFont("Sans Serif", 8);
+@@ -2963,14 +2968,14 @@
+         // ok. now print the pages.
+         kDebug(6000) << "printing: html page width = " << root->docWidth()
+                       << " height = " << root->docHeight() << endl;
+-        kDebug(6000) << "printing: margins left = " << printer->margins().width()
+-                      << " top = " << printer->margins().height() << endl;
+-        kDebug(6000) << "printing: paper width = " << printer->width()
+-                      << " height = " << printer->height() << endl;
++        kDebug(6000) << "printing: margins left = " << printer.pageRect().left() - printer.paperRect().left()
++                      << " top = " << printer.pageRect().top() - printer.paperRect().top() << endl;
++        kDebug(6000) << "printing: paper width = " << printer.width()
++                      << " height = " << printer.height() << endl;
+         // if the width is too large to fit on the paper we just scale
+         // the whole thing.
+-        int pageWidth = printer->width();
+-        int pageHeight = printer->height();
++        int pageWidth = printer.width();
++        int pageHeight = printer.height();
+         p->setClipRect(0,0, pageWidth, pageHeight);
+ 
+         pageHeight -= headerHeight;
+@@ -2978,9 +2983,9 @@
+         bool scalePage = false;
+         double scale = 0.0;
+ #ifndef QT_NO_TRANSFORMATIONS
+-        if(root->docWidth() > printer->width()) {
++        if(root->docWidth() > printer.width()) {
+             scalePage = true;
+-            scale = ((double) printer->width())/((double) root->docWidth());
++            scale = ((double) printer.width())/((double) root->docWidth());
+             pageHeight = (int) (pageHeight/scale);
+             pageWidth = (int) (pageWidth/scale);
+             headerHeight = (int) (headerHeight/scale);
+@@ -2998,16 +3003,16 @@
+         // Squeeze header to make it it on the page.
+         if (printHeader)
+         {
+-            int available_width = printer->width() - 10 -
+-                2 * qMax(p->boundingRect(0, 0, printer->width(), p->fontMetrics().lineSpacing(), Qt::AlignLeft, headerLeft).width(),
+-                         p->boundingRect(0, 0, printer->width(), p->fontMetrics().lineSpacing(), Qt::AlignLeft, headerRight).width());
++            int available_width = printer.width() - 10 -
++                2 * qMax(p->boundingRect(0, 0, printer.width(), p->fontMetrics().lineSpacing(), Qt::AlignLeft, headerLeft).width(),
++                         p->boundingRect(0, 0, printer.width(), p->fontMetrics().lineSpacing(), Qt::AlignLeft, headerRight).width());
+             if (available_width < 150)
+                available_width = 150;
+             int mid_width;
+             int squeeze = 120;
+             do {
+                 headerMid = KStringHandler::csqueeze(docname, squeeze);
+-                mid_width = p->boundingRect(0, 0, printer->width(), p->fontMetrics().lineSpacing(), Qt::AlignLeft, headerMid).width();
++                mid_width = p->boundingRect(0, 0, printer.width(), p->fontMetrics().lineSpacing(), Qt::AlignLeft, headerMid).width();
+                 squeeze -= 10;
+             } while (mid_width > available_width);
+         }
+@@ -3016,7 +3021,7 @@
+         int bottom = 0;
+         int page = 1;
+         while(top < root->docHeight()) {
+-            if(top > 0) printer->newPage();
++            if(top > 0) printer.newPage();
+ #ifdef __GNUC__
+ #warning "This could not be tested when merge was done, suspect"
+ #endif
+@@ -3029,9 +3034,9 @@
+ 
+                 headerRight = QString("#%1").arg(page);
+ 
+-                p->drawText(0, 0, printer->width(), dy, Qt::AlignLeft, headerLeft);
+-                p->drawText(0, 0, printer->width(), dy, Qt::AlignHCenter, headerMid);
+-                p->drawText(0, 0, printer->width(), dy, Qt::AlignRight, headerRight);
++                p->drawText(0, 0, printer.width(), dy, Qt::AlignLeft, headerLeft);
++                p->drawText(0, 0, printer.width(), dy, Qt::AlignHCenter, headerMid);
++                p->drawText(0, 0, printer.width(), dy, Qt::AlignRight, headerRight);
+             }
+ 
+ 
+@@ -3077,7 +3082,6 @@
+         m_part->xmlDocImpl()->updateStyleSelector();
+         viewport()->unsetCursor();
+     }
+-    delete printer;
+ }
+ 
+ void KHTMLView::slotPaletteChanged()
+@@ -3562,9 +3566,7 @@
+     d->contentsY = verticalScrollBar()->value();
+ 
+     if ( d->staticWidget ) {
+-        qDebug() << "attr: "<< widget()->testAttribute(Qt::WA_WState_InPaintEvent)<< viewport()->testAttribute(Qt::WA_WState_InPaintEvent);
+         widget()->update();
+-        qDebug() << "after: "<< widget()->testAttribute(Qt::WA_WState_InPaintEvent)<< viewport()->testAttribute(Qt::WA_WState_InPaintEvent);
+         return;
+     }
+     QScrollArea::scrollContentsBy(dx, dy);
+--- a/khtml/kmultipart/kmultipart.desktop
++++ b/khtml/kmultipart/kmultipart.desktop
+@@ -50,8 +50,8 @@
+ Name[ru]=Встраиваемый компонент для вложений
+ Name[se]=Vuojuhanláhkái oassi multipart/mixed:a várás
+ Name[sl]=Vgradljiva komponenta za multipart/mixed
+-Name[sr]=Уградива компонента за „multipart/mixed“
+-Name[sr at latin]=Ugradiva komponenta za „multipart/mixed“
++Name[sr]=Угњездива компонента за вишеделни МИМЕ
++Name[sr at latin]=Ugnjezdiva komponenta za višedelni MIME
+ Name[sv]=Inbyggbar komponent för multipart/mixed
+ Name[ta]=பலப்பகுதி/கலக்கப்பட்ட பகுதிக்குரிய உட்பொதிந்த பகுதி
+ Name[te]=మల్టిపార్ట్/మిక్స్డ్ కొరకు పొదిగిన అంశం
+--- a/khtml/kmultipart/kmultipart.cpp
++++ b/khtml/kmultipart/kmultipart.cpp
+@@ -162,8 +162,8 @@
+     // Hmm, args.reload is set to true when reloading, but this doesn't seem to be enough...
+     // I get "HOLD: Reusing held slave for <url>", and the old data
+ 
+-    m_job = KIO::get( url, 
+-                      arguments().reload() ? KIO::Reload : KIO::NoReload, 
++    m_job = KIO::get( url,
++                      arguments().reload() ? KIO::Reload : KIO::NoReload,
+                       KIO::HideProgressInfo );
+ 
+     emit started( 0 /*m_job*/ ); // don't pass the job, it would interfere with our own infoMessage
+@@ -347,19 +347,10 @@
+                  m_extension, SIGNAL( createNewWindow( const KUrl &, const KParts::OpenUrlArguments&, const KParts::BrowserArguments& , const KParts::WindowArgs &, KParts::ReadOnlyPart**) ) );
+ 
+         // Keep in sync with khtml_part.cpp
+-        connect( childExtension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ),
+-                 m_extension, SIGNAL( popupMenu( const QPoint &, const KFileItemList & ) ) );
+-        connect( childExtension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ),
+-                 m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KFileItemList & ) ) );
+-        connect( childExtension, SIGNAL( popupMenu(KXMLGUIClient *, const QPoint &, const KFileItemList &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags) ),
+-                 m_extension, SIGNAL( popupMenu(KXMLGUIClient *, const QPoint &, const KFileItemList &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags) ) );
+-        connect( childExtension, SIGNAL( popupMenu( const QPoint &, const KUrl &, const QString &, mode_t ) ),
+-                 m_extension, SIGNAL( popupMenu( const QPoint &, const KUrl &, const QString &, mode_t ) ) );
+-        connect( childExtension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KUrl &, const QString &, mode_t ) ),
+-                 m_extension, SIGNAL( popupMenu( KXMLGUIClient *, const QPoint &, const KUrl &, const QString &, mode_t ) ) );
+-        connect( childExtension, SIGNAL( popupMenu(KXMLGUIClient *, const QPoint &, const KUrl &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags, mode_t) ),
+-                 m_extension, SIGNAL( popupMenu(KXMLGUIClient *, const QPoint &, const KUrl &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags, mode_t) ) );
+-
++        connect( childExtension, SIGNAL(popupMenu(QPoint,KFileItemList,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)),
++             m_extension, SIGNAL(popupMenu(QPoint,KFileItemList,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)) );
++        connect( childExtension, SIGNAL(popupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)),
++             m_extension, SIGNAL(popupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)) );
+ 
+         if ( m_isHTMLPart )
+             connect( childExtension, SIGNAL( infoMessage( const QString & ) ),
+--- a/khtml/khtml_printsettings.h
++++ b/khtml/khtml_printsettings.h
+@@ -20,19 +20,20 @@
+ #ifndef KHTML_PRINTSETTINGS_H
+ #define KHTML_PRINTSETTINGS_H
+ 
+-#include <kdeprint/kprintdialogpage.h>
++#include <QtGui/QWidget>
+ 
+ class QCheckBox;
+ 
+-class KHTMLPrintSettings : public KPrintDialogPage
++class KHTMLPrintSettings : public QWidget
+ {
+ 	Q_OBJECT
+ public:
+ 	KHTMLPrintSettings(QWidget *parent = 0);
+ 	~KHTMLPrintSettings();
+ 
+-	void getOptions(QMap<QString,QString>& opts, bool incldef = false);
+-	void setOptions(const QMap<QString,QString>& opts);
++        bool printFriendly();
++        bool printImages();
++        bool printHeader();
+ 
+ private:
+ 	QCheckBox	*m_printfriendly;
+--- a/khtml/dom/dom_exception.h
++++ b/khtml/dom/dom_exception.h
+@@ -83,7 +83,9 @@
+         SYNTAX_ERR = 12,
+         INVALID_MODIFICATION_ERR = 13,
+         NAMESPACE_ERR = 14,
+-        INVALID_ACCESS_ERR = 15
++        INVALID_ACCESS_ERR = 15,
++        VALIDATION_ERR = 16,
++        TYPE_MISMATCH_ERR = 17
+     };
+     unsigned short code;
+ };
+--- a/khtml/ChangeLog
++++ b/khtml/ChangeLog
+@@ -1,3 +1,11 @@
++2007-10-13  Allan Sandfeld Jensen <kde at carewolf.com>
++
++        Update HTML-Parser to parse more HTML5 like, and allow custom HTML tags.
++
++        * html/dtd.{h,cpp}: Make all block elements more equal, treat custom tags like <SPAN>
++        * html/htmlparser.{h,cpp}: Treat actual close-tags differently than implicit close.
++        * html/htmltokenizer.cpp: Parse custom HTML tag
++
+ 2007-10-09  Allan Sandfeld Jensen <kde at carewolf.com>
+ 
+         Optimize the case of double descendant selectors "a b c",
+--- /dev/null
++++ b/khtml/misc/translator.h
+@@ -0,0 +1,75 @@
++/**
++ * This file is part of the KHTML renderer for KDE.
++ *
++ * Copyright (C) 2006, 2007 Maksim Orlovich (maksim at kde.org)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public License
++ * along with this library; see the file COPYING.LIB.  If not, write to
++ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++ * Boston, MA 02110-1301, USA.
++ */
++
++#ifndef KHTML_MISC_TRANSLATOR_H
++#define KHTML_MISC_TRANSLATOR_H
++
++#include <QtCore/QMap>
++
++//---------------------------------------------------------------------------------------------
++/* This class is used to do remapping between different encodings reasonably compactly.
++   It stores things as (L,R) tables, but reads left-side from memory as MemL */
++template<typename L, typename R, typename MemL>
++class IDTranslator
++{
++public:
++    struct Info {
++        MemL l;
++        R    r;
++    };
++
++    IDTranslator(const Info* table) {
++        for (const Info* cursor = table; cursor->l; ++cursor) {
++            m_lToR.insert(cursor->l,  cursor->r);
++            m_rToL.insert(cursor->r,  cursor->l);
++        }
++    }
++
++    bool hasLeft(L l) {
++        typename QMap<L,R>::iterator i = m_lToR.find(l);
++        return i != m_lToR.end();
++    }
++
++    L toLeft(R r) {
++        typename QMap<R,L>::iterator i( m_rToL.find(r) );
++        if (i != m_rToL.end())
++            return *i;
++        return L();
++    }
++
++    R toRight(L l) {
++        typename QMap<L,R>::iterator i = m_lToR.find(l);
++        if (i != m_lToR.end())
++            return *i;
++        return R();
++    }
++
++private:
++    QMap<L, R> m_lToR;
++    QMap<R, L> m_rToL;
++};
++
++#define MAKE_TRANSLATOR(name,L,R,MR,table) static IDTranslator<L,R,MR>* s_##name; \
++    static IDTranslator<L,R,MR>* name() { if (!s_##name) s_##name = new IDTranslator<L,R,MR>(table); \
++        return s_##name; }
++
++
++#endif
+--- a/khtml/khtml_part.h
++++ b/khtml/khtml_part.h
+@@ -1045,6 +1045,8 @@
+ 
+   /**
+    * Emitted when the user clicks the right mouse button on the document.
++   * See KParts::BrowserExtension for two more popupMenu signals emitted by khtml,
++   * with much more information in the signal.
+    */
+   void popupMenu( const QString &url, const QPoint &point );
+ 
+@@ -1547,6 +1549,7 @@
+   bool restoreURL( const KUrl &url );
+   void resetFromScript();
+   void emitSelectionChanged();
++  void onFirstData(const QString& firstData);
+   // Returns whether callingHtmlPart may access this part
+   bool checkFrameAccess(KHTMLPart *callingHtmlPart);
+   bool openUrlInFrame(const KUrl &url, const KParts::OpenUrlArguments& arguments, const KParts::BrowserArguments &browserArguments);
+--- a/khtml/khtmlimage.cpp
++++ b/khtml/khtmlimage.cpp
+@@ -98,8 +98,8 @@
+     connect(m_khtml->browserExtension(), SIGNAL(openUrlRequestDelayed(const KUrl &, const KParts::OpenUrlArguments&, const KParts::BrowserArguments &)),
+     		be, SIGNAL(openUrlRequestDelayed(const KUrl &, const KParts::OpenUrlArguments&, const KParts::BrowserArguments &)));
+ 
+-    connect( m_khtml->browserExtension(), SIGNAL( popupMenu(KXMLGUIClient *, const QPoint &, const KUrl &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags, mode_t) ),
+-             m_ext, SIGNAL( popupMenu(KXMLGUIClient *, const QPoint &, const KUrl &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags, mode_t) ) );
++    connect(m_khtml->browserExtension(), SIGNAL(popupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)),
++	    m_ext, SIGNAL(popupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)));
+ 
+     connect( m_khtml->browserExtension(), SIGNAL( enableAction( const char *, bool ) ),
+              m_ext, SIGNAL( enableAction( const char *, bool ) ) );
+--- a/khtml/test_regression_fontoverload.cpp
++++ b/khtml/test_regression_fontoverload.cpp
+@@ -180,21 +180,35 @@
+     QtFontDim m_ascent, m_descent, m_leading;
+     bool  ahem;
+     int   pixS;
+-#if 0
+-    virtual glyph_metrics_t boundingBox( const glyph_t *glyphs,
+-                                         const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
+-    glyph_metrics_t boundingBox( glyph_t glyph );
+-
+-    QFontEngine::Error stringToCMap( const QChar *, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool ) const;
+-
+-    int ascent() const;
+-    int descent() const;
+-    int leading() const;
+-    int maxCharWidth() const;
+-    int minLeftBearing() const { return 0; }
+-    int minRightBearing() const { return 0; }
+-    int cmap() const;
+-#endif
++    XFontStruct* xfs;
++
++    bool stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const
++    {
++        bool res = QFontEngineXLFD::stringToCMap(str, len, glyphs, nglyphs, flags);
++        if (!res)
++            return false;
++
++        // Go through the glyhs with glyph 0 and fix up their x advance
++        // to make sense (or at least match Qt3)
++        // ### set proper GPLv2 and Qt (c) when committed
++        QtFontDim fallBackWidth = xfs->min_bounds.width;
++        if (xfs->per_char) {
++            if (haveMetrics)
++                fallBackWidth = m_ascent; //### we really should get rid of these and regen..
++            else
++                fallBackWidth = xfs->ascent;
++        }
++
++        QGlyphLayout* g = glyphs + len;
++        while (g != glyphs) {
++            --g;
++            if (!g->glyph) {
++                g->advance.x = fallBackWidth;
++            }
++        }
++
++        return true;
++    }
+ 
+     Type type() const
+     {
+@@ -293,6 +307,7 @@
+ QFakeFontEngine::QFakeFontEngine( XFontStruct *fs, const char *name, int size )
+     : QFontEngineXLFD( fs,  name,  0)
+ {
++    xfs = fs;
+     pixS = size;
+     this->name = QLatin1String(name);
+     ahem = this->name.contains("ahem");
+@@ -312,69 +327,7 @@
+ QFakeFontEngine::~QFakeFontEngine()
+ {
+ }
+-#if 0
+-QFontEngine::Error QFakeFontEngine::stringToCMap( const QChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored) const
+-{
+-    QFontEngine::Error ret = QFontEngineXLFD::stringToCMap( str, len, glyphs, advances, nglyphs, mirrored );
+-
+-    if ( ret != NoError )
+-        return ret;
+-
+-    *nglyphs = len;
+-
+-    if ( advances ) {
+-        for ( int i = 0; i < len; i++ )
+-            *(advances++) = _size;
+-    }
+-    return NoError;
+-}
+-
+-glyph_metrics_t QFakeFontEngine::boundingBox( const glyph_t *, const advance_t *, const qoffset_t *, int numGlyphs )
+-{
+-    glyph_metrics_t overall;
+-    overall.x = overall.y = 0;
+-    overall.width = _size*numGlyphs;
+-    overall.height = _size;
+-    overall.xoff = overall.width;
+-    overall.yoff = 0;
+-    return overall;
+-}
+-
+-glyph_metrics_t QFakeFontEngine::boundingBox( glyph_t )
+-{
+-    return glyph_metrics_t( 0, _size, _size, _size, _size, 0 );
+-}
+-
+-int QFakeFontEngine::ascent() const
+-{
+-    return _size;
+-}
+-
+-int QFakeFontEngine::descent() const
+-{
+-    return 0;
+-}
+-
+-int QFakeFontEngine::leading() const
+-{
+-    // the original uses double and creates quite random results depending
+-    // on the compiler flags
+-    int l = ( _size * 15 + 50) / 100;
+-    // only valid on i386 without -O2 assert(l == int(qRound(_size * 0.15)));
+-    return (l > 0) ? l : 1;
+-}
+-
+-int QFakeFontEngine::maxCharWidth() const
+-{
+-    return _size;
+-}
+-
+-int QFakeFontEngine::cmap() const
+-{
+-    return -1;
+-}
+ 
+-#endif
+ 
+ bool QFakeFontEngine::canRender( const QChar *, int )
+ {
+@@ -449,9 +402,6 @@
+     return fe;
+ }
+ 
+-#if QT_VERSION >= 0x040100 
+-/* Note: you may want the other path with earlier Qt4.1 snapshots */
+-
+ KDE_EXPORT
+ QFontEngine *QFontDatabase::loadXlfd(int /* screen */, int /* script */, 
+             const QFontDef &request, int /* force_encoding_id */)
+@@ -464,21 +414,6 @@
+     return 0;
+ }
+ 
+-#else
+-
+-
+-KDE_EXPORT
+-QFontEngine *
+-QFontDatabase::findFont( int script, const QFontPrivate *fp,
+-			 const QFontDef &request, int ) {
+-    QFontEngine* fe = loadFont(request);
+-    QFontCache::Key key( request, script, fp->screen );
+-    QFontCache::instance->insertEngine( key, fe );
+-    return fe;
+-}
+-
+-#endif
+-
+ KDE_EXPORT bool QFontDatabase::isBitmapScalable( const QString &,
+ 				      const QString &) const
+ {
+--- a/khtml/khtml_part.cpp
++++ b/khtml/khtml_part.cpp
+@@ -1136,8 +1136,8 @@
+ 
+ void KHTMLPart::jsErrorDialogContextMenu() {
+   KMenu *m = new KMenu(0L);
+-  m->insertItem(i18n("&Hide Errors"), this, SLOT(removeJSErrorExtension()));
+-  m->insertItem(i18n("&Disable Error Reporting"), this, SLOT(disableJSErrorExtension()));
++  m->addAction(i18n("&Hide Errors"), this, SLOT(removeJSErrorExtension()));
++  m->addAction(i18n("&Disable Error Reporting"), this, SLOT(disableJSErrorExtension()));
+   m->popup(QCursor::pos());
+ }
+ 
+@@ -1152,7 +1152,7 @@
+ void KHTMLPart::launchJSConfigDialog() {
+   QStringList args;
+   args << "khtml_java_js";
+-  KToolInvocation::kdeinitExec( "kcmshell", args );
++  KToolInvocation::kdeinitExec( "kcmshell4", args );
+ }
+ 
+ QVariant KHTMLPart::executeScript(const QString& filename, int baseLine, const DOM::Node& n, const QString& script)
+@@ -1914,6 +1914,7 @@
+ 
+   d->m_doc->ref();
+   d->m_doc->setURL( this->url().url() );
++  d->m_doc->open( );
+   if (!d->m_doc->attached())
+     d->m_doc->attach( );
+   d->m_doc->setBaseURL( KUrl() );
+@@ -1929,7 +1930,6 @@
+     setUserStyleSheet( KUrl( userStyleSheet ) );
+ 
+   d->m_doc->setRestoreState(d->m_extension->browserArguments().docState);
+-  d->m_doc->open();
+   connect(d->m_doc,SIGNAL(finishedParsing()),this,SLOT(slotFinishedParsing()));
+ 
+   emit d->m_extension->enableAction( "print", true );
+@@ -1954,19 +1954,7 @@
+       return;
+ 
+   if(d->m_bFirstData)
+-  {
+-      // determine the parse mode
+-      d->m_doc->determineParseMode( decoded );
+-      d->m_bFirstData = false;
+-
+-  //kDebug(6050) << "KHTMLPart::write haveEnc = " << d->m_haveEncoding;
+-      // ### this is still quite hacky, but should work a lot better than the old solution
+-      if(d->m_decoder->visuallyOrdered()) d->m_doc->setVisuallyOrdered();
+-#if 0
+-      d->m_doc->setDecoderCodec(d->m_decoder->codec());
+-#endif
+-      d->m_doc->recalcStyle( NodeImpl::Force );
+-  }
++      onFirstData( decoded );
+ 
+   khtml::Tokenizer* t = d->m_doc->tokenizer();
+   if(t)
+@@ -1995,10 +1983,7 @@
+         {
+             QString decoded=d->m_decoder->flush();
+             if (d->m_bFirstData)
+-            {
+-                d->m_bFirstData = false;
+-                d->m_doc->determineParseMode(decoded);
+-            }
++                onFirstData( decoded );
+             if (!decoded.isEmpty())
+                 write(decoded);
+         }
+@@ -2006,6 +1991,20 @@
+     }
+ }
+ 
++void KHTMLPart::onFirstData( const QString& firstData )
++{
++      assert( d->m_bFirstData );
++
++      // determine the parse mode
++      d->m_doc->determineParseMode( firstData );
++      d->m_bFirstData = false;
++
++      // ### this is still quite hacky, but should work a lot better than the old solution
++      if (d->m_decoder->visuallyOrdered()) 
++          d->m_doc->setVisuallyOrdered();
++      d->m_doc->recalcStyle( NodeImpl::Force );
++}
++
+ bool KHTMLPart::doOpenStream( const QString& mimeType )
+ {
+     KMimeType::Ptr mime = KMimeType::mimeType(mimeType);
+@@ -4065,7 +4064,9 @@
+     const QStringList header = (*it).split(QRegExp(":[ ]+"));
+     if (header.count() != 2)
+        continue;
+-    new Q3ListViewItem(ui._headers, header[0], header[1]);
++    QTreeWidgetItem *item = new QTreeWidgetItem(ui._headers);
++    item->setText(0, header[0]);
++    item->setText(1, header[1]);
+   }
+ 
+   dlg->show();
+@@ -4661,7 +4662,7 @@
+   {
+     KService::Ptr service = (*it);
+ 
+-    KLibFactory* const factory = KLibLoader::self()->factory( QFile::encodeName(service->library()) );
++    KLibFactory* const factory = KLibLoader::self()->factory( service->library() );
+     if ( factory ) {
+       KParts::ReadOnlyPart *res = 0L;
+ 
+@@ -7266,7 +7267,7 @@
+ {
+ #ifndef KHTML_NO_WALLET
+   KMenu *m = new KMenu(0L);
+-  m->insertItem(i18n("&Close Wallet"), this, SLOT(slotWalletClosed()));
++  m->addAction(i18n("&Close Wallet"), this, SLOT(slotWalletClosed()));
+   m->popup(QCursor::pos());
+ #endif // KHTML_NO_WALLET
+ }
+@@ -7366,10 +7367,10 @@
+ void KHTMLPart::suppressedPopupMenu() {
+   KMenu *m = new KMenu(0L);
+   if ( d->m_openableSuppressedPopups )
+-      m->insertItem(i18np("&Show Blocked Popup Window","Show %1 Blocked Popup Windows", d->m_openableSuppressedPopups), this, SLOT(showSuppressedPopups()));
+-  m->insertItem(i18n("Show Blocked Window Passive Popup &Notification"), this, SLOT(togglePopupPassivePopup()),0,57);
+-  m->setItemChecked(57,d->m_settings->jsPopupBlockerPassivePopup());
+-  m->insertItem(i18n("&Configure JavaScript New Window Policies..."), this, SLOT(launchJSConfigDialog()));
++      m->addAction(i18np("&Show Blocked Popup Window","Show %1 Blocked Popup Windows", d->m_openableSuppressedPopups), this, SLOT(showSuppressedPopups()));
++  QAction *a = m->addAction(i18n("Show Blocked Window Passive Popup &Notification"), this, SLOT(togglePopupPassivePopup()));
++  a->setChecked(d->m_settings->jsPopupBlockerPassivePopup());
++  m->addAction(i18n("&Configure JavaScript New Window Policies..."), this, SLOT(launchJSConfigDialog()));
+   m->popup(QCursor::pos());
+ }
+ 
+--- a/khtml/khtml.desktop
++++ b/khtml/khtml.desktop
+@@ -51,8 +51,8 @@
+ Comment[ru]=Встраиваемый компонент просмотра HTML
+ Comment[se]=Vuojuhanláhkái HTML-čájehanoassi
+ Comment[sl]=Integrirani pregled besedila HTML
+-Comment[sr]=Уградива компонента за преглед HTML-а
+-Comment[sr at latin]=Ugradiva komponenta za pregled HTML-a
++Comment[sr]=Угњездива компонента за приказ ХТМЛ-а
++Comment[sr at latin]=Ugnjezdiva komponenta za prikaz HTML-a
+ Comment[sv]=Inbäddningsbar HTML-visande komponent
+ Comment[ta]=உட்பொதிக்கவல்ல HTML காட்சிக் கூறு
+ Comment[te]=పొదగదగ్గ HTML విక్షణాంశం
+@@ -72,6 +72,8 @@
+ Icon=konqueror
+ Name=KHTML
+ Name[kn]=ಕೆಹೆಚ್ ಟಿ ಎಮ್ ಎಲ್
++Name[sr]=КХТМЛ
++Name[sr at latin]=KTHML
+ Name[te]=కెహెచ్ టి ఎమ్ ఎల్
+ Name[x-test]=xxKHTMLxx
+ ServiceTypes=KParts/ReadOnlyPart,Browser/View
+--- a/khtml/htmlpageinfo.ui
++++ b/khtml/htmlpageinfo.ui
+@@ -1,7 +1,6 @@
+ <ui version="4.0" >
+  <author>George Staikos &lt;staikos at kde.org></author>
+  <comment>A dialog to display the HTTP headers for a given page.</comment>
+- <exportmacro></exportmacro>
+  <class>KHTMLInfoDlg</class>
+  <widget class="QDialog" name="KHTMLInfoDlg" >
+   <property name="geometry" >
+@@ -13,9 +12,7 @@
+    </rect>
+   </property>
+   <property name="sizePolicy" >
+-   <sizepolicy>
+-    <hsizetype>7</hsizetype>
+-    <vsizetype>5</vsizetype>
++   <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+@@ -24,41 +21,69 @@
+    <string>Document Information</string>
+   </property>
+   <layout class="QGridLayout" >
+-   <property name="margin" >
++   <property name="leftMargin" >
+     <number>11</number>
+    </property>
+-   <property name="spacing" >
++   <property name="topMargin" >
++    <number>11</number>
++   </property>
++   <property name="rightMargin" >
++    <number>11</number>
++   </property>
++   <property name="bottomMargin" >
++    <number>11</number>
++   </property>
++   <property name="horizontalSpacing" >
++    <number>6</number>
++   </property>
++   <property name="verticalSpacing" >
+     <number>6</number>
+    </property>
+    <item row="0" column="0" colspan="2" >
+-    <widget class="Q3GroupBox" name="groupBox2" >
++    <widget class="QGroupBox" name="groupBox2" >
+      <property name="title" >
+       <string>General</string>
+      </property>
+-     <property name="orientation" >
+-      <enum>Qt::Vertical</enum>
+-     </property>
+      <layout class="QHBoxLayout" >
+-      <property name="margin" >
+-       <number>11</number>
+-      </property>
+       <property name="spacing" >
+        <number>6</number>
+       </property>
++      <property name="leftMargin" >
++       <number>11</number>
++      </property>
++      <property name="topMargin" >
++       <number>11</number>
++      </property>
++      <property name="rightMargin" >
++       <number>11</number>
++      </property>
++      <property name="bottomMargin" >
++       <number>11</number>
++      </property>
+       <item>
+        <layout class="QGridLayout" >
+-        <property name="margin" >
++        <property name="leftMargin" >
++         <number>0</number>
++        </property>
++        <property name="topMargin" >
++         <number>0</number>
++        </property>
++        <property name="rightMargin" >
+          <number>0</number>
+         </property>
+-        <property name="spacing" >
++        <property name="bottomMargin" >
++         <number>0</number>
++        </property>
++        <property name="horizontalSpacing" >
++         <number>6</number>
++        </property>
++        <property name="verticalSpacing" >
+          <number>6</number>
+         </property>
+         <item row="1" column="0" >
+          <widget class="QLabel" name="urlLabel" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>0</hsizetype>
+-            <vsizetype>0</vsizetype>
++           <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -74,9 +99,7 @@
+         <item row="0" column="1" >
+          <widget class="QLabel" name="_title" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>7</hsizetype>
+-            <vsizetype>5</vsizetype>
++           <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+             <horstretch>1</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -85,13 +108,8 @@
+         </item>
+         <item row="1" column="1" >
+          <widget class="QLabel" name="_url" >
+-          <property name="openExternalLinks" >
+-           <bool>true</bool>
+-          </property>
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>7</hsizetype>
+-            <vsizetype>5</vsizetype>
++           <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+             <horstretch>1</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -101,9 +119,7 @@
+         <item row="2" column="1" >
+          <widget class="QLabel" name="_lastModified" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>7</hsizetype>
+-            <vsizetype>5</vsizetype>
++           <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+             <horstretch>1</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -113,9 +129,7 @@
+         <item row="0" column="0" >
+          <widget class="QLabel" name="titleLabel" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>0</hsizetype>
+-            <vsizetype>0</vsizetype>
++           <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -131,9 +145,7 @@
+         <item row="2" column="0" >
+          <widget class="QLabel" name="_lmLabel" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>0</hsizetype>
+-            <vsizetype>0</vsizetype>
++           <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -149,9 +161,7 @@
+         <item row="3" column="0" >
+          <widget class="QLabel" name="_eLabel" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>0</hsizetype>
+-            <vsizetype>0</vsizetype>
++           <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -167,9 +177,7 @@
+         <item row="3" column="1" >
+          <widget class="QLabel" name="_encoding" >
+           <property name="sizePolicy" >
+-           <sizepolicy>
+-            <hsizetype>7</hsizetype>
+-            <vsizetype>5</vsizetype>
++           <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+             <horstretch>1</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+@@ -182,35 +190,42 @@
+     </widget>
+    </item>
+    <item row="1" column="0" colspan="2" >
+-    <widget class="Q3GroupBox" name="groupBox1" >
++    <widget class="QGroupBox" name="groupBox1" >
+      <property name="title" >
+       <string>HTTP Headers</string>
+      </property>
+-     <property name="orientation" >
+-      <enum>Qt::Vertical</enum>
+-     </property>
+      <layout class="QVBoxLayout" >
+-      <property name="margin" >
+-       <number>11</number>
+-      </property>
+       <property name="spacing" >
+        <number>6</number>
+       </property>
++      <property name="leftMargin" >
++       <number>11</number>
++      </property>
++      <property name="topMargin" >
++       <number>11</number>
++      </property>
++      <property name="rightMargin" >
++       <number>11</number>
++      </property>
++      <property name="bottomMargin" >
++       <number>11</number>
++      </property>
+       <item>
+-       <widget class="Q3ListView" name="_headers" >
++       <widget class="QTreeWidget" name="_headers" >
+         <property name="sizePolicy" >
+-         <sizepolicy>
+-          <hsizetype>7</hsizetype>
+-          <vsizetype>7</vsizetype>
++         <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+           <horstretch>1</horstretch>
+           <verstretch>1</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="selectionMode" >
+-         <enum>Q3ListView::NoSelection</enum>
++         <enum>QAbstractItemView::NoSelection</enum>
++        </property>
++        <property name="rootIsDecorated" >
++         <bool>false</bool>
+         </property>
+-        <property name="resizeMode" >
+-         <enum>Q3ListView::LastColumn</enum>
++        <property name="allColumnsShowFocus" >
++         <bool>true</bool>
+         </property>
+         <column>
+          <property name="text" >
+@@ -228,11 +243,9 @@
+     </widget>
+    </item>
+    <item row="2" column="1" >
+-    <widget class="KPushButton" name="_close" >
++    <widget class="KPushButton" native="1" name="_close" >
+      <property name="sizePolicy" >
+-      <sizepolicy>
+-       <hsizetype>0</hsizetype>
+-       <vsizetype>5</vsizetype>
++      <sizepolicy vsizetype="Preferred" hsizetype="Fixed" >
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+@@ -262,25 +275,10 @@
+  <pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
+  <customwidgets>
+   <customwidget>
+-   <class>Q3GroupBox</class>
+-   <extends></extends>
+-   <header>Qt3Support/Q3GroupBox</header>
+-   <container>1</container>
+-   <pixmap></pixmap>
+-  </customwidget>
+-  <customwidget>
+-   <class>Q3ListView</class>
+-   <extends></extends>
+-   <header>q3listview.h</header>
+-   <container>0</container>
+-   <pixmap></pixmap>
+-  </customwidget>
+-  <customwidget>
+    <class>KPushButton</class>
+    <extends>QWidget</extends>
+    <header>kpushbutton.h</header>
+    <container>1</container>
+-   <pixmap></pixmap>
+   </customwidget>
+  </customwidgets>
+  <tabstops>
+@@ -290,8 +288,6 @@
+  </tabstops>
+  <includes>
+   <include location="global" >kpushbutton.h</include>
+-  <include location="global" >qlabel.h</include>
+-  <include location="global" >q3listview.h</include>
+  </includes>
+  <resources/>
+  <connections/>
+--- a/khtml/khtmlimage.desktop
++++ b/khtml/khtmlimage.desktop
+@@ -51,8 +51,8 @@
+ Comment[ru]=Встраиваемый модуль просмотра изображений
+ Comment[se]=Vuojuhanláhkái govvačájehanoassi
+ Comment[sl]=Integrirana komponenta za ogledovanje slik
+-Comment[sr]=Уградива компонента за приказивање слика
+-Comment[sr at latin]=Ugradiva komponenta za prikazivanje slika
++Comment[sr]=Угњездива компонента за приказ слика
++Comment[sr at latin]=Ugnjezdiva komponenta za prikaz slika
+ Comment[sv]=Inbäddningsbar bildvisande komponent
+ Comment[ta]=உட்பொதிந்த பிம்பக் காட்டிக் பகுதி
+ Comment[te]=పొదగదగ్గ ప్రతిబింబాల విక్షణాంశం
+@@ -119,8 +119,8 @@
+ Name[ru]=Встраиваемый модуль просмотра изображений
+ Name[se]=Vuojuhanláhkái govvačájeheaddji
+ Name[sl]=Vgrajeni pregledovalnik slik
+-Name[sr]=Уградиви приказивач слика
+-Name[sr at latin]=Ugradivi prikazivač slika
++Name[sr]=Угњездиви приказивач слика
++Name[sr at latin]=Ugnjezdivi prikazivač slika
+ Name[sv]=Inbäddningsbar bildvisare
+ Name[ta]=உட்பொதிந்த பிம்பக் காட்டி
+ Name[te]=పొదిగిన ప్రతిబింబ చూపరి
+--- a/khtml/html/htmltokenizer.cpp
++++ b/khtml/html/htmltokenizer.cpp
+@@ -29,7 +29,7 @@
+ //
+ // KDE HTML Widget - Tokenizers
+ 
+-//#define TOKEN_DEBUG 1
++// #define TOKEN_DEBUG 1
+ //#define TOKEN_DEBUG 2
+ 
+ #include "htmltokenizer.h"
+@@ -843,21 +843,23 @@
+ 
+                 uint tagID = khtml::getTagID(ptr, len);
+                 if (!tagID) {
++                    DOMString tagName(ptr);
++                    DocumentImpl *doc = parser->docPtr();
++                    if (Element::khtmlValidQualifiedName(tagName))
++                        tagID = doc->getId(NodeImpl::ElementId, tagName.implementation(), false, false);
+ #ifdef TOKEN_DEBUG
+                     QByteArray tmp(ptr, len+1);
+                     kDebug( 6036 ) << "Unknown tag: \"" << tmp.data() << "\"";
+ #endif
+-                    dest = buffer;
+                 }
+-                else
+-                {
++                if (tagID) {
+ #ifdef TOKEN_DEBUG
+                     QByteArray tmp(ptr, len+1);
+                     kDebug( 6036 ) << "found tag id=" << tagID << ": " << tmp.data();
+ #endif
+                     currToken.tid = beginTag ? tagID : tagID + ID_CLOSE_TAG;
+-                    dest = buffer;
+                 }
++                dest = buffer;
+                 tag = SearchAttribute;
+                 cBufferPos = 0;
+             }
+@@ -1106,7 +1108,7 @@
+             // unless we are using the HTML parser to parse XHTML
+             // The only exception is SCRIPT and priority 0 tokens.
+             if (tagID < ID_CLOSE_TAG && tagID != ID_SCRIPT &&
+-                DOM::endTag[tagID] == DOM::REQUIRED &&
++                DOM::endTagRequirement(tagID) == DOM::REQUIRED &&
+                 parser->doc()->htmlMode() != DocumentImpl::XHtml)
+                 currToken.flat = false;
+ 
+--- a/khtml/html/html_miscimpl.cpp
++++ b/khtml/html/html_miscimpl.cpp
+@@ -284,6 +284,8 @@
+ 
+ QList<NodeImpl*> HTMLCollectionImpl::namedItems( const DOMString &name ) const
+ {
++    if (name.isEmpty())
++        return QList<NodeImpl*>();
+     QString key = name.string();
+ 
+     //We use a work-conserving design for the name cache presently -- only
+--- a/khtml/html/dtd.h
++++ b/khtml/html/dtd.h
+@@ -23,6 +23,7 @@
+ #define _DOM_dtd_h_
+ 
+ #include "dom/dom_string.h"
++#include "misc/htmlhashes.h"
+ 
+ #undef OPTIONAL
+ 
+@@ -36,8 +37,24 @@
+ 
+ bool checkChild(ushort tagID, ushort childID, bool strict = false);
+ 
+-extern const unsigned short tagPriority[];
+-extern const tagStatus endTag[];
++extern const unsigned short tagPriorityArray[];
++extern const tagStatus endTagArray[];
++
++inline unsigned short tagPriority(Q_UINT32 tagId)
++{
++    // Treat custom elements the same as <span>; also don't read past the end of the array.
++    if (tagId > ID_LAST_TAG)
++        return tagPriorityArray[ID_SPAN];
++    return tagPriorityArray[tagId];
++}
++
++inline tagStatus endTagRequirement(Q_UINT32 tagId)
++{
++    // Treat custom elements the same as <span>; also don't read past the end of the array.
++    if (tagId > ID_LAST_TAG)
++        return endTagArray[ID_SPAN];
++    return endTagArray[tagId];
++}
+ 
+ } //namespace DOM
+ #endif
+--- a/khtml/html/html_canvasimpl.cpp
++++ b/khtml/html/html_canvasimpl.cpp
+@@ -1,5 +1,7 @@
+ /*
+  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
++ *  Copyright (C) 2005 Zack Rusin <zack at kde.org>
++ *  Copyright (C) 2007 Maksim Orlovich <maksim at kde.org>
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+@@ -33,32 +35,83 @@
+ 
+ #include <kdebug.h>
+ 
++#include <dom/dom_exception.h>
+ #include <rendering/render_canvasimage.h>
+ #include <rendering/render_flow.h>
+ #include <css/cssstyleselector.h>
+ #include <css/cssproperties.h>
++#include <css/cssparser.h>
+ #include <css/cssvalues.h>
+ #include <css/csshelper.h>
+ #include <xml/dom2_eventsimpl.h>
++#include <html/html_imageimpl.h>
+ #include <misc/htmltags.h>
++#include <misc/htmlattrs.h>
++#include <misc/translator.h>
++#include <imload/canvasimage.h>
++#include <kjs/global.h>
++#include <kjs/operations.h> //uglyyy: needs for inf/NaN tests
+ 
++#include <QtAlgorithms>
+ #include <QtCore/QCharRef>
+ #include <QtCore/QPoint>
++#include <QtCore/QLocale>
+ #include <QtGui/QRegion>
+ #include <QtGui/QImage>
++#include <QDebug>
++#include <cmath>
+ 
+ using namespace DOM;
+ using namespace khtml;
++using namespace std;
+ 
+ // -------------------------------------------------------------------------
+ 
+ HTMLCanvasElementImpl::HTMLCanvasElementImpl(DocumentImpl *doc)
+-    : HTMLImageElementImpl(doc)
++    : HTMLElementImpl(doc)
+ {
++    w = 300;
++    h = 150;
+ }
+ 
+ HTMLCanvasElementImpl::~HTMLCanvasElementImpl()
+ {
++    if (context)
++        context->canvasElement = 0;
++}
++
++void HTMLCanvasElementImpl::parseAttribute(AttributeImpl* attr)
++{
++    bool ok = false;
++    int  val;
++    switch (attr->id())
++    {
++    // ### TODO: making them reflect w/h -- how?
++    case ATTR_WIDTH:
++        val = attr->val() ? attr->val()->toInt(&ok) : -1;
++        if (!ok || val <= 0)
++            w = 300;
++        else
++            w = val;
++
++        if (context)
++            context->resetContext(w, h);
++        setChanged();
++        break;
++    case ATTR_HEIGHT:
++        val = attr->val() ? attr->val()->toInt(&ok) : -1;
++        if (!ok || val <= 0)
++            h = 150;
++        else
++            h = val;
++
++        if (context)
++            context->resetContext(w, h);
++        setChanged();
++        break;
++    default:
++        HTMLElementImpl::parseAttribute(attr);
++    }
+ }
+ 
+ NodeImpl::Id HTMLCanvasElementImpl::id() const
+@@ -88,7 +141,843 @@
+         m_render->updateFromElement();
+ }
+ 
+-void HTMLCanvasElementImpl::detach()
++CanvasContext2DImpl* HTMLCanvasElementImpl::getContext2D()
++{
++    if (!context)
++        context = new CanvasContext2DImpl(this, w, h);;
++    return context.get();
++}
++
++khtmlImLoad::CanvasImage* HTMLCanvasElementImpl::getCanvasImage()
++{
++    return getContext2D()->canvasImage;
++}
++
++// -------------------------------------------------------------------------
++CanvasContext2DImpl::CanvasContext2DImpl(HTMLCanvasElementImpl* element, int width, int height):
++    canvasElement(element), canvasImage(0)
++{
++    resetContext(width, height);
++}
++
++CanvasContext2DImpl::~CanvasContext2DImpl()
++{
++    if (workPainter.isActive())
++        workPainter.end(); // Make sure to stop it before blowing the image away!
++    delete canvasImage;
++}
++
++// Basic infrastructure.. 
++void CanvasContext2DImpl::resetContext(int width, int height)
++{
++    // ### FIXME FIXME: use khtmlImLoad's limit policy
++    // for physical canvas and transform painter to match logical resolution
++    if (workPainter.isActive())
++        workPainter.end();
++
++    if (canvasImage)
++        canvasImage->resizeImage(width, height);
++    else
++        canvasImage = new khtmlImLoad::CanvasImage(width, height);
++    canvasImage->qimage()->fill(0x00000000); // transparent black is the initial state
++
++    stateStack.clear();
++
++    PaintState defaultState;
++    beginPath();
++    defaultState.infinityTransform = false;
++    defaultState.clipPath.addRect(0, 0, width, height);
++    defaultState.clipPath.setFillRule(Qt::WindingFill);
++    
++    defaultState.globalAlpha = 1.0f;
++    defaultState.globalCompositeOperation = QPainter::CompositionMode_SourceOver;
++
++    defaultState.strokeStyle = new CanvasColorImpl(QColor(Qt::black));
++    defaultState.fillStyle   = new CanvasColorImpl(QColor(Qt::black));
++    
++    defaultState.lineWidth  = 1.0f;
++    defaultState.lineCap    = Qt::FlatCap;
++    defaultState.lineJoin   = Qt::MiterJoin;
++    defaultState.miterLimit = 10.0f;
++    
++    stateStack.push(defaultState);
++
++    dirty = DrtAll;
++    needRendererUpdate();
++}
++
++void CanvasContext2DImpl::save()
++{
++    stateStack.push(stateStack.top());
++}
++
++void CanvasContext2DImpl::restore()
++{
++    if (stateStack.size() <= 1)
++        return;
++
++    stateStack.pop();
++    dirty = DrtAll;
++}
++
++QPainter* CanvasContext2DImpl::acquirePainter()
++{
++    if (!workPainter.isActive()) {
++        workPainter.begin(canvasImage->qimage());
++        workPainter.setRenderHint(QPainter::Antialiasing);
++        dirty = DrtAll;
++    }
++
++    PaintState& state = activeState();
++
++    if (dirty & DrtClip) {
++        // Reset the transform so the clip path is in the
++        // right coordinate system
++        workPainter.resetTransform();
++        workPainter.setClipPath(state.clipPath);
++
++        // Restore the transform..
++        dirty |= DrtTransform;
++    }
++    
++    if (dirty & DrtTransform) {
++        if (state.infinityTransform) {
++            // Make stuff disappear. Cliprect should avoid this ever showing..
++            state.transform.reset();
++            state.transform.translate(-canvasImage->size().width() * 2, -canvasImage->size().height() * 2);
++        }
++
++        workPainter.setTransform(state.transform);
++    }
++
++    if (dirty & DrtAlpha)
++        workPainter.setOpacity(state.globalAlpha);
++    if (dirty & DrtCompOp)
++        workPainter.setCompositionMode(state.globalCompositeOperation);
++    if (dirty & DrtStroke) {
++        QPen pen;
++        pen.setWidth(state.lineWidth);
++        pen.setCapStyle (state.lineCap);
++        pen.setJoinStyle(state.lineJoin);
++        pen.setMiterLimit(state.miterLimit);
++
++        CanvasStyleBaseImpl* style = state.strokeStyle.get();
++        if (style->type() == CanvasStyleBaseImpl::Color)
++            pen.setColor(static_cast<CanvasColorImpl*>(style)->color);
++        else
++            pen.setBrush(style->toBrush());
++        workPainter.setPen(pen); // ### should I even do this?
++                                 // I have a feeling I am mixing up path and
++                                 // non-path ops
++    }
++    if (dirty & DrtFill)
++        workPainter.setBrush(state.fillStyle->toBrush());
++
++    dirty = 0;
++
++    needRendererUpdate();
++    return &workPainter;
++}
++
++QImage CanvasContext2DImpl::extractImage(ElementImpl* el, int& exceptionCode) const
++{
++    QImage pic;
++    
++    exceptionCode = 0;
++    if (el->id() == ID_CANVAS) {
++        CanvasContext2DImpl* other = static_cast<HTMLCanvasElementImpl*>(el)->getContext2D();
++        if (other->workPainter.isActive())
++            other->workPainter.end();
++        pic = *other->canvasImage->qimage();
++    } else if (el->id() == ID_IMG) {
++        HTMLImageElementImpl* img = static_cast<HTMLImageElementImpl*>(el);
++        if (img->complete())
++            pic = img->currentImage();
++        else
++            exceptionCode = DOMException::INVALID_STATE_ERR;
++    } else {
++        exceptionCode = DOMException::TYPE_MISMATCH_ERR;
++    }
++
++    return pic;
++}
++
++void CanvasContext2DImpl::needRendererUpdate()
++{
++    needsCommit = true;
++    if (canvasElement)
++        canvasElement->setChanged();
++}
++
++void CanvasContext2DImpl::commit()
++{
++    // If painter is active, end it.
++    if (workPainter.isActive())
++        workPainter.end();
++
++    // Flush caches if we have changes.
++    if (needsCommit) {
++        canvasImage->contentUpdated();
++        needsCommit = false;
++    }
++}
++
++HTMLCanvasElementImpl* CanvasContext2DImpl::canvas() const
++{
++    return canvasElement;
++}
++
++// Transformation ops
++//
++
++static inline float degrees(float radians)
++{
++    return radians * 180.0 / M_PI;
++}
++
++static inline bool isInfArg(float x)
++{
++    return KJS::isInf(x) || KJS::isNaN(x);
++}
++
++void CanvasContext2DImpl::scale(float x, float y)
++{
++    dirty |= DrtTransform;
++    
++    bool& infinityTransform = activeState().infinityTransform;
++    infinityTransform |= isInfArg(x) | isInfArg(y);
++    if (infinityTransform) return;
++
++    activeState().transform.scale(x, y);
++}
++
++void CanvasContext2DImpl::rotate(float angle)
++{
++    dirty |= DrtTransform;
++
++    bool& infinityTransform = activeState().infinityTransform;
++    infinityTransform |= isInfArg(angle);
++    if (infinityTransform) return;
++
++    activeState().transform.rotate(degrees(angle));
++}
++
++void CanvasContext2DImpl::translate(float x, float y)
++{
++    dirty |= DrtTransform;
++
++    bool& infinityTransform = activeState().infinityTransform;
++    infinityTransform |= isInfArg(x) | isInfArg(y);
++    if (infinityTransform) return;
++
++    activeState().transform.translate(x, y);
++}
++
++void CanvasContext2DImpl::transform(float m11, float m12, float m21, float m22, float dx, float dy)
++{
++    dirty |= DrtTransform;
++    
++    bool& infinityTransform = activeState().infinityTransform;
++    infinityTransform |= isInfArg(m11) | isInfArg(m12) | isInfArg(m21) | isInfArg(m22) |
++                         isInfArg(dx)  | isInfArg(dy);
++    if (infinityTransform) return;
++
++    activeState().transform *= QTransform(m11, m12, 0.0f, m21, m22, 0.0f, dx, dy, 1.0f);
++}
++
++void CanvasContext2DImpl::setTransform(float m11, float m12, float m21, float m22, float dx, float dy)
++{
++    activeState().transform.reset();
++    activeState().infinityTransform = false; // As cleared the matrix..
++    transform(m11, m12, m21, m22, dx, dy);
++}
++
++// Composition state setting
++//
++
++float CanvasContext2DImpl::globalAlpha() const
++{
++    return activeState().globalAlpha;
++}
++
++void CanvasContext2DImpl::setGlobalAlpha(float a)
++{
++    if (a < 0.0f || a > 1.0f)
++        return;
++
++    activeState().globalAlpha = a;
++    dirty |= DrtAlpha;
++}
++
++static const IDTranslator<QString, QPainter::CompositionMode, const char*>::Info compModeTranslatorTable[] = {
++    {"source-over", QPainter::CompositionMode_SourceOver},
++    {"source-out",  QPainter::CompositionMode_SourceOut},
++    {"source-in",   QPainter::CompositionMode_SourceIn},
++    {"source-atop", QPainter::CompositionMode_SourceAtop},
++    {"destination-atop", QPainter::CompositionMode_DestinationAtop},
++    {"destination-in",   QPainter::CompositionMode_DestinationIn},
++    {"destination-out",  QPainter::CompositionMode_DestinationOut},
++    {"destination-over", QPainter::CompositionMode_DestinationOver},
++    {"darker",  QPainter::CompositionMode_Darken},
++    {"lighter", QPainter::CompositionMode_Lighten},
++    {"copy",    QPainter::CompositionMode_Source},
++    {"xor",     QPainter::CompositionMode_Xor},
++    {0, (QPainter::CompositionMode)0}
++};
++
++MAKE_TRANSLATOR(compModeTranslator, QString, QPainter::CompositionMode, const char*, compModeTranslatorTable)
++
++DOM::DOMString CanvasContext2DImpl::globalCompositeOperation() const
++{
++    return compModeTranslator()->toLeft(activeState().globalCompositeOperation);
++}
++
++void CanvasContext2DImpl::setGlobalCompositeOperation(const DOM::DOMString& op)
++{
++    QString opStr = op.string();
++    if (!compModeTranslator()->hasLeft(opStr))
++        return; // Ignore unknown
++    activeState().globalCompositeOperation = compModeTranslator()->toRight(opStr);
++    dirty |= DrtCompOp;
++}
++
++// Colors and styles.
++//
++
++static QList<qreal> parseNumbersList(QString::const_iterator &itr)
++{
++    QList<qreal> points;
++    QLocale c(QLocale::C);
++    QString temp;
++    bool percent = false;
++    while ((*itr).isSpace())
++        ++itr;
++    while ((*itr).isNumber() ||
++           (*itr) == '-' || (*itr) == '+' || (*itr) == '.') {
++        temp = QString();
++
++        if ((*itr) == '-')
++            temp += *itr++;
++        else if ((*itr) == '+')
++            temp += *itr++;
++        while ((*itr).isDigit())
++            temp += *itr++;
++        if ((*itr) == '.')
++            temp += *itr++;
++        while ((*itr).isDigit())
++            temp += *itr++;
++        while ((*itr).isSpace())
++            ++itr;
++        if ((*itr) == '%')
++            ++itr, percent = true;
++        while ((*itr).isSpace())
++            ++itr;
++        if ((*itr) == ',')
++            ++itr;
++        points.append(c.toDouble(temp) * (percent ? 2.55 : 1));
++        //eat spaces
++        while ((*itr).isSpace())
++            ++itr;
++        percent = false;
++    }
++
++    return points;
++}
++
++static QColor colorFromValue(DOM::DOMString domStr)
++{
++    QString name = domStr.string().trimmed();
++    QString::const_iterator itr = name.constBegin();
++    QList<qreal> compo;
++    if ( name.startsWith( "rgba(" ) || name.startsWith( "hsva(" ) ) {
++        ++itr; ++itr; ++itr; ++itr; ++itr;
++        compo = parseNumbersList(itr);
++        if ( compo.size() != 4 ) {
++            return QColor();
++        }
++        return name.startsWith('h') ?
++            QColor::fromHsvF( compo[0]/255, compo[1]/255, compo[2]/255, compo[3] ) :
++            QColor::fromRgbF( compo[0]/255, compo[1]/255, compo[2]/255, compo[3] );
++    } else if ( name.startsWith( "rgb(" ) ||  name.startsWith( "hsv(" ) ) {
++        ++itr; ++itr; ++itr; ++itr;
++        compo = parseNumbersList(itr);
++        if ( compo.size() != 3 ) {
++            return QColor();
++        }
++        return name.startsWith('h') ?
++            QColor::fromHsv( compo[0], compo[1], compo[2] ) :
++            QColor::fromRgb( compo[0], compo[1], compo[2] );
++    } else {
++        QRgb color;
++        DOM::CSSParser::parseColor(name, color);
++        return QColor(color);
++    }
++}
++
++//-------
++
++DOM::DOMString CanvasColorImpl::toString() const
++{
++    QString str;
++    if (color.alpha() == 255)
++        str.sprintf("#%02x%02x%02x", color.red(), color.green(), color.blue());
++    else
++        str.sprintf("rgba(%d, %d, %d, %f)", color.red(), color.green(), color.blue(), color.alphaF());
++        // ### CHECKME: risk of locale messing up . ?
++    return str;
++}
++
++CanvasColorImpl* CanvasColorImpl::fromString(const DOM::DOMString& str)
++{
++    QColor cl = colorFromValue(str);
++    if (!cl.isValid())
++        return 0;
++    return new CanvasColorImpl(cl);
++}
++
++//-------
++
++CanvasGradientImpl::CanvasGradientImpl(QGradient* newGradient): gradient(newGradient)
++{}
++
++
++static qreal adjustPosition( qreal pos, const QGradientStops &stops )
++{
++    QGradientStops::const_iterator itr = stops.constBegin();
++    const qreal smallDiff = 0.00001;
++    while ( itr != stops.constEnd() ) {
++        const QGradientStop &stop = *itr;
++        ++itr;
++        bool atEnd = ( itr != stops.constEnd() );
++        if ( qFuzzyCompare( pos, stop.first ) ) {
++            if ( atEnd || !qFuzzyCompare( pos + smallDiff, ( *itr ).first ) ) {
++                return pos + smallDiff;
++            }
++        }
++    }
++    return pos;
++}
++
++void CanvasGradientImpl::addColorStop(float offset, const DOM::DOMString& color, int& exceptionCode)
++{
++    // ### we may have to handle the "currentColor" KW here. ouch.
++
++    exceptionCode = 0;
++    //### fuzzy compare (also for alpha)
++    if (offset < 0 || offset > 1) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++
++    QColor qcolor = colorFromValue(color);
++    if (!qcolor.isValid()) {
++        exceptionCode = DOMException::SYNTAX_ERR;
++        return;
++    }
++
++    //<canvas> says that gradient can have two stops at the same position
++    //Qt doesn't handle that. We hack around that by creating a fake position
++    //stop.
++    offset = adjustPosition(offset, gradient->stops());
++
++    gradient->setColorAt(offset, qcolor);
++}
++
++CanvasGradientImpl::~CanvasGradientImpl()
++{
++    delete gradient;
++}
++
++QBrush CanvasGradientImpl::toBrush() const
++{
++    return QBrush(*gradient);
++}
++
++//-------
++
++CanvasPatternImpl::CanvasPatternImpl(const QImage& inImg, bool rx, bool ry):
++        img(inImg), repeatX(rx), repeatY(ry)
++{}
++
++
++QBrush CanvasPatternImpl::toBrush() const
++{
++    //### how do we do repetition?
++    return QBrush(img);
++}
++
++//-------
++
++void CanvasContext2DImpl::setStrokeStyle(CanvasStyleBaseImpl* strokeStyle)
++{
++    if (!strokeStyle)
++        return;
++    activeState().strokeStyle = strokeStyle;
++    dirty |= DrtStroke;
++}
++
++CanvasStyleBaseImpl* CanvasContext2DImpl::strokeStyle() const
++{
++    return activeState().strokeStyle.get();
++}
++
++void CanvasContext2DImpl::setFillStyle(CanvasStyleBaseImpl* fillStyle)
++{
++    if (!fillStyle)
++        return;
++    activeState().fillStyle = fillStyle;
++    dirty |= DrtFill;
++}
++
++CanvasStyleBaseImpl* CanvasContext2DImpl::fillStyle() const
++{
++    return activeState().fillStyle.get();
++}
++
++CanvasGradientImpl* CanvasContext2DImpl::createLinearGradient(float x0, float y0, float x1, float y1) const
++{
++    QLinearGradient* grad = new QLinearGradient(x0, y0, x1, y1);
++    return new CanvasGradientImpl(grad);
++}
++
++CanvasGradientImpl* CanvasContext2DImpl::createRadialGradient(float x0, float y0, float r0,
++                                                              float x1, float y1, float r1,
++                                                              int& exceptionCode) const
++{
++    exceptionCode = 0;
++    //### fuzzy
++    if (r0 < 0.0f || r1 < 0.0f) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return 0;
++    }
++
++    // ### What the heck? Ask FredrikH. For now copy the 1-radius code from old
++    return new CanvasGradientImpl(new QRadialGradient(x0, y0, r0, x1, y1));
++}
++
++CanvasPatternImpl* CanvasContext2DImpl::createPattern(ElementImpl* pat, const DOMString& rpt,
++                                                      int& exceptionCode) const
++{
++    exceptionCode = 0;
++
++    // Decode repetition..
++    bool repeatX;
++    bool repeatY;
++    if (rpt == "repeat") {
++        repeatX = true;
++        repeatY = true;
++    } else if (rpt == "repeat-y") {
++        repeatX = false;
++        repeatY = true;
++    } else if (rpt == "no-repeat") {
++        repeatX = false;
++        repeatY = false;
++    } else {
++        exceptionCode = DOMException::SYNTAX_ERR;
++        return 0;
++    }
++
++    QImage pic = extractImage(pat, exceptionCode);
++    if (exceptionCode)
++        return 0;
++
++    return new CanvasPatternImpl(pic, repeatX, repeatY);
++}
++
++// Pen style ops
++//
++float CanvasContext2DImpl::lineWidth() const
++{
++    return activeState().lineWidth;
++}
++
++void CanvasContext2DImpl::setLineWidth(float newLW)
++{
++    if (newLW <= 0.0)
++        return;
++    activeState().lineWidth = newLW;
++    dirty |= DrtStroke;
++}
++
++static const IDTranslator<QString, Qt::PenCapStyle, const char*>::Info penCapTranslatorTable[] = {
++    {"round", Qt::RoundCap},
++    {"square", Qt::SquareCap},
++    {"butt", Qt::FlatCap},
++    {0, (Qt::PenCapStyle)0}
++};
++
++MAKE_TRANSLATOR(penCapTranslator, QString, Qt::PenCapStyle, const char*, penCapTranslatorTable)
++
++DOMString CanvasContext2DImpl::lineCap() const
++{
++    return penCapTranslator()->toLeft(activeState().lineCap);
++}
++
++void CanvasContext2DImpl::setLineCap(const DOM::DOMString& cap)
+ {
+-    HTMLElementImpl::detach();
++    QString capStr = cap.string();
++    if (!penCapTranslator()->hasLeft(capStr))
++        return;
++    activeState().lineCap = penCapTranslator()->toRight(capStr);
++    dirty |= DrtStroke;
++}
++
++static const IDTranslator<QString, Qt::PenJoinStyle, const char*>::Info penJoinTranslatorTable[] = {
++    {"round", Qt::RoundJoin},
++    {"miter", Qt::MiterJoin},
++    {"bevel", Qt::BevelJoin},
++    {0, (Qt::PenJoinStyle)0}
++};
++
++MAKE_TRANSLATOR(penJoinTranslator, QString, Qt::PenJoinStyle, const char*, penJoinTranslatorTable)
++
++DOMString CanvasContext2DImpl::lineJoin() const
++{
++    return penJoinTranslator()->toLeft(activeState().lineJoin);
++}
++
++void CanvasContext2DImpl::setLineJoin(const DOM::DOMString& join)
++{
++    QString joinStr = join.string();
++    if (!penJoinTranslator()->hasLeft(joinStr))
++        return;
++    activeState().lineJoin = penJoinTranslator()->toRight(joinStr);
++    dirty |= DrtStroke;
++}
++
++float CanvasContext2DImpl::miterLimit() const
++{
++    return activeState().miterLimit;
++}
++
++void CanvasContext2DImpl::setMiterLimit(float newML)
++{
++    if (newML <= 0.0)
++        return;
++    activeState().miterLimit = newML;
++    dirty |= DrtStroke;
++}
++
++// Rectangle ops
++//
++void CanvasContext2DImpl::clearRect (float x, float y, float w, float h, int& exceptionCode)
++{
++    exceptionCode = 0;
++    if (w < 0.0f || h < 0.0f) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++    
++    QPainter* p = acquirePainter();
++    p->setCompositionMode(QPainter::CompositionMode_Source);
++    dirty |= DrtCompOp; // We messed it up..
++
++    p->fillRect(QRectF(x, y, w, h), Qt::transparent);
++}
++
++void CanvasContext2DImpl::fillRect (float x, float y, float w, float h, int& exceptionCode)
++{
++    exceptionCode = 0;
++    if (w < 0.0f || h < 0.0f) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++    
++    QPainter* p = acquirePainter();
++    p->fillRect(QRectF(x, y, w, h), p->brush());
+ }
++
++void CanvasContext2DImpl::strokeRect (float x, float y, float w, float h, int& exceptionCode)
++{
++    exceptionCode = 0;
++    if (w < 0.0f || h < 0.0f) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++
++    QPainter* p = acquirePainter();
++
++    QPainterPath path;
++    path.addRect(x, y, w, h);
++    p->strokePath(path, p->pen());
++}
++
++// Path ops
++//
++void CanvasContext2DImpl::beginPath()
++{
++    path = QPainterPath();
++    path.setFillRule(Qt::WindingFill);
++}
++
++void CanvasContext2DImpl::closePath()
++{
++    path.closeSubpath();
++}
++
++void CanvasContext2DImpl::moveTo(float x, float y)
++{
++    path.moveTo(x, y);
++}
++
++void CanvasContext2DImpl::lineTo(float x, float y)
++{
++    path.lineTo(x, y);
++}
++
++void CanvasContext2DImpl::quadraticCurveTo(float cpx, float cpy, float x, float y)
++{
++    path.quadTo(cpx, cpy, x, y);
++}
++
++void CanvasContext2DImpl::bezierCurveTo(float cp1x, float cp1y, float cp2x, float cp2y, float x, float y)
++{
++    path.cubicTo(cp1x, cp1y, cp2x, cp2y, x, y);
++}
++
++void CanvasContext2DImpl::rect(float x, float y, float w, float h, int& exceptionCode)
++{
++    exceptionCode = 0;
++    if (w < 0 || h < 0) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++
++    path.addRect(x, y, w, h);
++}
++
++void CanvasContext2DImpl::fill()
++{
++    QPainter* p = acquirePainter();
++    p->fillPath(path, p->brush());
++}
++
++void CanvasContext2DImpl::stroke()
++{
++    QPainter* p = acquirePainter();
++    p->strokePath(path, p->pen());
++}
++
++
++static int cnt = 0;
++
++void CanvasContext2DImpl::clip()
++{
++    ++cnt;
++
++    PaintState& state = activeState();
++    QPainterPath pathCopy = path;
++    pathCopy.closeSubpath();
++
++    //### evil workaround for apparent Qt bug(?)
++/*    QTransform t;
++    t.translate(-0.0001*cnt, cnt*0.0001);
++    pathCopy = t.map(pathCopy);*/
++    
++    state.clipPath = state.clipPath.intersected(state.transform.map(pathCopy));
++    state.clipPath.setFillRule(Qt::WindingFill);
++    dirty |= DrtClip;
++}
++
++void CanvasContext2DImpl::arcTo(float x1, float y1, float x2, float y2, float radius, int& exceptionCode)
++{
++    exceptionCode = 0;
++
++    if (radius <= 0) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++
++    //### FIXME busted
++    //me no feely like doing math to convert this correctly, yo
++    path.arcTo(x1, y1, x2-x1, y2-y1, radius, 90);
++}
++
++void CanvasContext2DImpl::arc(float xc, float yc, float radius, float sar, float ear,
++                              bool counterClockWise, int& exceptionCode)
++{
++    exceptionCode = 0;
++
++    if (radius <= 0) {
++        exceptionCode = DOMException::INDEX_SIZE_ERR;
++        return;
++    }
++    
++    //### HACK
++    // In Qt we don't switch the coordinate system for degrees
++    // and still use the 0,0 as bottom left for degrees so we need
++    // to switch
++    sar = -sar;
++    ear = -ear;
++    counterClockWise = !counterClockWise;
++    //end hack
++
++    float sa = degrees( sar );
++    float ea = degrees( ear );
++
++    double span = 0;
++
++    double xs     = xc - radius;
++    double ys     = yc - radius;
++    double width  = radius*2;
++    double height = radius*2;
++
++    if ( !counterClockWise && ( ea < sa ) ) {
++        span += 360;
++    } else if ( counterClockWise && ( sa < ea ) ) {
++        span -= 360;
++    }
++
++    //### this is also due to switched coordinate system
++    // we would end up with a 0 span instead of 360
++    if ( !( qFuzzyCompare( span + ( ea - sa ), 0.0 ) &&
++            qFuzzyCompare( fabs( span ), 360.0 ) ) ) {
++        span   += ea - sa;
++    }
++
++    path.moveTo( QPointF( xc + radius  * cos( sar ),
++                          yc - radius  * sin( sar ) ) );
++    path.arcTo(xs, ys, width, height, sa, span);
++}
++
++// Image stuff
++void CanvasContext2DImpl::drawImage(ElementImpl* image, float dx, float dy, int& exceptionCode)
++{
++    exceptionCode = 0;
++    QImage img = extractImage(image, exceptionCode);
++    if (exceptionCode)
++        return;
++
++    QPainter* p = acquirePainter();
++    p->drawImage(QPointF(dx, dy), img);
++}
++
++void CanvasContext2DImpl::drawImage(ElementImpl* image, float dx, float dy, float dw, float dh,
++                                    int& exceptionCode)
++{
++    //### do we need DoS protection here?
++    exceptionCode = 0;
++    QImage img = extractImage(image, exceptionCode);
++    if (exceptionCode)
++        return;
++
++    QPainter* p = acquirePainter();
++    p->drawImage(QRectF(dx, dy, dw, dh), img);
++}
++
++void CanvasContext2DImpl::drawImage(ElementImpl* image,
++                                    float sx, float sy, float sw, float sh,
++                                    float dx, float dy, float dw, float dh,
++                                    int& exceptionCode)
++{
++    //### do we need DoS protection here?
++    exceptionCode = 0;
++    QImage img = extractImage(image, exceptionCode);
++    if (exceptionCode)
++        return;
++
++    QPainter* p = acquirePainter();
++    p->drawImage(QRectF(dx, dy, dw, dh), img, QRectF(sx, sy, sw, sh));
++}
++
++// kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/html/htmlparser.h
++++ b/khtml/html/htmlparser.h
+@@ -119,6 +119,8 @@
+ 
+     void pushBlock( int _id, int _level);
+ 
++    void generateImpliedEndTags( int _id );
++    void popOptionalBlock( int _id );
+     void popBlock( int _id );
+     void popOneBlock(bool delBlock = true);
+     void popInlineBlocks();
+--- a/khtml/html/html_elementimpl.cpp
++++ b/khtml/html/html_elementimpl.cpp
+@@ -495,7 +495,7 @@
+ DocumentFragment HTMLElementImpl::createContextualFragment( const DOMString &html )
+ {
+     // the following is in accordance with the definition as used by IE
+-    if( endTag[id()] == FORBIDDEN )
++    if( endTagRequirement(id()) == FORBIDDEN )
+         return DocumentFragment();
+     // IE disallows innerHTML on inline elements.
+     // I don't see why we should have this restriction, as our
+@@ -582,7 +582,7 @@
+ void HTMLElementImpl::setInnerText( const DOMString &text, int& exceptioncode )
+ {
+     // following the IE specs.
+-    if( endTag[id()] == FORBIDDEN ) {
++    if( endTagRequirement(id()) == FORBIDDEN ) {
+         exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
+         return;
+     }
+@@ -653,7 +653,7 @@
+ 	DOMString result = openTagStartToString();
+ 	result += ">";	//krazy:exclude=doublequote_chars DOM demands chars
+ 
+-	if (endTag[id()] == REQUIRED) {
++	if (endTagRequirement(id()) == REQUIRED) {
+ 	    result += "</";
+ 	    result += tagName();
+ 	    result += ">";	//krazy:exclude=doublequote_chars DOM demands chars
+--- a/khtml/html/dtd.cpp
++++ b/khtml/html/dtd.cpp
+@@ -2,7 +2,7 @@
+  * This file is part of the DOM implementation for KDE.
+  *
+  * Copyright (C) 1999 Lars Knoll (knoll at kde.org)
+- *           (C) 2006 Allan Sandfeld Jensen (kde at carewolf.com)
++ *           (C) 2006-2007 Allan Sandfeld Jensen (kde at carewolf.com)
+  *
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Library General Public
+@@ -22,7 +22,6 @@
+  */
+ 
+ #include "html/dtd.h"
+-#include "misc/htmlhashes.h"
+ 
+ using namespace DOM;
+ 
+@@ -35,23 +34,22 @@
+ //
+ // 0 elements with forbidden close tag and text. They don't get pushed
+ //   to the stack.
+-// 1 inline elements
+-// 2 form elements
+-// 3 regular block level elements
+-// 4 lists (OL UL DIR MENU)
+-// 5 TD TH SELECT
+-// 6 TR
+-// 7 tbody thead tfoot caption  object
+-// 8 table
+-// 9 body frameset
+-// 10 html
++// 1 formatting elements
++// 3 form nobr noscript
++// 5 phrasing elements
++// 6 TD TH SELECT
++// 7 TR
++// 8 tbody thead tfoot
++// 9 table
++// 10 body frameset head noembed noframes
++// 11 html
+ 
+-const unsigned short KDE_NO_EXPORT DOM::tagPriority[] = {
++const unsigned short KDE_NO_EXPORT DOM::tagPriorityArray[] = {
+     0, // 0
+     1, // ID_A == 1
+     1, // ID_ABBR
+     1, // ID_ACRONYM
+-    3, // ID_ADDRESS
++    5, // ID_ADDRESS
+     1, // ID_APPLET
+     0, // ID_AREA
+     1, // ID_B
+@@ -63,23 +61,23 @@
+    10, // ID_BODY
+     0, // ID_BR
+     1, // ID_BUTTON
+-    0, // ID_CANVAS
++    1, // ID_CANVAS
+     5, // ID_CAPTION
+     5, // ID_CENTER
+     1, // ID_CITE
+     1, // ID_CODE
+     0, // ID_COL
+     1, // ID_COLGROUP
+-    3, // ID_DD
++    5, // ID_DD
+     1, // ID_DEL
+     1, // ID_DFN
+     5, // ID_DIR
+     5, // ID_DIV
+     5, // ID_DL
+-    3, // ID_DT
++    5, // ID_DT
+     1, // ID_EM
+     0, // ID_EMBED
+-    3, // ID_FIELDSET
++    5, // ID_FIELDSET
+     1, // ID_FONT
+     3, // ID_FORM
+     0, // ID_FRAME
+@@ -105,10 +103,10 @@
+     1, // ID_LABEL
+     1, // ID_LAYER
+     1, // ID_LEGEND
+-    3, // ID_LI
++    5, // ID_LI
+     0, // ID_LINK
+     1, // ID_MAP
+-    3, // ID_MARQUEE
++    5, // ID_MARQUEE
+     5, // ID_MENU
+     0, // ID_META
+     5, // ID_NOBR
+@@ -120,7 +118,7 @@
+     5, // ID_OL
+     1, // ID_OPTGROUP
+     2, // ID_OPTION
+-    3, // ID_P
++    5, // ID_P
+     0, // ID_PARAM
+     5, // ID_PLAINTEXT
+     5, // ID_PRE
+@@ -136,7 +134,7 @@
+     1, // ID_STYLE
+     1, // ID_SUB
+     1, // ID_SUP
+-    9,// ID_TABLE
++    9, // ID_TABLE
+     8, // ID_TBODY
+     6, // ID_TD
+     1, // ID_TEXTAREA
+@@ -154,7 +152,7 @@
+     0, // ID_TEXT
+ };
+ 
+-const tagStatus DOM::endTag[] = {
++const tagStatus DOM::endTagArray[] = {
+     REQUIRED,  // 0
+     REQUIRED,  // ID_A == 1
+     REQUIRED,  // ID_ABBR
+@@ -171,7 +169,7 @@
+     REQUIRED,  // ID_BODY
+     FORBIDDEN, // ID_BR
+     REQUIRED,  // ID_BUTTON
+-    FORBIDDEN, // ID_CANVAS
++    REQUIRED,  // ID_CANVAS
+     REQUIRED,  // ID_CAPTION
+     REQUIRED,  // ID_CENTER
+     REQUIRED,  // ID_CITE
+@@ -372,7 +370,7 @@
+ };
+ 
+ 
+-static const ushort tag_list_7[] = {
++static const ushort tag_list_select[] = {
+     ID_TEXT,
+     ID_OPTGROUP,
+     ID_OPTION,
+@@ -381,7 +379,7 @@
+     0
+ };
+ 
+-static const ushort tag_list_10[] = {
++static const ushort tag_list_frame[] = {
+     ID_FRAMESET,
+     ID_FRAME,
+     ID_NOFRAMES,
+@@ -389,7 +387,7 @@
+     0
+ };
+ 
+-static const ushort tag_list_11[] = {
++static const ushort tag_list_head[] = {
+     ID_SCRIPT,
+     ID_STYLE,
+     ID_META,
+@@ -434,11 +432,14 @@
+ {
+     //kDebug( 6030 ) << "checkChild: " << tagID << "/" << childID;
+ 
+-    if (tagID >= 1000 || childID >= 1000)
+-        return true; // one or both of the elements in an XML element; just allow for now
+-
+     if (childID == ID_COMMENT) return true;
+ 
++    // Treat custom elements the same as <span>.
++    if (tagID > ID_LAST_TAG)
++        tagID = ID_SPAN;
++    if (childID > ID_LAST_TAG)
++        childID = ID_SPAN;
++
+     switch(tagID)
+     {
+     case ID_TT:
+@@ -475,7 +476,7 @@
+         return check_flow(childID, true);
+     case ID_P:
+         // P: %inline *
+-        return check_inline(childID, strict) || 
++        return check_inline(childID, strict) ||
+                (!strict && childID == ID_TABLE );
+     case ID_H1:
+     case ID_H2:
+@@ -507,11 +508,11 @@
+         return check_flow(childID, strict);
+     case ID_ADDRESS:
+         // ADDRESS: %inline *
+-        return check_inline(childID, strict) || 
++        return check_inline(childID, strict) ||
+                (!strict && childID == ID_P);
+     case ID_DT:
+         // DT: %inline *
+-        return check_inline(childID, strict) || 
++        return check_inline(childID, strict) ||
+               (!strict && check_block(childID, true) && childID != ID_DL);
+     case ID_LI:
+     case ID_DIV:
+@@ -530,10 +531,11 @@
+     case ID_NOSCRIPT:
+     case ID_CAPTION:
+     case ID_MARQUEE:
++    case ID_CANVAS:
+         // DIV: %flow *
+         return check_flow(childID, strict);
+     case ID_MAP:
+-        // MAP: ( %block | AREA ) + 
++        // MAP: ( %block | AREA ) +
+         return check_block(childID, true) || childID == ID_AREA ||
+                (!strict && childID == ID_SCRIPT);
+     case ID_OBJECT:
+@@ -548,16 +550,14 @@
+         return check_flow(childID, true);
+     case ID_DL:
+         // DL: DT | DD +
+-        return (childID == ID_DT || childID == ID_DD || childID == ID_TEXT) || 
+-               (!strict && check_flow(childID, true));
++        return (childID == ID_DT || childID == ID_DD || check_flow(childID, strict));
+     case ID_OL:
+     case ID_UL:
+     case ID_DIR:
+     case ID_MENU:
+         // OL: LI +
+-        // For DIR and MENU, the DTD says - %block, but it contradicts spec language.. 
+-        return (childID == ID_LI || childID == ID_TEXT) || 
+-               (!strict && check_flow(childID, true));
++        // For DIR and MENU, the DTD says - %block, but it contradicts spec language..
++        return (childID == ID_LI || check_flow(childID, strict));
+     case ID_FORM:
+         // FORM: %flow * - FORM
+         return check_flow(childID, strict);
+@@ -572,7 +572,7 @@
+         // Yes, consider it a hack (Dirk)
+     case ID_SELECT:
+         // SELECT: _7 +
+-        return check_array(childID, tag_list_7);
++        return check_array(childID, tag_list_select);
+     case ID_OPTGROUP:
+         // OPTGROUP: OPTION +
+         if(childID == ID_OPTION) return true;
+@@ -624,10 +624,10 @@
+         return (childID == ID_TH || childID == ID_TD || childID == ID_SCRIPT);
+     case ID_FRAMESET:
+         // FRAMESET: _10
+-        return check_array(childID, tag_list_10);
++        return check_array(childID, tag_list_frame);
+     case ID_HEAD:
+         // HEAD: _11
+-        return check_array(childID, tag_list_11);
++        return check_array(childID, tag_list_head);
+     case ID_HTML:
+         // HTML: ( HEAD , COMMENT, ( BODY | ( FRAMESET & NOFRAMES ? ) ) )
+         switch(childID)
+--- a/khtml/html/htmlparser.cpp
++++ b/khtml/html/htmlparser.cpp
+@@ -259,10 +259,6 @@
+     {
+         ElementImpl *e = static_cast<ElementImpl *>(n);
+         e->setAttributeMap(t->attrs);
+-
+-        // take care of optional close tags
+-        if(endTag[e->id()] == DOM::OPTIONAL)
+-            popBlock(t->tid);
+     }
+ 
+     // if this tag is forbidden inside the current context, pop
+@@ -282,7 +278,7 @@
+     }
+ 
+     // the tokenizer needs the feedback for space discarding
+-    if ( tagPriority[t->tid] == 0 )
++    if ( tagPriority(t->tid) == 0 )
+ 	t->flat = true;
+ 
+     if ( !insertNode(n, t->flat) ) {
+@@ -335,13 +331,13 @@
+         }
+ 
+ 	// don't push elements without end tag on the stack
+-        if(tagPriority[id] != 0 && !flat) {
++        if(tagPriority(id) != 0 && !flat) {
+ #if SPEED_DEBUG < 2
+             if(!n->attached() && HTMLWidget )
+                 n->attach();
+ #endif
+ 	    if(n->isInline()) m_inline = true;
+-            pushBlock(id, tagPriority[id]);
++            pushBlock(id, tagPriority(id));
+             setCurrent( newNode );
+         } else {
+ #if SPEED_DEBUG < 2
+@@ -359,7 +355,7 @@
+ 
+ 
+ #if SPEED_DEBUG < 1
+-        if(tagPriority[id] == 0 && n->renderer())
++        if(tagPriority(id) == 0 && n->renderer())
+             n->renderer()->calcMinMaxWidth();
+ #endif
+         return true;
+@@ -452,7 +448,7 @@
+             if ( head ) {
+                 DOM::NodeImpl *newNode = head->addChild(n);
+                 if ( newNode ) {
+-                    pushBlock(id, tagPriority[id]);
++                    pushBlock(id, tagPriority(id));
+                     setCurrent ( newNode );
+ #if SPEED_DEBUG < 2
+ 		    if(!n->attached() && HTMLWidget)
+@@ -573,7 +569,7 @@
+                     NodeImpl* table = tsection->parent();
+                     int exceptioncode = 0;
+                     table->insertBefore(n, tsection, exceptioncode);
+-                    pushBlock(id, tagPriority[id]);
++                    pushBlock(id, tagPriority(id));
+                     setCurrent(n);
+                     inStrayTableContent++;
+                     blockStack->strayTableContent = true;
+@@ -712,10 +708,10 @@
+                             kDebug(6035) << "adding content before table failed..";
+                         break;
+                     }
+-                    if ( n->isElementNode() && tagPriority[id] != 0 &&
+-                         !flat && endTag[id] != DOM::FORBIDDEN ) {
++                    if ( n->isElementNode() && tagPriority(id) != 0 &&
++                         !flat && endTagRequirement(id) != DOM::FORBIDDEN ) {
+ 
+-                        pushBlock(id, tagPriority[id]);
++                        pushBlock(id, tagPriority(id));
+                         setCurrent ( n );
+                         inStrayTableContent++;
+                         blockStack->strayTableContent = true;
+@@ -947,6 +943,7 @@
+         n = new HTMLOptGroupElementImpl(document, form);
+         break;
+     case ID_OPTION:
++        popOptionalBlock(ID_OPTION);
+         n = new HTMLOptionElementImpl(document, form);
+         break;
+     case ID_SELECT:
+@@ -962,14 +959,14 @@
+         n = new HTMLDListElementImpl(document);
+         break;
+     case ID_DD:
++        popOptionalBlock(ID_DT);
++        popOptionalBlock(ID_DD);
+         n = new HTMLGenericElementImpl(document, t->tid);
+-        popBlock(ID_DT);
+-        popBlock(ID_DD);
+         break;
+     case ID_DT:
++        popOptionalBlock(ID_DD);
++        popOptionalBlock(ID_DT);
+         n = new HTMLGenericElementImpl(document, t->tid);
+-        popBlock(ID_DD);
+-        popBlock(ID_DT);
+         break;
+     case ID_UL:
+     {
+@@ -988,7 +985,7 @@
+         n = new HTMLMenuElementImpl(document);
+         break;
+     case ID_LI:
+-        popBlock(ID_LI);
++        popOptionalBlock(ID_LI);
+         n = new HTMLLIElementImpl(document);
+         break;
+ // formatting elements (block)
+@@ -1104,16 +1101,16 @@
+         break;
+     case ID_TD:
+     case ID_TH:
+-        popBlock(ID_TH);
+-        popBlock(ID_TD);
++        popOptionalBlock(ID_TH);
++        popOptionalBlock(ID_TD);
+         n = new HTMLTableCellElementImpl(document, t->tid);
+         break;
+     case ID_TBODY:
+     case ID_THEAD:
+     case ID_TFOOT:
+-        popBlock( ID_THEAD );
+-        popBlock( ID_TBODY );
+-        popBlock( ID_TFOOT );
++        popOptionalBlock( ID_THEAD );
++        popOptionalBlock( ID_TBODY );
++        popOptionalBlock( ID_TFOOT );
+         n = new HTMLTableSectionElementImpl(document, t->tid, false);
+         break;
+ 
+@@ -1162,7 +1159,7 @@
+     case ID_WBR:
+     case ID_NOBR:
+         if ( t->tid == ID_NOBR || t->tid == ID_WBR )
+-            popBlock( t->tid );
++            popOptionalBlock( t->tid );
+     case ID_BDO:
+         n = new HTMLGenericElementImpl(document, t->tid);
+         break;
+@@ -1203,7 +1200,9 @@
+         n = new CommentImpl(document, t->text);
+         break;
+     default:
+-        kDebug( 6035 ) << "Unknown tag " << t->tid << "!";
++        n = new HTMLGenericElementImpl(document, t->tid);
++        break;
++//         kDebug( 6035 ) << "Unknown tag " << t->tid << "!";
+     }
+     return n;
+ }
+@@ -1246,7 +1245,8 @@
+         child = child->nextSibling();
+     }
+ #endif
+-    popBlock(t->tid-ID_CLOSE_TAG);
++    generateImpliedEndTags( t->tid - ID_CLOSE_TAG );
++    popBlock( t->tid - ID_CLOSE_TAG );
+ #ifdef PARSER_DEBUG
+     kDebug( 6035 ) << "closeTag --> current = " << current->nodeName().string();
+ #endif
+@@ -1256,17 +1256,18 @@
+ {
+     switch (_id) {
+         case ID_A:
+-        case ID_FONT:
+-        case ID_TT:
+-        case ID_U:
+         case ID_B:
++        case ID_BIG:
++        case ID_EM:
++        case ID_FONT:
+         case ID_I:
++        case ID_NOBR:
+         case ID_S:
+-        case ID_STRIKE:
+-        case ID_BIG:
+         case ID_SMALL:
+-        case ID_EM:
++        case ID_STRIKE:
+         case ID_STRONG:
++        case ID_TT:
++        case ID_U:
+         case ID_DFN:
+         case ID_CODE:
+         case ID_SAMP:
+@@ -1275,7 +1276,6 @@
+         case ID_DEL:
+         case ID_INS:
+         case ID_WBR:
+-        case ID_NOBR:
+             return true;
+         default:
+             return false;
+@@ -1541,6 +1541,45 @@
+     addForbidden(_id, forbiddenTag);
+ }
+ 
++void KHTMLParser::generateImpliedEndTags( int _id )
++{
++    HTMLStackElem *Elem = blockStack;
++
++    int level = tagPriority(_id);
++    while( Elem && Elem->id != _id)
++    {
++        if (endTagRequirement(Elem->id) == DOM::OPTIONAL && Elem->level <= level) {
++            popOneBlock();
++        }
++        else
++            break;
++        Elem = Elem->next;
++    }
++}
++
++void KHTMLParser::popOptionalBlock( int _id )
++{
++    bool found = false;
++    HTMLStackElem *Elem = blockStack;
++
++    int level = tagPriority(_id);
++    while( Elem )
++    {
++        if (Elem->id == _id) {
++            found = true;
++            break;
++        }
++        if (Elem->level > level || (endTagRequirement(Elem->id) != DOM::OPTIONAL && !isResidualStyleTag(Elem->id)) )
++            break;
++        Elem = Elem->next;
++    }
++
++    if (found) {
++        generateImpliedEndTags(_id);
++        popBlock(_id);
++    }
++}
++
+ void KHTMLParser::popBlock( int _id )
+ {
+     HTMLStackElem *Elem = blockStack;
+--- a/khtml/html/html_canvasimpl.h
++++ b/khtml/html/html_canvasimpl.h
+@@ -1,4 +1,5 @@
+ /*
++ * Copyright (C) 2007 Maksim Orlovich <maksim at kde.org>
+  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+@@ -25,32 +26,284 @@
+ #ifndef HTML_CANVASIMPL_H
+ #define HTML_CANVASIMPL_H
+ 
+-#include "html/html_imageimpl.h"
+-#include "html/html_inlineimpl.h"
++#include "dom/dom_string.h"
++#include "html/html_elementimpl.h"
+ #include "misc/khtmllayout.h"
+ #include "rendering/render_object.h"
+ 
+ #include <QtGui/QRegion>
+ #include <QtCore/QMap>
++#include <QtCore/QStack>
+ #include <QtGui/QPixmap>
++#include <QtGui/QGradient>
++
++namespace khtmlImLoad {
++    class CanvasImage;
++}
+ 
+ namespace DOM {
+ 
++class CanvasContext2DImpl;
+ 
+-class HTMLCanvasElementImpl
+-    : public HTMLImageElementImpl
++class HTMLCanvasElementImpl : public HTMLElementImpl
+ {
+ public:
+     HTMLCanvasElementImpl(DocumentImpl *doc);
+     ~HTMLCanvasElementImpl();
+ 
++    virtual void parseAttribute(AttributeImpl*);
+     virtual Id id() const;
+ 
+     virtual void attach();
+-    virtual void detach();
++
++    int width () const { return w; }
++    int height() const { return h; }
++
++    CanvasContext2DImpl* getContext2D();
++
++    // Returns the canvas image, but does not guarantee it's
++    // up-to-date
++    khtmlImLoad::CanvasImage* getCanvasImage();
++private:
++    int w, h;
++    SharedPtr<CanvasContext2DImpl> context;
++};
++
++// Base class for representing styles for fill and stroke.
++// Not part of the DOM
++class CanvasStyleBaseImpl : public khtml::Shared<CanvasStyleBaseImpl>
++{
++public:
++    enum Type {
++        Color,
++        Gradient,
++        Pattern
++    };
++
++    virtual ~CanvasStyleBaseImpl() {}
++    
++    virtual Type   type() const = 0;
++    virtual QBrush toBrush() const = 0;
++};
++
++
++// Not part of the DOM.
++class CanvasColorImpl : public CanvasStyleBaseImpl
++{
++public:
++    QColor color;
++
++    CanvasColorImpl(const QColor& newColor) : color(newColor)
++    {}
++
++    virtual Type type() const { return Color; }
++
++    virtual QBrush toBrush() const {
++        return QBrush(color);
++    }
++
++    DOM::DOMString toString() const;
++
++    // Note: returns 0 if it can not be parsed.
++    static CanvasColorImpl* fromString(const DOM::DOMString &s);
++};
++
++
++class CanvasPatternImpl : public CanvasStyleBaseImpl
++{
++public:
++    CanvasPatternImpl(const QImage& inImg, bool rx, bool ry);
++    
++    virtual Type type() const { return Pattern; }
++    virtual QBrush toBrush() const;
++private:
++    QImage img;
++    bool   repeatX, repeatY;
++};
++
++class CanvasGradientImpl : public CanvasStyleBaseImpl
++{
++public:
++    CanvasGradientImpl(QGradient* newGradient);
++    ~CanvasGradientImpl();
++
++    // Our internal interface..
++    virtual Type type() const { return Gradient; }
++    virtual QBrush toBrush() const;
++
++    // DOM API
++    void addColorStop(float offset, const DOM::DOMString& color, int& exceptionCode);
++private:
++    QGradient* gradient;
++};
++
++class CanvasContext2DImpl : public khtml::Shared<CanvasContext2DImpl>
++{
++public:
++    CanvasContext2DImpl(HTMLCanvasElementImpl* element, int width, int height);
++    ~CanvasContext2DImpl();
++
++    // Note: the native API does not attempt to validate
++    // input for NaN and +/- infinity to raise exceptions;
++    // but it does handle them for transformations
++
++    // For renderer..
++    void commit();
++
++    // Public API, exported via the DOM.
++    HTMLCanvasElementImpl* canvas() const;
++
++    // State management
++    void save();
++    void restore();
++
++    // Transformations
++    void scale(float x, float y);
++    void rotate(float angle);
++    void translate(float x, float y);
++    void transform(float m11, float m12, float m21, float m22, float dx, float dy);
++    void setTransform(float m11, float m12, float m21, float m22, float dx, float dy);
++
++    // Composition state setting
++    float globalAlpha() const;
++    void  setGlobalAlpha(float a);
++    DOMString globalCompositeOperation() const;
++    void  setGlobalCompositeOperation(const DOMString& op);
++
++    // Colors and styles..
++    void setStrokeStyle(CanvasStyleBaseImpl* strokeStyle);
++    CanvasStyleBaseImpl* strokeStyle() const;
++    void setFillStyle(CanvasStyleBaseImpl* fillStyle);
++    CanvasStyleBaseImpl* fillStyle() const;
++    CanvasGradientImpl* createLinearGradient(float x0, float y0, float x1, float y1) const;
++    CanvasGradientImpl* createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1, int& exceptionCode) const;
++    CanvasPatternImpl*  createPattern(ElementImpl* pat, const DOMString& rpt, int& exceptionCode) const;
++
++    // Line attributes
++    float lineWidth() const;
++    void  setLineWidth(float newLW);
++    DOMString lineCap() const;
++    void  setLineCap(const DOMString& newCap);
++    DOMString lineJoin() const;
++    void  setLineJoin(const DOMString& newJoin);
++    float miterLimit() const;
++    void  setMiterLimit(float newML);
++
++    // Rectangle operations
++    void clearRect (float x, float y, float w, float h, int& exceptionCode);
++    void fillRect  (float x, float y, float w, float h, int& exceptionCode);
++    void strokeRect(float x, float y, float w, float h, int& exceptionCode);
++
++    // Path-based ops
++    void beginPath();
++    void closePath();
++    void moveTo(float x, float y);
++    void lineTo(float x, float y);
++    void quadraticCurveTo(float cpx, float cpy, float x, float y);
++    void bezierCurveTo   (float cp1x, float cp1y, float cp2x, float cp2y, float x, float y);
++    void arcTo(float x1, float y1, float x2, float y2, float radius, int& exceptionCode);
++    void rect(float x, float y, float w, float h, int& exceptionCode);
++    void arc(float x, float y, float radius, float startAngle, float endAngle,
++             bool ccw, int& exceptionCode);
++    void fill();
++    void stroke();
++    void clip();
++    bool isPointInPath(float x, float y);
++
++    // Image ops
++    void drawImage(ElementImpl* image, float dx, float dy, int& exceptionCode);
++    void drawImage(ElementImpl* image, float dx, float dy, float dw, float dh, int& exceptionCode);
++    void drawImage(ElementImpl* image, float sx, float sy, float sw, float sh,
++                   float dx, float dy, float dw, float dh, int& exceptionCode);
++private:
++    friend class HTMLCanvasElementImpl;
++
++    // initialize canvas for new size
++    void resetContext(int width, int height);
++
++    // Cleared by canvas dtor..
++    HTMLCanvasElementImpl* canvasElement;
++    
++    // Helper for methods that take images via elements; this will extract them,
++    // and signal an exception if needed be
++    QImage extractImage(ElementImpl* el, int& exceptionCode) const;
++
++    // This method will prepare a painter for use, making sure it's active,
++    // that all the dirty state got sync'd, etc, and will mark the
++    // canvas as dirty so the renderer can flush everything, etc.
++    QPainter* acquirePainter();
++
++    // We use khtmlImLoad to manage our canvas image, so that
++    // the Renderer can scale easily.
++    khtmlImLoad::CanvasImage* canvasImage;
++
++    // The path is global, and never saved/restored
++    QPainterPath path;
++
++    // We keep track of non-path state ourselves. There are two reasons:
++    // 1) The painter may have to be end()ed so we can not rely on it to remember
++    //    things
++    // 2) The stroke and fill style can actually be DOM objects, so we have to
++    //    be able to hand them back
++    // "The canvas state" section of the spec describes what's included here
++    struct PaintState {
++        // Viewport state (not readable from outside)
++        QTransform    transform;
++        bool          infinityTransform; // Marks that the transform has become invalid,
++                                         // and should be treated as identity.
++        QPainterPath  clipPath; // This is in -physical- coordinates
++
++        // Compositing state
++        float globalAlpha;
++        QPainter::CompositionMode globalCompositeOperation;
++
++        // Stroke and fill styles.
++        SharedPtr<CanvasStyleBaseImpl> strokeStyle;
++        SharedPtr<CanvasStyleBaseImpl> fillStyle;
++
++        // Line stuff
++        float            lineWidth;
++        Qt::PenCapStyle  lineCap;
++        Qt::PenJoinStyle lineJoin;
++        float            miterLimit;
++
++        // ### TODO: shadow stuff
++    };
++
++    // The stack of states. The entry on the top is always the current state.
++    QStack<PaintState> stateStack;
++
++    const PaintState& activeState() const { return stateStack.top(); }
++    PaintState& activeState() { return stateStack.top(); }
++
++    enum DirtyFlags {
++        DrtTransform = 0x01,
++        DrtClip      = 0x02,
++        DrtAlpha     = 0x04,
++        DrtCompOp    = 0x08,
++        DrtStroke    = 0x10,
++        DrtFill      = 0x20,
++        DrtAll       = 0xFF
++    };
++
++    // The painter for working on the QImage. Might not be active.
++    // Should not be used directly, but rather via acquirePainter
++    QPainter workPainter;
++
++    // How out-of-date the painter is, if it is active.
++    int dirty;
++
++    // If we have not committed all the changes to the entire
++    // scaler hierarchy
++    bool needsCommit;
++
++    // Tells the element and then the renderer that we changed, so need
++    // repainting.
++    void needRendererUpdate();
+ };
+ 
+ 
+ } //namespace
+ 
+ #endif
++// kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/ecma/kjs_navigator.cpp
++++ b/khtml/ecma/kjs_navigator.cpp
+@@ -39,8 +39,6 @@
+ #include <khtml_part.h>
+ #include <sys/utsname.h>
+ 
+-#include <Qt3Support/Q3PtrList>
+-
+ using namespace KJS;
+ 
+ namespace KJS {
+@@ -66,11 +64,11 @@
+             QString name;
+             QString file;
+             QString desc;
+-            Q3PtrList<MimeClassInfo> mimes;
++            QList<const MimeClassInfo*> mimes;
+         };
+ 
+-        static Q3PtrList<PluginInfo> *plugins;
+-        static Q3PtrList<MimeClassInfo> *mimes;
++        static QList<const PluginInfo*> *plugins;
++        static QList<const MimeClassInfo*> *mimes;
+ 
+     private:
+         static int m_refCount;
+@@ -116,7 +114,7 @@
+ 
+     class Plugin : public PluginBase {
+     public:
+-        Plugin( ExecState *exec, PluginBase::PluginInfo *info )
++        Plugin(ExecState *exec, const PluginBase::PluginInfo *info)
+           : PluginBase( exec, true )
+         { m_info = info; }
+         virtual bool getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot);
+@@ -124,9 +122,9 @@
+         static const ClassInfo info;
+         ValueImp *mimeByName(ExecState* exec, const QString& name ) const;
+         ValueImp *getValueProperty(ExecState *exec, int token) const;
+-        PluginBase::PluginInfo *pluginInfo() const { return m_info; }
++        const PluginBase::PluginInfo *pluginInfo() const { return m_info; }
+     private:
+-        PluginBase::PluginInfo *m_info;
++        const PluginBase::PluginInfo *m_info;
+         static ValueImp *indexGetter(ExecState *, JSObject*, const Identifier&, const PropertySlot&);
+         static ValueImp *nameGetter(ExecState *, JSObject*, const Identifier&, const PropertySlot&);
+     };
+@@ -134,7 +132,7 @@
+ 
+     class MimeType : public PluginBase {
+     public:
+-        MimeType( ExecState *exec, PluginBase::MimeClassInfo *info )
++        MimeType(ExecState *exec, const PluginBase::MimeClassInfo *info)
+           : PluginBase( exec, true )
+         { m_info = info; }
+         virtual bool getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot);
+@@ -142,15 +140,15 @@
+         static const ClassInfo info;
+         ValueImp *getValueProperty(ExecState *exec, int token) const;
+     private:
+-        PluginBase::MimeClassInfo *m_info;
++        const PluginBase::MimeClassInfo *m_info;
+     };
+ 
+ }
+ 
+ 
+-Q3PtrList<PluginBase::PluginInfo> *KJS::PluginBase::plugins = 0;
+-Q3PtrList<PluginBase::MimeClassInfo> *KJS::PluginBase::mimes = 0;
+-int KJS::PluginBase::m_refCount = 0;
++QList<const PluginBase::PluginInfo*> *KJS::PluginBase::plugins;
++QList<const PluginBase::MimeClassInfo*> *KJS::PluginBase::mimes;
++int KJS::PluginBase::m_refCount;
+ 
+ const ClassInfo Navigator::info = { "Navigator", 0, &NavigatorTable, 0 };
+ /*
+@@ -265,7 +263,7 @@
+         struct utsname name;
+         int ret = uname(&name);
+         if ( ret >= 0 )
+-            return String(QString::fromLatin1("%1 %1 X11").arg(name.sysname).arg(name.machine));
++            return String(QString::fromLatin1("%1 %2").arg(name.sysname).arg(name.machine));
+         else // can't happen
+             return String("Unix X11");
+     }
+@@ -276,7 +274,7 @@
+     if ( ret >= 0 )
+       return String(name.machine);
+     else // can't happen
+-      return String("x86");
++      return String("unknown");
+   }
+   case _Plugins:
+     return new Plugins(exec, m_part->pluginsEnabled());
+@@ -296,10 +294,8 @@
+   : ObjectImp(exec->lexicalInterpreter()->builtinObjectPrototype() )
+ {
+     if ( loadPluginInfo && !plugins ) {
+-        plugins = new Q3PtrList<PluginInfo>;
+-        mimes = new Q3PtrList<MimeClassInfo>;
+-        plugins->setAutoDelete( true );
+-        mimes->setAutoDelete( true );
++        plugins = new QList<const PluginInfo*>;
++        mimes = new QList<const MimeClassInfo*>;
+ 
+         // read in using KServiceTypeTrader
+         const KService::List offers = KServiceTypeTrader::self()->query("Browser/View");
+@@ -316,10 +312,11 @@
+                     continue;
+             }
+             // read configuration
+-            KConfigGroup kc = KSharedConfig::openConfig( KStandardDirs::locate ("data", pluginsinfo.toString()) )->group( "0" );
+-            const int num = kc.readEntry("number", 0);
++            QString fn = KStandardDirs::locate("data", pluginsinfo.toString());
++            const KSharedConfig::Ptr sc = KSharedConfig::openConfig(fn);
++            const int num = sc->group("").readEntry("number", 0);
+             for ( int n = 0; n < num; n++ ) {
+-                kc.changeGroup( QString::number(n) );
++                const KConfigGroup kc = sc->group(QString::number(n));
+                 PluginInfo *plugin = new PluginInfo;
+ 
+                 plugin->name = kc.readEntry("name");
+@@ -328,8 +325,8 @@
+ 
+                 plugins->append( plugin );
+ 
+-                QStringList types = kc.readEntry("mime", QStringList(), ';');
+-                QStringList::Iterator type;
++                const QStringList types = kc.readEntry("mime", QStringList(), ';');
++                QStringList::const_iterator type;
+                 for ( type=types.begin(); type!=types.end(); ++type ) {
+ 
+                     // get mime information
+@@ -366,6 +363,8 @@
+ {
+     m_refCount--;
+     if ( m_refCount==0 ) {
++        qDeleteAll(*plugins);
++        qDeleteAll(*mimes);
+         delete plugins;
+         delete mimes;
+         plugins = 0;
+@@ -387,7 +386,7 @@
+ */
+ KJS_IMPLEMENT_PROTOFUNC(PluginsFunc)
+ 
+-ValueImp *Plugins::getValueProperty(ExecState *exec, int token) const
++ValueImp *Plugins::getValueProperty(ExecState*, int token) const
+ {
+   assert(token == Plugins_Length);
+   if (pluginsEnabled())
+@@ -396,12 +395,12 @@
+     return Number(0);
+ }
+ 
+-ValueImp *Plugins::indexGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *Plugins::indexGetter(ExecState* exec, JSObject*, const Identifier& /*propertyName*/, const PropertySlot& slot)
+ {
+   return new Plugin(exec, plugins->at(slot.index()));
+ }
+ 
+-ValueImp *Plugins::nameGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *Plugins::nameGetter(ExecState* exec, JSObject*, const Identifier& propertyName, const PropertySlot& /*slot*/)
+ {
+   return pluginByName(exec, propertyName.qstring());
+ }
+@@ -418,14 +417,15 @@
+     // plugins[#]
+     bool ok;
+     unsigned int i = propertyName.toUInt32(&ok);
+-    if (ok && i < plugins->count()) {
++    if (ok && i < static_cast<unsigned>(plugins->count())) {
+       slot.setCustomIndex(this, i, indexGetter);
+       return true;
+     }
+ 
+     // plugin[name]
+-    for (PluginInfo *pl = plugins->first(); pl; pl = plugins->next()) {
+-      if (pl->name == propertyName.qstring()) {
++    QList<const PluginInfo*>::const_iterator it, end = plugins->constEnd();
++    for (it = plugins->constBegin(); it != end; ++it) {
++      if ((*it)->name == propertyName.qstring()) {
+         slot.setCustom(this, nameGetter);
+         return true;
+       }
+@@ -437,9 +437,10 @@
+ 
+ ValueImp *Plugins::pluginByName( ExecState* exec, const QString& name )
+ {
+-  for ( PluginInfo *pl = plugins->first(); pl!=0; pl = plugins->next() ) {
+-    if ( pl->name == name )
+-      return new Plugin( exec, pl );
++  QList<const PluginInfo*>::const_iterator it, end = plugins->end();
++  for (it = plugins->begin(); it != end; ++it) {
++    if ((*it)->name == name)
++      return new Plugin(exec, *it);
+   }
+   return Undefined();
+ }
+@@ -458,7 +459,7 @@
+   {
+     bool ok;
+     unsigned int i = args[0]->toString(exec).toArrayIndex(&ok);
+-    if( ok && i<base->plugins->count() )
++    if (ok && i < static_cast<unsigned>(base->plugins->count()))
+       return new Plugin( exec, base->plugins->at(i) );
+     return Undefined();
+   }
+@@ -485,12 +486,12 @@
+ */
+ KJS_IMPLEMENT_PROTOFUNC(MimeTypesFunc)
+ 
+-ValueImp *MimeTypes::indexGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *MimeTypes::indexGetter(ExecState* exec, JSObject*, const Identifier& /*propertyName*/, const PropertySlot& slot)
+ {
+   return new MimeType(exec, mimes->at(slot.index()));
+ }
+ 
+-ValueImp *MimeTypes::nameGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *MimeTypes::nameGetter(ExecState* exec, JSObject*, const Identifier& propertyName, const PropertySlot& /*slot*/)
+ {
+   return mimeTypeByName(exec, propertyName.qstring());
+ }
+@@ -507,14 +508,15 @@
+     // mimeTypes[#]
+     bool ok;
+     unsigned int i = propertyName.toUInt32(&ok);
+-    if (ok && i < mimes->count()) {
++    if (ok && i < static_cast<unsigned>(mimes->count())) {
+       slot.setCustomIndex(this, i, indexGetter);
+       return true;
+     }
+ 
+     // mimeTypes[name]
+-    for (MimeClassInfo *m = mimes->first(); m; m = mimes->next()) {
+-      if (m->type == propertyName.qstring()) {
++    QList<const MimeClassInfo*>::const_iterator it, end = mimes->end();
++    for (it = mimes->begin(); it != end; ++it) {
++      if ((*it)->type == propertyName.qstring()) {
+         slot.setCustom(this, nameGetter);
+         return true;
+       }
+@@ -527,9 +529,10 @@
+ ValueImp *MimeTypes::mimeTypeByName( ExecState* exec, const QString& name )
+ {
+   //kDebug(6070) << "MimeTypes[" << name << "]";
+-  for ( MimeClassInfo *m = mimes->first(); m!=0; m = mimes->next() ) {
+-    if ( m->type == name )
+-      return new MimeType( exec, m );
++  QList<const MimeClassInfo*>::const_iterator it, end = mimes->end();
++  for (it = mimes->begin(); it != end; ++it) {
++    if ((*it)->type == name)
++      return new MimeType(exec, (*it));
+   }
+   return Undefined();
+ }
+@@ -555,7 +558,7 @@
+   {
+     bool ok;
+     unsigned int i = args[0]->toString(exec).toArrayIndex(&ok);
+-    if( ok && i<base->mimes->count() )
++    if (ok && i < static_cast<unsigned>(base->mimes->count()))
+       return new MimeType( exec, base->mimes->at(i) );
+     return Undefined();
+   }
+@@ -584,7 +587,7 @@
+ */
+ KJS_IMPLEMENT_PROTOFUNC(PluginFunc)
+ 
+-ValueImp *Plugin::indexGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *Plugin::indexGetter(ExecState *exec, JSObject*, const Identifier& /*propertyName*/, const PropertySlot& slot)
+ {
+     Plugin *thisObj = static_cast<Plugin *>(slot.slotBase());
+     return new MimeType(exec, thisObj->m_info->mimes.at(slot.index()));
+@@ -601,20 +604,21 @@
+ #ifdef KJS_VERBOSE
+   kDebug(6070) << "Plugin::getOwnPropertySlot " << propertyName.qstring();
+ #endif
+-  if (getStaticOwnPropertySlot<PluginFunc, Plugin>(&PluginsTable, this, propertyName, slot))
++  if (getStaticOwnPropertySlot<PluginFunc, Plugin>(&PluginTable, this, propertyName, slot))
+       return true;
+ 
+   // plugin[#]
+   bool ok;
+   unsigned int i = propertyName.toUInt32(&ok);
+-  if (ok && i < m_info->mimes.count()) {
++  if (ok && i < static_cast<unsigned>(m_info->mimes.count())) {
+     slot.setCustomIndex(this, i, indexGetter);
+     return true;
+   }
+ 
+   // plugin["name"]
+-  for (MimeClassInfo *m=m_info->mimes.first(); m; m = m_info->mimes.next()) {
+-    if (m->type == propertyName.qstring()) {
++  QList<const MimeClassInfo*>::const_iterator it, end = mimes->end();
++  for (it = mimes->begin(); it != end; ++it) {
++    if ((*it)->type == propertyName.qstring()) {
+       slot.setCustom(this, nameGetter);
+       return true;
+     }
+@@ -625,10 +629,11 @@
+ 
+ ValueImp *Plugin::mimeByName(ExecState* exec, const QString& name) const
+ {
+-  for ( PluginBase::MimeClassInfo *m = m_info->mimes.first();
+-        m != 0; m = m_info->mimes.next() ) {
+-    if ( m->type == name )
+-      return new MimeType(exec, m);
++  const QList<const MimeClassInfo*>& mimes = m_info->mimes;
++  QList<const MimeClassInfo*>::const_iterator it, end = mimes.end();
++  for (it = mimes.begin(); it != end; ++it) {
++    if ((*it)->type == name)
++      return new MimeType(exec, (*it));
+   }
+   return Undefined();
+ }
+@@ -659,7 +664,7 @@
+   {
+     bool ok;
+     unsigned int i = args[0]->toString(exec).toArrayIndex(&ok);
+-    if( ok && i< plugin->pluginInfo()->mimes.count() )
++    if (ok && i< static_cast<unsigned>(plugin->pluginInfo()->mimes.count()))
+       return new MimeType( exec, plugin->pluginInfo()->mimes.at(i) );
+     return Undefined();
+   }
+@@ -676,7 +681,7 @@
+ 
+ /*****************************************************************************/
+ 
+-const ClassInfo MimeType::info = { "MimeType", 0, &MimeTypesTable, 0 };
++const ClassInfo MimeType::info = { "MimeType", 0, &MimeTypeTable, 0 };
+ /*
+ @begin MimeTypeTable 4
+   description  	MimeType_Description    	DontDelete|ReadOnly
+@@ -691,7 +696,7 @@
+ #ifdef KJS_VERBOSE
+   kDebug(6070) << "MimeType::get " << propertyName.qstring();
+ #endif
+-  return getStaticValueSlot<MimeType, ObjectImp>(exec, &MimeTypesTable, this, propertyName, slot);
++  return getStaticValueSlot<MimeType, ObjectImp>(exec, &MimeTypeTable, this, propertyName, slot);
+ }
+ 
+ ValueImp *MimeType::getValueProperty(ExecState* exec, int token) const
+--- a/khtml/ecma/kjs_html.h
++++ b/khtml/ecma/kjs_html.h
+@@ -156,7 +156,7 @@
+            IFrameMarginHeight, IFrameMarginWidth, IFrameScrolling, IFrameWidth,
+            IFrameContentDocument, IFrameContentWindow,
+            MarqueeStart, MarqueeStop,
+-           GetContext,
++           GetContext, CanvasWidth, CanvasHeight,
+            LayerTop, LayerLeft, LayerVisibility, LayerBgColor, LayerClip, LayerDocument, LayerLayers,
+            ElementInnerHTML, ElementTitle, ElementId, ElementDir, ElementLang,
+            ElementClassName, ElementInnerText, ElementDocument,
+@@ -331,6 +331,7 @@
+   DEFINE_PSEUDO_CONSTRUCTOR(HTMLFrameElementPseudoCtor)
+   DEFINE_PSEUDO_CONSTRUCTOR(HTMLIFrameElementPseudoCtor)
+   DEFINE_PSEUDO_CONSTRUCTOR(HTMLMarqueeElementPseudoCtor)
++  DEFINE_PSEUDO_CONSTRUCTOR(HTMLCanvasElementPseudoCtor)
+ } // namespace
+ 
+ #endif
+--- a/khtml/ecma/kjs_dom.cpp
++++ b/khtml/ecma/kjs_dom.cpp
+@@ -538,16 +538,7 @@
+ {
+   if (m_impl.isNull())
+     return "null";
+-  UString s;
+-
+-
+-  if ( m_impl->isElementNode() ) {
+-    DOM::ElementImpl* e = static_cast<DOM::ElementImpl*>(impl());
+-    s = DOMString(e->nodeName().string());
+-  } else
+-    s = className(); // fallback
+-
+-  return "[object " + s + "]";	//krazy:exclude=doublequote_chars DOM demands chars
++  return "[object " + className() + "]";	//krazy:exclude=doublequote_chars DOM demands chars
+ }
+ 
+ void DOMNode::setListener(ExecState *exec, int eventId, ValueImp* func) const
+@@ -1211,7 +1202,7 @@
+   return false;
+ }
+ 
+-ValueImp *DOMElement::attributeGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *DOMElement::attributeGetter(ExecState*, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
+ {
+   DOMElement *thisObj = static_cast<DOMElement *>(slot.slotBase());
+ 
+--- a/khtml/ecma/kjs_context2d.h
++++ b/khtml/ecma/kjs_context2d.h
+@@ -27,6 +27,7 @@
+ #include <kjs/object.h>
+ 
+ #include "misc/loader_client.h"
++#include "html/html_canvasimpl.h"
+ 
+ #include <QtGui/QPainterPath>
+ 
+@@ -34,159 +35,97 @@
+    class HTMLElementImpl;
+ }
+ 
+-class QGradient;
+-
+ namespace KJS {
+-  ////////////////////// Context2D Object ////////////////////////
+-
+-  class Context2D : public DOMObject {
+-  friend class Context2DFunction;
++  ////////////////////// Conversion helpers //////////////////////
++  template<typename Wrapper>
++  ValueImp* getWrapper(ExecState *exec, typename Wrapper::wrappedType* g)
++  {
++      DOMObject *ret = 0;
++      if (!g)
++          return Null();
++
++      ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->dynamicInterpreter());
++      if ((ret = interp->getDOMObject(g)))
++          return ret;
++
++      ret = new Wrapper(exec, g);
++      interp->putDOMObject(g, ret);
++      return ret;
++  }
++
++  template<typename Wrapped>
++  class DOMWrapperObject : public DOMObject
++  {
+   public:
+-    Context2D(DOM::HTMLElementImpl *e);
+-    ~Context2D();
+-    virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
+-    ValueImp *getValueProperty(ExecState *exec, int token) const;
+-    virtual void put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr = None);
+-    void putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/);
+-    virtual bool toBoolean(ExecState *) const { return true; }
+-    virtual void mark();
+-    virtual const ClassInfo* classInfo() const { return &info; }
+-    static const ClassInfo info;
++    typedef Wrapped wrappedType;
++    typedef DOMWrapperObject<Wrapped> WrapperBase;
+ 
+-    QPainterPath &path() {
+-        return m_path;
+-    }
+-    void setPath( const QPainterPath &p ) {
+-        m_path = p;
++    DOMWrapperObject(JSObject* proto, Wrapped* wrapee):
++      DOMObject(proto), m_impl(wrapee)
++    {}
++
++    virtual ~DOMWrapperObject() {
++      ScriptInterpreter::forgetDOMObject(m_impl.get());
+     }
+ 
+-    enum {
+-        StrokeStyle,
+-        FillStyle,
+-        LineWidth,
+-        LineCap,
+-        LineJoin,
+-        MiterLimit,
+-        GlobalAlpha,
+-        GlobalCompositeOperation,
+-        Save, Restore,
+-        Scale, Rotate, Translate,
+-        BeginPath, ClosePath,
+-        SetStrokeColor, SetFillColor, SetLineWidth, SetLineCap, SetLineJoin, SetMiterLimit,
+-        Fill, Stroke,
+-        MoveTo, LineTo, QuadraticCurveTo, BezierCurveTo, ArcTo, Arc, Rect, Clip,
+-        ClearRect, FillRect, StrokeRect,
+-        DrawImage, DrawImageFromRect,
+-        SetAlpha, SetCompositeOperation,
+-        CreateLinearGradient,
+-        CreateRadialGradient,
+-        CreatePattern
+-    };
++    virtual bool toBoolean(ExecState *) const { return true; }
+ 
+-private:
+-    QBrush constructBrush(ExecState* exec);
+-    QPen constructPen(ExecState* exec);
+-
+-    void save();
+-    void restore();
+-
+-    QPainter *drawingContext();
+-    bool _validStrokeImagePattern;
+-    void updateStrokeImagePattern();
+-
+-    SharedPtr<DOM::HTMLElementImpl> _element;
+-    bool _needsFlushRasterCache;
+-
+-    QPainterPath m_path;
+-
+-    QList<List*> stateStack;
+-
+-    ValueImp *_strokeStyle;
+-    ValueImp *_fillStyle;
+-    ValueImp *_lineWidth;
+-    ValueImp *_lineCap;
+-    ValueImp *_lineJoin;
+-    ValueImp *_miterLimit;
+-    ValueImp *_globalAlpha;
+-    ValueImp *_globalComposite;
++    Wrapped* impl() { return m_impl.get(); }
++    const Wrapped* impl() const { return m_impl.get(); }
++  private:
++    SharedPtr<Wrapped> m_impl;
+   };
+ 
+-    QColor colorFromValue(ExecState *exec, ValueImp *value);
+-
+-    struct ColorStop {
+-        float stop;
+-        float red;
+-        float green;
+-        float blue;
+-        float alpha;
+-
+-        ColorStop(float s, float r, float g, float b, float a) : stop(s), red(r), green(g), blue(b), alpha(a) {}
+-    };
++  ////////////////////// Context2D Object ////////////////////////
++  DEFINE_PSEUDO_CONSTRUCTOR(Context2DPseudoCtor)
+ 
+-  class Gradient : public DOMObject {
++  class Context2D : public DOMWrapperObject<DOM::CanvasContext2DImpl> {
+   friend class Context2DFunction;
+   public:
+-    Gradient(float x0, float y0, float x1, float y1);
+-    Gradient(float x0, float y0, float r0, float x1, float y1, float r1);
+-    ~Gradient();
++    Context2D(ExecState* exec, DOM::CanvasContext2DImpl *ctx);
++    
+     virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
+     ValueImp *getValueProperty(ExecState *exec, int token) const;
+     virtual void put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr = None);
+     void putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/);
+-    virtual bool toBoolean(ExecState *) const { return true; }
++
+     virtual const ClassInfo* classInfo() const { return &info; }
+     static const ClassInfo info;
+ 
+-    QGradient *qgradient() const { return m_gradient; }
+-
+-
+-    enum {
+-        AddColorStop
+-    };
+-
+     enum {
+-        Radial, Linear
++        Canvas,
++        Save, Restore, // state
++        Scale, Rotate, Translate, Transform, SetTransform, // transformations
++        GlobalAlpha, GlobalCompositeOperation,             // compositing
++        StrokeStyle, FillStyle, CreateLinearGradient, CreateRadialGradient, CreatePattern, // colors and styles.
++        LineWidth, LineCap, LineJoin, MiterLimit, // line properties
++        // TODO: shadows
++        ClearRect, FillRect, StrokeRect,          // rectangle ops
++        BeginPath, ClosePath, MoveTo, LineTo, QuadraticCurveTo, BezierCurveTo, ArcTo, Rect, Arc,
++        Fill, Stroke, Clip, IsPointInPath,        // paths
++        DrawImage,  // do we want backwards compat for drawImageFromRect?
++        GetImageData, PutImageData // pixel ops. ewww.
+     };
+-
+-    void addColorStop (float s, float r, float g, float b, float alpha);
+-
+-    int lastStop;
+-    int nextStop;
+-
+-private:
+-    void commonInit();
+-    QGradient *m_gradient;
+-    float _x0, _y0, _r0, _x1, _y1, _r1;
+-
+-    int maxStops;
+-    int stopCount;
+-    ColorStop *stops;
+-    mutable int adjustedStopCount;
+-    mutable ColorStop *adjustedStops;
+-    mutable unsigned stopsNeedAdjusting:1;
+   };
+ 
+-  class ImagePattern : public DOMObject {
++  class CanvasGradient : public DOMWrapperObject<DOM::CanvasGradientImpl> {
+   public:
+-    ImagePattern(HTMLElement *i, int type);
+-    virtual bool getOwnPropertySlot(ExecState *, const Identifier&, PropertySlot&);
+-    ValueImp *getValueProperty(ExecState *exec, int token) const;
+-    virtual void put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr = None);
+-    void putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/);
+-    virtual bool toBoolean(ExecState *) const { return true; }
++    CanvasGradient(ExecState* exec, DOM::CanvasGradientImpl* impl);
++
+     virtual const ClassInfo* classInfo() const { return &info; }
+     static const ClassInfo info;
+ 
+-    QPixmap pixmap() { return _pixmap; }
+-    QBrush createPattern();
+-
+     enum {
+-        Repeat, RepeatX, RepeatY, NoRepeat
++        AddColorStop
+     };
++  };
+ 
+-private:
+-    float _rw, _rh;
+-    QPixmap _pixmap;
++  class CanvasPattern : public DOMWrapperObject<DOM::CanvasPatternImpl> {
++  public:
++    CanvasPattern(ExecState* exec, DOM::CanvasPatternImpl *i);
++    
++    virtual const ClassInfo* classInfo() const { return &info; }
++    static const ClassInfo info;
+   };
+ } // namespace
+ 
+--- a/khtml/ecma/kjs_html.cpp
++++ b/khtml/ecma/kjs_html.cpp
+@@ -318,7 +318,7 @@
+   return Undefined();
+ }
+ 
+-ValueImp *HTMLDocument::frameNameGetter(ExecState *exec, JSObject*, const Identifier& name, const PropertySlot& slot)
++ValueImp *HTMLDocument::frameNameGetter(ExecState*, JSObject*, const Identifier& name, const PropertySlot& slot)
+ {
+   HTMLDocument *thisObj = static_cast<HTMLDocument*>(slot.slotBase());
+   KHTMLView *view      = thisObj->impl()->view();
+@@ -1196,7 +1196,12 @@
+   stop            KJS::HTMLElement::MarqueeStop                 DontDelete|Function 0
+ @end
+ 
+- at begin HTMLCanvasElementTable 1
++ at begin HTMLCanvasElementTable 2
++  width           KJS::HTMLElement::CanvasWidth                 DontDelete
++  height          KJS::HTMLElement::CanvasHeight                DontDelete
++ at end
++
++ at begin HTMLCanvasElementProtoTable 1
+   getContext      KJS::HTMLElement::GetContext                  DontDelete|Function 1
+ @end
+ */
+@@ -1828,6 +1833,14 @@
+     }
+   }
+   break;
++  case ID_CANVAS: {
++    DOM::HTMLCanvasElementImpl& canvas = static_cast<DOM::HTMLCanvasElementImpl&>(element);
++    switch (token) {
++    case CanvasHeight:          return Number(canvas.height());
++    case CanvasWidth:           return Number(canvas.width());
++    }
++  }
++  break;
+   case ID_OBJECT: {
+     DOM::HTMLObjectElementImpl& object = static_cast<DOM::HTMLObjectElementImpl&>(element);
+     switch (token) {
+@@ -2294,10 +2307,10 @@
+     }
+   case ID_CANVAS: {
+       if (id == KJS::HTMLElement::GetContext) {
+-        if (args.size() == 0 || (args.size() == 1 && args[0]->toString(exec).domString().lower() == "2d")) {
+-          return new Context2D(&element);
+-        }
+-        return Undefined();
++        DOM::HTMLCanvasElementImpl& canvasEl = static_cast<DOM::HTMLCanvasElementImpl&>(element);
++        if (args[0]->toString(exec) == "2d")
++          return getWrapper<Context2D>(exec, canvasEl.getContext2D());
++        return jsNull();
+       }
+       break;
+     }
+@@ -2541,6 +2554,21 @@
+         }
+     }
+     break;
++    case ID_CANVAS: {
++        DOM::HTMLCanvasElementImpl& canvas = static_cast<DOM::HTMLCanvasElementImpl&>(element);
++        switch (token) {
++        // ### it may make sense to do something different here, to at least
++        // emulate reflecting properties somewhat.
++        case CanvasWidth:
++            canvas.setAttribute(ATTR_WIDTH, value->toString(exec).domString());
++            return;
++        case CanvasHeight:
++            canvas.setAttribute(ATTR_HEIGHT, value->toString(exec).domString());
++            return;
++        }
++    }
++    break;
++
+ 
+ //    case ID_FIELDSET: {
+ //      DOM::HTMLFieldSetElementImpl& fieldSet = static_cast<DOM::HTMLFieldSetElementImpl&>(element);
+@@ -2770,6 +2798,11 @@
+ KJS_IMPLEMENT_PROTOTYPE("HTMLMarqueeElement", HTMLMarqueeElementProto, HTMLElementFunction)
+ IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLMarqueeElementPseudoCtor, "HTMLMarqueeElement", HTMLMarqueeElementProto)
+ 
++KJS_DEFINE_PROTOTYPE_WITH_PROTOTYPE(HTMLCanvasElementProto, HTMLElementProto)
++KJS_IMPLEMENT_PROTOTYPE("HTMLCanvasElement", HTMLCanvasElementProto, HTMLElementFunction)
++IMPLEMENT_PSEUDO_CONSTRUCTOR(HTMLCanvasElementPseudoCtor, "HTMLCanvasElement", HTMLCanvasElementProto)
++
++
+ static ObjectImp* prototypeForID(ExecState* exec, DOM::NodeImpl::Id id) {
+   switch (id) {
+   case ID_HTML:
+@@ -2892,6 +2925,8 @@
+     return HTMLIFrameElementProto::self(exec);
+   case ID_MARQUEE:
+     return HTMLMarqueeElementProto::self(exec);
++  case ID_CANVAS:
++    return HTMLCanvasElementProto::self(exec);
+   default:
+     return HTMLElementProto::self(exec);
+   }
+@@ -2961,6 +2996,8 @@
+ #ifdef KJS_VERBOSE
+   kDebug(6070) << "KJS::HTMLCollection::getOwnPropertySlot " << propertyName.ascii();
+ #endif
++  if (propertyName.isEmpty())
++    return false;
+   if (propertyName == exec->propertyNames().length)
+   {
+ #ifdef KJS_VERBOSE
+@@ -3008,7 +3045,7 @@
+     // support for document.all(<index>) etc.
+     bool ok;
+     UString s = args[0]->toString(exec);
+-    unsigned int u = s.toUInt32(&ok);
++    unsigned int u = s.toUInt32(&ok, false);
+     if (ok)
+       return getDOMNode(exec, collection.item(u));
+     // support for document.images('<name>') etc.
+@@ -3018,7 +3055,7 @@
+   {
+     bool ok;
+     UString s = args[0]->toString(exec);
+-    unsigned int u = args[1]->toString(exec).toUInt32(&ok);
++    unsigned int u = args[1]->toString(exec).toUInt32(&ok, false);
+     if (ok)
+     {
+       DOM::DOMString pstr = s.domString();
+@@ -3079,14 +3116,14 @@
+     // support for item(<index>) (DOM)
+     UString s = args[0]->toString(exec);
+     bool ok;
+-    unsigned int u = s.toUInt32(&ok);
++    unsigned int u = s.toUInt32(&ok, false);
+     if (ok) {
+       return getDOMNode(exec,coll.item(u));
+     }
+ 
+     // support for item('<name>') (IE only)
+     kWarning() << "non-standard HTMLCollection.item('" << s.ascii() << "') called, use namedItem instead";
+-    return getDOMNode(exec,coll.namedItem(s.domString()));
++    return static_cast<HTMLCollection *>(thisObj)->getNamedItems(exec, Identifier(s));
+   }
+   case KJS::HTMLCollection::Tags:
+   {
+@@ -3141,13 +3178,13 @@
+                                                 DOM::HTMLSelectElementImpl* e)
+       : HTMLCollection(HTMLSelectCollectionProto::self(exec), c), element(e) { }
+ 
+-ValueImp *HTMLSelectCollection::selectedIndexGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *HTMLSelectCollection::selectedIndexGetter(ExecState*, JSObject*, const Identifier&, const PropertySlot& slot)
+ {
+     HTMLSelectCollection *thisObj = static_cast<HTMLSelectCollection *>(slot.slotBase());
+     return Number(thisObj->element->selectedIndex());
+ }
+ 
+-ValueImp *HTMLSelectCollection::selectedValueGetter(ExecState *exec, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
++ValueImp *HTMLSelectCollection::selectedValueGetter(ExecState*, JSObject*, const Identifier& propertyName, const PropertySlot& slot)
+ {
+     HTMLSelectCollection *thisObj = static_cast<HTMLSelectCollection *>(slot.slotBase());
+     return String(thisObj->element->value());
+--- a/khtml/ecma/kjs_window.cpp
++++ b/khtml/ecma/kjs_window.cpp
+@@ -36,7 +36,6 @@
+ #include <config.h>
+ 
+ #include <QtCore/QTimer>
+-#include <Qt3Support/Q3PaintDeviceMetrics>
+ #include <QtGui/QApplication>
+ #include <kdebug.h>
+ #include <kmessagebox.h>
+--- a/khtml/ecma/kjs_context2d.cpp
++++ b/khtml/ecma/kjs_context2d.cpp
+@@ -3,6 +3,7 @@
+  *  This file is part of the KDE libraries
+  *  Copyright (C) 2004 Apple Computer, Inc.
+  *  Copyright (C) 2005 Zack Rusin <zack at kde.org>
++ *  Copyright (C) 2007 Maksim Orlovich <maksim at kde.org>
+  *
+  *  This library is free software; you can redistribute it and/or
+  *  modify it under the terms of the GNU Lesser General Public
+@@ -48,6 +49,7 @@
+ #include "kjs_window.h"
+ #include "kjs_events.h"
+ #include "kjs_proxy.h"
++#include <kjs/operations.h>
+ 
+ #include <rendering/render_canvasimage.h>
+ #include <rendering/render_object.h>
+@@ -59,20 +61,8 @@
+ #include <css/css_stylesheetimpl.h>
+ #include <css/css_ruleimpl.h>
+ 
+-#include <QtAlgorithms>
+-#include <QtGui/QPainter>
+-#include <QtGui/QPainterPath>
+-#include <QtGui/QImage>
+-#include <QtGui/QPixmap>
+-#include <QtGui/QBrush>
+-#include <QtGui/QColor>
+-#include <QtCore/QDebug>
+-#include <QtCore/QLocale>
+-
+-#include <math.h>
+ 
+ using namespace DOM;
+-using khtml::RenderCanvasImage;
+ 
+ #include "kjs_context2d.lut.h"
+ 
+@@ -80,1304 +70,572 @@
+ 
+ ////////////////////// Context2D Object ////////////////////////
+ 
++KJS_DEFINE_PROTOTYPE(Context2DProto)
+ KJS_IMPLEMENT_PROTOFUNC(Context2DFunction)
++KJS_IMPLEMENT_PROTOTYPE("CanvasRenderingContext2DProto", Context2DProto, Context2DFunction)
+ 
+-static bool isGradient(ValueImp *value)
+-{
+-    return value->isObject(&Gradient::info);
+-}
++/*
++   @begin Context2DProtoTable 48
++   #
++   # state ops
++   save                     Context2D::Save                        DontDelete|Function 0
++   restore                  Context2D::Restore                     DontDelete|Function 0
++   #
++   # transformations
++   scale                    Context2D::Scale                       DontDelete|Function 2
++   rotate                   Context2D::Rotate                      DontDelete|Function 2
++   translate                Context2D::Translate                   DontDelete|Function 1
++   transform                Context2D::Transform                   DontDelete|Function 6
++   setTransform             Context2D::SetTransform                DontDelete|Function 6
++   #
++   # colors and styles
++   createLinearGradient     Context2D::CreateLinearGradient        DontDelete|Function 4
++   createRadialGradient     Context2D::CreateRadialGradient        DontDelete|Function 6
++   createPattern            Context2D::CreatePattern               DontDelete|Function 2
++   #
++   # rectangle ops
++   clearRect                Context2D::ClearRect                   DontDelete|Function 4
++   fillRect                 Context2D::FillRect                    DontDelete|Function 4
++   strokeRect               Context2D::StrokeRect                  DontDelete|Function 4
++   #
++   # paths
++   beginPath                Context2D::BeginPath                   DontDelete|Function 0
++   closePath                Context2D::ClosePath                   DontDelete|Function 0
++   moveTo                   Context2D::MoveTo                      DontDelete|Function 2
++   lineTo                   Context2D::LineTo                      DontDelete|Function 2
++   quadraticCurveTo         Context2D::QuadraticCurveTo            DontDelete|Function 4
++   bezierCurveTo            Context2D::BezierCurveTo               DontDelete|Function 6
++   arcTo                    Context2D::ArcTo                       DontDelete|Function 5
++   rect                     Context2D::Rect                        DontDelete|Function 4
++   arc                      Context2D::Arc                         DontDelete|Function 6
++   fill                     Context2D::Fill                        DontDelete|Function 0
++   isPointInPath            Context2D::IsPointInPath               DontDelete|Function 2
++   stroke                   Context2D::Stroke                      DontDelete|Function 0
++   clip                     Context2D::Clip                        DontDelete|Function 0
++   #
++   # images. Lots of overloading here!
++   drawImage                Context2D::DrawImage                   DontDelete|Function 3
++   #
++   # pixel ops.
++   getImageData             Context2D::GetImageData                DontDelete|Function 4
++   putImageData             Context2D::PutImageData                DontDelete|Function 3
++   @end
++*/
++
++IMPLEMENT_PSEUDO_CONSTRUCTOR(Context2DPseudoCtor, "CanvasRenderingContext2D", Context2DProto)
+ 
+-static bool isImagePattern(ValueImp *value)
++Context2D::Context2D(ExecState* exec, DOM::CanvasContext2DImpl *ctx):
++    WrapperBase(Context2DProto::self(exec), ctx)
++{}
++
++// Checks count and sets an exception if needed
++static bool enoughArguments(ExecState* exec, const List& args, int limit)
+ {
+-    return value->isObject(&ImagePattern::info);
++    if (args.size() < limit) {
++        setDOMException(exec, DOMException::NOT_SUPPORTED_ERR);
++        return false;
++    }
++    return true;
+ }
+ 
+-static QPainter::CompositionMode compositeOperatorFromString(const QString &compositeOperator)
++// Verifies that float arguments are not NaN or a plus/minus infinity (unless infOK)
++static bool argFloatsOK(ExecState* exec, const List& args, int minArg, int maxArg, bool infOK)
+ {
+-    if ( compositeOperator == "source-over" ) {
+-        return QPainter::CompositionMode_SourceOver;
+-    } else if ( compositeOperator == "source-out" ) {
+-        return QPainter::CompositionMode_SourceOut;
+-    } else if ( compositeOperator == "source-in" ) {
+-        return QPainter::CompositionMode_SourceIn;
+-    } else if ( compositeOperator == "source-atop" ) {
+-        return QPainter::CompositionMode_SourceAtop;
+-    } else if ( compositeOperator == "destination-atop" ) {
+-        return QPainter::CompositionMode_DestinationAtop;
+-    } else if ( compositeOperator == "destination-in" ) {
+-        return QPainter::CompositionMode_DestinationIn;
+-    } else if ( compositeOperator == "destination-out" ) {
+-        return QPainter::CompositionMode_DestinationOut;
+-    } else if ( compositeOperator == "destination-over" ) {
+-        return QPainter::CompositionMode_DestinationOver;
+-    } else if ( compositeOperator == "darker" ) {
+-        return QPainter::CompositionMode_SourceOver;
+-    } else if ( compositeOperator == "lighter" ) {
+-        return QPainter::CompositionMode_SourceOver;
+-    } else if ( compositeOperator == "copy" ) {
+-        return QPainter::CompositionMode_Source;
+-    } else if ( compositeOperator == "xor" ) {
+-        return QPainter::CompositionMode_Xor;
++    for (int c = minArg; c <= maxArg; ++c) {
++        float val = args[c]->toFloat(exec);
++        if (KJS::isNaN(val) || (!infOK && KJS::isInf(val))) {
++            setDOMException(exec, DOMException::NOT_SUPPORTED_ERR);
++            return false;
++        }
+     }
+-
+-    return QPainter::CompositionMode_SourceOver;
++    return true;
+ }
+ 
+-#define DEGREES(t) ((t) * 180.0 / M_PI)
++// HTML5-style checking
++#define KJS_REQUIRE_ARGS(n) do { if (!enoughArguments(exec, args,n)) return jsUndefined(); } while(0);
++#define KJS_CHECK_FLOAT_ARGS(min,max) do { if (!argFloatsOK(exec, args, min, max, false )) return jsUndefined(); } while(0);
++#define KJS_CHECK_FLOAT_OR_INF_ARGS(min,max) do { if (!argFloatsOK(exec, args, min, max, true)) return jsUndefined(); } while(0);
+ 
+ ValueImp *KJS::Context2DFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
+ {
+-    if (!thisObj->inherits(&Context2D::info))
+-        return throwError(exec, TypeError);
+-
+-    Context2D *contextObject = static_cast<KJS::Context2D *>(thisObj);
+-    khtml::RenderCanvasImage *renderer = static_cast<khtml::RenderCanvasImage*>(contextObject->_element->renderer());
+-    if (!renderer)
+-        return Undefined();
+-
+-    QPainter *drawingContext = renderer->drawingContext();
+-    if (!drawingContext)
+-        return Undefined();
++    KJS_CHECK_THIS(Context2D, thisObj);
++    
++#ifdef KJS_VERBOSE
++    kDebug(6070) << "KJS::Context2DFunction::callAsFunction " << functionName().qstring();
++#endif
+ 
++    Context2D *jsContextObject = static_cast<KJS::Context2D *>(thisObj);
++    CanvasContext2DImpl* ctx   = jsContextObject->impl();
++    DOMExceptionTranslator exception(exec);
++    
+     switch (id) {
++    // State ops
++    /////////////
+     case Context2D::Save: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
+-        drawingContext->save();
+-        contextObject->save();
++        ctx->save();
+         break;
+     }
++    
+     case Context2D::Restore: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
+-        drawingContext->restore();
+-        contextObject->restore();
++        ctx->restore();
++        break;
++    }
++
++    // Transform ops. These have NaN inf handled specially in the impl
++    case Context2D::Scale: {
++        KJS_REQUIRE_ARGS(2);
++        KJS_CHECK_FLOAT_OR_INF_ARGS(0, 1);
+ 
++        ctx->scale(args[0]->toFloat(exec), args[1]->toFloat(exec));
+         break;
+     }
+-    case Context2D::BeginPath: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
+-        contextObject->setPath( QPainterPath() );
+-        contextObject->path().setFillRule( Qt::WindingFill );
++
++    case Context2D::Rotate: {
++        KJS_REQUIRE_ARGS(1);
++        // Rotate actually rejects NaN/infinity as well
++        KJS_CHECK_FLOAT_ARGS(0, 0);
++        
++
++        ctx->rotate(args[0]->toFloat(exec));
+         break;
+     }
+-    case Context2D::ClosePath: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
+-        contextObject->path().closeSubpath();
+-        break;
+-    }
+-    case Context2D::SetStrokeColor: {
+-        // string arg = named color
+-        // string arg, number arg = named color, alpha
+-        // number arg = gray color
+-        // number arg, number arg = gray color, alpha
+-        // 4 args (string or number) = r, g, b, a
+-        // 5 args (string or number) = c, m, y, k, a
+-        QPen pen = drawingContext->pen();
+-        int numArgs = args.size();
+-        switch (numArgs) {
+-        case 1: {
+-            if (args[0]->isString()) {
+-                QColor qc = colorFromValue( exec, args[0] );
+-                pen.setColor( qc );
+-
+-            }
+-            else {
+-                float g = (float)args[0]->toNumber(exec);
+-                QColor qc;
+-                qc.setRgbF( g, g, g );
+-                pen.setColor( qc );
+-            }
+-        }
+-            break;
+-        case 2: {
+-            float a = args[1]->toNumber(exec);
+-            if (args[0]->isString()) {
+-                QColor qc = colorFromValue( exec, args[0] );
+-                qc.setAlphaF( a );
+-                pen.setColor( qc );
+-            }
+-            else {
+-                float g = (float)args[0]->toNumber(exec);
+-                QColor qc;
+-                qc.setRgbF( g, g, g, a );
+-                pen.setColor( qc );
+-            }
+-        }
+-            break;
+-        case 4: {
+-            float r = (float)args[0]->toNumber(exec);
+-            float g = (float)args[1]->toNumber(exec);
+-            float b = (float)args[2]->toNumber(exec);
+-            float a = (float)args[3]->toNumber(exec);
+-            QColor qc;
+-            qc.setRgbF( r, g, b, a );
+-            pen.setColor( qc );
+-        }
+-            break;
+-        case 5: {
+-            float c = (float)args[0]->toNumber(exec);
+-            float m = (float)args[1]->toNumber(exec);
+-            float y = (float)args[2]->toNumber(exec);
+-            float k = (float)args[3]->toNumber(exec);
+-            float a = (float)args[4]->toNumber(exec);
+-            QColor qc;
+-            qc.setCmykF( c, m, y, k, a );
+-            pen.setColor( qc );
+-        }
+-            break;
+-        default:
+-            return throwError(exec, SyntaxError);
+-        }
+-        drawingContext->setPen( pen );
++
++    case Context2D::Translate: {
++        KJS_REQUIRE_ARGS(2);
++        KJS_CHECK_FLOAT_OR_INF_ARGS(0, 1);
++
++        ctx->translate(args[0]->toFloat(exec), args[1]->toFloat(exec));
+         break;
+     }
+-    case Context2D::SetFillColor: {
+-        // string arg = named color
+-        // string arg, number arg = named color, alpha
+-        // number arg = gray color
+-        // number arg, number arg = gray color, alpha
+-        // 4 args (string or number) = r, g, b, a
+-        // 5 args (string or number) = c, m, y, k, a
+-        int numArgs = args.size();
+-        QBrush brush = drawingContext->brush();
+-        switch (numArgs) {
+-        case 1: {
+-            if (args[0]->isString()) {
+-                QColor qc = colorFromValue( exec, args[0] );
+-                brush.setColor( qc );
+-                drawingContext->setBrush( brush );
+-            }
+-            else {
+-                float g = (float)args[0]->toNumber(exec);
+-                QColor qc;
+-                qc.setRgbF( g, g, g );
+-                brush.setColor( qc );
+-                drawingContext->setBrush( brush );
+-            }
+-        }
+-            break;
+-        case 2: {
+-            float a = args[1]->toNumber(exec);
+-            if (args[0]->isString()) {
+-                QColor qc = colorFromValue( exec, args[0] );
+-                brush.setColor( qc );
+-                drawingContext->setBrush( brush );
+-            }
+-            else {
+-                float g = (float)args[0]->toNumber(exec);
+-                QColor qc;
+-                qc.setRgbF( g, g, g, a );
+-                brush.setColor( qc );
+-                drawingContext->setBrush( brush );
+-            }
+-        }
+-            break;
+-        case 4: {
+-            float r = (float)args[0]->toNumber(exec);
+-            float g = (float)args[1]->toNumber(exec);
+-            float b = (float)args[2]->toNumber(exec);
+-            float a = (float)args[3]->toNumber(exec);
+-            QColor qc;
+-            qc.setRgbF( r, g, b, a );
+-            brush.setColor( qc );
+-            drawingContext->setBrush( brush );
+-        }
+-            break;
+-        case 5: {
+-            float c = (float)args[0]->toNumber(exec);
+-            float m = (float)args[1]->toNumber(exec);
+-            float y = (float)args[2]->toNumber(exec);
+-            float k = (float)args[3]->toNumber(exec);
+-            float a = (float)args[4]->toNumber(exec);
+-            QColor qc;
+-            qc.setCmykF( c, m, y, k, a );
+-            brush.setColor( qc );
+-            drawingContext->setBrush( brush );
+-        }
+-            break;
+-        default:
+-            return throwError(exec, SyntaxError);
+-        }
++
++    case Context2D::Transform: {
++        KJS_REQUIRE_ARGS(6);
++        KJS_CHECK_FLOAT_OR_INF_ARGS(0, 5);
++
++        ctx->transform(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                       args[2]->toFloat(exec), args[3]->toFloat(exec),
++                       args[4]->toFloat(exec), args[5]->toFloat(exec));
++
+         break;
+     }
+-    case Context2D::SetLineWidth: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        float w = (float)args[0]->toNumber(exec);
+-        QPen pen = drawingContext->pen();
+-        pen.setWidthF( w );
+-        drawingContext->setPen( pen );
+-        break;
+-    }
+-    case Context2D::SetLineCap: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        QPen pen = drawingContext->pen();
+-        DOMString capString = args[0]->toString(exec).domString().lower();
+-        if (capString == "round")
+-            pen.setCapStyle( Qt::RoundCap );
+-        else if (capString == "square")
+-            pen.setCapStyle( Qt::SquareCap );
+-        else
+-            pen.setCapStyle( Qt::FlatCap );
+-        drawingContext->setPen( pen );
+-        break;
+-    }
+-    case Context2D::SetLineJoin: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        DOMString joinString = args[0]->toString(exec).domString().lower();
+-        QPen pen = drawingContext->pen();
+-        if (joinString == "round")
+-            pen.setJoinStyle(Qt::RoundJoin);
+-        else if (joinString == "bevel")
+-            pen.setJoinStyle(Qt::BevelJoin);
+-        else
+-            pen.setJoinStyle(Qt::MiterJoin);
+-        drawingContext->setPen( pen );
+-        break;
+-    }
+-    case Context2D::SetMiterLimit: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        float l = (float)args[0]->toNumber(exec);
+-        QPen pen = drawingContext->pen();
+-        pen.setMiterLimit( l );
+-        drawingContext->setPen( pen );
++    
++    case Context2D::SetTransform: {
++        KJS_REQUIRE_ARGS(6);
++        KJS_CHECK_FLOAT_OR_INF_ARGS(0, 5);
++
++        ctx->setTransform(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                          args[2]->toFloat(exec), args[3]->toFloat(exec),
++                          args[4]->toFloat(exec), args[5]->toFloat(exec));
+         break;
+     }
+-    case Context2D::Fill: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
++    
++    // Composition state is properties --- not in prototype
++    
++    // Color and style info..
++    case Context2D::CreateLinearGradient: {
++        KJS_REQUIRE_ARGS(4);
++        KJS_CHECK_FLOAT_ARGS(0, 3);
++
++        CanvasGradientImpl* grad = ctx->createLinearGradient(
++              args[0]->toFloat(exec), args[1]->toFloat(exec),
++              args[2]->toFloat(exec), args[3]->toFloat(exec));
++        return getWrapper<CanvasGradient>(exec, grad);
++    }
++
++    case Context2D::CreateRadialGradient: {
++        KJS_REQUIRE_ARGS(6);
++        KJS_CHECK_FLOAT_ARGS(0, 5);
++        
++        CanvasGradientImpl* grad = ctx->createRadialGradient(
++              args[0]->toFloat(exec), args[1]->toFloat(exec),
++              args[2]->toFloat(exec), args[3]->toFloat(exec),
++              args[4]->toFloat(exec), args[5]->toFloat(exec),
++              exception);
++
++        return getWrapper<CanvasGradient>(exec, grad);
++    }
+ 
+-        drawingContext->fillPath( contextObject->path(), contextObject->constructBrush( exec ) );
++    case Context2D::CreatePattern: {
++        KJS_REQUIRE_ARGS(2);
++
++        ElementImpl* el = toElement(args[0]);
++        if (!el) {
++          setDOMException(exec, DOMException::TYPE_MISMATCH_ERR);
++          return jsUndefined();
++        }
++
++        CanvasPatternImpl* pat = ctx->createPattern(el, args[1]->toString(exec).domString(),
++                                                    exception);
++
++        return getWrapper<CanvasPattern>(exec, pat);
++    }
++    
++    // Line properties are all... properties!
++    
++    // Rectangle ops
++    case Context2D::ClearRect: {
++        KJS_REQUIRE_ARGS(4);
++        KJS_CHECK_FLOAT_ARGS(0, 3);
++        
++        ctx->clearRect(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                       args[2]->toFloat(exec), args[3]->toFloat(exec),
++                       exception);
+ 
+-        renderer->setNeedsImageUpdate();
+         break;
+     }
+-    case Context2D::Stroke: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
+ 
+-        drawingContext->strokePath( contextObject->path(), contextObject->constructPen( exec ) );
++    case Context2D::FillRect: {
++        KJS_REQUIRE_ARGS(4);
++        KJS_CHECK_FLOAT_ARGS(0, 3);
++        
++        ctx->fillRect(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                      args[2]->toFloat(exec), args[3]->toFloat(exec),
++                      exception);
+ 
+-        renderer->setNeedsImageUpdate();
+         break;
+     }
+-    case Context2D::Scale: {
+-        if (args.size() != 2)
+-            return throwError(exec, SyntaxError);
+-        float sx = (float)args[0]->toNumber(exec);
+-        float sy = (float)args[1]->toNumber(exec);
+-        drawingContext->scale( sx, sy );
+-        contextObject->_needsFlushRasterCache = true;
++
++    case Context2D::StrokeRect: {
++        KJS_REQUIRE_ARGS(4);
++        KJS_CHECK_FLOAT_ARGS(0, 3);
++        
++        ctx->strokeRect(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                        args[2]->toFloat(exec), args[3]->toFloat(exec),
++                        exception);
++
+         break;
+     }
+-    case Context2D::Rotate: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        float angle = (float)args[0]->toNumber(exec);
+-        drawingContext->rotate( angle );
+-        contextObject->_needsFlushRasterCache = true;
++
++    // Path ops
++    case Context2D::BeginPath: {
++        ctx->beginPath();
+         break;
+     }
+-    case Context2D::Translate: {
+-        if (args.size() != 2)
+-            return throwError(exec, SyntaxError);
+-        float tx = (float)args[0]->toNumber(exec);
+-        float ty = (float)args[1]->toNumber(exec);
+-        drawingContext->translate( tx, ty );
++    
++    case Context2D::ClosePath: {
++        ctx->closePath();
+         break;
+     }
++
+     case Context2D::MoveTo: {
+-        if (args.size() != 2)
+-            return throwError(exec, SyntaxError);
+-        float x = (float)args[0]->toNumber(exec);
+-        float y = (float)args[1]->toNumber(exec);
+-        contextObject->path().moveTo( x, y );
+-        renderer->setNeedsImageUpdate();
++        KJS_REQUIRE_ARGS(2);
++        KJS_CHECK_FLOAT_ARGS(0, 1);
++        
++        ctx->moveTo(args[0]->toFloat(exec), args[1]->toFloat(exec));
+         break;
+     }
++
+     case Context2D::LineTo: {
+-        if (args.size() != 2)
+-            return throwError(exec, SyntaxError);
+-        float x = (float)args[0]->toNumber(exec);
+-        float y = (float)args[1]->toNumber(exec);
+-        contextObject->path().lineTo( x, y );
+-        renderer->setNeedsImageUpdate();
++        KJS_REQUIRE_ARGS(2);
++        KJS_CHECK_FLOAT_ARGS(0, 1);
++            
++        ctx->lineTo(args[0]->toFloat(exec), args[1]->toFloat(exec));
+         break;
+     }
++
+     case Context2D::QuadraticCurveTo: {
+-        if (args.size() != 4)
+-            return throwError(exec, SyntaxError);
+-        float cpx = (float)args[0]->toNumber(exec);
+-        float cpy = (float)args[1]->toNumber(exec);
+-        float x = (float)args[2]->toNumber(exec);
+-        float y = (float)args[3]->toNumber(exec);
+-        contextObject->path().quadTo( cpx, cpy, x, y );
+-        renderer->setNeedsImageUpdate();
++        KJS_REQUIRE_ARGS(4);
++        KJS_CHECK_FLOAT_ARGS(0, 3);
++            
++        ctx->quadraticCurveTo(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                              args[2]->toFloat(exec), args[3]->toFloat(exec));
+         break;
+     }
++
+     case Context2D::BezierCurveTo: {
+-        if (args.size() != 6)
+-            return throwError(exec, SyntaxError);
+-        float cp1x = (float)args[0]->toNumber(exec);
+-        float cp1y = (float)args[1]->toNumber(exec);
+-        float cp2x = (float)args[2]->toNumber(exec);
+-        float cp2y = (float)args[3]->toNumber(exec);
+-        float x = (float)args[4]->toNumber(exec);
+-        float y = (float)args[5]->toNumber(exec);
+-        contextObject->path().cubicTo( cp1x, cp1y, cp2x, cp2y, x, y );
+-        renderer->setNeedsImageUpdate();
++        KJS_REQUIRE_ARGS(6);
++        KJS_CHECK_FLOAT_ARGS(0, 5);
++            
++        ctx->bezierCurveTo(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                           args[2]->toFloat(exec), args[3]->toFloat(exec),
++                           args[4]->toFloat(exec), args[5]->toFloat(exec));
+         break;
+     }
+-    case Context2D::ArcTo: {
+-        if (args.size() != 5)
+-            return throwError(exec, SyntaxError);
+-        float x1 = (float)args[0]->toNumber(exec);
+-        float y1 = (float)args[1]->toNumber(exec);
+-        float x2 = (float)args[2]->toNumber(exec);
+-        float y2 = (float)args[3]->toNumber(exec);
+-        float r = (float)args[4]->toNumber(exec);
+-        //### FIXME busted
+-        //me no feely like doing math to convert this correctly, yo
+-        contextObject->path().arcTo(x1, y1, x2-x1, y2-y1, r, 90);
+-        break;
+-    }
+-    case Context2D::Arc: {
+-        if (args.size() != 6)
+-            return throwError(exec, SyntaxError);
+-        float xc = (float)args[0]->toNumber(exec);
+-        float yc = (float)args[1]->toNumber(exec);
+-        float radius = (float)args[2]->toNumber(exec);
+-        float sar = (float)args[3]->toNumber(exec);
+-        float ear = (float)args[4]->toNumber(exec);
+-        bool  anticlockwise = args[5]->toBoolean(exec);
+-
+-
+-        //### HACK
+-        // In Qt we don't switch the coordinate system for degrees
+-        // and still use the 0,0 as bottom left for degrees so we need
+-        // to switch
+-        sar = -sar;
+-        ear = -ear;
+-        anticlockwise = !anticlockwise;
+-        //end hack
+-
+-        float sa = DEGREES( sar );
+-        float ea = DEGREES( ear );
+-
+-        double span = 0;
+-
+-        double xs     = xc - radius;
+-        double ys     = yc - radius;
+-        double width  = radius*2;
+-        double height = radius*2;
+-
+-        if ( !anticlockwise && ( ea < sa ) ) {
+-            span += 360;
+-        } else if ( anticlockwise && ( sa < ea ) ) {
+-            span -= 360;
+-        }
+-
+-        //### this is also due to switched coordinate system
+-        // we would end up with a 0 span instead of 360
+-        if ( !( qFuzzyCompare( span + ( ea - sa ), 0.0 ) &&
+-                qFuzzyCompare( fabs( span ), 360.0 ) ) ) {
+-            span   += ea - sa;
+-        }
+ 
+-        contextObject->path().moveTo( QPointF( xc + radius  * cos( sar ),
+-                                               yc - radius  * sin( sar ) ) );
+-#if 0
+-        QPen pen = drawingContext->pen();
+-        pen.setColor( Qt::red );
+-        pen.setWidth( 10 );
+-        drawingContext->save();
+-        drawingContext->setPen( pen );
+-        drawingContext->drawPoint( QPointF( xc + radius  * cos( sar ),
+-                                            yc - radius * sin( sar ) ) );
+-        drawingContext->restore();
+-        qDebug()<<"arcTo "<<xs<<ys<<width<<height<<sa<<span;
+-#endif
++    case Context2D::ArcTo: {
++        KJS_REQUIRE_ARGS(5);
++        KJS_CHECK_FLOAT_ARGS(0, 4);
+ 
+-        contextObject->path().arcTo(xs, ys, width, height, sa, span);
++        ctx->arcTo(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                   args[2]->toFloat(exec), args[3]->toFloat(exec),
++                   args[4]->toFloat(exec), exception);
+         break;
+     }
++
+     case Context2D::Rect: {
+-        if (args.size() != 4)
+-            return throwError(exec, SyntaxError);
+-        float x = (float)args[0]->toNumber(exec);
+-        float y = (float)args[1]->toNumber(exec);
+-        float w = (float)args[2]->toNumber(exec);
+-        float h = (float)args[3]->toNumber(exec);
+-        contextObject->path().addRect( x, y, w, h );
++        KJS_REQUIRE_ARGS(4);
++        KJS_CHECK_FLOAT_ARGS(0, 3);
++            
++        ctx->rect(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                  args[2]->toFloat(exec), args[3]->toFloat(exec),
++                  exception);
+         break;
+     }
+-    case Context2D::Clip: {
+-        if (args.size() != 0)
+-            return throwError(exec, SyntaxError);
+-        drawingContext->setClipPath( contextObject->path() );
++
++    case Context2D::Arc: {
++        KJS_REQUIRE_ARGS(6);
++        KJS_CHECK_FLOAT_ARGS(0, 5);
++            
++        ctx->arc(args[0]->toFloat(exec), args[1]->toFloat(exec),
++                 args[2]->toFloat(exec), args[3]->toFloat(exec),
++                 args[4]->toFloat(exec), args[5]->toBoolean(exec),
++                 exception);
+         break;
+     }
+ 
+-    case Context2D::ClearRect: {
+-        if (args.size() != 4)
+-            return throwError(exec, SyntaxError);
+-        float x = (float)args[0]->toNumber(exec);
+-        float y = (float)args[1]->toNumber(exec);
+-        float w = (float)args[2]->toNumber(exec);
+-        float h = (float)args[3]->toNumber(exec);
+-        drawingContext->eraseRect( QRectF( x, y, w, h ) );
+-        renderer->setNeedsImageUpdate();
++    case Context2D::Fill: {
++        ctx->fill();
+         break;
+     }
+-    case Context2D::FillRect: {
+-        if (args.size() != 4)
+-            return throwError(exec, SyntaxError);
+-        float x = (float)args[0]->toNumber(exec);
+-        float y = (float)args[1]->toNumber(exec);
+-        float w = (float)args[2]->toNumber(exec);
+-        float h = (float)args[3]->toNumber(exec);
+ 
+-        drawingContext->fillRect( QRectF( x, y, w, h ), contextObject->constructBrush( exec ) );
+-        renderer->setNeedsImageUpdate();
++    case Context2D::Stroke: {
++        ctx->stroke();
+         break;
+     }
+-    case Context2D::StrokeRect: {
+-        int size = args.size();
+-        if (size < 4)
+-            return throwError(exec, SyntaxError);
+-        float x = (float)args[0]->toNumber(exec);
+-        float y = (float)args[1]->toNumber(exec);
+-        float w = (float)args[2]->toNumber(exec);
+-        float h = (float)args[3]->toNumber(exec);
+-
+-        QPainterPath path; path.addRect( x, y, w, h );
+-        if (size > 4) {
+-            QPen pen = contextObject->constructPen( exec );
+-            pen.setWidthF( (float)args[4]->toNumber(exec) );
+-            drawingContext->strokePath( path, pen );
+-        }
+-        else {
+-            drawingContext->strokePath( path, contextObject->constructPen( exec ) );
+-        }
+-        renderer->setNeedsImageUpdate();
++
++    case Context2D::Clip: {
++        ctx->clip();
+         break;
+     }
+-        // DrawImage has three variants:
+-        // drawImage (img, dx, dy)
+-        // drawImage (img, dx, dy, dw, dh)
+-        // drawImage (img, sx, sy, sw, sh, dx, dy, dw, dh)
+-        // composite operation is specified with globalCompositeOperation
+-        // img parameter can be a JavaScript Image, <img>, or a <canvas>
+-    case Context2D::DrawImage: {
+-        if (args.size() < 3)
+-            return throwError(exec, SyntaxError);
+ 
+-        // Make sure first argument is an object.
+-        ObjectImp *o = static_cast<ObjectImp*>(args[0]);
+-        if (!o->isObject())
+-            return throwError(exec, TypeError);
+-
+-        float w = 0; // quiet incorrect gcc 4.0 warning
+-        float h = 0; // quiet incorrect gcc 4.0 warning
+-        QPixmap pixmap;
+-        QPainter *sourceContext = 0;
+-
+-        // Check for <img> or <canvas>.
+-        if (o->inherits(&KJS::HTMLElement::img_info)){
+-            NodeImpl *n = static_cast<HTMLElement *>(args[0])->impl();
+-            HTMLImageElementImpl *e = static_cast<HTMLImageElementImpl*>(n);
+-            pixmap = e->currentPixmap();
+-            w = pixmap.width();
+-            h = pixmap.height();
+-        }
+-        else if (o->inherits(&KJS::HTMLElement::canvas_info)){
+-            NodeImpl *n = static_cast<HTMLElement *>(args[0])->impl();
+-            HTMLCanvasElementImpl *e = static_cast<HTMLCanvasElementImpl*>(n);
+-            khtml::RenderCanvasImage *renderer = static_cast<khtml::RenderCanvasImage*>(e->renderer());
+-            if (!renderer) {
+-                // No renderer, nothing to draw.
+-                return Undefined();
+-            }
+-
+-            sourceContext = renderer->drawingContext();
+-            w = (float)sourceContext->device()->width();
+-            h = (float)sourceContext->device()->height();
+-        }
+-        else
+-            return throwError(exec, TypeError);
+-
+-        float dx, dy, dw = w, dh = h;
+-        float sx = 0.f, sy = 0.f, sw = w, sh = h;
+-
+-        if (args.size() == 3) {
+-            dx = args[1]->toNumber(exec);
+-            dy = args[2]->toNumber(exec);
+-        }
+-        else if (args.size() == 5) {
+-            dx = args[1]->toNumber(exec);
+-            dy = args[2]->toNumber(exec);
+-            dw = args[3]->toNumber(exec);
+-            dh = args[4]->toNumber(exec);
+-        }
+-        else if (args.size() == 9) {
+-            sx = args[1]->toNumber(exec);
+-            sy = args[2]->toNumber(exec);
+-            sw = args[3]->toNumber(exec);
+-            sh = args[4]->toNumber(exec);
+-            dx = args[5]->toNumber(exec);
+-            dy = args[6]->toNumber(exec);
+-            dw = args[7]->toNumber(exec);
+-            dh = args[8]->toNumber(exec);
++    case Context2D::DrawImage: {
++        ElementImpl* el = toElement(args[0]);
++        if (!el) {
++            setDOMException(exec, DOMException::TYPE_MISMATCH_ERR);
++            break;
+         }
+-        else
+-            return throwError(exec, SyntaxError);
+ 
+-        if (!sourceContext) {
+-            QString compositeOperator = contextObject->_globalComposite->toString(exec).qstring().toLower();
+-            QPainter::CompositionMode mode = compositeOperatorFromString(compositeOperator);
+-            drawingContext->setCompositionMode( mode );
+-            drawingContext->drawPixmap( QRectF( dx, dy, dw, dh ), pixmap, QRectF( sx, sy, sw, sh ) );
+-        }
+-        else {
+-            // Cheap, because the image is backed by copy-on-write memory, and we're
+-            // guaranteed to release before doing any more drawing in the source context.
+-            sourceContext->end();
+-            QImage *sourceImage = dynamic_cast<QImage*>( sourceContext->device() );
+-            if ( sourceImage ) {
+-                drawingContext->drawImage( QRectF( sx, sy, sw, sh ), *sourceImage,
+-                                           QRectF( dx, dy, dw, dh ) );
+-            }
++        if (args.size() < 3) {
++            setDOMException(exec, DOMException::NOT_SUPPORTED_ERR);
++            break;
+         }
+-
+-        renderer->setNeedsImageUpdate();
+-        break;
+-    }
+-    case Context2D::DrawImageFromRect: {
+-        if (args.size() != 10)
+-            return throwError(exec, SyntaxError);
+-        ObjectImp *o = static_cast<ObjectImp*>(args[0]);
+-        if (!o->isObject() || !o->inherits(&HTMLElement::img_info))
+-            return throwError(exec, TypeError);
+-        DOM::HTMLImageElementImpl *i = static_cast<DOM::HTMLImageElementImpl*>(static_cast<HTMLElement*>(o)->impl());
+-        float sx = args[1]->toNumber(exec);
+-        float sy = args[2]->toNumber(exec);
+-        float sw = args[3]->toNumber(exec);
+-        float sh = args[4]->toNumber(exec);
+-        float dx = args[5]->toNumber(exec);
+-        float dy = args[6]->toNumber(exec);
+-        float dw = args[7]->toNumber(exec);
+-        float dh = args[8]->toNumber(exec);
+-        QString compositeOperator = args[9]->toString(exec).qstring().toLower();
+-        khtml::CachedImage *ci = i->image();
+-        if (ci) {
+-            QPixmap pixmap = ci->pixmap();
+-            if ( !compositeOperator.isEmpty() ) {
+-                QPainter::CompositionMode mode = compositeOperatorFromString(compositeOperator);
+-                drawingContext->setCompositionMode( mode );
+-            }
+-
+-            drawingContext->drawPixmap(QRectF( dx, dy, dw, dh ), pixmap, QRectF( sx, sy, sw, sh ));
+-
+-            renderer->setNeedsImageUpdate();
++        
++        if (args.size() < 5) { // 3 or 4 arguments
++            KJS_CHECK_FLOAT_ARGS(1, 2);
++            ctx->drawImage(el,
++                           args[1]->toFloat(exec),
++                           args[2]->toFloat(exec),
++                           exception);
++        } else if (args.size() < 9) { // 5 through 9 arguments
++            KJS_CHECK_FLOAT_ARGS(1, 4);
++            ctx->drawImage(el,
++                           args[1]->toFloat(exec),
++                           args[2]->toFloat(exec),
++                           args[3]->toFloat(exec),
++                           args[4]->toFloat(exec),
++                           exception);
++        } else  { // 9 or more arguments
++            KJS_CHECK_FLOAT_ARGS(1, 8);
++            ctx->drawImage(el,
++                           args[1]->toFloat(exec),
++                           args[2]->toFloat(exec),
++                           args[3]->toFloat(exec),
++                           args[4]->toFloat(exec),
++                           args[5]->toFloat(exec),
++                           args[6]->toFloat(exec),
++                           args[7]->toFloat(exec),
++                           args[8]->toFloat(exec),
++                           exception);
+         }
+         break;
+     }
+-    case Context2D::SetAlpha: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        float a =  (float)args[0]->toNumber(exec);
+-        QPen     pen = drawingContext->pen();
+-        QBrush brush = drawingContext->brush();
+-        QColor qc = pen.color();
+-        qc.setAlphaF( a );
+-        pen.setColor( qc );
+-        qc = brush.color();
+-        qc.setAlphaF( a );
+-        brush.setColor( qc );
+-        drawingContext->setPen( pen );
+-        drawingContext->setBrush( brush );
+-        break;
+-    }
+-    case Context2D::SetCompositeOperation: {
+-        if (args.size() != 1)
+-            return throwError(exec, SyntaxError);
+-        QString compositeOperator = args[0]->toString(exec).qstring().toLower();
+-        QPainter::CompositionMode mode = compositeOperatorFromString( compositeOperator );
+-        //###
+-        drawingContext->setCompositionMode(mode);
+-        break;
+-    }
+-
+-    case Context2D::CreateLinearGradient: {
+-        if (args.size() != 4)
+-            return throwError(exec, SyntaxError);
+-        float x0 = args[0]->toNumber(exec);
+-        float y0 = args[1]->toNumber(exec);
+-        float x1 = args[2]->toNumber(exec);
+-        float y1 = args[3]->toNumber(exec);
+-
+-        return new Gradient(x0, y0, x1, y1);
+-    }
+ 
+-    case Context2D::CreateRadialGradient: {
+-        if (args.size() != 6)
+-            return throwError(exec, SyntaxError);
+-        float x0 = args[0]->toNumber(exec);
+-        float y0 = args[1]->toNumber(exec);
+-        float r0 = args[2]->toNumber(exec);
+-        float x1 = args[3]->toNumber(exec);
+-        float y1 = args[4]->toNumber(exec);
+-        float r1 = args[5]->toNumber(exec);
+-
+-        return new Gradient(x0, y0, r0, x1, y1, r1);
+-    }
+-
+-    case Context2D::CreatePattern: {
+-        if (args.size() != 2)
+-            return throwError(exec, SyntaxError);
+-        ObjectImp *o = static_cast<ObjectImp*>(args[0]);
+-        if (!o->isObject() || !o->inherits(&HTMLElement::img_info))
+-            return throwError(exec, TypeError);
+-        int repetitionType = ImagePattern::Repeat;
+-        DOMString repetitionString = args[1]->toString(exec).domString().lower();
+-        if (repetitionString == "repeat-x")
+-            repetitionType = ImagePattern::RepeatX;
+-        else if (repetitionString == "repeat-y")
+-            repetitionType = ImagePattern::RepeatY;
+-        else if (repetitionString == "no-repeat")
+-            repetitionType = ImagePattern::NoRepeat;
+-        return new ImagePattern(static_cast<HTMLElement*>(o), repetitionType);
+-    }
++    //### TODO: isPointInPath, shadows, ImageData
+     }
+ 
+     return Undefined();
+ }
+ 
+-const ClassInfo Context2D::info = { "Context2D", 0, &Context2DTable, 0 };
++const ClassInfo Context2D::info = { "CanvasRenderingContext2D", 0, &Context2DTable, 0 };
+ 
+-/* Source for Context2DTable. Use "make hashtables" to regenerate.
+-   @begin Context2DTable 48
++/*
++   @begin Context2DTable 11
++   canvas                   Context2D::Canvas                      DontDelete|ReadOnly
++   #
++   # compositing
++   globalAlpha              Context2D::GlobalAlpha                 DontDelete
++   globalCompositeOperation Context2D::GlobalCompositeOperation    DontDelete
++   #
++   # colors and styles
+    strokeStyle              Context2D::StrokeStyle                 DontDelete
+    fillStyle                Context2D::FillStyle                   DontDelete
++   #
++   # line drawing properties
+    lineWidth                Context2D::LineWidth                   DontDelete
+    lineCap                  Context2D::LineCap                     DontDelete
+    lineJoin                 Context2D::LineJoin                    DontDelete
+    miterLimit               Context2D::MiterLimit                  DontDelete
+-   globalAlpha              Context2D::GlobalAlpha                 DontDelete
+-   globalCompositeOperation Context2D::GlobalCompositeOperation    DontDelete
+-   save                     Context2D::Save                        DontDelete|Function 0
+-   restore                  Context2D::Restore                     DontDelete|Function 0
+-   scale                    Context2D::Scale                       DontDelete|Function 2
+-   rotate                   Context2D::Rotate                      DontDelete|Function 2
+-   translate                Context2D::Translate                   DontDelete|Function 1
+-   beginPath                Context2D::BeginPath                   DontDelete|Function 0
+-   closePath                Context2D::ClosePath                   DontDelete|Function 0
+-   setStrokeColor           Context2D::SetStrokeColor              DontDelete|Function 1
+-   setFillColor             Context2D::SetFillColor                DontDelete|Function 1
+-   setLineWidth             Context2D::SetLineWidth                DontDelete|Function 1
+-   setLineCap               Context2D::SetLineCap                  DontDelete|Function 1
+-   setLineJoin              Context2D::SetLineJoin                 DontDelete|Function 1
+-   setMiterLimit            Context2D::SetMiterLimit               DontDelete|Function 1
+-   fill                     Context2D::Fill                        DontDelete|Function 0
+-   stroke                   Context2D::Stroke                      DontDelete|Function 0
+-   moveTo                   Context2D::MoveTo                      DontDelete|Function 2
+-   lineTo                   Context2D::LineTo                      DontDelete|Function 2
+-   quadraticCurveTo         Context2D::QuadraticCurveTo            DontDelete|Function 4
+-   bezierCurveTo            Context2D::BezierCurveTo               DontDelete|Function 6
+-   arcTo                    Context2D::ArcTo                       DontDelete|Function 5
+-   arc                      Context2D::Arc                         DontDelete|Function 6
+-   rect                     Context2D::Rect                        DontDelete|Function 4
+-   clip                     Context2D::Clip                        DontDelete|Function 0
+-   clearRect                Context2D::ClearRect                   DontDelete|Function 4
+-   fillRect                 Context2D::FillRect                    DontDelete|Function 4
+-   strokeRect               Context2D::StrokeRect                  DontDelete|Function 4
+-   drawImage                Context2D::DrawImage                   DontDelete|Function 6
+-   drawImageFromRect        Context2D::DrawImageFromRect           DontDelete|Function 10
+-   setAlpha                 Context2D::SetAlpha                    DontDelete|Function 1
+-   setCompositeOperation    Context2D::SetCompositeOperation       DontDelete|Function 1
+-   createLinearGradient     Context2D::CreateLinearGradient        DontDelete|Function 4
+-   createRadialGradient     Context2D::CreateRadialGradient        DontDelete|Function 6
+-   createPattern            Context2D::CreatePattern               DontDelete|Function 2
+    @end
+ */
+ 
+-bool Context2D::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
++bool Context2D::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
+ {
+-    // FIXME: functions should be on the prototype, not in the object itself
+-    return getStaticPropertySlot<Context2DFunction, Context2D, DOMObject>(exec, &Context2DTable, this, propertyName, slot);
++    return getStaticOwnValueSlot<Context2D>(&Context2DTable, this, propertyName, slot);
+ }
+ 
+-ValueImp *Context2D::getValueProperty(ExecState *, int token) const
++static ValueImp* encodeStyle(ExecState* exec, CanvasStyleBaseImpl* style)
+ {
+-    switch(token) {
+-    case StrokeStyle: {
+-        return _strokeStyle;
+-    }
+-
+-    case FillStyle: {
+-        return _fillStyle;
++    switch (style->type()) {
++    case CanvasStyleBaseImpl::Color:
++        return jsString(UString(static_cast<CanvasColorImpl*>(style)->toString()));
++    case CanvasStyleBaseImpl::Gradient:
++        return getWrapper<CanvasGradient>(exec, static_cast<CanvasGradientImpl*>(style));
++    case CanvasStyleBaseImpl::Pattern:
++        return getWrapper<CanvasPattern>(exec, static_cast<CanvasPatternImpl*>(style));
+     }
+ 
+-    case LineWidth: {
+-        return _lineWidth;
+-    }
+-
+-    case LineCap: {
+-        return _lineCap;
+-    }
+-
+-    case LineJoin: {
+-        return _lineJoin;
+-    }
+-
+-    case MiterLimit: {
+-        return _miterLimit;
+-    }
+-
+-    case GlobalAlpha: {
+-        return _globalAlpha;
+-    }
+-
+-    case GlobalCompositeOperation: {
+-        return _globalComposite;
+-    }
+-
+-    default: {
+-    }
+-    }
+-
+-    return Undefined();
++    return jsNull();
+ }
+ 
+-void Context2D::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
++
++// ### TODO: test how non-string things are handled in other browsers.
++static CanvasStyleBaseImpl* decodeStyle(ExecState* exec, ValueImp* v)
+ {
+-    lookupPut<Context2D,DOMObject>(exec, propertyName, value, attr, &Context2DTable, this );
++    if (v->isObject() && static_cast<ObjectImp*>(v)->inherits(&CanvasGradient::info))
++        return static_cast<CanvasGradient*>(v)->impl();
++    else if (v->isObject() && static_cast<ObjectImp*>(v)->inherits(&CanvasPattern::info))
++        return static_cast<CanvasPattern*>(v)->impl();
++    else
++        return CanvasColorImpl::fromString(v->toString(exec).domString());
+ }
+ 
+-QPainter *Context2D::drawingContext()
++ValueImp* Context2D::getValueProperty(ExecState* exec, int token) const
+ {
+-    khtml::RenderCanvasImage *renderer = static_cast<khtml::RenderCanvasImage*>(_element->renderer());
+-    if (!renderer)
+-        return 0;
+-
+-    QPainter *context = renderer->drawingContext();
+-    if (!context)
+-        return 0;
++    const CanvasContext2DImpl* ctx = impl();
++    switch(token) {
++    case Canvas:
++        return getDOMNode(exec, ctx->canvas());
+ 
+-    return context;
+-}
++    case GlobalAlpha:
++        return jsNumber(ctx->globalAlpha());
+ 
+-static QList<qreal> parseNumbersList(QString::const_iterator &itr)
+-{
+-    QList<qreal> points;
+-    QLocale c(QLocale::C);
+-    QString temp;
+-    bool percent = false;
+-    while ((*itr).isSpace())
+-        ++itr;
+-    while ((*itr).isNumber() ||
+-           (*itr) == '-' || (*itr) == '+' || (*itr) == '.') {
+-        temp = QString();
+-
+-        if ((*itr) == '-')
+-            temp += *itr++;
+-        else if ((*itr) == '+')
+-            temp += *itr++;
+-        while ((*itr).isDigit())
+-            temp += *itr++;
+-        if ((*itr) == '.')
+-            temp += *itr++;
+-        while ((*itr).isDigit())
+-            temp += *itr++;
+-        while ((*itr).isSpace())
+-            ++itr;
+-        if ((*itr) == '%')
+-            ++itr, percent = true;
+-        while ((*itr).isSpace())
+-            ++itr;
+-        if ((*itr) == ',')
+-            ++itr;
+-        points.append(c.toDouble(temp) * (percent ? 2.55 : 1));
+-        //eat spaces
+-        while ((*itr).isSpace())
+-            ++itr;
+-        percent = false;
+-    }
++    case GlobalCompositeOperation:
++        return jsString(ctx->globalCompositeOperation());
+ 
+-    return points;
+-}
++    case StrokeStyle:
++        return encodeStyle(exec, ctx->strokeStyle());
+ 
+-QColor colorFromValue(ExecState *exec, ValueImp *value)
+-{
+-    QString name = value->toString(exec).qstring().trimmed();
+-    QString::const_iterator itr = name.constBegin();
+-    QList<qreal> compo;
+-    if ( name.startsWith( "rgba(" ) || name.startsWith( "hsva(" ) ) {
+-        ++itr; ++itr; ++itr; ++itr; ++itr;
+-        compo = parseNumbersList(itr);
+-        if ( compo.size() != 4 ) {
+-            return QColor();
+-        }
+-        return name.startsWith('h') ?
+-            QColor::fromHsvF( compo[0]/255, compo[1]/255, compo[2]/255, compo[3] ) :
+-            QColor::fromRgbF( compo[0]/255, compo[1]/255, compo[2]/255, compo[3] );
+-    } else if ( name.startsWith( "rgb(" ) ||  name.startsWith( "hsv(" ) ) {
+-        ++itr; ++itr; ++itr; ++itr;
+-        compo = parseNumbersList(itr);
+-        if ( compo.size() != 3 ) {
+-            return QColor();
+-        }
+-        return name.startsWith('h') ?
+-            QColor::fromHsv( compo[0], compo[1], compo[2] ) :
+-            QColor::fromRgb( compo[0], compo[1], compo[2] );
+-    } else {
+-        QRgb color;
+-        DOM::CSSParser::parseColor(name, color);
+-        return QColor(color);
+-    }
+-}
++    case FillStyle:
++        return encodeStyle(exec, ctx->fillStyle());
+ 
+-void Context2D::updateStrokeImagePattern()
+-{
+-    QPainter *context = drawingContext();
++    case LineWidth:
++        return jsNumber(ctx->lineWidth());
++    
++    case LineCap:
++        return jsString(ctx->lineCap());
+ 
+-    if (!_validStrokeImagePattern) {
+-        ImagePattern *imagePattern = static_cast<ImagePattern *>(_fillStyle);
+-        QBrush pattern = imagePattern->createPattern();
+-        QPen pen = context->pen();
+-        pen.setBrush( pattern );
+-        context->setPen( pen );
+-        _validStrokeImagePattern = true;
+-    }
+-}
++    case LineJoin:
++        return jsString(ctx->lineJoin());
+ 
+-QBrush Context2D::constructBrush(ExecState* exec)
+-{
+-    //### FIXME: caching and such
+-    if (_fillStyle->isString()) {
+-        QColor qc = colorFromValue(exec, _fillStyle);
+-        return QBrush( qc );
+-    }
+-    else {
+-        ObjectImp *o = static_cast<ObjectImp*>(_fillStyle);
+-
+-        if (o->inherits(&Gradient::info)) {
+-            Gradient *gradient = static_cast<Gradient*>(o);
+-            return QBrush( *gradient->qgradient() );
+-        } else {
+-            //Must be an image pattern
+-            ImagePattern *imagePattern = static_cast<ImagePattern *>(_fillStyle);
+-            return imagePattern->createPattern();
+-        }
++    case MiterLimit:
++        return jsNumber(ctx->miterLimit());
++
++    default:
++        assert(0);
++        return jsUndefined();
+     }
+ }
+ 
+-
+-QPen Context2D::constructPen(ExecState* exec)
++void Context2D::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
+ {
+-    //### FIXME: caching and such
+-    QPen pen = drawingContext()->pen();
+-    float w = (float)_lineWidth->toNumber(exec);
+-    pen.setWidth(w);
+-    if (_strokeStyle->isString()) {
+-        QColor qc = colorFromValue(exec, _strokeStyle);
+-        pen.setColor( qc );
+-        return pen;
+-    }
+-    else {
+-        ObjectImp *o = static_cast<ObjectImp*>(_strokeStyle);
+-        if (o->inherits(&Gradient::info)) {
+-            Gradient *gradient = static_cast<Gradient*>(o);
+-            pen.setBrush( QBrush( *gradient->qgradient() ) );
+-            return pen;
+-        } else {
+-            //Must be an image pattern
+-            ImagePattern *imagePattern = static_cast<ImagePattern *>(_fillStyle);
+-            pen.setBrush( imagePattern->createPattern() );
+-            return pen;
+-        }
+-    }
++    lookupPut<Context2D,DOMObject>(exec, propertyName, value, attr, &Context2DTable, this );
+ }
+ 
+ void Context2D::putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/)
+ {
+-    QPainter *context = drawingContext();
+-    if (!context)
+-        return;
+-
++    CanvasContext2DImpl* ctx = impl();
+     switch(token) {
+-    case StrokeStyle: {
+-        _strokeStyle = value;
+-        if (value->isString()) {
+-            QColor qc = colorFromValue(exec, value);
+-            QPen pen = context->pen();
+-            pen.setColor( qc );
+-        }
+-        else {
+-            // _strokeStyle is used when stroke() is called on the context.
+-            //### fix this
+-            ObjectImp *o = static_cast<ObjectImp*>(value);
+-
+-            if (!o->isObject() || !(o->inherits(&Gradient::info) || o->inherits(&ImagePattern::info)))
+-                throwError(exec, TypeError);
+-        }
++    case GlobalAlpha:
++        ctx->setGlobalAlpha(value->toFloat(exec));
+         break;
+-    }
+-
+-    case FillStyle: {
+-        if (!value->isString()) {
+-            ObjectImp *o = static_cast<ObjectImp*>(value);
+-            if (!o->isObject() || !(o->inherits(&Gradient::info) || o->inherits(&ImagePattern::info)))
+-                throwError(exec, TypeError);
+-        }
+-        _fillStyle = value;
++    case GlobalCompositeOperation:
++        ctx->setGlobalCompositeOperation(value->toString(exec).domString());
+         break;
+-    }
+-
+-    case LineWidth: {
+-        _lineWidth = value;
+-        float w = (float)value->toNumber(exec);
+-        QPen pen = context->pen();
+-        pen.setWidthF( w );
+-        context->setPen( pen );
++    case StrokeStyle:
++        ctx->setStrokeStyle(decodeStyle(exec, value));
+         break;
+-    }
+-
+-    case LineCap: {
+-        _lineCap = value;
+-        QPen pen = context->pen();
+-        DOMString capString = value->toString(exec).domString().lower();
+-        if (capString == "round")
+-            pen.setCapStyle( Qt::RoundCap );
+-        else if (capString == "square")
+-            pen.setCapStyle( Qt::SquareCap );
+-        else
+-            pen.setCapStyle( Qt::FlatCap );
+-        context->setPen( pen );
++    case FillStyle:
++        ctx->setFillStyle(decodeStyle(exec, value));
+         break;
+-    }
+-
+-    case LineJoin: {
+-        _lineJoin = value;
+-        DOMString joinString = value->toString(exec).domString().lower();
+-        QPen pen = context->pen();
+-        if (joinString == "round")
+-            pen.setJoinStyle( Qt::RoundJoin );
+-        else if (joinString == "bevel")
+-            pen.setJoinStyle( Qt::BevelJoin );
+-        else
+-            pen.setJoinStyle( Qt::MiterJoin );
+-        context->setPen( pen );
++    case LineWidth:
++        ctx->setLineWidth(value->toFloat(exec));
+         break;
+-    }
+-
+-    case MiterLimit: {
+-        _miterLimit = value;
+-
+-        float l = (float)value->toNumber(exec);
+-        QPen pen = context->pen();
+-        pen.setMiterLimit( l );
+-        context->setPen( pen );
++    case LineCap:
++        ctx->setLineCap(value->toString(exec).domString());
+         break;
+-    }
+-
+-    case GlobalAlpha: {
+-        _globalAlpha = value;
+-        float a =  (float)value->toNumber(exec);
+-        QBrush brush = context->brush();
+-        QPen     pen = context->pen();
+-
+-        QColor qc = brush.color(); qc.setAlphaF( a ); brush.setColor( qc );
+-        context->setBrush( brush );
+-
+-        qc = pen.color(); qc.setAlphaF( a ); pen.setColor( qc );
+-        context->setPen( pen );
++    case LineJoin:
++        ctx->setLineJoin(value->toString(exec).domString());
+         break;
+-    }
+-
+-    case GlobalCompositeOperation: {
+-        _globalComposite = value;
+-        QString compositeOperator = value->toString(exec).qstring().toLower();
+-        QPainter::CompositionMode mode = compositeOperatorFromString( compositeOperator );
+-        context->setCompositionMode( mode );
++    case MiterLimit:
++        ctx->setMiterLimit(value->toFloat(exec));
+         break;
+-    }
+-
+-    default: {
+-    }
++    default:
++        {} // huh?
+     }
+ }
+ 
+-void Context2D::save()
+-{
+-    List *list = new List();
+-
+-    list->append(_strokeStyle);
+-    list->append(_fillStyle);
+-    list->append(_lineWidth);
+-    list->append(_lineCap);
+-    list->append(_lineJoin);
+-    list->append(_miterLimit);
+-    list->append(_globalAlpha);
+-    list->append(_globalComposite);
+-
+-    stateStack.append(list);
+-}
+-
+-void Context2D::restore()
+-{
+-    if (stateStack.count() < 1) {
+-        return;
+-    }
+-
+-    List *list = stateStack.last();
+-
+-    int pos = 0;
+-    _strokeStyle = list->at(pos++);
+-    _fillStyle = list->at(pos++);
+-    _lineWidth = list->at(pos++);
+-    _lineCap = list->at(pos++);
+-    _lineJoin = list->at(pos++);
+-    _miterLimit = list->at(pos++);
+-    _globalAlpha = list->at(pos++);
+-    _globalComposite = list->at(pos++);
+-
+-    // This will delete list.
+-    stateStack.removeLast();
+-}
+-
+-Context2D::Context2D(HTMLElementImpl *e)
+-    : _validStrokeImagePattern(false),
+-      _element(e), _needsFlushRasterCache(false),
+-      _strokeStyle(Undefined()),
+-      _fillStyle(Undefined()),
+-      _lineWidth(Undefined()),
+-      _lineCap(Undefined()),
+-      _lineJoin(Undefined()),
+-      _miterLimit(Undefined()),
+-      _globalAlpha(Undefined()),
+-      _globalComposite(Undefined())
+-{
+-    _lineWidth = Number(1);
+-    _strokeStyle = String("black");
+-    _fillStyle = String("black");
+-
+-    _lineCap = String("butt");
+-    _lineJoin = String("miter");
+-    _miterLimit = Number(10);
+-
+-    _globalAlpha = Number(1);
+-    _globalComposite = String("source-over");
+-}
+-
+-Context2D::~Context2D()
+-{
+-    qDeleteAll(stateStack.begin(), stateStack.end());
+-}
+-
+-void Context2D::mark()
+-{
+-    ValueImp *v;
+-
+-    v = _strokeStyle;
+-    if (!v->marked())
+-        v->mark();
+ 
+-    v = _fillStyle;
+-    if (!v->marked())
+-        v->mark();
+ 
+-    v = _lineWidth;
+-    if (!v->marked())
+-        v->mark();
++////////////////////// CanvasGradient Object ////////////////////////
++const ClassInfo KJS::CanvasGradient::info = { "CanvasGradient", 0, 0, 0 };
+ 
+-    v = _lineCap;
+-    if (!v->marked())
+-        v->mark();
++KJS_DEFINE_PROTOTYPE(CanvasGradientProto)
++KJS_IMPLEMENT_PROTOFUNC(CanvasGradientFunction)
++KJS_IMPLEMENT_PROTOTYPE("CanvasGradientProto", CanvasGradientProto, CanvasGradientFunction)
+ 
+-    v = _lineJoin;
+-    if (!v->marked())
+-        v->mark();
+-
+-    v = _miterLimit;
+-    if (!v->marked())
+-        v->mark();
+-
+-    v = _globalAlpha;
+-    if (!v->marked())
+-        v->mark();
+-
+-    v = _globalComposite;
+-    if (!v->marked())
+-        v->mark();
+-
+-    QListIterator<List*> it(stateStack);
+-    List *list;
+-    while (it.hasNext()) {
+-        list = it.next();
+-        list->mark();
+-    }
+-
+-    DOMObject::mark();
+-}
+-
+-static qreal adjustPosition( qreal pos, const QGradientStops &stops )
+-{
+-    QGradientStops::const_iterator itr = stops.constBegin();
+-    const qreal smallDiff = 0.00001;
+-    while ( itr != stops.constEnd() ) {
+-        const QGradientStop &stop = *itr;
+-        ++itr;
+-        bool atEnd = ( itr != stops.constEnd() );
+-        if ( qFuzzyCompare( pos, stop.first ) ) {
+-            if ( atEnd || !qFuzzyCompare( pos + smallDiff, ( *itr ).first ) ) {
+-                return pos + smallDiff;
+-            }
+-        }
+-    }
+-    return pos;
+-}
+-
+-const ClassInfo KJS::Gradient::info = { "Gradient", 0, &GradientTable, 0 };
+-
+-/* Source for GradientTable. Use "make hashtables" to regenerate.
+-   @begin GradientTable 1
+-   addColorStop             Gradient::AddColorStop                DontDelete|Function 2
++/*
++   @begin CanvasGradientProtoTable 1
++   addColorStop             CanvasGradient::AddColorStop                DontDelete|Function 2
+    @end
+ */
+ 
+-KJS_IMPLEMENT_PROTOFUNC(GradientFunction)
+-
+-ValueImp *GradientFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
++ValueImp *CanvasGradientFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
+ {
+-    if (!thisObj->inherits(&Gradient::info))
+-        return throwError(exec, TypeError);
++    KJS_CHECK_THIS(CanvasGradient, thisObj);
+ 
+-    Gradient *gradient = static_cast<KJS::Gradient *>(thisObj);
++    CanvasGradientImpl* impl = static_cast<KJS::CanvasGradient*>(thisObj)->impl();
+ 
++    DOMExceptionTranslator exception(exec);
+     switch (id) {
+-    case Gradient::AddColorStop: {
+-        if (args.size() != 2)
+-            return throwError(exec, SyntaxError);
+-
+-        QColor color = colorFromValue(exec, args[1]);
+-        qreal pos = (float)args[0]->toNumber(exec);
+-        //<canvas> says that gradient can have two stops at the same position
+-        //Qt doesn't handle that. We hack around that by creating a fake position
+-        //stop.
+-        pos = adjustPosition( pos, gradient->qgradient()->stops() );
+-        gradient->addColorStop(pos, color.red()/255.f, color.green()/255.f, color.blue()/255.f, color.alpha()/255.f);
++    case CanvasGradient::AddColorStop:
++        KJS_REQUIRE_ARGS(2);
++        impl->addColorStop(args[0]->toFloat(exec), args[1]->toString(exec).domString(), exception);
+         break;
+-    }
++    default:
++        assert(0);
+     }
+ 
+     return Undefined();
+ }
+ 
+-void Gradient::commonInit()
+-{
+-    stops = 0;
+-    stopCount = 0;
+-    maxStops = 0;
+-    stopsNeedAdjusting = false;
+-    adjustedStopCount = 0;
+-    adjustedStops = 0;
+-}
++CanvasGradient::CanvasGradient(ExecState* exec, DOM::CanvasGradientImpl* impl) :
++    WrapperBase(CanvasGradientProto::self(exec), impl)
++{}
+ 
+-Gradient::Gradient(float x0, float y0, float x1, float y1)
+-{
+-    m_gradient = new QLinearGradient( x0, y0, x1, y1 );
++////////////////////// CanvasPattern Object ////////////////////////
+ 
+-    commonInit();
+-}
++const ClassInfo CanvasPattern::info = { "CanvasPattern", 0, 0, 0 };
+ 
+-Gradient::Gradient(float x0, float y0, float r0, float x1, float y1, float /*r1*/)
+-{
+-    //### need to add the outer redius to Qt Arthur
+-    m_gradient = new QRadialGradient( x0, y0, r0, x1, y1 );
+-
+-    commonInit();
+-}
+-
+-bool Gradient::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
+-{
+-    return getStaticPropertySlot<GradientFunction, Gradient, DOMObject>(exec, &GradientTable, this, propertyName, slot);
+-}
+-
+-ValueImp *Gradient::getValueProperty(ExecState *, int token) const
+-{
+-    return Undefined();
+-}
+-
+-void Gradient::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
+-{
+-    lookupPut<Gradient,DOMObject>(exec, propertyName, value, attr, &GradientTable, this );
+-}
+-
+-void Gradient::putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/)
+-{
+-}
+-
+-Gradient::~Gradient()
+-{
+-    delete m_gradient; m_gradient = 0;
+-}
+-
+-void Gradient::addColorStop (float s, float r, float g, float b, float a)
+-{
+-    QColor qc;
+-    qc.setRgbF( r, g, b, a );
+-    m_gradient->setColorAt( s, qc );
+-}
+-
+-const ClassInfo ImagePattern::info = { "ImagePattern", 0, &ImagePatternTable, 0 };
++// Provide an empty prototype in case people want to hack it
++KJS_DEFINE_PROTOTYPE(CanvasPatternProto)
++KJS_IMPLEMENT_PROTOFUNC(CanvasPatternFunction)
++KJS_IMPLEMENT_PROTOTYPE("CanvasPatternProto", CanvasPatternProto, CanvasPatternFunction)
+ 
+-/* Source for ImagePatternTable. Use "make hashtables" to regenerate.
+-   @begin ImagePatternTable 0
++/*
++   @begin CanvasPatternProtoTable 0
+    @end
+ */
+ 
+-ImagePattern::ImagePattern(HTMLElement *i, int repetitionType)
+-    : _rw(0), _rh(0)
+-{
+-    khtml::CachedImage *ci = static_cast<DOM::HTMLImageElementImpl*>(i->impl())->image();
+-    if (ci) {
+-        _pixmap = ci->pixmap();
+-        float w = _pixmap.width();
+-        float h = _pixmap.height();
+-    }
+-}
+-
+-QBrush ImagePattern::createPattern()
+-{
+-    if (_pixmap.isNull())
+-        return QBrush();
+-    return QBrush( _pixmap );
+-}
+-
+-bool ImagePattern::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot)
++ValueImp *CanvasPatternFunction::callAsFunction(ExecState *exec, ObjectImp *thisObj, const List &args)
+ {
+-    return getStaticValueSlot<ImagePattern, DOMObject>(exec, &ImagePatternTable, this, propertyName, slot);
++    assert(0);
++    return NULL;
+ }
+ 
+-ValueImp *ImagePattern::getValueProperty(ExecState *, int token) const
+-{
+-    return Undefined();
+-}
+-
+-void ImagePattern::put(ExecState *exec, const Identifier &propertyName, ValueImp *value, int attr)
+-{
+-    lookupPut<ImagePattern,DOMObject>(exec, propertyName, value, attr, &ImagePatternTable, this );
+-}
+-
+-void ImagePattern::putValueProperty(ExecState *exec, int token, ValueImp *value, int /*attr*/)
+-{
+-}
++CanvasPattern::CanvasPattern(ExecState* exec, DOM::CanvasPatternImpl* impl) :
++    WrapperBase(CanvasPatternProto::self(exec), impl)
++{}
+ 
+ } // namespace
++
++// kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/rendering/render_form.h
++++ b/khtml/rendering/render_form.h
+@@ -402,6 +402,12 @@
+ { 
+ public:
+     ListBoxWidget(QWidget* p): KListWidget(p) { m_kwp->setIsRedirected(true); }
++protected:
++    void scrollContentsBy(int, int)
++    {
++        viewport()->update();
++    }
++        
+ };
+ 
+ class RenderSelect : public RenderFormElement
+--- a/khtml/rendering/render_object.h
++++ b/khtml/rendering/render_object.h
+@@ -361,7 +361,7 @@
+     void updateBackgroundImages(RenderStyle* oldStyle);
+ 
+     virtual InlineBox* createInlineBox(bool makePlaceHolderBox, bool isRootLineBox);
+-    virtual void removeInlineBox(InlineBox* box) {}
++    virtual void removeInlineBox(InlineBox* /*box*/) {}
+ 
+     virtual short lineHeight( bool firstLine ) const;
+     virtual short verticalPositionHint( bool firstLine ) const;
+@@ -756,7 +756,7 @@
+     bool inPosObjectList() const { return m_inPosObjectList; }
+ 
+     virtual void deleteInlineBoxes(RenderArena* arena=0) {(void)arena;}
+-    virtual void dirtyInlineBoxes(bool fullLayout, bool isRootLineBox = false) {}
++    virtual void dirtyInlineBoxes(bool /*fullLayout*/, bool /*isRootLineBox*/ = false) {}
+     virtual void dirtyLinesFromChangedChild(RenderObject*) {}
+     virtual void detach( );
+ 
+--- a/khtml/rendering/font.h
++++ b/khtml/rendering/font.h
+@@ -31,9 +31,6 @@
+ #include <QtGui/QFontMetrics>
+ #include <QtGui/QPainter>
+ 
+-class Q3PaintDeviceMetrics;
+-
+-
+ namespace khtml
+ {
+ class RenderStyle;
+--- a/khtml/rendering/render_canvasimage.cpp
++++ b/khtml/rendering/render_canvasimage.cpp
+@@ -1,6 +1,7 @@
+ /*
+  * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
+  * Copyright (C) 2005 Zack Rusin <zack at kde.org>
++ * Copyright (C) 2007 Maksim Orlovich <maksim at kde.org>
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+@@ -41,6 +42,7 @@
+ #include <html/html_canvasimpl.h>
+ #include <xml/dom2_eventsimpl.h>
+ #include <html/html_documentimpl.h>
++#include <imload/canvasimage.h>
+ 
+ #include <math.h>
+ 
+@@ -49,65 +51,11 @@
+ 
+ // -------------------------------------------------------------------------
+ 
+-RenderCanvasImage::RenderCanvasImage(NodeImpl *_node)
+-    : RenderImage(_node), m_drawingContext(0),
+-      m_drawnImage(0), m_needsImageUpdate(0)
++RenderCanvasImage::RenderCanvasImage(DOM::HTMLCanvasElementImpl* canvasEl)
++    : RenderReplaced(canvasEl), imagePainter(canvasEl->getCanvasImage())
+ {
+-}
+-
+-RenderCanvasImage::~RenderCanvasImage()
+-{
+-    delete m_drawingContext; m_drawingContext = 0;
+-    delete m_drawnImage; m_drawnImage = 0;
+-}
+-
+-void RenderCanvasImage::createDrawingContext()
+-{
+-    delete m_drawingContext;
+-    delete m_drawnImage;
+-
+-    int cWidth = contentWidth();
+-    int cHeight = contentHeight();
+-    if ( !cWidth ) {
+-        cWidth = 300;
+-        setWidth( cWidth );
+-    }
+-    if ( !cHeight ) {
+-        cHeight = 200;
+-        setHeight( cHeight );
+-    }
+-    m_drawnImage = new QImage( cWidth, cHeight, QImage::Format_ARGB32_Premultiplied );
+-    //### clear color is bogus
+-    //m_drawnImage->fill( 0xffffffff );
+-    m_drawingContext = new QPainter( m_drawnImage );
+-    m_drawingContext->setRenderHint( QPainter::Antialiasing );
+-}
+-
+-QPainter *RenderCanvasImage::drawingContext()
+-{
+-    if (!m_drawingContext) {
+-        document()->updateLayout();
+-        createDrawingContext();
+-    }
+-    if ( !m_drawingContext->isActive() ) {
+-        //### clear color is bogus
+-        //m_drawnImage->fill( 0xffffffff );
+-        m_drawingContext->begin( m_drawnImage );
+-    }
+-
+-    return m_drawingContext;
+-}
+-
+-void RenderCanvasImage::setNeedsImageUpdate()
+-{
+-    m_needsImageUpdate = true;
+-    repaint();
+-}
+-
+-
+-void RenderCanvasImage::updateDrawnImage()
+-{
+-    m_drawingContext->end();
++    setIntrinsicWidth (element()->width());
++    setIntrinsicHeight(element()->height());
+ }
+ 
+ void RenderCanvasImage::paint(PaintInfo& i, int _tx, int _ty)
+@@ -126,9 +74,6 @@
+     if (i.phase != PaintActionForeground && i.phase != PaintActionSelection)
+         return;
+ 
+-    //if (!shouldPaintWithinRoot(i))
+-    //return;
+-
+     bool isPrinting = (i.p->device()->devType() == QInternal::Printer);
+     bool drawSelectionTint = (selectionState() != SelectionNone) && !isPrinting;
+     if (i.phase == PaintActionSelection) {
+@@ -141,7 +86,7 @@
+     int cWidth = contentWidth();
+     int cHeight = contentHeight();
+     if ( !cWidth )  cWidth = 300;
+-    if ( !cHeight ) cHeight = 200;
++    if ( !cHeight ) cHeight = 150;
+     int leftBorder = borderLeft();
+     int topBorder = borderTop();
+     int leftPad = paddingLeft();
+@@ -150,16 +95,9 @@
+     x += leftBorder + leftPad;
+     y += topBorder + topPad;
+ 
+-    if (m_needsImageUpdate) {
+-        updateDrawnImage();
+-        m_needsImageUpdate = false;
+-    }
+-    //qDebug()<<"drawing image "<<m_drawnImage;
+-    if (m_drawnImage) {
+-        HTMLCanvasElementImpl* i = (element() && element()->id() == ID_CANVAS ) ? static_cast<HTMLCanvasElementImpl*>(element()) : 0;
+-        p->drawImage( QRectF( x, y, cWidth, cHeight ), *m_drawnImage,
+-                      QRectF( 0, 0, m_drawnImage->width(), m_drawnImage->height() ) );
+-    }
++    element()->getContext2D()->commit(); // Make sure everything is up-to-date
++    imagePainter.setSize(QSize(cWidth, cHeight));
++    imagePainter.paint(x, y, p, 0, 0);
+ 
+     // if (drawSelectionTint) {
+ //         QBrush brush(selectionColor(p));
+@@ -173,30 +111,24 @@
+     KHTMLAssert( needsLayout());
+     KHTMLAssert( minMaxKnown() );
+ 
+-    short oldwidth = m_width;
+-    int oldheight = m_height;
+-
+     calcWidth();
+     calcHeight();
+ 
+-    if ( m_width != oldwidth || m_height != oldheight ) {
+-        createDrawingContext();
+-    }
++    setNeedsLayout(false);
++}
+ 
+-    // if they are variable width and we calculate a huge height or width, we assume they
+-    // actually wanted the intrinsic width.
+-    if ( m_width > 4096 && !style()->width().isFixed() )
+-	m_width = intrinsicWidth() + paddingLeft() + paddingRight() + borderLeft() + borderRight();
+-    if ( m_height > 2048 && !style()->height().isFixed() )
+-	m_height = intrinsicHeight() + paddingTop() + paddingBottom() + borderTop() + borderBottom();
+-
+-    // limit total size to not run out of memory when doing the xform call.
+-    if ( ( m_width * m_height > 4096*2048 ) &&
+-         ( contentWidth() > intrinsicWidth() || contentHeight() > intrinsicHeight() ) ) {
+-	float scale = ::sqrt( m_width*m_height / ( 4096.*2048. ) );
+-	m_width = (int) (m_width/scale);
+-	m_height = (int) (m_height/scale);
++void RenderCanvasImage::updateFromElement()
++{
++    int newWidth  = element()->width();
++    int newHeight = element()->height();
++    if (intrinsicHeight() != newHeight || intrinsicWidth()  != newWidth) {
++        setIntrinsicWidth (newWidth);
++        setIntrinsicHeight(newHeight);
++        setNeedsLayoutAndMinMaxRecalc();
+     }
+-
+-    setNeedsLayout(false);
++    
++    if (!needsLayout())
++        repaint();
+ }
++
++// kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/rendering/render_form.cpp
++++ b/khtml/rendering/render_form.cpp
+@@ -1195,11 +1195,18 @@
+         int width = 0;
+         int height = 0;
+ 
++        QAbstractItemModel *m = w->model();
++        QAbstractItemDelegate *d = w->itemDelegate();
++        QStyleOptionViewItem so;
++        so.font = w->font();
++
+         for ( int rowIndex = 0 ; rowIndex < w->count() ; rowIndex++ ) {
+-            QListWidgetItem* p = w->item(0);
+-            width = qMax(width, p->listWidget()->visualItemRect(p).width());
+-            height = qMax(height, p->listWidget()->visualItemRect(p).height());
++            QModelIndex mi = m->index(rowIndex, 0);
++            QSize s = d->sizeHint( so, mi);
++            width = qMax(width, s.width());
++            height = qMax(height, s.height());
+         }
++
+         if ( !height )
+             height = w->fontMetrics().height();
+         if ( !width )
+--- a/khtml/rendering/font.cpp
++++ b/khtml/rendering/font.cpp
+@@ -44,7 +44,6 @@
+ 
+ #include <QtGui/QPainter>
+ #include <QtGui/QFontDatabase>
+-#include <Qt3Support/Q3PaintDeviceMetrics>
+ 
+ using namespace khtml;
+ 
+--- a/khtml/rendering/render_replaced.cpp
++++ b/khtml/rendering/render_replaced.cpp
+@@ -161,12 +161,6 @@
+     detachCounters();
+     remove();
+ 
+-    InlineBox* ph = placeHolderBox();
+-    if (ph) {
+-        ph->detach(renderArena());
+-        setPlaceHolderBox( 0 );
+-    }
+-
+     if ( m_widget ) {
+         if ( m_view ) {
+             m_view->setWidgetVisible(this, false);
+@@ -575,12 +569,12 @@
+ 
+     widget->render( d, (buffered ? QPoint(0,0) : thePoint), r);
+ 
+-    if (!p->isActive())
++    if (!buffered) {
+         p->begin(x);
+-    p->setWorldMatrix( m );
+-    p->setClipRegion( rg );
+-
+-    if (buffered) {
++        if (!rg.isEmpty())
++            p->setClipRegion( rg );
++        p->setWorldMatrix( m );
++    } else {
+         // transfer results
+         p->drawPixmap(QPoint(tx, ty), static_cast<QPixmap&>(*d), r);
+         PaintBuffer::release();
+--- a/khtml/rendering/render_container.cpp
++++ b/khtml/rendering/render_container.cpp
+@@ -163,11 +163,12 @@
+ {
+     KHTMLAssert(oldChild->parent() == this);
+ 
+-    // So that we'll get the appropriate dirty bit set (either that a normal flow child got yanked or
+-    // that a positioned child got yanked).  We also repaint, so that the area exposed when the child
+-    // disappears gets repainted properly.
+     if ( document()->renderer() ) {
+-        oldChild->setNeedsLayoutAndMinMaxRecalc();
++        oldChild->setNeedsLayoutAndMinMaxRecalc(); // Dirty the containing block chain
++        oldChild->setNeedsLayout( false ); // The child itself does not need to layout - it's going away.
++
++        // Repaint, so that the area exposed when the child
++        // disappears gets repainted properly.
+         oldChild->repaint();
+ 
+         // Keep our layer hierarchy updated.
+@@ -192,6 +193,16 @@
+             canvas()->clearSelection();
+     }
+ 
++    // remove and detach the place holder box
++    if (oldChild->isBox()) {
++        RenderBox* rb = static_cast<RenderBox*>(oldChild);
++        InlineBox* ph = rb->placeHolderBox();
++        if (ph) {
++            ph->detach(rb->renderArena());
++            rb->setPlaceHolderBox( 0 );
++        }
++    }
++
+     // remove the child from the render-tree
+     if (oldChild->previousSibling())
+         oldChild->previousSibling()->setNextSibling(oldChild->nextSibling());
+@@ -483,11 +494,11 @@
+ 
+     newChild->setNeedsLayoutAndMinMaxRecalc(); // Goes up the containing block hierarchy.
+ 
+-    // We may supply the static position for an absolute positioned child.
+-    if (!normalChildNeedsLayout() && !newChild->isText()) {
+-        if (newChild->firstChild() || newChild->isPosWithStaticDim())
++    if (!normalChildNeedsLayout()) {
++        // We may supply the static position for an absolute positioned child.
++        if (newChild->firstChild() || newChild->isPosWithStaticDim() || !newChild->isPositioned())
+             setChildNeedsLayout(true);
+-        else if (newChild->isPositioned()) {
++        else {
+             assert(!newChild->inPosObjectList());
+             newChild->containingBlock()->insertPositionedObject(newChild);
+         }
+@@ -524,11 +535,12 @@
+         dirtyLinesFromChangedChild(child);
+ 
+     child->setNeedsLayoutAndMinMaxRecalc();
+-    // We may supply the static position for an absolute positioned child.
+-    if (!normalChildNeedsLayout() && !child->isText()) {
+-        if (child->firstChild() || child->isPosWithStaticDim())
++
++    if (!normalChildNeedsLayout()) {
++        // We may supply the static position for an absolute positioned child.
++        if (child->firstChild() || child->isPosWithStaticDim() || !child->isPositioned())
+             setChildNeedsLayout(true);
+-        else if (child->isPositioned()) {
++        else {
+             assert(!child->inPosObjectList());
+             child->containingBlock()->insertPositionedObject(child);
+         }
+--- a/khtml/rendering/render_canvasimage.h
++++ b/khtml/rendering/render_canvasimage.h
+@@ -1,6 +1,7 @@
+ /*
+- * Copyright (C) 2004 Apple Computer, Inc.  All rights reserved.
++ * Copyright (C) 2004, 2006, 2007 Apple Computer, Inc.  All rights reserved.
+  * Copyright (C) 2005 Zack Rusin <zack at kde.org>
++ * Copyright (C) 2007 Maksim Orlovich <maksim at kde.org>
+  *
+  * Redistribution and use in source and binary forms, with or without
+  * modification, are permitted provided that the following conditions
+@@ -28,44 +29,37 @@
+ #define RENDER_CANVASIMAGE_H
+ 
+ #include "html/html_elementimpl.h"
+-#include "rendering/render_image.h"
++#include "html/html_canvasimpl.h"
++#include "rendering/render_replaced.h"
+ #include "dom/dom_string.h"
+ 
+ #include <QtCore/QMap>
+ #include <QtGui/QImage>
+ #include <QtGui/QPainter>
+ 
++#include "imload/imagepainter.h"
++
++
+ namespace khtml {
+ 
+ 
+-class RenderCanvasImage : public RenderImage
++class RenderCanvasImage : public RenderReplaced
+ {
+ public:
+-    RenderCanvasImage(DOM::NodeImpl*);
+-    virtual ~RenderCanvasImage();
++    RenderCanvasImage(DOM::HTMLCanvasElementImpl*);
+ 
+     virtual const char *renderName() const { return "RenderCanvasImage"; }
+ 
+     virtual void paint(PaintInfo& i, int tx, int ty);
+-
+     virtual void layout();
+-
+-    void setNeedsImageUpdate();
++    virtual void updateFromElement();
+ 
+     // don't even think about making this method virtual!
+-    DOM::HTMLElementImpl* element() const
+-    { return static_cast<DOM::HTMLElementImpl*>(RenderObject::element()); }
+-
+-    void updateDrawnImage();
+-    QPainter *drawingContext();
++    DOM::HTMLCanvasElementImpl* element() const
++    { return static_cast<DOM::HTMLCanvasElementImpl*>(RenderObject::element()); }
+ 
+ private:
+-    void createDrawingContext();
+-
+-    QPainter *m_drawingContext;
+-    QImage   *m_drawnImage;
+-
+-    unsigned int m_needsImageUpdate:1;
++    khtmlImLoad::ImagePainter imagePainter;
+ };
+ 
+ 
+--- a/khtml/rendering/render_text.cpp
++++ b/khtml/rendering/render_text.cpp
+@@ -1202,7 +1202,7 @@
+     KHTMLAssert(!isBR() || (str->l == 1 && (*str->s) == '\n'));
+     KHTMLAssert(!str->l || str->s);
+ 
+-    setNeedsLayoutAndMinMaxRecalc();
++    if (parent()) setNeedsLayoutAndMinMaxRecalc();
+ #ifdef BIDI_DEBUG
+     QString cstr = QString::fromRawData(str->s, str->l);
+     kDebug( 6040 ) << "RenderText::setText( " << cstr.length() << " ) '" << cstr << "'";
+--- a/khtml/rendering/render_box.cpp
++++ b/khtml/rendering/render_box.cpp
+@@ -215,13 +215,6 @@
+     RenderArena* arena = renderArena();
+ 
+     detachRemainingChildren();
+-    
+-    InlineBox* ph = placeHolderBox();
+-    if (ph) {
+-        ph->detach(arena);
+-        setPlaceHolderBox( 0 );
+-    }
+-
+     RenderContainer::detach();
+ 
+     if (layer)
+--- a/khtml/CMakeLists.txt
++++ b/khtml/CMakeLists.txt
+@@ -211,6 +211,7 @@
+   ${CMAKE_SOURCE_DIR}/khtml/imload/image.cpp
+   ${CMAKE_SOURCE_DIR}/khtml/imload/imagemanager.cpp
+   ${CMAKE_SOURCE_DIR}/khtml/imload/animtimer.cpp
++  ${CMAKE_SOURCE_DIR}/khtml/imload/canvasimage.cpp  
+ )
+ 
+ # khtml/imload/decoders/Makefile.am: decoders
+@@ -227,7 +228,7 @@
+ 
+ include_directories( ${KDE4_KPARTS_INCLUDES} )
+ include_directories( ${CMAKE_BINARY_DIR}/kio/kssl )
+-include_directories( ${KDE4_KJS_INCLUDES} ${CMAKE_SOURCE_DIR}/kimgio ${CMAKE_SOURCE_DIR}/kio/kssl ${CMAKE_SOURCE_DIR}/kdeprint ${CMAKE_SOURCE_DIR}/interfaces ${CMAKE_SOURCE_DIR}/interfaces/kregexpeditor ${CMAKE_SOURCE_DIR}/kde3support ${CMAKE_SOURCE_DIR}/kde3support/kdeui ${CMAKE_BINARY_DIR}/phonon)
++include_directories( ${KDE4_KJS_INCLUDES} ${CMAKE_SOURCE_DIR}/kimgio ${CMAKE_SOURCE_DIR}/kio/kssl ${CMAKE_SOURCE_DIR}/interfaces ${CMAKE_SOURCE_DIR}/interfaces/kregexpeditor ${CMAKE_SOURCE_DIR}/kde3support ${CMAKE_SOURCE_DIR}/kde3support/kdeui ${CMAKE_BINARY_DIR}/phonon)
+ 
+ include_directories(
+   ${CMAKE_CURRENT_SOURCE_DIR}/misc
+@@ -292,7 +293,7 @@
+ 
+ kde4_add_library(khtml SHARED ${khtml_LIB_SRCS})
+ 
+-target_link_libraries(khtml ${KDE4_KPARTS_LIBS} ktexteditor kdeprint kde3support kjs ${KDE4_PHONON_LIBS} ${JPEG_LIBRARIES} ${GIF_LIBRARIES} ${PNG_LIBRARIES} )
++target_link_libraries(khtml ${KDE4_KPARTS_LIBS} ktexteditor kde3support kjs ${KDE4_PHONON_LIBS} ${JPEG_LIBRARIES} ${GIF_LIBRARIES} ${PNG_LIBRARIES} )
+ 
+ set_target_properties(khtml PROPERTIES VERSION ${KDE_NON_GENERIC_LIB_VERSION} SOVERSION ${KDE_NON_GENERIC_LIB_SOVERSION} )
+ 
+--- a/khtml/khtml_pagecache.cpp
++++ b/khtml/khtml_pagecache.cpp
+@@ -52,8 +52,8 @@
+   void addData(const QByteArray &data);
+   void endData();
+ 
+-  bool isComplete() {return m_complete;}
+-  QString fileName() {return m_fileName;}
++  bool isComplete() const {return m_complete;}
++  QString fileName() const {return m_fileName;}
+ 
+   KHTMLPageCacheDelivery *fetchData(QObject *recvObj, const char *recvSlot);
+ private:
+--- a/khtml/java/kjavaprocess.cpp
++++ b/khtml/java/kjavaprocess.cpp
+@@ -157,9 +157,8 @@
+     const QString size_str = QString("%1").arg( size, 8 );
+     kDebug(6100) << "KJavaProcess::storeSize, size = " << size_str;
+ 
+-    const char* size_ptr = size_str.toLatin1().constData();
+     for( int i = 0; i < 8; ++i )
+-        buff->data()[ i ] = size_ptr[i];
++        buff->data()[ i ] = size_str[i].toLatin1();
+ }
+ 
+ void KJavaProcess::send( char cmd_code, const QStringList& args )
+--- a/khtml/java/kjavaappletviewer.desktop
++++ b/khtml/java/kjavaappletviewer.desktop
+@@ -50,8 +50,8 @@
+ Name[ru]=Встраиваемый модуль просмотра аплетов Java
+ Name[se]=Vuojuhanláhkái Javaprográmmaš čájeheaddji
+ Name[sl]=Vgrajeni pregledovalnik vstavkov java
+-Name[sr]=Уграђени приказивач Java аплета
+-Name[sr at latin]=Ugrađeni prikazivač Java apleta
++Name[sr]=Угњеждени приказивач јаванских аплета
++Name[sr at latin]=Ugnježdeni prikazivač javanskih apleta
+ Name[sv]=Inbäddningsbar visare av Javaminiprogram
+ Name[ta]=உட்பொதிந்த ஜாவா சிறுநிரல் காட்டி
+ Name[te]=పొదిగిన జావా ఎపలెట్ చూపరి
+--- a/khtml/css/html4.css
++++ b/khtml/css/html4.css
+@@ -257,15 +257,15 @@
+         display: list-item;
+ }
+ 
+-ul   ul ul,   ul   ol ul,     ul   menu ul,   ul   dir ul, 
++ul   ul ul,   ul   ol ul,     ul   menu ul,   ul   dir ul,
+ ol   ul ul,   ol   ol ul,     ol   menu ul,   ol   dir ul,
+ menu ul ul,   menu ol ul,     menu menu ul,   menu dir ul,
+ dir  ul ul,   dir  ol ul,     dir  menu ul,   dir  dir ul,
+-ul   ul menu, ul   ol menu,   ul   menu menu, ul   dir menu, 
++ul   ul menu, ul   ol menu,   ul   menu menu, ul   dir menu,
+ ol   ul menu, ol   ol menu,   ol   menu menu, ol   dir menu,
+ menu ul menu, menu ol menu,   menu menu menu, menu dir menu,
+ dir  ul menu, dir  ol menu,   dir  menu menu, dir  dir menu,
+-ul   ul dir,  ul   ol dir,    ul   menu dir,  ul   dir dir, 
++ul   ul dir,  ul   ol dir,    ul   menu dir,  ul   dir dir,
+ ol   ul dir,  ol   ol dir,    ol   menu dir,  ol   dir dir,
+ menu ul dir,  menu ol dir,    menu menu dir,  menu dir dir,
+ dir  ul dir,  dir  ol dir,    dir  menu dir,  dir  dir dir
+@@ -273,10 +273,10 @@
+   list-style-type: square;
+ }
+ 
+-ul   ul, ul   ol, ul   menu, ul   dir,
+-ol   ul, ol   ol, ol   menu, ol   dir,
+-menu ul, menu ol, menu menu, menu dir,
+-dir  ul, dir  ol, dir  menu, dir  dir
++ul   ul, ul   menu, ul   dir,
++ol   ul, ol   menu, ol   dir,
++menu ul, menu menu, menu dir,
++dir  ul, dir  menu, dir  dir
+ {
+   list-style-type: circle;
+ }
+--- a/khtml/css/css_valueimpl.cpp
++++ b/khtml/css/css_valueimpl.cpp
+@@ -43,7 +43,6 @@
+ #include <kdebug.h>
+ #include <QtCore/QRegExp>
+ #include <QtGui/QPaintDevice>
+-#include <Qt3Support/Q3PaintDeviceMetrics>
+ 
+ // Hack for debugging purposes
+ extern DOM::DOMString getPropertyName(unsigned short id);
+--- a/khtml/css/cssproperties.h
++++ b/khtml/css/cssproperties.h
+@@ -138,6 +138,6 @@
+ #define CSS_PROP__KHTML_USER_INPUT 128
+ 
+ #define CSS_PROP_TOTAL 129
+-const size_t maxCSSPropertyNameLength = 17;
++const size_t maxCSSPropertyNameLength = 32;
+ #endif
+ 
+--- a/khtml/css/csshelper.cpp
++++ b/khtml/css/csshelper.cpp
+@@ -24,7 +24,6 @@
+ #include <QtGui/QFontMetrics>
+ #include <QtGui/QFontInfo>
+ #include <QtGui/QPaintDevice>
+-#include <Qt3Support/Q3PaintDeviceMetrics>
+ #include <QtGui/QFontDatabase>
+ 
+ #include <kcharsets.h>
+--- a/khtml/css/makeprop
++++ b/khtml/css/makeprop
+@@ -49,7 +49,7 @@
+ print ""; \
+ print "#define '$NS'CSS_PROP_TOTAL " (i + 1 - '$num') \
+ }' >> "$prefix"cssproperties.h
+-perl -e 'my $max = 0; while (<>) { chomp; $max = length if $ ax < length; } print "const size_t max'$NS'CSSPropertyNameLength = $max;\n"' < "$prefix"cssproperties.strip >> "$prefix"cssproperties.h
++perl -e 'my $max = 0; while (<>) { chomp; $max = length if $max < length; } print "const size_t max'$NS'CSSPropertyNameLength = $max;\n"' < "$prefix"cssproperties.strip >> "$prefix"cssproperties.h
+ 
+ gperf -a -L 'ANSI-C' -E -C -c -o -t -k '*' -NfindProp"$NS" -Hhash_prop"$prefix" -Wwordlist_prop"$prefix" -D -s 2 "$prefix"cssproperties.gperf > "$prefix"cssproperties.c || exit 1
+ echo -e '#endif\n' >> "$prefix"cssproperties.h
+--- a/khtml/khtml_printsettings.cpp
++++ b/khtml/khtml_printsettings.cpp
+@@ -24,7 +24,7 @@
+ #include <QtGui/QLayout>
+ 
+ KHTMLPrintSettings::KHTMLPrintSettings(QWidget *parent)
+-    : KPrintDialogPage(parent)
++    : QWidget(parent)
+ {
+ 	//WhatsThis strings.... (added by pfeifle at kde.org)
+ 	QString whatsThisPrintImages = i18n( "<qt>"
+@@ -67,7 +67,7 @@
+ 		"certainly use much more toner or ink."
+ 		"</p>"
+ 						" </qt>" );
+-	setTitle(i18n("HTML Settings"));
++	setWindowTitle(i18n("HTML Settings"));
+ 
+ 	m_printfriendly = new QCheckBox(i18n("Printer friendly mode (black text, no background)"), this);
+ 	m_printfriendly->setWhatsThis(whatsThisPrinterFriendlyMode);
+@@ -80,8 +80,8 @@
+ 	m_printheader->setChecked(true);
+ 
+ 	QVBoxLayout	*l0 = new QVBoxLayout(this);
+-  l0->setMargin(0);
+-  l0->setSpacing(10);
++	l0->setMargin(0);
++	l0->setSpacing(10);
+ 	l0->addWidget(m_printfriendly);
+ 	l0->addWidget(m_printimages);
+ 	l0->addWidget(m_printheader);
+@@ -92,18 +92,20 @@
+ {
+ }
+ 
+-void KHTMLPrintSettings::getOptions(QMap<QString,QString>& opts, bool /*incldef*/)
++bool KHTMLPrintSettings::printFriendly()
+ {
+-	opts["app-khtml-printfriendly"] = (m_printfriendly->isChecked() ? "true" : "false");
+-	opts["app-khtml-printimages"] = (m_printimages->isChecked() ? "true" : "false");
+-	opts["app-khtml-printheader"] = (m_printheader->isChecked() ? "true" : "false");
++	return m_printfriendly->isChecked();
+ }
+ 
+-void KHTMLPrintSettings::setOptions(const QMap<QString,QString>& opts)
++bool KHTMLPrintSettings::printImages()
+ {
+-	m_printfriendly->setChecked(opts["app-khtml-printfriendly"] != "false");
+-	m_printimages->setChecked(opts["app-khtml-printimages"] != "false");
+-	m_printheader->setChecked(opts["app-khtml-printheader"] != "false");
++	return m_printimages->isChecked();
+ }
+ 
++bool KHTMLPrintSettings::printHeader()
++{
++	return m_printheader->isChecked();
++}
++
++
+ #include "khtml_printsettings.moc"
+--- a/khtml/xml/dom2_eventsimpl.cpp
++++ b/khtml/xml/dom2_eventsimpl.cpp
+@@ -30,6 +30,7 @@
+ #include "dom_stringimpl.h"
+ #include "dom_nodeimpl.h"
+ #include "dom_docimpl.h"
++#include "misc/translator.h"
+ #include <rendering/render_layer.h>
+ #include <khtmlview.h>
+ 
+@@ -492,47 +493,6 @@
+ }
+ 
+ //---------------------------------------------------------------------------------------------
+-/* This class is used to do remapping between different encodings reasonably compactly */
+-
+-template<typename L, typename R, typename MemL>
+-class IDTranslator
+-{
+-public:
+-    struct Info {
+-        MemL l;
+-        R    r;
+-    };
+-
+-    IDTranslator(const Info* table) {
+-        for (const Info* cursor = table; cursor->l; ++cursor) {
+-            m_lToR.insert(cursor->l,  cursor->r);
+-            m_rToL.insert(cursor->r,  cursor->l);
+-        }
+-    }
+-
+-    L toLeft(R r) {
+-        typename QMap<R,L>::iterator i( m_rToL.find(r) );
+-        if (i != m_rToL.end())
+-            return *i;
+-        return L();
+-    }
+-
+-    R toRight(L l) {
+-        typename QMap<L,R>::iterator i = m_lToR.find(l);
+-        if (i != m_lToR.end())
+-            return *i;
+-        return R();
+-    }
+-
+-private:
+-    QMap<L, R> m_lToR;
+-    QMap<R, L> m_rToL;
+-};
+-
+-#define MAKE_TRANSLATOR(name,L,R,MR,table) static IDTranslator<L,R,MR>* s_##name; \
+-    static IDTranslator<L,R,MR>* name() { if (!s_##name) s_##name = new IDTranslator<L,R,MR>(table); \
+-        return s_##name; }
+-//---------------------------------------------------------------------------------------------
+ 
+ /* Mapping between special Qt keycodes and virtual DOM codes */
+ IDTranslator<unsigned, unsigned, unsigned>::Info virtKeyToQtKeyTable[] =
+--- a/khtml/imload/imagepainter.cpp
++++ b/khtml/imload/imagepainter.cpp
+@@ -96,6 +96,25 @@
+     }
+ 
+     PixmapPlane* plane = image->getSize(size);
++
++    if (plane->animProvider)
++    {
++        // Clip the request ourselves when animating..
++        QSize imageSize = image->size();
++        
++        if (width == -1)
++            width  = imageSize.width();
++        if (height == -1)
++            height = imageSize.height();
++
++        QRect clippedRect = QRect(0, 0, imageSize.width(), imageSize.height())
++                            & QRect(sx, sy, width, height);
++        plane->animProvider->paint(dx, dy, p, clippedRect.x(), clippedRect.y(),
++                                          clippedRect.width(), clippedRect.height());
++        return;
++    }
++
++    // non-animated, go straight to PixmapPlane; it clips itself
+     plane->paint(dx, dy, p, sx, sy, width, height);
+ }
+ 
+--- a/khtml/imload/imageplane.h
++++ b/khtml/imload/imageplane.h
+@@ -42,6 +42,8 @@
+ 
+     ImagePlane(unsigned int _width, unsigned int _height):Plane(_width, _height)
+     {}
++    
++    virtual void flushCache() = 0;
+ 
+     /**
+      Returns true if the given pixmap tile is up-to-date.
+--- a/khtml/imload/pixmapplane.cpp
++++ b/khtml/imload/pixmapplane.cpp
+@@ -26,12 +26,13 @@
+ 
+ #include <QPainter>
+ 
++
+ namespace khtmlImLoad {
+ 
+ void PixmapPlane::paint(int dx, int dy, QPainter* p,
+-                  int sx, int sy, int sWidth, int sHeight, bool useAnimProvider)
++                  int sx, int sy, int sWidth, int sHeight)
+ {
+-    //Do some basic clipping, discarding invalid requests and adjusting sizes of others
++    //Do some basic clipping, discarding invalid requests and adjusting sizes of others.
+     if (sy >= (int)height)
+         return;
+     if (sx >= (int)width)
+@@ -54,12 +55,6 @@
+     sHeight = ey - sy + 1;
+     sWidth  = ex - sx + 1;
+ 
+-    if (animProvider && useAnimProvider)
+-    {
+-        animProvider->paint(dx, dy, p, sx, sy, sWidth, sHeight);
+-        return;
+-    }
+-
+     //Calculate the range of tiles to paint, in both directions
+     unsigned int startTileY = sy / Tile::TileSize;
+     unsigned int endTileY   = ey / Tile::TileSize;
+@@ -111,12 +106,13 @@
+             {
+                 //Scan the versions to see how much to paint.
+                 unsigned int h = 0;
+-                for (h = 0; h < Tile::TileSize && tile.versions[h]; ++h)
+-                {}
++                for (int checkY = startY; checkY < Tile::TileSize && tile.versions[checkY]; ++checkY)
++                    ++h;
+ 
+-                //Draw it.
+-                p->drawPixmap(paintX, paintY, *tile.pixmap, startX, startY,
+-                              paintWidth, qMin(h, paintHeight));
++                //Draw it, if there is anything (note: Qt would interpret 0 as everything)
++                if (h)
++                    p->drawPixmap(paintX, paintY, *tile.pixmap, startX, startY,
++                                  paintWidth, qMin(h, paintHeight));
+             }
+             paintX += paintWidth;
+         }
+@@ -124,6 +120,18 @@
+     }
+ }
+ 
++void PixmapPlane::flushCache()
++{
++    parent->flushCache();
++    for (unsigned tileX = 0; tileX < tilesWidth; ++tileX) {
++        for (unsigned tileY = 0; tileY < tilesHeight; ++tileY) {
++            PixmapTile& pixTile = tiles.at(tileX, tileY);
++            if (pixTile.pixmap)
++                ImageManager::pixmapCache()->removeEntry(&pixTile);
++        }
++    }
++}
++
+ }
+ 
+ // kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/imload/scaledimageplane.h
++++ b/khtml/imload/scaledimageplane.h
+@@ -67,7 +67,8 @@
+     unsigned int* yScaleTable;
+ public:
+     virtual ~ScaledImagePlane();
+-    
++
++    virtual void flushCache();
+ 
+     ScaledImagePlane(unsigned int _width, unsigned int _height, RawImagePlane* _parent):
+             ImagePlane(_width, _height), parent(_parent), tiles(tilesWidth, tilesHeight)
+--- /dev/null
++++ b/khtml/imload/canvasimage.h
+@@ -0,0 +1,54 @@
++/*
++    KHTML image displaying library.
++
++    Copyright (C) 2007 Maks Orlovich (maksim at kde.org)
++
++    Permission is hereby granted, free of charge, to any person obtaining a copy
++    of this software and associated documentation files (the "Software"), to deal
++    in the Software without restriction, including without limitation the rights
++    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++    copies of the Software, and to permit persons to whom the Software is
++    furnished to do so, subject to the following conditions:
++
++    The above copyright notice and this permission notice shall be included in
++    all copies or substantial portions of the Software.
++
++    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++    AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
++    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++
++*/
++#ifndef IMLOAD_CANVAS_IMAGE_H
++#define IMLOAD_CANVAS_IMAGE_H
++
++class QImage;
++
++#include "image.h"
++
++namespace khtmlImLoad {
++
++/**
++  A CanvasImage encapsulates a QImage that will be painted on externally,
++  in order to permit scaling of it.  When drawing happens, however, the client must call the
++  contentUpdated() method to avoid out-of-date data being painted. 
++ */
++class CanvasImage : public Image
++{
++public:
++    CanvasImage(int width, int height);
++    void contentUpdated();
++    void resizeImage(int width, int height);
++private:
++    void setupOriginalPlane(int width, int height);
++    void flushAllCaches();
++    static ImageOwner* trivialOwner();
++    static ImageOwner* s_trivialOwner;
++};
++
++}
++
++#endif
++// kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/imload/image.h
++++ b/khtml/imload/image.h
+@@ -81,6 +81,12 @@
+      Returns true if the image has been fully loaded
+     */
+     bool complete() const;
++
++    /**
++     Returns the image of basic content. Should be treated as READ ONLY.
++     (but see CanvasImage)
++    */
++    QImage* qimage()  const;
+ private:
+     //Interface to the loader.
+     friend class ImageLoader;
+@@ -117,7 +123,7 @@
+     void refSize  (QSize size);
+     PixmapPlane* getSize(QSize size);
+ 
+-private:
++protected:
+     ImageOwner * owner;
+ 
+     //Update reporting to owner
+@@ -138,7 +144,6 @@
+     */
+     void notifyPerformUpdate();
+ 
+-
+     //Loader stuff.
+     QByteArray bufferPreDetect;
+     ImageLoader* loader;
+--- a/khtml/imload/imageplane.cpp
++++ b/khtml/imload/imageplane.cpp
+@@ -53,7 +53,7 @@
+                    unsigned char* versions)
+ {
+     //Determine the range which needs pushing.
+-    unsigned int first = 0xFFFF, last;
++    unsigned int first = 0xFFFF, last = 0;
+     if (!tile->pixmap)
+     {
+         //### this can be wasteful if we do conversion
+@@ -64,7 +64,8 @@
+     else
+     {
+         ImageManager::pixmapCache()->touchEntry(tile);
+-    
++
++        // figure out the dirty range
+         for (unsigned int line = 0; line < tileHeight(tileY); ++line)
+         {
+             if (versions[line] > tile->versions[line])
+@@ -72,12 +73,13 @@
+                 last = line;
+                 if (first == 0xFFFF)
+                     first = line;
+-                //Will fix it.
+-                tile->versions[line] = versions[line];
+             }
+         }
+     }
+ 
++    // Now tile will be up-to-date, so sync up w/our versions array
++    std::memcpy(tile->versions, versions, Tile::TileSize);
++
+     assert( tile->pixmap );
+ 
+     //Special case, hopefully-fast path: if we just wants to push
+--- a/khtml/imload/decoders/gifloader.cpp
++++ b/khtml/imload/decoders/gifloader.cpp
+@@ -116,7 +116,7 @@
+     {
+         QRect frameGeom = frameInfo[frame].geom;
+ 
+-        // Take the passed paint rectangle in gif screen coordinates, and 
++        // Take the passed paint rectangle in gif screen coordinates, and
+         // clip it to the frame's geometry
+         QRect screenPaintRect = QRect(sx, sy, width, height) & frameGeom;
+ 
+@@ -125,13 +125,13 @@
+ 
+         curFrame->paint(dx + screenPaintRect.x() - sx, dy + screenPaintRect.y() - sy, p,
+                 framePaintRect.x(), framePaintRect.y(),
+-                framePaintRect.width(), framePaintRect.height(), false /* don't get back to us!*/);
++                framePaintRect.width(), framePaintRect.height());
+     }
+ 
+     // Renders current gif screen state on the painter
+     void renderCurScreen(int dx, int dy, QPainter* p, int sx, int sy, int width, int height)
+     {
+-        // Depending on the previous frame's mode, we make have to cut out a hole when 
++        // Depending on the previous frame's mode, we may have to cut out a hole when
+         // painting the canvas, since if previous frame had BG disposal, we have to do OpSrc.
+         if (previousWasBG)
+         {
+@@ -206,7 +206,7 @@
+ 
+         // Move over to next frame if need be, incorporating 
+         // the change effect of current one onto the screen.
+-        if (shouldSwitchFrame) 
++        if (shouldSwitchFrame)
+         {
+             updateScreenAfterDispose();
+ 
+--- a/khtml/imload/scaledimageplane.cpp
++++ b/khtml/imload/scaledimageplane.cpp
+@@ -56,6 +56,17 @@
+ }
+ //### is special version for TileSize worth it?
+ 
++void ScaledImagePlane::flushCache()
++{
++    for (unsigned tileX = 0; tileX < tilesWidth; ++tileX) {
++        for (unsigned tileY = 0; tileY < tilesHeight; ++tileY) {
++            ImageTile& imageTile = tiles.at(tileX, tileY);
++            if (!imageTile.image.isNull())
++                ImageManager::imageCache()->removeEntry(&imageTile);
++        }
++    }
++}
++
+ void ScaledImagePlane::ensureUpToDate(unsigned int tileX, unsigned int tileY,
+                             PixmapTile* tile)
+ {
+@@ -77,6 +88,7 @@
+         int origLine = yScaleTable[line + tileY*Tile::TileSize];
+         if (imageTile.versions[line] < parent->versions[origLine])
+         {
++            imageTile.versions[line] = parent->versions[origLine];
+             if (parent->format.depth() == 1)
+                 scaleLoop<quint8>(&imageTile.image, xScaleTable, line, 
+                                 parent->image, origLine, tileX, tileY);
+--- /dev/null
++++ b/khtml/imload/canvasimage.cpp
+@@ -0,0 +1,101 @@
++/*
++    KHTML image displaying library.
++
++    Copyright (C) 2007 Maks Orlovich (maksim at kde.org)
++
++    Permission is hereby granted, free of charge, to any person obtaining a copy
++    of this software and associated documentation files (the "Software"), to deal
++    in the Software without restriction, including without limitation the rights
++    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++    copies of the Software, and to permit persons to whom the Software is
++    furnished to do so, subject to the following conditions:
++
++    The above copyright notice and this permission notice shall be included in
++    all copies or substantial portions of the Software.
++
++    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
++    AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
++    AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
++    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
++
++*/
++#include "canvasimage.h"
++#include "imageowner.h"
++#include "pixmapplane.h"
++#include "rawimageplane.h"
++#include "scaledimageplane.h"
++
++namespace khtmlImLoad {
++
++class TrivialImageOwner : public ImageOwner
++{
++public:
++    virtual void imageHasGeometry(Image*, int, int) {}
++    virtual void imageChange(Image*, QRect) {}
++    virtual void imageError(Image*) {};
++    virtual void imageDone(Image*) {};
++};
++
++ImageOwner* CanvasImage::s_trivialOwner = 0;
++
++ImageOwner* CanvasImage::trivialOwner()
++{
++    if (!s_trivialOwner)
++        s_trivialOwner = new TrivialImageOwner;
++    return s_trivialOwner;
++}
++
++void CanvasImage::setupOriginalPlane(int width, int height)
++{
++    fullyDecoded = true;
++    this->width  = width;
++    this->height = height;
++    
++    RawImagePlane* imgPlane = new RawImagePlane(width, height, 1 /*already "loaded"*/);
++    imgPlane->image = QImage(width, height, QImage::Format_ARGB32_Premultiplied);
++    original = new PixmapPlane(width, height, imgPlane);
++    
++}
++
++CanvasImage::CanvasImage(int width, int height): Image(trivialOwner())
++{
++    setupOriginalPlane(width, height);
++}
++
++void CanvasImage::contentUpdated()
++{
++    flushAllCaches();
++}
++
++void CanvasImage::flushAllCaches()
++{
++    // Flush all the planes, including any scaled ones, etc.
++    original->flushCache();
++
++    for (QMap<QPair<int, int>, PixmapPlane*>::iterator i = scaled.begin(); i != scaled.end(); ++i)
++        i.value()->flushCache();
++}
++
++void CanvasImage::resizeImage(int width, int height)
++{
++    // Dump any cached info, it's useless
++    flushAllCaches();
++
++    // Create a new master pixmap and raw image planes
++    delete original;
++    setupOriginalPlane(width, height);
++    RawImagePlane* imgPlane = static_cast<RawImagePlane*>(original->parent);
++
++    // Now go through the scaling cache, and fix things up.
++    for (QMap<QPair<int, int>, PixmapPlane*>::iterator i = scaled.begin(); i != scaled.end(); ++i) {
++        PixmapPlane* scaledPix = i.value();
++        delete scaledPix->parent;
++        scaledPix->parent = new ScaledImagePlane(scaledPix->width, scaledPix->height, imgPlane);
++    }
++}
++
++}
++
++// kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/imload/rawimageplane.h
++++ b/khtml/imload/rawimageplane.h
+@@ -38,17 +38,20 @@
+     QImage image;
+     unsigned char* versions; //Versions of scanlines --- node that this is is padded to be of width / by 64
+ 
+-    RawImagePlane(unsigned int _width, unsigned int _height):
++    RawImagePlane(unsigned int _width, unsigned int _height, char initialVer = 0):
+         ImagePlane(_width, _height)
+     {
+         versions = new unsigned char[tilesHeight * Tile::TileSize];
+-        std::memset(versions, 0, tilesHeight * Tile::TileSize);
++        std::memset(versions, initialVer, tilesHeight * Tile::TileSize);
+     }
+ 
+     ~RawImagePlane()
+     {
+         delete[] versions;
+     }
++    
++    virtual void flushCache()
++    {} // Nothing caches
+ 
+     /**
+      Returns true if the given pixmap tile is up-to-date.
+--- a/khtml/imload/image.cpp
++++ b/khtml/imload/image.cpp
+@@ -404,6 +404,14 @@
+     }
+ }
+ 
++QImage* Image::qimage() const
++{
++    if (!original || !original->parent)
++        return 0;
++
++    return &static_cast<RawImagePlane*>(original->parent)->image;
++}
++
+ }
+ 
+ // kate: indent-width 4; replace-tabs on; tab-width 4; space-indent on;
+--- a/khtml/imload/pixmapplane.h
++++ b/khtml/imload/pixmapplane.h
+@@ -55,6 +55,8 @@
+ 
+     PixmapPlane*  nextFrame;
+     AnimProvider* animProvider;
++    
++    void flushCache();
+ 
+     ~PixmapPlane()
+     {
+@@ -68,7 +70,7 @@
+      The source rectangle starts at sx, sy and has dimension width * height.
+     */
+     void paint(int dx, int dy, QPainter* p,
+-               int sx, int sy, int width = -1, int height = -1, bool useAnimProvider = true);
++               int sx, int sy, int width = -1, int height = -1);
+ };
+ 
+ }
+--- a/cmake/modules/FindSoprano.cmake
++++ b/cmake/modules/FindSoprano.cmake
+@@ -1,11 +1,11 @@
+ 
+ 
+-if(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_INDEX_LIBRARIES)
++if(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_INDEX_LIBRARIES AND SOPRANO_SERVER_LIBRARIES)
+ 
+   # read from cache
+   set(Soprano_FOUND TRUE)
+ 
+-else(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_INDEX_LIBRARIES)
++else(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_INDEX_LIBRARIES AND SOPRANO_SERVER_LIBRARIES)
+   INCLUDE(FindLibraryWithDebug)
+ 
+   FIND_PATH(SOPRANO_INCLUDE_DIR 
+@@ -24,7 +24,8 @@
+     ${LIB_INSTALL_DIR}
+   )
+ 
+-  FIND_LIBRARY_WITH_DEBUG(SOPRANO_INDEX_LIBRARIES
++
++  FIND_LIBRARY_WITH_DEBUG(SOPRANO_INDEX_LIBRARIES 
+     WIN32_DEBUG_POSTFIX d
+     NAMES
+     sopranoindex
+@@ -33,7 +34,7 @@
+     ${LIB_INSTALL_DIR}
+     )
+ 
+-  FIND_LIBRARY_WITH_DEBUG(SOPRANO_CLIENT_LIBRARIES
++  FIND_LIBRARY_WITH_DEBUG(SOPRANO_CLIENT_LIBRARIES 
+     WIN32_DEBUG_POSTFIX d
+     NAMES
+     sopranoclient
+@@ -42,11 +43,32 @@
+     ${LIB_INSTALL_DIR}
+     )
+ 
++  FIND_LIBRARY_WITH_DEBUG(SOPRANO_SERVER_LIBRARIES 
++    WIN32_DEBUG_POSTFIX d
++    NAMES
++    sopranoserver
++    PATHS
++    ${KDE4_LIB_DIR}
++    ${LIB_INSTALL_DIR}
++    )
++
++  # check for all the libs as required to make sure that we do not try to compile with an old version
++  # FIXME: introduce a Soprano version check
+   if(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_CLIENT_LIBRARIES AND SOPRANO_INDEX_LIBRARIES)
+     set(Soprano_FOUND TRUE)
++  endif(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_CLIENT_LIBRARIES AND SOPRANO_INDEX_LIBRARIES)
++
++  if(Soprano_FOUND AND SOPRANO_INDEX_LIBRARIES)
+     set(SopranoIndex_FOUND TRUE)
++  endif(Soprano_FOUND AND SOPRANO_INDEX_LIBRARIES)
++
++  if(Soprano_FOUND AND SOPRANO_CLIENT_LIBRARIES)
+     set(SopranoClient_FOUND TRUE)
+-  endif(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_CLIENT_LIBRARIES AND SOPRANO_INDEX_LIBRARIES)
++  endif(Soprano_FOUND AND SOPRANO_CLIENT_LIBRARIES)
++
++  if(Soprano_FOUND AND SOPRANO_SERVER_LIBRARIES)
++    set(SopranoServer_FOUND TRUE)
++  endif(Soprano_FOUND AND SOPRANO_SERVER_LIBRARIES)
+   
+   if(Soprano_FOUND)
+     if(NOT Soprano_FIND_QUIETLY)
+@@ -72,4 +94,4 @@
+     endif(Soprano_FIND_REQUIRED)
+   endif(Soprano_FOUND)
+ 
+-endif(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_INDEX_LIBRARIES)
++endif(SOPRANO_INCLUDE_DIR AND SOPRANO_LIBRARIES AND SOPRANO_INDEX_LIBRARIES AND SOPRANO_SERVER_LIBRARIES)
+--- a/cmake/modules/FindKipi.cmake
++++ b/cmake/modules/FindKipi.cmake
+@@ -19,8 +19,8 @@
+   message(STATUS "Check Kipi library in local sub-folder...")
+ 
+   # Check if library is not in local sub-folder
+-  
+-  FIND_FILE(KIPI_LOCAL_FOUND libkipi/version.h.cmake ${CMAKE_SOURCE_DIR}/libkipi ${CMAKE_SOURCE_DIR}/libs/libkipi NO_DEFAULT_PATH)
++
++  find_file (KIPI_LOCAL_FOUND libkipi/version.h.cmake ${CMAKE_SOURCE_DIR}/libkipi ${CMAKE_SOURCE_DIR}/libs/libkipi NO_DEFAULT_PATH)
+ 
+   if (KIPI_LOCAL_FOUND)
+ 
+@@ -29,22 +29,22 @@
+     set(KIPI_LIBRARIES kipi)
+     message(STATUS "Found Kipi library in local sub-folder: ${KIPI_LIBRARIES}")
+     set(KIPI_FOUND TRUE)
+-    MARK_AS_ADVANCED(KIPI_INCLUDE_DIR KIPI_LIBRARIES)
++    mark_as_advanced(KIPI_INCLUDE_DIR KIPI_LIBRARIES)
+ 
+   else(KIPI_LOCAL_FOUND)
+ 
+-    if(NOT WIN32) 
++    if(NOT WIN32)
+       message(STATUS "Check Kipi library using pkg-config...")
+ 
+       # use pkg-config to get the directories and then use these values
+       # in the FIND_PATH() and FIND_LIBRARY() calls
+       INCLUDE(UsePkgConfig)
+-    
++
+       PKGCONFIG(libkipi _KIPIIncDir _KIPILinkDir _KIPILinkFlags _KIPICflags)
+-    
++
+       if(_KIPILinkFlags)
+         # query pkg-config asking for a libkipi >= 0.2.0
+-        EXEC_PROGRAM(${PKGCONFIG_EXECUTABLE} ARGS --atleast-version=0.2.0 libkipi RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )
++        exec_program(${PKGCONFIG_EXECUTABLE} ARGS --atleast-version=0.2.0 libkipi RETURN_VALUE _return_VALUE OUTPUT_VARIABLE _pkgconfigDevNull )
+         if(_return_VALUE STREQUAL "0")
+             message(STATUS "Found libkipi release >= 0.2.0")
+             set(KIPI_VERSION_GOOD_FOUND TRUE)
+@@ -58,20 +58,14 @@
+         set(KIPI_FOUND FALSE)
+       endif(_KIPILinkFlags)
+     else(NOT WIN32)
+-	set(KIPI_VERSION_GOOD_FOUND TRUE)
++      set(KIPI_VERSION_GOOD_FOUND TRUE)
+     endif(NOT WIN32)
+     if(KIPI_VERSION_GOOD_FOUND)
+         set(KIPI_DEFINITIONS ${_KIPICflags})
+-    
+-        FIND_PATH(KIPI_INCLUDE_DIR libkipi/version.h
+-        ${_KIPIIncDir}
+-        )
+-    
+-        FIND_LIBRARY(KIPI_LIBRARIES NAMES kipi
+-        PATHS
+-        ${_KIPILinkDir}
+-        )
+-    
++
++        find_path(KIPI_INCLUDE_DIR NAMES libkipi/version.h PATHS ${KDE4_INCLUDE_DIR} ${_KIPIIncDir})
++        find_library(KIPI_LIBRARIES NAMES kipi PATHS ${KDE4_LIB_DIR} ${_KIPILinkDir})
++
+         if (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES)
+             set(KIPI_FOUND TRUE)
+         endif (KIPI_INCLUDE_DIR AND KIPI_LIBRARIES)
+--- a/cmake/modules/FindStrigi.cmake
++++ b/cmake/modules/FindStrigi.cmake
+@@ -14,14 +14,17 @@
+ 
+ if (WIN32)
+   file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _program_FILES_DIR)
++  string(REPLACE "\\" "/" _program_FILES_DIR "${_program_FILES_DIR}")
+   set(STRIGI_NO_DEF_PATH "")
+ else(WIN32)
+   set(STRIGI_NO_DEF_PATH NO_DEFAULT_PATH)
+ endif(WIN32)
+ 
++string(REPLACE "\\" "/" strigi_home "$ENV{STRIGI_HOME}")
++
+ find_path(STRIGI_INCLUDE_DIR strigi/streamanalyzer.h
+   PATHS
+-  $ENV{STRIGI_HOME}/include
++  ${strigi_home}/include
+   ${CMAKE_INSTALL_PREFIX}/include
+   ${_program_FILES_DIR}/strigi/include
+   ${STRIGI_NO_DEF_PATH}
+@@ -31,7 +34,7 @@
+   WIN32_DEBUG_POSTFIX d
+   NAMES streamanalyzer
+   PATHS
+-  $ENV{STRIGI_HOME}/lib
++  ${strigi_home}/lib
+   ${CMAKE_INSTALL_PREFIX}/lib
+   ${_program_FILES_DIR}/strigi/lib
+   ${STRIGI_NO_DEF_PATH}
+@@ -41,7 +44,7 @@
+   WIN32_DEBUG_POSTFIX d
+   NAMES streams
+   PATHS
+-  $ENV{STRIGI_HOME}/lib
++  ${strigi_home}/lib
+   ${CMAKE_INSTALL_PREFIX}/lib
+   ${_program_FILES_DIR}/strigi/lib
+   ${STRIGI_NO_DEF_PATH}
+@@ -51,7 +54,7 @@
+   WIN32_DEBUG_POSTFIX d
+   NAMES strigiqtdbusclient
+   PATHS
+-  $ENV{STRIGI_HOME}/lib
++  ${strigi_home}/lib
+   ${CMAKE_INSTALL_PREFIX}/lib
+   ${_program_FILES_DIR}/strigi/lib
+   ${STRIGI_NO_DEF_PATH}
+--- a/cmake/modules/FindQCA2.cmake
++++ b/cmake/modules/FindQCA2.cmake
+@@ -26,7 +26,7 @@
+   INCLUDE(UsePkgConfig)
+ 
+   IF (NOT WIN32)
+-    PKGCONFIG(qca QCA2_INCLUDE_DIR _Qca2LinkDir _Qca2LinkFlags _Qca2Cflags)
++    PKGCONFIG(qca2 QCA2_INCLUDE_DIR _Qca2LinkDir _Qca2LinkFlags _Qca2Cflags)
+ 
+     set(QCA2_DEFINITIONS ${_Qca2Cflags})
+ 
+@@ -40,10 +40,10 @@
+                     WIN32_DEBUG_POSTFIX d
+                     NAMES qca)
+ 
+-    FIND_PATH(QCA2_INCLUDE_DIR QtCrypto/qca.h)
+-    IF(QCA2_INCLUDE_DIR)
+-      SET(QCA2_INCLUDE_DIR ${QCA2_INCLUDE_DIR}/QtCrypto CACHE TYPE PATH FORCE)
+-    ENDIF(QCA2_INCLUDE_DIR)
++    FIND_PATH(QCA2_INCLUDE_DIR_tmp QtCrypto/qca.h)
++    IF(QCA2_INCLUDE_DIR_tmp)
++      SET(QCA2_INCLUDE_DIR ${QCA2_INCLUDE_DIR_tmp}/QtCrypto CACHE TYPE PATH FORCE)
++    ENDIF(QCA2_INCLUDE_DIR_tmp)
+   ENDIF (NOT WIN32)
+ 
+ 
+--- a/cmake/modules/KDE4Macros.cmake
++++ b/cmake/modules/KDE4Macros.cmake
+@@ -300,7 +300,7 @@
+ 
+    if(_installDest)
+       file(GLOB _images *.png)
+-      install(FILES ${_docs} ${_images} DESTINATION ${_installDest}/${dirname})
++      install(FILES ${_doc} ${_docs} ${_images} DESTINATION ${_installDest}/${dirname})
+       # TODO symlinks on non-unix platforms
+       if (UNIX)
+          # execute some cmake code on make install which creates the symlink
+--- a/kde3support/kdeui/k3textedit.cpp
++++ b/kde3support/kdeui/k3textedit.cpp
+@@ -147,7 +147,7 @@
+       e->accept();
+       return;
+     }
+-    else if ( KStandardShortcut::home().contains( key ) )
++    else if ( KStandardShortcut::begin().contains( key ) )
+     {
+       moveCursor( MoveHome, false );
+       e->accept();
+--- a/interfaces/kimproxy/interface/dbusinstantmessenger.desktop
++++ b/interfaces/kimproxy/interface/dbusinstantmessenger.desktop
+@@ -12,6 +12,7 @@
+ Comment[el]=Στιγμιαίος αποστολέας μηνυμάτων με διασύνδεση D-Bus
+ Comment[eo]=Tujmesaĝilo kun D-Bus-interfaco
+ Comment[es]=Programa de mensajería instantánea con una interfaz D-Bus
++Comment[et]=Kiirsuhtlemisrakendus D-Bus-liidesega
+ Comment[fa]=پیام‌رسان فوری با یک واسط D-Bus
+ Comment[ga]=Clár teachtaireachtaí meandaracha le comhéadan D-Bus
+ Comment[he]=תוכנת מסרים מידיים עם ממשק D-Bus
+@@ -29,9 +30,12 @@
+ Comment[pt]=Mensageiro Instantâneo com interface D-Bus
+ Comment[pt_BR]=Mensageiro Instantâneo com interface D-Bus
+ Comment[sl]=Takojšni sporočilnik z vmesnikom D-Bus
++Comment[sr]=Брзи гласник са Д-бус сучељем
++Comment[sr at latin]=Brzi glasnik sa D-Bus sučeljem
+ Comment[sv]=Direktmeddelanden med ett D-Bus gränssnitt
+ Comment[te]=డి-బస్ ఇంటర్ఫెస్ కలిగివున్న ఇంస్టెంట్ మెస్సెన్జర్
+ Comment[th]=โปรแกรมส่งข้อความแบบทันที ด้วยส่วนติดต่อกับ D-Bus
++Comment[uk]=Програма Миттєвого Зв'язку, яка має інтерфейс D-Bus
+ Comment[vi]=Bộ tin nhắn có giao diện D-Bus
+ Comment[wa]=Messaedjreye sol moumint avou ene eterface D-Bus
+ Comment[x-test]=xxInstant Messenger with a D-Bus interfacexx
+--- a/interfaces/kimproxy/interface/kcm_instantmessenger.desktop
++++ b/interfaces/kimproxy/interface/kcm_instantmessenger.desktop
+@@ -107,8 +107,8 @@
+ Comment[ru]=Клиент обмена сообщениями служит для обмена сообщениями между людьми и группами.
+ Comment[se]=Šleađgadiehtoprográmma gos olbmot ja joavkkut sáhttet buillardallat (chat).
+ Comment[sl]=Takojšni sporočilnik omogoča dvosmeren klepet med posamezniki in skupinami.
+-Comment[sr]=Брзи гласник вам омогућава двосмерно ћаскање између појединаца и група.
+-Comment[sr at latin]=Brzi glasnik vam omogućava dvosmerno ćaskanje između pojedinaca i grupa.
++Comment[sr]=Брзим гласником можете ћаскати са другим појединацима и у групама.
++Comment[sr at latin]=Brzim glasnikom možete ćaskati sa drugim pojedinacima i u grupama.
+ Comment[sv]=Direktmeddelanden möjliggör tvåvägschatt mellan individer och grupper.
+ Comment[ta]=உடனடி தகவல் உங்களை இரண்டு வழியில் தனிநபர் மற்றும் குழுக்கள் இடையே அனுமதிக்கும்.
+ Comment[te]=ఇంస్టెంట్ మెస్సెన్జర్ వ్యక్తు లు మరయు గుంపుల తొ ఇరువయపుల నుంచి సంబాషించవచ్చు 
+--- a/interfaces/kspeech/dbustexttospeech.desktop
++++ b/interfaces/kspeech/dbustexttospeech.desktop
+@@ -12,6 +12,7 @@
+ Comment[el]=Υπηρεσία κειμένου-σε-ομιλία με διασύνδεση D-Bus
+ Comment[eo]=Teksto-al-voĉo Servo kun D-Bus-interfaco
+ Comment[es]=Servicio de texto a voz con una interfaz D-Bus
++Comment[et]=Teksti kõneks muutmise teenus D-Bus-liidesega
+ Comment[fa]=خدمت متن به گفتار با یک واسط D-Bus
+ Comment[ga]=Seirbhís Téacs-go-Caint le comhéadan D-Bus
+ Comment[he]=שירות טקסט לדיבור עם ממשק D-Bus
+@@ -29,9 +30,12 @@
+ Comment[pt]=Serviço de Texto-para-Fala com interface D-Bus
+ Comment[pt_BR]=Serviço de conversão de texto para fala com interface D-Bus
+ Comment[sl]=Servis, ki spremeni besedilo v govor, z vmesnikom D-Bus
++Comment[sr]=Текст-у-говор сервис са Д-бус сучељем
++Comment[sr at latin]=Tekst-u-govor servis sa D-Bus sučeljem
+ Comment[sv]=Text till tal-tjänst med ett D-bus gränssnitt
+ Comment[te]=డి-బస్ ఇంటర్ఫేస్ కల్గిన వాచకం నుంచి మాటలకు మార్చు సేవ
+ Comment[th]=บริการเปลี่ยนข้อความเป็นเสียงพูด พร้อมด้วยส่วนติดต่อกับ DCOP
++Comment[uk]=Служба синтезу мовлення з інтерфейсом D-Bus
+ Comment[vi]=Dịch vụ Văn bản sang Tiếng nói có giao diện D-Bus
+ Comment[wa]=Siervice tecse-viè-vwès avou ene eterface D-Bus
+ Comment[x-test]=xxText-to-Speech Service with a D-Bus interfacexx
+--- a/interfaces/ktexteditor/ktexteditor.desktop
++++ b/interfaces/ktexteditor/ktexteditor.desktop
+@@ -52,8 +52,8 @@
+ Comment[ru]=Встраиваемый элемент редактора текста (с поддержкой модели документ/вид)
+ Comment[se]=Vuojuhanláhkái čállinprográmmaoassi (Doc/View-sirremiin)
+ Comment[sl]=Vgradljiva komponenta urejevalnika besedil (z ločevanjem pogleda in dokumenta)
+-Comment[sr]=Уградива компонента за уређивање текста (са „документ/приказ“ одвајањем)
+-Comment[sr at latin]=Ugradiva komponenta za uređivanje teksta (sa „dokument/prikaz“ odvajanjem)
++Comment[sr]=Угњездива компонента уређивача текста (уз раздвајање документ-приказ)
++Comment[sr at latin]=Ugnjezdiva komponenta uređivača teksta (uz razdvajanje dokument-prikaz)
+ Comment[sv]=Inbäddningsbar texteditor (med dok/vyseparation)
+ Comment[ta]=உட்பொதிந்த உரை தொகுப்பாளர் பகுதி (ஆவண/காட்சி பிரிவுகளுடன்)
+ Comment[te]=పొదగబడె వాచకం సరిచేయు అంశం (పత్ర/వీక్షణ విభజన వున్నది)
+--- a/interfaces/ktexteditor/ktexteditorplugin.desktop
++++ b/interfaces/ktexteditor/ktexteditorplugin.desktop
+@@ -54,8 +54,8 @@
+ Comment[ru]=Модуль KTextEditor
+ Comment[se]=KDE-čállinprográmma lassemoduvla
+ Comment[sl]=Vstavek KTextEditor
+-Comment[sr]=KTextEditor прикључак
+-Comment[sr at latin]=KTextEditor priključak
++Comment[sr]=Прикључак за уређивање текста
++Comment[sr at latin]=Priključak za uređivanje teksta
+ Comment[sv]=Insticksprogram för texteditor
+ Comment[ta]=கேஉரைதொகுப்பி சொருகுப்பொருள்
+ Comment[te]=కెటెక్స్ట్ ఎడిటర్ ప్లగిన్
+--- a/interfaces/ktexteditor/kcm_ktexteditor.desktop
++++ b/interfaces/ktexteditor/kcm_ktexteditor.desktop
+@@ -48,8 +48,8 @@
+ Name[ru]=Встроенный текстовый редактор
+ Name[se]=Vuojuhahtti čállinprográmma
+ Name[sl]=Vključeni urejevalnik besedil
+-Name[sr]=Уграђени уређивач текста
+-Name[sr at latin]=Ugrađeni uređivač teksta
++Name[sr]=Угњеждени уређивач текста
++Name[sr at latin]=Ugnježdeni uređivač teksta
+ Name[sv]=Inbäddad texteditor
+ Name[ta]=உட்பொதிந்த உரை தொகுப்பி
+ Name[te]=పొదగిన వాచకం సరిచేయునది
+@@ -114,8 +114,8 @@
+ Comment[ru]=Сервис текстового редактора для приложений, в которых требуется просмотр и редактирование текста. Его должны использовать приложения KDE, где требуется редактирование текста.
+ Comment[se]=Čállinprográmmabálvalus fállá teakstačájeheami ja -doaimmaheaheami. KDE-prográmmat, mat fállet teakstadoaimmahanvejolašvuođaid, galggašedje geavahit dán bálvalusa.
+ Comment[sl]=Storitev urejevalnika besedila omogoča programom dostop do pregledovalnika in urejevalnika besedil. Programi za KDE, ki omogočajo urejanje besedila, naj bi uporabljali to storitev.
+-Comment[sr]= Сервис уређивача текста обезбеђује програмима преглед и измене текстова. KDE програми који обезбеђују могућност обраде текста требало би да користе овај сервис.
+-Comment[sr at latin]= Servis uređivača teksta obezbeđuje programima pregled i izmene tekstova. KDE programi koji obezbeđuju mogućnost obrade teksta trebalo bi da koriste ovaj servis.
++Comment[sr]=Сервис уређивача текста пружа програмима начин за приказивање и уређивање текстова. Требало би да га користе сви КДЕ програми којима је то потребно.
++Comment[sr at latin]=Servis uređivača teksta pruža programima način za prikazivanje i uređivanje tekstova. Trebalo bi da ga koriste svi KDE programi kojima je to potrebno.
+ Comment[sv]=Texteditortjänsten ger program en textvisare och editor. KDE-program som tillhandahåller textredigeringsfunktioner bör använda denna tjänst.
+ Comment[ta]=உரை மற்றும் தொகுப்பாளருடனான பயன்பாடுகளை உரை தொகுப்பாளர் சேவை வழங்குகிறது. உரை தொகுக்கும் வசதிகளை வழங்கும் கேடிஇ பயன்பாடுகள் இச்சேவையைப் பயன்படுத்த வேண்டும்.
+ Comment[te]=కార్యక్రమాలకు వాచకం సరిచేయు సేవ ఒక వాచకం విక్షణ మరియు సరిచెయుటకు సహాయపడును. కెడిఈ కార్యక్రమాలు వాచకం సరిచెయు సౌకర్యాలు వున్నట్టైతె దిని సేవ ను ఉపయొగించొకొవలెను
+--- a/knotify/tests/knotifytest.notifyrc
++++ b/knotify/tests/knotifytest.notifyrc
+@@ -3,17 +3,24 @@
+ Comment=Test for Knotify
+ Comment[ca]=Prova pel Knotify
+ Comment[cs]=Test pro KNotify
++Comment[de]=Test für KNotify
+ Comment[el]=Δοκιμή του Knotify
++Comment[et]=Knotify test
+ Comment[ga]=Tástáil Knotify
+ Comment[hu]=A KNotify tesztelése
+ Comment[it]=Prova per Knotify
++Comment[kk]=Knotify-дің сынағы
+ Comment[km]=សាកល្បង​សម្រាប់ Knotify
++Comment[lv]=Knotify tests
+ Comment[nds]=Na KNotify kieken
+ Comment[nl]=Test voor KNotify
+ Comment[pa]=ਕੇ-ਨੋਟੀਫਾਈ ਲਈ ਟੈਸਟ
+ Comment[pt]=Teste do KNotify
+ Comment[pt_BR]=Teste do KNotify
++Comment[sr]=Проба за К-обавештења
++Comment[sr at latin]=Proba za K-obaveštenja
+ Comment[sv]=Test av Knotify
++Comment[uk]=Тест для Knotify
+ Comment[x-test]=xxTest for Knotifyxx
+ Comment[zh_CN]=Knotify 测试
+ Comment[zh_TW]=測試 Knotify
+@@ -24,34 +31,48 @@
+ Name[be]=Група
+ Name[ca]=Grup
+ Name[cs]=Skupina
++Name[de]=Gruppe
+ Name[el]=Ομάδα
++Name[et]=Grupp
+ Name[ga]=Grúpa
+ Name[hu]=Csoport
+ Name[it]=Gruppo
++Name[kk]=Топ
+ Name[km]=ក្រុម
++Name[lv]=Grupa
+ Name[nds]=Koppel
+ Name[nl]=Groep
+ Name[pa]=ਗਰੁੱਪ
+ Name[pt]=Grupo
+ Name[pt_BR]=Grupo
++Name[sr]=Група
++Name[sr at latin]=Grupa
+ Name[sv]=Grupp
++Name[uk]=Група
+ Name[x-test]=xxGroupxx
+ Name[zh_CN]=组
+ Name[zh_TW]=群組
+ Comment=The group
+ Comment[ca]=El grup
+ Comment[cs]=Skupina
++Comment[de]=Die Gruppe
+ Comment[el]=Η ομάδα
++Comment[et]=Grupp
+ Comment[ga]=An grúpa
+ Comment[hu]=A csoport
+ Comment[it]=Il gruppo
++Comment[kk]=Тобы
+ Comment[km]=ក្រុម
++Comment[lv]=Grupa
+ Comment[nds]=De Koppel
+ Comment[nl]=De groep
+ Comment[pa]=ਗਰੁੱਪ
+ Comment[pt]=O grupo
+ Comment[pt_BR]=O grupo
++Comment[sr]=Група
++Comment[sr at latin]=Grupa
+ Comment[sv]=Gruppen
++Comment[uk]=Група
+ Comment[x-test]=xxThe groupxx
+ Comment[zh_CN]=组
+ Comment[zh_TW]=群組
+@@ -62,30 +83,43 @@
+ Name[be]=У сеціве
+ Name[ca]=Connectat
+ Name[el]=Σε σύνδεση
++Name[et]=Võrgus
+ Name[ga]=Ar Líne
+ Name[it]=In linea
++Name[kk]=Онлайн
+ Name[km]=លើ​បណ្ដាញ
+ Name[lt]=Prisijungę
++Name[lv]=Tiešsaistē
+ Name[nds]=Tokoppelt
+ Name[pa]=ਆਨਲਾਇਨ
+ Name[pt]=Ligado
++Name[sr]=На вези
++Name[sr at latin]=Na vezi
+ Name[sv]=Uppkopplad
++Name[uk]=В мережі
+ Name[x-test]=xxOnlinexx
+ Name[zh_CN]=在线
+ Name[zh_TW]=上線
+ Comment=The contact is now connected
+ Comment[ca]=El contacte ara està connectat
+ Comment[cs]=Kontakt je nyní připojen
++Comment[de]=Der Kontakt ist jetzt verbunden
+ Comment[el]=Η επαφή είναι τώρα συνδεδεμένη
++Comment[et]=Kontakt on nüüd võrgus
+ Comment[ga]=Tá an teagmháil nasctha anois
+ Comment[hu]=A partner csatlakozott (online állapotú)
+ Comment[it]=Il contatto è ora connesso
++Comment[kk]=Контакт қосылды
+ Comment[km]=ឥឡូវ ទំនាក់ទំនង​ត្រូវ​បាន​តភ្ជាប់
++Comment[lv]=Kontakts ir savienots
+ Comment[nds]=De Kontakt is nu tokoppelt
+ Comment[nl]=De contact is nu verbonden
+ Comment[pt]=O contacto ligou-se agora
+ Comment[pt_BR]=O contato está conectado agora
++Comment[sr]=Контакт је сада повезан
++Comment[sr at latin]=Kontakt je sada povezan
+ Comment[sv]=Kontakten är nu uppkopplad
++Comment[uk]=Контакт тепер з'єднаний
+ Comment[x-test]=xxThe contact is now connectedxx
+ Comment[zh_CN]=联系人现已上线
+ Comment[zh_TW]=聯絡人已上線
+@@ -97,16 +131,23 @@
+ Name=Message Received
+ Name[ca]=Missatge rebut
+ Name[cs]=Obdržena zpráva
++Name[de]=Nachricht empfangen
+ Name[el]=Λήφθηκε μήνυμα
++Name[et]=Saadi sõnum
+ Name[ga]=Fuarthas Teachtaireacht
+ Name[hu]=Üzenet érkezett
+ Name[it]=Messaggio ricevuto
++Name[kk]=Хабарлама келді
+ Name[km]=បាន​ទទួល​សារ
++Name[lv]=Ziņojums ir saņemts
+ Name[nds]=Bescheed kregen
+ Name[nl]=Bericht ontvangen
+ Name[pt]=Mensagem Recebida
+ Name[pt_BR]=Mensagem Recebida
++Name[sr]=Примљена порука
++Name[sr at latin]=Primljena poruka
+ Name[sv]=Meddelande mottaget
++Name[uk]=Повідомлення отримано
+ Name[x-test]=xxMessage Receivedxx
+ Name[zh_CN]=收到了消息
+ Name[zh_TW]=接到訊息
+@@ -114,16 +155,23 @@
+ Comment[be]=Была атрымана паведамленне
+ Comment[ca]=S'ha rebut un missatge
+ Comment[cs]=Byla obdržena zpráva
++Comment[de]=Eine Nachricht wurde empfangen
+ Comment[el]=Ένα μήνυμα λήφθηκε
++Comment[et]=Saadi sõnum
+ Comment[ga]=Fuarthas teachtaireacht
+ Comment[hu]=Üzenet érkezett
+ Comment[it]=È stato ricevuto un messaggio
++Comment[kk]=Хабарлама келді
+ Comment[km]=សារ​ត្រូវ​បាន​ទទួល
++Comment[lv]=Ir saņemts ziņojums
+ Comment[nds]=Dat en Bescheed geven
+ Comment[nl]=Er is een bericht ontvangen
+ Comment[pt]=Foi recebida uma mensagem
+ Comment[pt_BR]=Uma mensagem foi recebida
++Comment[sr]=Порука је управо примљена
++Comment[sr at latin]=Poruka je upravo primljena
+ Comment[sv]=Ett meddelande har tagits emot
++Comment[uk]=Повідомлення було отримано
+ Comment[x-test]=xxA Message has been receivedxx
+ Comment[zh_CN]=收到了一条消息
+ Comment[zh_TW]=訊息已接收
+--- a/knotify/config/knotifyeventlist.cpp
++++ b/knotify/config/knotifyeventlist.cpp
+@@ -19,6 +19,7 @@
+ 
+ #include <kdebug.h>
+ #include <klocale.h>
++#include <kicon.h>
+ #include <kiconloader.h>
+ #include <kconfig.h>
+ #include <kconfiggroup.h>
+@@ -32,10 +33,17 @@
+ class KNotifyEventList::KNotifyEventListDelegate : public QItemDelegate
+ {
+ 	public:
++		KNotifyEventListDelegate(QObject *parent = 0);
++
+ 		virtual void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
+ 	private:
+ };
+ 
++KNotifyEventList::KNotifyEventListDelegate::KNotifyEventListDelegate(QObject *parent)
++	: QItemDelegate(parent)
++{
++}
++
+ void KNotifyEventList::KNotifyEventListDelegate::paint( QPainter* painter,
+ 		 const QStyleOptionViewItem& option, const QModelIndex& index ) const
+ {
+@@ -53,24 +61,25 @@
+ 
+ 
+ 	int mc_x=0;
++	QSize iconsSize = option.decorationSize;
+ 	foreach(QString key , prstring.split ("|"))
+ 	{
+-		QPixmap icon;
++		QIcon icon;
+ 		if(key == "Sound" )
+-			icon = SmallIcon("sound");
++			icon = KIcon("sound");
+ 		else if(key == "Popup" )
+-			icon = SmallIcon("document-properties");
++			icon = KIcon("document-properties");
+ 		else if(key == "Execute" )
+-			icon = SmallIcon("exec");
++			icon = KIcon("exec");
+ 		else if(key == "Taskbar" )
+-			icon = SmallIcon("kicker");
++			icon = KIcon("kicker");
+ 		else if(key == "Logfile" )
+-			icon = SmallIcon("log");
++			icon = KIcon("log");
+ 		else
+ 			continue;
+ 
+-		painter->drawPixmap( rect.left() + mc_x +4, rect.top() + (rect.height() - icon.height())/2, icon );
+-		mc_x += icon.width()+4;
++		icon.paint(painter, rect.left() + mc_x + 4, rect.top() + (rect.height() - iconsSize.height()) / 2, iconsSize.width(), iconsSize.height());
++		mc_x += iconsSize.width() + 4;
+ 	}
+ 
+ }
+@@ -84,7 +93,9 @@
+   headerLabels << i18nc( "Title of the notified event", "Title" ) << i18nc( "Description of the notified event", "Description" ) << i18nc( "State of the notified event", "State" );
+   setHeaderLabels( headerLabels );
+ 
+-  setItemDelegate(new KNotifyEventListDelegate);
++  setItemDelegate(new KNotifyEventListDelegate(this));
++  setRootIsDecorated(false);
++  setAlternatingRowColors(true);
+ 
+   connect(this, SIGNAL(currentItemChanged( QTreeWidgetItem * , QTreeWidgetItem *  )) , this , SLOT(slotSelectionChanged( QTreeWidgetItem * , QTreeWidgetItem *)));
+ }
+--- a/knotify/config/knotifyconfigwidget.cpp
++++ b/knotify/config/knotifyconfigwidget.cpp
+@@ -46,9 +46,9 @@
+ 	connect(d->actionsconfig,SIGNAL(changed()),this,SLOT(slotActionChanged()));
+     
+ 	QVBoxLayout *layout = new QVBoxLayout(this);
++	layout->setMargin(0);
+ 	layout->addWidget(d->eventList,1);
+ 	layout->addWidget(d->actionsconfig);
+-	setLayout(layout);
+ }
+ 
+ 
+--- a/kate/render/katerenderrange.cpp
++++ b/kate/render/katerenderrange.cpp
+@@ -1,5 +1,6 @@
+ /* This file is part of the KDE libraries
+    Copyright (C) 2003-2006 Hamish Rodda <rodda at kde.org>
++   Copyright (C) 2007 Mirko Stocker <me at misto.ch>
+ 
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+@@ -41,6 +42,14 @@
+     return KTextEditor::Cursor(INT_MAX,INT_MAX);
+ 
+   KTextEditor::SmartRange* r = m_currentRange->deepestRangeContaining(m_currentPos);
++  
++  if(!r) {
++    if(m_currentPos < m_currentRange->start()) {
++      return m_currentRange->start();
++    }
++    return KTextEditor::Cursor(INT_MAX, INT_MAX);
++  }
++  
+   foreach (KTextEditor::SmartRange* child, r->childRanges()) {
+     if (child->start() > m_currentPos)
+       return child->start();
+@@ -57,7 +66,7 @@
+ 
+   bool ret = false;
+ 
+-  while (m_currentRange && !m_currentRange->contains(pos)) {
++  while (m_currentRange && !m_currentRange->contains(pos) && m_currentRange->parentRange()) {
+     m_attribs.pop();
+     m_currentRange = m_currentRange->parentRange();
+     ret = true;
+@@ -78,7 +87,7 @@
+ 
+ KTextEditor::Attribute::Ptr SmartRenderRange::currentAttribute() const
+ {
+-  if (m_attribs.count())
++  if (m_attribs.count() && m_currentRange->contains(m_currentPos))
+     return m_attribs.top();
+   return KTextEditor::Attribute::Ptr();
+ }
+--- a/kate/render/katelayoutcache.cpp
++++ b/kate/render/katelayoutcache.cpp
+@@ -245,6 +245,7 @@
+ int KateLayoutCache::displayViewLine(const KTextEditor::Cursor& virtualCursor, bool limitToVisible) const
+ {
+   KTextEditor::Cursor work = viewCacheStart();
++  work.setLine(m_renderer->doc()->getVirtualLine(work.line()));
+ 
+   int limit = m_textLayouts.count();
+ 
+--- a/kate/render/katerenderer.cpp
++++ b/kate/render/katerenderer.cpp
+@@ -296,6 +296,14 @@
+   if (selectionsOnly || textLine->attributesList().count() || m_view->externalHighlights().count() || m_view->internalHighlights().count() || m_doc->documentHighlights().count()) {
+     RenderRangeList renderRanges;
+ 
++    // Add the inbuilt highlighting to the list
++    NormalRenderRange* inbuiltHighlight = new NormalRenderRange();
++    const QVector<int> &al = textLine->attributesList();
++    for (int i = 0; i+2 < al.count(); i += 3) {
++      inbuiltHighlight->addRange(new KTextEditor::Range(KTextEditor::Cursor(line, al[i]), al[i+1]), specificAttribute(al[i+2]));
++    }
++    renderRanges.append(inbuiltHighlight);
++    
+     if (!completionHighlight) {
+       // Add arbitrary highlighting ranges to the list
+       renderRanges.appendRanges(m_view->internalHighlights(), selectionsOnly, view());
+@@ -307,14 +315,6 @@
+       renderRanges.append(completionHighlight);
+     }
+ 
+-    // Add the inbuilt highlighting to the list
+-    NormalRenderRange* inbuiltHighlight = new NormalRenderRange();
+-    const QVector<int> &al = textLine->attributesList();
+-    for (int i = 0; i+2 < al.count(); i += 3) {
+-      inbuiltHighlight->addRange(new KTextEditor::Range(KTextEditor::Cursor(line, al[i]), al[i+1]), specificAttribute(al[i+2]));
+-    }
+-    renderRanges.append(inbuiltHighlight);
+-
+     // Add selection highlighting if we're creating the selection decorations
+     if ((selectionsOnly && showSelections() && m_view->selection()) || (completionHighlight && completionSelected) || m_view->blockSelection()) {
+       NormalRenderRange* selectionHighlight = new NormalRenderRange();
+@@ -530,7 +530,7 @@
+         paint.fillRect(area, /*QBrush(Qt::red));*/backgroundBrush);
+ //         kDebug()<<i<<":backgroundBrush:"<<backgroundBrush<<"---"<<xEnd<<"/"<<xStart;
+ //         kDebug()<<line.endX()<<"---"<<line.xOffset();
+-         kDebug()<<i<<"----"<<area;
++         //kDebug()<<i<<"----"<<area;
+       }
+ 
+       // Draw indent lines
+--- a/kate/plugins/kdatatool/ktexteditor_kdatatool.desktop
++++ b/kate/plugins/kdatatool/ktexteditor_kdatatool.desktop
+@@ -18,6 +18,7 @@
+ Name=Data tools
+ Name[ar]=أدوات للبيانات
+ Name[be]=Начынне дадзеных
++Name[br]=Ostilhoù roadoù
+ Name[ca]=Eina per a la gestió de dades
+ Name[cs]=Datové nástroje
+ Name[csb]=Nôrzãdze pòdôwków
+@@ -25,6 +26,7 @@
+ Name[el]=Εργαλεία δεδομένων
+ Name[eo]=Datumilo
+ Name[es]=Herramientas de datos
++Name[et]=Andmete tööriistad
+ Name[fa]=ابزار داده
+ Name[ga]=Uirlisí sonraí
+ Name[he]=כלי נתונים
+@@ -42,9 +44,12 @@
+ Name[pt]=Ferramentas de dados
+ Name[pt_BR]=Ferramenta de Dados
+ Name[sl]=Podatkovna orodja
++Name[sr]=Алатке за податке
++Name[sr at latin]=Alatke za podatke
+ Name[sv]=Dataverktyg
+ Name[te]=దత్తాంశపు పనిముట్లు
+ Name[th]=เครื่องมือข้อมูล
++Name[uk]=Засоби для даних
+ Name[vi]=Công cụ dữ liệu
+ Name[wa]=Usteyes po les dnêyes
+ Name[x-test]=xxData toolsxx
+@@ -99,8 +104,8 @@
+ Comment[ru]=позволяет использовать утилиты словаря и проверки орфографии (если они установлены)
+ Comment[se]=Geavat diehtoreaidduid nugo synonymasátnelisttu ja čállindárkkisteami (jos leat sajáiduhttojuvvon)
+ Comment[sl]=Omogoči orodja za podatke, kot so slovar sopomenk in preverjanje črkovanja (če so nameščena)
+-Comment[sr]=Укључије алате као што су ризница и провера правописа (ако су инсталирани)
+-Comment[sr at latin]=Uključije alate kao što su riznica i provera pravopisa (ako su instalirani)
++Comment[sr]=Алатке попут синонимара и правописара (ако су инсталирани)
++Comment[sr at latin]=Alatke poput sinonimara i pravopisara (ako su instalirani)
+ Comment[sv]=Aktivera dataverktyg som synonymordlista och stavningskontroll (om installerade)
+ Comment[ta]=அகராதி, எழுத்துப்பிழை திருத்தி போன்ற தகவல் கருவிகளை இயக்கும் (நிறுவப்பட்டிருந்தால்)
+ Comment[te]=పదకోశం మరయూ అక్షర తప్పులను పట్టుకొను పనిముట్లను ఉపయోగించు (ఇంస్టాల్ చేసిన పనిచేయును)
+--- a/kate/plugins/insertfile/ktexteditor_insertfile.desktop
++++ b/kate/plugins/insertfile/ktexteditor_insertfile.desktop
+@@ -19,6 +19,7 @@
+ Name[ar]=أدرج ملفا
+ Name[be]=Уставіць файл
+ Name[bn_IN]=ফাইল সন্নিবেশ করুন
++Name[br]=Enlakkat ur restr
+ Name[ca]=Inserció de fitxer
+ Name[cs]=Vložit soubor
+ Name[csb]=Wstôwi lopk
+@@ -26,6 +27,7 @@
+ Name[el]=Εισαγωγή αρχείου
+ Name[eo]=Enmeti Dosieron
+ Name[es]=Insertar fichero
++Name[et]=Faililisaja
+ Name[fa]=درج پرونده
+ Name[ga]=Ionsáigh Comhad
+ Name[he]=הוספת קובץ
+@@ -43,9 +45,12 @@
+ Name[pt]=Inserir um Ficheiro
+ Name[pt_BR]=Inserir Arquivo
+ Name[sl]=Vstavi datoteko
++Name[sr]=Уметање фајла
++Name[sr at latin]=Umetanje fajla
+ Name[sv]=Infoga fil
+ Name[te]=దస్త్రం చేర్చు
+ Name[th]=แทรกแฟ้ม
++Name[uk]=Вставити файл
+ Name[vi]=Chèn tập tin
+ Name[wa]=Sititchî fitchî
+ Name[x-test]=xxInsert Filexx
+@@ -99,8 +104,8 @@
+ Comment[ru]=вставка любого читаемого файла в позиции курсора
+ Comment[se]=Lasiha logahahtti fiilla čállinmearkka sajádahkii
+ Comment[sl]=Vstavi katerokoli berljivo datoteko na položaju kazalca
+-Comment[sr]=Убаците било који читљиви фајл на положају курсора
+-Comment[sr at latin]=Ubacite bilo koji čitljivi fajl na položaju kursora
++Comment[sr]=Убаци било који читљиви фајл на положају курсора
++Comment[sr at latin]=Ubaci bilo koji čitljivi fajl na položaju kursora
+ Comment[sv]=Infoga vilken läsbar fil som helst vid markörens plats
+ Comment[ta]=சுட்டும் இடத்தில் படிக்கக்கூடிய கோப்பினை உள்ளிடு
+ Comment[te]=ములుకు వున్న చోట చదవగలిగే దస్త్రాన్ని దూర్చును 
+--- a/kate/plugins/autobookmarker/ktexteditor_autobookmarker.desktop
++++ b/kate/plugins/autobookmarker/ktexteditor_autobookmarker.desktop
+@@ -24,6 +24,7 @@
+ Name[el]=Αυτόματοι σελιδοδείκτες
+ Name[eo]=Aŭtomata legosignigilo
+ Name[es]=Marcador automático
++Name[et]=Automaatne järjehoidjate märkija
+ Name[ga]=Leabharmharcálaí Uathoibríoch
+ Name[he]=מוסיף סימניות אוטומטי
+ Name[hu]=Automatikus könyvjelzők
+@@ -40,9 +41,12 @@
+ Name[pt]=Auto-Favoritos do KTextEditor
+ Name[pt_BR]=Marcador de Favoritos Automático
+ Name[sl]=Samodejni zaznamki
++Name[sr]=Самододавач маркера
++Name[sr at latin]=Samododavač markera
+ Name[sv]=Automatiska bokmärken
+ Name[te]=ఆటొబుక్ మార్కర్
+ Name[th]=ตั้งที่คั่นหน้าอัตโนมัติ
++Name[uk]=Програма автоматичних закладок
+ Name[vi]=Bộ tự động lưu liên kết
+ Name[wa]=Rimåkes otomatikes
+ Name[x-test]=xxAutobookmarkerxx
+@@ -95,8 +99,8 @@
+ Comment[ru]=Установка закладок в текстовом документе по шаблону
+ Comment[se]=Bidjá girjemearkkaid linnjáide mat heivehit dihto minsttáriid go dokumeanttat rahpejuvvot.
+ Comment[sl]=Ob nalaganju dokumentov nastavi zaznamke za vrstice, ki se ujemajo z vzorcem
+-Comment[sr]=Поставља маркере на линијама које се уклапају у узорак када се учитавају документи
+-Comment[sr at latin]=Postavlja markere na linijama koje se uklapaju u uzorak kada se učitavaju dokumenti
++Comment[sr]=При учитавању докумената, постави маркере на линијама поклопљеним мустром
++Comment[sr at latin]=Pri učitavanju dokumenata, postavi markere na linijama poklopljenim mustrom
+ Comment[sv]=Lägg till bokmärken på rader som motsvarar ett mönster när dokument laddas
+ Comment[ta]= ஆவணங்கள் பதிவாகும் போது அமைப்பு புத்தகக்குறிப்பு கோடுகள் பொருத்தும் மாதிரி
+ Comment[te]=పత్రాలు ఎక్కించిన తరువాత బాణీకి సరిపొయిన వరుసల మీద బుక్ మార్కులను ఏర్పరుచును
+--- a/kate/plugins/wordcompletion/docwordcompletion.h
++++ b/kate/plugins/wordcompletion/docwordcompletion.h
+@@ -116,6 +116,8 @@
+   private Q_SLOTS:
+     void completeBackwards();
+     void completeForwards();
++    void slotCursorMoved();
++
+     void shellComplete();
+ 
+     void popupCompletionList();
+--- a/kate/plugins/wordcompletion/ktexteditor_docwordcompletion.desktop
++++ b/kate/plugins/wordcompletion/ktexteditor_docwordcompletion.desktop
+@@ -25,6 +25,7 @@
+ Name[el]=Συμπλήρωση λέξεων
+ Name[eo]=Vortkompletigo
+ Name[es]=Terminación de palabras
++Name[et]=Sõnalõpetus
+ Name[fa]=تکمیل واژه
+ Name[ga]=Comhlánú Focal
+ Name[he]=השלמת מילים אוטומטית
+@@ -42,9 +43,12 @@
+ Name[pt]=Completação de Palavras
+ Name[pt_BR]=Complementação de Palavras
+ Name[sl]=Dopolnjevanje besed
++Name[sr]=Допуна речи
++Name[sr at latin]=Dopuna reči
+ Name[sv]=Ordkomplettering
+ Name[te]=పదం పూరణ
+ Name[th]=การเติมคำให้สมบูรณ์
++Name[uk]=Завершення слів
+ Name[vi]=Gõ xong từ
+ Name[wa]=Completaedje des mots
+ Name[x-test]=xxWord Completionxx
+@@ -77,6 +81,7 @@
+ Comment[it]=Completamento direzionale o con finestre a comparsa di parole nel documento
+ Comment[ja]=ポップアップまたはユーザの指示によって文書の単語から補完します
+ Comment[kk]=Құжаттағы сөздерді аяқтау модулі
++Comment[km]=ការ​បំពេញ​ពាក្យ​ដោយ​ផ្ទាល់ ឬ​តាម​រយៈ​ការ​លេចឡើង​នៃ​ពាក្យ​ដែល​មាន​ក្នុង​ឯកសារ
+ Comment[kn]=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ನಿರ್ದೇಶನಾಧಾರಿತ ಅಥವಾ ಪುಟಿಕೆ (ಪಾಪ್ ಅಪ್) -ಆಧಾರಿತ ಪದಗಳ ಪೂರಣಗೊಳಿಸುವಿಕೆ
+ Comment[ko]=문서 내에서의 방향 및 팝업 기반 단어 완성
+ Comment[lb]=Direktional oder Opklapp-Fënster-baséiert Vervollstännegung vu Wierder am Dokument
+@@ -96,8 +101,8 @@
+ Comment[ro]=Propune completarea cuvintelor din document dintr-o listă popup sau direcţională
+ Comment[ru]=Автодополнение слов в документе
+ Comment[sl]=Neposredno ali pojavno dopolnjevanje iz besed v dokumentu
+-Comment[sr]=Директна или искачућа допуна од речи у документу
+-Comment[sr at latin]=Direktna ili iskačuća dopuna od reči u dokumentu
++Comment[sr]=Дирекционо или искачуће допуњавање према речима из документа
++Comment[sr at latin]=Direkciono ili iskačuće dopunjavanje prema rečima iz dokumenta
+ Comment[sv]=Komplettering av ord i dokumentet baserad på ordlista eller dialogruta
+ Comment[ta]=ஆவணத்திலுள்ள வார்த்தைகளிலிருந்து திசைகள் அல்லது மேல்விரி-சார்ந்த நிறைவு 
+ Comment[te]=పత్రం లోని పదాలు వాడె, దిశా లేక పాప్ అప్ ఆధారిత పద పూరణ
+--- a/kate/plugins/wordcompletion/docwordcompletion.cpp
++++ b/kate/plugins/wordcompletion/docwordcompletion.cpp
+@@ -33,6 +33,7 @@
+ #include <ktexteditor/variableinterface.h>
+ #include <ktexteditor/smartinterface.h>
+ #include <ktexteditor/smartrange.h>
++#include <ktexteditor/rangefeedback.h>
+ 
+ #include <kconfig.h>
+ #include <kdialog.h>
+@@ -47,6 +48,7 @@
+ #include <kpagewidgetmodel.h>
+ #include <ktoggleaction.h>
+ #include <kconfiggroup.h>
++#include <kcolorscheme.h>
+ 
+ #include <QtCore/QRegExp>
+ #include <QtCore/QString>
+@@ -85,8 +87,7 @@
+   switch ( role )
+   {
+     case Qt::DisplayRole:
+-      if ( index.column() == Name )
+-        return m_matches.at( index.row() );
++      return m_matches.at( index.row() );
+     case CompletionRole:
+       return (int)FirstProperty|LastProperty|Public;
+     case ScopeIndex:
+@@ -251,6 +252,7 @@
+   KToggleAction *autopopup; // for accessing state
+   uint treshold;        // the required length of a word before popping up the completion list automatically
+   int directionalPos;   // be able to insert "" at the correct time
++  bool isCompleting; // true when the directional completion is doing a completion
+ };
+ 
+ DocWordCompletionPluginView::DocWordCompletionPluginView( uint treshold,
+@@ -264,9 +266,9 @@
+     d( new DocWordCompletionPluginViewPrivate )
+ {
+ //   setObjectName( name );
+-
++  d->isCompleting = false;
+   d->treshold = treshold;
+-  d->dcRange = KTextEditor::Range();
++  d->dcRange = KTextEditor::Range::invalid();
+   KTextEditor::SmartInterface *si =
+      qobject_cast<KTextEditor::SmartInterface*>( m_view->document() );
+ 
+@@ -274,16 +276,12 @@
+     return;
+ 
+   d->liRange = si->newSmartRange();
+-//   d->liRange->setInsertBehavior(KTextEditor::SmartRange::ExpandRight|KTextEditor::SmartRange::ExpandLeft);
+ 
+-  KTextEditor::Attribute::Ptr a( new KTextEditor::Attribute() );
+-  QColor bg = Qt::blue;
+-  bg.setAlpha(0x88);
+-  a->setBackground( QBrush(bg) );
+-//   a->setForeground( QBrush(Qt:white) );
++  KColorScheme colors(QPalette::Active);
++  KTextEditor::Attribute::Ptr a = KTextEditor::Attribute::Ptr( new KTextEditor::Attribute() );
++  a->setBackground( colors.background(KColorScheme::ActiveBackground) );
++  a->setForeground( colors.foreground(KColorScheme::ActiveText) ); // ### this does 0
+   d->liRange->setAttribute( a );
+-  si->addHighlightToView( m_view, d->liRange, false );
+-//   si->addHighlightToDocument( d->liRange, false );
+ 
+   view->insertChildClient( this );
+ 
+@@ -380,7 +378,7 @@
+   if ( ! m_dWCompletionModel->rowCount(QModelIndex()) ) return;
+ 
+   KTextEditor::CodeCompletionInterface *cci = qobject_cast<KTextEditor::CodeCompletionInterface *>( m_view );
+-  if ( cci )
++  if ( cci && ! cci->isCompletionActive() )
+     cci->startCompletion( r, m_dWCompletionModel );
+ }
+ 
+@@ -425,12 +423,18 @@
+ 
+   QString partial = findLongestUnique( matches, r.columnWidth() );
+ 
+-  if ( partial.length() == r.columnWidth() )
++  if ( ! partial.length() )
+     popupCompletionList();
+ 
+   else
+   {
+     m_view->document()->insertText( r.end(), partial.mid( r.columnWidth() ) );
++    KTextEditor::SmartInterface *si = qobject_cast<KTextEditor::SmartInterface*>( m_view->document() );
++    if ( si ) {
++      si->addHighlightToView( m_view, d->liRange, true );
++      d->liRange->setRange( KTextEditor::Range( r.end(), partial.length() - r.columnWidth() ) );
++      connect( m_view, SIGNAL(cursorPositionChanged(KTextEditor::View*, const KTextEditor::Cursor&)), this, SLOT(slotCursorMoved()) );
++    }
+   }
+ }
+ 
+@@ -445,13 +449,7 @@
+   int inc = fw ? 1 : -1;
+   KTextEditor::Document *doc = m_view->document();
+ 
+-  /* IF the current line is equal to the previous line
+-     AND the position - the length of the last inserted string
+-          is equal to the old position
+-     AND the lastinsertedlength last characters of the word is
+-          equal to the last inserted string
+-          */
+-  if ( r.start() == d->dcRange.start() && r.end() >= d->dcRange.end() )
++  if ( d->dcRange.isValid() )
+   {
+     //kDebug()<<"CONTINUE "<<d->dcRange;
+     // this is a repeted activation
+@@ -482,6 +480,14 @@
+     d->liRange->setRange( KTextEditor::Range( r.end(), 0 ) );
+     d->dcCursor = r.start();
+     d->directionalPos = inc;
++
++  KTextEditor::SmartInterface *si =
++     qobject_cast<KTextEditor::SmartInterface*>( m_view->document() );
++  if ( si )
++    si->addHighlightToView( m_view, d->liRange, true );
++
++    connect( m_view, SIGNAL(cursorPositionChanged(KTextEditor::View*, const KTextEditor::Cursor&)), this, SLOT(slotCursorMoved()) );
++
+   }
+ 
+   d->re.setPattern( "\\b" + doc->text( d->dcRange ) + "(\\w+)" );
+@@ -499,21 +505,16 @@
+     {
+       //kDebug()<<"USABLE MATCH";
+       QString m = d->re.cap( 1 );
+-      if ( m != doc->text( *d->liRange ) )
++      if ( m != doc->text( *d->liRange ) && (d->dcCursor.line() != d->dcRange.start().line() || pos != d->dcRange.start().column() ) )
+       {
+         // we got good a match! replace text and return.
++        d->isCompleting = true;
+         doc->replaceText( *d->liRange, m );
+-kDebug()<<"liRange:"<<*d->liRange;
+-
+         d->liRange->setRange( KTextEditor::Range( d->dcRange.end(), m.length() ) );
+ 
+-kDebug()<<"lirange background:"<<d->liRange->attribute()->background();
+         d->dcCursor.setColumn( pos ); // for next try
+-  KTextEditor::SmartInterface *si =
+-     qobject_cast<KTextEditor::SmartInterface*>( m_view->document() );
+-foreach(KTextEditor::SmartRange* range, si->viewHighlights(m_view))
+-kDebug()<<"highlighted range:"<<*range;
+ 
++        d->isCompleting = false;
+         return;
+       }
+ 
+@@ -565,6 +566,20 @@
+   } // while true
+ }
+ 
++void DocWordCompletionPluginView::slotCursorMoved()
++{
++  if ( d->isCompleting) return;
++
++  d->dcRange = KTextEditor::Range::invalid();
++
++  disconnect( m_view, SIGNAL(cursorPositionChanged(KTextEditor::View*, KTextEditor::Cursor&)), this, SLOT(slotCursorMoved()) );
++
++  KTextEditor::SmartInterface *si =
++     qobject_cast<KTextEditor::SmartInterface*>( m_view->document() );
++  if ( si )
++    si->removeHighlightFromView( m_view, d->liRange );
++}
++
+ // Contributed by <brain at hdsnet.hu> FIXME
+ QString DocWordCompletionPluginView::findLongestUnique( const QStringList &matches, int lead ) const
+ {
+--- a/kate/plugins/wordcompletion/ktexteditor_docwordcompletion_config.desktop
++++ b/kate/plugins/wordcompletion/ktexteditor_docwordcompletion_config.desktop
+@@ -10,12 +10,14 @@
+ Name[ar]=السلوك
+ Name[be]=Паводзіны
+ Name[bn_IN]=আচরণ
++Name[br]=Emzalc'h
+ Name[ca]=Comportament
+ Name[cs]=Chování
+ Name[csb]=Zachòwónié
+ Name[de]=Verhalten
+ Name[el]=Συμπεριφορά
+ Name[es]=Comportamiento
++Name[et]=Käitumine
+ Name[ga]=Oibriú
+ Name[he]=פעולה
+ Name[hu]=Működés
+@@ -26,6 +28,7 @@
+ Name[kn]=ವರ್ತನೆ
+ Name[ko]=동작
+ Name[lt]=Elgsena
++Name[lv]=Izturēšanās
+ Name[nds]=Bedregen
+ Name[ne]=ब्यवहार
+ Name[nl]=Gedrag
+@@ -33,8 +36,11 @@
+ Name[pt]=Comportamento
+ Name[pt_BR]=Comportamento
+ Name[sl]=Obnašanje
++Name[sr]=Понашање
++Name[sr at latin]=Ponašanje
+ Name[sv]=Beteende
+ Name[th]=พฤติกรรม
++Name[uk]=Поведінка
+ Name[wa]=Dujhance
+ Name[x-test]=xxBehaviorxx
+ Name[zh_CN]=行为
+--- a/kate/plugins/timedate/ktexteditor_timedate_config.desktop
++++ b/kate/plugins/timedate/ktexteditor_timedate_config.desktop
+@@ -13,6 +13,7 @@
+ Name[de]=Format für das Einfügen von Uhrzeit & Datum
+ Name[el]=Μορφή εισαγωγής ώρας & ημερομηνίας
+ Name[es]=Formato de la inserción de hora y fecha
++Name[et]=Kellaaja ja kuupäeva lisamise vorming
+ Name[ga]=Formáid Ionsáite Ama agus Dáta
+ Name[he]=הגדרות תבנית התאריך והשעה המוספים
+ Name[hu]=A beszúrt dátum és idő formátuma
+@@ -29,8 +30,11 @@
+ Name[pt]=Formato da inserção da Data & Hora
+ Name[pt_BR]=Formato da inserção da Data & Hora
+ Name[sl]=Oblika vstavljenega časa in datuma
++Name[sr]=Формат уметања времена и датума
++Name[sr at latin]=Format umetanja vremena i datuma
+ Name[sv]=Format för att infoga tid och datum
+ Name[th]=รูปแบบของการแทรกเวลา & วันที่
++Name[uk]=Формат часу і дати для вставлення
+ Name[wa]=Cogne pol date et l' eure
+ Name[x-test]=xxFormat of Time & Date insertionxx
+ Name[zh_CN]=插入的时间和日期的格式
+--- a/kate/plugins/timedate/ktexteditor_timedate.desktop
++++ b/kate/plugins/timedate/ktexteditor_timedate.desktop
+@@ -16,11 +16,13 @@
+ Icon=korganizer
+ Name=Time & Date
+ Name[bn_IN]=সময় ও তারিখ
++Name[br]=Deiziad hag eur
+ Name[ca]=Data i hora
+ Name[cs]=Datum a čas
+ Name[de]=Uhrzeit & Datum
+ Name[el]=Ώρα & ημερομηνία
+ Name[es]=Hora y fecha
++Name[et]=Kuupäev ja kellaaeg
+ Name[ga]=Am agus Dáta
+ Name[he]=תאריך ושעה
+ Name[hu]=Dátum és idő
+@@ -38,8 +40,11 @@
+ Name[pt]=Hora & Data
+ Name[pt_BR]=Hora & Data
+ Name[sl]=Čas in datum
++Name[sr]=Време и датум
++Name[sr at latin]=Vreme i datum
+ Name[sv]=Tid och datum
+ Name[th]=เวลา & วันที่
++Name[uk]=Час і дата
+ Name[wa]=Date et eure
+ Name[x-test]=xxTime & Datexx
+ Name[zh_CN]=时间和日期
+@@ -50,6 +55,7 @@
+ Comment[de]=Einfügen von Uhrzeit & Datum
+ Comment[el]=Εισαγωγή τρέχουσας ώρας & ημερομηνίας
+ Comment[es]=Insertar hora y fecha actuales
++Comment[et]=Praeguse kellaaja ja kuupäeva lisamine
+ Comment[ga]=Ionsáigh an tAm agus an Dáta reatha
+ Comment[he]=הוספת התאריך והשעה הנוכחיים
+ Comment[hu]=Az aktuális dátum és idő beszúrása
+@@ -66,8 +72,11 @@
+ Comment[pt]=Inserir a Data & Hora actual
+ Comment[pt_BR]=Inserir a Data & Hora atual
+ Comment[sl]=Vstavi trenuten čas in datum
++Comment[sr]=Уметни тренутно време и датум
++Comment[sr at latin]=Umetni trenutno vreme i datum
+ Comment[sv]=Infoga aktuell tid och datum
+ Comment[th]=แทรกเวลาและวันที่
++Comment[uk]=Вставити поточний час і дату
+ Comment[wa]=Sititchî l' date et eure do moumint
+ Comment[x-test]=xxInsert current Time & Datexx
+ Comment[zh_CN]=插入当前时间和日期
+--- a/kate/dialogs/searchbarpower.ui
++++ b/kate/dialogs/searchbarpower.ui
+@@ -383,7 +383,7 @@
+               <string>Resolve placeholders (\0 to \9) and escape sequences (\n, \t, ..)</string>
+              </property>
+              <property name="text" >
+-              <string>Use Placeholders</string>
++              <string>Use placeholders</string>
+              </property>
+             </widget>
+            </item>
+--- a/kate/dialogs/katedialogs.cpp
++++ b/kate/dialogs/katedialogs.cpp
+@@ -3,6 +3,7 @@
+    Copyright (C) 2003 Christoph Cullmann <cullmann at kde.org>
+    Copyright (C) 2001 Joseph Wenninger <jowenn at kde.org>
+    Copyright (C) 2006 Dominik Haumann <dhdev at gmx.de>
++   Copyright (C) 2007 Mirko Stocker <me at misto.ch>
+ 
+    Based on work of:
+      Copyright (C) 1999 Jochen Wilhelmy <digisnap at cs.tu-berlin.de>
+@@ -519,29 +520,30 @@
+ 
+ //BEGIN KateEditKeyConfiguration
+ 
+-KateEditKeyConfiguration::KateEditKeyConfiguration( QWidget* parent, KateDocument* doc )
++KateEditKeyConfiguration::KateEditKeyConfiguration( QWidget* parent)
+   : KateConfigPage( parent )
++  , m_ready(false)
+ {
+-  m_doc = doc;
+-  m_ready = false;
++  m_doc = new KateDocument();
++  m_view = new KateView(m_doc, 0);
+ }
+ 
+-void KateEditKeyConfiguration::showEvent ( QShowEvent * )
++KateEditKeyConfiguration::~KateEditKeyConfiguration()
+ {
+-#ifdef __GNUC__
+-#warning fixme, to work without a document object, perhaps create some own internally
+-#endif
+-  return ;
++  delete m_view;
++  delete m_doc;
++}
+ 
++void KateEditKeyConfiguration::showEvent ( QShowEvent * )
++{
+   if (!m_ready)
+   {
+-    QVBoxLayout *l=new QVBoxLayout(this);
+-    KateView* view = (KateView*)m_doc->views().at(0);
+-    m_ac = view->editActionCollection();
+-    l->addWidget(m_shortcutsEditor = new KShortcutsEditor( m_ac, this, false ));
+-    //is this really needed? if yes, I'll add it to KShortcutsEditor
+-    //note that changes will immediately become active with KShortcutsEditor -- ahartmetz
+-    //connect( m_shortcutsEditor, SIGNAL( keyChange() ), this, SLOT( slotChanged() ) );
++	m_actionCollection = m_view->editActionCollection();
++
++    QVBoxLayout *layout = new QVBoxLayout(this);	
++    layout->addWidget(m_shortcutsEditor = new KShortcutsEditor( m_actionCollection, this, false ));
++    connect( m_shortcutsEditor, SIGNAL( keyChange() ), this, SLOT( slotChanged() ) );
++
+     m_shortcutsEditor->show ();
+ 
+     m_ready = true;
+@@ -552,22 +554,15 @@
+ 
+ void KateEditKeyConfiguration::apply()
+ {
+-#ifdef __GNUC__
+-#warning fixme, to work without a document object, perhaps create some own internally
+-#endif
+-  return ;
+-
+-  if ( ! hasChanged() )
++  if(!hasChanged())
+     return;
+   m_changed = false;
+ 
+   if (m_ready)
+   {
+-#ifdef __GNUC__
+-#warning: semantics of KKeyDialog changed from change/commit to change in-place/revert
+-#endif
+-    //m_keyChooser->commitChanges();
+-    m_ac->writeSettings();
++    KateViewConfig::global()->configStart ();
++    m_actionCollection->writeSettings();
++    KateViewConfig::global()->configEnd ();
+   }
+ }
+ //END KateEditKeyConfiguration
+--- a/kate/dialogs/katedialogs.h
++++ b/kate/dialogs/katedialogs.h
+@@ -3,6 +3,7 @@
+    Copyright (C) 2003 Christoph Cullmann <cullmann at kde.org>
+    Copyright (C) 2001 Joseph Wenninger <jowenn at kde.org>
+    Copyright (C) 2006 Dominik Haumann <dhdev at gmx.de>
++   Copyright (C) 2007 Mirko Stocker <me at misto.ch>
+ 
+    Based on work of:
+      Copyright (C) 1999 Jochen Wilhelmy <digisnap at cs.tu-berlin.de>
+@@ -204,7 +205,8 @@
+   Q_OBJECT
+ 
+   public:
+-    KateEditKeyConfiguration( QWidget* parent, KateDocument* doc );
++    KateEditKeyConfiguration( QWidget* parent );
++    ~KateEditKeyConfiguration();
+ 
+   public Q_SLOTS:
+     void apply();
+@@ -217,9 +219,12 @@
+ 
+   private:
+     bool m_ready;
+-    class KateDocument *m_doc;
+     KShortcutsEditor* m_shortcutsEditor;
+-    class KActionCollection *m_ac;
++    class KActionCollection *m_actionCollection;
++    
++    // we use a fake document/view to get the action collection:
++    class KateDocument *m_doc;
++    class KateView *m_view;
+ };
+ 
+ class KateSaveConfigTab : public KateConfigPage
+--- a/kate/mode/katemodemanager.cpp
++++ b/kate/mode/katemodemanager.cpp
+@@ -277,40 +277,44 @@
+   return "";
+ }
+ 
++/*static*/ QString KateModeManager::reverse(const QString & text) {
++  const int len = text.length();
++  QString res;
++  res.reserve(len);
++  for (int i = len - 1; i >= 0; i--) {
++    res.append(text[i]);
++  }
++  return res;
++}
++
+ QString KateModeManager::wildcardsFind (const QString &fileName)
+ {
+-  QList<KateFileType*> types;
++  const QString reversedFilename = reverse(fileName);
+ 
++  QRegExp re;
++  re.setCaseSensitivity(Qt::CaseSensitive);
++  re.setPatternSyntax(QRegExp::Wildcard);
++
++  KateFileType * match = NULL;
++  int minPrio = -1;
+   foreach (KateFileType *type, m_types)
+   {
+-    foreach (QString wildcard, type->wildcards)
+-    {
+-      // anders: we need to be sure to match the end of string, as eg a css file
+-      // would otherwise end up with the c hl
+-      QRegExp re(wildcard, Qt::CaseSensitive, QRegExp::Wildcard);
+-      if ( ( re.indexIn( fileName ) > -1 ) && ( re.matchedLength() == (int)fileName.length() ) )
+-        types.append (type);
++    if (type->priority <= minPrio) {
++      continue;
+     }
+-  }
+-
+-  if ( !types.isEmpty() )
+-  {
+-    int pri = -1;
+-    QString name;
+ 
+-    foreach (KateFileType *type, types)
++    foreach (QString wildcard, type->wildcards)
+     {
+-      if (type->priority > pri)
+-      {
+-        pri = type->priority;
+-        name = type->name;
++      re.setPattern(reverse(wildcard));
++      if (re.exactMatch(reversedFilename)) {
++        match = type;
++        minPrio = type->priority;
++        break;
+       }
+     }
+-
+-    return name;
+   }
+ 
+-  return "";
++  return (match == NULL) ? "" : match->name;
+ }
+ 
+ const KateFileType& KateModeManager::fileType(const QString &name) const
+--- a/kate/mode/katemodemanager.h
++++ b/kate/mode/katemodemanager.h
+@@ -77,6 +77,12 @@
+   private:
+     QList<KateFileType *> m_types;
+     QHash<QString, KateFileType *> m_name2Type;
++
++    /**
++     * Reverses a string on char level, i.e. "abc" becomes "cba".
++     */
++    static QString reverse(const QString & text);
++
+ };
+ 
+ #endif
+--- a/kate/smart/katesmartmanager.cpp
++++ b/kate/smart/katesmartmanager.cpp
+@@ -22,6 +22,8 @@
+ #include "katesmartcursor.h"
+ #include "katesmartrange.h"
+ 
++#include <QThread>
++
+ #include <kdebug.h>
+ 
+ static const int s_defaultGroupSize = 40;
+@@ -35,7 +37,6 @@
+   , m_firstGroup(new KateSmartGroup(0, 0, 0L, 0L))
+   , m_invalidGroup(new KateSmartGroup(-1, -1, 0L, 0L))
+   , m_clearing(false)
+-  , m_usingRevision(-1)
+ {
+   connect(doc()->history(), SIGNAL(editDone(KateEditInfo*)), SLOT(slotTextChanged(KateEditInfo*)));
+   //connect(doc(), SIGNAL(textChanged(Document*)), SLOT(verifyCorrect()));
+@@ -63,7 +64,7 @@
+ KateSmartCursor * KateSmartManager::newSmartCursor( const Cursor & position, SmartCursor::InsertBehavior insertBehavior, bool internal )
+ {
+   KateSmartCursor* c;
+-  if (m_usingRevision != -1)
++  if (usingRevision() != -1)
+     c = new KateSmartCursor(translateFromRevision(position), doc(), insertBehavior);
+   else
+     c = new KateSmartCursor(position, doc(), insertBehavior);
+@@ -77,7 +78,7 @@
+ {
+   KateSmartRange* newRange;
+ 
+-  if (m_usingRevision != -1)
++  if (usingRevision() != -1)
+     newRange = new KateSmartRange(translateFromRevision(range), doc(), parent, insertBehavior);
+   else
+     newRange = new KateSmartRange(range, doc(), parent, insertBehavior);
+@@ -91,7 +92,7 @@
+ 
+ KateSmartRange * KateSmartManager::newSmartRange( KateSmartCursor * start, KateSmartCursor * end, SmartRange * parent, SmartRange::InsertBehaviors insertBehavior, bool internal )
+ {
+-  if (m_usingRevision != -1) {
++  if (usingRevision() != -1) {
+     *start = translateFromRevision(*start, (insertBehavior & SmartRange::ExpandLeft) ? SmartCursor::StayOnInsert : SmartCursor::MoveOnInsert);
+     *end = translateFromRevision(*end, (insertBehavior & SmartRange::ExpandRight) ? SmartCursor::MoveOnInsert : SmartCursor::StayOnInsert);
+   }
+@@ -515,7 +516,19 @@
+ 
+ void KateSmartManager::useRevision(int revision)
+ {
+-  m_usingRevision = revision;
++  if (revision == -1)
++    // Clear current revision use
++    m_usingRevision.remove(QThread::currentThread());
++  else
++    m_usingRevision[QThread::currentThread()] = revision;
++}
++
++int KateSmartManager::usingRevision() const
++{
++  if (m_usingRevision.contains(QThread::currentThread())) {
++    return m_usingRevision[QThread::currentThread()];
++  }
++  return -1;
+ }
+ 
+ void KateSmartManager::releaseRevision(int revision) const
+@@ -567,7 +580,7 @@
+ {
+   Cursor ret = cursor;
+ 
+-  foreach (KateEditInfo* edit, doc()->history()->editsBetweenRevisions(m_usingRevision))
++  foreach (KateEditInfo* edit, doc()->history()->editsBetweenRevisions(usingRevision()))
+     translate(edit, ret, insertBehavior);
+ 
+   return ret;
+@@ -577,7 +590,7 @@
+ {
+   Range ret = range;
+ 
+-  foreach (KateEditInfo* edit, doc()->history()->editsBetweenRevisions(m_usingRevision)) {
++  foreach (KateEditInfo* edit, doc()->history()->editsBetweenRevisions(usingRevision())) {
+     translate(edit, ret.start(), insertBehavior & KTextEditor::SmartRange::ExpandLeft ? SmartCursor::StayOnInsert : SmartCursor::MoveOnInsert);
+     translate(edit, ret.end(), insertBehavior & KTextEditor::SmartRange::ExpandRight ? SmartCursor::MoveOnInsert : SmartCursor::StayOnInsert);
+   }
+--- a/kate/smart/katesmartrange.cpp
++++ b/kate/smart/katesmartrange.cpp
+@@ -165,6 +165,38 @@
+     w->rangeContentsChanged(this, mostSpecific);
+ }
+ 
++void KateSmartRange::feedbackMouseCaretChange(KTextEditor::View* view, bool mouse, bool entered)
++{
++  if (mouse) {
++    if (entered) {
++      foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
++        emit static_cast<KateSmartRangeNotifier*>(n)->mouseEnteredRange(this, view);
++      foreach (KTextEditor::SmartRangeWatcher* w, watchers())
++        w->mouseEnteredRange(this, view);
++
++    } else {
++      foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
++        emit static_cast<KateSmartRangeNotifier*>(n)->mouseExitedRange(this, view);
++      foreach (KTextEditor::SmartRangeWatcher* w, watchers())
++        w->mouseExitedRange(this, view);
++    }
++
++  } else {
++    if (entered) {
++      foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
++        emit static_cast<KateSmartRangeNotifier*>(n)->caretEnteredRange(this, view);
++      foreach (KTextEditor::SmartRangeWatcher* w, watchers())
++        w->caretEnteredRange(this, view);
++
++    } else {
++      foreach (KTextEditor::SmartRangeNotifier* n, notifiers())
++        emit static_cast<KateSmartRangeNotifier*>(n)->caretExitedRange(this, view);
++      foreach (KTextEditor::SmartRangeWatcher* w, watchers())
++        w->caretExitedRange(this, view);
++    }
++  }
++}
++
+ void KateSmartRange::shifted( )
+ {
+   if (kStart().lastPosition() != kStart()) {
+--- a/kate/smart/katesmartmanager.h
++++ b/kate/smart/katesmartmanager.h
+@@ -93,6 +93,7 @@
+ 
+   private:
+     KateSmartRange* feedbackRange(const KateEditInfo& edit, KateSmartRange* range);
++    int usingRevision() const;
+ 
+     void debugOutput() const;
+ 
+@@ -100,7 +101,7 @@
+     QSet<KateSmartRange*> m_topRanges;
+     KateSmartGroup* m_invalidGroup;
+     bool m_clearing;
+-    int m_usingRevision;
++    QHash<QThread*, int> m_usingRevision;
+ };
+ 
+ /**
+--- a/kate/smart/katesmartrange.h
++++ b/kate/smart/katesmartrange.h
+@@ -135,6 +135,8 @@
+     void feedbackMostSpecific(KateSmartRange* mostSpecific);
+     /// The range has been shifted only
+     void shifted();
++    /// Mouse / caret in or out
++    void feedbackMouseCaretChange(KTextEditor::View* view, bool mouse, bool entered);
+ 
+     void registerPointer(KateSmartRangePtr* ptr);
+     void deregisterPointer(KateSmartRangePtr* ptr);
+--- a/kate/syntax/data/debiancontrol.xml
++++ b/kate/syntax/data/debiancontrol.xml
+@@ -1,9 +1,9 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE language SYSTEM "language.dtd">
+-<language name="Debian Control" version="0.82" kateversion="2.4" section="Other" extensions="" mimetype="">
++<language name="Debian Control" version="0.83" kateversion="2.4" section="Other" extensions="control" mimetype="">
+     <highlighting>
+         <contexts>
+-            <context attribute="Normal Text" lineEndContext="#stay">
++            <context attribute="Normal Text" lineEndContext="#stay" name="INIT">
+                 <StringDetect attribute="Keyword" context="DependencyField" String="Depends:"/>
+                 <StringDetect attribute="Keyword" context="DependencyField" String="Recommends:"/>
+                 <StringDetect attribute="Keyword" context="DependencyField" String="Suggests:"/>
+--- /dev/null
++++ b/kate/syntax/data/dtd.xml
+@@ -0,0 +1,109 @@
++<?xml version="1.0" encoding="utf-8"?>
++<!DOCTYPE language SYSTEM "language.dtd"[
++  <!ENTITY nmtoken "[\-\w\d\.:_]+">
++  <!ENTITY entref  "(#[0-9]+|#[xX][0-9A-Fa-f]+|&nmtoken;);">
++]>
++<language name="DTD" version="1.02" kateversion="2.4" section="Markup" extensions="*.dtd" mimetype="application/xml-dtd" author="Andriy Lesyuk (s-andy at in.if.ua)" license="LGPL">
++  <highlighting>
++
++    <list name="Category">
++      <item>EMPTY</item>
++      <item>ANY</item>
++      <item>CDATA</item>
++      <item>ID</item>
++      <item>IDREF</item>
++      <item>IDREFS</item>
++      <item>NMTOKEN</item>
++      <item>NMTOKENS</item>
++      <item>ENTITY</item>
++      <item>ENTITIES</item>
++      <item>NOTATION</item>
++      <item>PUBLIC</item>
++      <item>SYSTEM</item>
++      <item>NDATA</item>
++    </list>
++
++    <list name="Keywords">
++      <item>#PCDATA</item>
++      <item>#REQUIRED</item>
++      <item>#IMPLIED</item>
++      <item>#FIXED</item>
++    </list>
++
++    <contexts>
++      <context name="Normal" attribute="Normal" lineEndContext="#stay">
++        <DetectSpaces />
++        <StringDetect attribute="Comment" context="Comment" String="&lt;!--" beginRegion="comment" />
++        <StringDetect attribute="Processing Instruction" context="PI" String="&lt;?xml" beginRegion="pi" />
++        <StringDetect attribute="Declaration" context="Declaration" String="&lt;!ELEMENT" beginRegion="declaration" />
++        <StringDetect attribute="Declaration" context="Declaration" String="&lt;!ATTLIST" beginRegion="declaration" />
++        <StringDetect attribute="Declaration" context="Declaration" String="&lt;!NOTATION" beginRegion="declaration" />
++        <StringDetect attribute="Declaration" context="Declaration" String="&lt;!ENTITY" beginRegion="declaration" />
++        <DetectIdentifier />
++      </context>
++
++      <context name="Comment" attribute="Comment" lineEndContext="#stay">
++        <DetectSpaces />
++        <StringDetect attribute="Comment" context="#pop" String="--&gt;" endRegion="comment" />
++        <IncludeRules context="##Alerts" />
++        <DetectIdentifier />
++      </context>
++
++      <context name="PI" attribute="Normal" lineEndContext="#stay">
++        <Detect2Chars attribute="Processing Instruction" context="#pop" char="?" char1="&gt;" endRegion="pi" />
++      </context>
++
++      <context name="Declaration" attribute="Normal" lineEndContext="#stay">
++        <StringDetect attribute="Comment" context="Comment" String="&lt;!--" beginRegion="comment" />
++        <Detect2Chars attribute="Comment" context="InlineComment" char="-" char1="-" />
++        <DetectChar attribute="Declaration" context="#pop" char="&gt;" endRegion="declaration" />
++        <DetectChar attribute="String" context="String" char="&quot;" />
++        <RegExpr attribute="Declaration" context="#stay" String="(-|O)\s(-|O)" />
++        <AnyChar attribute="Delimiter" context="#stay" String="(|)," />
++        <RegExpr attribute="Entity" context="#stay" String="(%|&amp;)&entref;" />
++        <AnyChar attribute="Symbol" context="#stay" String="?*+-&amp;" />
++        <RegExpr attribute="Local" context="#stay" String="%\s" />
++        <keyword attribute="Keyword" context="#stay" String="Category" />
++        <keyword attribute="Keyword" context="#stay" String="Keywords" />
++        <RegExpr attribute="Name" context="#stay" String="\b&nmtoken;\b" />
++      </context>
++
++      <context name="String" attribute="String" lineEndContext="#stay">
++        <DetectSpaces />
++        <DetectChar attribute="String" context="#pop" char="&quot;" />
++        <RegExpr attribute="Entity" context="#stay" String="%&nmtoken;;" />
++      </context>
++
++      <context name="InlineComment" attribute="Comment" lineEndContext="#pop">
++        <DetectSpaces />
++        <Detect2Chars attribute="Comment" context="#pop" char="-" char1="-" />
++        <IncludeRules context="##Alerts" />
++        <DetectIdentifier />
++      </context>
++
++    </contexts>
++
++    <itemDatas>
++      <itemData name="Normal" defStyleNum="dsNormal" />
++      <itemData name="Comment" defStyleNum="dsComment" />
++      <itemData name="Processing Instruction" defStyleNum="dsKeyword" />
++      <itemData name="Declaration" defStyleNum="dsDataType" bold="1" />
++      <itemData name="Name" defStyleNum="dsFunction" />
++      <itemData name="Delimiter" defStyleNum="dsDecVal" />
++      <itemData name="Symbol" defStyleNum="dsFloat" bold="1" />
++      <itemData name="Keyword" defStyleNum="dsKeyword" />
++      <itemData name="String" defStyleNum="dsString" />
++      <itemData name="Entity" defStyleNum="dsDecVal" />
++      <itemData name="Local" defStyleNum="dsDecVal" bold="1" />
++    </itemDatas>
++  </highlighting>
++
++  <general>
++    <comments>
++      <comment name="multiLine" start="&lt;!--" end="--&gt;" />
++    </comments>
++  </general>
++
++</language>
++<!-- kate: indent-width 2; indent-mode normal; tab-indents on; -->
++
+--- a/kate/syntax/data/c.xml
++++ b/kate/syntax/data/c.xml
+@@ -1,6 +1,13 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE language SYSTEM "language.dtd">
+-<language name="C" version="1.25" kateversion="2.4" section="Sources" extensions="*.c;*.C;*.h" mimetype="text/x-csrc;text/x-c++src;text/x-chdr" priority="5">
++<language name="C" version="1.41" kateversion="2.4" section="Sources" extensions="*.c;*.C;*.h" mimetype="text/x-csrc;text/x-c++src;text/x-chdr" priority="5">
++<!--
++##########################################################################
++## Fixes by Sebastian Pipping (webmaster at hartwork.org)
++##
++## NOTE: Keep in sync with C++ highlighter! (cpp.xml)
++##########################################################################
++-->
+   <highlighting>
+     <list name="keywords">
+       <item> break </item>
+@@ -46,8 +53,8 @@
+     <contexts>
+       <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
+         <DetectSpaces />
+-	<RegExpr attribute="Preprocessor" context="Outscoped" String="#\s*if\s+0" beginRegion="Outscoped" firstNonSpace="true" />
+-        <DetectChar attribute="Preprocessor" context="Preprocessor" char="#" firstNonSpace="true" />
++	<RegExpr attribute="Preprocessor" context="Outscoped" String="#\s*if\s+0" beginRegion="PP" firstNonSpace="true" />
++        <DetectChar context="AfterHash" char="#" firstNonSpace="true" lookAhead="true" />
+         <StringDetect attribute="Region Marker" context="Region Marker" String="//BEGIN" beginRegion="Region1" firstNonSpace="true" />
+         <StringDetect attribute="Region Marker" context="Region Marker" String="//END" endRegion="Region1" firstNonSpace="true" />
+         <keyword attribute="Keyword" context="#stay" String="keywords"/>
+@@ -77,36 +84,51 @@
+         <Detect2Chars attribute="Comment" context="Commentar 2" char="/" char1="*" beginRegion="Comment"/>
+         <AnyChar attribute="Symbol" context="#stay" String=":!%&amp;()+,-/.*&lt;=&gt;?[]|~^&#59;"/>
+       </context>
++
+       <context attribute="String" lineEndContext="#pop" name="String">
+         <LineContinue attribute="String" context="#stay"/>
+         <HlCStringChar attribute="String Char" context="#stay"/>
+         <DetectChar attribute="String" context="#pop" char="&quot;"/>
+       </context>
++
+       <context attribute="Region Marker" lineEndContext="#pop" name="Region Marker">
+       </context>
++
+       <context attribute="Comment" lineEndContext="#pop" name="Commentar 1">
+         <LineContinue attribute="Comment" context="#stay"/>
+         <IncludeRules context="##Alerts" />
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Commentar 2">
+         <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment"/>
+         <IncludeRules context="##Alerts" />
+       </context>
++
++      <context attribute="Error" lineEndContext="#pop" name="AfterHash">
++        <!-- define, elif, else, endif, error, if, ifdef, ifndef, include, include_next, line, pragma, undef, warning -->
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s*if(?:def|ndef)?(?=\s+\S)" insensitive="true" beginRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s*endif" insensitive="true" endRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Define" String="#\s*define.*((?=\\))" insensitive="true" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s*(?:el(?:se|if)|include(?:_next)?|define|undef|line|error|warning|pragma)" insensitive="true" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s+[0-9]+" insensitive="true" firstNonSpace="true" />
++      </context>
++
+       <context attribute="Preprocessor" lineEndContext="#pop" name="Preprocessor">
+         <LineContinue attribute="Preprocessor" context="#stay"/>
+-        <RegExpr attribute="Preprocessor" context="Define" String="define.*((?=\\))"/>
+-        <RegExpr attribute="Preprocessor" context="#stay" String="define.*"/>
+         <RangeDetect attribute="Prep. Lib" context="#stay" char="&quot;" char1="&quot;"/>
+         <RangeDetect attribute="Prep. Lib" context="#stay" char="&lt;" char1="&gt;"/>
+         <IncludeRules context="##Doxygen" />
+-        <Detect2Chars attribute="Comment" context="Commentar/Preprocessor" char="/" char1="*" beginRegion="Comment2"/>
++        <Detect2Chars attribute="Comment" context="Commentar/Preprocessor" char="/" char1="*" beginRegion="Comment2" />
+       </context>
++
+       <context attribute="Preprocessor" lineEndContext="#pop" name="Define">
+         <LineContinue attribute="Preprocessor" context="#stay"/>
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Commentar/Preprocessor">
+         <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment2" />
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Outscoped" >
+         <DetectSpaces />
+         <IncludeRules context="##Alerts" />
+@@ -115,9 +137,11 @@
+         <IncludeRules context="##Doxygen" />
+         <Detect2Chars attribute="Comment" context="Commentar 1" char="/" char1="/"/>
+         <Detect2Chars attribute="Comment" context="Commentar 2" char="/" char1="*" beginRegion="Comment"/>
+-        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="Outscoped" firstNonSpace="true" />
+-        <RegExpr attribute="Preprocessor" context="#pop" String="#\s*(endif|else|elif)" endRegion="Outscoped" firstNonSpace="true" />
++        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="#pop" String="#\s*el(?:se|if)" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="#pop" String="#\s*endif" endRegion="PP" firstNonSpace="true" />
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Outscoped intern">
+         <DetectSpaces />
+         <IncludeRules context="##Alerts" />
+@@ -126,8 +150,8 @@
+         <IncludeRules context="##Doxygen" />
+         <Detect2Chars attribute="Comment" context="Commentar 1" char="/" char1="/"/>
+         <Detect2Chars attribute="Comment" context="Commentar 2" char="/" char1="*" beginRegion="Comment"/>
+-        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="Outscoped" firstNonSpace="true" />
+-        <RegExpr attribute="Comment" context="#pop" String="#\s*endif" endRegion="Outscoped" firstNonSpace="true" />
++        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Comment" context="#pop" String="#\s*endif" endRegion="PP" firstNonSpace="true" />
+       </context>
+     </contexts>
+     <itemDatas>
+@@ -147,6 +171,7 @@
+       <itemData name="Prep. Lib"    defStyleNum="dsOthers"/> <!--,Qt::darkYellow,Qt::yellow,false,false)); -->
+       <itemData name="Alert"        defStyleNum="dsAlert" />
+       <itemData name="Region Marker" defStyleNum="dsRegionMarker" />
++      <itemData name="Error"        defStyleNum="dsError" />
+     </itemDatas>
+   </highlighting>
+   <general>
+--- a/kate/syntax/data/css.xml
++++ b/kate/syntax/data/css.xml
+@@ -1,6 +1,24 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE language SYSTEM "language.dtd">
+-<language name="CSS" version="2.00" kateversion="2.4" section="Markup" extensions="*.css" mimetype="text/css" author="Wilbert Berendsen (wilbert at kde.nl)" license="LGPL">
++
++<!--
++
++    Kate CSS syntax highlighting definition
++
++
++    Changelog:
++
++    - Version 2.01, by Mathieu Bonnet:
++
++        - Added CSS 3 property "border-radius".
++        - Added Gecko CSS properties "-moz-border-radius" and "-moz-box-flex".
++        - Added Gecko CSS value "-moz-box".
++        - Added Trident CSS functional notation "expression".
++        - Extended the id and class syntax specifications, as per CSS 2.1 grammar.
++
++-->
++
++<language name="CSS" version="2.01" kateversion="2.4" section="Markup" extensions="*.css" mimetype="text/css" author="Wilbert Berendsen (wilbert at kde.nl)" license="LGPL">
+ 
+   <highlighting>
+     <list name="properties">
+@@ -130,10 +148,15 @@
+       <item> z-index </item>
+ 
+       <!-- CSS3 -->
++      <item> border-radius </item>
+       <item> box-sizing </item>
+       <item> opacity </item>
+       <item> text-shadow </item>
+ 
++      <!-- Gecko rendering engine CSS property extensions -->
++      <item> -moz-border-radius </item>
++      <item> -moz-box-flex </item>
++
+       <!-- konq specific -->
+       <item> konq_bgpos_x </item>
+       <item> konq_bgpos_y </item>
+@@ -349,6 +372,10 @@
+       <item> monospace </item>
+       <item> border-box </item>
+       <item> content-box </item>
++      
++      <!-- Gecko rendering engine CSS value extensions -->
++      <item> -moz-box </item>      
++      
+     </list>
+ 
+ 
+@@ -410,6 +437,10 @@
+       <!-- in @font-face -->
+       <item> local </item>
+       <item> format </item>
++      
++      <!-- Trident (a.k.a., MSHTML) rendering engine functional notation extensions -->
++      <item> expression </item>
++      
+     </list>
+ 
+     <list name="mediatypes">
+@@ -472,8 +503,8 @@
+         <DetectChar attribute="Property" context="RuleSet" char="{" beginRegion="ruleset" />
+         <!--parse selectors-->
+ 	<DetectChar attribute="Selector Attr" context="SelAttr" char="[" />
+-	<RegExpr attribute="Selector Id" context="#stay" String="#[A-Za-z0-9][\w\-]*" />
+-	<RegExpr attribute="Selector Class" context="#stay" String="\.[A-Za-z0-9][\w\-]*" />
++	<RegExpr attribute="Selector Id" context="#stay" String="#([a-zA-Z0-9\-_]|[\x80-\xFF]|\\[0-9A-Fa-f]{1,6})*" />
++	<RegExpr attribute="Selector Class" context="#stay" String="\.([a-zA-Z0-9\-_]|[\x80-\xFF]|\\[0-9A-Fa-f]{1,6})*" />
+ 	<RegExpr attribute="Selector Pseudo" context="#stay" String=":lang\([\w_-]+\)" />
+ 	<DetectChar attribute="Selector Pseudo" context="SelPseudo" char=":" />
+ 	<IncludeRules context="FindStrings" />
+--- a/kate/syntax/data/bash.xml
++++ b/kate/syntax/data/bash.xml
+@@ -8,10 +8,11 @@
+         <!ENTITY noword   "(?![\w$+-])">                <!-- no word, $, + or - following -->
+         <!ENTITY pathpart "([\w_ at .&#37;*?+-]|\\ )">     <!-- valid character in a file name -->
+ ]>
+-<language name="Bash" version="2.08" kateversion="2.4" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;.bashrc;.bash_profile;.bash_login;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert at kde.nl)" license="LGPL">
++<language name="Bash" version="2.10" kateversion="2.4" section="Scripts" extensions="*.sh;*.bash;*.ebuild;*.eclass;.bashrc;.bash_profile;.bash_login;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Wilbert Berendsen (wilbert at kde.nl)" license="LGPL">
+ 
+ <!-- (c) 2004 by Wilbert Berendsen (wilbert at kde.nl)
+     Changes by Matthew Woehlke (mw_triad at users.sourceforge.net)
++    Changes by Sebastian Pipping (webmaster at hartwork.org)
+     Released under the LGPL, part of kdelibs/kate -->
+ 
+   <highlighting>
+@@ -522,7 +523,7 @@
+         <!-- handle commands that have variable names as argument -->
+         <keyword attribute="Builtin" context="VarName" String="builtins_var" />
+         <!-- handle here-string -->
+-        <StringDetect attribute="Redirection" context="#stay" String="&lt;&lt;&lt;" />
++        <RegExpr attribute="Redirection" context="#stay" String="\d*&lt;&lt;&lt;" />
+         <!-- handle here document -->
+         <StringDetect attribute="Redirection" context="HereDoc" String="&lt;&lt;" lookAhead="true" />
+         <!-- handle process subst -->
+@@ -831,23 +832,23 @@
+ 
+       <context attribute="Normal Text" lineEndContext="#stay" name="HereDocQ" dynamic="true">
+         <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" />
+-        <RegExpr attribute="Redirection" context="#pop#pop" String="%2[\s;]*$" dynamic="true" column="0"/>
++        <RegExpr attribute="Redirection" context="#pop#pop" String="^%2$" dynamic="true" column="0"/>
+       </context>
+ 
+       <context attribute="Normal Text" lineEndContext="#stay" name="HereDocNQ" dynamic="true">
+         <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" />
+-        <RegExpr attribute="Redirection" context="#pop#pop" String="%2[\s;]*$" dynamic="true" column="0"/>
++        <RegExpr attribute="Redirection" context="#pop#pop" String="^%2$" dynamic="true" column="0"/>
+         <IncludeRules context="FindSubstitutions" />
+       </context>
+ 
+       <context attribute="Normal Text" lineEndContext="#stay" name="HereDocIQ" dynamic="true">
+         <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" />
+-        <RegExpr attribute="Redirection" context="#pop#pop" String="\s*%2[\s;]*$" dynamic="true" column="0"/>
++        <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2$" dynamic="true" column="0"/>
+       </context>
+ 
+       <context attribute="Normal Text" lineEndContext="#stay" name="HereDocINQ" dynamic="true">
+         <RegExpr attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true" />
+-        <RegExpr attribute="Redirection" context="#pop#pop" String="\s*%2[\s;]*$" dynamic="true" column="0"/>
++        <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2$" dynamic="true" column="0"/>
+         <IncludeRules context="FindSubstitutions" />
+       </context>
+ 
+--- /dev/null
++++ b/kate/syntax/data/json.xml
+@@ -0,0 +1,100 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE language SYSTEM "language.dtd">
++<!--
++ ***************************************************************************
++ ** Writing a Kate Highlighting XML File
++ ** http://kate-editor.org/article/writing_a_kate_highlighting_xml_file
++ **
++ ** Introducing JSON
++ ** http://www.json.org/
++ **
++ ** The application/json Media Type for JavaScript Object Notation (JSON)
++ ** http://tools.ietf.org/html/rfc4627
++ ***************************************************************************
++-->
++<language name="JSON" section="Markup" version="1.00" kateversion="2.3" extensions="*.json" mimetype="application/json" author="Sebastian Pipping (webmaster at hartwork.org)" license="GPL">
++  <highlighting>
++		<list name="Constants">
++      <item>null</item>
++      <item>true</item>
++      <item>false</item>
++    </list>
++
++    <contexts>
++      <context name="Normal" lineEndContext="#stay" attribute="Style_Error">
++        <DetectChar char="{"       context="Pair" beginRegion="Region_Object" attribute="Style_Seperator_Pair" />
++      </context>
++
++      <context name="Pair" lineEndContext="#stay" attribute="Style_Error">
++        <DetectChar char="&quot;"  context="String_Key" attribute="Style_String_Key" />
++        <DetectChar char=":"       context="Value" attribute="Style_Seperator_Pair" />
++        <DetectChar char="}"       context="#pop" endRegion="Region_Object" attribute="Style_Seperator_Pair" />
++        <DetectChar char=","       context="#stay" attribute="Style_Seperator_Pair" />
++
++        <DetectSpaces context="#stay" attribute="Style_Normal" />
++      </context>
++
++      <context name="String_Key" lineEndContext="#stay" attribute="Style_String_Key">
++        <DetectChar char="&quot;"  context="#pop" attribute="Style_String_Key" />
++        <RegExpr String="\\(?:[&quot;\\/bfnrt]|u[0-9a-fA-f]{4})" context="#stay" insensitive="false" minimal="false" attribute="Style_String_Key_Char" />
++      </context>
++
++      <context name="Value" lineEndContext="#stay" attribute="Style_Error" >
++        <DetectChar char="&quot;"  context="String_Value" attribute="Style_String_Value" />
++        <DetectChar char="{"       context="Pair" beginRegion="Region_Object" attribute="Style_Seperator_Pair" />
++        <DetectChar char="["       context="Array" beginRegion="Region_Array" attribute="Style_Seperator_Array" />
++        <DetectChar char="}"       context="#pop" lookAhead="true" />
++        <DetectChar char=","       context="#pop" lookAhead="true" />
++
++        <DetectSpaces context="#stay" attribute="Style_Normal" />
++
++        <keyword String="Constants" context="#stay" attribute="Style_Keyword" />
++
++        <RegExpr String="-?(?:[0-9]|[1-9][0-9]+)\.[0-9]+(?:[eE][+-]?[0-9]+)?" context="#stay" insensitive="false" minimal="false" attribute="Style_Float" />
++        <RegExpr String="-?(?:[0-9]|[1-9][0-9]+)(?:[eE][+-]?[0-9]+)?" context="#stay" insensitive="false" minimal="false" attribute="Style_Decimal" />
++      </context>
++
++      <context name="String_Value" lineEndContext="#stay" attribute="Style_String_Value">
++        <DetectChar char="&quot;"  context="#pop" attribute="Style_String_Value" />
++        <RegExpr String="\\(?:[&quot;\\/bfnrt]|u[0-9a-fA-f]{4})" context="#stay" insensitive="false" minimal="false" attribute="Style_String_Value_Char" />
++      </context>
++
++      <context name="Array" lineEndContext="#stay" attribute="Style_Error">
++        <DetectChar char=","       context="#stay" attribute="Style_Seperator_Array" />
++        <DetectChar char="]"       context="#pop" endRegion="Region_Array" attribute="Style_Seperator_Array" />
++
++        <DetectChar char="{"       context="Pair" beginRegion="Region_Object" attribute="Style_Seperator_Pair" />
++        <DetectChar char="&quot;"  context="String_Value" attribute="Style_String_Value" />
++
++        <DetectSpaces context="#stay" attribute="Style_Normal" />
++
++        <keyword String="Constants" context="#stay" attribute="Style_Keyword" />
++
++        <RegExpr String="-?(?:[0-9]|[1-9][0-9]+)\.[0-9]+(?:[eE][+-]?[0-9]+)?" context="#stay" insensitive="false" minimal="false" attribute="Style_Float" />
++        <RegExpr String="-?(?:[0-9]|[1-9][0-9]+)(?:[eE][+-]?[0-9]+)?" context="#stay" insensitive="false" minimal="false" attribute="Style_Decimal" />
++      </context>
++    </contexts>
++
++    <itemDatas>
++      <itemData name="Style_Normal"             defStyleNum="dsNormal" />
++
++      <itemData name="Style_Seperator_Pair"     defStyleNum="dsNormal" bold="1" color="#EF0000" />
++      <itemData name="Style_Seperator_Array"    defStyleNum="dsNormal" bold="1" color="#0000AF" />
++
++      <itemData name="Style_Decimal"            defStyleNum="dsDecVal" />
++      <itemData name="Style_Float"              defStyleNum="dsFloat" />
++      <itemData name="Style_String_Key"         defStyleNum="dsDataType" />
++      <itemData name="Style_String_Value"       defStyleNum="dsString" color="#FF00FF" />
++      <itemData name="Style_String_Key_Char"    defStyleNum="dsDataType" underline="1" />
++      <itemData name="Style_String_Value_Char"  defStyleNum="dsString" color="#FF00FF" underline="1" />
++
++			<itemData name="Style_Keyword"            defStyleNum="dsDecVal" bold="1" />
++
++			<itemData name="Style_Error"              defStyleNum="dsError" />
++    </itemDatas>
++  </highlighting>
++</language>
++<!--
++// kate: space-indent on; indent-width 2; replace-tabs on;
++-->
++
+--- a/kate/syntax/data/tcl.xml
++++ b/kate/syntax/data/tcl.xml
+@@ -8,13 +8,25 @@
+     Updated by Pawel Salawa (boogie at scripts dot one dot pl)
+ 
+     Revision history:
++        1.10:
++            - Fixed problem with single ':' character after variable name (it's no longer variable,
++              because only double-colon is namespace delimiter and can be part of variable name).
++            - Fixed problem with matching quote character next to regular character, for example:
++              puts {"string"}
++              In that case left bracked was marked as string, but it's no longer like that.
++            - Fixed problem with variable names like: ${text\}test}
++              It whole is valid variable name, because of escape character.
++            - Fixed problem with marking ';' character as a comment when '#' character was after the ';'.
++            - Fixed problem with marking options. '-' character after word-delimiter character caused
++              marking that word-delimiter character as option too, even it wasn't white-space.
++            - Few other minor optimalizations.
+ 	1.09:
+ 	    - Added fast comments support (Ctrl+d or whatever your shortcut is)
+ 	    - Fixed single-character variables detection
+ 	    - Fixed detection of varaibles with names containing serval namespace delimiters (::)
+ -->
+ 
+-<language name="Tcl/Tk" version="1.09" kateversion="2.4" section="Scripts" extensions="*.tcl;*.tk" mimetype="text/x-tcl">
++<language name="Tcl/Tk" version="1.10" kateversion="2.4" section="Scripts" extensions="*.tcl;*.tk" mimetype="text/x-tcl">
+   <highlighting>
+     <list name="keywords">
+       <item> after </item>
+@@ -450,24 +462,39 @@
+ 
+     <contexts>
+       <context name = "Base" attribute = "Normal Text" lineEndContext="#stay">
++      
++        <!-- Virtual blocks -->
+         <RegExpr attribute="Region Marker" context="#stay" String="#\s*BEGIN.*$" beginRegion="region" firstNonSpace="true"/>
+         <RegExpr attribute="Region Marker" context="#stay" String="#\s*END.*$" endRegion="region" firstNonSpace="true"/>
++        
++        <!-- Standard -->
+         <keyword String = "keywords" attribute = "Keyword" context="#stay"/>
+         <keyword String = "keywords-opt" attribute = "Parameter" context="#stay"/>
+         <Float attribute = "Float" context="#stay"/>
+         <Int attribute ="Decimal" context="#stay"/>
+         <RegExpr String="\\." attribute = "Char" context = "#stay"/>
+-        <RegExpr String = "\W-\w+" attribute = "Parameter" context="#stay"/>
+-        <RegExpr String = "\$\{[^\}]+\}" attribute = "Variable" context="#stay"/>
+-        <RegExpr String = "\$[\w:]+" attribute = "Variable" context="#stay"/>
+-        <RegExpr String = "[^\\]&quot;&quot;" attribute = "String" context="#stay"/>
+-        <RegExpr String = "[^\\]&quot;" attribute = "String" context="String"/>
+-        <RegExpr String= "#.*$" attribute = "Comment" context="#stay" firstNonSpace="true"/>
+-        <RegExpr String= ";\s*#.*$" attribute = "Comment" context="#stay"/>
++        
++        <!-- Options -->
++        <RegExpr String = "\s-\w+" attribute = "Parameter" context="#stay"/>
++        
++        <!-- Variables -->
++        <RegExpr String = "\$\{([^\}]|\\\})+\}" attribute = "Variable" context="#stay"/>
++        <RegExpr String = "\$(::|\w)+" attribute = "Variable" context="#stay"/>
++        
++        <!-- Strings -->
++        <RegExpr String = "&quot;{2}" attribute = "String" context="#stay"/>
++        <RegExpr String = "&quot;" attribute = "String" context="String"/>
++        
++        <!-- Comments -->
++        <DetectChar char = ";" attribute = "Normal Text" context="New command line" />
++        <DetectChar char = "#" attribute = "Comment" context="Comment" firstNonSpace="true"/>
++        
++        <!-- Braces, brackets, etc -->
+         <DetectChar char = "{" attribute = "Keyword" context="#stay" beginRegion="block"/>
+         <DetectChar char = "}" attribute = "Keyword" context="#stay" endRegion="block"/>
+         <DetectChar char = "[" attribute = "Keyword" context="#stay"/>
+         <DetectChar char = "]" attribute = "Keyword" context="#stay"/>
++        
+       </context>
+ 
+       <context name = "String" attribute = "String" lineEndContext="#stay">
+@@ -475,6 +502,13 @@
+         <DetectChar char="&quot;" attribute = "String" context = "#pop"/>
+         <DetectChar char  = "$" attribute = "Variable" context="#stay"/>
+       </context>
++
++      <context name = "Comment" attribute = "Comment" lineEndContext="#pop"/>
++
++      <context name = "New command line" attribute = "Normal Text" lineEndContext="#stay">
++        <RegExpr String = "\s*#" attribute="Comment" context="Comment" />
++        <RegExpr String = "." attribute="Normal Text" context="#pop" lookAhead="true" />
++      </context>
+     </contexts>
+ 
+     <itemDatas>
+--- a/kate/syntax/data/javascript.xml
++++ b/kate/syntax/data/javascript.xml
+@@ -3,7 +3,7 @@
+ <!-- Author: Anders Lund <anders at alweb.dk> //-->
+ <!-- Minor changes: Joseph Wenninger <jowenn at kde.org> //-->
+ <!-- Full JavaScript 1.0 support by Whitehawk Stormchaser //-->
+-<language name="JavaScript" version="1.10" kateversion="2.3" section="Scripts" extensions="*.js" mimetype="text/x-javascript" author="Anders Lund (anders at alweb.dk), Joseph Wenninger (jowenn at kde.org), Whitehawk Stormchaser (zerokode at gmx.net)" license="">
++<language name="JavaScript" version="1.11" kateversion="2.3" section="Scripts" extensions="*.js" mimetype="text/x-javascript;application/x-javascript" author="Anders Lund (anders at alweb.dk), Joseph Wenninger (jowenn at kde.org), Whitehawk Stormchaser (zerokode at gmx.net)" license="">
+   <highlighting>
+     <list name="keywords">
+         <item> if </item>
+--- /dev/null
++++ b/kate/syntax/data/scala.xml
+@@ -0,0 +1,3503 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE language SYSTEM "language.dtd">
++<language name="Scala" version="1.0" kateversion="2.4" section="Sources"
++          extensions="*.scala" mimetype="text/x-scala" license="LGPL"
++          author="Stephane Micheloud (stephane.micheloud at epfl.ch)">
++<!--
++First version added to reository was 1.0 downloaded from
++https://lampsvn.epfl.ch/trac/scala/browser/scala-tool-support/trunk/src/kate/scala.xml?format=raw
++
++adapted from "java.xml" by Alfredo Luiz Foltran Fialho (alfoltran at ig.com.br)
++-->
++  <highlighting>
++    <list name="scala2">
++      <item> Actor </item>
++      <item> ActorProxy </item>
++      <item> ActorTask </item>
++      <item> ActorThread </item>
++      <item> AllRef </item>
++      <item> Any </item>
++      <item> AnyRef </item>
++      <item> Application </item>
++      <item> AppliedType </item>
++      <item> Array </item>
++      <item> ArrayBuffer </item>
++      <item> Attribute </item>
++      <item> BoxedArray </item>
++      <item> BoxedBooleanArray </item>
++      <item> BoxedByteArray </item>
++      <item> BoxedCharArray </item>
++      <item> Buffer </item>
++      <item> BufferedIterator </item>
++      <item> Char </item>
++      <item> Console </item>
++      <item> Enumeration </item>
++      <item> Fluid </item>
++      <item> Function </item>
++      <item> IScheduler </item>
++      <item> ImmutableMapAdaptor </item>
++      <item> ImmutableSetAdaptor </item>
++      <item> Int </item>
++      <item> Iterable </item>
++      <item> List </item>
++      <item> ListBuffer </item>
++      <item> None </item>
++      <item> Option </item>
++      <item> Ordered </item>
++      <item> Pair </item>
++      <item> PartialFunction </item>
++      <item> Pid </item>
++      <item> Predef </item>
++      <item> PriorityQueue </item>
++      <item> PriorityQueueProxy </item>
++      <item> Reaction </item>
++      <item> Ref </item>
++      <item> Responder </item>
++      <item> RichInt </item>
++      <item> RichString </item>
++      <item> Rule </item>
++      <item> RuleTransformer </item>
++      <item> Script </item>
++      <item> Seq </item>
++      <item> SerialVersionUID </item>
++      <item> Some </item>
++      <item> Stream </item>
++      <item> Symbol </item>
++      <item> TcpService </item>
++      <item> TcpServiceWorker </item>
++      <item> Triple </item>
++      <item> Unit </item>
++      <item> Value </item>
++      <item> WorkerThread </item>
++      <item> serializable </item>
++      <item> transient </item>
++      <item> volatile </item>
++    </list>
++    <list name="java15">
++      <item> ACTIVE </item>
++      <item> ACTIVITY_COMPLETED </item>
++      <item> ACTIVITY_REQUIRED </item>
++      <item> ARG_IN </item>
++      <item> ARG_INOUT </item>
++      <item> ARG_OUT </item>
++      <item> AWTError </item>
++      <item> AWTEvent </item>
++      <item> AWTEventListener </item>
++      <item> AWTEventListenerProxy </item>
++      <item> AWTEventMulticaster </item>
++      <item> AWTException </item>
++      <item> AWTKeyStroke </item>
++      <item> AWTPermission </item>
++      <item> AbstractAction </item>
++      <item> AbstractBorder </item>
++      <item> AbstractButton </item>
++      <item> AbstractCellEditor </item>
++      <item> AbstractCollection </item>
++      <item> AbstractColorChooserPanel </item>
++      <item> AbstractDocument </item>
++      <item> AbstractDocument.AttributeContext </item>
++      <item> AbstractDocument.Content </item>
++      <item> AbstractDocument.ElementEdit </item>
++      <item> AbstractExecutorService </item>
++      <item> AbstractInterruptibleChannel </item>
++      <item> AbstractLayoutCache </item>
++      <item> AbstractLayoutCache.NodeDimensions </item>
++      <item> AbstractList </item>
++      <item> AbstractListModel </item>
++      <item> AbstractMap </item>
++      <item> AbstractMethodError </item>
++      <item> AbstractPreferences </item>
++      <item> AbstractQueue </item>
++      <item> AbstractQueuedSynchronizer </item>
++      <item> AbstractSelectableChannel </item>
++      <item> AbstractSelectionKey </item>
++      <item> AbstractSelector </item>
++      <item> AbstractSequentialList </item>
++      <item> AbstractSet </item>
++      <item> AbstractSpinnerModel </item>
++      <item> AbstractTableModel </item>
++      <item> AbstractUndoableEdit </item>
++      <item> AbstractWriter </item>
++      <item> AccessControlContext </item>
++      <item> AccessControlException </item>
++      <item> AccessController </item>
++      <item> AccessException </item>
++      <item> Accessible </item>
++      <item> AccessibleAction </item>
++      <item> AccessibleAttributeSequence </item>
++      <item> AccessibleBundle </item>
++      <item> AccessibleComponent </item>
++      <item> AccessibleContext </item>
++      <item> AccessibleEditableText </item>
++      <item> AccessibleExtendedComponent </item>
++      <item> AccessibleExtendedTable </item>
++      <item> AccessibleExtendedText </item>
++      <item> AccessibleHyperlink </item>
++      <item> AccessibleHypertext </item>
++      <item> AccessibleIcon </item>
++      <item> AccessibleKeyBinding </item>
++      <item> AccessibleObject </item>
++      <item> AccessibleRelation </item>
++      <item> AccessibleRelationSet </item>
++      <item> AccessibleResourceBundle </item>
++      <item> AccessibleRole </item>
++      <item> AccessibleSelection </item>
++      <item> AccessibleState </item>
++      <item> AccessibleStateSet </item>
++      <item> AccessibleStreamable </item>
++      <item> AccessibleTable </item>
++      <item> AccessibleTableModelChange </item>
++      <item> AccessibleText </item>
++      <item> AccessibleTextSequence </item>
++      <item> AccessibleValue </item>
++      <item> AccountException </item>
++      <item> AccountExpiredException </item>
++      <item> AccountLockedException </item>
++      <item> AccountNotFoundException </item>
++      <item> Acl </item>
++      <item> AclEntry </item>
++      <item> AclNotFoundException </item>
++      <item> Action </item>
++      <item> ActionEvent </item>
++      <item> ActionListener </item>
++      <item> ActionMap </item>
++      <item> ActionMapUIResource </item>
++      <item> Activatable </item>
++      <item> ActivateFailedException </item>
++      <item> ActivationDesc </item>
++      <item> ActivationException </item>
++      <item> ActivationGroup </item>
++      <item> ActivationGroupDesc </item>
++      <item> ActivationGroupDesc.CommandEnvironment </item>
++      <item> ActivationGroupID </item>
++      <item> ActivationGroup_Stub </item>
++      <item> ActivationID </item>
++      <item> ActivationInstantiator </item>
++      <item> ActivationMonitor </item>
++      <item> ActivationSystem </item>
++      <item> Activator </item>
++      <item> ActiveEvent </item>
++      <item> ActivityCompletedException </item>
++      <item> ActivityRequiredException </item>
++      <item> AdapterActivator </item>
++      <item> AdapterActivatorOperations </item>
++      <item> AdapterAlreadyExists </item>
++      <item> AdapterAlreadyExistsHelper </item>
++      <item> AdapterInactive </item>
++      <item> AdapterInactiveHelper </item>
++      <item> AdapterManagerIdHelper </item>
++      <item> AdapterNameHelper </item>
++      <item> AdapterNonExistent </item>
++      <item> AdapterNonExistentHelper </item>
++      <item> AdapterStateHelper </item>
++      <item> AddressHelper </item>
++      <item> Adjustable </item>
++      <item> AdjustmentEvent </item>
++      <item> AdjustmentListener </item>
++      <item> Adler32 </item>
++      <item> AffineTransform </item>
++      <item> AffineTransformOp </item>
++      <item> AlgorithmParameterGenerator </item>
++      <item> AlgorithmParameterGeneratorSpi </item>
++      <item> AlgorithmParameterSpec </item>
++      <item> AlgorithmParameters </item>
++      <item> AlgorithmParametersSpi </item>
++      <item> AllPermission </item>
++      <item> AlphaComposite </item>
++      <item> AlreadyBound </item>
++      <item> AlreadyBoundException </item>
++      <item> AlreadyBoundHelper </item>
++      <item> AlreadyBoundHolder </item>
++      <item> AlreadyConnectedException </item>
++      <item> AncestorEvent </item>
++      <item> AncestorListener </item>
++      <item> AnnotatedElement </item>
++      <item> Annotation </item>
++      <item> Annotation </item>
++      <item> AnnotationFormatError </item>
++      <item> AnnotationTypeMismatchException </item>
++      <item> Any </item>
++      <item> AnyHolder </item>
++      <item> AnySeqHelper </item>
++      <item> AnySeqHelper </item>
++      <item> AnySeqHolder </item>
++      <item> AppConfigurationEntry </item>
++      <item> AppConfigurationEntry.LoginModuleControlFlag </item>
++      <item> Appendable </item>
++      <item> Applet </item>
++      <item> AppletContext </item>
++      <item> AppletInitializer </item>
++      <item> AppletStub </item>
++      <item> ApplicationException </item>
++      <item> Arc2D </item>
++      <item> Arc2D.Double </item>
++      <item> Arc2D.Float </item>
++      <item> Area </item>
++      <item> AreaAveragingScaleFilter </item>
++      <item> ArithmeticException </item>
++      <item> Array </item>
++      <item> Array </item>
++      <item> ArrayBlockingQueue </item>
++      <item> ArrayIndexOutOfBoundsException </item>
++      <item> ArrayList </item>
++      <item> ArrayStoreException </item>
++      <item> ArrayType </item>
++      <item> Arrays </item>
++      <item> AssertionError </item>
++      <item> AsyncBoxView </item>
++      <item> AsynchronousCloseException </item>
++      <item> AtomicBoolean </item>
++      <item> AtomicInteger </item>
++      <item> AtomicIntegerArray </item>
++      <item> AtomicIntegerFieldUpdater </item>
++      <item> AtomicLong </item>
++      <item> AtomicLongArray </item>
++      <item> AtomicLongFieldUpdater </item>
++      <item> AtomicMarkableReference </item>
++      <item> AtomicReference </item>
++      <item> AtomicReferenceArray </item>
++      <item> AtomicReferenceFieldUpdater </item>
++      <item> AtomicStampedReference </item>
++      <item> Attr </item>
++      <item> Attribute </item>
++      <item> Attribute </item>
++      <item> Attribute </item>
++      <item> AttributeChangeNotification </item>
++      <item> AttributeChangeNotificationFilter </item>
++      <item> AttributeException </item>
++      <item> AttributeInUseException </item>
++      <item> AttributeList </item>
++      <item> AttributeList </item>
++      <item> AttributeList </item>
++      <item> AttributeListImpl </item>
++      <item> AttributeModificationException </item>
++      <item> AttributeNotFoundException </item>
++      <item> AttributeSet </item>
++      <item> AttributeSet </item>
++      <item> AttributeSet.CharacterAttribute </item>
++      <item> AttributeSet.ColorAttribute </item>
++      <item> AttributeSet.FontAttribute </item>
++      <item> AttributeSet.ParagraphAttribute </item>
++      <item> AttributeSetUtilities </item>
++      <item> AttributeValueExp </item>
++      <item> AttributedCharacterIterator </item>
++      <item> AttributedCharacterIterator.Attribute </item>
++      <item> AttributedString </item>
++      <item> Attributes </item>
++      <item> Attributes </item>
++      <item> Attributes </item>
++      <item> Attributes.Name </item>
++      <item> Attributes2 </item>
++      <item> Attributes2Impl </item>
++      <item> AttributesImpl </item>
++      <item> AudioClip </item>
++      <item> AudioFileFormat </item>
++      <item> AudioFileFormat.Type </item>
++      <item> AudioFileReader </item>
++      <item> AudioFileWriter </item>
++      <item> AudioFormat </item>
++      <item> AudioFormat.Encoding </item>
++      <item> AudioInputStream </item>
++      <item> AudioPermission </item>
++      <item> AudioSystem </item>
++      <item> AuthPermission </item>
++      <item> AuthProvider </item>
++      <item> AuthenticationException </item>
++      <item> AuthenticationException </item>
++      <item> AuthenticationNotSupportedException </item>
++      <item> Authenticator </item>
++      <item> Authenticator.RequestorType </item>
++      <item> AuthorizeCallback </item>
++      <item> Autoscroll </item>
++      <item> BAD_CONTEXT </item>
++      <item> BAD_INV_ORDER </item>
++      <item> BAD_OPERATION </item>
++      <item> BAD_PARAM </item>
++      <item> BAD_POLICY </item>
++      <item> BAD_POLICY_TYPE </item>
++      <item> BAD_POLICY_VALUE </item>
++      <item> BAD_QOS </item>
++      <item> BAD_TYPECODE </item>
++      <item> BMPImageWriteParam </item>
++      <item> BackingStoreException </item>
++      <item> BadAttributeValueExpException </item>
++      <item> BadBinaryOpValueExpException </item>
++      <item> BadKind </item>
++      <item> BadLocationException </item>
++      <item> BadPaddingException </item>
++      <item> BadStringOperationException </item>
++      <item> BandCombineOp </item>
++      <item> BandedSampleModel </item>
++      <item> BaseRowSet </item>
++      <item> BasicArrowButton </item>
++      <item> BasicAttribute </item>
++      <item> BasicAttributes </item>
++      <item> BasicBorders </item>
++      <item> BasicBorders.ButtonBorder </item>
++      <item> BasicBorders.FieldBorder </item>
++      <item> BasicBorders.MarginBorder </item>
++      <item> BasicBorders.MenuBarBorder </item>
++      <item> BasicBorders.RadioButtonBorder </item>
++      <item> BasicBorders.RolloverButtonBorder </item>
++      <item> BasicBorders.SplitPaneBorder </item>
++      <item> BasicBorders.ToggleButtonBorder </item>
++      <item> BasicButtonListener </item>
++      <item> BasicButtonUI </item>
++      <item> BasicCheckBoxMenuItemUI </item>
++      <item> BasicCheckBoxUI </item>
++      <item> BasicColorChooserUI </item>
++      <item> BasicComboBoxEditor </item>
++      <item> BasicComboBoxEditor.UIResource </item>
++      <item> BasicComboBoxRenderer </item>
++      <item> BasicComboBoxRenderer.UIResource </item>
++      <item> BasicComboBoxUI </item>
++      <item> BasicComboPopup </item>
++      <item> BasicControl </item>
++      <item> BasicDesktopIconUI </item>
++      <item> BasicDesktopPaneUI </item>
++      <item> BasicDirectoryModel </item>
++      <item> BasicEditorPaneUI </item>
++      <item> BasicFileChooserUI </item>
++      <item> BasicFormattedTextFieldUI </item>
++      <item> BasicGraphicsUtils </item>
++      <item> BasicHTML </item>
++      <item> BasicIconFactory </item>
++      <item> BasicInternalFrameTitlePane </item>
++      <item> BasicInternalFrameUI </item>
++      <item> BasicLabelUI </item>
++      <item> BasicListUI </item>
++      <item> BasicLookAndFeel </item>
++      <item> BasicMenuBarUI </item>
++      <item> BasicMenuItemUI </item>
++      <item> BasicMenuUI </item>
++      <item> BasicOptionPaneUI </item>
++      <item> BasicOptionPaneUI.ButtonAreaLayout </item>
++      <item> BasicPanelUI </item>
++      <item> BasicPasswordFieldUI </item>
++      <item> BasicPermission </item>
++      <item> BasicPopupMenuSeparatorUI </item>
++      <item> BasicPopupMenuUI </item>
++      <item> BasicProgressBarUI </item>
++      <item> BasicRadioButtonMenuItemUI </item>
++      <item> BasicRadioButtonUI </item>
++      <item> BasicRootPaneUI </item>
++      <item> BasicScrollBarUI </item>
++      <item> BasicScrollPaneUI </item>
++      <item> BasicSeparatorUI </item>
++      <item> BasicSliderUI </item>
++      <item> BasicSpinnerUI </item>
++      <item> BasicSplitPaneDivider </item>
++      <item> BasicSplitPaneUI </item>
++      <item> BasicStroke </item>
++      <item> BasicTabbedPaneUI </item>
++      <item> BasicTableHeaderUI </item>
++      <item> BasicTableUI </item>
++      <item> BasicTextAreaUI </item>
++      <item> BasicTextFieldUI </item>
++      <item> BasicTextPaneUI </item>
++      <item> BasicTextUI </item>
++      <item> BasicTextUI.BasicCaret </item>
++      <item> BasicTextUI.BasicHighlighter </item>
++      <item> BasicToggleButtonUI </item>
++      <item> BasicToolBarSeparatorUI </item>
++      <item> BasicToolBarUI </item>
++      <item> BasicToolTipUI </item>
++      <item> BasicTreeUI </item>
++      <item> BasicViewportUI </item>
++      <item> BatchUpdateException </item>
++      <item> BeanContext </item>
++      <item> BeanContextChild </item>
++      <item> BeanContextChildComponentProxy </item>
++      <item> BeanContextChildSupport </item>
++      <item> BeanContextContainerProxy </item>
++      <item> BeanContextEvent </item>
++      <item> BeanContextMembershipEvent </item>
++      <item> BeanContextMembershipListener </item>
++      <item> BeanContextProxy </item>
++      <item> BeanContextServiceAvailableEvent </item>
++      <item> BeanContextServiceProvider </item>
++      <item> BeanContextServiceProviderBeanInfo </item>
++      <item> BeanContextServiceRevokedEvent </item>
++      <item> BeanContextServiceRevokedListener </item>
++      <item> BeanContextServices </item>
++      <item> BeanContextServicesListener </item>
++      <item> BeanContextServicesSupport </item>
++      <item> BeanContextServicesSupport.BCSSServiceProvider </item>
++      <item> BeanContextSupport </item>
++      <item> BeanContextSupport.BCSIterator </item>
++      <item> BeanDescriptor </item>
++      <item> BeanInfo </item>
++      <item> Beans </item>
++      <item> BevelBorder </item>
++      <item> Bidi </item>
++      <item> BigDecimal </item>
++      <item> BigInteger </item>
++      <item> BinaryRefAddr </item>
++      <item> BindException </item>
++      <item> Binding </item>
++      <item> Binding </item>
++      <item> BindingHelper </item>
++      <item> BindingHolder </item>
++      <item> BindingIterator </item>
++      <item> BindingIteratorHelper </item>
++      <item> BindingIteratorHolder </item>
++      <item> BindingIteratorOperations </item>
++      <item> BindingIteratorPOA </item>
++      <item> BindingListHelper </item>
++      <item> BindingListHolder </item>
++      <item> BindingType </item>
++      <item> BindingTypeHelper </item>
++      <item> BindingTypeHolder </item>
++      <item> BitSet </item>
++      <item> Blob </item>
++      <item> BlockView </item>
++      <item> BlockingQueue </item>
++      <item> Book </item>
++      <item> Boolean </item>
++      <item> BooleanControl </item>
++      <item> BooleanControl.Type </item>
++      <item> BooleanHolder </item>
++      <item> BooleanSeqHelper </item>
++      <item> BooleanSeqHolder </item>
++      <item> Border </item>
++      <item> BorderFactory </item>
++      <item> BorderLayout </item>
++      <item> BorderUIResource </item>
++      <item> BorderUIResource.BevelBorderUIResource </item>
++      <item> BorderUIResource.CompoundBorderUIResource </item>
++      <item> BorderUIResource.EmptyBorderUIResource </item>
++      <item> BorderUIResource.EtchedBorderUIResource </item>
++      <item> BorderUIResource.LineBorderUIResource </item>
++      <item> BorderUIResource.MatteBorderUIResource </item>
++      <item> BorderUIResource.TitledBorderUIResource </item>
++      <item> BoundedRangeModel </item>
++      <item> Bounds </item>
++      <item> Bounds </item>
++      <item> Box </item>
++      <item> Box.Filler </item>
++      <item> BoxLayout </item>
++      <item> BoxView </item>
++      <item> BoxedValueHelper </item>
++      <item> BreakIterator </item>
++      <item> BrokenBarrierException </item>
++      <item> Buffer </item>
++      <item> BufferCapabilities </item>
++      <item> BufferCapabilities.FlipContents </item>
++      <item> BufferOverflowException </item>
++      <item> BufferStrategy </item>
++      <item> BufferUnderflowException </item>
++      <item> BufferedImage </item>
++      <item> BufferedImageFilter </item>
++      <item> BufferedImageOp </item>
++      <item> BufferedInputStream </item>
++      <item> BufferedOutputStream </item>
++      <item> BufferedReader </item>
++      <item> BufferedWriter </item>
++      <item> Button </item>
++      <item> ButtonGroup </item>
++      <item> ButtonModel </item>
++      <item> ButtonUI </item>
++      <item> Byte </item>
++      <item> ByteArrayInputStream </item>
++      <item> ByteArrayOutputStream </item>
++      <item> ByteBuffer </item>
++      <item> ByteChannel </item>
++      <item> ByteHolder </item>
++      <item> ByteLookupTable </item>
++      <item> ByteOrder </item>
++      <item> CDATASection </item>
++      <item> CMMException </item>
++      <item> CODESET_INCOMPATIBLE </item>
++      <item> COMM_FAILURE </item>
++      <item> CRC32 </item>
++      <item> CRL </item>
++      <item> CRLException </item>
++      <item> CRLSelector </item>
++      <item> CSS </item>
++      <item> CSS.Attribute </item>
++      <item> CTX_RESTRICT_SCOPE </item>
++      <item> CacheRequest </item>
++      <item> CacheResponse </item>
++      <item> CachedRowSet </item>
++      <item> Calendar </item>
++      <item> Callable </item>
++      <item> CallableStatement </item>
++      <item> Callback </item>
++      <item> CallbackHandler </item>
++      <item> CancelablePrintJob </item>
++      <item> CancellationException </item>
++      <item> CancelledKeyException </item>
++      <item> CannotProceed </item>
++      <item> CannotProceedException </item>
++      <item> CannotProceedHelper </item>
++      <item> CannotProceedHolder </item>
++      <item> CannotRedoException </item>
++      <item> CannotUndoException </item>
++      <item> Canvas </item>
++      <item> CardLayout </item>
++      <item> Caret </item>
++      <item> CaretEvent </item>
++      <item> CaretListener </item>
++      <item> CellEditor </item>
++      <item> CellEditorListener </item>
++      <item> CellRendererPane </item>
++      <item> CertPath </item>
++      <item> CertPath.CertPathRep </item>
++      <item> CertPathBuilder </item>
++      <item> CertPathBuilderException </item>
++      <item> CertPathBuilderResult </item>
++      <item> CertPathBuilderSpi </item>
++      <item> CertPathParameters </item>
++      <item> CertPathTrustManagerParameters </item>
++      <item> CertPathValidator </item>
++      <item> CertPathValidatorException </item>
++      <item> CertPathValidatorResult </item>
++      <item> CertPathValidatorSpi </item>
++      <item> CertSelector </item>
++      <item> CertStore </item>
++      <item> CertStoreException </item>
++      <item> CertStoreParameters </item>
++      <item> CertStoreSpi </item>
++      <item> Certificate </item>
++      <item> Certificate </item>
++      <item> Certificate </item>
++      <item> Certificate.CertificateRep </item>
++      <item> CertificateEncodingException </item>
++      <item> CertificateEncodingException </item>
++      <item> CertificateException </item>
++      <item> CertificateException </item>
++      <item> CertificateExpiredException </item>
++      <item> CertificateExpiredException </item>
++      <item> CertificateFactory </item>
++      <item> CertificateFactorySpi </item>
++      <item> CertificateNotYetValidException </item>
++      <item> CertificateNotYetValidException </item>
++      <item> CertificateParsingException </item>
++      <item> CertificateParsingException </item>
++      <item> ChangeEvent </item>
++      <item> ChangeListener </item>
++      <item> ChangedCharSetException </item>
++      <item> Channel </item>
++      <item> ChannelBinding </item>
++      <item> Channels </item>
++      <item> CharArrayReader </item>
++      <item> CharArrayWriter </item>
++      <item> CharBuffer </item>
++      <item> CharConversionException </item>
++      <item> CharHolder </item>
++      <item> CharSeqHelper </item>
++      <item> CharSeqHolder </item>
++      <item> CharSequence </item>
++      <item> Character </item>
++      <item> Character.Subset </item>
++      <item> Character.UnicodeBlock </item>
++      <item> CharacterCodingException </item>
++      <item> CharacterData </item>
++      <item> CharacterIterator </item>
++      <item> Charset </item>
++      <item> CharsetDecoder </item>
++      <item> CharsetEncoder </item>
++      <item> CharsetProvider </item>
++      <item> Checkbox </item>
++      <item> CheckboxGroup </item>
++      <item> CheckboxMenuItem </item>
++      <item> CheckedInputStream </item>
++      <item> CheckedOutputStream </item>
++      <item> Checksum </item>
++      <item> Choice </item>
++      <item> ChoiceCallback </item>
++      <item> ChoiceFormat </item>
++      <item> Chromaticity </item>
++      <item> Cipher </item>
++      <item> CipherInputStream </item>
++      <item> CipherOutputStream </item>
++      <item> CipherSpi </item>
++      <item> Class </item>
++      <item> ClassCastException </item>
++      <item> ClassCircularityError </item>
++      <item> ClassDefinition </item>
++      <item> ClassDesc </item>
++      <item> ClassFileTransformer </item>
++      <item> ClassFormatError </item>
++      <item> ClassLoader </item>
++      <item> ClassLoaderRepository </item>
++      <item> ClassLoadingMXBean </item>
++      <item> ClassNotFoundException </item>
++      <item> ClientRequestInfo </item>
++      <item> ClientRequestInfoOperations </item>
++      <item> ClientRequestInterceptor </item>
++      <item> ClientRequestInterceptorOperations </item>
++      <item> Clip </item>
++      <item> Clipboard </item>
++      <item> ClipboardOwner </item>
++      <item> Clob </item>
++      <item> CloneNotSupportedException </item>
++      <item> Cloneable </item>
++      <item> Closeable </item>
++      <item> ClosedByInterruptException </item>
++      <item> ClosedChannelException </item>
++      <item> ClosedSelectorException </item>
++      <item> CodeSets </item>
++      <item> CodeSigner </item>
++      <item> CodeSource </item>
++      <item> Codec </item>
++      <item> CodecFactory </item>
++      <item> CodecFactoryHelper </item>
++      <item> CodecFactoryOperations </item>
++      <item> CodecOperations </item>
++      <item> CoderMalfunctionError </item>
++      <item> CoderResult </item>
++      <item> CodingErrorAction </item>
++      <item> CollationElementIterator </item>
++      <item> CollationKey </item>
++      <item> Collator </item>
++      <item> Collection </item>
++      <item> CollectionCertStoreParameters </item>
++      <item> Collections </item>
++      <item> Color </item>
++      <item> ColorChooserComponentFactory </item>
++      <item> ColorChooserUI </item>
++      <item> ColorConvertOp </item>
++      <item> ColorModel </item>
++      <item> ColorSelectionModel </item>
++      <item> ColorSpace </item>
++      <item> ColorSupported </item>
++      <item> ColorType </item>
++      <item> ColorUIResource </item>
++      <item> ComboBoxEditor </item>
++      <item> ComboBoxModel </item>
++      <item> ComboBoxUI </item>
++      <item> ComboPopup </item>
++      <item> Comment </item>
++      <item> CommunicationException </item>
++      <item> Comparable </item>
++      <item> Comparator </item>
++      <item> CompilationMXBean </item>
++      <item> Compiler </item>
++      <item> CompletionService </item>
++      <item> CompletionStatus </item>
++      <item> CompletionStatusHelper </item>
++      <item> Component </item>
++      <item> ComponentAdapter </item>
++      <item> ComponentColorModel </item>
++      <item> ComponentEvent </item>
++      <item> ComponentIdHelper </item>
++      <item> ComponentInputMap </item>
++      <item> ComponentInputMapUIResource </item>
++      <item> ComponentListener </item>
++      <item> ComponentOrientation </item>
++      <item> ComponentSampleModel </item>
++      <item> ComponentUI </item>
++      <item> ComponentView </item>
++      <item> Composite </item>
++      <item> CompositeContext </item>
++      <item> CompositeData </item>
++      <item> CompositeDataSupport </item>
++      <item> CompositeName </item>
++      <item> CompositeType </item>
++      <item> CompositeView </item>
++      <item> CompoundBorder </item>
++      <item> CompoundControl </item>
++      <item> CompoundControl.Type </item>
++      <item> CompoundEdit </item>
++      <item> CompoundName </item>
++      <item> Compression </item>
++      <item> ConcurrentHashMap </item>
++      <item> ConcurrentLinkedQueue </item>
++      <item> ConcurrentMap </item>
++      <item> ConcurrentModificationException </item>
++      <item> Condition </item>
++      <item> Configuration </item>
++      <item> ConfigurationException </item>
++      <item> ConfirmationCallback </item>
++      <item> ConnectException </item>
++      <item> ConnectException </item>
++      <item> ConnectIOException </item>
++      <item> Connection </item>
++      <item> ConnectionEvent </item>
++      <item> ConnectionEventListener </item>
++      <item> ConnectionPendingException </item>
++      <item> ConnectionPoolDataSource </item>
++      <item> ConsoleHandler </item>
++      <item> Constructor </item>
++      <item> Container </item>
++      <item> ContainerAdapter </item>
++      <item> ContainerEvent </item>
++      <item> ContainerListener </item>
++      <item> ContainerOrderFocusTraversalPolicy </item>
++      <item> ContentHandler </item>
++      <item> ContentHandler </item>
++      <item> ContentHandlerFactory </item>
++      <item> ContentModel </item>
++      <item> Context </item>
++      <item> Context </item>
++      <item> ContextList </item>
++      <item> ContextNotEmptyException </item>
++      <item> ContextualRenderedImageFactory </item>
++      <item> Control </item>
++      <item> Control </item>
++      <item> Control.Type </item>
++      <item> ControlFactory </item>
++      <item> ControllerEventListener </item>
++      <item> ConvolveOp </item>
++      <item> CookieHandler </item>
++      <item> CookieHolder </item>
++      <item> Copies </item>
++      <item> CopiesSupported </item>
++      <item> CopyOnWriteArrayList </item>
++      <item> CopyOnWriteArraySet </item>
++      <item> CountDownLatch </item>
++      <item> CounterMonitor </item>
++      <item> CounterMonitorMBean </item>
++      <item> CredentialException </item>
++      <item> CredentialExpiredException </item>
++      <item> CredentialNotFoundException </item>
++      <item> CropImageFilter </item>
++      <item> CubicCurve2D </item>
++      <item> CubicCurve2D.Double </item>
++      <item> CubicCurve2D.Float </item>
++      <item> Currency </item>
++      <item> Current </item>
++      <item> Current </item>
++      <item> Current </item>
++      <item> CurrentHelper </item>
++      <item> CurrentHelper </item>
++      <item> CurrentHelper </item>
++      <item> CurrentHolder </item>
++      <item> CurrentOperations </item>
++      <item> CurrentOperations </item>
++      <item> CurrentOperations </item>
++      <item> Cursor </item>
++      <item> CustomMarshal </item>
++      <item> CustomValue </item>
++      <item> Customizer </item>
++      <item> CyclicBarrier </item>
++      <item> DATA_CONVERSION </item>
++      <item> DESKeySpec </item>
++      <item> DESedeKeySpec </item>
++      <item> DGC </item>
++      <item> DHGenParameterSpec </item>
++      <item> DHKey </item>
++      <item> DHParameterSpec </item>
++      <item> DHPrivateKey </item>
++      <item> DHPrivateKeySpec </item>
++      <item> DHPublicKey </item>
++      <item> DHPublicKeySpec </item>
++      <item> DISCARDING </item>
++      <item> DOMConfiguration </item>
++      <item> DOMError </item>
++      <item> DOMErrorHandler </item>
++      <item> DOMException </item>
++      <item> DOMImplementation </item>
++      <item> DOMImplementationLS </item>
++      <item> DOMImplementationList </item>
++      <item> DOMImplementationRegistry </item>
++      <item> DOMImplementationSource </item>
++      <item> DOMLocator </item>
++      <item> DOMLocator </item>
++      <item> DOMResult </item>
++      <item> DOMSource </item>
++      <item> DOMStringList </item>
++      <item> DSAKey </item>
++      <item> DSAKeyPairGenerator </item>
++      <item> DSAParameterSpec </item>
++      <item> DSAParams </item>
++      <item> DSAPrivateKey </item>
++      <item> DSAPrivateKeySpec </item>
++      <item> DSAPublicKey </item>
++      <item> DSAPublicKeySpec </item>
++      <item> DTD </item>
++      <item> DTDConstants </item>
++      <item> DTDHandler </item>
++      <item> DataBuffer </item>
++      <item> DataBufferByte </item>
++      <item> DataBufferDouble </item>
++      <item> DataBufferFloat </item>
++      <item> DataBufferInt </item>
++      <item> DataBufferShort </item>
++      <item> DataBufferUShort </item>
++      <item> DataFlavor </item>
++      <item> DataFormatException </item>
++      <item> DataInput </item>
++      <item> DataInputStream </item>
++      <item> DataInputStream </item>
++      <item> DataLine </item>
++      <item> DataLine.Info </item>
++      <item> DataOutput </item>
++      <item> DataOutputStream </item>
++      <item> DataOutputStream </item>
++      <item> DataSource </item>
++      <item> DataTruncation </item>
++      <item> DatabaseMetaData </item>
++      <item> DatagramChannel </item>
++      <item> DatagramPacket </item>
++      <item> DatagramSocket </item>
++      <item> DatagramSocketImpl </item>
++      <item> DatagramSocketImplFactory </item>
++      <item> DatatypeConfigurationException </item>
++      <item> DatatypeConstants </item>
++      <item> DatatypeConstants.Field </item>
++      <item> DatatypeFactory </item>
++      <item> Date </item>
++      <item> Date </item>
++      <item> DateFormat </item>
++      <item> DateFormat.Field </item>
++      <item> DateFormatSymbols </item>
++      <item> DateFormatter </item>
++      <item> DateTimeAtCompleted </item>
++      <item> DateTimeAtCreation </item>
++      <item> DateTimeAtProcessing </item>
++      <item> DateTimeSyntax </item>
++      <item> DebugGraphics </item>
++      <item> DecimalFormat </item>
++      <item> DecimalFormatSymbols </item>
++      <item> DeclHandler </item>
++      <item> DefaultBoundedRangeModel </item>
++      <item> DefaultButtonModel </item>
++      <item> DefaultCaret </item>
++      <item> DefaultCellEditor </item>
++      <item> DefaultColorSelectionModel </item>
++      <item> DefaultComboBoxModel </item>
++      <item> DefaultDesktopManager </item>
++      <item> DefaultEditorKit </item>
++      <item> DefaultEditorKit.BeepAction </item>
++      <item> DefaultEditorKit.CopyAction </item>
++      <item> DefaultEditorKit.CutAction </item>
++      <item> DefaultEditorKit.DefaultKeyTypedAction </item>
++      <item> DefaultEditorKit.InsertBreakAction </item>
++      <item> DefaultEditorKit.InsertContentAction </item>
++      <item> DefaultEditorKit.InsertTabAction </item>
++      <item> DefaultEditorKit.PasteAction </item>
++      <item> DefaultFocusManager </item>
++      <item> DefaultFocusTraversalPolicy </item>
++      <item> DefaultFormatter </item>
++      <item> DefaultFormatterFactory </item>
++      <item> DefaultHandler </item>
++      <item> DefaultHandler2 </item>
++      <item> DefaultHighlighter </item>
++      <item> DefaultHighlighter.DefaultHighlightPainter </item>
++      <item> DefaultKeyboardFocusManager </item>
++      <item> DefaultListCellRenderer </item>
++      <item> DefaultListCellRenderer.UIResource </item>
++      <item> DefaultListModel </item>
++      <item> DefaultListSelectionModel </item>
++      <item> DefaultLoaderRepository </item>
++      <item> DefaultLoaderRepository </item>
++      <item> DefaultMenuLayout </item>
++      <item> DefaultMetalTheme </item>
++      <item> DefaultMutableTreeNode </item>
++      <item> DefaultPersistenceDelegate </item>
++      <item> DefaultSingleSelectionModel </item>
++      <item> DefaultStyledDocument </item>
++      <item> DefaultStyledDocument.AttributeUndoableEdit </item>
++      <item> DefaultStyledDocument.ElementSpec </item>
++      <item> DefaultTableCellRenderer </item>
++      <item> DefaultTableCellRenderer.UIResource </item>
++      <item> DefaultTableColumnModel </item>
++      <item> DefaultTableModel </item>
++      <item> DefaultTextUI </item>
++      <item> DefaultTreeCellEditor </item>
++      <item> DefaultTreeCellRenderer </item>
++      <item> DefaultTreeModel </item>
++      <item> DefaultTreeSelectionModel </item>
++      <item> DefinitionKind </item>
++      <item> DefinitionKindHelper </item>
++      <item> Deflater </item>
++      <item> DeflaterOutputStream </item>
++      <item> DelayQueue </item>
++      <item> Delayed </item>
++      <item> Delegate </item>
++      <item> Delegate </item>
++      <item> Delegate </item>
++      <item> DelegationPermission </item>
++      <item> Deprecated </item>
++      <item> Descriptor </item>
++      <item> DescriptorAccess </item>
++      <item> DescriptorSupport </item>
++      <item> DesignMode </item>
++      <item> DesktopIconUI </item>
++      <item> DesktopManager </item>
++      <item> DesktopPaneUI </item>
++      <item> Destination </item>
++      <item> DestroyFailedException </item>
++      <item> Destroyable </item>
++      <item> Dialog </item>
++      <item> Dictionary </item>
++      <item> DigestException </item>
++      <item> DigestInputStream </item>
++      <item> DigestOutputStream </item>
++      <item> Dimension </item>
++      <item> Dimension2D </item>
++      <item> DimensionUIResource </item>
++      <item> DirContext </item>
++      <item> DirObjectFactory </item>
++      <item> DirStateFactory </item>
++      <item> DirStateFactory.Result </item>
++      <item> DirectColorModel </item>
++      <item> DirectoryManager </item>
++      <item> DisplayMode </item>
++      <item> DnDConstants </item>
++      <item> Doc </item>
++      <item> DocAttribute </item>
++      <item> DocAttributeSet </item>
++      <item> DocFlavor </item>
++      <item> DocFlavor.BYTE_ARRAY </item>
++      <item> DocFlavor.CHAR_ARRAY </item>
++      <item> DocFlavor.INPUT_STREAM </item>
++      <item> DocFlavor.READER </item>
++      <item> DocFlavor.SERVICE_FORMATTED </item>
++      <item> DocFlavor.STRING </item>
++      <item> DocFlavor.URL </item>
++      <item> DocPrintJob </item>
++      <item> Document </item>
++      <item> Document </item>
++      <item> DocumentBuilder </item>
++      <item> DocumentBuilderFactory </item>
++      <item> DocumentEvent </item>
++      <item> DocumentEvent.ElementChange </item>
++      <item> DocumentEvent.EventType </item>
++      <item> DocumentFilter </item>
++      <item> DocumentFilter.FilterBypass </item>
++      <item> DocumentFragment </item>
++      <item> DocumentHandler </item>
++      <item> DocumentListener </item>
++      <item> DocumentName </item>
++      <item> DocumentParser </item>
++      <item> DocumentType </item>
++      <item> Documented </item>
++      <item> DomainCombiner </item>
++      <item> DomainManager </item>
++      <item> DomainManagerOperations </item>
++      <item> Double </item>
++      <item> DoubleBuffer </item>
++      <item> DoubleHolder </item>
++      <item> DoubleSeqHelper </item>
++      <item> DoubleSeqHolder </item>
++      <item> DragGestureEvent </item>
++      <item> DragGestureListener </item>
++      <item> DragGestureRecognizer </item>
++      <item> DragSource </item>
++      <item> DragSourceAdapter </item>
++      <item> DragSourceContext </item>
++      <item> DragSourceDragEvent </item>
++      <item> DragSourceDropEvent </item>
++      <item> DragSourceEvent </item>
++      <item> DragSourceListener </item>
++      <item> DragSourceMotionListener </item>
++      <item> Driver </item>
++      <item> DriverManager </item>
++      <item> DriverPropertyInfo </item>
++      <item> DropTarget </item>
++      <item> DropTarget.DropTargetAutoScroller </item>
++      <item> DropTargetAdapter </item>
++      <item> DropTargetContext </item>
++      <item> DropTargetDragEvent </item>
++      <item> DropTargetDropEvent </item>
++      <item> DropTargetEvent </item>
++      <item> DropTargetListener </item>
++      <item> DuplicateFormatFlagsException </item>
++      <item> DuplicateName </item>
++      <item> DuplicateNameHelper </item>
++      <item> Duration </item>
++      <item> DynAny </item>
++      <item> DynAny </item>
++      <item> DynAnyFactory </item>
++      <item> DynAnyFactoryHelper </item>
++      <item> DynAnyFactoryOperations </item>
++      <item> DynAnyHelper </item>
++      <item> DynAnyOperations </item>
++      <item> DynAnySeqHelper </item>
++      <item> DynArray </item>
++      <item> DynArray </item>
++      <item> DynArrayHelper </item>
++      <item> DynArrayOperations </item>
++      <item> DynEnum </item>
++      <item> DynEnum </item>
++      <item> DynEnumHelper </item>
++      <item> DynEnumOperations </item>
++      <item> DynFixed </item>
++      <item> DynFixed </item>
++      <item> DynFixedHelper </item>
++      <item> DynFixedOperations </item>
++      <item> DynSequence </item>
++      <item> DynSequence </item>
++      <item> DynSequenceHelper </item>
++      <item> DynSequenceOperations </item>
++      <item> DynStruct </item>
++      <item> DynStruct </item>
++      <item> DynStructHelper </item>
++      <item> DynStructOperations </item>
++      <item> DynUnion </item>
++      <item> DynUnion </item>
++      <item> DynUnionHelper </item>
++      <item> DynUnionOperations </item>
++      <item> DynValue </item>
++      <item> DynValue </item>
++      <item> DynValueBox </item>
++      <item> DynValueBoxOperations </item>
++      <item> DynValueCommon </item>
++      <item> DynValueCommonOperations </item>
++      <item> DynValueHelper </item>
++      <item> DynValueOperations </item>
++      <item> DynamicImplementation </item>
++      <item> DynamicImplementation </item>
++      <item> DynamicMBean </item>
++      <item> ECField </item>
++      <item> ECFieldF2m </item>
++      <item> ECFieldFp </item>
++      <item> ECGenParameterSpec </item>
++      <item> ECKey </item>
++      <item> ECParameterSpec </item>
++      <item> ECPoint </item>
++      <item> ECPrivateKey </item>
++      <item> ECPrivateKeySpec </item>
++      <item> ECPublicKey </item>
++      <item> ECPublicKeySpec </item>
++      <item> ENCODING_CDR_ENCAPS </item>
++      <item> EOFException </item>
++      <item> EditorKit </item>
++      <item> Element </item>
++      <item> Element </item>
++      <item> Element </item>
++      <item> ElementIterator </item>
++      <item> ElementType </item>
++      <item> Ellipse2D </item>
++      <item> Ellipse2D.Double </item>
++      <item> Ellipse2D.Float </item>
++      <item> EllipticCurve </item>
++      <item> EmptyBorder </item>
++      <item> EmptyStackException </item>
++      <item> EncodedKeySpec </item>
++      <item> Encoder </item>
++      <item> Encoding </item>
++      <item> EncryptedPrivateKeyInfo </item>
++      <item> Entity </item>
++      <item> Entity </item>
++      <item> EntityReference </item>
++      <item> EntityResolver </item>
++      <item> EntityResolver2 </item>
++      <item> Enum </item>
++      <item> EnumConstantNotPresentException </item>
++      <item> EnumControl </item>
++      <item> EnumControl.Type </item>
++      <item> EnumMap </item>
++      <item> EnumSet </item>
++      <item> EnumSyntax </item>
++      <item> Enumeration </item>
++      <item> Environment </item>
++      <item> Error </item>
++      <item> ErrorHandler </item>
++      <item> ErrorListener </item>
++      <item> ErrorManager </item>
++      <item> EtchedBorder </item>
++      <item> Event </item>
++      <item> EventContext </item>
++      <item> EventDirContext </item>
++      <item> EventHandler </item>
++      <item> EventListener </item>
++      <item> EventListenerList </item>
++      <item> EventListenerProxy </item>
++      <item> EventObject </item>
++      <item> EventQueue </item>
++      <item> EventSetDescriptor </item>
++      <item> Exception </item>
++      <item> ExceptionDetailMessage </item>
++      <item> ExceptionInInitializerError </item>
++      <item> ExceptionList </item>
++      <item> ExceptionListener </item>
++      <item> Exchanger </item>
++      <item> ExecutionException </item>
++      <item> Executor </item>
++      <item> ExecutorCompletionService </item>
++      <item> ExecutorService </item>
++      <item> Executors </item>
++      <item> ExemptionMechanism </item>
++      <item> ExemptionMechanismException </item>
++      <item> ExemptionMechanismSpi </item>
++      <item> ExpandVetoException </item>
++      <item> ExportException </item>
++      <item> Expression </item>
++      <item> ExtendedRequest </item>
++      <item> ExtendedResponse </item>
++      <item> Externalizable </item>
++      <item> FREE_MEM </item>
++      <item> FactoryConfigurationError </item>
++      <item> FailedLoginException </item>
++      <item> FeatureDescriptor </item>
++      <item> Fidelity </item>
++      <item> Field </item>
++      <item> FieldNameHelper </item>
++      <item> FieldNameHelper </item>
++      <item> FieldPosition </item>
++      <item> FieldView </item>
++      <item> File </item>
++      <item> FileCacheImageInputStream </item>
++      <item> FileCacheImageOutputStream </item>
++      <item> FileChannel </item>
++      <item> FileChannel.MapMode </item>
++      <item> FileChooserUI </item>
++      <item> FileDescriptor </item>
++      <item> FileDialog </item>
++      <item> FileFilter </item>
++      <item> FileFilter </item>
++      <item> FileHandler </item>
++      <item> FileImageInputStream </item>
++      <item> FileImageOutputStream </item>
++      <item> FileInputStream </item>
++      <item> FileLock </item>
++      <item> FileLockInterruptionException </item>
++      <item> FileNameMap </item>
++      <item> FileNotFoundException </item>
++      <item> FileOutputStream </item>
++      <item> FilePermission </item>
++      <item> FileReader </item>
++      <item> FileSystemView </item>
++      <item> FileView </item>
++      <item> FileWriter </item>
++      <item> FilenameFilter </item>
++      <item> Filter </item>
++      <item> FilterInputStream </item>
++      <item> FilterOutputStream </item>
++      <item> FilterReader </item>
++      <item> FilterWriter </item>
++      <item> FilteredImageSource </item>
++      <item> FilteredRowSet </item>
++      <item> Finishings </item>
++      <item> FixedHeightLayoutCache </item>
++      <item> FixedHolder </item>
++      <item> FlatteningPathIterator </item>
++      <item> FlavorEvent </item>
++      <item> FlavorException </item>
++      <item> FlavorListener </item>
++      <item> FlavorMap </item>
++      <item> FlavorTable </item>
++      <item> Float </item>
++      <item> FloatBuffer </item>
++      <item> FloatControl </item>
++      <item> FloatControl.Type </item>
++      <item> FloatHolder </item>
++      <item> FloatSeqHelper </item>
++      <item> FloatSeqHolder </item>
++      <item> FlowLayout </item>
++      <item> FlowView </item>
++      <item> FlowView.FlowStrategy </item>
++      <item> Flushable </item>
++      <item> FocusAdapter </item>
++      <item> FocusEvent </item>
++      <item> FocusListener </item>
++      <item> FocusManager </item>
++      <item> FocusTraversalPolicy </item>
++      <item> Font </item>
++      <item> FontFormatException </item>
++      <item> FontMetrics </item>
++      <item> FontRenderContext </item>
++      <item> FontUIResource </item>
++      <item> FormSubmitEvent </item>
++      <item> FormSubmitEvent.MethodType </item>
++      <item> FormView </item>
++      <item> Format </item>
++      <item> Format.Field </item>
++      <item> FormatConversionProvider </item>
++      <item> FormatFlagsConversionMismatchException </item>
++      <item> FormatMismatch </item>
++      <item> FormatMismatchHelper </item>
++      <item> Formattable </item>
++      <item> FormattableFlags </item>
++      <item> Formatter </item>
++      <item> Formatter </item>
++      <item> FormatterClosedException </item>
++      <item> ForwardRequest </item>
++      <item> ForwardRequest </item>
++      <item> ForwardRequestHelper </item>
++      <item> ForwardRequestHelper </item>
++      <item> Frame </item>
++      <item> Future </item>
++      <item> FutureTask </item>
++      <item> GSSContext </item>
++      <item> GSSCredential </item>
++      <item> GSSException </item>
++      <item> GSSManager </item>
++      <item> GSSName </item>
++      <item> GZIPInputStream </item>
++      <item> GZIPOutputStream </item>
++      <item> GapContent </item>
++      <item> GarbageCollectorMXBean </item>
++      <item> GatheringByteChannel </item>
++      <item> GaugeMonitor </item>
++      <item> GaugeMonitorMBean </item>
++      <item> GeneralPath </item>
++      <item> GeneralSecurityException </item>
++      <item> GenericArrayType </item>
++      <item> GenericDeclaration </item>
++      <item> GenericSignatureFormatError </item>
++      <item> GlyphJustificationInfo </item>
++      <item> GlyphMetrics </item>
++      <item> GlyphVector </item>
++      <item> GlyphView </item>
++      <item> GlyphView.GlyphPainter </item>
++      <item> GradientPaint </item>
++      <item> GraphicAttribute </item>
++      <item> Graphics </item>
++      <item> Graphics2D </item>
++      <item> GraphicsConfigTemplate </item>
++      <item> GraphicsConfiguration </item>
++      <item> GraphicsDevice </item>
++      <item> GraphicsEnvironment </item>
++      <item> GrayFilter </item>
++      <item> GregorianCalendar </item>
++      <item> GridBagConstraints </item>
++      <item> GridBagLayout </item>
++      <item> GridLayout </item>
++      <item> Group </item>
++      <item> Guard </item>
++      <item> GuardedObject </item>
++      <item> HOLDING </item>
++      <item> HTML </item>
++      <item> HTML.Attribute </item>
++      <item> HTML.Tag </item>
++      <item> HTML.UnknownTag </item>
++      <item> HTMLDocument </item>
++      <item> HTMLDocument.Iterator </item>
++      <item> HTMLEditorKit </item>
++      <item> HTMLEditorKit.HTMLFactory </item>
++      <item> HTMLEditorKit.HTMLTextAction </item>
++      <item> HTMLEditorKit.InsertHTMLTextAction </item>
++      <item> HTMLEditorKit.LinkController </item>
++      <item> HTMLEditorKit.Parser </item>
++      <item> HTMLEditorKit.ParserCallback </item>
++      <item> HTMLFrameHyperlinkEvent </item>
++      <item> HTMLWriter </item>
++      <item> Handler </item>
++      <item> HandlerBase </item>
++      <item> HandshakeCompletedEvent </item>
++      <item> HandshakeCompletedListener </item>
++      <item> HasControls </item>
++      <item> HashAttributeSet </item>
++      <item> HashDocAttributeSet </item>
++      <item> HashMap </item>
++      <item> HashPrintJobAttributeSet </item>
++      <item> HashPrintRequestAttributeSet </item>
++      <item> HashPrintServiceAttributeSet </item>
++      <item> HashSet </item>
++      <item> Hashtable </item>
++      <item> HeadlessException </item>
++      <item> HierarchyBoundsAdapter </item>
++      <item> HierarchyBoundsListener </item>
++      <item> HierarchyEvent </item>
++      <item> HierarchyListener </item>
++      <item> Highlighter </item>
++      <item> Highlighter.Highlight </item>
++      <item> Highlighter.HighlightPainter </item>
++      <item> HostnameVerifier </item>
++      <item> HttpRetryException </item>
++      <item> HttpURLConnection </item>
++      <item> HttpsURLConnection </item>
++      <item> HyperlinkEvent </item>
++      <item> HyperlinkEvent.EventType </item>
++      <item> HyperlinkListener </item>
++      <item> ICC_ColorSpace </item>
++      <item> ICC_Profile </item>
++      <item> ICC_ProfileGray </item>
++      <item> ICC_ProfileRGB </item>
++      <item> IDLEntity </item>
++      <item> IDLType </item>
++      <item> IDLTypeHelper </item>
++      <item> IDLTypeOperations </item>
++      <item> ID_ASSIGNMENT_POLICY_ID </item>
++      <item> ID_UNIQUENESS_POLICY_ID </item>
++      <item> IIOByteBuffer </item>
++      <item> IIOException </item>
++      <item> IIOImage </item>
++      <item> IIOInvalidTreeException </item>
++      <item> IIOMetadata </item>
++      <item> IIOMetadataController </item>
++      <item> IIOMetadataFormat </item>
++      <item> IIOMetadataFormatImpl </item>
++      <item> IIOMetadataNode </item>
++      <item> IIOParam </item>
++      <item> IIOParamController </item>
++      <item> IIOReadProgressListener </item>
++      <item> IIOReadUpdateListener </item>
++      <item> IIOReadWarningListener </item>
++      <item> IIORegistry </item>
++      <item> IIOServiceProvider </item>
++      <item> IIOWriteProgressListener </item>
++      <item> IIOWriteWarningListener </item>
++      <item> IMPLICIT_ACTIVATION_POLICY_ID </item>
++      <item> IMP_LIMIT </item>
++      <item> INACTIVE </item>
++      <item> INITIALIZE </item>
++      <item> INTERNAL </item>
++      <item> INTF_REPOS </item>
++      <item> INVALID_ACTIVITY </item>
++      <item> INVALID_TRANSACTION </item>
++      <item> INV_FLAG </item>
++      <item> INV_IDENT </item>
++      <item> INV_OBJREF </item>
++      <item> INV_POLICY </item>
++      <item> IOException </item>
++      <item> IOR </item>
++      <item> IORHelper </item>
++      <item> IORHolder </item>
++      <item> IORInfo </item>
++      <item> IORInfoOperations </item>
++      <item> IORInterceptor </item>
++      <item> IORInterceptorOperations </item>
++      <item> IORInterceptor_3_0 </item>
++      <item> IORInterceptor_3_0Helper </item>
++      <item> IORInterceptor_3_0Holder </item>
++      <item> IORInterceptor_3_0Operations </item>
++      <item> IRObject </item>
++      <item> IRObjectOperations </item>
++      <item> Icon </item>
++      <item> IconUIResource </item>
++      <item> IconView </item>
++      <item> IdAssignmentPolicy </item>
++      <item> IdAssignmentPolicyOperations </item>
++      <item> IdAssignmentPolicyValue </item>
++      <item> IdUniquenessPolicy </item>
++      <item> IdUniquenessPolicyOperations </item>
++      <item> IdUniquenessPolicyValue </item>
++      <item> IdentifierHelper </item>
++      <item> Identity </item>
++      <item> IdentityHashMap </item>
++      <item> IdentityScope </item>
++      <item> IllegalAccessError </item>
++      <item> IllegalAccessException </item>
++      <item> IllegalArgumentException </item>
++      <item> IllegalBlockSizeException </item>
++      <item> IllegalBlockingModeException </item>
++      <item> IllegalCharsetNameException </item>
++      <item> IllegalClassFormatException </item>
++      <item> IllegalComponentStateException </item>
++      <item> IllegalFormatCodePointException </item>
++      <item> IllegalFormatConversionException </item>
++      <item> IllegalFormatException </item>
++      <item> IllegalFormatFlagsException </item>
++      <item> IllegalFormatPrecisionException </item>
++      <item> IllegalFormatWidthException </item>
++      <item> IllegalMonitorStateException </item>
++      <item> IllegalPathStateException </item>
++      <item> IllegalSelectorException </item>
++      <item> IllegalStateException </item>
++      <item> IllegalThreadStateException </item>
++      <item> Image </item>
++      <item> ImageCapabilities </item>
++      <item> ImageConsumer </item>
++      <item> ImageFilter </item>
++      <item> ImageGraphicAttribute </item>
++      <item> ImageIO </item>
++      <item> ImageIcon </item>
++      <item> ImageInputStream </item>
++      <item> ImageInputStreamImpl </item>
++      <item> ImageInputStreamSpi </item>
++      <item> ImageObserver </item>
++      <item> ImageOutputStream </item>
++      <item> ImageOutputStreamImpl </item>
++      <item> ImageOutputStreamSpi </item>
++      <item> ImageProducer </item>
++      <item> ImageReadParam </item>
++      <item> ImageReader </item>
++      <item> ImageReaderSpi </item>
++      <item> ImageReaderWriterSpi </item>
++      <item> ImageTranscoder </item>
++      <item> ImageTranscoderSpi </item>
++      <item> ImageTypeSpecifier </item>
++      <item> ImageView </item>
++      <item> ImageWriteParam </item>
++      <item> ImageWriter </item>
++      <item> ImageWriterSpi </item>
++      <item> ImagingOpException </item>
++      <item> ImplicitActivationPolicy </item>
++      <item> ImplicitActivationPolicyOperations </item>
++      <item> ImplicitActivationPolicyValue </item>
++      <item> IncompatibleClassChangeError </item>
++      <item> IncompleteAnnotationException </item>
++      <item> InconsistentTypeCode </item>
++      <item> InconsistentTypeCode </item>
++      <item> InconsistentTypeCodeHelper </item>
++      <item> IndexColorModel </item>
++      <item> IndexOutOfBoundsException </item>
++      <item> IndexedPropertyChangeEvent </item>
++      <item> IndexedPropertyDescriptor </item>
++      <item> IndirectionException </item>
++      <item> Inet4Address </item>
++      <item> Inet6Address </item>
++      <item> InetAddress </item>
++      <item> InetSocketAddress </item>
++      <item> Inflater </item>
++      <item> InflaterInputStream </item>
++      <item> InheritableThreadLocal </item>
++      <item> Inherited </item>
++      <item> InitialContext </item>
++      <item> InitialContextFactory </item>
++      <item> InitialContextFactoryBuilder </item>
++      <item> InitialDirContext </item>
++      <item> InitialLdapContext </item>
++      <item> InlineView </item>
++      <item> InputContext </item>
++      <item> InputEvent </item>
++      <item> InputMap </item>
++      <item> InputMapUIResource </item>
++      <item> InputMethod </item>
++      <item> InputMethodContext </item>
++      <item> InputMethodDescriptor </item>
++      <item> InputMethodEvent </item>
++      <item> InputMethodHighlight </item>
++      <item> InputMethodListener </item>
++      <item> InputMethodRequests </item>
++      <item> InputMismatchException </item>
++      <item> InputSource </item>
++      <item> InputStream </item>
++      <item> InputStream </item>
++      <item> InputStream </item>
++      <item> InputStreamReader </item>
++      <item> InputSubset </item>
++      <item> InputVerifier </item>
++      <item> Insets </item>
++      <item> InsetsUIResource </item>
++      <item> InstanceAlreadyExistsException </item>
++      <item> InstanceNotFoundException </item>
++      <item> InstantiationError </item>
++      <item> InstantiationException </item>
++      <item> Instrument </item>
++      <item> Instrumentation </item>
++      <item> InsufficientResourcesException </item>
++      <item> IntBuffer </item>
++      <item> IntHolder </item>
++      <item> Integer </item>
++      <item> IntegerSyntax </item>
++      <item> Interceptor </item>
++      <item> InterceptorOperations </item>
++      <item> InternalError </item>
++      <item> InternalFrameAdapter </item>
++      <item> InternalFrameEvent </item>
++      <item> InternalFrameFocusTraversalPolicy </item>
++      <item> InternalFrameListener </item>
++      <item> InternalFrameUI </item>
++      <item> InternationalFormatter </item>
++      <item> InterruptedException </item>
++      <item> InterruptedIOException </item>
++      <item> InterruptedNamingException </item>
++      <item> InterruptibleChannel </item>
++      <item> IntrospectionException </item>
++      <item> IntrospectionException </item>
++      <item> Introspector </item>
++      <item> Invalid </item>
++      <item> InvalidActivityException </item>
++      <item> InvalidAddress </item>
++      <item> InvalidAddressHelper </item>
++      <item> InvalidAddressHolder </item>
++      <item> InvalidAlgorithmParameterException </item>
++      <item> InvalidApplicationException </item>
++      <item> InvalidAttributeIdentifierException </item>
++      <item> InvalidAttributeValueException </item>
++      <item> InvalidAttributeValueException </item>
++      <item> InvalidAttributesException </item>
++      <item> InvalidClassException </item>
++      <item> InvalidDnDOperationException </item>
++      <item> InvalidKeyException </item>
++      <item> InvalidKeyException </item>
++      <item> InvalidKeySpecException </item>
++      <item> InvalidMarkException </item>
++      <item> InvalidMidiDataException </item>
++      <item> InvalidName </item>
++      <item> InvalidName </item>
++      <item> InvalidName </item>
++      <item> InvalidNameException </item>
++      <item> InvalidNameHelper </item>
++      <item> InvalidNameHelper </item>
++      <item> InvalidNameHolder </item>
++      <item> InvalidObjectException </item>
++      <item> InvalidOpenTypeException </item>
++      <item> InvalidParameterException </item>
++      <item> InvalidParameterSpecException </item>
++      <item> InvalidPolicy </item>
++      <item> InvalidPolicyHelper </item>
++      <item> InvalidPreferencesFormatException </item>
++      <item> InvalidPropertiesFormatException </item>
++      <item> InvalidRelationIdException </item>
++      <item> InvalidRelationServiceException </item>
++      <item> InvalidRelationTypeException </item>
++      <item> InvalidRoleInfoException </item>
++      <item> InvalidRoleValueException </item>
++      <item> InvalidSearchControlsException </item>
++      <item> InvalidSearchFilterException </item>
++      <item> InvalidSeq </item>
++      <item> InvalidSlot </item>
++      <item> InvalidSlotHelper </item>
++      <item> InvalidTargetObjectTypeException </item>
++      <item> InvalidTransactionException </item>
++      <item> InvalidTypeForEncoding </item>
++      <item> InvalidTypeForEncodingHelper </item>
++      <item> InvalidValue </item>
++      <item> InvalidValue </item>
++      <item> InvalidValueHelper </item>
++      <item> InvocationEvent </item>
++      <item> InvocationHandler </item>
++      <item> InvocationTargetException </item>
++      <item> InvokeHandler </item>
++      <item> IstringHelper </item>
++      <item> ItemEvent </item>
++      <item> ItemListener </item>
++      <item> ItemSelectable </item>
++      <item> Iterable </item>
++      <item> Iterator </item>
++      <item> IvParameterSpec </item>
++      <item> JApplet </item>
++      <item> JButton </item>
++      <item> JCheckBox </item>
++      <item> JCheckBoxMenuItem </item>
++      <item> JColorChooser </item>
++      <item> JComboBox </item>
++      <item> JComboBox.KeySelectionManager </item>
++      <item> JComponent </item>
++      <item> JDesktopPane </item>
++      <item> JDialog </item>
++      <item> JEditorPane </item>
++      <item> JFileChooser </item>
++      <item> JFormattedTextField </item>
++      <item> JFormattedTextField.AbstractFormatter </item>
++      <item> JFormattedTextField.AbstractFormatterFactory </item>
++      <item> JFrame </item>
++      <item> JInternalFrame </item>
++      <item> JInternalFrame.JDesktopIcon </item>
++      <item> JLabel </item>
++      <item> JLayeredPane </item>
++      <item> JList </item>
++      <item> JMException </item>
++      <item> JMRuntimeException </item>
++      <item> JMXAuthenticator </item>
++      <item> JMXConnectionNotification </item>
++      <item> JMXConnector </item>
++      <item> JMXConnectorFactory </item>
++      <item> JMXConnectorProvider </item>
++      <item> JMXConnectorServer </item>
++      <item> JMXConnectorServerFactory </item>
++      <item> JMXConnectorServerMBean </item>
++      <item> JMXConnectorServerProvider </item>
++      <item> JMXPrincipal </item>
++      <item> JMXProviderException </item>
++      <item> JMXServerErrorException </item>
++      <item> JMXServiceURL </item>
++      <item> JMenu </item>
++      <item> JMenuBar </item>
++      <item> JMenuItem </item>
++      <item> JOptionPane </item>
++      <item> JPEGHuffmanTable </item>
++      <item> JPEGImageReadParam </item>
++      <item> JPEGImageWriteParam </item>
++      <item> JPEGQTable </item>
++      <item> JPanel </item>
++      <item> JPasswordField </item>
++      <item> JPopupMenu </item>
++      <item> JPopupMenu.Separator </item>
++      <item> JProgressBar </item>
++      <item> JRadioButton </item>
++      <item> JRadioButtonMenuItem </item>
++      <item> JRootPane </item>
++      <item> JScrollBar </item>
++      <item> JScrollPane </item>
++      <item> JSeparator </item>
++      <item> JSlider </item>
++      <item> JSpinner </item>
++      <item> JSpinner.DateEditor </item>
++      <item> JSpinner.DefaultEditor </item>
++      <item> JSpinner.ListEditor </item>
++      <item> JSpinner.NumberEditor </item>
++      <item> JSplitPane </item>
++      <item> JTabbedPane </item>
++      <item> JTable </item>
++      <item> JTable.PrintMode </item>
++      <item> JTableHeader </item>
++      <item> JTextArea </item>
++      <item> JTextComponent </item>
++      <item> JTextComponent.KeyBinding </item>
++      <item> JTextField </item>
++      <item> JTextPane </item>
++      <item> JToggleButton </item>
++      <item> JToggleButton.ToggleButtonModel </item>
++      <item> JToolBar </item>
++      <item> JToolBar.Separator </item>
++      <item> JToolTip </item>
++      <item> JTree </item>
++      <item> JTree.DynamicUtilTreeNode </item>
++      <item> JTree.EmptySelectionModel </item>
++      <item> JViewport </item>
++      <item> JWindow </item>
++      <item> JarEntry </item>
++      <item> JarException </item>
++      <item> JarFile </item>
++      <item> JarInputStream </item>
++      <item> JarOutputStream </item>
++      <item> JarURLConnection </item>
++      <item> JdbcRowSet </item>
++      <item> JobAttributes </item>
++      <item> JobAttributes.DefaultSelectionType </item>
++      <item> JobAttributes.DestinationType </item>
++      <item> JobAttributes.DialogType </item>
++      <item> JobAttributes.MultipleDocumentHandlingType </item>
++      <item> JobAttributes.SidesType </item>
++      <item> JobHoldUntil </item>
++      <item> JobImpressions </item>
++      <item> JobImpressionsCompleted </item>
++      <item> JobImpressionsSupported </item>
++      <item> JobKOctets </item>
++      <item> JobKOctetsProcessed </item>
++      <item> JobKOctetsSupported </item>
++      <item> JobMediaSheets </item>
++      <item> JobMediaSheetsCompleted </item>
++      <item> JobMediaSheetsSupported </item>
++      <item> JobMessageFromOperator </item>
++      <item> JobName </item>
++      <item> JobOriginatingUserName </item>
++      <item> JobPriority </item>
++      <item> JobPrioritySupported </item>
++      <item> JobSheets </item>
++      <item> JobState </item>
++      <item> JobStateReason </item>
++      <item> JobStateReasons </item>
++      <item> JoinRowSet </item>
++      <item> Joinable </item>
++      <item> KerberosKey </item>
++      <item> KerberosPrincipal </item>
++      <item> KerberosTicket </item>
++      <item> Kernel </item>
++      <item> Key </item>
++      <item> KeyAdapter </item>
++      <item> KeyAgreement </item>
++      <item> KeyAgreementSpi </item>
++      <item> KeyAlreadyExistsException </item>
++      <item> KeyEvent </item>
++      <item> KeyEventDispatcher </item>
++      <item> KeyEventPostProcessor </item>
++      <item> KeyException </item>
++      <item> KeyFactory </item>
++      <item> KeyFactorySpi </item>
++      <item> KeyGenerator </item>
++      <item> KeyGeneratorSpi </item>
++      <item> KeyListener </item>
++      <item> KeyManagementException </item>
++      <item> KeyManager </item>
++      <item> KeyManagerFactory </item>
++      <item> KeyManagerFactorySpi </item>
++      <item> KeyPair </item>
++      <item> KeyPairGenerator </item>
++      <item> KeyPairGeneratorSpi </item>
++      <item> KeyRep </item>
++      <item> KeyRep.Type </item>
++      <item> KeySpec </item>
++      <item> KeyStore </item>
++      <item> KeyStore.Builder </item>
++      <item> KeyStore.CallbackHandlerProtection </item>
++      <item> KeyStore.Entry </item>
++      <item> KeyStore.LoadStoreParameter </item>
++      <item> KeyStore.PasswordProtection </item>
++      <item> KeyStore.PrivateKeyEntry </item>
++      <item> KeyStore.ProtectionParameter </item>
++      <item> KeyStore.SecretKeyEntry </item>
++      <item> KeyStore.TrustedCertificateEntry </item>
++      <item> KeyStoreBuilderParameters </item>
++      <item> KeyStoreException </item>
++      <item> KeyStoreSpi </item>
++      <item> KeyStroke </item>
++      <item> KeyboardFocusManager </item>
++      <item> Keymap </item>
++      <item> LDAPCertStoreParameters </item>
++      <item> LIFESPAN_POLICY_ID </item>
++      <item> LOCATION_FORWARD </item>
++      <item> LSException </item>
++      <item> LSInput </item>
++      <item> LSLoadEvent </item>
++      <item> LSOutput </item>
++      <item> LSParser </item>
++      <item> LSParserFilter </item>
++      <item> LSProgressEvent </item>
++      <item> LSResourceResolver </item>
++      <item> LSSerializer </item>
++      <item> LSSerializerFilter </item>
++      <item> Label </item>
++      <item> LabelUI </item>
++      <item> LabelView </item>
++      <item> LanguageCallback </item>
++      <item> LastOwnerException </item>
++      <item> LayeredHighlighter </item>
++      <item> LayeredHighlighter.LayerPainter </item>
++      <item> LayoutFocusTraversalPolicy </item>
++      <item> LayoutManager </item>
++      <item> LayoutManager2 </item>
++      <item> LayoutQueue </item>
++      <item> LdapContext </item>
++      <item> LdapName </item>
++      <item> LdapReferralException </item>
++      <item> Lease </item>
++      <item> Level </item>
++      <item> LexicalHandler </item>
++      <item> LifespanPolicy </item>
++      <item> LifespanPolicyOperations </item>
++      <item> LifespanPolicyValue </item>
++      <item> LimitExceededException </item>
++      <item> Line </item>
++      <item> Line.Info </item>
++      <item> Line2D </item>
++      <item> Line2D.Double </item>
++      <item> Line2D.Float </item>
++      <item> LineBorder </item>
++      <item> LineBreakMeasurer </item>
++      <item> LineEvent </item>
++      <item> LineEvent.Type </item>
++      <item> LineListener </item>
++      <item> LineMetrics </item>
++      <item> LineNumberInputStream </item>
++      <item> LineNumberReader </item>
++      <item> LineUnavailableException </item>
++      <item> LinkException </item>
++      <item> LinkLoopException </item>
++      <item> LinkRef </item>
++      <item> LinkageError </item>
++      <item> LinkedBlockingQueue </item>
++      <item> LinkedHashMap </item>
++      <item> LinkedHashSet </item>
++      <item> LinkedList </item>
++      <item> List </item>
++      <item> List </item>
++      <item> ListCellRenderer </item>
++      <item> ListDataEvent </item>
++      <item> ListDataListener </item>
++      <item> ListIterator </item>
++      <item> ListModel </item>
++      <item> ListResourceBundle </item>
++      <item> ListSelectionEvent </item>
++      <item> ListSelectionListener </item>
++      <item> ListSelectionModel </item>
++      <item> ListUI </item>
++      <item> ListView </item>
++      <item> ListenerNotFoundException </item>
++      <item> LoaderHandler </item>
++      <item> LocalObject </item>
++      <item> Locale </item>
++      <item> LocateRegistry </item>
++      <item> Locator </item>
++      <item> Locator2 </item>
++      <item> Locator2Impl </item>
++      <item> LocatorImpl </item>
++      <item> Lock </item>
++      <item> LockSupport </item>
++      <item> LogManager </item>
++      <item> LogRecord </item>
++      <item> LogStream </item>
++      <item> Logger </item>
++      <item> LoggingMXBean </item>
++      <item> LoggingPermission </item>
++      <item> LoginContext </item>
++      <item> LoginException </item>
++      <item> LoginModule </item>
++      <item> Long </item>
++      <item> LongBuffer </item>
++      <item> LongHolder </item>
++      <item> LongLongSeqHelper </item>
++      <item> LongLongSeqHolder </item>
++      <item> LongSeqHelper </item>
++      <item> LongSeqHolder </item>
++      <item> LookAndFeel </item>
++      <item> LookupOp </item>
++      <item> LookupTable </item>
++      <item> MARSHAL </item>
++      <item> MBeanAttributeInfo </item>
++      <item> MBeanConstructorInfo </item>
++      <item> MBeanException </item>
++      <item> MBeanFeatureInfo </item>
++      <item> MBeanInfo </item>
++      <item> MBeanNotificationInfo </item>
++      <item> MBeanOperationInfo </item>
++      <item> MBeanParameterInfo </item>
++      <item> MBeanPermission </item>
++      <item> MBeanRegistration </item>
++      <item> MBeanRegistrationException </item>
++      <item> MBeanServer </item>
++      <item> MBeanServerBuilder </item>
++      <item> MBeanServerConnection </item>
++      <item> MBeanServerDelegate </item>
++      <item> MBeanServerDelegateMBean </item>
++      <item> MBeanServerFactory </item>
++      <item> MBeanServerForwarder </item>
++      <item> MBeanServerInvocationHandler </item>
++      <item> MBeanServerNotification </item>
++      <item> MBeanServerNotificationFilter </item>
++      <item> MBeanServerPermission </item>
++      <item> MBeanTrustPermission </item>
++      <item> MGF1ParameterSpec </item>
++      <item> MLet </item>
++      <item> MLetMBean </item>
++      <item> Mac </item>
++      <item> MacSpi </item>
++      <item> MalformedInputException </item>
++      <item> MalformedLinkException </item>
++      <item> MalformedObjectNameException </item>
++      <item> MalformedParameterizedTypeException </item>
++      <item> MalformedURLException </item>
++      <item> ManageReferralControl </item>
++      <item> ManagementFactory </item>
++      <item> ManagementPermission </item>
++      <item> ManagerFactoryParameters </item>
++      <item> Manifest </item>
++      <item> Map </item>
++      <item> Map.Entry </item>
++      <item> MappedByteBuffer </item>
++      <item> MarshalException </item>
++      <item> MarshalledObject </item>
++      <item> MaskFormatter </item>
++      <item> MatchResult </item>
++      <item> Matcher </item>
++      <item> Math </item>
++      <item> MathContext </item>
++      <item> MatteBorder </item>
++      <item> Media </item>
++      <item> MediaName </item>
++      <item> MediaPrintableArea </item>
++      <item> MediaSize </item>
++      <item> MediaSize.Engineering </item>
++      <item> MediaSize.ISO </item>
++      <item> MediaSize.JIS </item>
++      <item> MediaSize.NA </item>
++      <item> MediaSize.Other </item>
++      <item> MediaSizeName </item>
++      <item> MediaTracker </item>
++      <item> MediaTray </item>
++      <item> Member </item>
++      <item> MemoryCacheImageInputStream </item>
++      <item> MemoryCacheImageOutputStream </item>
++      <item> MemoryHandler </item>
++      <item> MemoryImageSource </item>
++      <item> MemoryMXBean </item>
++      <item> MemoryManagerMXBean </item>
++      <item> MemoryNotificationInfo </item>
++      <item> MemoryPoolMXBean </item>
++      <item> MemoryType </item>
++      <item> MemoryUsage </item>
++      <item> Menu </item>
++      <item> MenuBar </item>
++      <item> MenuBarUI </item>
++      <item> MenuComponent </item>
++      <item> MenuContainer </item>
++      <item> MenuDragMouseEvent </item>
++      <item> MenuDragMouseListener </item>
++      <item> MenuElement </item>
++      <item> MenuEvent </item>
++      <item> MenuItem </item>
++      <item> MenuItemUI </item>
++      <item> MenuKeyEvent </item>
++      <item> MenuKeyListener </item>
++      <item> MenuListener </item>
++      <item> MenuSelectionManager </item>
++      <item> MenuShortcut </item>
++      <item> MessageDigest </item>
++      <item> MessageDigestSpi </item>
++      <item> MessageFormat </item>
++      <item> MessageFormat.Field </item>
++      <item> MessageProp </item>
++      <item> MetaEventListener </item>
++      <item> MetaMessage </item>
++      <item> MetalBorders </item>
++      <item> MetalBorders.ButtonBorder </item>
++      <item> MetalBorders.Flush3DBorder </item>
++      <item> MetalBorders.InternalFrameBorder </item>
++      <item> MetalBorders.MenuBarBorder </item>
++      <item> MetalBorders.MenuItemBorder </item>
++      <item> MetalBorders.OptionDialogBorder </item>
++      <item> MetalBorders.PaletteBorder </item>
++      <item> MetalBorders.PopupMenuBorder </item>
++      <item> MetalBorders.RolloverButtonBorder </item>
++      <item> MetalBorders.ScrollPaneBorder </item>
++      <item> MetalBorders.TableHeaderBorder </item>
++      <item> MetalBorders.TextFieldBorder </item>
++      <item> MetalBorders.ToggleButtonBorder </item>
++      <item> MetalBorders.ToolBarBorder </item>
++      <item> MetalButtonUI </item>
++      <item> MetalCheckBoxIcon </item>
++      <item> MetalCheckBoxUI </item>
++      <item> MetalComboBoxButton </item>
++      <item> MetalComboBoxEditor </item>
++      <item> MetalComboBoxEditor.UIResource </item>
++      <item> MetalComboBoxIcon </item>
++      <item> MetalComboBoxUI </item>
++      <item> MetalDesktopIconUI </item>
++      <item> MetalFileChooserUI </item>
++      <item> MetalIconFactory </item>
++      <item> MetalIconFactory.FileIcon16 </item>
++      <item> MetalIconFactory.FolderIcon16 </item>
++      <item> MetalIconFactory.PaletteCloseIcon </item>
++      <item> MetalIconFactory.TreeControlIcon </item>
++      <item> MetalIconFactory.TreeFolderIcon </item>
++      <item> MetalIconFactory.TreeLeafIcon </item>
++      <item> MetalInternalFrameTitlePane </item>
++      <item> MetalInternalFrameUI </item>
++      <item> MetalLabelUI </item>
++      <item> MetalLookAndFeel </item>
++      <item> MetalMenuBarUI </item>
++      <item> MetalPopupMenuSeparatorUI </item>
++      <item> MetalProgressBarUI </item>
++      <item> MetalRadioButtonUI </item>
++      <item> MetalRootPaneUI </item>
++      <item> MetalScrollBarUI </item>
++      <item> MetalScrollButton </item>
++      <item> MetalScrollPaneUI </item>
++      <item> MetalSeparatorUI </item>
++      <item> MetalSliderUI </item>
++      <item> MetalSplitPaneUI </item>
++      <item> MetalTabbedPaneUI </item>
++      <item> MetalTextFieldUI </item>
++      <item> MetalTheme </item>
++      <item> MetalToggleButtonUI </item>
++      <item> MetalToolBarUI </item>
++      <item> MetalToolTipUI </item>
++      <item> MetalTreeUI </item>
++      <item> Method </item>
++      <item> MethodDescriptor </item>
++      <item> MidiChannel </item>
++      <item> MidiDevice </item>
++      <item> MidiDevice.Info </item>
++      <item> MidiDeviceProvider </item>
++      <item> MidiEvent </item>
++      <item> MidiFileFormat </item>
++      <item> MidiFileReader </item>
++      <item> MidiFileWriter </item>
++      <item> MidiMessage </item>
++      <item> MidiSystem </item>
++      <item> MidiUnavailableException </item>
++      <item> MimeTypeParseException </item>
++      <item> MinimalHTMLWriter </item>
++      <item> MissingFormatArgumentException </item>
++      <item> MissingFormatWidthException </item>
++      <item> MissingResourceException </item>
++      <item> Mixer </item>
++      <item> Mixer.Info </item>
++      <item> MixerProvider </item>
++      <item> ModelMBean </item>
++      <item> ModelMBeanAttributeInfo </item>
++      <item> ModelMBeanConstructorInfo </item>
++      <item> ModelMBeanInfo </item>
++      <item> ModelMBeanInfoSupport </item>
++      <item> ModelMBeanNotificationBroadcaster </item>
++      <item> ModelMBeanNotificationInfo </item>
++      <item> ModelMBeanOperationInfo </item>
++      <item> ModificationItem </item>
++      <item> Modifier </item>
++      <item> Monitor </item>
++      <item> MonitorMBean </item>
++      <item> MonitorNotification </item>
++      <item> MonitorSettingException </item>
++      <item> MouseAdapter </item>
++      <item> MouseDragGestureRecognizer </item>
++      <item> MouseEvent </item>
++      <item> MouseInfo </item>
++      <item> MouseInputAdapter </item>
++      <item> MouseInputListener </item>
++      <item> MouseListener </item>
++      <item> MouseMotionAdapter </item>
++      <item> MouseMotionListener </item>
++      <item> MouseWheelEvent </item>
++      <item> MouseWheelListener </item>
++      <item> MultiButtonUI </item>
++      <item> MultiColorChooserUI </item>
++      <item> MultiComboBoxUI </item>
++      <item> MultiDesktopIconUI </item>
++      <item> MultiDesktopPaneUI </item>
++      <item> MultiDoc </item>
++      <item> MultiDocPrintJob </item>
++      <item> MultiDocPrintService </item>
++      <item> MultiFileChooserUI </item>
++      <item> MultiInternalFrameUI </item>
++      <item> MultiLabelUI </item>
++      <item> MultiListUI </item>
++      <item> MultiLookAndFeel </item>
++      <item> MultiMenuBarUI </item>
++      <item> MultiMenuItemUI </item>
++      <item> MultiOptionPaneUI </item>
++      <item> MultiPanelUI </item>
++      <item> MultiPixelPackedSampleModel </item>
++      <item> MultiPopupMenuUI </item>
++      <item> MultiProgressBarUI </item>
++      <item> MultiRootPaneUI </item>
++      <item> MultiScrollBarUI </item>
++      <item> MultiScrollPaneUI </item>
++      <item> MultiSeparatorUI </item>
++      <item> MultiSliderUI </item>
++      <item> MultiSpinnerUI </item>
++      <item> MultiSplitPaneUI </item>
++      <item> MultiTabbedPaneUI </item>
++      <item> MultiTableHeaderUI </item>
++      <item> MultiTableUI </item>
++      <item> MultiTextUI </item>
++      <item> MultiToolBarUI </item>
++      <item> MultiToolTipUI </item>
++      <item> MultiTreeUI </item>
++      <item> MultiViewportUI </item>
++      <item> MulticastSocket </item>
++      <item> MultipleComponentProfileHelper </item>
++      <item> MultipleComponentProfileHolder </item>
++      <item> MultipleDocumentHandling </item>
++      <item> MultipleMaster </item>
++      <item> MutableAttributeSet </item>
++      <item> MutableComboBoxModel </item>
++      <item> MutableTreeNode </item>
++      <item> NON_EXISTENT </item>
++      <item> NO_IMPLEMENT </item>
++      <item> NO_MEMORY </item>
++      <item> NO_PERMISSION </item>
++      <item> NO_RESOURCES </item>
++      <item> NO_RESPONSE </item>
++      <item> NVList </item>
++      <item> Name </item>
++      <item> NameAlreadyBoundException </item>
++      <item> NameCallback </item>
++      <item> NameClassPair </item>
++      <item> NameComponent </item>
++      <item> NameComponentHelper </item>
++      <item> NameComponentHolder </item>
++      <item> NameDynAnyPair </item>
++      <item> NameDynAnyPairHelper </item>
++      <item> NameDynAnyPairSeqHelper </item>
++      <item> NameHelper </item>
++      <item> NameHolder </item>
++      <item> NameList </item>
++      <item> NameNotFoundException </item>
++      <item> NameParser </item>
++      <item> NameValuePair </item>
++      <item> NameValuePair </item>
++      <item> NameValuePairHelper </item>
++      <item> NameValuePairHelper </item>
++      <item> NameValuePairSeqHelper </item>
++      <item> NamedNodeMap </item>
++      <item> NamedValue </item>
++      <item> NamespaceChangeListener </item>
++      <item> NamespaceContext </item>
++      <item> NamespaceSupport </item>
++      <item> Naming </item>
++      <item> NamingContext </item>
++      <item> NamingContextExt </item>
++      <item> NamingContextExtHelper </item>
++      <item> NamingContextExtHolder </item>
++      <item> NamingContextExtOperations </item>
++      <item> NamingContextExtPOA </item>
++      <item> NamingContextHelper </item>
++      <item> NamingContextHolder </item>
++      <item> NamingContextOperations </item>
++      <item> NamingContextPOA </item>
++      <item> NamingEnumeration </item>
++      <item> NamingEvent </item>
++      <item> NamingException </item>
++      <item> NamingExceptionEvent </item>
++      <item> NamingListener </item>
++      <item> NamingManager </item>
++      <item> NamingSecurityException </item>
++      <item> NavigationFilter </item>
++      <item> NavigationFilter.FilterBypass </item>
++      <item> NegativeArraySizeException </item>
++      <item> NetPermission </item>
++      <item> NetworkInterface </item>
++      <item> NoClassDefFoundError </item>
++      <item> NoConnectionPendingException </item>
++      <item> NoContext </item>
++      <item> NoContextHelper </item>
++      <item> NoInitialContextException </item>
++      <item> NoPermissionException </item>
++      <item> NoRouteToHostException </item>
++      <item> NoServant </item>
++      <item> NoServantHelper </item>
++      <item> NoSuchAlgorithmException </item>
++      <item> NoSuchAttributeException </item>
++      <item> NoSuchElementException </item>
++      <item> NoSuchFieldError </item>
++      <item> NoSuchFieldException </item>
++      <item> NoSuchMethodError </item>
++      <item> NoSuchMethodException </item>
++      <item> NoSuchObjectException </item>
++      <item> NoSuchPaddingException </item>
++      <item> NoSuchProviderException </item>
++      <item> Node </item>
++      <item> NodeChangeEvent </item>
++      <item> NodeChangeListener </item>
++      <item> NodeList </item>
++      <item> NonReadableChannelException </item>
++      <item> NonWritableChannelException </item>
++      <item> NoninvertibleTransformException </item>
++      <item> NotActiveException </item>
++      <item> NotBoundException </item>
++      <item> NotCompliantMBeanException </item>
++      <item> NotContextException </item>
++      <item> NotEmpty </item>
++      <item> NotEmptyHelper </item>
++      <item> NotEmptyHolder </item>
++      <item> NotFound </item>
++      <item> NotFoundHelper </item>
++      <item> NotFoundHolder </item>
++      <item> NotFoundReason </item>
++      <item> NotFoundReasonHelper </item>
++      <item> NotFoundReasonHolder </item>
++      <item> NotOwnerException </item>
++      <item> NotSerializableException </item>
++      <item> NotYetBoundException </item>
++      <item> NotYetConnectedException </item>
++      <item> Notation </item>
++      <item> Notification </item>
++      <item> NotificationBroadcaster </item>
++      <item> NotificationBroadcasterSupport </item>
++      <item> NotificationEmitter </item>
++      <item> NotificationFilter </item>
++      <item> NotificationFilterSupport </item>
++      <item> NotificationListener </item>
++      <item> NotificationResult </item>
++      <item> NullCipher </item>
++      <item> NullPointerException </item>
++      <item> Number </item>
++      <item> NumberFormat </item>
++      <item> NumberFormat.Field </item>
++      <item> NumberFormatException </item>
++      <item> NumberFormatter </item>
++      <item> NumberOfDocuments </item>
++      <item> NumberOfInterveningJobs </item>
++      <item> NumberUp </item>
++      <item> NumberUpSupported </item>
++      <item> NumericShaper </item>
++      <item> OAEPParameterSpec </item>
++      <item> OBJECT_NOT_EXIST </item>
++      <item> OBJ_ADAPTER </item>
++      <item> OMGVMCID </item>
++      <item> ORB </item>
++      <item> ORB </item>
++      <item> ORBIdHelper </item>
++      <item> ORBInitInfo </item>
++      <item> ORBInitInfoOperations </item>
++      <item> ORBInitializer </item>
++      <item> ORBInitializerOperations </item>
++      <item> ObjID </item>
++      <item> Object </item>
++      <item> Object </item>
++      <item> ObjectAlreadyActive </item>
++      <item> ObjectAlreadyActiveHelper </item>
++      <item> ObjectChangeListener </item>
++      <item> ObjectFactory </item>
++      <item> ObjectFactoryBuilder </item>
++      <item> ObjectHelper </item>
++      <item> ObjectHolder </item>
++      <item> ObjectIdHelper </item>
++      <item> ObjectIdHelper </item>
++      <item> ObjectImpl </item>
++      <item> ObjectImpl </item>
++      <item> ObjectInput </item>
++      <item> ObjectInputStream </item>
++      <item> ObjectInputStream.GetField </item>
++      <item> ObjectInputValidation </item>
++      <item> ObjectInstance </item>
++      <item> ObjectName </item>
++      <item> ObjectNotActive </item>
++      <item> ObjectNotActiveHelper </item>
++      <item> ObjectOutput </item>
++      <item> ObjectOutputStream </item>
++      <item> ObjectOutputStream.PutField </item>
++      <item> ObjectReferenceFactory </item>
++      <item> ObjectReferenceFactoryHelper </item>
++      <item> ObjectReferenceFactoryHolder </item>
++      <item> ObjectReferenceTemplate </item>
++      <item> ObjectReferenceTemplateHelper </item>
++      <item> ObjectReferenceTemplateHolder </item>
++      <item> ObjectReferenceTemplateSeqHelper </item>
++      <item> ObjectReferenceTemplateSeqHolder </item>
++      <item> ObjectStreamClass </item>
++      <item> ObjectStreamConstants </item>
++      <item> ObjectStreamException </item>
++      <item> ObjectStreamField </item>
++      <item> ObjectView </item>
++      <item> Observable </item>
++      <item> Observer </item>
++      <item> OceanTheme </item>
++      <item> OctetSeqHelper </item>
++      <item> OctetSeqHolder </item>
++      <item> Oid </item>
++      <item> OpenDataException </item>
++      <item> OpenMBeanAttributeInfo </item>
++      <item> OpenMBeanAttributeInfoSupport </item>
++      <item> OpenMBeanConstructorInfo </item>
++      <item> OpenMBeanConstructorInfoSupport </item>
++      <item> OpenMBeanInfo </item>
++      <item> OpenMBeanInfoSupport </item>
++      <item> OpenMBeanOperationInfo </item>
++      <item> OpenMBeanOperationInfoSupport </item>
++      <item> OpenMBeanParameterInfo </item>
++      <item> OpenMBeanParameterInfoSupport </item>
++      <item> OpenType </item>
++      <item> OpenType </item>
++      <item> OperatingSystemMXBean </item>
++      <item> Operation </item>
++      <item> OperationNotSupportedException </item>
++      <item> OperationsException </item>
++      <item> Option </item>
++      <item> OptionPaneUI </item>
++      <item> OptionalDataException </item>
++      <item> OrientationRequested </item>
++      <item> OutOfMemoryError </item>
++      <item> OutputDeviceAssigned </item>
++      <item> OutputKeys </item>
++      <item> OutputStream </item>
++      <item> OutputStream </item>
++      <item> OutputStream </item>
++      <item> OutputStreamWriter </item>
++      <item> OverlappingFileLockException </item>
++      <item> OverlayLayout </item>
++      <item> Override </item>
++      <item> Owner </item>
++      <item> PBEKey </item>
++      <item> PBEKeySpec </item>
++      <item> PBEParameterSpec </item>
++      <item> PDLOverrideSupported </item>
++      <item> PERSIST_STORE </item>
++      <item> PKCS8EncodedKeySpec </item>
++      <item> PKIXBuilderParameters </item>
++      <item> PKIXCertPathBuilderResult </item>
++      <item> PKIXCertPathChecker </item>
++      <item> PKIXCertPathValidatorResult </item>
++      <item> PKIXParameters </item>
++      <item> POA </item>
++      <item> POAHelper </item>
++      <item> POAManager </item>
++      <item> POAManagerOperations </item>
++      <item> POAOperations </item>
++      <item> PRIVATE_MEMBER </item>
++      <item> PSSParameterSpec </item>
++      <item> PSource </item>
++      <item> PSource.PSpecified </item>
++      <item> PUBLIC_MEMBER </item>
++      <item> Pack200 </item>
++      <item> Pack200.Packer </item>
++      <item> Pack200.Unpacker </item>
++      <item> Package </item>
++      <item> PackedColorModel </item>
++      <item> PageAttributes </item>
++      <item> PageAttributes.ColorType </item>
++      <item> PageAttributes.MediaType </item>
++      <item> PageAttributes.OrientationRequestedType </item>
++      <item> PageAttributes.OriginType </item>
++      <item> PageAttributes.PrintQualityType </item>
++      <item> PageFormat </item>
++      <item> PageRanges </item>
++      <item> Pageable </item>
++      <item> PagedResultsControl </item>
++      <item> PagedResultsResponseControl </item>
++      <item> PagesPerMinute </item>
++      <item> PagesPerMinuteColor </item>
++      <item> Paint </item>
++      <item> PaintContext </item>
++      <item> PaintEvent </item>
++      <item> Panel </item>
++      <item> PanelUI </item>
++      <item> Paper </item>
++      <item> ParagraphView </item>
++      <item> ParagraphView </item>
++      <item> Parameter </item>
++      <item> ParameterBlock </item>
++      <item> ParameterDescriptor </item>
++      <item> ParameterMetaData </item>
++      <item> ParameterMode </item>
++      <item> ParameterModeHelper </item>
++      <item> ParameterModeHolder </item>
++      <item> ParameterizedType </item>
++      <item> ParseException </item>
++      <item> ParsePosition </item>
++      <item> Parser </item>
++      <item> Parser </item>
++      <item> ParserAdapter </item>
++      <item> ParserConfigurationException </item>
++      <item> ParserDelegator </item>
++      <item> ParserFactory </item>
++      <item> PartialResultException </item>
++      <item> PasswordAuthentication </item>
++      <item> PasswordCallback </item>
++      <item> PasswordView </item>
++      <item> Patch </item>
++      <item> PathIterator </item>
++      <item> Pattern </item>
++      <item> PatternSyntaxException </item>
++      <item> Permission </item>
++      <item> Permission </item>
++      <item> PermissionCollection </item>
++      <item> Permissions </item>
++      <item> PersistenceDelegate </item>
++      <item> PersistentMBean </item>
++      <item> PhantomReference </item>
++      <item> Pipe </item>
++      <item> Pipe.SinkChannel </item>
++      <item> Pipe.SourceChannel </item>
++      <item> PipedInputStream </item>
++      <item> PipedOutputStream </item>
++      <item> PipedReader </item>
++      <item> PipedWriter </item>
++      <item> PixelGrabber </item>
++      <item> PixelInterleavedSampleModel </item>
++      <item> PlainDocument </item>
++      <item> PlainView </item>
++      <item> Point </item>
++      <item> Point2D </item>
++      <item> Point2D.Double </item>
++      <item> Point2D.Float </item>
++      <item> PointerInfo </item>
++      <item> Policy </item>
++      <item> Policy </item>
++      <item> Policy </item>
++      <item> PolicyError </item>
++      <item> PolicyErrorCodeHelper </item>
++      <item> PolicyErrorHelper </item>
++      <item> PolicyErrorHolder </item>
++      <item> PolicyFactory </item>
++      <item> PolicyFactoryOperations </item>
++      <item> PolicyHelper </item>
++      <item> PolicyHolder </item>
++      <item> PolicyListHelper </item>
++      <item> PolicyListHolder </item>
++      <item> PolicyNode </item>
++      <item> PolicyOperations </item>
++      <item> PolicyQualifierInfo </item>
++      <item> PolicyTypeHelper </item>
++      <item> Polygon </item>
++      <item> PooledConnection </item>
++      <item> Popup </item>
++      <item> PopupFactory </item>
++      <item> PopupMenu </item>
++      <item> PopupMenuEvent </item>
++      <item> PopupMenuListener </item>
++      <item> PopupMenuUI </item>
++      <item> Port </item>
++      <item> Port.Info </item>
++      <item> PortUnreachableException </item>
++      <item> PortableRemoteObject </item>
++      <item> PortableRemoteObjectDelegate </item>
++      <item> Position </item>
++      <item> Position.Bias </item>
++      <item> Predicate </item>
++      <item> PreferenceChangeEvent </item>
++      <item> PreferenceChangeListener </item>
++      <item> Preferences </item>
++      <item> PreferencesFactory </item>
++      <item> PreparedStatement </item>
++      <item> PresentationDirection </item>
++      <item> Principal </item>
++      <item> Principal </item>
++      <item> PrincipalHolder </item>
++      <item> PrintEvent </item>
++      <item> PrintException </item>
++      <item> PrintGraphics </item>
++      <item> PrintJob </item>
++      <item> PrintJobAdapter </item>
++      <item> PrintJobAttribute </item>
++      <item> PrintJobAttributeEvent </item>
++      <item> PrintJobAttributeListener </item>
++      <item> PrintJobAttributeSet </item>
++      <item> PrintJobEvent </item>
++      <item> PrintJobListener </item>
++      <item> PrintQuality </item>
++      <item> PrintRequestAttribute </item>
++      <item> PrintRequestAttributeSet </item>
++      <item> PrintService </item>
++      <item> PrintServiceAttribute </item>
++      <item> PrintServiceAttributeEvent </item>
++      <item> PrintServiceAttributeListener </item>
++      <item> PrintServiceAttributeSet </item>
++      <item> PrintServiceLookup </item>
++      <item> PrintStream </item>
++      <item> PrintWriter </item>
++      <item> Printable </item>
++      <item> PrinterAbortException </item>
++      <item> PrinterException </item>
++      <item> PrinterGraphics </item>
++      <item> PrinterIOException </item>
++      <item> PrinterInfo </item>
++      <item> PrinterIsAcceptingJobs </item>
++      <item> PrinterJob </item>
++      <item> PrinterLocation </item>
++      <item> PrinterMakeAndModel </item>
++      <item> PrinterMessageFromOperator </item>
++      <item> PrinterMoreInfo </item>
++      <item> PrinterMoreInfoManufacturer </item>
++      <item> PrinterName </item>
++      <item> PrinterResolution </item>
++      <item> PrinterState </item>
++      <item> PrinterStateReason </item>
++      <item> PrinterStateReasons </item>
++      <item> PrinterURI </item>
++      <item> PriorityBlockingQueue </item>
++      <item> PriorityQueue </item>
++      <item> PrivateClassLoader </item>
++      <item> PrivateCredentialPermission </item>
++      <item> PrivateKey </item>
++      <item> PrivateMLet </item>
++      <item> PrivilegedAction </item>
++      <item> PrivilegedActionException </item>
++      <item> PrivilegedExceptionAction </item>
++      <item> Process </item>
++      <item> ProcessBuilder </item>
++      <item> ProcessingInstruction </item>
++      <item> ProfileDataException </item>
++      <item> ProfileIdHelper </item>
++      <item> ProgressBarUI </item>
++      <item> ProgressMonitor </item>
++      <item> ProgressMonitorInputStream </item>
++      <item> Properties </item>
++      <item> PropertyChangeEvent </item>
++      <item> PropertyChangeListener </item>
++      <item> PropertyChangeListenerProxy </item>
++      <item> PropertyChangeSupport </item>
++      <item> PropertyDescriptor </item>
++      <item> PropertyEditor </item>
++      <item> PropertyEditorManager </item>
++      <item> PropertyEditorSupport </item>
++      <item> PropertyPermission </item>
++      <item> PropertyResourceBundle </item>
++      <item> PropertyVetoException </item>
++      <item> ProtectionDomain </item>
++      <item> ProtocolException </item>
++      <item> Provider </item>
++      <item> Provider.Service </item>
++      <item> ProviderException </item>
++      <item> Proxy </item>
++      <item> Proxy </item>
++      <item> Proxy.Type </item>
++      <item> ProxySelector </item>
++      <item> PublicKey </item>
++      <item> PushbackInputStream </item>
++      <item> PushbackReader </item>
++      <item> QName </item>
++      <item> QuadCurve2D </item>
++      <item> QuadCurve2D.Double </item>
++      <item> QuadCurve2D.Float </item>
++      <item> Query </item>
++      <item> QueryEval </item>
++      <item> QueryExp </item>
++      <item> Queue </item>
++      <item> QueuedJobCount </item>
++      <item> RC2ParameterSpec </item>
++      <item> RC5ParameterSpec </item>
++      <item> REBIND </item>
++      <item> REQUEST_PROCESSING_POLICY_ID </item>
++      <item> RGBImageFilter </item>
++      <item> RMIClassLoader </item>
++      <item> RMIClassLoaderSpi </item>
++      <item> RMIClientSocketFactory </item>
++      <item> RMIConnection </item>
++      <item> RMIConnectionImpl </item>
++      <item> RMIConnectionImpl_Stub </item>
++      <item> RMIConnector </item>
++      <item> RMIConnectorServer </item>
++      <item> RMICustomMaxStreamFormat </item>
++      <item> RMIFailureHandler </item>
++      <item> RMIIIOPServerImpl </item>
++      <item> RMIJRMPServerImpl </item>
++      <item> RMISecurityException </item>
++      <item> RMISecurityManager </item>
++      <item> RMIServer </item>
++      <item> RMIServerImpl </item>
++      <item> RMIServerImpl_Stub </item>
++      <item> RMIServerSocketFactory </item>
++      <item> RMISocketFactory </item>
++      <item> RSAKey </item>
++      <item> RSAKeyGenParameterSpec </item>
++      <item> RSAMultiPrimePrivateCrtKey </item>
++      <item> RSAMultiPrimePrivateCrtKeySpec </item>
++      <item> RSAOtherPrimeInfo </item>
++      <item> RSAPrivateCrtKey </item>
++      <item> RSAPrivateCrtKeySpec </item>
++      <item> RSAPrivateKey </item>
++      <item> RSAPrivateKeySpec </item>
++      <item> RSAPublicKey </item>
++      <item> RSAPublicKeySpec </item>
++      <item> RTFEditorKit </item>
++      <item> Random </item>
++      <item> RandomAccess </item>
++      <item> RandomAccessFile </item>
++      <item> Raster </item>
++      <item> RasterFormatException </item>
++      <item> RasterOp </item>
++      <item> Rdn </item>
++      <item> ReadOnlyBufferException </item>
++      <item> ReadWriteLock </item>
++      <item> Readable </item>
++      <item> ReadableByteChannel </item>
++      <item> Reader </item>
++      <item> RealmCallback </item>
++      <item> RealmChoiceCallback </item>
++      <item> Receiver </item>
++      <item> Rectangle </item>
++      <item> Rectangle2D </item>
++      <item> Rectangle2D.Double </item>
++      <item> Rectangle2D.Float </item>
++      <item> RectangularShape </item>
++      <item> ReentrantLock </item>
++      <item> ReentrantReadWriteLock </item>
++      <item> ReentrantReadWriteLock.ReadLock </item>
++      <item> ReentrantReadWriteLock.WriteLock </item>
++      <item> Ref </item>
++      <item> RefAddr </item>
++      <item> Reference </item>
++      <item> Reference </item>
++      <item> ReferenceQueue </item>
++      <item> ReferenceUriSchemesSupported </item>
++      <item> Referenceable </item>
++      <item> ReferralException </item>
++      <item> ReflectPermission </item>
++      <item> ReflectionException </item>
++      <item> RefreshFailedException </item>
++      <item> Refreshable </item>
++      <item> Region </item>
++      <item> RegisterableService </item>
++      <item> Registry </item>
++      <item> RegistryHandler </item>
++      <item> RejectedExecutionException </item>
++      <item> RejectedExecutionHandler </item>
++      <item> Relation </item>
++      <item> RelationException </item>
++      <item> RelationNotFoundException </item>
++      <item> RelationNotification </item>
++      <item> RelationService </item>
++      <item> RelationServiceMBean </item>
++      <item> RelationServiceNotRegisteredException </item>
++      <item> RelationSupport </item>
++      <item> RelationSupportMBean </item>
++      <item> RelationType </item>
++      <item> RelationTypeNotFoundException </item>
++      <item> RelationTypeSupport </item>
++      <item> RemarshalException </item>
++      <item> Remote </item>
++      <item> RemoteCall </item>
++      <item> RemoteException </item>
++      <item> RemoteObject </item>
++      <item> RemoteObjectInvocationHandler </item>
++      <item> RemoteRef </item>
++      <item> RemoteServer </item>
++      <item> RemoteStub </item>
++      <item> RenderContext </item>
++      <item> RenderableImage </item>
++      <item> RenderableImageOp </item>
++      <item> RenderableImageProducer </item>
++      <item> RenderedImage </item>
++      <item> RenderedImageFactory </item>
++      <item> Renderer </item>
++      <item> RenderingHints </item>
++      <item> RenderingHints.Key </item>
++      <item> RepaintManager </item>
++      <item> ReplicateScaleFilter </item>
++      <item> RepositoryIdHelper </item>
++      <item> Request </item>
++      <item> RequestInfo </item>
++      <item> RequestInfoOperations </item>
++      <item> RequestProcessingPolicy </item>
++      <item> RequestProcessingPolicyOperations </item>
++      <item> RequestProcessingPolicyValue </item>
++      <item> RequestingUserName </item>
++      <item> RequiredModelMBean </item>
++      <item> RescaleOp </item>
++      <item> ResolutionSyntax </item>
++      <item> ResolveResult </item>
++      <item> Resolver </item>
++      <item> ResourceBundle </item>
++      <item> ResponseCache </item>
++      <item> ResponseHandler </item>
++      <item> Result </item>
++      <item> ResultSet </item>
++      <item> ResultSetMetaData </item>
++      <item> Retention </item>
++      <item> RetentionPolicy </item>
++      <item> ReverbType </item>
++      <item> Robot </item>
++      <item> Role </item>
++      <item> RoleInfo </item>
++      <item> RoleInfoNotFoundException </item>
++      <item> RoleList </item>
++      <item> RoleNotFoundException </item>
++      <item> RoleResult </item>
++      <item> RoleStatus </item>
++      <item> RoleUnresolved </item>
++      <item> RoleUnresolvedList </item>
++      <item> RootPaneContainer </item>
++      <item> RootPaneUI </item>
++      <item> RoundRectangle2D </item>
++      <item> RoundRectangle2D.Double </item>
++      <item> RoundRectangle2D.Float </item>
++      <item> RoundingMode </item>
++      <item> RowMapper </item>
++      <item> RowSet </item>
++      <item> RowSetEvent </item>
++      <item> RowSetInternal </item>
++      <item> RowSetListener </item>
++      <item> RowSetMetaData </item>
++      <item> RowSetMetaDataImpl </item>
++      <item> RowSetReader </item>
++      <item> RowSetWarning </item>
++      <item> RowSetWriter </item>
++      <item> RuleBasedCollator </item>
++      <item> RunTime </item>
++      <item> RunTimeOperations </item>
++      <item> Runnable </item>
++      <item> Runtime </item>
++      <item> RuntimeErrorException </item>
++      <item> RuntimeException </item>
++      <item> RuntimeMBeanException </item>
++      <item> RuntimeMXBean </item>
++      <item> RuntimeOperationsException </item>
++      <item> RuntimePermission </item>
++      <item> SAXException </item>
++      <item> SAXNotRecognizedException </item>
++      <item> SAXNotSupportedException </item>
++      <item> SAXParseException </item>
++      <item> SAXParser </item>
++      <item> SAXParserFactory </item>
++      <item> SAXResult </item>
++      <item> SAXSource </item>
++      <item> SAXTransformerFactory </item>
++      <item> SERVANT_RETENTION_POLICY_ID </item>
++      <item> SQLData </item>
++      <item> SQLException </item>
++      <item> SQLInput </item>
++      <item> SQLInputImpl </item>
++      <item> SQLOutput </item>
++      <item> SQLOutputImpl </item>
++      <item> SQLPermission </item>
++      <item> SQLWarning </item>
++      <item> SSLContext </item>
++      <item> SSLContextSpi </item>
++      <item> SSLEngine </item>
++      <item> SSLEngineResult </item>
++      <item> SSLEngineResult.HandshakeStatus </item>
++      <item> SSLEngineResult.Status </item>
++      <item> SSLException </item>
++      <item> SSLHandshakeException </item>
++      <item> SSLKeyException </item>
++      <item> SSLPeerUnverifiedException </item>
++      <item> SSLPermission </item>
++      <item> SSLProtocolException </item>
++      <item> SSLServerSocket </item>
++      <item> SSLServerSocketFactory </item>
++      <item> SSLSession </item>
++      <item> SSLSessionBindingEvent </item>
++      <item> SSLSessionBindingListener </item>
++      <item> SSLSessionContext </item>
++      <item> SSLSocket </item>
++      <item> SSLSocketFactory </item>
++      <item> SUCCESSFUL </item>
++      <item> SYNC_WITH_TRANSPORT </item>
++      <item> SYSTEM_EXCEPTION </item>
++      <item> SampleModel </item>
++      <item> Sasl </item>
++      <item> SaslClient </item>
++      <item> SaslClientFactory </item>
++      <item> SaslException </item>
++      <item> SaslServer </item>
++      <item> SaslServerFactory </item>
++      <item> Savepoint </item>
++      <item> Scanner </item>
++      <item> ScatteringByteChannel </item>
++      <item> ScheduledExecutorService </item>
++      <item> ScheduledFuture </item>
++      <item> ScheduledThreadPoolExecutor </item>
++      <item> Schema </item>
++      <item> SchemaFactory </item>
++      <item> SchemaFactoryLoader </item>
++      <item> SchemaViolationException </item>
++      <item> ScrollBarUI </item>
++      <item> ScrollPane </item>
++      <item> ScrollPaneAdjustable </item>
++      <item> ScrollPaneConstants </item>
++      <item> ScrollPaneLayout </item>
++      <item> ScrollPaneLayout.UIResource </item>
++      <item> ScrollPaneUI </item>
++      <item> Scrollable </item>
++      <item> Scrollbar </item>
++      <item> SealedObject </item>
++      <item> SearchControls </item>
++      <item> SearchResult </item>
++      <item> SecretKey </item>
++      <item> SecretKeyFactory </item>
++      <item> SecretKeyFactorySpi </item>
++      <item> SecretKeySpec </item>
++      <item> SecureCacheResponse </item>
++      <item> SecureClassLoader </item>
++      <item> SecureRandom </item>
++      <item> SecureRandomSpi </item>
++      <item> Security </item>
++      <item> SecurityException </item>
++      <item> SecurityManager </item>
++      <item> SecurityPermission </item>
++      <item> Segment </item>
++      <item> SelectableChannel </item>
++      <item> SelectionKey </item>
++      <item> Selector </item>
++      <item> SelectorProvider </item>
++      <item> Semaphore </item>
++      <item> SeparatorUI </item>
++      <item> Sequence </item>
++      <item> SequenceInputStream </item>
++      <item> Sequencer </item>
++      <item> Sequencer.SyncMode </item>
++      <item> SerialArray </item>
++      <item> SerialBlob </item>
++      <item> SerialClob </item>
++      <item> SerialDatalink </item>
++      <item> SerialException </item>
++      <item> SerialJavaObject </item>
++      <item> SerialRef </item>
++      <item> SerialStruct </item>
++      <item> Serializable </item>
++      <item> SerializablePermission </item>
++      <item> Servant </item>
++      <item> ServantActivator </item>
++      <item> ServantActivatorHelper </item>
++      <item> ServantActivatorOperations </item>
++      <item> ServantActivatorPOA </item>
++      <item> ServantAlreadyActive </item>
++      <item> ServantAlreadyActiveHelper </item>
++      <item> ServantLocator </item>
++      <item> ServantLocatorHelper </item>
++      <item> ServantLocatorOperations </item>
++      <item> ServantLocatorPOA </item>
++      <item> ServantManager </item>
++      <item> ServantManagerOperations </item>
++      <item> ServantNotActive </item>
++      <item> ServantNotActiveHelper </item>
++      <item> ServantObject </item>
++      <item> ServantRetentionPolicy </item>
++      <item> ServantRetentionPolicyOperations </item>
++      <item> ServantRetentionPolicyValue </item>
++      <item> ServerCloneException </item>
++      <item> ServerError </item>
++      <item> ServerException </item>
++      <item> ServerIdHelper </item>
++      <item> ServerNotActiveException </item>
++      <item> ServerRef </item>
++      <item> ServerRequest </item>
++      <item> ServerRequestInfo </item>
++      <item> ServerRequestInfoOperations </item>
++      <item> ServerRequestInterceptor </item>
++      <item> ServerRequestInterceptorOperations </item>
++      <item> ServerRuntimeException </item>
++      <item> ServerSocket </item>
++      <item> ServerSocketChannel </item>
++      <item> ServerSocketFactory </item>
++      <item> ServiceContext </item>
++      <item> ServiceContextHelper </item>
++      <item> ServiceContextHolder </item>
++      <item> ServiceContextListHelper </item>
++      <item> ServiceContextListHolder </item>
++      <item> ServiceDetail </item>
++      <item> ServiceDetailHelper </item>
++      <item> ServiceIdHelper </item>
++      <item> ServiceInformation </item>
++      <item> ServiceInformationHelper </item>
++      <item> ServiceInformationHolder </item>
++      <item> ServiceNotFoundException </item>
++      <item> ServicePermission </item>
++      <item> ServiceRegistry </item>
++      <item> ServiceRegistry.Filter </item>
++      <item> ServiceUI </item>
++      <item> ServiceUIFactory </item>
++      <item> ServiceUnavailableException </item>
++      <item> Set </item>
++      <item> SetOfIntegerSyntax </item>
++      <item> SetOverrideType </item>
++      <item> SetOverrideTypeHelper </item>
++      <item> Severity </item>
++      <item> Shape </item>
++      <item> ShapeGraphicAttribute </item>
++      <item> SheetCollate </item>
++      <item> Short </item>
++      <item> ShortBuffer </item>
++      <item> ShortBufferException </item>
++      <item> ShortHolder </item>
++      <item> ShortLookupTable </item>
++      <item> ShortMessage </item>
++      <item> ShortSeqHelper </item>
++      <item> ShortSeqHolder </item>
++      <item> Sides </item>
++      <item> Signature </item>
++      <item> SignatureException </item>
++      <item> SignatureSpi </item>
++      <item> SignedObject </item>
++      <item> Signer </item>
++      <item> SimpleAttributeSet </item>
++      <item> SimpleBeanInfo </item>
++      <item> SimpleDateFormat </item>
++      <item> SimpleDoc </item>
++      <item> SimpleFormatter </item>
++      <item> SimpleTimeZone </item>
++      <item> SimpleType </item>
++      <item> SinglePixelPackedSampleModel </item>
++      <item> SingleSelectionModel </item>
++      <item> Size2DSyntax </item>
++      <item> SizeLimitExceededException </item>
++      <item> SizeRequirements </item>
++      <item> SizeSequence </item>
++      <item> Skeleton </item>
++      <item> SkeletonMismatchException </item>
++      <item> SkeletonNotFoundException </item>
++      <item> SliderUI </item>
++      <item> Socket </item>
++      <item> SocketAddress </item>
++      <item> SocketChannel </item>
++      <item> SocketException </item>
++      <item> SocketFactory </item>
++      <item> SocketHandler </item>
++      <item> SocketImpl </item>
++      <item> SocketImplFactory </item>
++      <item> SocketOptions </item>
++      <item> SocketPermission </item>
++      <item> SocketSecurityException </item>
++      <item> SocketTimeoutException </item>
++      <item> SoftBevelBorder </item>
++      <item> SoftReference </item>
++      <item> SortControl </item>
++      <item> SortKey </item>
++      <item> SortResponseControl </item>
++      <item> SortedMap </item>
++      <item> SortedSet </item>
++      <item> SortingFocusTraversalPolicy </item>
++      <item> Soundbank </item>
++      <item> SoundbankReader </item>
++      <item> SoundbankResource </item>
++      <item> Source </item>
++      <item> SourceDataLine </item>
++      <item> SourceLocator </item>
++      <item> SpinnerDateModel </item>
++      <item> SpinnerListModel </item>
++      <item> SpinnerModel </item>
++      <item> SpinnerNumberModel </item>
++      <item> SpinnerUI </item>
++      <item> SplitPaneUI </item>
++      <item> Spring </item>
++      <item> SpringLayout </item>
++      <item> SpringLayout.Constraints </item>
++      <item> SslRMIClientSocketFactory </item>
++      <item> SslRMIServerSocketFactory </item>
++      <item> Stack </item>
++      <item> StackOverflowError </item>
++      <item> StackTraceElement </item>
++      <item> StandardMBean </item>
++      <item> StartTlsRequest </item>
++      <item> StartTlsResponse </item>
++      <item> State </item>
++      <item> StateEdit </item>
++      <item> StateEditable </item>
++      <item> StateFactory </item>
++      <item> Statement </item>
++      <item> Statement </item>
++      <item> StreamCorruptedException </item>
++      <item> StreamHandler </item>
++      <item> StreamPrintService </item>
++      <item> StreamPrintServiceFactory </item>
++      <item> StreamResult </item>
++      <item> StreamSource </item>
++      <item> StreamTokenizer </item>
++      <item> Streamable </item>
++      <item> StreamableValue </item>
++      <item> StrictMath </item>
++      <item> String </item>
++      <item> StringBuffer </item>
++      <item> StringBufferInputStream </item>
++      <item> StringBuilder </item>
++      <item> StringCharacterIterator </item>
++      <item> StringContent </item>
++      <item> StringHolder </item>
++      <item> StringIndexOutOfBoundsException </item>
++      <item> StringMonitor </item>
++      <item> StringMonitorMBean </item>
++      <item> StringNameHelper </item>
++      <item> StringReader </item>
++      <item> StringRefAddr </item>
++      <item> StringSelection </item>
++      <item> StringSeqHelper </item>
++      <item> StringSeqHolder </item>
++      <item> StringTokenizer </item>
++      <item> StringValueExp </item>
++      <item> StringValueHelper </item>
++      <item> StringWriter </item>
++      <item> Stroke </item>
++      <item> Struct </item>
++      <item> StructMember </item>
++      <item> StructMemberHelper </item>
++      <item> Stub </item>
++      <item> StubDelegate </item>
++      <item> StubNotFoundException </item>
++      <item> Style </item>
++      <item> StyleConstants </item>
++      <item> StyleConstants.CharacterConstants </item>
++      <item> StyleConstants.ColorConstants </item>
++      <item> StyleConstants.FontConstants </item>
++      <item> StyleConstants.ParagraphConstants </item>
++      <item> StyleContext </item>
++      <item> StyleSheet </item>
++      <item> StyleSheet.BoxPainter </item>
++      <item> StyleSheet.ListPainter </item>
++      <item> StyledDocument </item>
++      <item> StyledEditorKit </item>
++      <item> StyledEditorKit.AlignmentAction </item>
++      <item> StyledEditorKit.BoldAction </item>
++      <item> StyledEditorKit.FontFamilyAction </item>
++      <item> StyledEditorKit.FontSizeAction </item>
++      <item> StyledEditorKit.ForegroundAction </item>
++      <item> StyledEditorKit.ItalicAction </item>
++      <item> StyledEditorKit.StyledTextAction </item>
++      <item> StyledEditorKit.UnderlineAction </item>
++      <item> Subject </item>
++      <item> SubjectDelegationPermission </item>
++      <item> SubjectDomainCombiner </item>
++      <item> SupportedValuesAttribute </item>
++      <item> SuppressWarnings </item>
++      <item> SwingConstants </item>
++      <item> SwingPropertyChangeSupport </item>
++      <item> SwingUtilities </item>
++      <item> SyncFactory </item>
++      <item> SyncFactoryException </item>
++      <item> SyncFailedException </item>
++      <item> SyncProvider </item>
++      <item> SyncProviderException </item>
++      <item> SyncResolver </item>
++      <item> SyncScopeHelper </item>
++      <item> SynchronousQueue </item>
++      <item> SynthConstants </item>
++      <item> SynthContext </item>
++      <item> SynthGraphicsUtils </item>
++      <item> SynthLookAndFeel </item>
++      <item> SynthPainter </item>
++      <item> SynthStyle </item>
++      <item> SynthStyleFactory </item>
++      <item> Synthesizer </item>
++      <item> SysexMessage </item>
++      <item> System </item>
++      <item> SystemColor </item>
++      <item> SystemException </item>
++      <item> SystemFlavorMap </item>
++      <item> TAG_ALTERNATE_IIOP_ADDRESS </item>
++      <item> TAG_CODE_SETS </item>
++      <item> TAG_INTERNET_IOP </item>
++      <item> TAG_JAVA_CODEBASE </item>
++      <item> TAG_MULTIPLE_COMPONENTS </item>
++      <item> TAG_ORB_TYPE </item>
++      <item> TAG_POLICIES </item>
++      <item> TAG_RMI_CUSTOM_MAX_STREAM_FORMAT </item>
++      <item> TCKind </item>
++      <item> THREAD_POLICY_ID </item>
++      <item> TIMEOUT </item>
++      <item> TRANSACTION_MODE </item>
++      <item> TRANSACTION_REQUIRED </item>
++      <item> TRANSACTION_ROLLEDBACK </item>
++      <item> TRANSACTION_UNAVAILABLE </item>
++      <item> TRANSIENT </item>
++      <item> TRANSPORT_RETRY </item>
++      <item> TabExpander </item>
++      <item> TabSet </item>
++      <item> TabStop </item>
++      <item> TabableView </item>
++      <item> TabbedPaneUI </item>
++      <item> TableCellEditor </item>
++      <item> TableCellRenderer </item>
++      <item> TableColumn </item>
++      <item> TableColumnModel </item>
++      <item> TableColumnModelEvent </item>
++      <item> TableColumnModelListener </item>
++      <item> TableHeaderUI </item>
++      <item> TableModel </item>
++      <item> TableModelEvent </item>
++      <item> TableModelListener </item>
++      <item> TableUI </item>
++      <item> TableView </item>
++      <item> TabularData </item>
++      <item> TabularDataSupport </item>
++      <item> TabularType </item>
++      <item> TagElement </item>
++      <item> TaggedComponent </item>
++      <item> TaggedComponentHelper </item>
++      <item> TaggedComponentHolder </item>
++      <item> TaggedProfile </item>
++      <item> TaggedProfileHelper </item>
++      <item> TaggedProfileHolder </item>
++      <item> Target </item>
++      <item> TargetDataLine </item>
++      <item> TargetedNotification </item>
++      <item> Templates </item>
++      <item> TemplatesHandler </item>
++      <item> Text </item>
++      <item> TextAction </item>
++      <item> TextArea </item>
++      <item> TextAttribute </item>
++      <item> TextComponent </item>
++      <item> TextEvent </item>
++      <item> TextField </item>
++      <item> TextHitInfo </item>
++      <item> TextInputCallback </item>
++      <item> TextLayout </item>
++      <item> TextLayout.CaretPolicy </item>
++      <item> TextListener </item>
++      <item> TextMeasurer </item>
++      <item> TextOutputCallback </item>
++      <item> TextSyntax </item>
++      <item> TextUI </item>
++      <item> TexturePaint </item>
++      <item> Thread </item>
++      <item> Thread.State </item>
++      <item> Thread.UncaughtExceptionHandler </item>
++      <item> ThreadDeath </item>
++      <item> ThreadFactory </item>
++      <item> ThreadGroup </item>
++      <item> ThreadInfo </item>
++      <item> ThreadLocal </item>
++      <item> ThreadMXBean </item>
++      <item> ThreadPolicy </item>
++      <item> ThreadPolicyOperations </item>
++      <item> ThreadPolicyValue </item>
++      <item> ThreadPoolExecutor </item>
++      <item> ThreadPoolExecutor.AbortPolicy </item>
++      <item> ThreadPoolExecutor.CallerRunsPolicy </item>
++      <item> ThreadPoolExecutor.DiscardOldestPolicy </item>
++      <item> ThreadPoolExecutor.DiscardPolicy </item>
++      <item> Throwable </item>
++      <item> Tie </item>
++      <item> TileObserver </item>
++      <item> Time </item>
++      <item> TimeLimitExceededException </item>
++      <item> TimeUnit </item>
++      <item> TimeZone </item>
++      <item> TimeoutException </item>
++      <item> Timer </item>
++      <item> Timer </item>
++      <item> Timer </item>
++      <item> TimerAlarmClockNotification </item>
++      <item> TimerMBean </item>
++      <item> TimerNotification </item>
++      <item> TimerTask </item>
++      <item> Timestamp </item>
++      <item> Timestamp </item>
++      <item> TitledBorder </item>
++      <item> TooManyListenersException </item>
++      <item> ToolBarUI </item>
++      <item> ToolTipManager </item>
++      <item> ToolTipUI </item>
++      <item> Toolkit </item>
++      <item> Track </item>
++      <item> TransactionRequiredException </item>
++      <item> TransactionRolledbackException </item>
++      <item> TransactionService </item>
++      <item> TransactionalWriter </item>
++      <item> TransferHandler </item>
++      <item> Transferable </item>
++      <item> TransformAttribute </item>
++      <item> Transformer </item>
++      <item> TransformerConfigurationException </item>
++      <item> TransformerException </item>
++      <item> TransformerFactory </item>
++      <item> TransformerFactoryConfigurationError </item>
++      <item> TransformerHandler </item>
++      <item> Transmitter </item>
++      <item> Transparency </item>
++      <item> TreeCellEditor </item>
++      <item> TreeCellRenderer </item>
++      <item> TreeExpansionEvent </item>
++      <item> TreeExpansionListener </item>
++      <item> TreeMap </item>
++      <item> TreeModel </item>
++      <item> TreeModelEvent </item>
++      <item> TreeModelListener </item>
++      <item> TreeNode </item>
++      <item> TreePath </item>
++      <item> TreeSelectionEvent </item>
++      <item> TreeSelectionListener </item>
++      <item> TreeSelectionModel </item>
++      <item> TreeSet </item>
++      <item> TreeUI </item>
++      <item> TreeWillExpandListener </item>
++      <item> TrustAnchor </item>
++      <item> TrustManager </item>
++      <item> TrustManagerFactory </item>
++      <item> TrustManagerFactorySpi </item>
++      <item> Type </item>
++      <item> TypeCode </item>
++      <item> TypeCodeHolder </item>
++      <item> TypeInfo </item>
++      <item> TypeInfoProvider </item>
++      <item> TypeMismatch </item>
++      <item> TypeMismatch </item>
++      <item> TypeMismatch </item>
++      <item> TypeMismatchHelper </item>
++      <item> TypeMismatchHelper </item>
++      <item> TypeNotPresentException </item>
++      <item> TypeVariable </item>
++      <item> Types </item>
++      <item> UID </item>
++      <item> UIDefaults </item>
++      <item> UIDefaults.ActiveValue </item>
++      <item> UIDefaults.LazyInputMap </item>
++      <item> UIDefaults.LazyValue </item>
++      <item> UIDefaults.ProxyLazyValue </item>
++      <item> UIManager </item>
++      <item> UIManager.LookAndFeelInfo </item>
++      <item> UIResource </item>
++      <item> ULongLongSeqHelper </item>
++      <item> ULongLongSeqHolder </item>
++      <item> ULongSeqHelper </item>
++      <item> ULongSeqHolder </item>
++      <item> UNKNOWN </item>
++      <item> UNKNOWN </item>
++      <item> UNSUPPORTED_POLICY </item>
++      <item> UNSUPPORTED_POLICY_VALUE </item>
++      <item> URI </item>
++      <item> URIException </item>
++      <item> URIResolver </item>
++      <item> URISyntax </item>
++      <item> URISyntaxException </item>
++      <item> URL </item>
++      <item> URLClassLoader </item>
++      <item> URLConnection </item>
++      <item> URLDecoder </item>
++      <item> URLEncoder </item>
++      <item> URLStreamHandler </item>
++      <item> URLStreamHandlerFactory </item>
++      <item> URLStringHelper </item>
++      <item> USER_EXCEPTION </item>
++      <item> UShortSeqHelper </item>
++      <item> UShortSeqHolder </item>
++      <item> UTFDataFormatException </item>
++      <item> UUID </item>
++      <item> UndeclaredThrowableException </item>
++      <item> UndoManager </item>
++      <item> UndoableEdit </item>
++      <item> UndoableEditEvent </item>
++      <item> UndoableEditListener </item>
++      <item> UndoableEditSupport </item>
++      <item> UnexpectedException </item>
++      <item> UnicastRemoteObject </item>
++      <item> UnionMember </item>
++      <item> UnionMemberHelper </item>
++      <item> UnknownEncoding </item>
++      <item> UnknownEncodingHelper </item>
++      <item> UnknownError </item>
++      <item> UnknownException </item>
++      <item> UnknownFormatConversionException </item>
++      <item> UnknownFormatFlagsException </item>
++      <item> UnknownGroupException </item>
++      <item> UnknownHostException </item>
++      <item> UnknownHostException </item>
++      <item> UnknownObjectException </item>
++      <item> UnknownServiceException </item>
++      <item> UnknownUserException </item>
++      <item> UnknownUserExceptionHelper </item>
++      <item> UnknownUserExceptionHolder </item>
++      <item> UnmappableCharacterException </item>
++      <item> UnmarshalException </item>
++      <item> UnmodifiableClassException </item>
++      <item> UnmodifiableSetException </item>
++      <item> UnrecoverableEntryException </item>
++      <item> UnrecoverableKeyException </item>
++      <item> Unreferenced </item>
++      <item> UnresolvedAddressException </item>
++      <item> UnresolvedPermission </item>
++      <item> UnsatisfiedLinkError </item>
++      <item> UnsolicitedNotification </item>
++      <item> UnsolicitedNotificationEvent </item>
++      <item> UnsolicitedNotificationListener </item>
++      <item> UnsupportedAddressTypeException </item>
++      <item> UnsupportedAudioFileException </item>
++      <item> UnsupportedCallbackException </item>
++      <item> UnsupportedCharsetException </item>
++      <item> UnsupportedClassVersionError </item>
++      <item> UnsupportedEncodingException </item>
++      <item> UnsupportedFlavorException </item>
++      <item> UnsupportedLookAndFeelException </item>
++      <item> UnsupportedOperationException </item>
++      <item> UserDataHandler </item>
++      <item> UserException </item>
++      <item> Util </item>
++      <item> UtilDelegate </item>
++      <item> Utilities </item>
++      <item> VMID </item>
++      <item> VM_ABSTRACT </item>
++      <item> VM_CUSTOM </item>
++      <item> VM_NONE </item>
++      <item> VM_TRUNCATABLE </item>
++      <item> Validator </item>
++      <item> ValidatorHandler </item>
++      <item> ValueBase </item>
++      <item> ValueBaseHelper </item>
++      <item> ValueBaseHolder </item>
++      <item> ValueExp </item>
++      <item> ValueFactory </item>
++      <item> ValueHandler </item>
++      <item> ValueHandlerMultiFormat </item>
++      <item> ValueInputStream </item>
++      <item> ValueMember </item>
++      <item> ValueMemberHelper </item>
++      <item> ValueOutputStream </item>
++      <item> VariableHeightLayoutCache </item>
++      <item> Vector </item>
++      <item> VerifyError </item>
++      <item> VersionSpecHelper </item>
++      <item> VetoableChangeListener </item>
++      <item> VetoableChangeListenerProxy </item>
++      <item> VetoableChangeSupport </item>
++      <item> View </item>
++      <item> ViewFactory </item>
++      <item> ViewportLayout </item>
++      <item> ViewportUI </item>
++      <item> VirtualMachineError </item>
++      <item> Visibility </item>
++      <item> VisibilityHelper </item>
++      <item> VoiceStatus </item>
++      <item> Void </item>
++      <item> VolatileImage </item>
++      <item> WCharSeqHelper </item>
++      <item> WCharSeqHolder </item>
++      <item> WStringSeqHelper </item>
++      <item> WStringSeqHolder </item>
++      <item> WStringValueHelper </item>
++      <item> WeakHashMap </item>
++      <item> WeakReference </item>
++      <item> WebRowSet </item>
++      <item> WildcardType </item>
++      <item> Window </item>
++      <item> WindowAdapter </item>
++      <item> WindowConstants </item>
++      <item> WindowEvent </item>
++      <item> WindowFocusListener </item>
++      <item> WindowListener </item>
++      <item> WindowStateListener </item>
++      <item> WrappedPlainView </item>
++      <item> WritableByteChannel </item>
++      <item> WritableRaster </item>
++      <item> WritableRenderedImage </item>
++      <item> WriteAbortedException </item>
++      <item> Writer </item>
++      <item> WrongAdapter </item>
++      <item> WrongAdapterHelper </item>
++      <item> WrongPolicy </item>
++      <item> WrongPolicyHelper </item>
++      <item> WrongTransaction </item>
++      <item> WrongTransactionHelper </item>
++      <item> WrongTransactionHolder </item>
++      <item> X500Principal </item>
++      <item> X500PrivateCredential </item>
++      <item> X509CRL </item>
++      <item> X509CRLEntry </item>
++      <item> X509CRLSelector </item>
++      <item> X509CertSelector </item>
++      <item> X509Certificate </item>
++      <item> X509Certificate </item>
++      <item> X509EncodedKeySpec </item>
++      <item> X509ExtendedKeyManager </item>
++      <item> X509Extension </item>
++      <item> X509KeyManager </item>
++      <item> X509TrustManager </item>
++      <item> XAConnection </item>
++      <item> XADataSource </item>
++      <item> XAException </item>
++      <item> XAResource </item>
++      <item> XMLConstants </item>
++      <item> XMLDecoder </item>
++      <item> XMLEncoder </item>
++      <item> XMLFilter </item>
++      <item> XMLFilterImpl </item>
++      <item> XMLFormatter </item>
++      <item> XMLGregorianCalendar </item>
++      <item> XMLParseException </item>
++      <item> XMLReader </item>
++      <item> XMLReaderAdapter </item>
++      <item> XMLReaderFactory </item>
++      <item> XPath </item>
++      <item> XPathConstants </item>
++      <item> XPathException </item>
++      <item> XPathExpression </item>
++      <item> XPathExpressionException </item>
++      <item> XPathFactory </item>
++      <item> XPathFactoryConfigurationException </item>
++      <item> XPathFunction </item>
++      <item> XPathFunctionException </item>
++      <item> XPathFunctionResolver </item>
++      <item> XPathVariableResolver </item>
++      <item> Xid </item>
++      <item> XmlReader </item>
++      <item> XmlWriter </item>
++      <item> ZipEntry </item>
++      <item> ZipException </item>
++      <item> ZipFile </item>
++      <item> ZipInputStream </item>
++      <item> ZipOutputStream </item>
++      <item> ZoneView </item>
++      <item> _BindingIteratorImplBase </item>
++      <item> _BindingIteratorStub </item>
++      <item> _DynAnyFactoryStub </item>
++      <item> _DynAnyStub </item>
++      <item> _DynArrayStub </item>
++      <item> _DynEnumStub </item>
++      <item> _DynFixedStub </item>
++      <item> _DynSequenceStub </item>
++      <item> _DynStructStub </item>
++      <item> _DynUnionStub </item>
++      <item> _DynValueStub </item>
++      <item> _IDLTypeStub </item>
++      <item> _NamingContextExtStub </item>
++      <item> _NamingContextImplBase </item>
++      <item> _NamingContextStub </item>
++      <item> _PolicyStub </item>
++      <item> _Remote_Stub </item>
++      <item> _ServantActivatorStub </item>
++      <item> _ServantLocatorStub </item>
++    </list>
++    <list name="keywords">
++      <item> abstract </item>
++      <item> case </item>
++      <item> catch </item>
++      <item> class </item>
++      <item> def </item>
++      <item> do </item>
++      <item> else </item>
++      <item> extends </item>
++      <item> false </item>
++      <item> final </item>
++      <item> finally </item>
++      <item> for </item>
++      <item> forSome </item>
++      <item> if </item>
++      <item> implicit </item>
++      <item> import </item>
++      <item> lazy </item>
++      <item> match </item>
++      <item> new </item>
++      <item> null </item>
++      <item> object </item>
++      <item> override </item>
++      <item> package </item>
++      <item> private </item>
++      <item> protected </item>
++      <item> requires </item>
++      <item> return </item>
++      <item> sealed </item>
++      <item> super </item>
++      <item> this </item>
++      <item> throw </item>
++      <item> trait </item>
++      <item> true </item>
++      <item> try </item>
++      <item> type </item>
++      <item> val </item>
++      <item> var </item>
++      <item> while </item>
++      <item> with </item>
++      <item> yield </item>
++    </list>
++    <list name="types">
++      <item> boolean </item>
++      <item> byte </item>
++      <item> char </item>
++      <item> double </item>
++      <item> float </item>
++      <item> int </item>
++      <item> long </item>
++      <item> short </item>
++      <item> unit </item>
++    </list>
++    <contexts>
++      <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
++        <!-- Comment next line if you don't use Javadoc tool -->
++        <IncludeRules context="##Javadoc"/>
++        <keyword attribute="Keyword" context="#stay" String="keywords"/>
++        <keyword attribute="Data Type" context="#stay" String="types"/>
++        <keyword attribute="Java15" context="#stay" String="java15"/>
++        <keyword attribute="Scala2" context="#stay" String="scala2"/>
++        <Float attribute="Float" context="#stay">
++          <AnyChar String="fF" attribute="Float" context="#stay"/>
++        </Float>
++        <HlCOct attribute="Octal" context="#stay"/>
++        <HlCHex attribute="Hex" context="#stay"/>
++        <Int attribute="Decimal" context="#stay">
++          <StringDetect attribute="Decimal" context="#stay" String="ULL" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="LUL" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="LLU" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="UL" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="LU" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="LL" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="U" insensitive="TRUE"/>
++          <StringDetect attribute="Decimal" context="#stay" String="L" insensitive="TRUE"/>
++        </Int>
++        <HlCChar attribute="Char" context="#stay"/>
++        <RegExpr attribute="Decimal" context="#stay" String="//\s*BEGIN.*$" beginRegion="Region1"/>
++        <RegExpr attribute="Decimal" context="#stay" String="//\s*END.*$" endRegion="Region1"/>
++        <DetectChar attribute="String" context="String" char="&quot;"/>
++        <RegExpr attribute="Function" context="Printf" String="\.(format|printf)\b" />
++        <Detect2Chars attribute="Comment" context="Commentar 1" char="/" char1="/"/>
++        <Detect2Chars attribute="Comment" context="Commentar 2" char="/" char1="*" beginRegion="Comment"/>
++        <DetectChar attribute="Symbol" context="#stay" char="{" beginRegion="Brace1"/>
++        <DetectChar attribute="Symbol" context="#stay" char="}" endRegion="Brace1"/>
++<!--
++        <RegExpr attribute="Keyword" context="#stay" String="\.{3,3}\s+" />
++        <RegExpr attribute="Keyword" context="StaticImports" String="\b(import\s+static)\b" />
++        <RegExpr attribute="Keyword" context="Imports" String="\b(package|import)\b" />
++-->
++        <RegExpr attribute="Function" context="#stay" String="\b[_\w][_\w\d]*(?=[\s]*(/\*\s*\d+\s*\*/\s*)?[(])" />
++        <RegExpr attribute="Symbol" context="Member" String="[.]{1,1}" />
++        <AnyChar attribute="Symbol" context="#stay" String=":!%&amp;()+,-/.*&lt;=&gt;?[]|~^&#59;"/>
++      </context>
++      <context attribute="String" lineEndContext="#pop" name="String">
++        <LineContinue attribute="String" context="#stay"/>
++        <HlCStringChar attribute="String Char" context="#stay"/>
++        <DetectChar attribute="String" context="#pop" char="&quot;"/>
++      </context>
++      <context attribute="Printf" lineEndContext="#pop" name="Printf">
++        <DetectChar attribute="Normal Text" context="#pop" char="&#059;" />
++        <DetectChar attribute="String" context="PrintfString" char="&quot;"/>
++      </context>
++      <context attribute="PrintfString" lineEndContext="#pop" name="PrintfString">
++        <LineContinue attribute="String" context="#stay"/>
++        <HlCStringChar attribute="String Char" context="#stay"/>
++        <DetectChar attribute="String" context="#pop" char="&quot;"/>
++        <RegExpr attribute="String Char" context="#stay" String="%(\d+\$)?(-|#|\+|\ |0|,|\()*\d*(\.\d+)?[a-hosxA-CEGHSX]" />
++        <RegExpr attribute="String Char" context="#stay" String="%(\d+\$)?(-|#|\+|\ |0|,|\()*\d*(t|T)(a|A|b|B|c|C|d|D|e|F|h|H|I|j|k|l|L|m|M|N|p|P|Q|r|R|s|S|T|y|Y|z|Z)" />
++        <RegExpr attribute="String Char" context="#stay" String="%(%|n)" />
++      </context>
++      <context attribute="Normal Text" lineEndContext="#pop" name="Member" fallthrough="true" fallthroughContext="#pop">
++        <RegExpr attribute="Function" context="#pop" String="\b[_a-zA-Z]\w*(?=[\s]*)" />
++      </context>
++<!--
++      <context attribute="Normal Text" lineEndContext="#pop" name="StaticImports">
++        <RegExpr attribute="StaticImports" context="#pop" String="\s*.*$" />
++      </context>
++      <context attribute="Normal Text" lineEndContext="#pop" name="Imports">
++        <RegExpr attribute="Imports" context="#pop" String="\s*.*$" />
++      </context>
++-->
++      <context attribute="Comment" lineEndContext="#pop" name="Commentar 1"/>
++      <context attribute="Comment" lineEndContext="#stay" name="Commentar 2">
++        <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment"/>
++      </context>
++    </contexts>
++    <itemDatas>
++      <itemData name="Normal Text"  defStyleNum="dsNormal"/>
++      <itemData name="Keyword"      defStyleNum="dsKeyword"/>
++      <itemData name="Function"     defStyleNum="dsFunction"/>
++      <itemData name="StaticImports"      defStyleNum="dsKeyword" color="#800080" selColor="#FFFFFF" bold="0" italic="0"/>
++      <itemData name="Imports"      defStyleNum="dsKeyword" color="#808000" selColor="#FFFFFF" bold="0" italic="0"/>
++      <itemData name="Data Type"    defStyleNum="dsDataType"/>
++      <itemData name="Decimal"      defStyleNum="dsDecVal"/>
++      <itemData name="Octal"        defStyleNum="dsBaseN"/>
++      <itemData name="Hex"          defStyleNum="dsBaseN"/>
++      <itemData name="Float"        defStyleNum="dsFloat"/>
++      <itemData name="Char"         defStyleNum="dsChar"/>
++      <itemData name="String"       defStyleNum="dsString"/>
++      <itemData name="String Char"  defStyleNum="dsChar"/>
++      <itemData name="PrintfString" defStyleNum="dsString"/>
++      <itemData name="Comment"      defStyleNum="dsComment"/>
++      <itemData name="Symbol"       defStyleNum="dsNormal"/>
++      <itemData name="Scala2"       defStyleNum="dsNormal" color="#0095FF" selColor="#FFFFFF" bold="1" italic="0"/>
++      <itemData name="Java15"       defStyleNum="dsNormal" color="#0095FF" selColor="#FFFFFF" bold="1" italic="0"/>
++    </itemDatas>
++  </highlighting>
++  <general>
++    <comments>
++      <comment name="singleLine" start="//"/>
++      <comment name="multiLine" start="/*" end="*/"/>
++    </comments>
++    <keywords casesensitive="1"/>
++  </general>
++</language>
+--- a/kate/syntax/data/roff.xml
++++ b/kate/syntax/data/roff.xml
+@@ -7,7 +7,7 @@
+   <!ENTITY argsep1 "([^\\]|\\[&#37; |^{}'`-_!?@)/,&amp;:~0acdeEprtu])">
+   <!ENTITY argsep2 "([^\\0-9]|\\[&#37;:{}'`-_!@/cep])">
+ ]>
+-<language name="Roff" section="Markup" version="0.11" kateversion="2.9" author="Matthew Woehlke (mw_triad at users.sourceforge.net)" license="GPL">
++<language name="Roff" section="Markup" version="0.11" kateversion="2.9" extensions="" author="Matthew Woehlke (mw_triad at users.sourceforge.net)" license="GPL">
+ 
+   <highlighting>
+ 
+--- a/kate/syntax/data/vhdl.xml
++++ b/kate/syntax/data/vhdl.xml
+@@ -1,286 +1,323 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+-<!DOCTYPE language SYSTEM "language.dtd">
+-<language name="VHDL" version="1.04" kateversion="2.1" section="Hardware" extensions="*.vhdl;*.vhd" mimetype="text/x-vhdl">
+-    <highlighting>
+-        <list name="keywords">
+-            <item> access </item>
+-            <item> after </item>
+-            <item> alias </item>
+-            <item> all </item>
+-            <item> assert </item>
+-            <item> architecture </item>
+-            <item> begin </item>
+-            <item> block </item>
+-            <item> body </item>
+-            <item> buffer </item>
+-            <item> bus </item>
+-            <item> case </item>
+-            <item> component </item>
+-            <item> configuration </item>
+-            <item> constant </item>
+-            <item> disconnect </item>
+-            <item> downto </item>
+-            <item> else </item>
+-            <item> elsif </item>
+-            <item> end </item>
+-            <item> entity </item>
+-            <item> exit </item>
+-            <item> file </item>
+-            <item> for </item>
+-            <item> function </item>
+-            <item> generate </item>
+-            <item> generic </item>
+-            <item> group </item>
+-            <item> guarded </item>
+-            <item> if </item>
+-            <item> impure </item>
+-            <item> in </item>
+-            <item> inertial </item>
+-            <item> inout </item>
+-            <item> is </item>
+-            <item> label </item>
+-            <item> library </item>
+-            <item> linkage </item>
+-            <item> literal </item>
+-            <item> loop </item>
+-            <item> map </item>
+-            <item> new </item>
+-            <item> next </item>
+-            <item> null </item>
+-            <item> of </item>
+-            <item> on </item>
+-            <item> open </item>
+-            <item> others </item>
+-            <item> out </item>
+-            <item> package </item>
+-            <item> port </item>
+-            <item> postponed </item>
+-            <item> procedure </item>
+-            <item> process </item>
+-            <item> pure </item>
+-            <item> range </item>
+-            <item> record </item>
+-            <item> register </item>
+-            <item> reject </item>
+-            <item> report </item>
+-            <item> return </item>
+-            <item> select </item>
+-            <item> severity </item>
+-            <item> signal </item>
+-            <item> shared </item>
+-            <item> subtype </item>
+-            <item> then </item>
+-            <item> to </item>
+-            <item> transport </item>
+-            <item> type </item>
+-            <item> unaffected </item>
+-            <item> units </item>
+-            <item> until </item>
+-            <item> use </item>
+-            <item> variable </item>
+-            <item> wait </item>
+-            <item> when </item>
+-            <item> while </item>
+-            <item> with </item>
+-            <item> note </item>
+-            <item> warning </item>
+-            <item> error </item>
+-            <item> failure </item>
+-            <item> ACCESS </item>
+-            <item> AFTER </item>
+-            <item> ALIAS </item>
+-            <item> ALL </item>
+-            <item> ASSERT </item>
+-            <item> ARCHITECTURE </item>
+-            <item> BEGIN </item>
+-            <item> BLOCK </item>
+-            <item> BODY </item>
+-            <item> BUFFER </item>
+-            <item> BUS </item>
+-            <item> CASE </item>
+-            <item> COMPONENT </item>
+-            <item> CONFIGURATION </item>
+-            <item> CONSTANT </item>
+-            <item> DISCONNECT </item>
+-            <item> DOWNTO </item>
+-            <item> ELSE </item>
+-            <item> ELSIF </item>
+-            <item> END </item>
+-            <item> ENTITY </item>
+-            <item> EXIT </item>
+-            <item> FILE </item>
+-            <item> FOR </item>
+-            <item> FUNCTION </item>
+-            <item> GENERATE </item>
+-            <item> GENERIC </item>
+-            <item> GROUP </item>
+-            <item> GUARDED </item>
+-            <item> IF </item>
+-            <item> IMPURE </item>
+-            <item> IN </item>
+-            <item> INERTIAL </item>
+-            <item> INOUT </item>
+-            <item> IS </item>
+-            <item> LABEL </item>
+-            <item> LIBRARY </item>
+-            <item> LINKAGE </item>
+-            <item> LITERAL </item>
+-            <item> LOOP </item>
+-            <item> MAP </item>
+-            <item> NEW </item>
+-            <item> NEXT </item>
+-            <item> NULL </item>
+-            <item> OF </item>
+-            <item> ON </item>
+-            <item> OPEN </item>
+-            <item> OTHERS </item>
+-            <item> OUT </item>
+-            <item> PACKAGE </item>
+-            <item> PORT </item>
+-            <item> POSTPONED </item>
+-            <item> PROCEDURE </item>
+-            <item> PROCESS </item>
+-            <item> PURE </item>
+-            <item> RANGE </item>
+-            <item> RECORD </item>
+-            <item> REGISTER </item>
+-            <item> REJECT </item>
+-            <item> REPORT </item>
+-            <item> RETURN </item>
+-            <item> SELECT </item>
+-            <item> SEVERITY </item>
+-            <item> SIGNAL </item>
+-            <item> SHARED </item>
+-            <item> SUBTYPE </item>
+-            <item> THEN </item>
+-            <item> TO </item>
+-            <item> TRANSPORT </item>
+-            <item> TYPE </item>
+-            <item> UNAFFECTED </item>
+-            <item> UNITS </item>
+-            <item> UNTIL </item>
+-            <item> USE </item>
+-            <item> VARIABLE </item>
+-            <item> WAIT </item>
+-            <item> WHEN </item>
+-            <item> WHILE </item>
+-            <item> WITH </item>
+-            <item> NOTE </item>
+-            <item> WARNING </item>
+-            <item> ERROR </item>
+-            <item> FAILURE </item>
+-            <item> and </item>
+-            <item> or </item>
+-            <item> xor </item>
+-            <item> not </item>
+-            <item> AND </item>
+-            <item> OR </item>
+-            <item> XOR </item>
+-            <item> NOT </item>
+-         </list>
+-        <list name="types">
+-            <item> bit </item>
+-            <item> bit_vector </item>
+-            <item> character </item>
+-            <item> boolean </item>
+-            <item> integer </item>
+-            <item> real </item>
+-            <item> time </item>
+-            <item> string </item>
+-            <item> severity_level </item>
+-            <item> positive </item>
+-            <item> natural </item>
+-            <item> signed </item>
+-            <item> unsigned </item>
+-            <item> line </item>
+-            <item> text </item>
+-            <item> std_logic </item>
+-            <item> std_logic_vector </item>
+-            <item> std_ulogic </item>
+-            <item> std_ulogic_vector </item>
+-            <item> qsim_state </item>
+-            <item> qsim_state_vector </item>
+-            <item> qsim_12state </item>
+-            <item> qsim_12state_vector </item>
+-            <item> qsim_strength </item>
+-            <item> mux_bit </item>
+-            <item> mux_vector </item>
+-            <item> reg_bit </item>
+-            <item> reg_vector </item>
+-            <item> wor_bit </item>
+-            <item> wor_vector </item>
+-            <item> BIT </item>
+-            <item> BIT_VECTOR </item>
+-            <item> CHARACTER </item>
+-            <item> BOOLEAN </item>
+-            <item> INTEGER </item>
+-            <item> REAL </item>
+-            <item> TIME </item>
+-            <item> STRING </item>
+-            <item> SEVERITY_LEVEL </item>
+-            <item> POSITIVE </item>
+-            <item> NATURAL </item>
+-            <item> SIGNED </item>
+-            <item> UNSIGNED </item>
+-            <item> LINE </item>
+-            <item> TEXT </item>
+-            <item> STD_LOGIC </item>
+-            <item> STD_LOGIC_VECTOR </item>
+-            <item> STD_ULOGIC </item>
+-            <item> STD_ULOGIC_VECTOR </item>
+-            <item> QSIM_STATE </item>
+-            <item> QSIM_STATE_VECTOR </item>
+-            <item> QSIM_12STATE </item>
+-            <item> QSIM_12STATE_VECTOR </item>
+-            <item> QSIM_STRENGTH </item>
+-            <item> MUX_BIT </item>
+-            <item> MUX_VECTOR </item>
+-            <item> REG_BIT </item>
+-            <item> REG_VECTOR </item>
+-            <item> WOR_BIT </item>
+-            <item> WOR_VECTOR </item>
+-        </list>
+-        <contexts>
+-            <context name="normal" attribute="Normal Text" lineEndContext="#stay">
+-                <keyword attribute="Keyword" context="#stay"  String="keywords"/>
+-                <keyword attribute="Data Type" context="#stay"  String="types"/>
+-                <Detect2Chars attribute="Comment" context="comment" char="-" char1="-" />
+-                <Int attribute="Integer" context="#stay" />
+-                <HlCChar attribute="Bit" context="#stay" />
+-                <DetectChar attribute="Vector" context="string" char="&quot;" />
+-                <AnyChar attribute="Operator" context="#stay" String="[&amp;&gt;&lt;=:+\-*\/|]().,;" />
+-                <DetectChar attribute="Attribute" context="attribute" char="'" />
+-             </context>
+-            <context name="comment" attribute="Comment" lineEndContext="#pop" />
+-            <context name="string" attribute="Vector" lineEndContext="#stay" >
+-                <DetectChar attribute="Vector" context="#pop" char="&quot;" />
+-            </context>
+-            <context name="attribute" attribute="Attribute" lineEndContext="#pop">
+-                <DetectChar attribute="Attribute" context="quot in att" char="&quot;" />
+-                <DetectChar attribute="Normal Text" context="#pop" char=" " />
+-                <AnyChar attribute="Attribute" context="#pop" String=")=&lt;&gt;" />
+-            </context>
+-            <context name="quot in att" attribute="Attribute" lineEndContext="#stay">
+-                <DetectChar attribute="Attribute" context="#pop" char="&quot;" />
+-            </context>
+-        </contexts>
+-        <itemDatas>
+-            <itemData name="Normal Text" defStyleNum="dsNormal" />
+-            <itemData name="Keyword" defStyleNum="dsKeyword" />
+-            <itemData name="Data Type" defStyleNum="dsDataType" />
+-            <itemData name="Comment" defStyleNum="dsComment" />
+-            <itemData name="Integer" defStyleNum="dsDecVal" />
+-            <itemData name="Bit" defStyleNum="dsChar" />
+-            <itemData name="Vector" defStyleNum="dsString" />
+-            <itemData name="Operator" defStyleNum="dsOthers" />
+-            <itemData name="Attribute" defStyleNum="dsBaseN" />
+-        </itemDatas>
+-    </highlighting>
++<!DOCTYPE language SYSTEM "language.dtd"
++[
++  <!ENTITY funcname "[A-Za-z_:][A-Za-z0-9_:#&#37;@-]*">
++  <!ENTITY varname  "[A-Za-z_][A-Za-z0-9_]*">
++  <!ENTITY bos      "(|[^&quot;-]*)\b">			<!-- bol or space following -->
++<!--  <!ENTITY bos      "^(|.*\s)">-->			<!-- bol or space following -->
++  <!ENTITY eos      "\b">		<!-- eol or space following -->
++<!--  <!ENTITY eos      "(?=($|\s))">-->		<!-- eol or space following -->
++  <!ENTITY noword   "(?![\w$+-])">		<!-- no word, $, + or - following -->
++]>
++<language name="VHDL" version="1.07" kateversion="2.3" section="Hardware" extensions="*.vhdl;*.vhd" mimetype="text/x-vhdl" author="Rocky Scaletta (rocky at purdue.edu), Stefan Endrullis (stefan at endrullis.de)">
++  <highlighting>
++    <list name="keywordsToplevel">
++      <item> file </item>
++      <item> package </item>
++      <item> library </item>
++      <item> use </item>
++<!--
++      <item> entity </item>
++      <item> architecture </item>
++      <item> of </item>
++      <item> configuration </item>
++-->
++    </list>
++    <list name="keywords">
++      <item> access </item>
++      <item> after </item>
++      <item> alias </item>
++      <item> all </item>
++      <item> assert </item>
++      <item> begin </item>
++      <item> block </item>
++      <item> body </item>
++      <item> bus </item>
++      <item> component </item>
++      <item> constant </item>
++      <item> disconnect </item>
++      <item> downto </item>
++      <item> end </item>
++      <item> exit </item>
++      <item> function </item>
++      <item> generate </item>
++      <item> generic </item>
++      <item> group </item>
++      <item> guarded </item>
++      <item> impure </item>
++      <item> inertial </item>
++      <item> is </item>
++      <item> label </item>
++      <item> linkage </item>
++      <item> literal </item>
++      <item> map </item>
++      <item> new </item>
++      <item> next </item>
++      <item> null </item>
++      <item> on </item>
++      <item> open </item>
++      <item> others </item>
++      <item> port </item>
++      <item> postponed </item>
++      <item> procedure </item>
++      <item> process </item>
++      <item> pure </item>
++      <item> range </item>
++      <item> record </item>
++      <item> register </item>
++      <item> reject </item>
++      <item> report </item>
++      <item> return </item>
++      <item> select </item>
++      <item> severity </item>
++      <item> signal </item>
++      <item> shared </item>
++      <item> subtype </item>
++      <item> then </item>
++      <item> to </item>
++      <item> transport </item>
++      <item> type </item>
++      <item> unaffected </item>
++      <item> units </item>
++      <item> until </item>
++      <item> variable </item>
++      <item> wait </item>
++      <item> when </item>
++      <item> with </item>
++      <item> note </item>
++      <item> warning </item>
++      <item> error </item>
++      <item> failure </item>
++      <item> in </item>
++      <item> inout </item>
++      <item> out </item>
++      <item> buffer </item>
++      <item> and </item>
++      <item> or </item>
++      <item> xor </item>
++      <item> not </item>
++    </list>
++    
++    <list name="if">
++      <item> else </item>
++      <item> elsif </item>
++    </list>
++    
++    <list name="forOrWhile">
++      <item> loop </item>
++    </list>
++      
++<!--    <list name="directions">
++      <item> in </item>
++      <item> inout </item>
++      <item> out </item>
++      <item> buffer </item>
++      
++    </list>
++    <list name="logics">
++      <item> and </item>
++      <item> or </item>
++      <item> xor </item>
++      <item> not </item>
++    </list>
++    
++    <list name="rangeDirection">
++      <item> to </item>
++      <item> downto </item>
++    </list>-->
++    
++    <list name="types">
++      <item> bit </item>
++      <item> bit_vector </item>
++      <item> character </item>
++      <item> boolean </item>
++      <item> integer </item>
++      <item> real </item>
++      <item> time </item>
++      <item> string </item>
++      <item> severity_level </item>
++      <item> positive </item>
++      <item> natural </item>
++      <item> signed </item>
++      <item> unsigned </item>
++      <item> line </item>
++      <item> text </item>
++      <item> std_logic </item>
++      <item> std_logic_vector </item>
++      <item> std_ulogic </item>
++      <item> std_ulogic_vector </item>
++      <item> qsim_state </item>
++      <item> qsim_state_vector </item>
++      <item> qsim_12state </item>
++      <item> qsim_12state_vector </item>
++      <item> qsim_strength </item>
++      <item> mux_bit </item>
++      <item> mux_vector </item>
++      <item> reg_bit </item>
++      <item> reg_vector </item>
++      <item> wor_bit </item>
++      <item> wor_vector </item>
++    </list>
++    <contexts>
++      <!-- start / global environment -->
++      <context name="start" attribute="Normal Text" lineEndContext="#stay">
++        <RegExpr attribute="Normal Text" context="entity" String="&bos;(entity\s*(&varname;)\s*is)&eos;" beginRegion="EntityRegion1" lookAhead="true" />
++        <RegExpr attribute="Normal Text" context="architecture" String="&bos;(architecture\s*(&varname;)\s*of\s*&varname;\s*is)&eos;" beginRegion="ArchitectureRegion1" lookAhead="true" />
++        <Detect2Chars attribute="Comment" context="comment" char="-" char1="-" />
++        <keyword attribute="Keyword" context="#stay"  String="keywordsToplevel"/>
++      </context>
++      
++      <context name="preDetection" attribute="Normal Text" lineEndContext="#stay">
++        <Detect2Chars attribute="Comment" context="comment" char="-" char1="-" />
++        <DetectChar attribute="Vector" context="string" char="&quot;" />
++        <AnyChar attribute="Operator" context="#stay" String="[&amp;&gt;&lt;=:+\-*\/|]().,;" />
++        <DetectChar attribute="Attribute" context="attribute" char="'" />
++      </context>
++      
++      <!-- general keywords detection -->
++      <context name="generalDetection" attribute="Normal Text" lineEndContext="#stay">
++        <keyword attribute="Keyword" context="#stay"  String="keywords"/>
++        <keyword attribute="Data Type" context="#stay"  String="types"/>
++        <Int attribute="Integer" context="#stay" />
++        <HlCChar attribute="Bit" context="#stay" />
++      </context>
++      
++      <!-- entity environment -->
++      <context name="entity" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Redirection" context="#stay" String="%2" dynamic="true" />
++        <IncludeRules context="preDetection" />
++        <RegExpr attribute="Redirection" context="#pop" String="^(|\s.*)end(\s*entity)?\s*(%3)?\s*;" dynamic="true" endRegion="EntityRegion1" />
++        <!--<RegExpr attribute="Alert" context="generic" String="generic"/>-->
++        <IncludeRules context="generalDetection" />
++      </context>
++<!--      <context name="generic" attribute="Normal Text" lineEndContext="#stay">
++        <DetectChar attribute="Operator" context="range" char="("/>
++        <Detect2Chars attribute="Alert" context="#pop" char=")" char1=";"/>
++      </context>
++      <context name="range" attribute="Normal Text" lineEndContext="#stay">
++        <keyword attribute="Keyword" context="#stay"  String="rangeDirection"/>
++        <Int attribute="Integer" context="#stay" />
++        <HlCChar attribute="Bit" context="#stay" />
++        <DetectChar attribute="Vector" context="string" char="&quot;" />
++        <DetectChar attribute="Operator" context="#pop" char=")"/>
++      </context>-->
++      
++      <!-- architecture environment -->
++      <context name="architecture" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Redirection" context="#stay" String="%2" dynamic="true" />
++        <IncludeRules context="preDetection" />
++        <StringDetect attribute="Redirection" context="#stay" String="begin" />
++        <RegExpr attribute="Redirection" context="#pop" String="&bos;end(\s+architecture)?(\s+%3)?\s*;" dynamic="true" endRegion="ArchitectureRegion1" />
++        <RegExpr attribute="Normal Text" context="component" String="&bos;(component\s+(&varname;)\s+is)&eos;" beginRegion="ComponentRegion1" lookAhead="true" />
++        <RegExpr attribute="Normal Text" context="process1" String="^(|\s+)((&varname;\s*:\s*)?process)&eos;" beginRegion="ProcessRegion1" lookAhead="true" />
++        <RegExpr attribute="Normal Text" context="instance" String="^(|\s+)((&varname;)\s*:\s*(&varname;))&eos;" beginRegion="InstanceRegion1" lookAhead="true" />
++        <IncludeRules context="generalDetection" />
++      </context>
++<!--      <context name="architectureBeforeBegin" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Redirection" context="#stay" String="%1" dynamic="true" />
++        <RegExpr attribute="Redirection" context="#pop" String="end\s*%2\s*;" dynamic="true" endRegion="ArchitectureRegion1" />
++        <StringDetect attribute="Redirection" context="architectureAfterBegin" String="begin" />
++        <RegExpr attribute="Redirection" context="#pop#pop" String="end\s*%2\s*;" dynamic="true" endRegion="ArchitectureRegion1" />
++        <IncludeRules context="normal" />
++      </context>
++      <context name="architectureAfterBegin" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Redirection" context="#stay" String="%1" dynamic="true" />
++        <IncludeRules context="normal" />
++      </context>-->
++      
++      <!-- component environment -->
++      <context name="component" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Redirection" context="#stay" String="%2" dynamic="true" />
++        <IncludeRules context="preDetection" />
++        <RegExpr attribute="Redirection" context="#pop" String="&bos;end\s+component\s*;" dynamic="true" endRegion="ComponentRegion1" />
++        <IncludeRules context="generalDetection" />
++      </context>
++      
++      <context name="instance" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Redirection" context="#stay" String="%2" dynamic="true" />
++        <Detect2Chars attribute="Comment" context="comment" char="-" char1="-" />
++        <DetectChar attribute="Vector" context="string" char="&quot;" />
++<!--        <RegExpr attribute="Process" context="#pop" String="\);" endRegion="InstanceRegion1" />-->
++        <Detect2Chars attribute="Normal Text" context="#pop" char=")" char1=";" endRegion="InstanceRegion1" />
++        <IncludeRules context="generalDetection" />
++        <AnyChar attribute="Operator" context="#stay" String="[&amp;&gt;&lt;=:+\-*\/|]().,;" />
++        <DetectChar attribute="Attribute" context="attribute" char="'" />
++      </context>
++      
++      <!-- process environment -->
++      <context name="process1" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <StringDetect attribute="Process" context="process2" String="%2" dynamic="true" />
++      </context>
++      <context name="process2" attribute="Normal Text" lineEndContext="#stay" dynamic="true">
++        <RegExpr attribute="Process" context="#pop#pop" String="&bos;end\s+process" endRegion="ProcessRegion1" />
++        <StringDetect attribute="Process" context="#stay" String="begin" />
++        <IncludeRules context="processContext" />
++      </context>
++      <context name="processContext" attribute="Normal Text" lineEndContext="#stay">
++        <IncludeRules context="preDetection" />
++        <RegExpr attribute="Control" context="case1" String="&bos;case&eos;" beginRegion="CaseRegion1" />
++        <RegExpr attribute="Control" context="if" String="&bos;if&eos;" beginRegion="IfRegion1" />
++        <RegExpr attribute="Control" context="forOrWhile" String="&bos;(for|while)&eos;" beginRegion="ForOrWhileRegion1" />
++        <IncludeRules context="generalDetection" />
++      </context>
++      <context name="case1" attribute="Normal Text" lineEndContext="#stay">
++        <StringDetect attribute="Keyword" context="case2" String="is"/>
++      </context>
++      <context name="case2" attribute="Normal Text" lineEndContext="#stay">
++        <RegExpr attribute="Control" context="#pop#pop" String="&bos;end\s+case\s*;" endRegion="CaseRegion1" />
++        <RegExpr attribute="Control" context="caseWhen" String="&bos;when&eos;" beginRegion="CaseWhenRegion1" />
++        <IncludeRules context="processContext" />
++      </context>
++      <context name="caseWhen" attribute="Normal Text" lineEndContext="#stay">
++        <RegExpr attribute="Control" context="#pop" String="&bos;when&eos;" endRegion="CaseWhenRegion1" lookAhead="true" />
++        <RegExpr attribute="Control" context="#pop" String="&bos;end\s+case\s*;" endRegion="CaseWhenRegion1" lookAhead="true" />
++        <IncludeRules context="process2" />
++      </context>
++      <context name="if" attribute="Normal Text" lineEndContext="#stay">
++        <RegExpr attribute="Control" context="#pop" String="&bos;end\s+if\s*;" endRegion="IfRegion1" />
++        <keyword attribute="Control" context="#stay"  String="if"/>
++        <IncludeRules context="processContext" />
++      </context>
++      <context name="forOrWhile" attribute="Normal Text" lineEndContext="#stay">
++        <RegExpr attribute="Control" context="#pop" String="&bos;end\s+loop\s*;" endRegion="ForOrWhileRegion1" />
++        <keyword attribute="Control" context="#stay"  String="forOrWhile"/>
++        <IncludeRules context="processContext" />
++      </context>
++      
++      <!-- other environments -->
++      <context name="comment" attribute="Comment" lineEndContext="#pop" />
++      <context name="string" attribute="Vector" lineEndContext="#stay" >
++        <DetectChar attribute="Vector" context="#pop" char="&quot;" />
++      </context>
++      <context name="attribute" attribute="Attribute" lineEndContext="#pop">
++        <DetectChar attribute="Attribute" context="quot in att" char="&quot;" />
++        <DetectChar attribute="Normal Text" context="#pop" char=" " />
++        <AnyChar attribute="Attribute" context="#pop" String=")=&lt;&gt;" />
++      </context>
++      <context name="quot in att" attribute="Attribute" lineEndContext="#stay">
++        <DetectChar attribute="Attribute" context="#pop" char="&quot;" />
++      </context>
++    </contexts>
++    <itemDatas>
++      <itemData name="Normal Text" defStyleNum="dsNormal" />
++      <itemData name="Keyword" defStyleNum="dsKeyword" />
++      <itemData name="Data Type" defStyleNum="dsDataType" />
++      <itemData name="Comment" defStyleNum="dsComment" />
++      <itemData name="Integer" defStyleNum="dsDecVal" />
++      <itemData name="Bit" defStyleNum="dsChar" />
++      <itemData name="Vector" defStyleNum="dsString" />
++      <itemData name="Operator" defStyleNum="dsOthers" />
++      <itemData name="Attribute" defStyleNum="dsBaseN" />
++      <itemData name="Region Marker" defStyleNum="dsRegionMarker" />
++      <itemData name="Redirection" defStyleNum="dsKeyword" color="#238" />
++      <itemData name="Process" defStyleNum="dsKeyword" color="#09A" />
++      <itemData name="Control" defStyleNum="dsKeyword" color="#008" />
++    </itemDatas>
++  </highlighting>
+   <general>
+     <comments>
+       <comment name="singleLine" start="--" />
+     </comments>
+-    <keywords casesensitive="1" />
++    <keywords casesensitive="0" />
+   </general>
+-</language>
+-
++</language>
+\ No newline at end of file
+--- a/kate/syntax/data/xml.xml
++++ b/kate/syntax/data/xml.xml
+@@ -4,7 +4,7 @@
+ 	<!ENTITY name    "[A-Za-z_:][\w.:_-]*">
+ 	<!ENTITY entref  "&amp;(#[0-9]+|#[xX][0-9A-Fa-f]+|&name;);">
+ ]>
+-<language name="XML" version="1.96" kateversion="2.4" section="Markup" extensions="*.docbook;*.xml;*.rc;*.daml;*.rdf" mimetype="text/xml;text/book;text/daml;text/rdf" casesensitive="1" author="Wilbert Berendsen (wilbert at kde.nl)" license="LGPL">
++<language name="XML" version="1.97" kateversion="2.4" section="Markup" extensions="*.docbook;*.xml;*.rc;*.daml;*.rdf;*.rss;*.xspf" mimetype="text/xml;text/book;text/daml;text/rdf;application/rss+xml;application/xspf+xml" casesensitive="1" author="Wilbert Berendsen (wilbert at kde.nl)" license="LGPL">
+ 
+ <highlighting>
+ <contexts>
+--- a/kate/syntax/data/cpp.xml
++++ b/kate/syntax/data/cpp.xml
+@@ -1,6 +1,13 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE language SYSTEM "language.dtd">
+-<language name="C++" version="1.38" kateversion="2.4" section="Sources" extensions="*.c++;*.cxx;*.cpp;*.cc;*.C;*.h;*.hh;*.H;*.h++;*.hxx;*.hpp;*.hcc;*.moc" mimetype="text/x-c++src;text/x-c++hdr;text/x-chdr" priority="9">
++<language name="C++" version="1.41" kateversion="2.4" section="Sources" extensions="*.c++;*.cxx;*.cpp;*.cc;*.C;*.h;*.hh;*.H;*.h++;*.hxx;*.hpp;*.hcc;*.moc" mimetype="text/x-c++src;text/x-c++hdr;text/x-chdr" priority="9">
++<!--
++##########################################################################
++## Fixes by Sebastian Pipping (webmaster at hartwork.org)
++##
++## NOTE: Keep in sync with C highlighter! (c.xml)
++##########################################################################
++-->
+   <highlighting>
+     <list name="keywords">
+       <item> asm </item>
+@@ -153,8 +160,8 @@
+     <contexts>
+       <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
+         <DetectSpaces />
+-	<RegExpr attribute="Preprocessor" context="Outscoped" String="#\s*if\s+0" beginRegion="Outscoped" firstNonSpace="true" />
+-        <DetectChar attribute="Preprocessor" context="Preprocessor" char="#" firstNonSpace="true" />
++	<RegExpr attribute="Preprocessor" context="Outscoped" String="#\s*if\s+0" beginRegion="PP" firstNonSpace="true" />
++        <DetectChar context="AfterHash" char="#" firstNonSpace="true" lookAhead="true" />
+         <StringDetect attribute="Region Marker" context="Region Marker" String="//BEGIN" beginRegion="Region1" firstNonSpace="true" />
+         <StringDetect attribute="Region Marker" context="Region Marker" String="//END" endRegion="Region1" firstNonSpace="true" />
+         <keyword attribute="Keyword" context="#stay" String="keywords" />
+@@ -185,42 +192,58 @@
+         <DetectChar attribute="Symbol" context="#stay" char="}" endRegion="Brace1" />
+         <AnyChar attribute="Symbol" context="#stay" String=":!%&amp;()+,-/.*&lt;=&gt;?[]{|}~^&#59;"/>
+       </context>
++
+       <context attribute="String" lineEndContext="#pop" name="String">
+         <LineContinue attribute="String" context="#stay"/>
+         <HlCStringChar attribute="String Char" context="#stay"/>
+         <DetectChar attribute="String" context="#pop" char="&quot;"/>
+       </context>
++
+       <context attribute="Region Marker" lineEndContext="#pop" name="Region Marker">
+       </context>
++
+       <context attribute="Comment" lineEndContext="#pop" name="Commentar 1">
+         <DetectSpaces />
+         <IncludeRules context="##Alerts" />
+         <DetectIdentifier />
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Commentar 2">
+         <DetectSpaces />
+         <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment"/>
+         <IncludeRules context="##Alerts" />
+         <DetectIdentifier />
+       </context>
++
++      <context attribute="Error" lineEndContext="#pop" name="AfterHash">
++        <!-- define, elif, else, endif, error, if, ifdef, ifndef, include, include_next, line, pragma, undef, warning -->
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s*if(?:def|ndef)?(?=\s+\S)" insensitive="true" beginRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s*endif" insensitive="true" endRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Define" String="#\s*define.*((?=\\))" insensitive="true" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s*(?:el(?:se|if)|include(?:_next)?|define|undef|line|error|warning|pragma)" insensitive="true" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="Preprocessor" String="#\s+[0-9]+" insensitive="true" firstNonSpace="true" />
++      </context>
++
+       <context attribute="Preprocessor" lineEndContext="#pop" name="Preprocessor">
+         <LineContinue attribute="Preprocessor" context="#stay"/>
+-        <RegExpr attribute="Preprocessor" context="Define" String="define.*((?=\\))"/>
+-        <RegExpr attribute="Preprocessor" context="#stay" String="define.*"/>
+         <RangeDetect attribute="Prep. Lib" context="#stay" char="&quot;" char1="&quot;"/>
+         <RangeDetect attribute="Prep. Lib" context="#stay" char="&lt;" char1="&gt;"/>
+         <IncludeRules context="##Doxygen" />
++        <Detect2Chars attribute="Comment" context="Commentar/Preprocessor" char="/" char1="*" beginRegion="Comment2" />
++
+         <Detect2Chars attribute="Comment" context="Commentar 1" char="/" char1="/"/>
+-        <Detect2Chars attribute="Comment" context="Commentar/Preprocessor" char="/" char1="*"/>
+       </context>
++
+       <context attribute="Preprocessor" lineEndContext="#pop" name="Define">
+         <LineContinue attribute="Preprocessor" context="#stay"/>
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Commentar/Preprocessor">
+         <DetectSpaces />
+-        <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" />
++        <Detect2Chars attribute="Comment" context="#pop" char="*" char1="/" endRegion="Comment2" />
+         <DetectIdentifier />
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Outscoped" >
+         <DetectSpaces />
+         <IncludeRules context="##Alerts" />
+@@ -229,9 +252,11 @@
+         <IncludeRules context="##Doxygen" />
+         <Detect2Chars attribute="Comment" context="Commentar 1" char="/" char1="/"/>
+         <Detect2Chars attribute="Comment" context="Commentar 2" char="/" char1="*" beginRegion="Comment"/>
+-        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="Outscoped" firstNonSpace="true" />
+-        <RegExpr attribute="Preprocessor" context="#pop" String="#\s*(endif|else|elif)" endRegion="Outscoped" firstNonSpace="true" />
++        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="#pop" String="#\s*el(?:se|if)" firstNonSpace="true" />
++        <RegExpr attribute="Preprocessor" context="#pop" String="#\s*endif" endRegion="PP" firstNonSpace="true" />
+       </context>
++
+       <context attribute="Comment" lineEndContext="#stay" name="Outscoped intern">
+         <DetectSpaces />
+         <IncludeRules context="##Alerts" />
+@@ -240,8 +265,8 @@
+         <IncludeRules context="##Doxygen" />
+         <Detect2Chars attribute="Comment" context="Commentar 1" char="/" char1="/"/>
+         <Detect2Chars attribute="Comment" context="Commentar 2" char="/" char1="*" beginRegion="Comment"/>
+-        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="Outscoped" firstNonSpace="true"/>
+-        <RegExpr attribute="Comment" context="#pop" String="#\s*endif" endRegion="Outscoped" firstNonSpace="true"/>
++        <RegExpr attribute="Comment" context="Outscoped intern" String="#\s*if" beginRegion="PP" firstNonSpace="true" />
++        <RegExpr attribute="Comment" context="#pop" String="#\s*endif" endRegion="PP" firstNonSpace="true" />
+       </context>
+     </contexts>
+     <itemDatas>
+@@ -261,6 +286,7 @@
+       <itemData name="Preprocessor" defStyleNum="dsOthers"/>
+       <itemData name="Prep. Lib"    defStyleNum="dsOthers"/>
+       <itemData name="Region Marker" defStyleNum="dsRegionMarker" />
++      <itemData name="Error"        defStyleNum="dsError" />
+     </itemDatas>
+   </highlighting>
+   <general>
+--- a/kate/syntax/data/language.dtd
++++ b/kate/syntax/data/language.dtd
+@@ -154,10 +154,10 @@
+ -->
+ <!ELEMENT keywords EMPTY>
+ <!ATTLIST keywords
+-  casesensitive         CDATA   #IMPLIED
+-  weakDeliminator       CDATA   #IMPLIED
+-  additionalDeliminator CDATA   #IMPLIED
+-  wordWrapDeliminator   CDATA   #IMPLIED
++  casesensitive         (%boolean;) #IMPLIED
++  weakDeliminator       CDATA       #IMPLIED
++  additionalDeliminator CDATA       #IMPLIED
++  wordWrapDeliminator   CDATA       #IMPLIED
+ >
+ 
+ <!-- Indentation options
+@@ -261,9 +261,13 @@
+ 
+ <!-- Detect members of a keyword list
+   commonAttributes: Common attributes
++  insensitive:      Is this list case-insensitive? [boolean, optional, see note]
+   String:           Name of the list
+   weakDelimiter:    Use weak deliminator
+ 
++  By default, case sensitivity is determined from <keywords casesensitive> in
++  <general> (default=true), but can be overridden per-list with 'insensitive'.
++
+ TODO:
+   - Should be weakDeliminator
+   - Explain deliminator
+@@ -272,7 +276,8 @@
+ <!ELEMENT keyword EMPTY>
+ <!ATTLIST keyword
+   %commonAttributes;
+-  String    CDATA   #REQUIRED
++  insensitive   CDATA #IMPLIED
++  String        CDATA #REQUIRED
+   weakDelimiter CDATA #IMPLIED
+ >
+ 
+--- /dev/null
++++ b/kate/syntax/data/abap.xml
+@@ -0,0 +1,285 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE language SYSTEM "language.dtd">
++<language name="ABAP" version="1.00" kateversion="2.4" section="Sources" extensions="*.abap;*.ABAP" mimetype="text/x-abap-src" priority="5" author="Marcos Antonio Alvarez Costales (busgosin at hotmail.com)" license="GPL">
++  <highlighting>
++
++    <list name="keywords">
++    <!-- compiler directives and structures -->
++      <item> ADD </item>
++      <item> ADJACENT </item>
++      <item> ALL </item>
++      <item> AND </item>
++      <item> APPEND </item>
++      <item> APPENDING </item>
++      <item> AS </item>
++      <item> ASCENDING </item>
++      <item> AT </item>
++      <item> BEGIN </item>
++      <item> BETWEEN </item>
++      <item> BINARY </item>
++      <item> BLOCK </item>
++      <item> BY </item>
++      <item> CASE </item>
++      <item> CENTERED </item>
++      <item> CHAIN </item>
++      <item> CHANGING </item>
++      <item> CHECK </item>
++      <item> CHECKBOX </item>
++      <item> CLEAR </item>
++      <item> COL_BACKGROUND </item>
++      <item> COL_HEADING </item>
++      <item> COL_NORMAL </item>
++      <item> COL_TOTAL </item>
++      <item> COLOR </item>
++      <item> COMMENT </item>
++      <item> COMMIT </item>
++      <item> COMPARING </item>
++      <item> COMPUTE </item>
++      <item> CONCATENATE </item>
++      <item> CONDENSE </item>
++      <item> CONSTANTS </item>
++      <item> CONTINUE </item>
++      <item> CONTROLS </item>
++      <item> COUNTRY </item>
++      <item> DATA </item>
++      <item> DECIMALS </item>
++      <item> DEFAULT </item>
++      <item> DELETE </item>
++      <item> DELETING </item>
++      <item> DESCENDING </item>
++      <item> DESCRIBE </item>
++      <item> DO </item>
++      <item> DUPLICATES </item>
++      <item> EDIT </item>
++      <item> ELSE </item>
++      <item> ELSEIF </item>
++      <item> END </item>
++      <item> ENDCASE </item>
++      <item> ENDCHAIN </item>
++      <item> ENDDO </item>
++      <item> ENDIF </item>
++      <item> ENDLOOP </item>
++      <item> ENDMODULE </item>
++      <item> ENDSELECT </item>
++      <item> ENDWHILE </item>
++      <item> ENTRIES </item>
++      <item> EQ </item>
++      <item> EXCEPTIONS </item>
++      <item> EXCLUDING </item>
++      <item> EXIT </item>
++      <item> EXIT-COMMAND </item>
++      <item> EXPORT </item>
++      <item> EXPORTING </item>
++      <item> FIELD </item>
++      <item> FIRST </item>
++      <item> FOR </item>
++      <item> FORMAT </item>
++      <item> FRAME </item>
++      <item> FREE </item>
++      <item> FROM </item>
++      <item> GE </item>
++      <item> GROUP </item>
++      <item> GT </item>
++      <item> HEADER </item>
++      <item> HEADING </item>
++      <item> HIDE </item>
++      <item> HOTSPOT </item>
++      <item> ID </item>
++      <item> IF </item>
++      <item> IMPORT </item>
++      <item> IMPORTING </item>
++      <item> IN </item>
++      <item> INDEX </item>
++      <item> INITIAL </item>
++      <item> INNER </item>
++      <item> INPUT </item>
++      <item> INSERT </item>
++      <item> INTENSIFIED </item>
++      <item> INTERVALS </item>
++      <item> INTO </item>
++      <item> IS </item>
++      <item> JOIN </item>
++      <item> KEY </item>
++      <item> LE </item>
++      <item> LEAVE </item>
++      <item> LEFT </item>
++      <item> LEFT-JUSTIFIED </item>
++      <item> LIKE </item>
++      <item> LINE </item>
++      <item> LINE-COUNT </item>
++      <item> LINES </item>
++      <item> LINES  </item>
++      <item> LINE-SIZE </item>
++      <item> LIST-PROCESSING </item>
++      <item> LOOP </item>
++      <item> LT </item>
++      <item> MASK </item>
++      <item> MEMORY </item>
++      <item> MESSAGE </item>
++      <item> MESSAGE-ID </item>
++      <item> MOD </item>
++      <item> MODIFY </item>
++      <item> MODULE </item>
++      <item> MOVE </item>
++      <item> MOVE-CORRESPONDING </item>
++      <item> NE </item>
++      <item> NEW-LINE </item>
++      <item> NEW-PAGE </item>
++      <item> NO </item>
++      <item> NO-EXTENSION </item>
++      <item> NO-GAP </item>
++      <item> NO-SCROLLING </item>
++      <item> NOT </item>
++      <item> NO-ZERO </item>
++      <item> NUMBER </item>
++      <item> OBLIGATORY </item>
++      <item> OCCURS </item>
++      <item> OF </item>
++      <item> OFF </item>
++      <item> ON </item>
++      <item> OR </item>
++      <item> OTHERS </item>
++      <item> OUTPUT </item>
++      <item> PAGE </item>
++      <item> PARAMETER </item>
++      <item> PARAMETERS </item>
++      <item> PERFORM </item>
++      <item> PF-STATUS </item>
++      <item> POS_HIGH </item>
++      <item> POS_LOW </item>
++      <item> POSITION </item>
++      <item> PROGRAM </item>
++      <item> RADIOBUTTON </item>
++      <item> RANGES </item>
++      <item> READ </item>
++      <item> REFRESH </item>
++      <item> REPORT </item>
++      <item> RESERVE </item>
++      <item> RESET </item>
++      <item> RIGHT </item>
++      <item> RIGHT-JUSTIFIED </item>
++      <item> ROLLBACK </item>
++      <item> ROWS </item>
++      <item> SCREEN </item>
++      <item> SCREEN-GROUP1 </item>
++      <item> SCREEN-GROUP2 </item>
++      <item> SCREEN-GROUP3 </item>
++      <item> SCREEN-GROUP4 </item>
++      <item> SCREEN-GROUP5 </item>
++      <item> SCREEN-INPUT </item>
++      <item> SCREEN-INTENSIFIED </item>
++      <item> SEARCH </item>
++      <item> SELECT </item>
++      <item> SELECTION </item>
++      <item> SELECTION-SCREEN </item>
++      <item> SELECT-OPTIONS </item>
++      <item> SEPARATED </item>
++      <item> SET </item>
++      <item> SHIFT </item>
++      <item> SINGLE </item>
++      <item> SKIP </item>
++      <item> SORT </item>
++      <item> SPACE </item>
++      <item> SPLIT </item>
++      <item> STANDARD </item>
++      <item> STARTING </item>
++      <item> STOP </item>
++      <item> STRLEN </item>
++      <item> STRUCTURE </item>
++      <item> SUBTRACT </item>
++      <item> SY-CUCOL </item>
++      <item> SY-DATUM </item>
++      <item> SY-DYNNR </item>
++      <item> SY-LINSZ </item>
++      <item> SY-LOOPC </item>
++      <item> SY-LSIND </item>
++      <item> SY-MSGID </item>
++      <item> SY-MSGTY </item>
++      <item> SY-MSGV1 </item>
++      <item> SY-MSGV2 </item>
++      <item> SY-MSGV3 </item>
++      <item> SY-MSGV4 </item>
++      <item> SY-PAGNO </item>
++      <item> SY-REPID </item>
++      <item> SY-STEPL </item>
++      <item> SY-SUBRC </item>
++      <item> SY-TABIX </item>
++      <item> SY-TCODE </item>
++      <item> SY-TMAXL </item>
++      <item> SY-UCOMM </item>
++      <item> SY-ULINE </item>
++      <item> SY-UNAME </item>
++      <item> SY-UZEIT </item>
++      <item> SY-VLINE </item>
++      <item> TABLE </item>
++      <item> TABLES </item>
++      <item> TABLEVIEW </item>
++      <item> TIMES </item>
++      <item> TITLE </item>
++      <item> TITLEBAR </item>
++      <item> TO </item>
++      <item> TRAILING </item>
++      <item> TRANSPORTING </item>
++      <item> TYPE </item>
++      <item> TYPE-POOLS </item>
++      <item> TYPES </item>
++      <item> ULINE </item>
++      <item> UP </item>
++      <item> UPDATE </item>
++      <item> USING </item>
++      <item> VALUE </item>
++      <item> WHEN </item>
++      <item> WHERE </item>
++      <item> WHILE </item>
++      <item> WITH </item>
++      <item> WORK </item>
++      <item> WRITE </item>
++      <item> AFTER </item>
++      <item> BEFORE </item>
++      <item> CALL </item>
++      <item> DURING </item>
++      <item> ENDFORM </item>
++      <item> END-OF-SELECTION </item>
++      <item> FORM </item>
++      <item> FUNCTION </item>
++      <item> INCLUDE </item>
++      <item> LINE-SELECTION </item>
++      <item> PROCESS </item>
++      <item> START-OF-SELECTION </item>
++      <item> TOP-OF-PAGE </item>
++      <item> TRANSACTION </item>
++      <item> USER-COMMAND </item>
++    </list>
++
++    <contexts>
++	    <context attribute="Normal Text" lineEndContext="#stay" name="Normal">
++		    <keyword attribute="Keyword" context="#stay" String="keywords"/>
++		    <DetectChar attribute="Comment" context="Comment" char="&quot;"/>
++		    <DetectChar attribute="Comment" context="Comment" char="*"/>
++		    <AnyChar attribute="Symbol" context="#stay" String="!%&amp;()+,-&lt;:=&gt;[]^~"/>
++	    </context>
++	    <context attribute="Comment" lineEndContext="#pop" name="Comment">
++		       <DetectChar attribute="Comment" context="#pop" char="&quot;"/>
++		       <DetectChar attribute="Comment" context="#pop" char="*"/>
++	    </context>
++    </contexts>
++    
++    <itemDatas>
++	    <itemData name="Normal Text" 	defStyleNum="dsNormal"/>
++	    <itemData name="Keyword"  		defStyleNum="dsKeyword"/>
++	    <itemData name="Comment"  		defStyleNum="dsComment"/>
++	    <itemData name="Symbol"  		defStyleNum="dsNormal"/>
++    </itemDatas>
++
++  </highlighting>
++  
++  <general>
++    <comments>
++      <comment name="singleLine" start="&quot;" />
++      <comment name="singleLine" start="*" />
++      <comment name="multiLine" start="*" />
++    </comments>
++    <keywords casesensitive="0" />
++  </general>
++  
++</language>
+--- /dev/null
++++ b/kate/syntax/data/erlang.xml
+@@ -0,0 +1,249 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE language SYSTEM "language.dtd"
++[
++          <!ENTITY atomstr    "\b[a-z][a-zA-Z0-9@]*\b" >
++          <!ENTITY varstr    "\b[A-Z][a-zA-Z0-9@]*\b" >
++          <!-- pragmas defined here, because "keyword" can't handle the leading '-' -->
++          <!ENTITY pragmas 
++             "^(?:-module|-export|-define|-undef|-ifdef|-ifndef|-else|-endif|-include|-include_lib)" >
++          <!--  same with separators: (from s3.9 p 24 of erlang spec) -->
++          <!ENTITY separators "(?:\(|\)|\{|\}|\[|\]|\.|\:|\||\|\||;|\,|\?|-&gt;|\#)" >
++          <!--  and operators - although words are dealt with separately -->
++          <!ENTITY opsymbols 
++                   "(?:\+|-|\*|\/|==|\/=|=:=|=\/=|&lt;|=&lt;|&gt;|&gt;=|\+\+|--|=|!|&lt;-)" >
++]
++>
++<!--
++    Copyright (C) 2007 Bill Ross <bill at emailme.net.au>
++
++    
++    This library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public
++   License version 2 as published by the Free Software Foundation.
++
++   This library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public License
++   along with this library; see the file COPYING.LIB.  If not, write to
++   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.
++  
++   TODO
++   - '@' at the end of an atom or variable gets coded as normal text - fix this!! 
++-->
++
++<language name="Erlang" version="1.01" kateversion="2.5" section="Scripts" extensions="*.erl" mimetype="" author="Bill Ross (bill at emailme.net)" license="LGPL">
++  <highlighting>
++    <list name="keywords">
++      <!-- ====== s3.8 p 24 of erlang spec ===== -->
++      <item> after </item>
++      <item> begin </item>
++      <item> case </item>
++      <item> catch </item>
++      <item> cond </item>
++      <item> end </item>
++      <item> fun </item>
++      <item> if </item>
++      <item> let </item>
++      <item> of </item>
++      <item> query </item>
++      <item> receive </item>
++      <item> all_true </item>
++      <item> some_true </item>
++    </list>
++    <list name="operators">
++      <!-- operators: s3.9 p 24 of erlang spec -->
++      <!-- see also opsymbols for the symbols -->
++      <item> div </item>
++      <item> rem </item>
++      <item> or </item>
++      <item> xor </item>
++      <item> bor </item>
++      <item> bxor </item>
++      <item> bsl </item>
++      <item> bsr </item>
++      <item> and </item>
++      <item> band </item>
++      <item> not </item>
++      <item> bnot </item>
++    </list>
++    <list name="functions">
++      <!-- all standard (erlang) functions are here, -->
++      <!-- except those defined as erlang:function (those will show as functions anyway -->
++      <item>abs</item>
++      <item>accept</item>
++      <item>alarm</item>
++      <item>apply</item>
++      <item>atom_to_list</item>
++      <item>binary_to_list</item>
++      <item>binary_to_term</item>
++      <item>check_process_code</item>
++      <item>concat_binary</item>
++      <item>date</item>
++      <item>delete_module</item>
++      <item>disconnect_node</item>
++      <item>element</item>
++      <item>erase</item>
++      <item>exit</item>
++      <item>float</item>
++      <item>float_to_list</item>
++      <item>garbage_collect</item>
++      <item>get</item>
++      <item>get_keys</item>
++      <item>group_leader</item>
++      <item>halt</item>
++      <item>hd</item>
++      <item>integer_to_list</item>
++      <item>is_alive</item>
++      <item>is_atom</item>
++      <item>is_binary</item>
++      <item>is_boolean</item>
++      <item>is_float</item>
++      <item>is_function</item>
++      <item>is_integer</item>
++      <item>is_list</item>
++      <item>is_number</item>
++      <item>is_pid</item>
++      <item>is_port</item>
++      <item>is_process_alive</item>
++      <item>is_record</item>
++      <item>is_reference</item>
++      <item>is_tuple</item>
++      <item>length</item>
++      <item>link</item>
++      <item>list_to_atom</item>
++      <item>list_to_binary</item>
++      <item>list_to_float</item>
++      <item>list_to_integer</item>
++      <item>list_to_pid</item>
++      <item>list_to_tuple</item>
++      <item>load_module</item>
++      <item>loaded</item>
++      <item>localtime</item>
++      <item>make_ref</item>
++      <item>module_loaded</item>
++      <item>node</item>
++      <item>nodes</item>
++      <item>now</item>
++      <item>open_port</item>
++      <item>pid_to_list</item>
++      <item>port_close</item>
++      <item>port_command</item>
++      <item>port_connect</item>
++      <item>port_control</item>
++      <item>ports</item>
++      <item>pre_loaded</item>
++      <item>process_flag</item>
++      <item>process_info</item>
++      <item>processes</item>
++      <item>purge_module</item>
++      <item>put</item>
++      <item>register</item>
++      <item>registered</item>
++      <item>round</item>
++      <item>self</item>
++      <item>setelement</item>
++      <item>size</item>
++      <item>spawn</item>
++      <item>spawn_link</item>
++      <item>spawn_opt</item>
++      <item>split_binary</item>
++      <item>statistics</item>
++      <item>term_to_binary</item>
++      <item>throw</item>
++      <item>time</item>
++      <item>tl</item>
++      <item>trunc</item>
++      <item>tuple_to_list</item>
++      <item>unlink</item>
++      <item>unregister</item>
++      <item>whereis</item>
++   </list>
++    <contexts>
++      <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" >
++        <RegExpr attribute="Pragma" context="#stay" column="0" String="&pragmas;" />
++        <keyword attribute="Keyword" context="#stay" String="keywords" />
++        <keyword attribute="Operator" context="#stay" String="operators" />
++        <RegExpr attribute="Operator" context="#stay" String="&opsymbols;" />
++        <keyword attribute="Function" context="#stay" String="functions" />
++        <RegExpr attribute="Separator" context="#stay" String="&separators;" />
++        <DetectSpaces />
++        <DetectChar attribute="Comment" context="comment" char="%" />
++
++        <!-- Functions (in addition to named functions dealt with above) -->
++        <!-- simple version - got to be in form module:function -->
++        <RegExpr attribute="Function" context="#pop" String="&atomstr;:&atomstr;" />
++        <RegExpr attribute="Functon" context="isfunction" String="&atomstr;\(" lookAhead="true" />
++
++        <!-- Variables - begin with upper case, or between single quotes -->
++        <RegExpr attribute="Variable" context="#pop" String="&varstr;" />
++
++        <!-- atoms - begin with lower case (letters, numbers, @), 
++             or anything between single quotes -->
++        <DetectChar attribute="Atom" context="atomquote" char="'" /> 
++        <RegExpr attribute="Atom" context="#pop" String="&atomstr;" />
++        
++        <DetectChar attribute="String" context="stringquote" char="&quot;" />
++        
++        <!-- numbers - these work -->
++        <!-- integers have three forms 7, 3#22, $A -->
++        <!-- float must have a number after the decimal point, or it doesn't count -->
++        <RegExpr attribute="Float" context="#pop" String="[0-9]+\.[0-9]+(?:[eE][+-]?[0-9]+)?" />
++        <RegExpr attribute="Number" context="#pop" String="\d+#[a-zA-Z0-9]+" />
++        <RegExpr attribute="Integer" context="#pop" String="\$\S" />
++        <RegExpr attribute="Integer" context="#pop" String="[0-9]+" />
++
++      </context>
++
++      <!-- isfunction -->
++      <!-- confirm that this is a function and capture name for formatting -->
++      <!-- lookahead for '(' already performed by the time we are here -->
++      <context name="isfunction" attribute="Function" lineEndContext="#pop"  >
++        <RegExpr attribute="Function" context="#pop" String="&atomstr;" />
++      </context>
++
++      <!-- finish off the atom in quoted string (allow for escaped single quotes -->
++      <context name="atomquote" attribute="Atom" lineEndContext="#pop">
++        <RegExpr attribute="Atom" context="#pop" String="(?:(?:\\')?[^']*)*'" />
++      </context>
++
++      <!-- finish off the atom in quoted string (allow for escaped single quotes -->
++      <context name="stringquote" attribute="String" lineEndContext="#pop">
++        <RegExpr attribute="String" context="#pop" String="(?:(?:\\&quot;)?[^&quot;]*)*&quot;" />
++      </context>
++      
++      <!-- finish off the comment (allows for alerts) -->
++      <context name="comment" attribute="Comment" lineEndContext="#pop">
++        <DetectSpaces />
++        <IncludeRules context="##Alerts" />
++        <DetectIdentifier />
++      </context>
++
++    </contexts>
++    <itemDatas>
++      <itemData name="Normal Text"               defStyleNum="dsNormal" />
++      <itemData name="Keyword"                   defStyleNum="dsKeyword" />
++      <itemData name="Pragma"                    defStyleNum="dsKeyword" />
++      <itemData name="Function"                  defStyleNum="dsFunction" />
++      <itemData name="Separator"                 defStyleNum="dsFunction" />
++      <itemData name="Operator"                  defStyleNum="dsKeyword"  />
++      <itemData name="Variable"                  defStyleNum="dsDataType" />
++      <itemData name="Integer"                   defStyleNum="dsDecVal" />
++      <itemData name="Number"                    defStyleNum="dsBaseN" />
++      <itemData name="Float"                     defStyleNum="dsFloat" />
++      <itemData name="Atom"                      defStyleNum="dsChar" />
++      <itemData name="String"                    defStyleNum="dsString" />
++      <itemData name="Comment"                   defStyleNum="dsComment" />
++    </itemDatas>
++  </highlighting>
++  <general>
++    <comments>
++      <comment name="singleLine" start="%" />
++    </comments>
++    <keywords casesensitive="1" />
++  </general>
++</language>
++<!-- kate: space-indent on; indent-width 2; replace-tabs on; -->
+--- /dev/null
++++ b/kate/syntax/data/noweb.xml
+@@ -0,0 +1,52 @@
++<?xml version="1.0" encoding="UTF-8" ?>
++<!DOCTYPE language SYSTEM "language.dtd">
++<language name="noweb" version="1.0" kateversion="2.4" section="Sources" extensions="*.w;*.nw" author="Scott Collins (scc at scottcollins.net)">
++<!-- 
++#########################################################################
++# First version added to repository was 0.4, added as 1.0 .
++#
++# Article about this highlighter:
++#   http://scottcollins.net/articles/Kate.html
++# 
++# Indirect source file:
++#   http://scottcollins.net/articles/Kate.w
++# 
++# Command used for extraction:
++#   $ notangle Kate.w -R"noweb.xml" > syntax/data/noweb.xml
++#########################################################################
++-->
++  <highlighting>
++    <contexts>
++      <context name="RawDocumentation" attribute="Prose" lineEndContext="#stay">
++        <RegExpr String="^&lt;&lt;.*&gt;&gt;=$" attribute="SectionName" context="CodeSection" beginRegion="CodeSection" />
++        <Detect2Chars char="@" char1="[" context="#stay" />
++        <Detect2Chars char="[" char1="[" attribute="Punctuation" context="CodeQuote" />
++        <IncludeRules context="##HTML" includeAttrib="true" />
++      </context>
++      <context name="CodeQuote" attribute="Code" lineEndContext="#stay">
++        <Detect2Chars char="@" char1="]" context="#stay" />
++        <RegExpr String="\]\](?!\])" minimal="true" attribute="Punctuation" context="#pop" />
++        <IncludeRules context="SectionNames" />
++        <IncludeRules context="##C++" includeAttrib="true" />
++      </context>
++      <context name="CodeSection" attribute="Code" lineEndContext="#stay">
++        <RegExpr String="^@$" attribute="Punctuation" context="RawDocumentation" endRegion="CodeSection" />
++        <RegExpr String="^@(?=[\s%])" attribute="Punctuation" context="RawDocumentation" endRegion="CodeSection" />
++        <RegExpr String="^&lt;&lt;.*&gt;&gt;=$" context="RawDocumentation" lookAhead="true" endRegion="CodeSection" />
++        <IncludeRules context="SectionNames" />
++        <IncludeRules context="##C++" includeAttrib="true" />
++      </context>
++      <context name="SectionNames" attribute="Prose" lineEndContext="#stay">
++        <RegExpr String="@&lt;&lt;" context="#stay" />
++        <RegExpr String="&lt;&lt;.*[^@]&gt;&gt;(?!=)" minimal="true" attribute="SectionName" />
++      </context>
++    </contexts>
++    <itemDatas>
++      <itemData name="Prose"        defStyleNum="dsNormal" />
++      <itemData name="Code"         defStyleNum="dsNormal" />
++      <itemData name="Punctuation"  defStyleNum="dsRegionMarker" bold="true" />
++      <itemData name="SectionName"  defStyleNum="dsRegionMarker" italic="true" />
++    </itemDatas>
++  </highlighting>
++</language>
++
+--- a/kate/utils/kateglobal.cpp
++++ b/kate/utils/kateglobal.cpp
+@@ -294,7 +294,7 @@
+       return new KateSaveConfigTab (parent);
+ 
+     case 4:
+-      return new KateEditKeyConfiguration (parent, 0);
++      return new KateEditKeyConfiguration (parent);
+ 
+     case 5:
+       return new KatePartPluginConfigPage (parent);
+--- a/kate/utils/kateprinter.h
++++ b/kate/utils/kateprinter.h
+@@ -21,12 +21,11 @@
+ #ifndef __KATE_PRINTER_H__
+ #define __KATE_PRINTER_H__
+ 
+-#include <kprintdialogpage.h>
++#include <QtGui/QWidget>
+ 
+ class KateDocument;
+ 
+ class KColorButton;
+-class KPrinter;
+ class QCheckBox;
+ class QComboBox;
+ class QGroupBox;
+@@ -48,21 +47,22 @@
+   - Print Line Numbers
+     () Smart () Yes () No
+ */
+-class KatePrintTextSettings : public KPrintDialogPage
++class KatePrintTextSettings : public QWidget
+ {
+   Q_OBJECT
+   public:
+-    explicit KatePrintTextSettings( KPrinter *printer, QWidget *parent=0 );
++    explicit KatePrintTextSettings( QWidget *parent=0 );
+     ~KatePrintTextSettings(){}
+ 
+-    void getOptions(QMap<QString,QString>& opts, bool incldef = false);
+-    void setOptions(const QMap<QString,QString>& opts);
++//     bool printSelection();
++    bool printLineNumbers();
++    bool printGuide();
+ 
+     /* call if view has a selection, enables the seelction checkbox according to the arg */
+-    void enableSelection( bool );
++//     void enableSelection( bool );
+ 
+   private:
+-    QCheckBox *cbSelection, *cbLineNumbers, *cbGuide;
++    QCheckBox /* *cbSelection,*/ *cbLineNumbers, *cbGuide;
+ };
+ //END Text Settings
+ 
+@@ -75,15 +75,26 @@
+     o colors
+ */
+ 
+-class KatePrintHeaderFooter : public KPrintDialogPage
++class KatePrintHeaderFooter : public QWidget
+ {
+   Q_OBJECT
+   public:
+-    explicit KatePrintHeaderFooter( KPrinter *printer, QWidget *parent=0 );
++    explicit KatePrintHeaderFooter( QWidget *parent=0 );
+     ~KatePrintHeaderFooter(){}
+ 
+-    void getOptions(QMap<QString,QString>& opts, bool incldef = false);
+-    void setOptions(const QMap<QString,QString>& opts);
++    QFont font();
++
++    bool useHeader();
++    QString headerFormat();
++    QColor headerForeground();
++    QColor headerBackground();
++    bool useHeaderBackground();
++
++    bool useFooter();
++    QString footerFormat();
++    QColor footerForeground();
++    QColor footerBackground();
++    bool useFooterBackground();
+ 
+   public Q_SLOTS:
+     void setHFFont();
+@@ -91,7 +102,6 @@
+   private:
+     QCheckBox *cbEnableHeader, *cbEnableFooter;
+     QLabel *lFontPreview;
+-    QString strFont;
+     QGroupBox *gbHeader, *gbFooter;
+     QLineEdit *leHeaderLeft, *leHeaderCenter, *leHeaderRight;
+     KColorButton *kcbtnHeaderFg, *kcbtnHeaderBg;
+@@ -113,15 +123,19 @@
+     o Margin
+     o Color
+ */
+-class KatePrintLayout : public KPrintDialogPage
++class KatePrintLayout : public QWidget
+ {
+   Q_OBJECT
+   public:
+-    explicit KatePrintLayout( KPrinter *printer, QWidget *parent=0 );
++    explicit KatePrintLayout( QWidget *parent=0 );
+     ~KatePrintLayout(){}
+ 
+-    void getOptions(QMap<QString,QString>& opts, bool incldef = false);
+-    void setOptions(const QMap<QString,QString>& opts);
++    QString colorScheme();
++    bool useBackground();
++    bool useBox();
++    int boxWidth();
++    int boxMargin();
++    QColor boxColor();
+ 
+   private:
+     QComboBox *cmbSchema;
+--- a/kate/utils/kateprinter.cpp
++++ b/kate/utils/kateprinter.cpp
+@@ -36,7 +36,7 @@
+ #include <kdialog.h> // for spacingHint()
+ #include <kfontdialog.h>
+ #include <klocale.h>
+-#include <kprinter.h>
++#include <kdeprintdialog.h>
+ #include <kurl.h>
+ #include <kuser.h> // for loginName
+ 
+@@ -44,6 +44,8 @@
+ #include <QtGui/QCheckBox>
+ #include <QtGui/QComboBox>
+ #include <QtGui/QGroupBox>
++#include <QtGui/QPrintDialog>
++#include <QtGui/QPrinter>
+ 
+ #include <QtGui/QLabel>
+ #include <QtGui/QLayout>
+@@ -55,26 +57,33 @@
+ //BEGIN KatePrinter
+ bool KatePrinter::print (KateDocument *doc)
+ {
+-#if 0
+-  KPrinter printer;
++
++  QPrinter printer;
+ 
+   // docname is now always there, including the right Untitled name
+   printer.setDocName(doc->documentName());
+ 
+-  KatePrintTextSettings *kpts = new KatePrintTextSettings(&printer, NULL);
++  KatePrintTextSettings *kpts = new KatePrintTextSettings;
++  KatePrintHeaderFooter *kphf = new KatePrintHeaderFooter;
++  KatePrintLayout *kpl = new KatePrintLayout;
+ 
+ #ifdef __GNUC__
+ #warning fixme later
+ #endif
+   //kpts->enableSelection( doc->hasSelection() );
+ 
+-  printer.addDialogPage( kpts );
+-  printer.addDialogPage( new KatePrintHeaderFooter(&printer, NULL) );
+-  printer.addDialogPage( new KatePrintLayout(&printer, NULL) );
++  QList<QWidget*> tabs;
++  tabs << kpts;
++  tabs << kphf;
++  tabs << kpl;
++  QPrintDialog *printDialog = KdePrint::createPrintDialog(&printer, tabs,
++                                                          doc->widget());
+ 
+-   if ( printer.setup( doc->widget(), i18n("Print %1", printer.docName()) ) )
++   if ( printDialog->exec() )
+    {
+-     KateRenderer renderer(doc);
++// }
++// #if 0
++     KateRenderer renderer(doc, doc->activeKateView());
+      //renderer.config()->setSchema (1);
+      renderer.setPrinterFriendly(true);
+ 
+@@ -103,46 +112,42 @@
+ #ifdef __GNUC__
+   #warning fixme later
+ #endif
+-     //( doc->hasSelection() &&
+-       //                    ( printer.option("app-kate-printselection") == "true" ) );
++     //( doc->hasSelection() && kpts->selection() );
+ 
+      int selStartCol = 0;
+      int selEndCol = 0;
+ 
+-     bool useGuide = ( printer.option("app-kate-printguide") == "true" );
++     bool useGuide = kpts->printGuide();
+      int guideHeight = 0;
+      int guideCols = 0;
+ 
+-     bool printLineNumbers = ( printer.option("app-kate-printlinenumbers") == "true" );
++     bool printLineNumbers = kpts->printLineNumbers();
+      uint lineNumberWidth( 0 );
+ 
+      // Header/Footer Page
+-     QFont headerFont; // used for header/footer
+-     QString f = printer.option("app-kate-hffont");
+-     if (!f.isEmpty())
+-       headerFont.fromString( f );
+-
+-     bool useHeader = (printer.option("app-kate-useheader") == "true");
+-     QColor headerBgColor(printer.option("app-kate-headerbg"));
+-     QColor headerFgColor(printer.option("app-kate-headerfg"));
++     QFont headerFont(kphf->font()); // used for header/footer
++
++     bool useHeader = kphf->useHeader();
++     QColor headerBgColor(kphf->headerBackground());
++     QColor headerFgColor(kphf->headerForeground());
+      uint headerHeight( 0 ); // further init only if needed
+      QStringList headerTagList; // do
+      bool headerDrawBg = false; // do
+ 
+-     bool useFooter = (printer.option("app-kate-usefooter") == "true");
+-     QColor footerBgColor(printer.option("app-kate-footerbg"));
+-     QColor footerFgColor(printer.option("app-kate-footerfg"));
++     bool useFooter = kphf->useFooter();
++     QColor footerBgColor(kphf->footerBackground());
++     QColor footerFgColor(kphf->footerForeground());
+      uint footerHeight( 0 ); // further init only if needed
+      QStringList footerTagList; // do
+      bool footerDrawBg = false; // do
+ 
+      // Layout Page
+-     renderer.config()->setSchema( printer.option("app-kate-colorscheme") );
+-     bool useBackground = ( printer.option("app-kate-usebackground") == "true" );
+-     bool useBox = (printer.option("app-kate-usebox") == "true");
+-     int boxWidth(printer.option("app-kate-boxwidth").toInt());
+-     QColor boxColor(printer.option("app-kate-boxcolor"));
+-     int innerMargin = useBox ? printer.option("app-kate-boxmargin").toInt() : 6;
++     renderer.config()->setSchema( kpl->colorScheme() );
++     bool useBackground = kpl->useBackground();
++     bool useBox = kpl->useBox();
++     int boxWidth(kpl->boxWidth());
++     QColor boxColor(kpl->boxColor());
++     int innerMargin = useBox ? kpl->boxMargin() : 6;
+ 
+      // Post initialization
+      uint maxHeight = (useBox ? pdmHeight-innerMargin : pdmHeight);
+@@ -219,14 +224,14 @@
+ 
+          if (useHeader)
+          {
+-           headerDrawBg = ( printer.option("app-kate-headerusebg") == "true" );
++           headerDrawBg = kphf->useHeaderBackground();
+            headerHeight = QFontMetrics( headerFont ).height();
+            if ( useBox || headerDrawBg )
+              headerHeight += innerMargin * 2;
+            else
+              headerHeight += 1 + QFontMetrics( headerFont ).leading();
+ 
+-           QString headerTags = printer.option("app-kate-headerformat");
++           QString headerTags = kphf->headerFormat();
+            int pos = reTags.indexIn( headerTags );
+            QString rep;
+            while ( pos > -1 )
+@@ -246,14 +251,14 @@
+ 
+          if (useFooter)
+          {
+-           footerDrawBg = ( printer.option("app-kate-footerusebg") == "true" );
++           footerDrawBg = kphf->useFooterBackground();
+            footerHeight = QFontMetrics( headerFont ).height();
+            if ( useBox || footerDrawBg )
+              footerHeight += 2*innerMargin;
+            else
+              footerHeight += 1; // line only
+ 
+-           QString footerTags = printer.option("app-kate-footerformat");
++           QString footerTags = kphf->footerFormat();
+            int pos = reTags.indexIn( footerTags );
+            QString rep;
+            while ( pos > -1 )
+@@ -368,7 +373,8 @@
+          long _lw;
+          for ( uint i = firstline; i < lastline; i++ )
+          {
+-           _lw = renderer.textWidth( doc->kateTextLine( i ), -1 );
++           //FIXME: _lw = renderer.textWidth( doc->kateTextLine( i ), -1 );
++           _lw = 80 * renderer.spaceWidth(); //FIXME: just a stand-in
+            while ( _lw >= 0 )
+            {
+              _c++;
+@@ -400,6 +406,7 @@
+      uint _count = 0;
+      while (  lineCount <= lastline  )
+      {
++kDebug()<<"entering print lines loop";
+        startCol = 0;
+        endCol = 0;
+        needWrap = true;
+@@ -577,7 +584,8 @@
+                         Qt::AlignRight, QString("%1").arg( lineCount + 1 ) );
+          }
+ #endif
+-         endCol = renderer.textWidth(doc->kateTextLine(lineCount), startCol, maxWidth, &needWrap);
++         //FIXME: endCol = renderer.textWidth(doc->kateTextLine(lineCount), startCol, maxWidth, &needWrap);
++         endCol = 80 * renderer.spaceWidth(); //FIXME: just a stand-in
+ 
+          if ( endCol < startCol )
+          {
+@@ -624,9 +632,13 @@
+          range.setEndCol(endCol);
+          range.setWrap(needWrap);
+ #endif
++         KateLineLayoutPtr *rangeptr = new KateLineLayoutPtr(&range);
++         renderer.layoutLine(*rangeptr, (int)maxWidth, false);
+          paint.translate(xstart, y);
+-         renderer.paintTextLine(paint, &range, 0, maxWidth);
+-         paint.resetXForm();
++         renderer.paintTextLine(paint, *rangeptr, 0, (int)maxWidth);
++needWrap=false;
++ kDebug()<<"painted line"<<lineCount;
++         //paint.resetXForm();
+          if ( skip )
+          {
+            needWrap = false;
+@@ -643,25 +655,27 @@
+ 
+        lineCount++;
+      } // done lineCount <= lastline
++     paint.end();
+      return true;
+   }
+-#endif
++  delete printDialog;
++// #endif
+   return false;
+ }
+ //END KatePrinter
+ 
+ #ifndef Q_WS_WIN //TODO: reenable
+ //BEGIN KatePrintTextSettings
+-KatePrintTextSettings::KatePrintTextSettings( KPrinter * /*printer*/, QWidget *parent )
+-  : KPrintDialogPage( parent )
++KatePrintTextSettings::KatePrintTextSettings( QWidget *parent )
++  : QWidget( parent )
+ {
+-  setTitle( i18n("Te&xt Settings") );
++  setWindowTitle( i18n("Te&xt Settings") );
+ 
+   QVBoxLayout *lo = new QVBoxLayout ( this );
+   lo->setSpacing( KDialog::spacingHint() );
+ 
+-  cbSelection = new QCheckBox( i18n("Print &selected text only"), this );
+-  lo->addWidget( cbSelection );
++//   cbSelection = new QCheckBox( i18n("Print &selected text only"), this );
++//   lo->addWidget( cbSelection );
+ 
+   cbLineNumbers = new QCheckBox( i18n("Print &line numbers"), this );
+   lo->addWidget( cbLineNumbers );
+@@ -674,9 +688,9 @@
+   // set defaults - nothing to do :-)
+ 
+   // whatsthis
+-  cbSelection->setWhatsThis(i18n(
+-        "<p>This option is only available if some text is selected in the document.</p>"
+-        "<p>If available and enabled, only the selected text is printed.</p>") );
++//   cbSelection->setWhatsThis(i18n(
++//         "<p>This option is only available if some text is selected in the document.</p>"
++//         "<p>If available and enabled, only the selected text is printed.</p>") );
+   cbLineNumbers->setWhatsThis(i18n(
+         "<p>If enabled, line numbers will be printed on the left side of the page(s).</p>") );
+   cbGuide->setWhatsThis(i18n(
+@@ -684,39 +698,33 @@
+         "defined by the syntax highlighting being used.</p>") );
+ }
+ 
+-void KatePrintTextSettings::getOptions( QMap<QString,QString>& opts, bool )
+-{
+-  opts["app-kate-printselection"] = cbSelection->isChecked() ? "true" : "false";
+-  opts["app-kate-printlinenumbers"] = cbLineNumbers->isChecked() ? "true" : "false";
+-  opts["app-kate-printguide"] = cbGuide->isChecked() ? "true" : "false" ;
+-}
++// bool KatePrintTextSettings::printSelection()
++// {
++//     return cbSelection->isChecked();
++// }
+ 
+-void KatePrintTextSettings::setOptions( const QMap<QString,QString>& opts )
++bool KatePrintTextSettings::printLineNumbers()
+ {
+-  QString v;
+-  v = opts["app-kate-printselection"];
+-  if ( ! v.isEmpty() )
+-    cbSelection->setChecked( v == "true" );
+-  v = opts["app-kate-printlinenumbers"];
+-  if ( ! v.isEmpty() )
+-    cbLineNumbers->setChecked( v == "true" );
+-  v = opts["app-kate-printguide"];
+-  if ( ! v.isEmpty() )
+-    cbGuide->setChecked( v == "true" );
++    return cbLineNumbers->isChecked();
+ }
+ 
+-void KatePrintTextSettings::enableSelection( bool enable )
++bool KatePrintTextSettings::printGuide()
+ {
+-  cbSelection->setEnabled( enable );
++    return cbGuide->isChecked();
+ }
+ 
++// void KatePrintTextSettings::enableSelection( bool enable )
++// {
++//   cbSelection->setEnabled( enable );
++// }
++
+ //END KatePrintTextSettings
+ 
+ //BEGIN KatePrintHeaderFooter
+-KatePrintHeaderFooter::KatePrintHeaderFooter( KPrinter * /*printer*/, QWidget *parent )
+-  : KPrintDialogPage( parent )
++KatePrintHeaderFooter::KatePrintHeaderFooter( QWidget *parent )
++  : QWidget( parent )
+ {
+-  setTitle( i18n("Hea&der && Footer") );
++  setWindowTitle( i18n("Hea&der && Footer") );
+ 
+   QVBoxLayout *lo = new QVBoxLayout ( this );
+   uint sp = KDialog::spacingHint();
+@@ -752,7 +760,7 @@
+   grid->addWidget(lHeaderFormat, 0, 0);
+ 
+   KHBox *hbHeaderFormat = new KHBox( gbHeader );
+-  grid->addWidget(lHeaderFormat, 0, 1);
++  grid->addWidget(hbHeaderFormat, 0, 1);
+ 
+   hbHeaderFormat->setSpacing( sp );
+   leHeaderLeft = new QLineEdit( hbHeaderFormat );
+@@ -846,83 +854,65 @@
+   leFooterRight->setWhatsThis(s + s1 );
+   leFooterCenter->setWhatsThis(s + s1 );
+   leFooterLeft->setWhatsThis(s + s1 );
++}
+ 
++QFont KatePrintHeaderFooter::font()
++{
++    return lFontPreview->font();
++}
+ 
++bool KatePrintHeaderFooter::useHeader()
++{
++    return cbEnableHeader->isChecked();
+ }
+ 
+-void KatePrintHeaderFooter::getOptions(QMap<QString,QString>& opts, bool )
++QString KatePrintHeaderFooter::headerFormat()
+ {
+-  opts["app-kate-hffont"] = strFont;
++    return leHeaderLeft->text() + '|' +
++           leHeaderCenter->text() + '|' +
++           leHeaderRight->text();
++}
+ 
+-  opts["app-kate-useheader"] = (cbEnableHeader->isChecked() ? "true" : "false");
+-  opts["app-kate-headerfg"] = kcbtnHeaderFg->color().name();
+-  opts["app-kate-headerusebg"] = (cbHeaderEnableBgColor->isChecked() ? "true" : "false");
+-  opts["app-kate-headerbg"] = kcbtnHeaderBg->color().name();
+-  opts["app-kate-headerformat"] = leHeaderLeft->text() + '|' + leHeaderCenter->text() + '|' + leHeaderRight->text();
+-
+-  opts["app-kate-usefooter"] = (cbEnableFooter->isChecked() ? "true" : "false");
+-  opts["app-kate-footerfg"] = kcbtnFooterFg->color().name();
+-  opts["app-kate-footerusebg"] = (cbFooterEnableBgColor->isChecked() ? "true" : "false");
+-  opts["app-kate-footerbg"] = kcbtnFooterBg->color().name();
+-  opts["app-kate-footerformat"] = leFooterLeft->text() + '|' + leFooterCenter->text() + '|' + leFooterRight->text();
+-}
+-
+-void KatePrintHeaderFooter::setOptions( const QMap<QString,QString>& opts )
+-{
+-  QString v;
+-  v = opts["app-kate-hffont"];
+-  strFont = v;
+-  QFont f = font();
+-  if ( ! v.isEmpty() )
+-  {
+-    if (!strFont.isEmpty())
+-      f.fromString( strFont );
++QColor KatePrintHeaderFooter::headerForeground()
++{
++    return kcbtnHeaderFg->color();
++}
+ 
+-    lFontPreview->setFont( f );
+-  }
+-  lFontPreview->setText( (f.family() + ", %1pt").arg( f.pointSize() ) );
++QColor KatePrintHeaderFooter::headerBackground()
++{
++    return kcbtnHeaderBg->color();
++}
++
++bool KatePrintHeaderFooter::useHeaderBackground()
++{
++    return cbHeaderEnableBgColor->isChecked();
++}
+ 
+-  v = opts["app-kate-useheader"];
+-  if ( ! v.isEmpty() )
+-    cbEnableHeader->setChecked( v == "true" );
+-  v = opts["app-kate-headerfg"];
+-  if ( ! v.isEmpty() )
+-    kcbtnHeaderFg->setColor( QColor( v ) );
+-  v = opts["app-kate-headerusebg"];
+-  if ( ! v.isEmpty() )
+-    cbHeaderEnableBgColor->setChecked( v == "true" );
+-  v = opts["app-kate-headerbg"];
+-  if ( ! v.isEmpty() )
+-    kcbtnHeaderBg->setColor( QColor( v ) );
++bool KatePrintHeaderFooter::useFooter()
++{
++    return cbEnableFooter->isChecked();
++}
+ 
+-  QStringList tags = opts["app-kate-headerformat"].split('|');
+-  if (tags.count() == 3)
+-  {
+-    leHeaderLeft->setText(tags[0]);
+-    leHeaderCenter->setText(tags[1]);
+-    leHeaderRight->setText(tags[2]);
+-  }
++QString KatePrintHeaderFooter::footerFormat()
++{
++    return leFooterLeft->text() + '|' +
++           leFooterCenter->text() + '|' +
++           leFooterRight->text();
++}
+ 
+-  v = opts["app-kate-usefooter"];
+-  if ( ! v.isEmpty() )
+-    cbEnableFooter->setChecked( v == "true" );
+-  v = opts["app-kate-footerfg"];
+-  if ( ! v.isEmpty() )
+-    kcbtnFooterFg->setColor( QColor( v ) );
+-  v = opts["app-kate-footerusebg"];
+-  if ( ! v.isEmpty() )
+-    cbFooterEnableBgColor->setChecked( v == "true" );
+-  v = opts["app-kate-footerbg"];
+-  if ( ! v.isEmpty() )
+-    kcbtnFooterBg->setColor( QColor( v ) );
++QColor KatePrintHeaderFooter::footerForeground()
++{
++    return kcbtnFooterFg->color();
++}
+ 
+-  tags = opts["app-kate-footerformat"].split('|');
+-  if (tags.count() == 3)
+-  {
+-    leFooterLeft->setText(tags[0]);
+-    leFooterCenter->setText(tags[1]);
+-    leFooterRight->setText(tags[2]);
+-  }
++QColor KatePrintHeaderFooter::footerBackground()
++{
++    return kcbtnFooterBg->color();
++}
++
++bool KatePrintHeaderFooter::useFooterBackground()
++{
++    return cbFooterEnableBgColor->isChecked();
+ }
+ 
+ void KatePrintHeaderFooter::setHFFont()
+@@ -931,8 +921,6 @@
+   // display a font dialog
+   if ( KFontDialog::getFont( fnt, false, this ) == KFontDialog::Accepted )
+   {
+-    // change strFont
+-    strFont = fnt.toString();
+     // set preview
+     lFontPreview->setFont( fnt );
+     lFontPreview->setText( (fnt.family() + ", %1pt").arg( fnt.pointSize() ) );
+@@ -943,10 +931,10 @@
+ 
+ //BEGIN KatePrintLayout
+ 
+-KatePrintLayout::KatePrintLayout( KPrinter * /*printer*/, QWidget *parent)
+-  : KPrintDialogPage( parent )
++KatePrintLayout::KatePrintLayout( QWidget *parent)
++  : QWidget( parent )
+ {
+-  setTitle( i18n("L&ayout") );
++  setWindowTitle( i18n("L&ayout") );
+ 
+   QVBoxLayout *lo = new QVBoxLayout ( this );
+   lo->setSpacing( KDialog::spacingHint() );
+@@ -988,7 +976,7 @@
+   QLabel *lBoxColor = new QLabel( i18n("Co&lor:"), gbBoxProps );
+   grid->addWidget(lBoxColor, 2, 0);
+   kcbtnBoxColor = new KColorButton( gbBoxProps );
+-  grid->addWidget(lBoxWidth, 2, 1);
++  grid->addWidget(kcbtnBoxColor, 2, 1);
+   lBoxColor->setBuddy( kcbtnBoxColor );
+ 
+   connect( cbEnableBox, SIGNAL(toggled(bool)), gbBoxProps, SLOT(setEnabled(bool)) );
+@@ -1019,37 +1007,34 @@
+         "The line color to use for boxes") );
+ }
+ 
+-void KatePrintLayout::getOptions(QMap<QString,QString>& opts, bool )
++QString KatePrintLayout::colorScheme()
++{
++    return cmbSchema->currentText();
++}
++
++bool KatePrintLayout::useBackground()
++{
++    return cbDrawBackground->isChecked();
++}
++
++bool KatePrintLayout::useBox()
++{
++    return cbEnableBox->isChecked();
++}
++
++int KatePrintLayout::boxWidth()
++{
++    return sbBoxWidth->value();
++}
++
++int KatePrintLayout::boxMargin()
++{
++    return sbBoxMargin->value();
++}
++
++QColor KatePrintLayout::boxColor()
+ {
+-  opts["app-kate-colorscheme"] = cmbSchema->currentText();
+-  opts["app-kate-usebackground"] = cbDrawBackground->isChecked() ? "true" : "false";
+-  opts["app-kate-usebox"] = cbEnableBox->isChecked() ? "true" : "false";
+-  opts["app-kate-boxwidth"] = sbBoxWidth->cleanText();
+-  opts["app-kate-boxmargin"] = sbBoxMargin->cleanText();
+-  opts["app-kate-boxcolor"] = kcbtnBoxColor->color().name();
+-}
+-
+-void KatePrintLayout::setOptions( const QMap<QString,QString>& opts )
+-{
+-  QString v;
+-  v = opts["app-kate-colorscheme"];
+-  if ( ! v.isEmpty() )
+-    cmbSchema->setCurrentIndex( KateGlobal::self()->schemaManager()->number( v ) );
+-  v = opts["app-kate-usebackground"];
+-  if ( ! v.isEmpty() )
+-    cbDrawBackground->setChecked( v == "true" );
+-  v = opts["app-kate-usebox"];
+-  if ( ! v.isEmpty() )
+-    cbEnableBox->setChecked( v == "true" );
+-  v = opts["app-kate-boxwidth"];
+-  if ( ! v.isEmpty() )
+-    sbBoxWidth->setValue( v.toInt() );
+-  v = opts["app-kate-boxmargin"];
+-  if ( ! v.isEmpty() )
+-    sbBoxMargin->setValue( v.toInt() );
+-  v = opts["app-kate-boxcolor"];
+-  if ( ! v.isEmpty() )
+-    kcbtnBoxColor->setColor( QColor( v ) );
++    return kcbtnBoxColor->color();
+ }
+ //END KatePrintLayout
+ 
+--- a/kate/tests/arbitraryhighlighttest.h
++++ b/kate/tests/arbitraryhighlighttest.h
+@@ -25,6 +25,7 @@
+   class Document;
+   class SmartInterface;
+   class SmartRange;
++  class View;
+ }
+ 
+ /**
+@@ -47,6 +48,10 @@
+     void slotRangeChanged(KTextEditor::SmartRange* range, KTextEditor::SmartRange* mostSpecificChild);
+     void slotRangeDeleted(KTextEditor::SmartRange* range);
+     void slotCreateTopRange();
++    void slotMouseEnteredRange(KTextEditor::SmartRange* range, KTextEditor::View* view);
++    void slotMouseExitedRange(KTextEditor::SmartRange* range, KTextEditor::View* view);
++    void slotCaretEnteredRange(KTextEditor::SmartRange* range, KTextEditor::View* view);
++    void slotCaretExitedRange(KTextEditor::SmartRange* range, KTextEditor::View* view);
+ 
+   private:
+     void outputRange(KTextEditor::SmartRange* range, KTextEditor::SmartRange * mostSpecific);
+--- a/kate/tests/arbitraryhighlighttest.cpp
++++ b/kate/tests/arbitraryhighlighttest.cpp
+@@ -106,6 +106,11 @@
+     for (int i = 0; i < string.length(); ++i) {
+       if (string.at(i) == openBrace) {
+         currentRange = smart()->newSmartRange(current, currentRange->end(), currentRange);
++        connect(currentRange->primaryNotifier(), SIGNAL(mouseEnteredRange(KTextEditor::SmartRange*, KTextEditor::View*)), SLOT(slotMouseEnteredRange(KTextEditor::SmartRange*, KTextEditor::View*)));
++        connect(currentRange->primaryNotifier(), SIGNAL(mouseExitedRange(KTextEditor::SmartRange*, KTextEditor::View*)), SLOT(slotMouseExitedRange(KTextEditor::SmartRange*, KTextEditor::View*)));
++        connect(currentRange->primaryNotifier(), SIGNAL(caretEnteredRange(KTextEditor::SmartRange*, KTextEditor::View*)), SLOT(slotCaretEnteredRange(KTextEditor::SmartRange*, KTextEditor::View*)));
++        connect(currentRange->primaryNotifier(), SIGNAL(caretExitedRange(KTextEditor::SmartRange*, KTextEditor::View*)), SLOT(slotCaretExitedRange(KTextEditor::SmartRange*, KTextEditor::View*)));
++
+         if (currentRange->depth() < 10)
+           currentRange->setAttribute(ranges[currentRange->depth()]);
+ 
+@@ -145,4 +150,24 @@
+   slotRangeChanged(m_topRange, m_topRange);
+ }
+ 
++void ArbitraryHighlightTest::slotMouseEnteredRange(KTextEditor::SmartRange* range, KTextEditor::View* view)
++{
++  kDebug() << k_funcinfo << *range;
++}
++
++void ArbitraryHighlightTest::slotMouseExitedRange(KTextEditor::SmartRange* range, KTextEditor::View* view)
++{
++  kDebug() << k_funcinfo << *range;
++}
++
++void ArbitraryHighlightTest::slotCaretEnteredRange(KTextEditor::SmartRange* range, KTextEditor::View* view)
++{
++  kDebug() << k_funcinfo << *range;
++}
++
++void ArbitraryHighlightTest::slotCaretExitedRange(KTextEditor::SmartRange* range, KTextEditor::View* view)
++{
++  kDebug() << k_funcinfo << *range;
++}
++
+ #include "arbitraryhighlighttest.moc"
+--- a/kate/tests/katetest.cpp
++++ b/kate/tests/katetest.cpp
+@@ -113,7 +113,7 @@
+     docList.append(doc);
+   }
+ 
+-  //new ArbitraryHighlightTest(doc);
++  new ArbitraryHighlightTest(doc);
+ 
+   m_view = qobject_cast<KTextEditor::View*>(doc->createView (this));
+ 
+--- a/kate/TODO
++++ b/kate/TODO
+@@ -19,8 +19,6 @@
+   * current highlighter not selected (regression)
+   * controls seem to need to be clicked twice?
+ 
+-* reimplement bracket matching
+-
+ * since KDE4 we have a Mode for every Highlighting file. Opening a file leads to a
+   call of QString KateModeManager::wildcardsFind (const QString &fileName), which is
+   very slow. Opening 50 files in the Kate Application is *very* slow. Needs to be
+--- a/kate/data/katepart.desktop
++++ b/kate/data/katepart.desktop
+@@ -50,8 +50,8 @@
+ Name[ru]=Встроенный текстовый редактор
+ Name[se]=Nana buorre vuojuhanláhkái čállinprográmma
+ Name[sl]=Vgrajeni napredni urejevalnik besedil
+-Name[sr]=Уграђени напредни уређивач текста
+-Name[sr at latin]=Ugrađeni napredni uređivač teksta
++Name[sr]=Угњеждени напредни уређивач текста
++Name[sr at latin]=Ugnježdeni napredni uređivač teksta
+ Name[sv]=Inbäddningsbar avancerad texteditor
+ Name[ta]=உட்பொதிந்த மேம்பட்ட உரை தொகுப்பாளர்
+ Name[te]=ఆధునిక పొదగిన వాచకం సరిచేయునది
+--- a/kate/completion/katecompletionmodel.cpp
++++ b/kate/completion/katecompletionmodel.cpp
+@@ -573,13 +573,11 @@
+ 
+     int row = m_rowTable.indexOf(g);
+ 
+-    /**
+-     * Workaround for crash caused by the assertion that I don't know how to fix, any better fix is encouraged.
+-     * It happens when I click setup
+-     * */
+-    if( row == -1 )
++    if (row == -1) {
++      kWarning() << k_funcinfo << "Couldn't find parent for index" << index;
+       return QModelIndex();
+-//     Q_ASSERT(row != -1);
++    }
++    
+     return createIndex(row, 0, 0);
+   }
+ 
+@@ -706,7 +704,7 @@
+ 
+     updateBestMatches();
+   }
+-  
++
+   clearExpanding(); //We need to do this, or be aware of expanding-widgets while filtering.
+ }
+ 
+@@ -1070,15 +1068,26 @@
+   if (m_columnMerges.isEmpty())
+     return sourceColumn;
+ 
++  /* Debugging - dump column merge list
++
++  QString columnMerge;
++  foreach (const QList<int>& list, m_columnMerges) {
++    columnMerge += '[';
++    foreach (int column, list) {
++      columnMerge += QString::number(column) + " ";
++    }
++    columnMerge += "] ";
++  }
++
++  kDebug() << k_funcinfo << columnMerge;*/
++
+   int c = 0;
+   foreach (const QList<int>& list, m_columnMerges) {
+     foreach (int column, list) {
+       if (column == sourceColumn)
+-        ///@todo Ugly workaround: "return c" is correct here. This is a workaround for a bug I don't understand, which you can notice in katecompletionwidget.cpp:
+-        ///For some reason, the name-column is mapped to the post-fix column when column-merging is enabled, so the widget is not positioned correctly.
+-        return c > 0 ? c-1 : c;
+-      c++;
++        return c;
+     }
++    c++;
+   }
+   return -1;
+ }
+@@ -1241,7 +1250,7 @@
+   , matchFilters(true)
+ {
+   inheritanceDepth = m_sourceRow.first->index(m_sourceRow.second, 0).data(CodeCompletionModel::InheritanceDepth).toInt();
+-  
++
+   filter();
+   match();
+ }
+@@ -1279,11 +1288,12 @@
+ void KateCompletionModel::Group::addItem( Item i )
+ {
+   if (model->isSortingEnabled()) {
+-    QList<Item>::Iterator it = model->isSortingReverse() ? qUpperBound(--prefilter.end(), prefilter.end(), i) : qUpperBound(prefilter.begin(), prefilter.end(), i);
++    QList<Item>::Iterator it = model->isSortingReverse() ? qLowerBound(prefilter.begin(), prefilter.end(), i) : qUpperBound(prefilter.begin(), prefilter.end(), i);
+     if (it != prefilter.end()) {
++      const Item& item = *it;
+       prefilter.insert(it, i);
+       if (i.isVisible()) {
+-        int index = rows.indexOf(it->sourceRow());
++        int index = rows.indexOf(item.sourceRow());
+         if (index != -1)
+           rows.append(i.sourceRow());
+         else
+@@ -1292,7 +1302,10 @@
+     } else {
+       prefilter.append(i);
+       if (i.isVisible())
+-        rows.append(i.sourceRow());
++        if (model->isSortingReverse())
++          rows.prepend(i.sourceRow());
++        else
++          rows.append(i.sourceRow());
+     }
+ 
+   } else {
+@@ -1430,7 +1443,7 @@
+     g->refilter();
+ 
+   updateBestMatches();
+-  
++
+   clearExpanding(); //We need to do this, or be aware of expanding-widgets while filtering.
+ }
+ 
+--- a/kate/completion/katecompletiondelegate.cpp
++++ b/kate/completion/katecompletiondelegate.cpp
+@@ -33,7 +33,7 @@
+ #include "katecompletiontree.h"
+ 
+ KateCompletionDelegate::KateCompletionDelegate(ExpandingWidgetModel* model, KateCompletionWidget* parent) :
+-    ExpandingDelegate(model, parent)
++    ExpandingDelegate(model, parent), m_cachedRow(-1)
+ {
+ }
+ 
+@@ -58,8 +58,7 @@
+ }
+ 
+ QList<QTextLayout::FormatRange> KateCompletionDelegate::createHighlighting(const QModelIndex& index, QStyleOptionViewItem& option) const {
+-    // Which highlighting to use?
+-  //model()->index(index.row(), KTextEditor::CodeCompletionModel::Name, index.parent())
++    
+     QVariant highlight = model()->data(index, KTextEditor::CodeCompletionModel::HighlightingMethod);
+ 
+     // TODO: config enable specifying no highlight as default
+@@ -67,7 +66,20 @@
+     if (highlight.canConvert(QVariant::Int))
+       highlightMethod = highlight.toInt();
+     
+-
++    if( index.row() == m_cachedRow && highlightMethod & KTextEditor::CodeCompletionModel::InternalHighlighting ) {
++        
++        if( index.column() < m_cachedColumnStarts.size() ) {
++            m_currentColumnStart = m_cachedColumnStarts[index.column()];
++        } else {
++            kWarning() << "Column-count does not match";
++        }
++        
++        return m_cachedHighlights;
++    }
++    
++    ///@todo reset the cache when the model changed
++    m_cachedRow = index.row();
++    
+     KTextEditor::Cursor completionStart = widget()->completionRange()->start();
+ 
+     QString startText = document()->text(KTextEditor::Range(completionStart.line(), 0, completionStart.line(), completionStart.column()));
+@@ -76,6 +88,13 @@
+     thisLine->insertText(0, startText);
+ 
+     int len = completionStart.column();
++    m_cachedColumnStarts.clear();
++    
++    if (highlightMethod & KTextEditor::CodeCompletionModel::CustomHighlighting) {
++        m_currentColumnStart = 0;
++        return highlightingFromVariantList(model()->data(index, KTextEditor::CodeCompletionModel::CustomHighlight).toList());
++    }
++    
+     for (int i = 0; i < KTextEditor::CodeCompletionModel::ColumnCount; ++i) {
+       m_cachedColumnStarts.append(len);
+       QString text = model()->data(model()->index(index.row(), i, index.parent()), Qt::DisplayRole).toString();
+@@ -97,10 +116,7 @@
+       document()->highlight()->doHighlight(previousLine.data(), thisLine.data(), foldingList, ctxChanged);
+     }
+ 
+-  if (highlightMethod & KTextEditor::CodeCompletionModel::CustomHighlighting)
+-    return highlightingFromVariantList(model()->data(index, KTextEditor::CodeCompletionModel::CustomHighlight).toList());
+-
+-  m_cachedColumnStart = m_cachedColumnStarts[index.column()];
++  m_currentColumnStart = m_cachedColumnStarts[index.column()];
+   
+   NormalRenderRange rr;
+   QList<QTextLayout::FormatRange> ret = renderer()->decorationsForLine(thisLine, 0, false, &rr, option.state & QStyle::State_Selected);
+--- a/kate/completion/expandingtree/expandingdelegate.cpp
++++ b/kate/completion/expandingtree/expandingdelegate.cpp
+@@ -28,8 +28,6 @@
+ 
+ ExpandingDelegate::ExpandingDelegate(ExpandingWidgetModel* model, QObject* parent)
+   : QItemDelegate(parent)
+-  , m_cachedRow(-1)
+-  , m_cachedRowSelected(false)
+   , m_model(model)
+ {
+ }
+@@ -44,29 +42,21 @@
+     model()->placeExpandingWidget(index);
+ 
+   //Make sure the decorations are painted at the top, because the center of expanded items will be filled with the embedded widget.
+-  option.decorationAlignment = Qt::AlignTop | option.decorationAlignment;
++  option.decorationAlignment = Qt::AlignTop;
+   
+   //kDebug() << "Painting row " << index.row() << ", column " << index.column() << ", internal " << index.internalPointer() << ", drawselected " << option.showDecorationSelected << ", selected " << (option.state & QStyle::State_Selected);
+ 
+-  if ((index.row() != m_cachedRow) || ( ( option.state & QStyle::State_Selected  ) == QStyle::State_Selected ) != m_cachedRowSelected) {
+-    m_cachedColumnStarts.clear();
+-    m_cachedHighlights.clear();
+-    m_cachedColumnStart = 0;
++  m_cachedHighlights.clear();
+ 
+-    if (!model()->indexIsItem(index) ) {
+-      m_cachedRow = -1;
++  if (!model()->indexIsItem(index) )
+       return QItemDelegate::paint(painter, option, index);
+-    }
+ 
+-    m_cachedHighlights = createHighlighting(index, option);
++  m_currentColumnStart = 0;
++  m_cachedHighlights = createHighlighting(index, option);
+ 
+-/*    kDebug() << "Highlights for line:";
+-    foreach (const QTextLayout::FormatRange& fr, m_cachedHighlights)
+-      kDebug() << fr.start << " len " << fr.length << " format ";*/
+-    
+-    m_cachedRow = index.row();
+-    m_cachedRowSelected = option.state & QStyle::State_Selected;
+-  }
++  /*kDebug() << "Highlights for line:";
++  foreach (const QTextLayout::FormatRange& fr, m_cachedHighlights)
++    kDebug() << fr.start << " len " << fr.length << " format ";*/
+ 
+   QItemDelegate::paint(painter, option, index);
+ }
+@@ -106,9 +96,9 @@
+ 
+ void ExpandingDelegate::drawDisplay( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QString & text ) const
+ {
+-  if (m_cachedRow == -1)
++/*  if (m_cachedRow == -1)
+     return QItemDelegate::drawDisplay(painter, option, rect, text);
+-
++*/
+   QTextLayout layout(text, option.font, painter->device());
+ 
+   QRect textRect = rect.adjusted(1, 0, -1, 0); // remove width padding
+@@ -116,21 +106,21 @@
+   QList<QTextLayout::FormatRange> additionalFormats;
+ 
+   for (int i = 0; i < m_cachedHighlights.count(); ++i) {
+-    if (m_cachedHighlights[i].start + m_cachedHighlights[i].length <= m_cachedColumnStart)
++    if (m_cachedHighlights[i].start + m_cachedHighlights[i].length <= m_currentColumnStart)
+       continue;
+ 
+     if (!additionalFormats.count())
+-      if (i != 0 && m_cachedHighlights[i - 1].start + m_cachedHighlights[i - 1].length > m_cachedColumnStart) {
++      if (i != 0 && m_cachedHighlights[i - 1].start + m_cachedHighlights[i - 1].length > m_currentColumnStart) {
+         QTextLayout::FormatRange before;
+         before.start = 0;
+-        before.length = m_cachedHighlights[i - 1].start + m_cachedHighlights[i - 1].length - m_cachedColumnStart;
++        before.length = m_cachedHighlights[i - 1].start + m_cachedHighlights[i - 1].length - m_currentColumnStart;
+         before.format = m_cachedHighlights[i - 1].format;
+         additionalFormats.append(before);
+       }
+ 
+       
+     QTextLayout::FormatRange format;
+-    format.start = m_cachedHighlights[i].start - m_cachedColumnStart;
++    format.start = m_cachedHighlights[i].start - m_currentColumnStart;
+     format.length = m_cachedHighlights[i].length;
+     format.format = m_cachedHighlights[i].format;
+ 
+@@ -139,9 +129,19 @@
+     additionalFormats.append(format);
+   }
+ 
+-  /*kDebug() << "Highlights for text [" << text << "] col start " << m_cachedColumnStart << ":";
+-  foreach (const QTextLayout::FormatRange& fr, m_cachedHighlights)
+-    kDebug() << fr.start << " len " << fr.length << " format " << fr.format.fontWeight();*/
++  if (additionalFormats.isEmpty()) {
++    QTextLayout::FormatRange format;
++    format.start = 0;
++    format.length = text.length();
++    QTextCharFormat fm;
++    fm.setForeground(option.palette.text());
++    format.format = fm;
++    additionalFormats.append(format);
++  }
++
++  /*kDebug() << "Highlights for text [" << text << "] col start " << m_currentColumnStart << ":";
++  foreach (const QTextLayout::FormatRange& fr, additionalFormats)
++    kDebug() << fr.start << " len " << fr.length << "foreground" << fr.format.foreground() << "background" << fr.format.background();*/
+ 
+   layout.setAdditionalFormats(additionalFormats);
+ 
+--- a/kate/completion/expandingtree/expandingdelegate.h
++++ b/kate/completion/expandingtree/expandingdelegate.h
+@@ -69,10 +69,8 @@
+     //Called when an item was expanded/unexpanded and the height changed
+     virtual void heightChanged() const;
+   
+-    mutable int m_cachedRow;
+-    mutable bool m_cachedRowSelected;
+-    mutable int m_cachedColumnStart; //Text-offset for custom highlighting, will be applied to m_cachedHighlights(Only highlights starting after this will be used). Shoult be zero of the highlighting is not taken from kate.
+-    mutable QList<int> m_cachedColumnStarts;
++    mutable int m_currentColumnStart; //Text-offset for custom highlighting, will be applied to m_cachedHighlights(Only highlights starting after this will be used). Shoult be zero of the highlighting is not taken from kate.
++    mutable QList<int> m_currentColumnStarts;
+     mutable QList<QTextLayout::FormatRange> m_cachedHighlights;
+   
+   private:
+--- a/kate/completion/katecompletiondelegate.h
++++ b/kate/completion/katecompletiondelegate.h
+@@ -29,6 +29,8 @@
+     KateCompletionWidget* widget() const;
+     KateDocument* document() const;
+   protected:
++    mutable int m_cachedRow;
++    mutable QList<int> m_cachedColumnStarts;
+     virtual void heightChanged() const;
+     QList<QTextLayout::FormatRange> createHighlighting(const QModelIndex& index, QStyleOptionViewItem& option) const;
+     
+--- a/kate/completion/katecompletionwidget.cpp
++++ b/kate/completion/katecompletionwidget.cpp
+@@ -104,7 +104,7 @@
+   m_updateFocusTimer = new QTimer(this);
+   m_updateFocusTimer->setSingleShot(true);
+   connect(m_updateFocusTimer, SIGNAL(timeout()), this, SLOT(updateFocus()));
+-  
++
+   QSizeGrip* sg = new QSizeGrip(m_statusBar);
+ 
+   QHBoxLayout* statusLayout = new QHBoxLayout(m_statusBar);
+@@ -142,7 +142,7 @@
+ 
+   //We need to do this, because else the focus goes to nirvana without any control when the completion-widget is clicked.
+   setFocusPolicy(Qt::ClickFocus);
+-  
++
+   foreach (QWidget* childWidget, findChildren<QWidget*>())
+     childWidget->setFocusPolicy(Qt::NoFocus);
+ }
+@@ -218,7 +218,7 @@
+   m_isSuspended = false;
+ 
+   m_dontShowArgumentHints = true;
+-  
++
+   if (!word.isValid()) {
+     kWarning(13035) << "Invalid range given to start code completion!";
+     return;
+@@ -242,7 +242,7 @@
+   m_completionRange = view()->doc()->smartManager()->newSmartRange(word);
+   m_completionRange->setInsertBehavior(KTextEditor::SmartRange::ExpandRight);
+   if(!m_completionRange->isValid()) {
+-    kWarning(13035) << "Could not construct valid smart-range from " << word;
++    kWarning(13035) << "Could not construct valid smart-range from" << word << "instead got" << *m_completionRange;
+     abortCompletion();
+     return;
+   }
+@@ -257,7 +257,7 @@
+     m_presentationModel->setCompletionModels(m_sourceModels);
+ 
+   setUpdatesEnabled(false);
+-  
++
+   updatePosition(true);
+ 
+   if (!m_presentationModel->completionModels().isEmpty()) {
+@@ -277,7 +277,7 @@
+       updateArgumentHintGeometry();
+     }
+   }
+-  
++
+   setUpdatesEnabled(true);
+ }
+ 
+@@ -466,12 +466,20 @@
+     return abortCompletion();
+ 
+   toExecute = m_presentationModel->mapToSource(toExecute);
++
++  if (!toExecute.isValid()) {
++    kWarning() << k_funcinfo << "Could not map index" << m_entryList->selectionModel()->currentIndex() << "to source index.";
++    return abortCompletion();
++  }
++
+   KTextEditor::Cursor start = m_completionRange->start();
+ 
+   // encapsulate all editing as being from the code completion, and undo-able in one step.
+   view()->doc()->editStart(true, Kate::CodeCompletionEdit);
+ 
+   KTextEditor::CodeCompletionModel* model = static_cast<KTextEditor::CodeCompletionModel*>(const_cast<QAbstractItemModel*>(toExecute.model()));
++  Q_ASSERT(model);
++
+   model->executeCompletionItem(view()->document(), *m_completionRange, toExecute.row());
+ 
+   view()->doc()->editEnd();
+--- a/kate/view/kateview.cpp
++++ b/kate/view/kateview.cpp
+@@ -614,7 +614,7 @@
+ 
+   a = ac->addAction("beginning_of_document");
+   a->setText(i18n("Move to Beginning of Document"));
+-  a->setShortcuts(KStandardShortcut::home());
++  a->setShortcuts(KStandardShortcut::begin());
+   connect(a, SIGNAL(triggered(bool)), SLOT(top()));
+ 
+   a = ac->addAction("select_beginning_of_line");
+@@ -1251,6 +1251,8 @@
+ 
+   m_toggleWWMarker->setChecked( m_renderer->config()->wordWrapMarker()  );
+ 
++  m_viewInternal->updateBracketMarkAttributes();
++
+   // update the text area
+   m_viewInternal->updateView (true);
+   m_viewInternal->repaint ();
+--- a/kate/view/kateviewinternal.h
++++ b/kate/view/kateviewinternal.h
+@@ -3,6 +3,7 @@
+    Copyright (C) 2002 John Firebaugh <jfirebaugh at kde.org>
+    Copyright (C) 2002 Joseph Wenninger <jowenn at kde.org>
+    Copyright (C) 2002 Christoph Cullmann <cullmann at kde.org>
++   Copyright (C) 2007 Mirko Stocker <me at misto.ch>
+ 
+    Based on:
+      KWriteView : Copyright (C) 1999 Jochen Wilhelmy <digisnap at cs.tu-berlin.de>
+@@ -262,7 +263,8 @@
+     bool m_possibleTripleClick;
+ 
+     // Bracket mark and corresponding decorative ranges
+-    //KateSmartRange *m_bm, *m_bmStart, *m_bmEnd;
++    KateSmartRange *m_bm, *m_bmStart, *m_bmEnd;
++    void updateBracketMarkAttributes();
+ 
+     enum DragState { diNone, diPending, diDragging };
+ 
+--- a/kate/view/kateviewinternal.cpp
++++ b/kate/view/kateviewinternal.cpp
+@@ -63,11 +63,9 @@
+   , m_cursor(doc)
+   , m_mouse()
+   , m_possibleTripleClick (false)
+-#if 0
+   , m_bm(doc->smartManager()->newSmartRange())
+-  , m_bmStart(doc->smartManager()->newSmartRange(KTextEditor::Range()/*, m_bm*/))
+-  , m_bmEnd(doc->smartManager()->newSmartRange(KTextEditor::Range()/*, m_bm*/))
+-#endif
++  , m_bmStart(doc->smartManager()->newSmartRange(KTextEditor::Range(), m_bm))
++  , m_bmEnd(doc->smartManager()->newSmartRange(KTextEditor::Range(), m_bm))
+   , m_dummy (0)
+ 
+   // stay on cursor will avoid that the view scroll around on press return at beginning
+@@ -94,25 +92,8 @@
+   , m_textHintMouseY(-1)
+   , m_smartDirty(false)
+ {
+-#if 0
+-  // Set up bracket marking
+-  static KTextEditor::Attribute::Ptr bracketOutline, bracketFill;
+-  if (!bracketOutline) {
+-    bracketOutline = KTextEditor::Attribute::Ptr(new KTextEditor::Attribute());
+-    bracketOutline->setOutline(m_view->m_renderer->config()->highlightedBracketColor());
+-  }
+-  if (!bracketFill) {
+-    bracketFill = KTextEditor::Attribute::Ptr(new KTextEditor::Attribute());
+-    bracketFill->setBackground(m_view->m_renderer->config()->highlightedBracketColor());
+-    bracketFill->setBackgroundFillWhitespace(false);
+-    bracketFill->setFontBold();
+-  }
+-
+-  m_bm->setAttribute(bracketOutline);
+-  m_bmStart->setAttribute(bracketFill);
+-  m_bmEnd->setAttribute(bracketFill);
+-#endif
+-
++  updateBracketMarkAttributes();
++  
+   setMinimumSize (0,0);
+   setAttribute(Qt::WA_OpaquePaintEvent);
+ 
+@@ -307,7 +288,7 @@
+ 
+     if (thisLine.line() == -1) continue;
+ 
+-    if (thisLine.virtualLine() >= (int)m_doc->numVisLines()) {
++    if (thisLine.virtualLine() >= m_doc->numVisLines()) {
+       // Cache is too out of date
+       return KTextEditor::Cursor(m_doc->numVisLines() - 1, m_doc->lineLength(m_doc->getRealLine(m_doc->numVisLines() - 1)));
+     }
+@@ -405,12 +386,12 @@
+ 
+ void KateViewInternal::scrollNextPage()
+ {
+-  scrollViewLines(qMax( (int)linesDisplayed() - 1, 0 ));
++  scrollViewLines(qMax( linesDisplayed() - 1, 0 ));
+ }
+ 
+ void KateViewInternal::scrollPrevPage()
+ {
+-  scrollViewLines(-qMax( (int)linesDisplayed() - 1, 0 ));
++  scrollViewLines(-qMax( linesDisplayed() - 1, 0 ));
+ }
+ 
+ void KateViewInternal::scrollPrevLine()
+@@ -431,7 +412,7 @@
+   {
+     KTextEditor::Cursor end(m_doc->numVisLines() - 1, m_doc->lineLength(m_doc->getRealLine(m_doc->numVisLines() - 1)));
+ 
+-    m_cachedMaxStartPos = viewLineOffset(end, -((int)linesDisplayed() - 1));
++    m_cachedMaxStartPos = viewLineOffset(end, -(linesDisplayed() - 1));
+   }
+ 
+   m_usePlainLines = false;
+@@ -442,7 +423,7 @@
+ // c is a virtual cursor
+ void KateViewInternal::scrollPos(KTextEditor::Cursor& c, bool force, bool calledExternally)
+ {
+-  if (!force && ((!m_view->dynWordWrap() && c.line() == (int)startLine()) || c == startPos()))
++  if (!force && ((!m_view->dynWordWrap() && c.line() == startLine()) || c == startPos()))
+     return;
+ 
+   if (c.line() < 0)
+@@ -453,7 +434,7 @@
+     c = limit;
+ 
+     // Re-check we're not just scrolling to the same place
+-    if (!force && ((!m_view->dynWordWrap() && c.line() == (int)startLine()) || c == startPos()))
++    if (!force && ((!m_view->dynWordWrap() && c.line() == startLine()) || c == startPos()))
+       return;
+   }
+ 
+@@ -463,8 +444,8 @@
+   // for larger scrolls this makes 2-4 seconds difference on my xeon with dyn. word wrap on
+   // try to get it really working ;)
+   bool viewLinesScrolledUsable = !force
+-                                 && (c.line() >= (int)startLine()-(int)linesDisplayed()-1)
+-                                 && (c.line() <= (int)endLine()+(int)linesDisplayed()+1);
++                                 && (c.line() >= startLine() - linesDisplayed() - 1)
++                                 && (c.line() <= endLine() + linesDisplayed() + 1);
+ 
+   if (viewLinesScrolledUsable)
+     viewLinesScrolled = cache()->displayViewLine(c);
+@@ -477,9 +458,9 @@
+   if (viewLinesScrolledUsable)
+   {
+     int lines = linesDisplayed();
+-    if ((int)m_doc->numVisLines() < lines) {
++    if (m_doc->numVisLines() < lines) {
+       KTextEditor::Cursor end(m_doc->numVisLines() - 1, m_doc->lineLength(m_doc->getRealLine(m_doc->numVisLines() - 1)));
+-      lines = qMin((int)linesDisplayed(), cache()->displayViewLine(end) + 1);
++      lines = qMin(linesDisplayed(), cache()->displayViewLine(end) + 1);
+     }
+ 
+     Q_ASSERT(lines >= 0);
+@@ -488,17 +469,11 @@
+     {
+       updateView(false, viewLinesScrolled);
+ 
+-      int scrollHeight = -(viewLinesScrolled * (int)renderer()->fontHeight());
+-      //int scrollbarWidth = m_lineScroll->width();
++      int scrollHeight = -(viewLinesScrolled * renderer()->fontHeight());
+ 
+-      //
+-      // updates are for working around the scrollbar leaving blocks in the view
+-      //
+       scroll(0, scrollHeight);
+-      //update(0, height()+scrollHeight-scrollbarWidth, width(), 2*scrollbarWidth);
+-
+       m_leftBorder->scroll(0, scrollHeight);
+-      //m_leftBorder->update(0, m_leftBorder->height()+scrollHeight-scrollbarWidth, m_leftBorder->width(), 2*scrollbarWidth);
++
+       emit m_view->verticalScrollPositionChanged( m_view, c );
+       return;
+     }
+@@ -633,7 +608,7 @@
+   }
+   else if ( c > viewLineOffset(endPos(), -m_minLinesVisible) )
+   {
+-    KTextEditor::Cursor scroll = viewLineOffset(c, -((int)linesDisplayed() - m_minLinesVisible - 1));
++    KTextEditor::Cursor scroll = viewLineOffset(c, -(linesDisplayed() - m_minLinesVisible - 1));
+     scrollPos(scroll, false, calledExternally);
+   }
+   else if ( c < viewLineOffset(startPos(), m_minLinesVisible) )
+@@ -1411,7 +1386,7 @@
+     return;
+   }
+ 
+-  if ((m_displayCursor.line() >= (int)m_doc->numVisLines() - 1) && (!m_view->dynWordWrap() || cache()->viewLine(m_cursor) == cache()->lastViewLine(m_cursor.line())))
++  if ((m_displayCursor.line() >= m_doc->numVisLines() - 1) && (!m_view->dynWordWrap() || cache()->viewLine(m_cursor) == cache()->lastViewLine(m_cursor.line())))
+     return;
+ 
+   m_preserveMaxX = true;
+@@ -1519,7 +1494,7 @@
+   if (cursorStart < m_minLinesVisible)
+     lineadj -= m_minLinesVisible - cursorStart;
+ 
+-  int linesToScroll = -qMax( ((int)linesDisplayed() - 1) - lineadj, 0 );
++  int linesToScroll = -qMax( (linesDisplayed() - 1) - lineadj, 0 );
+   m_preserveMaxX = true;
+ 
+   if (!m_doc->pageUpDownMovesCursor () && !atTop) {
+@@ -1564,7 +1539,7 @@
+   if (cursorStart > 0)
+     lineadj -= cursorStart;
+ 
+-  int linesToScroll = qMax( ((int)linesDisplayed() - 1) - lineadj, 0 );
++  int linesToScroll = qMax( (linesDisplayed() - 1) - lineadj, 0 );
+   m_preserveMaxX = true;
+ 
+   if (!m_doc->pageUpDownMovesCursor () && !atEnd) {
+@@ -1793,9 +1768,9 @@
+   {
+     int oldSelectionStartLine = m_view->selectionRange().start().line();
+     int oldSelectionEndLine = m_view->selectionRange().end().line();
+-    
++
+     m_view->clearSelection();
+-    
++
+     cache()->relayoutLines(oldSelectionStartLine, oldSelectionEndLine);
+     cache()->updateViewCache(startPos());
+ 
+@@ -1864,18 +1839,27 @@
+   emit m_view->cursorPositionChanged(m_view, m_cursor);
+ }
+ 
++void KateViewInternal::updateBracketMarkAttributes()
++{
++  KTextEditor::Attribute::Ptr bracketFill = KTextEditor::Attribute::Ptr(new KTextEditor::Attribute());
++  bracketFill->setBackground(m_view->m_renderer->config()->highlightedBracketColor());
++  bracketFill->setBackgroundFillWhitespace(false);
++  bracketFill->setFontBold();
++  
++  m_bmStart->setAttribute(bracketFill);
++  m_bmEnd->setAttribute(bracketFill);
++}
++
+ void KateViewInternal::updateBracketMarks()
+ {
+-#if 0
++  m_doc->removeHighlightFromView(m_view, m_bmStart);
++  m_doc->removeHighlightFromView(m_view, m_bmEnd);
++
+   if ( m_bm->isValid() ) {
+-    tagRange(*m_bm, true);
+     tagRange(*m_bmStart, true);
+     tagRange(*m_bmEnd, true);
+   }
+ 
+-  //m_bmStart->setValid(false);
+-  //m_bmEnd->setValid(false);
+-
+   // add some limit to this, this is really endless on big files without limit
+   int maxLines = linesDisplayed () * 3;
+   m_doc->newBracketMark( m_cursor, *m_bm, maxLines );
+@@ -1883,19 +1867,16 @@
+   if ( m_bm->isValid() ) {
+     m_bmStart->start() = m_bm->start();
+     m_bmStart->end().setPosition(m_bm->start().line(), m_bm->start().column() + 1);
+-    //m_bmStart->setValid(true);
+ 
+     m_bmEnd->start() = m_bm->end();
+-    m_bmEnd->end().setPosition(m_bm->end().line(), m_bmEnd->end().column() + 1);
+-    //m_bmEnd->setValid(true);
+-
+-    m_bm->end().setColumn(m_bm->end().column() + 1);
++    m_bmEnd->end().setPosition(m_bm->end().line(), m_bm->end().column() + 1);
+ 
+-    tagRange(*m_bm, true);
+     tagRange(*m_bmStart, true);
+     tagRange(*m_bmEnd, true);
++
++    m_doc->addHighlightToView(m_view, m_bmStart, true);
++    m_doc->addHighlightToView(m_view, m_bmEnd, true);
+   }
+-#endif
+ }
+ 
+ bool KateViewInternal::tagLine(const KTextEditor::Cursor& virtualCursor)
+@@ -1935,7 +1916,7 @@
+   }
+   if (start.line() > endLine())
+   {
+-    //kDebug(13030)<<"start> endLine"<<start<<" "<<((int)endLine());
++    //kDebug(13030)<<"start> endLine"<<start<<" "<<(endLine());
+     return false;
+   }
+ 
+@@ -1959,7 +1940,7 @@
+     int y = lineToY( start.line() );
+     // FIXME is this enough for when multiple lines are deleted
+     int h = (end.line() - start.line() + 2) * renderer()->fontHeight();
+-    if (end.line() == (int)m_doc->numVisLines() - 1)
++    if (end.line() == m_doc->numVisLines() - 1)
+       h = height();
+ 
+     m_leftBorder->update (0, y, m_leftBorder->width(), h);
+@@ -2014,7 +1995,7 @@
+ {
+   KateTextLayout thisLine = yToKateTextLayout(p.y());
+   KTextEditor::Cursor c;
+-  
++
+   if (!thisLine.isValid()) // probably user clicked below the last line -> use the last line
+     thisLine = cache()->textLayout(m_doc->lines() - 1, -1);
+ 
+@@ -2076,7 +2057,8 @@
+       }
+       else if ( !((k->modifiers() & Qt::ControlModifier) || (k->modifiers() & Qt::AltModifier)) )
+       {
+-        return false;
++        keyPressEvent( k );
++        return k->isAccepted();
+       }
+ 
+     } break;
+@@ -2153,7 +2135,7 @@
+     int pos = line->firstChar();
+     if (pos > m_cursor.column()) pos = m_cursor.column();
+     if (pos != -1) {
+-      while ((int)line->length() > pos &&
++      while (line->length() > pos &&
+              !line->at(pos).isLetterOrNumber() &&
+              pos < m_cursor.column()) ++pos;
+     } else {
+@@ -2688,7 +2670,6 @@
+     updateRegion += QRect(0, currentRectStart, width(), currentRectEnd);
+ 
+   if (!updateRegion.isEmpty()) {
+-    //kDebug() << "Requesting update to " << updateRegion.boundingRect();
+     update(updateRegion);
+   }
+ }
+@@ -2702,8 +2683,7 @@
+     doUpdateView();
+ #endif
+ 
+-  //kDebug (13030) << "GOT PAINT EVENT: x: " << e->rect().x() << " y: " << e->rect().y()
+-  //  << " width: " << e->rect().width() << " height: " << e->rect().height() << endl;
++  //kDebug (13030) << "GOT PAINT EVENT: Region" << e->region();
+ 
+   int xStart = startX() + e->rect().x();
+   int xEnd = xStart + e->rect().width();
+@@ -2824,7 +2804,7 @@
+ {
+   if (m_scrollX || m_scrollY)
+   {
+-    scrollLines (startPos().line() + (m_scrollY / (int)renderer()->fontHeight()));
++    scrollLines (startPos().line() + (m_scrollY / renderer()->fontHeight()));
+     placeCursor( QPoint( m_mouseX, m_mouseY ), true );
+   }
+ }
+@@ -2994,10 +2974,6 @@
+         scrollNextPage();
+     } else {
+       scrollViewLines(-((e->delta() / 120) * QApplication::wheelScrollLines()));
+-      // maybe a menu was opened or a bubbled window title is on us -> we shall erase it
+-      // FIXME this is the wrong place for this "fix"
+-      update();
+-      m_leftBorder->update();
+     }
+ 
+   } else if (columnScrollingPossible()) {
+@@ -3305,11 +3281,15 @@
+       if (newRange && !oldRange)
+         enterStack.prepend(newRange);
+ 
+-      foreach (KTextEditor::SmartRange* exitedRange, exitStack)
++      foreach (KTextEditor::SmartRange* exitedRange, exitStack) {
+         endDynamic(hl, static_cast<KateSmartRange*>(exitedRange), mouse ? KTextEditor::Attribute::ActivateMouseIn : KTextEditor::Attribute::ActivateCaretIn);
++        static_cast<KateSmartRange*>(exitedRange)->feedbackMouseCaretChange(m_view, mouse, false);
++      }
+ 
+-      foreach (KTextEditor::SmartRange* enteredRange, enterStack)
++      foreach (KTextEditor::SmartRange* enteredRange, enterStack) {
++        static_cast<KateSmartRange*>(enteredRange)->feedbackMouseCaretChange(m_view, mouse, true);
+         startDynamic(hl, static_cast<KateSmartRange*>(enteredRange), mouse ? KTextEditor::Attribute::ActivateMouseIn : KTextEditor::Attribute::ActivateCaretIn);
++      }
+ 
+       if (mouse)
+         hl->mouseOver = static_cast<KateSmartRange*>(newRange);
+--- a/kate/CMakeLists.txt
++++ b/kate/CMakeLists.txt
+@@ -25,7 +25,6 @@
+   ${CMAKE_CURRENT_SOURCE_DIR}/syntax
+   ${CMAKE_CURRENT_SOURCE_DIR}/utils
+   ${CMAKE_CURRENT_SOURCE_DIR}/view
+-  ${CMAKE_SOURCE_DIR}/kdeprint
+   ${CMAKE_SOURCE_DIR}/kde3support
+   ${CMAKE_SOURCE_DIR}/kde3support/kdeui
+   ${CMAKE_SOURCE_DIR}/kjsembed
+@@ -145,7 +144,7 @@
+ kde4_add_plugin(katepart ${katepart_PART_SRCS})
+ 
+ # linking
+-target_link_libraries(katepart ${KDE4_KDECORE_LIBS} kutils ktexteditor kdeprint kjs kde3support )
++target_link_libraries(katepart ${KDE4_KDECORE_LIBS} kutils ktexteditor kjs kde3support )
+ 
+ if(KDE4_ENABLE_FINAL)
+ 	macro_add_file_dependencies(${CMAKE_CURRENT_BINARY_DIR}/katepart_final_cpp.cpp ${CMAKE_CURRENT_BINARY_DIR}/katejscript.lut.h )
+@@ -174,7 +173,7 @@
+ 
+ kde4_add_executable(testkateregression NOGUI RUN_UNINSTALLED ${testkateregression_SRCS})
+ 
+-target_link_libraries(testkateregression  ${KDE4_KDECORE_LIBS} kutils ktexteditor kdeprint kjs kde3support )
++target_link_libraries(testkateregression  ${KDE4_KDECORE_LIBS} kutils ktexteditor kjs kde3support )
+ 
+ #add_dependencies(check testkateregression)
+ 
+--- a/kate/document/katecursor.cpp
++++ b/kate/document/katecursor.cpp
+@@ -107,7 +107,7 @@
+   int nbCharLeft = nbChar - nbCharsOnLineAfter();
+ 
+   if(nbCharLeft > 0) {
+-    return gotoNextLine() && moveForward((uint)nbCharLeft);
++    return gotoNextLine() && moveForward((uint)nbCharLeft - 1);
+   } else {
+     m_column += nbChar;
+     return true;
+@@ -118,7 +118,7 @@
+ {
+   int nbCharLeft = nbChar - m_column;
+   if(nbCharLeft > 0) {
+-    return gotoEndOfPreviousLine() && moveBackward((uint)nbCharLeft);
++    return gotoEndOfPreviousLine() && moveBackward((uint)nbCharLeft - 1);
+   } else {
+     m_column -= nbChar;
+     return true;
+--- a/kate/document/katedocument.cpp
++++ b/kate/document/katedocument.cpp
+@@ -3,6 +3,7 @@
+    Copyright (C) 2001 Joseph Wenninger <jowenn at kde.org>
+    Copyright (C) 1999 Jochen Wilhelmy <digisnap at cs.tu-berlin.de>
+    Copyright (C) 2006 Hamish Rodda <rodda at kde.org>
++   Copyright (C) 2007 Mirko Stocker <me at misto.ch>
+ 
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+@@ -438,6 +439,11 @@
+ 
+ QString KateDocument::text( const KTextEditor::Range& range, bool blockwise ) const
+ {
++  if (!range.isValid()) {
++    kWarning() << k_funcinfo << "Text requested for invalid range" << range;
++    return QString();
++  }
++  
+   if ( blockwise && (range.start().column() > range.end().column()) )
+     return QString ();
+ 
+@@ -501,8 +507,10 @@
+ {
+   QStringList ret;
+ 
+-  if (!range.isValid())
++  if (!range.isValid()) {
++    kWarning() << k_funcinfo << "Text requested for invalid range" << range;
+     return ret;
++  }
+ 
+   if ( blockwise && (range.start().column() > range.end().column()) )
+     return ret;
+@@ -1558,7 +1566,9 @@
+ 
+   KTextEditor::Range rangeRemoved(line, 0, line, oldText.length());
+ 
+-  if (line) {
++  if (line < lastLine()) {
++    rangeRemoved.end().setPosition(line + 1, 0);
++  } else if (line) {
+     KateTextLine::Ptr prevLine = plainKateTextLine(line - 1);
+     rangeRemoved.start().setPosition(line - 1, prevLine->length());
+   }
+@@ -3421,12 +3431,12 @@
+   if (!suppressOpeningErrorDialogs())
+   {
+     if (!success)
+-      KMessageBox::error (widget(), i18n ("The file %1 could not be loaded, as it was not possible to read from it.\n\nCheck if you have read access to this file.", this->url().url()));
++      KMessageBox::error (widget(), i18n ("The file %1 could not be loaded, as it was not possible to read from it.\n\nCheck if you have read access to this file.", this->url().pathOrUrl()));
+   }
+ 
+   if (!success) {
+     setOpeningError(true);
+-    setOpeningErrorMessage(i18n ("The file %1 could not be loaded, as it was not possible to read from it.\n\nCheck if you have read access to this file.",this->url().url()));
++    setOpeningErrorMessage(i18n ("The file %1 could not be loaded, as it was not possible to read from it.\n\nCheck if you have read access to this file.",this->url().pathOrUrl()));
+   }
+ 
+   // warn -> opened binary file!!!!!!!
+@@ -3437,12 +3447,12 @@
+ 
+     if(!suppressOpeningErrorDialogs())
+       KMessageBox::information (widget()
+-        , i18n ("The file %1 is a binary, saving it will result in a corrupt file.", this->url().url())
++        , i18n ("The file %1 is a binary, saving it will result in a corrupt file.", this->url().pathOrUrl())
+         , i18n ("Binary File Opened")
+         , "Binary File Opened Warning");
+ 
+     setOpeningError(true);
+-    setOpeningErrorMessage(i18n ("The file %1 is a binary, saving it will result in a corrupt file.", this->url().url()));
++    setOpeningErrorMessage(i18n ("The file %1 is a binary, saving it will result in a corrupt file.", this->url().pathOrUrl()));
+   }
+ 
+   // warn: opened broken utf-8 file...
+@@ -3455,13 +3465,13 @@
+       KMessageBox::information (widget()
+         , i18n ("The file %1 was opened with UTF-8 encoding but contained invalid characters."
+                 " It is set to read-only mode, as saving might destroy it's content."
+-                " Either reopen the file with the correct encoding chosen or enable the read-write mode again in the menu to be able to edit it.", this->url().url())
++                " Either reopen the file with the correct encoding chosen or enable the read-write mode again in the menu to be able to edit it.", this->url().pathOrUrl())
+         , i18n ("Broken UTF-8 File Opened")
+         , "Broken UTF-8 File Opened Warning");
+     setOpeningError(true);
+     setOpeningErrorMessage(i18n ("The file %1 was opened with UTF-8 encoding but contained invalid characters."
+               " It is set to read-only mode, as saving might destroy it's content."
+-              " Either reopen the file with the correct encoding chosen or enable the read-write mode again in the menu to be able to edit it.", this->url().url()));
++              " Either reopen the file with the correct encoding chosen or enable the read-write mode again in the menu to be able to edit it.", this->url().pathOrUrl()));
+   }
+ 
+   //
+@@ -3476,7 +3486,7 @@
+   // warn -> try to save binary file!!!!!!!
+   //
+   if (m_buffer->binary() && (KMessageBox::warningContinueCancel (widget()
+-        , i18n ("The file %1 is a binary, saving it will result in a corrupt file.", url().url())
++        , i18n ("The file %1 is a binary, saving it will result in a corrupt file.", url().pathOrUrl())
+         , i18n ("Trying to Save Binary File")
+         , KGuiItem(i18n("Save Nevertheless"))
+         , KStandardGuiItem::cancel(), "Binary File Save Warning") != KMessageBox::Continue))
+@@ -3575,7 +3585,7 @@
+     if (!backupSuccess && (KMessageBox::warningContinueCancel (widget()
+         , i18n ("For file %1 no backup copy could be created before saving."
+                 " If an error occurs while saving, you might lose the data of this file."
+-                " A reason could be that the media you write to is full or the directory of the file is read-only for you.", url().url())
++                " A reason could be that the media you write to is full or the directory of the file is read-only for you.", url().pathOrUrl())
+         , i18n ("Failed to create backup copy.")
+         , KGuiItem(i18n("Try to Save Nevertheless"))
+         , KStandardGuiItem::cancel(), "Backup Failed Warning") != KMessageBox::Continue))
+@@ -3608,7 +3618,7 @@
+     // add m_file again to dirwatch
+     activateDirWatch (oldPath);
+ 
+-    KMessageBox::error (widget(), i18n ("The document could not be saved, as it was not possible to write to %1.\n\nCheck that you have write access to this file or that enough disk space is available.", this->url().url()));
++    KMessageBox::error (widget(), i18n ("The document could not be saved, as it was not possible to write to %1.\n\nCheck that you have write access to this file or that enough disk space is available.", this->url().pathOrUrl()));
+ 
+     return false;
+   }
+@@ -5012,54 +5022,48 @@
+   }
+ 
+   bool forward = isStartBracket( bracket );
+-  int startAttr = textLine->attribute( range.start().column() );
+-  uint count = 0;
+-  int lines = 0;
+-  range.end() = range.start();
++  uint nesting = 0;
+ 
+-  while( true ) {
+-    /* Increment or decrement, check base cases */
+-    if( forward ) {
+-      if( range.end().column() + 1 < lineLength( range.end().line() ) ) {
+-        range.end().setColumn(range.end().column() + 1);
++  int minLine = qMax( range.start().line() - maxLines, 0 );
++  int maxLine = qMin( range.start().line() + maxLines, documentEnd().line() );
++  
++  range.end() = range.start();
++  KateDocCursor cursor(range.start(), this);
++  uchar validAttr = cursor.currentAttrib();
++  
++  while( cursor.line() >= minLine && cursor.line() <= maxLine ) {
+ 
+-      } else {
+-        if( range.end().line() >= (int)lastLine() )
+-          return false;
+-        range.end().setPosition(range.end().line() + 1, 0);
+-        textLine = m_buffer->plainLine( range.end().line() );
+-        lines++;
+-      }
+-    } else {
+-      if( range.end().column() > 0 ) {
+-        range.end().setColumn(range.end().column() - 1);
++    if( forward )
++      cursor.moveForward(1);
++    else
++      cursor.moveBackward(1);
+ 
+-      } else {
+-        if( range.end().line() <= 0 )
+-          return false;
+-        range.end().setPosition(range.end().line() - 1, lineLength( range.end().line() ) - 1);
+-        textLine = m_buffer->plainLine( range.end().line() );
+-        lines++;
++    if( !cursor.validPosition() )
++      return false;
++    
++    if( cursor.currentAttrib() == validAttr )
++    {
++      /* Check for match */
++      QChar c = cursor.currentChar();
++      if( c == bracket ) {
++        nesting++;
++      } else if( c == opposite ) {
++        if( nesting == 0 ) {
++          if( forward ) 
++            range.end() = cursor;
++          else
++            range.start() = cursor;
++          return true;
++        }
++        nesting--;
+       }
+     }
+ 
+-    if ((maxLines != -1) && (lines > maxLines))
++    if(cursor == KTextEditor::Cursor(0,0) || cursor >= documentEnd())
+       return false;
+-
+-    /* Easy way to skip comments */
+-    if( textLine->attribute( range.end().column() ) != startAttr )
+-      continue;
+-
+-    /* Check for match */
+-    QChar c = textLine->at( range.end().column() );
+-    if( c == bracket ) {
+-      count++;
+-    } else if( c == opposite ) {
+-      if( count == 0 )
+-        return true;
+-      count--;
+-    }
+   }
++
++  return false;
+ }
+ 
+ void KateDocument::guiActivateEvent( KParts::GUIActivateEvent *ev )
+@@ -5790,13 +5794,13 @@
+   switch( m_modOnHdReason )
+   {
+     case OnDiskModified:
+-      return i18n("The file '%1' was modified by another program.",  url().prettyUrl() );
++      return i18n("The file '%1' was modified by another program.",  url().pathOrUrl() );
+       break;
+     case OnDiskCreated:
+-      return i18n("The file '%1' was created by another program.",  url().prettyUrl() );
++      return i18n("The file '%1' was created by another program.",  url().pathOrUrl() );
+       break;
+     case OnDiskDeleted:
+-      return i18n("The file '%1' was deleted by another program.",  url().prettyUrl() );
++      return i18n("The file '%1' was deleted by another program.",  url().pathOrUrl() );
+       break;
+     default:
+       return QString();
+--- a/kjsembed/kjsembed/slotproxy.h
++++ b/kjsembed/kjsembed/slotproxy.h
+@@ -57,6 +57,7 @@
+             QByteArray m_stringData;
+             KJS::Interpreter *m_interpreter;
+             KJS::JSObject *m_object;
++            QVariant m_tmpResult;
+     };
+ }
+ #endif
+--- a/kjsembed/kjsembed/slotproxy.cpp
++++ b/kjsembed/kjsembed/slotproxy.cpp
+@@ -110,6 +110,9 @@
+     KJS::JSValue *retValue;
+     if ( !fun->implementsCall() )
+     {
++#ifdef DEBUG_SLOTPROXY
++        qDebug() << "SlotProxy::callMethod got bad handler";
++#endif
+         QString msg = i18n( "Bad slot handler: Object %1 Identifier %2 Method %3 Signature: %4.",
+                             m_object->className().ascii(),
+                             id.ascii(),
+@@ -123,6 +126,9 @@
+     
+     if( exec->hadException() )
+     {
++#ifdef DEBUG_SLOTPROXY
++        qDebug() << "SlotProxy::callMethod had exception";
++#endif
+         if (m_interpreter->shouldPrintExceptions())
+         {
+             KJS::JSLock lock;
+@@ -289,7 +295,7 @@
+ 
+ int SlotProxy::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
+ {
+-#if defined(DEBUG_SLOTPROXY) && (DEBUG_SLOTPROXY > 1)
++#ifdef DEBUG_SLOTPROXY
+ 	qDebug("SlotProxy::qt_metacall(_c=%d, _id=%d, _a=%p _a[0]=%p _a[1]=%p) obj=", _c, _id, _a, _a[0], _a[1], this);
+ #endif
+     _id = QObject::qt_metacall(_c, _id, _a);
+@@ -299,11 +305,16 @@
+     {
+         switch (_id)
+         {
+-            case 0:
++            case 0: {
+                 // invoke js method here
+                 QByteArray method = m_signature.left(m_signature.indexOf('('));
+-                callMethod(method, _a);
+-                break;
++                KJS::JSValue *result = callMethod(method, _a);
++                m_tmpResult = convertToVariant(m_interpreter->globalExec(), result);
++#ifdef DEBUG_SLOTPROXY
++                qDebug()<<"SlotProxy::qt_metacall result="<<m_tmpResult.toString();
++#endif
++                _a[0] = &(m_tmpResult);
++            } break;
+         }
+         _id -= 1;
+     }
+--- a/kjs/value.cpp
++++ b/kjs/value.cpp
+@@ -97,6 +97,11 @@
+     return KJS::toUInt16(const_cast<JSValue*>(this)->toNumber(exec));
+ }
+ 
++float JSValue::toFloat(ExecState* exec) const
++{
++    return static_cast<float>(toNumber(exec));
++}
++
+ bool JSCell::getNumber(double &numericValue) const
+ {
+     if (!isNumber())
+--- a/kjs/lexer.cpp
++++ b/kjs/lexer.cpp
+@@ -137,6 +137,8 @@
+ 
+ void Lexer::shift(unsigned int p)
+ {
++  // Here would be a good place to strip Cf characters, but that has caused compatibility problems:
++  // <http://bugs.webkit.org/show_bug.cgi?id=10183>.
+   while (p--) {
+     current = next1;
+     next1 = next2;
+--- a/kjs/wtf/Platform.h
++++ b/kjs/wtf/Platform.h
+@@ -117,8 +117,15 @@
+ 
+ #if defined(arm)
+ #define WTF_PLATFORM_ARM 1
++#if defined(__ARMEB__)
++#define WTF_PLATFORM_BIG_ENDIAN 1
++#elif !defined(__ARM_EABI__) && !defined(__ARMEB__)
+ #define WTF_PLATFORM_MIDDLE_ENDIAN 1
+ #endif
++#if !defined(__ARM_EABI__)
++#define WTF_PLATFORM_FORCE_PACK 1
++#endif
++#endif
+ 
+ /* PLATFORM(X86) */
+ #if   defined(__i386__) \
+--- a/kjs/nodes2string.cpp
++++ b/kjs/nodes2string.cpp
+@@ -466,12 +466,12 @@
+ 
+ void UnaryPlusNode::streamTo(SourceStream &s) const
+ {
+-  s << '+' << expr;
++  s << "+ " << expr;
+ }
+ 
+ void NegateNode::streamTo(SourceStream &s) const
+ {
+-  s << '-' << expr;
++  s << "- " << expr;
+ }
+ 
+ void BitwiseNotNode::streamTo(SourceStream &s) const
+@@ -664,14 +664,14 @@
+ 
+ void VarDeclListNode::streamTo(SourceStream &s) const
+ {
+-  s << var;
++  s << "var " << var;
+   for (VarDeclListNode *n = next.get(); n; n = n->next.get())
+     s << ", " << n->var;
+ }
+ 
+ void VarStatementNode::streamTo(SourceStream &s) const
+ {
+-  s << SourceStream::Endl << "var " << next << ';';
++  s << SourceStream::Endl << next << ';';
+ }
+ 
+ void StaticVarStatementNode::streamTo(SourceStream &s) const
+@@ -720,7 +720,7 @@
+ void ForNode::streamTo(SourceStream &s) const
+ {
+   s << SourceStream::Endl << "for ("
+-    << expr1  // TODO: doesn't properly do "var i = 0"
++    << expr1
+     << "; " << expr2
+     << "; " << expr3
+     << ')' << SourceStream::Indent << statement << SourceStream::Unindent;
+@@ -734,8 +734,6 @@
+   else
+     s << lexpr;
+ 
+-  if (init)
+-    s << " = " << init;
+   s << " in " << expr << ')' << SourceStream::Indent
+     << statement << SourceStream::Unindent;
+ }
+--- a/kjs/grammar.cpp
++++ b/kjs/grammar.cpp
+@@ -313,7 +313,7 @@
+   PropertyNameNode   *pname;
+   PackageNameNode     *pkgn;
+ }
+-/* Line 193 of yacc.c.  */
++/* Line 187 of yacc.c.  */
+ #line 318 "grammar.tab.c"
+ 	YYSTYPE;
+ # define yystype YYSTYPE /* obsolescent; will be withdrawn */
+@@ -556,7 +556,7 @@
+ /* YYFINAL -- State number of the termination state.  */
+ #define YYFINAL  212
+ /* YYLAST -- Last index in YYTABLE.  */
+-#define YYLAST   1480
++#define YYLAST   1479
+ 
+ /* YYNTOKENS -- Number of terminals.  */
+ #define YYNTOKENS  89
+@@ -565,7 +565,7 @@
+ /* YYNRULES -- Number of rules.  */
+ #define YYNRULES  311
+ /* YYNRULES -- Number of states.  */
+-#define YYNSTATES  547
++#define YYNSTATES  546
+ 
+ /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+ #define YYUNDEFTOK  2
+@@ -640,14 +640,14 @@
+      646,   648,   650,   652,   654,   656,   658,   660,   662,   664,
+      667,   671,   675,   679,   681,   685,   687,   691,   693,   696,
+      698,   701,   705,   709,   711,   715,   717,   720,   723,   726,
+-     728,   731,   734,   740,   748,   756,   764,   770,   780,   791,
+-     799,   808,   818,   819,   821,   822,   824,   827,   830,   834,
+-     838,   841,   844,   848,   852,   855,   858,   862,   866,   872,
+-     878,   882,   888,   889,   891,   893,   896,   900,   905,   908,
+-     912,   916,   920,   924,   929,   937,   947,   950,   953,   955,
+-     959,   965,   971,   975,   979,   985,   991,   997,  1004,  1009,
+-    1015,  1021,  1028,  1030,  1034,  1037,  1041,  1042,  1044,  1046,
+-    1049,  1051
++     728,   731,   734,   740,   748,   756,   763,   769,   779,   790,
++     798,   807,   817,   818,   820,   821,   823,   826,   829,   833,
++     837,   840,   843,   847,   851,   854,   857,   861,   865,   871,
++     877,   881,   887,   888,   890,   892,   895,   899,   904,   907,
++     911,   915,   919,   923,   928,   936,   946,   949,   952,   954,
++     958,   964,   970,   974,   978,   984,   990,   996,  1003,  1008,
++    1014,  1020,  1027,  1029,  1033,  1036,  1040,  1041,  1043,  1045,
++    1048,  1050
+ };
+ 
+ /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+@@ -729,36 +729,36 @@
+       -1,   151,     1,    -1,    18,    67,   149,    68,   152,    -1,
+       18,    67,   149,    68,   152,    35,   152,    -1,    20,   152,
+       21,    67,   149,    68,    88,    -1,    20,   152,    21,    67,
+-     149,    68,     1,    -1,    21,    67,   149,    68,   152,    -1,
+-       9,    67,   169,    88,   168,    88,   168,    68,   152,    -1,
+-       9,    67,    11,   156,    88,   168,    88,   168,    68,   152,
+-      -1,     9,    67,   108,    22,   149,    68,   152,    -1,     9,
+-      67,    11,    62,    22,   149,    68,   152,    -1,     9,    67,
+-      11,    62,   163,    22,   149,    68,   152,    -1,    -1,   149,
+-      -1,    -1,   150,    -1,    13,    88,    -1,    13,     1,    -1,
+-      13,    62,    88,    -1,    13,    62,     1,    -1,     6,    88,
+-      -1,     6,     1,    -1,     6,    62,    88,    -1,     6,    62,
+-       1,    -1,    15,    88,    -1,    15,     1,    -1,    15,   149,
+-      88,    -1,    15,   149,     1,    -1,    26,    67,   149,    68,
+-     152,    -1,    25,    67,   149,    68,   175,    -1,    70,   176,
+-      71,    -1,    70,   176,   179,   176,    71,    -1,    -1,   177,
+-      -1,   178,    -1,   177,   178,    -1,     7,   149,    66,    -1,
+-       7,   149,    66,   191,    -1,     8,    66,    -1,     8,    66,
+-     191,    -1,    62,    66,   152,    -1,    28,   149,    88,    -1,
+-      28,   149,     1,    -1,    29,   153,    31,   153,    -1,    29,
+-     153,    30,    67,    62,    68,   153,    -1,    29,   153,    30,
+-      67,    62,    68,   153,    31,   153,    -1,    32,    88,    -1,
+-      32,     1,    -1,    62,    -1,   184,    74,    62,    -1,    33,
+-     184,    74,    79,    88,    -1,    33,   184,    74,    79,     1,
+-      -1,    33,   184,    88,    -1,    33,   184,     1,    -1,    33,
+-      62,    87,   184,    88,    -1,    33,    62,    87,   184,     1,
+-      -1,    14,    62,    67,    68,   189,    -1,    14,    62,    67,
+-     188,    68,   189,    -1,    14,    67,    68,   189,    -1,    14,
+-      67,   188,    68,   189,    -1,    14,    62,    67,    68,   189,
+-      -1,    14,    62,    67,   188,    68,   189,    -1,    62,    -1,
+-     188,    69,    62,    -1,    70,    71,    -1,    70,   191,    71,
+-      -1,    -1,   191,    -1,   192,    -1,   191,   192,    -1,   186,
+-      -1,   152,    -1
++     149,    68,    -1,    21,    67,   149,    68,   152,    -1,     9,
++      67,   169,    88,   168,    88,   168,    68,   152,    -1,     9,
++      67,    11,   156,    88,   168,    88,   168,    68,   152,    -1,
++       9,    67,   108,    22,   149,    68,   152,    -1,     9,    67,
++      11,    62,    22,   149,    68,   152,    -1,     9,    67,    11,
++      62,   163,    22,   149,    68,   152,    -1,    -1,   149,    -1,
++      -1,   150,    -1,    13,    88,    -1,    13,     1,    -1,    13,
++      62,    88,    -1,    13,    62,     1,    -1,     6,    88,    -1,
++       6,     1,    -1,     6,    62,    88,    -1,     6,    62,     1,
++      -1,    15,    88,    -1,    15,     1,    -1,    15,   149,    88,
++      -1,    15,   149,     1,    -1,    26,    67,   149,    68,   152,
++      -1,    25,    67,   149,    68,   175,    -1,    70,   176,    71,
++      -1,    70,   176,   179,   176,    71,    -1,    -1,   177,    -1,
++     178,    -1,   177,   178,    -1,     7,   149,    66,    -1,     7,
++     149,    66,   191,    -1,     8,    66,    -1,     8,    66,   191,
++      -1,    62,    66,   152,    -1,    28,   149,    88,    -1,    28,
++     149,     1,    -1,    29,   153,    31,   153,    -1,    29,   153,
++      30,    67,    62,    68,   153,    -1,    29,   153,    30,    67,
++      62,    68,   153,    31,   153,    -1,    32,    88,    -1,    32,
++       1,    -1,    62,    -1,   184,    74,    62,    -1,    33,   184,
++      74,    79,    88,    -1,    33,   184,    74,    79,     1,    -1,
++      33,   184,    88,    -1,    33,   184,     1,    -1,    33,    62,
++      87,   184,    88,    -1,    33,    62,    87,   184,     1,    -1,
++      14,    62,    67,    68,   189,    -1,    14,    62,    67,   188,
++      68,   189,    -1,    14,    67,    68,   189,    -1,    14,    67,
++     188,    68,   189,    -1,    14,    62,    67,    68,   189,    -1,
++      14,    62,    67,   188,    68,   189,    -1,    62,    -1,   188,
++      69,    62,    -1,    70,    71,    -1,    70,   191,    71,    -1,
++      -1,   191,    -1,   192,    -1,   191,   192,    -1,   186,    -1,
++     152,    -1
+ };
+ 
+ /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+@@ -929,7 +929,7 @@
+        1,     1,     1,     1,     1,     1,     1,     1,     1,     2,
+        3,     3,     3,     1,     3,     1,     3,     1,     2,     1,
+        2,     3,     3,     1,     3,     1,     2,     2,     2,     1,
+-       2,     2,     5,     7,     7,     7,     5,     9,    10,     7,
++       2,     2,     5,     7,     7,     6,     5,     9,    10,     7,
+        8,     9,     0,     1,     0,     1,     2,     2,     3,     3,
+        2,     2,     3,     3,     2,     2,     3,     3,     5,     5,
+        3,     5,     0,     1,     1,     2,     3,     4,     2,     3,
+@@ -994,11 +994,11 @@
+      246,   272,   269,   268,     0,   295,     0,   294,   291,   290,
+       28,    30,    59,   177,     0,   238,     0,   229,   226,     0,
+        0,     0,   252,   300,     0,   304,     0,   299,   303,     0,
+-       0,   297,   173,     0,     0,     0,     0,   273,   274,     0,
++       0,   297,   173,     0,   245,     0,     0,   273,   274,     0,
+        0,     0,   230,   252,   249,   175,     0,   301,   305,    13,
+-       0,   243,   245,   244,     0,     0,   270,   272,   275,   284,
+-     250,     0,     0,     0,    14,   276,   278,     0,     0,   251,
+-       0,   247,   277,   279,   271,   285,   248
++       0,   243,   244,     0,     0,   270,   272,   275,   284,   250,
++       0,     0,     0,    14,   276,   278,     0,     0,   251,     0,
++     247,   277,   279,   271,   285,   248
+ };
+ 
+ /* YYDEFGOTO[NTERM-NUM].  */
+@@ -1013,86 +1013,86 @@
+      451,   228,    64,    65,    66,    67,   101,   345,   102,   346,
+       68,   104,   105,   245,   429,    69,    70,    71,    72,   452,
+      229,    73,    74,    75,    76,    77,   472,   506,   507,   508,
+-     527,    78,    79,    80,    81,   146,    82,    83,    99,   370,
++     526,    78,    79,    80,    81,   146,    82,    83,    99,   370,
+      456,    84,    85,    86
+ };
+ 
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+    STATE-NUM.  */
+-#define YYPACT_NINF -423
++#define YYPACT_NINF -379
+ static const yytype_int16 yypact[] =
+ {
+-     942,  -423,  -423,  -423,     9,   -54,   372,   -35,    -5,    16,
+-      48,   206,  1402,  1402,   -28,  -423,  1022,    55,  1402,    69,
+-      84,  1402,    -1,    25,   135,  1402,  1402,  -423,  -423,  -423,
+-     136,  1402,  1402,  -423,  1402,   569,   155,  1402,  1402,  1402,
+-    1402,  -423,  -423,  -423,  -423,   145,  -423,   223,   642,  -423,
+-    -423,  -423,   106,    98,   283,   158,   302,    -4,   169,   187,
+-     232,    60,  -423,  -423,    11,  -423,  -423,  -423,  -423,  -423,
+-    -423,  -423,  -423,  -423,  -423,  -423,  -423,  -423,  -423,  -423,
+-    -423,  -423,  -423,  -423,   274,   942,  -423,  -423,    27,  -423,
+-    1098,   372,    10,  -423,    70,  -423,  -423,   233,  -423,  -423,
+-     199,    13,  -423,   199,    17,  -423,  -423,    31,  -423,   221,
+-    -423,  -423,   233,  -423,   261,  1079,  -423,  -423,  -423,   124,
+-     117,   319,   160,   306,   215,   218,   219,   327,    66,  -423,
+-    -423,    23,   201,  -423,  -423,  1402,   325,  1402,  -423,  1402,
+-    1402,    24,   231,  -423,  -423,   293,    29,  -423,  -423,  1022,
+-    -423,  -423,   211,  -423,   702,  -423,   174,  1174,   258,  -423,
+-    -423,  -423,  -423,  1250,  1402,   323,  -423,  1402,   337,  -423,
+-    -423,  -423,  -423,  -423,  -423,  -423,  -423,  -423,  -423,  -423,
+-    -423,  -423,  -423,  -423,  1402,  1402,  1402,  1402,  1402,  1402,
+-    1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,
+-    1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  -423,
+-    1402,  -423,  -423,  -423,  -423,  -423,   339,   616,   319,   147,
+-     312,   304,   322,   330,   365,    67,  -423,  -423,   340,   329,
+-     233,  -423,   344,    76,  -423,  -423,   351,  -423,   352,  -423,
+-      94,  1402,   358,  -423,  1402,  -423,  -423,   -35,  -423,  -423,
+-    -423,    -5,  -423,  -423,  -423,   122,  -423,  1402,   359,  -423,
+-    -423,  -423,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,
+-    1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,
+-    1402,  1402,  1402,  1402,  1402,  1402,  1402,  -423,  1402,  -423,
+-     240,   355,   284,   294,   300,  -423,  -423,   356,    -1,   366,
+-    -423,   -17,  -423,  -423,  -423,  -423,   155,  -423,  -423,  -423,
+-    -423,  -423,   303,  -423,   175,  -423,   190,  -423,  -423,  -423,
+-    -423,  -423,   124,   124,   117,   117,   117,   319,   319,   319,
+-     319,   319,   319,   160,   160,   160,   160,   306,   215,   218,
+-     219,   327,   364,  -423,    41,     7,  -423,  1402,  1402,  1402,
+-    1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,  1402,
+-    1402,  1402,  1402,  1402,  1402,  1402,  -423,   159,  -423,   361,
+-     305,   369,  1402,   134,  -423,   191,  -423,  -423,  -423,  -423,
+-     361,   310,   216,  -423,  -423,  -423,  -423,  -423,   124,   124,
+-     117,   117,   117,   319,   319,   319,   319,   319,   319,   160,
+-     160,   160,   160,   306,   215,   218,   219,   327,   374,  -423,
+-    1022,  1402,  1022,   373,  1022,   383,  -423,  -423,    33,  -423,
+-      32,  1326,  -423,  1402,  -423,  -423,  1402,  1402,  1402,   424,
+-     385,  1402,   315,  1079,  -423,   319,   319,   319,   319,   319,
+-     147,   147,   147,   147,   312,   304,   322,   330,   365,   382,
+-    -423,   380,   362,   361,   320,   782,  -423,   361,   389,   164,
+-    -423,  -423,  -423,  -423,  -423,   361,  -423,  1402,   417,   324,
+-    -423,   449,  -423,  -423,   390,  -423,   395,  -423,  -423,  -423,
+-    -423,  -423,  -423,  -423,   326,  -423,  1402,   377,  -423,   378,
+-    1022,  1402,  1402,  -423,   361,  -423,   862,  -423,  -423,   361,
+-     328,  -423,  -423,  1022,    35,  1402,    12,   449,  -423,    -1,
+-    1022,   335,  -423,  1402,  -423,  -423,   392,  -423,  -423,  -423,
+-     361,  -423,  -423,  -423,   230,   399,  -423,   449,  -423,   430,
+-    -423,  1022,   400,  1022,  -423,   942,   942,   396,    -1,  -423,
+-    1022,  -423,   942,   942,  -423,  -423,  -423
++     941,  -379,  -379,  -379,    11,   -11,   309,     7,    98,    16,
++     108,   180,  1401,  1401,   112,  -379,  1021,   142,  1401,   162,
++     168,  1401,   169,     8,   184,  1401,  1401,  -379,  -379,  -379,
++     -17,  1401,  1401,  -379,  1401,   568,    14,  1401,  1401,  1401,
++    1401,  -379,  -379,  -379,  -379,   128,  -379,   131,   615,  -379,
++    -379,  -379,    93,   116,   246,   326,   288,   165,   167,   190,
++     220,    71,  -379,  -379,    10,  -379,  -379,  -379,  -379,  -379,
++    -379,  -379,  -379,  -379,  -379,  -379,  -379,  -379,  -379,  -379,
++    -379,  -379,  -379,  -379,   284,   941,  -379,  -379,    27,  -379,
++    1097,   309,   -26,  -379,   166,  -379,  -379,   134,  -379,  -379,
++     182,    13,  -379,   182,    17,  -379,  -379,    29,  -379,   263,
++    -379,  -379,   134,  -379,   164,   641,  -379,  -379,  -379,    96,
++     178,   274,   395,   304,   204,   250,   267,   311,    80,  -379,
++    -379,    20,   228,  -379,  -379,  1401,   335,  1401,  -379,  1401,
++    1401,    21,   248,  -379,  -379,   245,    19,  -379,  -379,  1021,
++    -379,  -379,   213,  -379,   701,  -379,    -2,  1173,   293,  -379,
++    -379,  -379,  -379,  1249,  1401,   306,  -379,  1401,   310,  -379,
++    -379,  -379,  -379,  -379,  -379,  -379,  -379,  -379,  -379,  -379,
++    -379,  -379,  -379,  -379,  1401,  1401,  1401,  1401,  1401,  1401,
++    1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,
++    1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  -379,
++    1401,  -379,  -379,  -379,  -379,  -379,   334,   333,   274,   236,
++     308,   290,   314,   317,   362,    88,  -379,  -379,   340,   323,
++     134,  -379,   346,   -14,  -379,  -379,   353,  -379,   360,  -379,
++      84,  1401,   359,  -379,  1401,  -379,  -379,     7,  -379,  -379,
++    -379,    98,  -379,  -379,  -379,    35,  -379,  1401,   366,  -379,
++    -379,  -379,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,
++    1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,
++    1401,  1401,  1401,  1401,  1401,  1401,  1401,  -379,  1401,  -379,
++     247,   367,   269,   282,   289,  -379,  -379,   372,   169,   389,
++    -379,    -3,  -379,  -379,  -379,  -379,    14,  -379,  -379,  -379,
++    -379,  -379,   296,  -379,    22,  -379,    94,  -379,  -379,  -379,
++    -379,  -379,    96,    96,   178,   178,   178,   274,   274,   274,
++     274,   274,   274,   395,   395,   395,   395,   304,   204,   250,
++     267,   311,   386,  -379,    65,    -7,  -379,  1401,  1401,  1401,
++    1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,  1401,
++    1401,  1401,  1401,  1401,  1401,  1401,  -379,   100,  -379,   384,
++     325,   390,  1401,   200,  -379,   109,  -379,  -379,  -379,  -379,
++     384,   332,   201,  -379,  -379,  -379,  -379,  -379,    96,    96,
++     178,   178,   178,   274,   274,   274,   274,   274,   274,   395,
++     395,   395,   395,   304,   204,   250,   267,   311,   393,  -379,
++    1021,  1401,  1021,   394,  1021,   398,  -379,  -379,    28,  -379,
++      31,  1325,  -379,  1401,  -379,  -379,  1401,  1401,  1401,   434,
++     401,  1401,   355,   641,  -379,   274,   274,   274,   274,   274,
++     236,   236,   236,   236,   308,   290,   314,   317,   362,   399,
++    -379,   397,   380,   384,   373,   781,  -379,   384,   405,   103,
++    -379,  -379,  -379,  -379,  -379,   384,  -379,  1401,   436,   375,
++    -379,   462,  -379,  -379,   404,  -379,   411,  -379,  -379,  -379,
++    -379,  -379,  -379,  -379,   377,  -379,  1401,   387,  -379,   391,
++    1021,  1401,  1401,  -379,   384,  -379,   861,  -379,  -379,   384,
++     379,  -379,  -379,  1021,   392,  1401,    39,   462,  -379,   169,
++    1021,   381,  -379,  1401,  -379,  -379,   413,  -379,  -379,  -379,
++     384,  -379,  -379,   111,   417,  -379,   462,  -379,   454,  -379,
++    1021,   418,  1021,  -379,   941,   941,   416,   169,  -379,  1021,
++    -379,   941,   941,  -379,  -379,  -379
+ };
+ 
+ /* YYPGOTO[NTERM-NUM].  */
+ static const yytype_int16 yypgoto[] =
+ {
+-    -423,  -423,  -423,    96,  -423,  -423,     0,  -423,  -423,   165,
+-    -423,     5,  -423,    38,  -423,  -423,  -423,   -39,  -423,   197,
+-    -423,  -423,  -423,    15,    28,  -423,  -133,  -423,  -143,  -423,
+-     -38,  -423,   -23,     2,  -423,  -200,   114,  -423,  -166,   115,
+-    -423,  -144,   113,  -423,  -122,   116,  -423,  -118,   118,  -423,
+-    -423,  -423,  -423,  -423,  -423,  -423,  -120,  -341,  -423,     3,
+-       8,  -423,  -423,   -12,   -21,  -423,  -423,  -423,   228,    46,
+-    -423,  -423,   235,   376,    -6,  -423,  -423,  -423,  -423,  -422,
+-    -423,  -423,  -423,  -423,  -423,  -423,  -423,   -45,  -423,   -20,
+-    -423,  -423,  -423,  -423,  -423,   185,  -423,  -423,  -423,  -253,
+-    -359,  -423,   -29,   -80
++    -379,  -379,  -379,   119,  -379,  -379,     0,  -379,  -379,   183,
++    -379,    34,  -379,    37,  -379,  -379,  -379,   -37,  -379,   196,
++    -379,  -379,  -379,    15,    26,  -379,  -155,  -379,   -54,  -379,
++     -53,  -379,   -13,    76,  -379,  -161,   135,  -379,  -159,   139,
++    -379,  -150,   140,  -379,  -145,   133,  -379,  -139,   137,  -379,
++    -379,  -379,  -379,  -379,  -379,  -379,  -138,  -340,  -379,   -21,
++      -8,  -379,  -379,   -15,   -18,  -379,  -379,  -379,   257,    77,
++    -379,  -379,   255,   406,    25,  -379,  -379,  -379,  -379,  -378,
++    -379,  -379,  -379,  -379,  -379,  -379,  -379,   -12,  -379,     1,
++    -379,  -379,  -379,  -379,  -379,   214,  -379,  -379,  -379,  -249,
++    -373,  -379,   -33,   -80
+ };
+ 
+ /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+@@ -1102,308 +1102,306 @@
+ #define YYTABLE_NINF -1
+ static const yytype_uint16 yytable[] =
+ {
+-      43,   142,   381,   337,   136,   213,   154,   434,   169,   489,
+-      87,    97,   209,    90,   246,    50,    43,   106,   250,   131,
+-     525,   464,   449,   450,   287,   295,   143,   100,   214,   141,
+-     300,    50,   253,   478,   475,    43,   522,   309,   338,   135,
+-     133,   134,   152,   313,    98,   419,   138,   324,   325,   326,
+-      50,   184,   218,   147,   148,   322,   323,   103,   243,   150,
+-     151,   339,   420,   427,   318,   159,   160,   161,   162,    35,
+-     516,    88,   232,   256,   213,   259,   430,   233,   107,   203,
+-     210,   403,   247,   526,   340,    43,   251,   485,   342,   341,
+-     343,   532,   288,   288,   493,   431,   230,    89,   497,   211,
+-      50,   248,   207,   301,   108,   252,   501,   476,   285,   362,
+-     109,   289,   296,   144,   454,   215,   404,   302,   262,   254,
+-     479,   477,   137,   523,   377,   390,   391,   392,   428,   231,
+-     234,   235,   236,   388,   389,   517,   139,   303,   368,   405,
+-     519,   237,   384,   290,   369,   292,   208,   293,   294,    43,
+-     515,   140,   286,   363,    43,   327,   328,   329,   330,   331,
+-     332,   534,   406,   373,    50,   374,   408,   407,   409,    50,
+-     349,   185,   314,   188,   189,   316,   333,   334,   335,   336,
+-     193,   194,   271,   272,   368,   186,   187,   350,   351,   263,
+-     380,   366,   266,   267,   234,   235,   236,   145,   195,   196,
+-     273,   274,   149,   264,   265,   461,   500,   110,   115,     1,
+-       2,     3,   163,   319,   320,   321,    91,   164,   115,   165,
+-      92,   368,    12,    13,   155,    15,   368,   453,   352,   353,
+-      18,   115,   499,   393,   394,   395,   396,   397,   398,   197,
+-     198,   275,   276,   306,   288,   260,   261,   307,   424,   375,
+-      25,    26,   460,   204,   399,   400,   401,   402,    27,   288,
+-     288,   297,   298,   425,   463,   382,    28,    29,    93,    31,
+-      32,    33,   205,    34,   212,   206,    94,   416,    36,   304,
+-     288,    37,    38,    39,    40,   288,   244,   217,   255,   466,
+-     163,   385,   386,   387,   111,   167,   535,   168,   281,   288,
+-     163,   481,   282,   482,   283,   241,   483,   242,   410,   288,
+-     218,   435,   436,   437,   438,   439,   218,   218,   218,   218,
+-     218,   218,   218,   218,   218,   218,   218,   310,   163,   190,
+-     191,   192,   115,   257,   115,   258,   115,   115,   199,   200,
+-     201,   202,   277,   278,   279,   280,   291,   502,   354,   355,
+-     356,   357,   412,   288,   115,   432,   440,   441,   442,   443,
+-     115,   115,   413,   288,   115,   268,   269,   270,   414,   288,
+-     284,   422,   423,   457,   458,     1,     2,     3,   465,   458,
+-     299,   115,    91,   490,   288,   315,    92,   358,   494,   458,
+-     218,    15,   504,   288,   510,   288,   520,   458,   468,   317,
+-     470,   344,   473,   531,   288,   115,   359,   115,   361,   364,
+-      43,   367,    43,   371,    43,   360,   213,   365,   372,   469,
+-     376,   383,   411,   415,    27,    50,   496,    50,   417,    50,
+-     426,   455,    28,    29,    93,   484,   459,    33,   115,    34,
+-     467,   115,    94,   471,    36,   474,   486,   487,   491,   288,
+-     492,   498,   503,   218,   115,    43,   505,   419,   509,   115,
+-     533,   538,   213,   213,   428,   536,   513,   544,   540,   462,
+-      50,   421,   444,   446,   445,   378,   488,   447,   514,   249,
+-     448,   512,   537,   115,   418,   115,   379,   528,   529,     0,
+-      43,   521,     0,     0,   511,     0,    43,     0,   530,     0,
+-       0,     0,     0,    43,     0,    50,   542,   543,     0,     0,
+-      43,    50,     0,   524,     0,     0,     0,   545,    50,   539,
+-       0,   541,     0,     0,     0,    50,     0,     0,   546,     0,
+-       0,    43,     0,    43,     0,    43,    43,     0,     0,     0,
+-      43,     0,    43,    43,   115,   433,    50,     0,    50,     0,
+-      50,    50,     0,     0,     0,    50,     0,    50,    50,     0,
+-     433,   433,   115,     0,     0,     0,     0,     0,     0,   115,
+-       0,     0,     1,     2,     3,     4,     0,     0,     5,     6,
+-       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+-      17,     0,     0,    18,    19,    20,     0,    21,    22,     0,
+-       0,    23,    24,     0,     0,     0,     0,     0,   115,     0,
+-       0,     0,     0,    25,    26,     0,     0,     0,   115,     0,
+-     115,    27,     0,   115,   115,   433,     0,     0,   115,    28,
+-      29,    30,    31,    32,    33,     0,    34,     0,   347,    35,
+-     153,    36,     0,     0,    37,    38,    39,    40,     0,     0,
+-       0,     0,     0,     0,     0,     0,     0,    41,     0,     0,
+-     260,   261,     0,     0,   115,   172,   173,   174,   175,   176,
+-     177,   178,   179,   180,   181,   182,     0,     0,     0,     0,
+-       0,     0,     0,   115,     0,     0,   170,   171,   433,   115,
+-       0,   172,   173,   174,   175,   176,   177,   178,   179,   180,
+-     181,   182,   115,   183,     0,     1,     2,     3,     4,     0,
+-     115,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+-      14,    15,    16,    17,     0,     0,    18,    19,    20,   183,
+-      21,    22,     0,     0,    23,    24,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,    25,    26,     0,     0,
+-       0,     0,     0,     0,    27,     0,     0,     0,     0,     0,
+-       0,     0,    28,    29,    30,    31,    32,    33,     0,    34,
+-       0,     0,    35,   305,    36,     0,     0,    37,    38,    39,
+-      40,     0,     0,     0,     0,     1,     2,     3,     4,     0,
+-      41,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+-      14,    15,    16,    17,     0,     0,    18,    19,    20,     0,
+-      21,    22,     0,     0,    23,    24,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,    25,    26,     0,     0,
+-       0,     0,     0,     0,    27,     0,     0,     0,     0,     0,
+-       0,     0,    28,    29,    30,    31,    32,    33,     0,    34,
+-       0,     0,    35,   495,    36,     0,     0,    37,    38,    39,
+-      40,     0,     0,     0,     0,     1,     2,     3,     4,     0,
+-      41,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+-      14,    15,    16,    17,     0,     0,    18,    19,    20,     0,
+-      21,    22,     0,     0,    23,    24,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,    25,    26,     0,     0,
+-       0,     0,     0,     0,    27,     0,     0,     0,     0,     0,
+-       0,     0,    28,    29,    30,    31,    32,    33,     0,    34,
+-       0,     0,    35,   518,    36,     0,     0,    37,    38,    39,
+-      40,     0,     0,     0,     0,     1,     2,     3,     4,     0,
+-      41,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+-      14,    15,    16,    17,     0,     0,    18,    19,    20,     0,
+-      21,    22,     0,     0,    23,    24,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,    25,    26,     0,     0,
+-       0,     0,     0,     0,    27,     0,     0,     0,     0,     0,
+-       0,     0,    28,    29,    30,    31,    32,    33,     0,    34,
+-       0,     0,    35,     0,    36,     0,     0,    37,    38,    39,
+-      40,     0,     0,     0,     0,     1,     2,     3,     4,     0,
+-      41,     5,     6,     7,     8,     9,     0,    11,    12,    13,
+-      14,    15,    16,    17,     0,     0,    18,    19,    20,     0,
+-      21,    22,     0,     0,    23,    24,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,    25,    26,     0,     0,
+-       0,     0,     0,     0,    27,     0,     0,     0,     0,     0,
+-       0,     0,    28,    29,    30,    31,    32,    33,     0,    34,
+-       0,     0,    35,     0,    36,     0,     0,    37,    38,    39,
+-      40,     1,     2,     3,     0,     0,     0,     0,    91,   216,
+-      41,     0,    92,     0,    12,    13,     0,    15,     0,     0,
+-       0,     0,    18,   260,   261,     0,     0,     0,   172,   173,
+-     174,   175,   176,   177,   178,   179,   180,   181,   182,     0,
+-       0,     0,    25,    26,     0,     0,     0,     0,     0,     0,
+-      27,     0,     0,     0,     0,     0,     0,     0,    28,    29,
+-      93,    31,    32,    33,     0,    34,   183,     0,    94,     0,
+-      36,     0,     0,    37,    38,    39,    40,     1,     2,     3,
+-       0,     0,     0,     0,    91,     0,     0,     0,    92,     0,
+-      12,    13,     0,    15,     0,     0,     0,     0,    18,     0,
++      43,   136,   154,   131,   142,   213,   381,   464,   434,   143,
++     169,   209,    87,   141,   246,    50,    43,   106,   250,   309,
++     300,   287,   295,   449,   450,   313,   152,   184,   214,   475,
++     253,    50,   478,   322,   323,    43,   232,   218,   133,   134,
++      97,   233,   337,    98,   138,   338,   318,   524,   368,   149,
++      50,   147,   148,   489,   369,   339,    90,   150,   151,   419,
++     243,   340,   430,   159,   160,   161,   162,   306,   341,   100,
++     342,   307,   343,    88,   213,   256,   420,   259,   107,   210,
++     493,   431,   247,   155,   497,    43,   251,   427,   485,   288,
++     288,   288,   501,   301,   262,   424,   144,   368,   211,    89,
++      50,   248,   476,   380,   108,   252,   377,   302,   289,   296,
++     525,   388,   389,   207,   516,   215,   477,   254,   454,   479,
++     403,   517,   285,   404,   384,   230,   519,   290,   231,   292,
++     362,   293,   294,   405,   303,   531,   324,   325,   326,   406,
++     327,   328,   329,   330,   331,   332,   407,   533,   408,    43,
++     409,   515,   428,   373,    43,   374,   314,   208,   185,   316,
++     103,   263,   368,   288,    50,   368,   286,   425,   453,    50,
++     109,   499,   186,   187,   363,   264,   265,   534,   288,   135,
++     288,   110,   463,     1,     2,     3,   333,   334,   335,   336,
++      91,   188,   189,   366,    92,   163,    12,    13,   163,    15,
++     164,   163,   165,   167,    18,   168,   241,   115,   242,   137,
++     500,   319,   320,   321,   390,   391,   392,   115,   393,   394,
++     395,   396,   397,   398,    25,    26,   234,   235,   236,   139,
++     115,   163,    27,   375,   460,   140,   257,   237,   258,    35,
++      28,    29,    93,    31,    32,    33,   145,    34,   203,   382,
++      94,   204,    36,   266,   267,    37,    38,    39,    40,   349,
++     234,   235,   236,   206,   399,   400,   401,   402,   111,   244,
++     288,   461,   260,   261,   466,   205,   350,   351,   297,   298,
++     416,   304,   288,   481,   212,   482,   217,   281,   483,   385,
++     386,   387,   190,   191,   192,   218,   435,   436,   437,   438,
++     439,   218,   218,   218,   218,   218,   218,   218,   218,   218,
++     218,   218,     1,     2,     3,   410,   288,   352,   353,    91,
++     268,   269,   270,    92,   199,   200,   201,   202,    15,   502,
++     255,   115,   299,   115,   282,   115,   115,   412,   288,   432,
++     277,   278,   279,   280,   354,   355,   356,   357,   193,   194,
++     413,   288,   283,   115,   284,   347,   291,   414,   288,   115,
++     115,    27,   310,   115,   422,   423,   195,   196,   315,    28,
++      29,    93,   317,   358,    33,   218,    34,   260,   261,    94,
++     115,    36,   172,   173,   174,   175,   176,   177,   178,   179,
++     180,   181,   182,   457,   458,   468,   344,   470,   359,   473,
++     465,   458,   360,   469,   115,   361,   115,   197,   198,   364,
++      43,   365,    43,   367,    43,   371,   213,   271,   272,   484,
++     183,   376,   496,   490,   288,    50,   372,    50,   383,    50,
++     440,   441,   442,   443,   411,   273,   274,   115,   218,   415,
++     115,   494,   458,   504,   288,   510,   288,   520,   458,   530,
++     288,   417,   426,   115,   455,    43,   486,   459,   115,   467,
++     474,   213,   213,   487,   471,   491,   288,   498,   492,   505,
++      50,   503,   509,   419,   428,   514,   275,   276,   511,   513,
++     522,   532,   115,   535,   115,   537,   539,   543,   521,   421,
++      43,   528,   462,   444,   447,   529,    43,   523,   445,   448,
++     446,   541,   542,    43,   378,    50,   379,   488,   527,   249,
++      43,    50,   512,   418,   536,   538,     0,   540,    50,   544,
++       0,     0,     0,     0,   545,    50,     0,     0,     0,     0,
++      43,     0,    43,     0,    43,    43,     0,     0,     0,    43,
++       0,    43,    43,   115,   433,    50,     0,    50,     0,    50,
++      50,     0,     0,     0,    50,     0,    50,    50,     0,   433,
++     433,   115,     0,     0,     0,     0,     0,     0,   115,     0,
++       0,     1,     2,     3,     4,     0,     0,     5,     6,     7,
++       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
++       0,     0,    18,    19,    20,     0,    21,    22,     0,     0,
++      23,    24,     0,     0,     0,     0,     0,   115,     0,     0,
++       0,     0,    25,    26,     0,     0,     0,   115,     0,   115,
++      27,     0,   115,   115,   433,     0,     0,   115,    28,    29,
++      30,    31,    32,    33,     0,    34,     0,     0,    35,   153,
++      36,     0,     0,    37,    38,    39,    40,     0,     0,     0,
++       0,     0,     0,     0,     0,     0,    41,     0,     0,   170,
++     171,     0,     0,   115,   172,   173,   174,   175,   176,   177,
++     178,   179,   180,   181,   182,     0,     0,     0,     0,     0,
++       0,     0,   115,     0,     0,   260,   261,   433,   115,     0,
++     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
++     182,   115,   183,     0,     1,     2,     3,     4,     0,   115,
++       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
++      15,    16,    17,     0,     0,    18,    19,    20,   183,    21,
++      22,     0,     0,    23,    24,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,    25,    26,     0,     0,     0,
++       0,     0,     0,    27,     0,     0,     0,     0,     0,     0,
++       0,    28,    29,    30,    31,    32,    33,     0,    34,     0,
++       0,    35,   305,    36,     0,     0,    37,    38,    39,    40,
++       0,     0,     0,     0,     1,     2,     3,     4,     0,    41,
++       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
++      15,    16,    17,     0,     0,    18,    19,    20,     0,    21,
++      22,     0,     0,    23,    24,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,    25,    26,     0,     0,     0,
++       0,     0,     0,    27,     0,     0,     0,     0,     0,     0,
++       0,    28,    29,    30,    31,    32,    33,     0,    34,     0,
++       0,    35,   495,    36,     0,     0,    37,    38,    39,    40,
++       0,     0,     0,     0,     1,     2,     3,     4,     0,    41,
++       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
++      15,    16,    17,     0,     0,    18,    19,    20,     0,    21,
++      22,     0,     0,    23,    24,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,    25,    26,     0,     0,     0,
++       0,     0,     0,    27,     0,     0,     0,     0,     0,     0,
++       0,    28,    29,    30,    31,    32,    33,     0,    34,     0,
++       0,    35,   518,    36,     0,     0,    37,    38,    39,    40,
++       0,     0,     0,     0,     1,     2,     3,     4,     0,    41,
++       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
++      15,    16,    17,     0,     0,    18,    19,    20,     0,    21,
++      22,     0,     0,    23,    24,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,    25,    26,     0,     0,     0,
++       0,     0,     0,    27,     0,     0,     0,     0,     0,     0,
++       0,    28,    29,    30,    31,    32,    33,     0,    34,     0,
++       0,    35,     0,    36,     0,     0,    37,    38,    39,    40,
++       0,     0,     0,     0,     1,     2,     3,     4,     0,    41,
++       5,     6,     7,     8,     9,     0,    11,    12,    13,    14,
++      15,    16,    17,     0,     0,    18,    19,    20,     0,    21,
++      22,     0,     0,    23,    24,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,    25,    26,     0,     0,     0,
++       0,     0,     0,    27,     0,     0,     0,     0,     0,     0,
++       0,    28,    29,    30,    31,    32,    33,     0,    34,     0,
++       0,    35,     0,    36,     0,     0,    37,    38,    39,    40,
++       1,     2,     3,     0,     0,     0,     0,    91,   216,    41,
++       0,    92,     0,    12,    13,     0,    15,     0,     0,     0,
++       0,    18,     0,     0,     0,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
++       0,    25,    26,     0,     0,     0,     0,     0,     0,    27,
++       0,     0,     0,     0,     0,     0,     0,    28,    29,    93,
++      31,    32,    33,     0,    34,     0,     0,    94,     0,    36,
++       0,     0,    37,    38,    39,    40,     1,     2,     3,     0,
++       0,     0,     0,    91,     0,     0,     0,    92,     0,    12,
++      13,     0,    15,     0,     0,     0,     0,    18,     0,     0,
+        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,     0,     0,    25,    26,
+-       0,     0,     0,     0,     0,     0,    27,     0,     0,     0,
+-       0,     0,     0,     0,    28,    29,    93,    31,    32,    33,
+-       0,    34,     0,     0,    94,     0,    36,   308,     0,    37,
+-      38,    39,    40,     1,     2,     3,     0,     0,     0,     0,
+-      91,     0,     0,     0,    92,     0,    12,    13,     0,    15,
+-       0,     0,     0,     0,    18,     0,     0,     0,     0,     0,
++       0,     0,     0,     0,     0,     0,     0,    25,    26,     0,
++       0,     0,     0,     0,     0,    27,     0,     0,     0,     0,
++       0,     0,     0,    28,    29,    93,    31,    32,    33,     0,
++      34,     0,     0,    94,     0,    36,   308,     0,    37,    38,
++      39,    40,     1,     2,     3,     0,     0,     0,     0,    91,
++       0,     0,     0,    92,     0,    12,    13,     0,    15,     0,
++       0,     0,     0,    18,     0,     0,     0,     0,     0,     0,
+        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+-       0,     0,     0,     0,    25,    26,     0,     0,     0,     0,
+-       0,     0,    27,     0,     0,     0,     0,     0,     0,     0,
+-      28,    29,    93,    31,    32,    33,     0,    34,   311,     0,
+-      94,     0,    36,     0,     0,    37,    38,    39,    40,     1,
+-       2,     3,     0,     0,     0,     0,    91,     0,     0,     0,
+-      92,     0,    12,    13,     0,    15,     0,     0,     0,     0,
+-      18,     0,     0,     0,     0,     0,     0,     0,     0,     0,
++       0,     0,     0,    25,    26,     0,     0,     0,     0,     0,
++       0,    27,     0,     0,     0,     0,     0,     0,     0,    28,
++      29,    93,    31,    32,    33,     0,    34,   311,     0,    94,
++       0,    36,     0,     0,    37,    38,    39,    40,     1,     2,
++       3,     0,     0,     0,     0,    91,     0,     0,     0,    92,
++       0,    12,    13,     0,    15,     0,     0,     0,     0,    18,
+        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+-      25,    26,     0,     0,     0,     0,     0,     0,    27,     0,
+-       0,     0,     0,     0,     0,     0,    28,    29,    93,    31,
+-      32,    33,     0,    34,     0,     0,    94,     0,    36,   480,
+-       0,    37,    38,    39,    40,     1,     2,     3,     0,     0,
+-       0,     0,    91,     0,     0,     0,    92,     0,    12,    13,
+-       0,    15,     0,     0,     0,     0,    18,     0,     0,     0,
++       0,     0,     0,     0,     0,     0,     0,     0,     0,    25,
++      26,     0,     0,     0,     0,     0,     0,    27,     0,     0,
++       0,     0,     0,     0,     0,    28,    29,    93,    31,    32,
++      33,     0,    34,     0,     0,    94,     0,    36,   480,     0,
++      37,    38,    39,    40,     1,     2,     3,     0,     0,     0,
++       0,    91,     0,     0,     0,    92,     0,    12,    13,     0,
++      15,     0,     0,     0,     0,    18,     0,     0,     0,     0,
+        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+-       0,     0,     0,     0,     0,     0,    25,    26,     0,     0,
+-       0,     0,     0,     0,    27,     0,     0,     0,     0,     0,
+-       0,     0,    28,    29,    93,    31,    32,    33,     0,    34,
+-       0,     0,    94,     0,    36,     0,     0,    37,    38,    39,
+-      40
++       0,     0,     0,     0,     0,    25,    26,     0,     0,     0,
++       0,     0,     0,    27,     0,     0,     0,     0,     0,     0,
++       0,    28,    29,    93,    31,    32,    33,     0,    34,     0,
++       0,    94,     0,    36,     0,     0,    37,    38,    39,    40
+ };
+ 
+ static const yytype_int16 yycheck[] =
+ {
+-       0,    22,   255,   203,    16,    85,    35,   348,    47,   431,
+-       1,     6,     1,    67,     1,     0,    16,     1,     1,    11,
+-       8,   380,   363,   364,     1,     1,     1,    62,     1,    21,
+-       1,    16,     1,     1,     1,    35,     1,   157,   204,    67,
+-      12,    13,    34,   163,     6,    62,    18,   190,   191,   192,
+-      35,    48,    90,    25,    26,   188,   189,    62,    97,    31,
+-      32,   205,    79,    22,   184,    37,    38,    39,    40,    70,
+-     492,    62,    62,   112,   154,   114,    69,    67,    62,    83,
+-      69,   281,    69,    71,   206,    85,    69,   428,   208,   207,
+-     210,   513,    69,    69,   453,    88,    91,    88,   457,    88,
+-      85,    88,    42,    74,    88,    88,   465,    74,    42,    42,
+-      62,    88,    88,    88,   367,    88,   282,    88,   115,    88,
+-      88,    88,    67,    88,   244,   268,   269,   270,    87,    91,
+-      60,    61,    62,   266,   267,   494,    67,   149,    62,   283,
+-     499,    71,   262,   135,    68,   137,    86,   139,   140,   149,
+-     491,    67,    86,    86,   154,   193,   194,   195,   196,   197,
+-     198,   520,   284,    69,   149,    71,   286,   285,   288,   154,
+-      23,    65,   164,    75,    76,   167,   199,   200,   201,   202,
+-      22,    23,    22,    23,    62,    79,    80,    40,    41,    65,
+-      68,   230,    75,    76,    60,    61,    62,    62,    40,    41,
+-      40,    41,    66,    79,    80,    71,   459,     1,    11,     3,
+-       4,     5,    67,   185,   186,   187,    10,    72,    21,    74,
+-      14,    62,    16,    17,    69,    19,    62,    68,    81,    82,
+-      24,    34,    68,   271,   272,   273,   274,   275,   276,    81,
+-      82,    81,    82,    69,    69,    44,    45,    73,    73,   241,
+-      44,    45,   372,    84,   277,   278,   279,   280,    52,    69,
+-      69,    30,    31,    73,    73,   257,    60,    61,    62,    63,
+-      64,    65,    85,    67,     0,    43,    70,   298,    72,    68,
+-      69,    75,    76,    77,    78,    69,    87,    90,    67,    73,
+-      67,   263,   264,   265,    88,    72,    66,    74,    83,    69,
+-      67,   421,    84,   423,    85,    72,   426,    74,    68,    69,
+-     348,   349,   350,   351,   352,   353,   354,   355,   356,   357,
+-     358,   359,   360,   361,   362,   363,   364,    69,    67,    46,
+-      47,    48,   135,    72,   137,    74,   139,   140,    36,    37,
+-      38,    39,    36,    37,    38,    39,    21,   467,    36,    37,
+-      38,    39,    68,    69,   157,   347,   354,   355,   356,   357,
+-     163,   164,    68,    69,   167,    46,    47,    48,    68,    69,
+-      43,    68,    69,    68,    69,     3,     4,     5,    68,    69,
+-      87,   184,    10,    68,    69,    62,    14,    83,    68,    69,
+-     428,    19,    68,    69,    68,    69,    68,    69,   410,    62,
+-     412,    62,   414,    68,    69,   208,    84,   210,    43,    69,
+-     410,    67,   412,    62,   414,    85,   496,    88,    66,   411,
+-      62,    62,    67,    67,    52,   410,   455,   412,    62,   414,
+-      66,    70,    60,    61,    62,   427,    67,    65,   241,    67,
+-      66,   244,    70,    70,    72,    62,    22,    62,    66,    69,
+-      88,    62,    35,   491,   257,   455,     7,    62,    68,   262,
+-      68,    31,   542,   543,    87,    66,    88,    71,    68,   373,
+-     455,   306,   358,   360,   359,   247,   430,   361,   490,   103,
+-     362,   487,   527,   286,   299,   288,   251,   507,   509,    -1,
+-     490,   503,    -1,    -1,   486,    -1,   496,    -1,   510,    -1,
+-      -1,    -1,    -1,   503,    -1,   490,   535,   536,    -1,    -1,
+-     510,   496,    -1,   505,    -1,    -1,    -1,   538,   503,   531,
+-      -1,   533,    -1,    -1,    -1,   510,    -1,    -1,   540,    -1,
+-      -1,   531,    -1,   533,    -1,   535,   536,    -1,    -1,    -1,
+-     540,    -1,   542,   543,   347,   348,   531,    -1,   533,    -1,
+-     535,   536,    -1,    -1,    -1,   540,    -1,   542,   543,    -1,
+-     363,   364,   365,    -1,    -1,    -1,    -1,    -1,    -1,   372,
+-      -1,    -1,     3,     4,     5,     6,    -1,    -1,     9,    10,
+-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+-      21,    -1,    -1,    24,    25,    26,    -1,    28,    29,    -1,
+-      -1,    32,    33,    -1,    -1,    -1,    -1,    -1,   411,    -1,
+-      -1,    -1,    -1,    44,    45,    -1,    -1,    -1,   421,    -1,
+-     423,    52,    -1,   426,   427,   428,    -1,    -1,   431,    60,
+-      61,    62,    63,    64,    65,    -1,    67,    -1,    22,    70,
+-      71,    72,    -1,    -1,    75,    76,    77,    78,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    88,    -1,    -1,
+-      44,    45,    -1,    -1,   467,    49,    50,    51,    52,    53,
+-      54,    55,    56,    57,    58,    59,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,   486,    -1,    -1,    44,    45,   491,   492,
+-      -1,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+-      58,    59,   505,    87,    -1,     3,     4,     5,     6,    -1,
+-     513,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+-      18,    19,    20,    21,    -1,    -1,    24,    25,    26,    87,
+-      28,    29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,
+-      -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    60,    61,    62,    63,    64,    65,    -1,    67,
+-      -1,    -1,    70,    71,    72,    -1,    -1,    75,    76,    77,
+-      78,    -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,
+-      88,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+-      18,    19,    20,    21,    -1,    -1,    24,    25,    26,    -1,
+-      28,    29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,
+-      -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    60,    61,    62,    63,    64,    65,    -1,    67,
+-      -1,    -1,    70,    71,    72,    -1,    -1,    75,    76,    77,
+-      78,    -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,
+-      88,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+-      18,    19,    20,    21,    -1,    -1,    24,    25,    26,    -1,
+-      28,    29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,
+-      -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    60,    61,    62,    63,    64,    65,    -1,    67,
+-      -1,    -1,    70,    71,    72,    -1,    -1,    75,    76,    77,
+-      78,    -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,
+-      88,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+-      18,    19,    20,    21,    -1,    -1,    24,    25,    26,    -1,
+-      28,    29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,
+-      -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    60,    61,    62,    63,    64,    65,    -1,    67,
+-      -1,    -1,    70,    -1,    72,    -1,    -1,    75,    76,    77,
+-      78,    -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,
+-      88,     9,    10,    11,    12,    13,    -1,    15,    16,    17,
+-      18,    19,    20,    21,    -1,    -1,    24,    25,    26,    -1,
+-      28,    29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,
+-      -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    60,    61,    62,    63,    64,    65,    -1,    67,
+-      -1,    -1,    70,    -1,    72,    -1,    -1,    75,    76,    77,
+-      78,     3,     4,     5,    -1,    -1,    -1,    -1,    10,    11,
+-      88,    -1,    14,    -1,    16,    17,    -1,    19,    -1,    -1,
+-      -1,    -1,    24,    44,    45,    -1,    -1,    -1,    49,    50,
+-      51,    52,    53,    54,    55,    56,    57,    58,    59,    -1,
+-      -1,    -1,    44,    45,    -1,    -1,    -1,    -1,    -1,    -1,
+-      52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,    61,
+-      62,    63,    64,    65,    -1,    67,    87,    -1,    70,    -1,
+-      72,    -1,    -1,    75,    76,    77,    78,     3,     4,     5,
+-      -1,    -1,    -1,    -1,    10,    -1,    -1,    -1,    14,    -1,
+-      16,    17,    -1,    19,    -1,    -1,    -1,    -1,    24,    -1,
++       0,    16,    35,    11,    22,    85,   255,   380,   348,     1,
++      47,     1,     1,    21,     1,     0,    16,     1,     1,   157,
++       1,     1,     1,   363,   364,   163,    34,    48,     1,     1,
++       1,    16,     1,   188,   189,    35,    62,    90,    12,    13,
++       6,    67,   203,     6,    18,   204,   184,     8,    62,    66,
++      35,    25,    26,   431,    68,   205,    67,    31,    32,    62,
++      97,   206,    69,    37,    38,    39,    40,    69,   207,    62,
++     208,    73,   210,    62,   154,   112,    79,   114,    62,    69,
++     453,    88,    69,    69,   457,    85,    69,    22,   428,    69,
++      69,    69,   465,    74,   115,    73,    88,    62,    88,    88,
++      85,    88,    74,    68,    88,    88,   244,    88,    88,    88,
++      71,   266,   267,    42,   492,    88,    88,    88,   367,    88,
++     281,   494,    42,   282,   262,    91,   499,   135,    91,   137,
++      42,   139,   140,   283,   149,   513,   190,   191,   192,   284,
++     193,   194,   195,   196,   197,   198,   285,   520,   286,   149,
++     288,   491,    87,    69,   154,    71,   164,    86,    65,   167,
++      62,    65,    62,    69,   149,    62,    86,    73,    68,   154,
++      62,    68,    79,    80,    86,    79,    80,    66,    69,    67,
++      69,     1,    73,     3,     4,     5,   199,   200,   201,   202,
++      10,    75,    76,   230,    14,    67,    16,    17,    67,    19,
++      72,    67,    74,    72,    24,    74,    72,    11,    74,    67,
++     459,   185,   186,   187,   268,   269,   270,    21,   271,   272,
++     273,   274,   275,   276,    44,    45,    60,    61,    62,    67,
++      34,    67,    52,   241,   372,    67,    72,    71,    74,    70,
++      60,    61,    62,    63,    64,    65,    62,    67,    83,   257,
++      70,    84,    72,    75,    76,    75,    76,    77,    78,    23,
++      60,    61,    62,    43,   277,   278,   279,   280,    88,    87,
++      69,    71,    44,    45,    73,    85,    40,    41,    30,    31,
++     298,    68,    69,   421,     0,   423,    90,    83,   426,   263,
++     264,   265,    46,    47,    48,   348,   349,   350,   351,   352,
++     353,   354,   355,   356,   357,   358,   359,   360,   361,   362,
++     363,   364,     3,     4,     5,    68,    69,    81,    82,    10,
++      46,    47,    48,    14,    36,    37,    38,    39,    19,   467,
++      67,   135,    87,   137,    84,   139,   140,    68,    69,   347,
++      36,    37,    38,    39,    36,    37,    38,    39,    22,    23,
++      68,    69,    85,   157,    43,    22,    21,    68,    69,   163,
++     164,    52,    69,   167,    68,    69,    40,    41,    62,    60,
++      61,    62,    62,    83,    65,   428,    67,    44,    45,    70,
++     184,    72,    49,    50,    51,    52,    53,    54,    55,    56,
++      57,    58,    59,    68,    69,   410,    62,   412,    84,   414,
++      68,    69,    85,   411,   208,    43,   210,    81,    82,    69,
++     410,    88,   412,    67,   414,    62,   496,    22,    23,   427,
++      87,    62,   455,    68,    69,   410,    66,   412,    62,   414,
++     354,   355,   356,   357,    67,    40,    41,   241,   491,    67,
++     244,    68,    69,    68,    69,    68,    69,    68,    69,    68,
++      69,    62,    66,   257,    70,   455,    22,    67,   262,    66,
++      62,   541,   542,    62,    70,    66,    69,    62,    88,     7,
++     455,    35,    68,    62,    87,   490,    81,    82,   486,    88,
++      88,    68,   286,    66,   288,    31,    68,    71,   503,   306,
++     490,   509,   373,   358,   361,   510,   496,   505,   359,   362,
++     360,   534,   535,   503,   247,   490,   251,   430,   507,   103,
++     510,   496,   487,   299,   526,   530,    -1,   532,   503,   537,
++      -1,    -1,    -1,    -1,   539,   510,    -1,    -1,    -1,    -1,
++     530,    -1,   532,    -1,   534,   535,    -1,    -1,    -1,   539,
++      -1,   541,   542,   347,   348,   530,    -1,   532,    -1,   534,
++     535,    -1,    -1,    -1,   539,    -1,   541,   542,    -1,   363,
++     364,   365,    -1,    -1,    -1,    -1,    -1,    -1,   372,    -1,
++      -1,     3,     4,     5,     6,    -1,    -1,     9,    10,    11,
++      12,    13,    14,    15,    16,    17,    18,    19,    20,    21,
++      -1,    -1,    24,    25,    26,    -1,    28,    29,    -1,    -1,
++      32,    33,    -1,    -1,    -1,    -1,    -1,   411,    -1,    -1,
++      -1,    -1,    44,    45,    -1,    -1,    -1,   421,    -1,   423,
++      52,    -1,   426,   427,   428,    -1,    -1,   431,    60,    61,
++      62,    63,    64,    65,    -1,    67,    -1,    -1,    70,    71,
++      72,    -1,    -1,    75,    76,    77,    78,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    -1,    88,    -1,    -1,    44,
++      45,    -1,    -1,   467,    49,    50,    51,    52,    53,    54,
++      55,    56,    57,    58,    59,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,   486,    -1,    -1,    44,    45,   491,   492,    -1,
++      49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
++      59,   505,    87,    -1,     3,     4,     5,     6,    -1,   513,
++       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
++      19,    20,    21,    -1,    -1,    24,    25,    26,    87,    28,
++      29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,
++      -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    60,    61,    62,    63,    64,    65,    -1,    67,    -1,
++      -1,    70,    71,    72,    -1,    -1,    75,    76,    77,    78,
++      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,    88,
++       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
++      19,    20,    21,    -1,    -1,    24,    25,    26,    -1,    28,
++      29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,
++      -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    60,    61,    62,    63,    64,    65,    -1,    67,    -1,
++      -1,    70,    71,    72,    -1,    -1,    75,    76,    77,    78,
++      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,    88,
++       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
++      19,    20,    21,    -1,    -1,    24,    25,    26,    -1,    28,
++      29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,
++      -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    60,    61,    62,    63,    64,    65,    -1,    67,    -1,
++      -1,    70,    71,    72,    -1,    -1,    75,    76,    77,    78,
++      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,    88,
++       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
++      19,    20,    21,    -1,    -1,    24,    25,    26,    -1,    28,
++      29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,
++      -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    60,    61,    62,    63,    64,    65,    -1,    67,    -1,
++      -1,    70,    -1,    72,    -1,    -1,    75,    76,    77,    78,
++      -1,    -1,    -1,    -1,     3,     4,     5,     6,    -1,    88,
++       9,    10,    11,    12,    13,    -1,    15,    16,    17,    18,
++      19,    20,    21,    -1,    -1,    24,    25,    26,    -1,    28,
++      29,    -1,    -1,    32,    33,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,
++      -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    60,    61,    62,    63,    64,    65,    -1,    67,    -1,
++      -1,    70,    -1,    72,    -1,    -1,    75,    76,    77,    78,
++       3,     4,     5,    -1,    -1,    -1,    -1,    10,    11,    88,
++      -1,    14,    -1,    16,    17,    -1,    19,    -1,    -1,    -1,
++      -1,    24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    44,    45,    -1,    -1,    -1,    -1,    -1,    -1,    52,
++      -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,    61,    62,
++      63,    64,    65,    -1,    67,    -1,    -1,    70,    -1,    72,
++      -1,    -1,    75,    76,    77,    78,     3,     4,     5,    -1,
++      -1,    -1,    -1,    10,    -1,    -1,    -1,    14,    -1,    16,
++      17,    -1,    19,    -1,    -1,    -1,    -1,    24,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,    45,
+-      -1,    -1,    -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    60,    61,    62,    63,    64,    65,
+-      -1,    67,    -1,    -1,    70,    -1,    72,    73,    -1,    75,
+-      76,    77,    78,     3,     4,     5,    -1,    -1,    -1,    -1,
+-      10,    -1,    -1,    -1,    14,    -1,    16,    17,    -1,    19,
+-      -1,    -1,    -1,    -1,    24,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,
++      -1,    -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    60,    61,    62,    63,    64,    65,    -1,
++      67,    -1,    -1,    70,    -1,    72,    73,    -1,    75,    76,
++      77,    78,     3,     4,     5,    -1,    -1,    -1,    -1,    10,
++      -1,    -1,    -1,    14,    -1,    16,    17,    -1,    19,    -1,
++      -1,    -1,    -1,    24,    -1,    -1,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,    -1,
+-      -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+-      60,    61,    62,    63,    64,    65,    -1,    67,    68,    -1,
+-      70,    -1,    72,    -1,    -1,    75,    76,    77,    78,     3,
+-       4,     5,    -1,    -1,    -1,    -1,    10,    -1,    -1,    -1,
+-      14,    -1,    16,    17,    -1,    19,    -1,    -1,    -1,    -1,
+-      24,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    -1,    -1,    44,    45,    -1,    -1,    -1,    -1,    -1,
++      -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,
++      61,    62,    63,    64,    65,    -1,    67,    68,    -1,    70,
++      -1,    72,    -1,    -1,    75,    76,    77,    78,     3,     4,
++       5,    -1,    -1,    -1,    -1,    10,    -1,    -1,    -1,    14,
++      -1,    16,    17,    -1,    19,    -1,    -1,    -1,    -1,    24,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+-      44,    45,    -1,    -1,    -1,    -1,    -1,    -1,    52,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    60,    61,    62,    63,
+-      64,    65,    -1,    67,    -1,    -1,    70,    -1,    72,    73,
+-      -1,    75,    76,    77,    78,     3,     4,     5,    -1,    -1,
+-      -1,    -1,    10,    -1,    -1,    -1,    14,    -1,    16,    17,
+-      -1,    19,    -1,    -1,    -1,    -1,    24,    -1,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    44,
++      45,    -1,    -1,    -1,    -1,    -1,    -1,    52,    -1,    -1,
++      -1,    -1,    -1,    -1,    -1,    60,    61,    62,    63,    64,
++      65,    -1,    67,    -1,    -1,    70,    -1,    72,    73,    -1,
++      75,    76,    77,    78,     3,     4,     5,    -1,    -1,    -1,
++      -1,    10,    -1,    -1,    -1,    14,    -1,    16,    17,    -1,
++      19,    -1,    -1,    -1,    -1,    24,    -1,    -1,    -1,    -1,
+       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,
+-      -1,    -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,
+-      -1,    -1,    60,    61,    62,    63,    64,    65,    -1,    67,
+-      -1,    -1,    70,    -1,    72,    -1,    -1,    75,    76,    77,
+-      78
++      -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    -1,    -1,
++      -1,    -1,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,
++      -1,    60,    61,    62,    63,    64,    65,    -1,    67,    -1,
++      -1,    70,    -1,    72,    -1,    -1,    75,    76,    77,    78
+ };
+ 
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+@@ -1462,9 +1460,9 @@
+       68,    66,    88,   189,    68,    71,   191,   189,    62,    68,
+      188,   189,   145,    35,    68,     7,   176,   177,   178,    68,
+       68,   149,   163,    88,   152,   146,   168,   189,    71,   189,
+-      68,   152,     1,    88,   149,     8,    71,   179,   178,   153,
+-     152,    68,   168,    68,   189,    66,    66,   176,    31,   152,
+-      68,   152,   191,   191,    71,   153,   152
++      68,   152,    88,   149,     8,    71,   179,   178,   153,   152,
++      68,   168,    68,   189,    66,    66,   176,    31,   152,    68,
++     152,   191,   191,    71,   153,   152
+ };
+ 
+ #define yyerrok		(yyerrstatus = 0)
+@@ -3170,7 +3168,7 @@
+ 
+   case 245:
+ #line 702 "grammar.y"
+-    { (yyval.stat) = new DoWhileNode((yyvsp[(2) - (7)].stat), (yyvsp[(5) - (7)].node)); DBG((yyval.stat), (yylsp[(1) - (7)]), (yylsp[(3) - (7)])); AUTO_SEMICOLON; ;}
++    { (yyval.stat) = new DoWhileNode((yyvsp[(2) - (6)].stat), (yyvsp[(5) - (6)].node)); DBG((yyval.stat), (yylsp[(1) - (6)]), (yylsp[(3) - (6)])); ;}
+     break;
+ 
+   case 246:
+@@ -3502,7 +3500,7 @@
+ 
+ 
+ /* Line 1267 of yacc.c.  */
+-#line 3506 "grammar.tab.c"
++#line 3504 "grammar.tab.c"
+       default: break;
+     }
+   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+--- a/kjs/function.h
++++ b/kjs/function.h
+@@ -53,6 +53,10 @@
+ 
+   private:
+     Identifier m_name;
++#ifdef WIN32
++    InternalFunctionImp(const InternalFunctionImp&);
++    InternalFunctionImp& operator=(const InternalFunctionImp&);
++#endif
+   };
+ 
+   /**
+--- a/kjs/string_object.cpp
++++ b/kjs/string_object.cpp
+@@ -364,7 +364,9 @@
+     if (lastIndex < source.size())
+       pushSourceRange(sourceRanges, sourceRangeCount, sourceRangeCapacity, UString::Range(lastIndex, source.size() - lastIndex));
+ 
+-    UString result = source.spliceSubstringsWithSeparators(sourceRanges, sourceRangeCount, replacements, replacementCount);
++    UString result;
++    if (sourceRanges)
++        result = source.spliceSubstringsWithSeparators(sourceRanges, sourceRangeCount, replacements, replacementCount);
+ 
+     delete [] sourceRanges;
+     delete [] replacements;
+--- a/kjs/value.h
++++ b/kjs/value.h
+@@ -26,6 +26,7 @@
+ 
+ #include "JSImmediate.h"
+ #include "ustring.h"
++#include <wtf/Noncopyable.h>
+ #include <stddef.h> // for size_t
+ 
+ #ifndef NDEBUG // protection against problems if committing with KJS_VERBOSE on
+@@ -52,7 +53,7 @@
+  * only (all of which are provided internally by KJS). Instead, inherit from
+  * JSObject.
+  */
+-class KJS_EXPORT JSValue {
++class KJS_EXPORT JSValue : Noncopyable {
+     friend class JSCell; // so it can derive from this class
+     friend class Collector; // so it can call asCell()
+ 
+@@ -99,6 +100,9 @@
+     uint32_t toUInt32(ExecState *exec) const;
+     uint16_t toUInt16(ExecState *exec) const;
+ 
++    // Floating point conversions.
++    float toFloat(ExecState*) const;
++
+     // Garbage collection.
+     void mark();
+     bool marked() const;
+--- a/kjs/function.cpp
++++ b/kjs/function.cpp
+@@ -172,7 +172,7 @@
+ 
+   // The debugger may have been deallocated by now if the WebFrame
+   // we were running in has been destroyed, so refetch it.
+-  // See http://bugzilla.opendarwin.org/show_bug.cgi?id=9477
++  // See http://bugs.webkit.org/show_bug.cgi?id=9477
+   dbg = exec->dynamicInterpreter()->debugger();
+ 
+   if (dbg) {
+--- a/kjs/ExecState.h
++++ b/kjs/ExecState.h
+@@ -32,7 +32,6 @@
+     class Context;
+     class Interpreter;
+     class FunctionImp;
+-    class RuntimeMethodImp;
+     class GlobalFuncImp;
+     
+   /**
+@@ -43,7 +42,6 @@
+   class KJS_EXPORT ExecState {
+     friend class Interpreter;
+     friend class FunctionImp;
+-    friend class RuntimeMethodImp;
+     friend class GlobalFuncImp;
+   public:
+     /**
+--- a/kjs/grammar.h
++++ b/kjs/grammar.h
+@@ -201,7 +201,7 @@
+   PropertyNameNode   *pname;
+   PackageNameNode     *pkgn;
+ }
+-/* Line 1529 of yacc.c.  */
++/* Line 1489 of yacc.c.  */
+ #line 206 "grammar.tab.h"
+ 	YYSTYPE;
+ # define yystype YYSTYPE /* obsolescent; will be withdrawn */
+--- a/kjs/ustring.h
++++ b/kjs/ustring.h
+@@ -30,10 +30,19 @@
+ #include <wtf/RefPtr.h>
+ #include <wtf/PassRefPtr.h>
+ 
++#include <assert.h>
+ #ifdef HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+ 
++/* On some ARM platforms GCC won't pack structures by default so sizeof(UChar)
++   will end up being != 2 which causes crashes since the code depends on that. */
++#if COMPILER(GCC) && PLATFORM(FORCE_PACK)
++#define PACK_STRUCT __attribute__((packed))
++#else
++#define PACK_STRUCT
++#endif
++
+ /**
+  * @internal
+  */
+@@ -89,7 +98,7 @@
+     unsigned short unicode() const { return uc; }
+ 
+     unsigned short uc;
+-  };
++  } PACK_STRUCT;
+ 
+   inline UChar::UChar() { }
+   inline UChar::UChar(unsigned char h , unsigned char l) : uc(h << 8 | l) { }
+@@ -458,8 +467,8 @@
+     static void globalClear();
+ #endif
+ 
+-    Rep *rep() const { return m_rep.get(); }
+-    UString(PassRefPtr<Rep> r) : m_rep(r) { }
++    Rep* rep() const { return m_rep.get(); }
++    UString(PassRefPtr<Rep> r) : m_rep(r) { assert(m_rep); }
+ 
+     void copyForWriting();
+ 
+--- a/kjs/list.cpp
++++ b/kjs/list.cpp
+@@ -1,6 +1,5 @@
+ /*
+- *  This file is part of the KDE libraries
+- *  Copyright (C) 2003 Apple Computer, Inc.
++ *  Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+  *
+  *  This library is free software; you can redistribute it and/or
+  *  modify it under the terms of the GNU Library General Public
+@@ -33,7 +32,7 @@
+ 
+ // tunable parameters
+ const int poolSize = 512;
+-const int inlineValuesSize = 4;
++const int inlineValuesSize = 5;
+ 
+ enum ListImpState { unusedInPool = 0, usedInPool, usedOnHeap, immortal };
+ 
+--- a/kjs/object.h
++++ b/kjs/object.h
+@@ -462,6 +462,10 @@
+   private:
+     const HashEntry* findPropertyHashEntry( const Identifier& propertyName ) const;
+     JSValue *_proto;
++#ifdef WIN32
++    JSObject(const JSObject&);
++    JSObject& operator=(const JSObject&);
++#endif
+   };
+ 
+   /**
+--- a/kjs/grammar.y
++++ b/kjs/grammar.y
+@@ -699,7 +699,7 @@
+ 
+ IterationStatement:
+     DO Statement WHILE '(' Expr ')' ';' { $$ = new DoWhileNode($2, $5); DBG($$, @1, @3);}
+-  | DO Statement WHILE '(' Expr ')' error { $$ = new DoWhileNode($2, $5); DBG($$, @1, @3); AUTO_SEMICOLON; }
++  | DO Statement WHILE '(' Expr ')' { $$ = new DoWhileNode($2, $5); DBG($$, @1, @3); }
+   | WHILE '(' Expr ')' Statement        { $$ = new WhileNode($3, $5); DBG($$, @1, @4); }
+   | FOR '(' ExprNoInOpt ';' ExprOpt ';' ExprOpt ')' Statement
+                                         { $$ = new ForNode($3, $5, $7, $9); DBG($$, @1, @8); }
+--- a/kjs/collector.cpp
++++ b/kjs/collector.cpp
+@@ -482,6 +482,10 @@
+   markStackObjectsConservatively();
+   markProtectedObjects();
+   List::markProtectedLists();
++#if USE(MULTIPLE_THREADS)
++  if (!currentThreadIsMainThread)
++    markMainThreadOnlyObjects();
++#endif
+ 
+   // SWEEP: delete everything with a zero refcount (garbage) and unmark everything else
+ 
+--- a/kjs/identifier.h
++++ b/kjs/identifier.h
+@@ -87,6 +87,7 @@
+         bool isEmpty() const { return _ustring.isEmpty(); }
+ 
+         uint32_t toUInt32(bool* ok) const { return _ustring.toUInt32(ok); }
++        uint32_t toUInt32(bool* ok, bool tolerateEmptyString) const { return _ustring.toUInt32(ok, tolerateEmptyString); };
+         uint32_t toStrictUInt32(bool* ok) const { return _ustring.toStrictUInt32(ok); }
+         unsigned toArrayIndex(bool* ok) const { return _ustring.toArrayIndex(ok); }
+         double toDouble() const { return _ustring.toDouble(); }
+--- a/kjs/operations.h
++++ b/kjs/operations.h
+@@ -73,10 +73,10 @@
+   inline bool isPosInf(double d) { return isinf(d) && d > 0; }
+   inline bool isNegInf(double d) { return isinf(d) && d < 0; }
+ #else
+-  bool isNaN(double d);
+-  bool isInf(double d);
+-  bool isPosInf(double d);
+-  bool isNegInf(double d);
++  KJS_EXPORT bool isNaN(double d);
++  KJS_EXPORT bool isInf(double d);
++  KJS_EXPORT bool isPosInf(double d);
++  KJS_EXPORT bool isNegInf(double d);
+ #endif
+ 
+   bool equal(ExecState *exec, JSValue *v1, JSValue *v2);
+--- a/kjs/ustring.cpp
++++ b/kjs/ustring.cpp
+@@ -1451,7 +1451,7 @@
+   }
+ 
+   // Return the result as a C string.
+-  CString result(buffer, p - buffer);
++  CString result(buffer.data(), p - buffer.data());
+ 
+   return result;
+ }
+--- a/kjs/date_object.cpp
++++ b/kjs/date_object.cpp
+@@ -1104,7 +1104,7 @@
+     }
+ 
+     // Missing delimiter between month and day (like "January29")?
+-    if (month == -1 && dateString && wordStart != dateString)
++    if (month == -1 && wordStart != dateString)
+         month = findMonth(wordStart);
+ 
+     dateString = skipSpacesAndComments(dateString);
+--- a/kjs/array_object.cpp
++++ b/kjs/array_object.cpp
+@@ -106,7 +106,7 @@
+       return false;
+     if (index < storageLength) {
+       JSValue *v = storage[index];
+-      if (!v || v->isUndefined())
++      if (!v)
+         return false;      
+       slot.setValueSlot(this, &storage[index]);
+       return true;
+@@ -125,7 +125,7 @@
+     return false;
+   if (index < storageLength) {
+     JSValue *v = storage[index];
+-    if (!v || v->isUndefined())
++    if (!v)
+       return false;
+     slot.setValueSlot(this, &storage[index]);
+     return true;
+@@ -289,7 +289,7 @@
+   }
+ }
+ 
+-static ExecState *execForCompareByStringForQSort;
++static ExecState* execForCompareByStringForQSort;
+ 
+ static int compareByStringForQSort(const void *a, const void *b)
+ {
+@@ -305,13 +305,14 @@
+     return compare(va->toString(exec), vb->toString(exec));
+ }
+ 
+-void ArrayInstance::sort(ExecState *exec)
++void ArrayInstance::sort(ExecState* exec)
+ {
+     int lengthNotIncludingUndefined = pushUndefinedObjectsToEnd(exec);
+-    
++
++    ExecState* oldExec = execForCompareByStringForQSort;
+     execForCompareByStringForQSort = exec;
+-    qsort(storage, lengthNotIncludingUndefined, sizeof(JSValue *), compareByStringForQSort);
+-    execForCompareByStringForQSort = 0;
++    qsort(storage, lengthNotIncludingUndefined, sizeof(JSValue*), compareByStringForQSort);
++    execForCompareByStringForQSort = oldExec;
+ }
+ 
+ struct CompareWithCompareFunctionArguments {
+@@ -330,7 +331,7 @@
+     JSObject *globalObject;
+ };
+ 
+-static CompareWithCompareFunctionArguments *compareWithCompareFunctionArguments;
++static CompareWithCompareFunctionArguments* compareWithCompareFunctionArguments;
+ 
+ static int compareWithCompareFunctionForQSort(const void *a, const void *b)
+ {
+@@ -353,14 +354,15 @@
+     return compareResult < 0 ? -1 : compareResult > 0 ? 1 : 0;
+ }
+ 
+-void ArrayInstance::sort(ExecState *exec, JSObject *compareFunction)
++void ArrayInstance::sort(ExecState* exec, JSObject* compareFunction)
+ {
+     int lengthNotIncludingUndefined = pushUndefinedObjectsToEnd(exec);
+-    
++
++    CompareWithCompareFunctionArguments* oldArgs = compareWithCompareFunctionArguments;
+     CompareWithCompareFunctionArguments args(exec, compareFunction);
+     compareWithCompareFunctionArguments = &args;
+-    qsort(storage, lengthNotIncludingUndefined, sizeof(JSValue *), compareWithCompareFunctionForQSort);
+-    compareWithCompareFunctionArguments = 0;
++    qsort(storage, lengthNotIncludingUndefined, sizeof(JSValue*), compareWithCompareFunctionForQSort);
++    compareWithCompareFunctionArguments = oldArgs;
+ }
+ 
+ unsigned ArrayInstance::pushUndefinedObjectsToEnd(ExecState *exec)
+@@ -856,7 +858,7 @@
+     if (id == Some || id == Every)
+       result = jsBoolean(id == Every);
+     else
+-      result = thisObj;
++      result = jsUndefined();
+     
+     for (unsigned k = 0; k < length && !exec->hadException(); ++k) {
+       PropertySlot slot;
+@@ -903,7 +905,7 @@
+     for (; index < length; ++index) {
+         JSValue* e = getProperty(exec, thisObj, index);
+         if (!e)
+-            e = jsUndefined();
++            continue;
+         if (strictEqual(exec, searchElement, e))
+             return jsNumber(index);
+     }
+@@ -929,7 +931,7 @@
+     for (; index >= 0; --index) {
+         JSValue* e = getProperty(exec, thisObj, index);
+         if (!e)
+-            e = jsUndefined();
++            continue;
+         if (strictEqual(exec, searchElement, e))
+             return jsNumber(index);
+     }
+--- a/kjs/keywords.table
++++ b/kjs/keywords.table
+@@ -43,7 +43,7 @@
+ super           RESERVED
+ 
+ # these words are reserved for future use in the ECMA spec, but not in WinIE
+-# (see http://bugzilla.opendarwin.org/show_bug.cgi?id=6179)
++# (see http://bugs.webkit.org/show_bug.cgi?id=6179)
+ # abstract      RESERVED
+ # boolean       RESERVED
+ # byte          RESERVED
+--- a/kjs/number_object.cpp
++++ b/kjs/number_object.cpp
+@@ -95,13 +95,13 @@
+         Vector<char, 1024> buf(decimalPoint + 1);
+ 
+         if (static_cast<int>(length) <= decimalPoint) {
+-            strcpy(buf, result);
+-            memset(buf + length, '0', decimalPoint - length);
++            strcpy(buf.data(), result);
++            memset(buf.data() + length, '0', decimalPoint - length);
+         } else
+-            strncpy(buf, result, decimalPoint);
++	    strncpy(buf.data(), result, decimalPoint);
+ 
+         buf[decimalPoint] = '\0';
+-        str += UString(buf);
++        str += UString(buf.data());
+     }
+ 
+     kjs_freedtoa(result);
+@@ -114,7 +114,7 @@
+     Vector<char, 2048> buf(count + 1, c);
+     buf[count] = '\0';
+ 
+-    return UString(buf);
++    return UString(buf.data());
+ }
+ 
+ static double intPow10(int e)
+--- a/kfile/kdiroperator.cpp
++++ b/kfile/kdiroperator.cpp
+@@ -370,7 +370,8 @@
+ 
+ void KDirOperator::resetCursor()
+ {
+-    QApplication::restoreOverrideCursor();
++    if (qApp)
++        QApplication::restoreOverrideCursor();
+     d->progressBar->hide();
+ }
+ 
+@@ -1393,13 +1394,15 @@
+     }
+ 
+     QItemSelectionModel *selModel = d->itemView->selectionModel();
+-    selModel->clear();
+-    if (!item.isNull()) {
+-        const QModelIndex dirIndex = d->dirModel->indexForItem(item);
+-        const QModelIndex proxyIndex = d->proxyModel->mapFromSource(dirIndex);
+-        selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select);
+-        selModel->select(proxyIndex, QItemSelectionModel::Select);
+-        d->_k_assureVisibleSelection();
++    if (selModel) {
++        selModel->clear();
++        if (!item.isNull()) {
++            const QModelIndex dirIndex = d->dirModel->indexForItem(item);
++            const QModelIndex proxyIndex = d->proxyModel->mapFromSource(dirIndex);
++            selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::Select);
++            selModel->select(proxyIndex, QItemSelectionModel::Select);
++            d->_k_assureVisibleSelection();
++        }
+     }
+ }
+ 
+--- a/kfile/kurlnavigatorbutton.cpp
++++ b/kfile/kurlnavigatorbutton.cpp
+@@ -22,6 +22,7 @@
+ #include <assert.h>
+ 
+ #include "kurlnavigator.h"
++#include "kdirsortfilterproxymodel.h"
+ 
+ #include <kio/job.h>
+ #include <kio/jobclasses.h>
+@@ -346,8 +347,14 @@
+ 
+         ++it;
+     }
++}
+ 
+-    m_subdirs.sort();
++/**
++ * Helper function for listJobFinished
++ */
++static bool naturalLessThan(const QString& s1, const QString& s2)
++{
++    return KDirSortFilterProxyModel::naturalCompare(s1.toLower(), s2.toLower()) < 0;
+ }
+ 
+ void KUrlNavigatorButton::listJobFinished(KJob* job)
+@@ -362,6 +369,7 @@
+         return;
+     }
+ 
++    qSort(m_subdirs.begin(), m_subdirs.end(), naturalLessThan);
+     setDisplayHintEnabled(PopupActiveHint, true);
+     update(); // ensure the button is drawn highlighted
+ 
+--- a/kfile/kfilefiltercombo.cpp
++++ b/kfile/kfilefiltercombo.cpp
+@@ -130,7 +130,7 @@
+ 
+ void KFileFilterCombo::setCurrentFilter( const QString& filter )
+ {
+-    setEditText( filter );
++    setCurrentIndex(d->m_filters.indexOf(filter));
+     filterChanged();
+ }
+ 
+--- a/kdoctools/kio_help.h
++++ b/kdoctools/kio_help.h
+@@ -1,6 +1,27 @@
+ #ifndef __help_h__
+ #define __help_h__
+ 
++/* This file is part of the KDE libraries
++   Copyright (C) 2000 Matthias Hoelzer-Kluepfel <hoelzer at kde.org>
++   Copyright (C) 2001 Stephan Kulow <coolo at kde.org>
++   Copyright (C) 2003 Cornelius Schumacher <schumacher at kde.org>
++
++   This library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public
++   License as published by the Free Software Foundation; either
++   version 2 of the License, or (at your option) any later version.
++
++   This library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public License
++   along with this library; see the file COPYING.LIB.  If not, write to
++   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.
++*/
++
+ 
+ #include <sys/types.h>
+ #include <sys/stat.h>
+--- a/kdoctools/genshortcutents.cpp
++++ b/kdoctools/genshortcutents.cpp
+@@ -34,60 +34,7 @@
+ #include <QtCore/QTextStream>
+ #include <QtCore/QStringList>
+ 
+-static KStandardShortcut::StandardShortcut accelerators[] = {
+-	KStandardShortcut::Open,
+-	KStandardShortcut::New,
+-	KStandardShortcut::Close,
+-	KStandardShortcut::Save,
+-	KStandardShortcut::Print,
+-	KStandardShortcut::Quit,
+-	KStandardShortcut::Undo,
+-	KStandardShortcut::Redo,
+-	KStandardShortcut::Cut,
+-	KStandardShortcut::Copy,
+-	KStandardShortcut::Paste,
+-	KStandardShortcut::SelectAll,
+-	KStandardShortcut::Deselect,
+-	KStandardShortcut::DeleteWordBack,
+-	KStandardShortcut::DeleteWordForward,
+-	KStandardShortcut::Find,
+-	KStandardShortcut::FindNext,
+-	KStandardShortcut::FindPrev,
+-	KStandardShortcut::Replace,
+-	KStandardShortcut::Home,
+-	KStandardShortcut::End,
+-	KStandardShortcut::Prior,
+-	KStandardShortcut::Next,
+-	KStandardShortcut::GotoLine,
+-	KStandardShortcut::AddBookmark,
+-	KStandardShortcut::ZoomIn,
+-	KStandardShortcut::ZoomOut,
+-	KStandardShortcut::Up,
+-	KStandardShortcut::Back,
+-	KStandardShortcut::Forward,
+-	KStandardShortcut::Reload,
+-	KStandardShortcut::PopupMenuContext,
+-	KStandardShortcut::ShowMenubar,
+-	KStandardShortcut::Help,
+-	KStandardShortcut::WhatsThis,
+-	KStandardShortcut::TextCompletion,
+-	KStandardShortcut::PrevCompletion,
+-	KStandardShortcut::NextCompletion,
+-	KStandardShortcut::SubstringCompletion,
+-	KStandardShortcut::RotateUp,
+-	KStandardShortcut::RotateDown,
+-	KStandardShortcut::TabNext,
+-	KStandardShortcut::TabPrev,
+-	KStandardShortcut::FullScreen,
+-	KStandardShortcut::BackwardWord,
+-	KStandardShortcut::ForwardWord,
+-	KStandardShortcut::BeginningOfLine,
+-	KStandardShortcut::EndOfLine,
+-	KStandardShortcut::PasteSelection
+-};
+-static const unsigned int numAccelerators = sizeof( accelerators ) / sizeof( accelerators[ 0 ] );
+-
+-QString keyAsMarkup( const QString &key )
++static QString keyAsMarkup( const QString &key )
+ {
+ 	if ( key == "Alt" || key == "Ctrl" || key == "Enter" || key == "Esc" ||
+ 	     key == "Shift" || key == "Tab" ) {
+@@ -108,7 +55,7 @@
+ 	return QString("<keycap>" + key + "</keycap>");
+ }
+ 
+-QString entityForAccel( KStandardShortcut::StandardShortcut accel )
++static QString entityForAccel( KStandardShortcut::StandardShortcut accel )
+ {
+ 	QString markup = "<!ENTITY KeyCombo_";
+ 
+@@ -179,6 +126,9 @@
+ 		case KStandardShortcut::Home:
+ 			markup += "Home";
+ 			break;
++		case KStandardShortcut::Begin:
++			markup += "Begin";
++			break;
+ 		case KStandardShortcut::End:
+ 			markup += "End";
+ 			break;
+@@ -266,6 +216,8 @@
+ 		case KStandardShortcut::PasteSelection:
+ 			markup += "PastSelection";
+ 			break;
++		case KStandardShortcut::StandardShortcutCount:
++			break;
+ 	}
+ 
+ 	markup += "\t\"";
+@@ -329,8 +281,8 @@
+ 	       << "     overwritten as soon as the file is regenerated. -->\n";
+ 	stream << "\n";
+ 
+-	for ( unsigned int i = 0; i < numAccelerators; ++i ) {
+-		stream << entityForAccel( accelerators[ i ] ) << "\n";
++	for ( unsigned int i = 0; i < KStandardShortcut::StandardShortcutCount; ++i ) {
++            stream << entityForAccel( static_cast<KStandardShortcut::StandardShortcut>(i)  ) << "\n";
+ 	}
+ }
+ 
+--- a/kdoctools/customization/ja/entities/underGPL.docbook
++++ b/kdoctools/customization/ja/entities/underGPL.docbook
+@@ -1,2 +1,2 @@
+-<para>This program is licensed under the terms of the <ulink
+-url="common/gpl-translated.html">GNU General Public License</ulink>.</para>
++<para>このプログラムのライセンスは <ulink
++url="common/gpl-translated.html">GNU General Public License </ulink> です。</para>
+--- a/kdoctools/customization/ja/entities/underArtisticLicense.docbook
++++ b/kdoctools/customization/ja/entities/underArtisticLicense.docbook
+@@ -1,2 +1 @@
+-<para>This program is licensed under the terms of the <ulink
+-url="common/artistic-license.html">Artistic License</ulink>.</para>
++<para>このプログラムのライセンスは <ulink url="common/artistic-license.html">Artistic License</ulink> です。</para>
+--- a/kdoctools/customization/ja/entities/underFDL.docbook
++++ b/kdoctools/customization/ja/entities/underFDL.docbook
+@@ -1,3 +1,3 @@
+-<para id="gnu-fdl" xreflabel="the section entitled &quot;GNU Free Documentation License&quot;">This documentation is licensed under the terms of the <ulink
++<para id="gnu-fdl" xreflabel="the section entitled &quot;GNU Free Documentation License&quot;">このドキュメンテーションのライセンスは <ulink
+ url="common/fdl-license.html">GNU Free Documentation
+-License</ulink>.</para>
++License</ulink> です。</para>
+--- a/kdoctools/customization/ja/entities/underBSDLicense.docbook
++++ b/kdoctools/customization/ja/entities/underBSDLicense.docbook
+@@ -1,2 +1 @@
+-<para>This program is licensed under the terms of the <ulink
+-url="common/bsd-license.html">BSD License</ulink>.</para>
++<para>このプログラムのライセンスは <ulink url="common/bsd-license.html">BSD License</ulink> です。</para>
+--- a/kdoctools/customization/ja/entities/help-menu.docbook
++++ b/kdoctools/customization/ja/entities/help-menu.docbook
+@@ -1,58 +1,93 @@
+ <variablelist>
+ <varlistentry>
+ <term>
+-<menuchoice>
+-<shortcut>
+-<keycombo action="simul"><keycap>F1</keycap></keycombo>
+-</shortcut>
+-<guimenu>Help</guimenu>
+-<guimenuitem>Contents...</guimenuitem>
+-</menuchoice>
++<menuchoice
++><shortcut
++> <keycombo action="simul"
++><keycap
++>F1</keycap
++></keycombo
++> </shortcut
++> <guimenu
++>ヘルプ</guimenu
++> <guimenuitem
++>&kappname; ハンドブック</guimenuitem
++> </menuchoice>
+ </term>
+-<listitem><para><action>Invokes the KDE Help system</action> starting at the
+-&kappname; help pages. (this document).</para></listitem>
++<listitem
++><para
++>KDE のヘルプシステムを起動して &kappname; のヘルプページ (このドキュメント) を開きます。</para
++></listitem>
+ </varlistentry>
+ 
+ <varlistentry>
+-<term><menuchoice>
+-<shortcut>
+-<keycombo action="simul">&Shift;<keycap>F1</keycap></keycombo>
+-</shortcut>
+-<guimenu>Help</guimenu>
+-<guimenuitem>What's This?</guimenuitem>
+-</menuchoice>
++<term
++><menuchoice
++><shortcut
++> <keycombo action="simul"
++>&Shift;<keycap
++>F1</keycap
++></keycombo
++> </shortcut
++> <guimenu
++>ヘルプ</guimenu
++> <guimenuitem
++>これは何?</guimenuitem
++> </menuchoice>
+ </term>
+-<listitem><para><action>Changes the mouse cursor to a combination arrow and
+-question mark.</action>  Clicking on items within &kappname; will open a help
+-window (if one exists for the particular item) explaining the item's
+-function.</para></listitem>
++<listitem
++><para
++>これを選択するとマウスカーソルの形が矢印とクエスチョンマークに変わります。その状態で &kappname; のユーザインターフェースの要素をクリックすると、それぞれの機能を説明するヘルプウィンドウが表示されます (その要素にヘルプがある場合のみ)。</para
++></listitem>
+ </varlistentry>
+ 
+ 
+ <varlistentry>
+-<term><menuchoice>
+-<guimenu>Help</guimenu>
+-<guimenuitem>Report Bug...</guimenuitem>
+-</menuchoice></term>
+-<listitem><para><action>Opens the Bug report dialog</action> where you can
+-report a bug or request a <quote>wishlist</quote> feature.</para></listitem>
++<term
++><menuchoice
++><guimenu
++>ヘルプ</guimenu
++> <guimenuitem
++>バグを報告...</guimenuitem
++> </menuchoice
++></term>
++<listitem
++><para
++>バグレポート用のダイアログを開きます。これを使ってプログラムの不具合を報告したり、要望を送ったりすることができます。</para
++></listitem>
+ </varlistentry>
+ 
+ <varlistentry>
+-<term><menuchoice>
+-<guimenu>Help</guimenu>
+-<guimenuitem>About &kappname;</guimenuitem>
+-</menuchoice></term>
+-<listitem><para><action>This will display version and author
+-information.</action></para></listitem>
++<term
++><menuchoice
++><guimenu
++>ヘルプ</guimenu
++> <guimenuitem
++>&kappname; について</guimenuitem
++> </menuchoice
++></term>
++<listitem
++><para
++><action
++>プログラムのバージョンと作者を表示します。</action
++></para
++></listitem>
+ </varlistentry>
+ 
+ <varlistentry>
+-<term><menuchoice>
+-<guimenu>Help</guimenu>
+-<guimenuitem>About KDE</guimenuitem>
+-</menuchoice></term>
+-<listitem><para><action>This displays the KDE version and other basic
+-information.</action></para></listitem>
++<term
++><menuchoice
++><guimenu
++>ヘルプ</guimenu
++> <guimenuitem
++>KDE について</guimenuitem
++> </menuchoice
++></term>
++<listitem
++><para
++><action
++>KDE のバージョンと基本的な情報を表示します。</action
++></para
++></listitem>
+ </varlistentry>
+ </variablelist>
+--- a/kdoctools/customization/ja/entities/underX11License.docbook
++++ b/kdoctools/customization/ja/entities/underX11License.docbook
+@@ -1,2 +1 @@
+-<para>This program is licensed under the terms of the <ulink
+-url="common/x11-license.html">X11 License</ulink>.</para>
++<para>このプログラムのライセンスは <ulink url="common/x11-license.html">X11 License</ulink> です。</para>
+--- a/kdoctools/customization/ja/entities/install-compile.docbook
++++ b/kdoctools/customization/ja/entities/install-compile.docbook
+@@ -1,12 +1,8 @@
+-<para>In order to compile and install &kappname; on your system, type the
+-following in the base directory of the &kappname; distribution:</para>
++<para>&kappname; をコンパイルしてインストールするには、&kappname; ディストリビューションのベースディレクトリで次のようにタイプします。</para>
+ 
+ <screen><prompt>%</prompt> <userinput><command>./configure</command></userinput>
+ <prompt>%</prompt> <userinput><command>make</command></userinput>
+ <prompt>%</prompt> <userinput><command>make</command> install</userinput>
+ </screen>
+ 
+-<para>Since &kappname; uses <command>autoconf</command> and
+-<command>automake</command> you should have no trouble compiling it. Should you
+-run into problems please report them to the &kde; mailing lists.</para>
+-
++<para>&kappname; は <command>autoconf</command> と <command>automake</command> を使っているので容易にコンパイルできるはずです。問題にぶつかった場合は、&kde; のメーリングリストに報告してください。</para>
+--- a/kdoctools/customization/ja/entities/install-intro.docbook
++++ b/kdoctools/customization/ja/entities/install-intro.docbook
+@@ -1,6 +1,4 @@
+ <!-- requires that packagename is defined in the documentation prologue -->
+-<para>&kappname; is part of the &kde; project &kde-http;.</para>
++<para>&kappname; は &kde; プロジェクト &kde-http; の一部です。</para>
+ 
+-<para>&kappname; can be found in the &package; package on 
+-&kde-ftp;, the main &FTP; site of the &kde;
+-project.</para>
++<para>&kappname; は &kde; プロジェクトのメイン &FTP; サイトである &kde-ftp; にある &package; パッケージに含まれています。</para>
+--- a/kdoctools/customization/fr/user.entities
++++ b/kdoctools/customization/fr/user.entities
+@@ -86,6 +86,9 @@
+ <!ENTITY traducteurGuillaumeDuweltzRebert     '<othercredit role="translator"><firstname>Guillaume</firstname><surname>Duweltz</surname><affiliation><address><email>gduwelz-rebert.cs at clearstream.com</email></address></affiliation><contrib>Traduction française&nbsp;</contrib></othercredit>'>
+ <!ENTITY relecteurGuillaumeDuweltzRebert      '<othercredit role="relecteur"><firstname>Guillaume</firstname><surname>Duweltz</surname><affiliation><address><email>gduwelz-rebert.cs at clearstream.com</email></address></affiliation><contrib>Relecture de la documentation française&nbsp;</contrib></othercredit>'>
+ 
++<!ENTITY traducteurGuillaumeFahrner     '<othercredit role="translator"><firstname>Guillaume</firstname><surname>Fahrner</surname><affiliation><address><email>Admin at SecurityHack.Org</email></address></affiliation><contrib>Traduction française&nbsp;</contrib></othercredit>'>
++<!ENTITY relecteurGuillaumeFahrner      '<othercredit role="relecteur"><firstname>Guillaume</firstname><surname>Fahrner</surname><affiliation><address><email>Admin at SecurityHack.Org</email></address></affiliation><contrib>Relecture de la documentation française&nbsp;</contrib></othercredit>'>
++
+ <!ENTITY traducteurSamiFantar    '<othercredit role="translator"><firstname>Sami</firstname><surname>Fantar</surname><affiliation><address><email>sami.fantar at laposte.net</email></address></affiliation><contrib>Traduction française&nbsp;</contrib></othercredit>'>
+ <!ENTITY relecteurSamiFantar     '<othercredit role="reviewer"><firstname>Sami</firstname><surname>Fantar</surname><affiliation><address><email>sami.fantar at laposte.net</email></address></affiliation><contrib>Relecture de la documentation française&nbsp;</contrib></othercredit>'>
+ 
+@@ -243,6 +246,7 @@
+ <!ENTITY NicolasDupuis     'Nicolas Dupuis <email>ndupuis at tiscali.be</email>'>
+ <!ENTITY HeleneDuwelzRebert 'Hélène Duwelz-Rebert <email>helened at herbalife.com</email>'>
+ <!ENTITY GuillaumeDuwelzRebert 'Guillaume Duwelz-Rebert <email>gduwelz-rebert.cs at clearstream.com</email>'>
++<!ENTITY GuillaumeFahrner 'Guillaume Fahrner <email>Admin at SecurityHack.Org</email>'>
+ <!ENTITY SamiFantar          'Sami Fantar <email>sami.fantar at laposte.net</email>'>
+ <!ENTITY NilsSergioFernandez 'Nils Sergio Fernandez Rönningen <email>nilsfernandez at yahoo.fr</email>'>
+ <!ENTITY JeanJacquesFinazzi 'Jean-Jacques Finazzi <email>jj.finazzi at club.fr</email>'>
+--- a/kdoctools/customization/entities/general.entities
++++ b/kdoctools/customization/entities/general.entities
+@@ -119,7 +119,8 @@
+ <!ENTITY artswrapper	"<application>artswrapper</application>">
+ <!ENTITY ATAPI	"<acronym>ATAPI</acronym>">
+ <!ENTITY atlantik	"<application>Atlantik</application>">
+-<!ENTITY blinken	"<application>blinKen</application>">
++<!ENTITY blinken	"<application>Blinken</application>">
++<!ENTITY bovo	"<application>Bovo</application>">
+ <!ENTITY catalogmanager	"<application>Catalog Manager</application>">
+ <!ENTITY CD	"<acronym>CD</acronym>">
+ <!ENTITY CDE	"<acronym>CDE</acronym>">
+@@ -257,6 +258,7 @@
+ <!ENTITY kmouth "<application>KMouth</application>">
+ <!ENTITY kmousetool "<application>KMouseTool</application>">
+ <!ENTITY knetattach     "<application>KNetAttach</application>">
++<!ENTITY knetwalk       "<application>KNetWalk</application>">
+ <!ENTITY knewsticker	"<application>KNewsTicker</application>">
+ <!ENTITY knode	"<application>KNode</application>">
+ <!ENTITY knotes	"<application>KNotes</application>">
+@@ -371,6 +373,7 @@
+ <!ENTITY Netscape	'<trademark class="registered">Netscape</trademark>'>
+ <!ENTITY NeXTSTEP	"<trademark>NeXTSTEP</trademark>">
+ <!ENTITY noatun	"<application>Noatun</application>">
++<!ENTITY okular	"<application>okular</application>">
+ <!ENTITY PalmOS	'<trademark class="registered">Palm OS</trademark>'>
+ <!ENTITY PalmPilot	"<productname><trademark>PalmPilot</trademark></productname>">
+ <!ENTITY parley	"<application>Parley</application>">
+--- a/kdoctools/customization/entities/contributor.entities
++++ b/kdoctools/customization/entities/contributor.entities
+@@ -66,6 +66,8 @@
+ <!ENTITY Stephan.Binner.mail '<email>binner at kde.org</email>'>
+ <!ENTITY Eric.Bischoff '<personname><firstname>Éric</firstname><surname>Bischoff</surname></personname>'>
+ <!ENTITY Eric.Bischoff.mail '<email>e.bischoff at noos.fr</email>'>
++<!ENTITY Aron.Bostrom '<personname><firstname>Aron</firstname><surname>Boström</surname></personname>'>
++<!ENTITY Aron.Bostrom.mail '<email>aron.bostrom at gmail.com</email>'>
+ <!ENTITY Michael.Brade '<personname><firstname>Michael</firstname><surname>Brade</surname></personname>'>
+ <!ENTITY Michael.Brade.mail '<email>brade at kde.org</email>'>
+ <!ENTITY Preston.Brown '<personname><firstname>Preston</firstname><surname>Brown</surname></personname>'>
+--- a/kdoctools/kio_help.cpp
++++ b/kdoctools/kio_help.cpp
+@@ -1,3 +1,25 @@
++/* This file is part of the KDE libraries
++   Copyright (C) 2000 Matthias Hoelzer-Kluepfel <hoelzer at kde.org>
++   Copyright (C) 2001 Stephan Kulow <coolo at kde.org>
++   Copyright (C) 2003 Cornelius Schumacher <schumacher at kde.org>
++
++   This library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public
++   License as published by the Free Software Foundation; either
++   version 2 of the License, or (at your option) any later versio
++
++   This library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public License
++   along with this library; see the file COPYING.LIB.  If not, write to
++   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.
++*/
++
++
+ #include "kio_help.h"
+ 
+ #include <config.h>
+@@ -60,7 +82,7 @@
+     {
+         QStringList::ConstIterator lang;
+         for (lang = langs.begin(); lang != langs.end(); ++lang)
+-            search.append(QString("%1%2/%3").arg(localDoc[id]).arg(*lang).arg(fname));
++            search.append(QString("%1%2/%3").arg(localDoc[id], *lang, fname));
+     }
+ 
+     // try to locate the file
+--- a/kross/kjs/kjsscript.cpp
++++ b/kross/kjs/kjsscript.cpp
+@@ -78,10 +78,17 @@
+     class KjsScriptPrivate
+     {
+         public:
+-            /// One engine per script to have them clean separated.
++            /**
++            * One engine per script to have them clean separated.
++            */
+             KJSEmbed::Engine* m_engine;
+ 
+             /**
++            * The KJS objects that got published.
++            */
++            QList< KJS::JSObject* > m_publishedObjects;
++
++            /**
+             * List of QObject instances that should be
+             * auto connected on execution.
+             * \see ChildrenInterface::AutoConnectSignals
+@@ -115,15 +122,16 @@
+             }
+ 
+             /// Publish a QObject to a KJSEmbed::Engine.
+-            void publishObject(KJS::ExecState* exec, const QString &name, QObject* object)
++            bool publishObject(KJS::ExecState* exec, const QString &name, QObject* object)
+             {
+                 Q_UNUSED(exec);
+ 
+                 KJS::JSObject* obj = m_engine->addObject(object, name.isEmpty() ? object->objectName() : name);
+                 if( ! obj ) {
+                     krosswarning( QString("Failed to publish the QObject name=\"%1\" objectName=\"%2\"").arg(name).arg(object ? object->objectName() : "NULL") );
+-                    return;
++                    return false;
+                 }
++                m_publishedObjects << obj;
+ 
+                 /*
+                 bool restricted = interpreter()->interpreterInfo()->optionValue("restricted", true).toBool();
+@@ -143,6 +151,7 @@
+                     );
+                 }
+                 */
++                return true;
+             }
+ 
+     };
+@@ -215,8 +224,24 @@
+ 
+ void KjsScript::finalize()
+ {
++    KJS::Interpreter* kjsinterpreter = d->m_engine->interpreter();
++    KJS::ExecState* exec = kjsinterpreter->globalExec();
++
++    foreach(KJS::JSObject* kjsobj, d->m_publishedObjects) {
++        KJSEmbed::QObjectBinding *imp = KJSEmbed::extractBindingImp<KJSEmbed::QObjectBinding>(exec, kjsobj);
++        Q_ASSERT(imp);
++        QObject* obj = imp->object<QObject>();
++        Q_ASSERT(obj);
++        foreach(QObject* child, obj->children())
++            if( KJSEmbed::SlotProxy* proxy = dynamic_cast< KJSEmbed::SlotProxy* >( child ) )
++                delete proxy;
++        delete kjsobj;
++    }
++    d->m_publishedObjects.clear();
++
+     d->m_autoconnect.clear();
+     d->m_defaultFunctionNames.clear();
++
+     delete d->m_engine;
+     d->m_engine = 0;
+ }
+@@ -320,24 +345,26 @@
+ 
+ QVariant KjsScript::callFunction(const QString& name, const QVariantList& args)
+ {
++    //if( hadError() ) return QVariant(); // check if we had a prev error and abort if that's the case
++
+     KJS::Interpreter* kjsinterpreter = d->m_engine->interpreter();
+     KJS::ExecState* exec = kjsinterpreter->globalExec();
+     KJS::JSObject* kjsglobal = kjsinterpreter->globalObject();
+-    if( ! exec->hadException() ) {
+-        //setError()
++    if( exec->hadException() ) {
++        ErrorInterface error = extractError(d->m_engine->completion(), exec);
++        //setError(&error);
++        krossdebug(QString("KjsScript::callFunction(\"%1\") Prev error: %2").arg(name).arg(error.errorMessage()));
+         return QVariant();
+     }
+ 
+     KJS::Identifier id = KJS::Identifier( KJS::UString(name.toLatin1().data()) );
+     KJS::JSValue *functionvalue = kjsglobal->get(exec, id);
+-    if( exec->hadException() ) {
+-        //setError()
+-        return QVariant();
+-    }
++    Q_ASSERT( ! exec->hadException() );
+ 
+     KJS::JSObject *function = functionvalue->toObject(exec);
+     if ( ! function || ! function->implementsCall() ) {
+-        //setError()
++        krossdebug(QString("KjsScript::callFunction(\"%1\") No such function").arg(name));
++        setError(QString("No such function \"%1\"").arg(name));
+         return QVariant();
+     }
+ 
+@@ -350,7 +377,10 @@
+ 
+     KJS::JSValue *retValue = function->call(exec, kjsglobal, kjsargs);
+     if( exec->hadException() ) {
+-        //setError()
++        ErrorInterface error = extractError(d->m_engine->completion(), exec);
++        //exec->clearException();
++        krossdebug(QString("KjsScript::callFunction(\"%1\") Call failed: %2").arg(name).arg(error.errorMessage()));
++        setError(&error);
+         return QVariant();
+     }
+ 
+--- a/phonon/volumeslider.cpp
++++ b/phonon/volumeslider.cpp
+@@ -132,6 +132,10 @@
+         d->slider.setValue(qRound(100 * output->volume()));
+         d->slider.setEnabled(true);
+         d->muteButton.setEnabled(true);
++
++        d->_k_volumeChanged(output->volume());
++        d->_k_mutedChanged(output->isMuted());
++
+         connect(output, SIGNAL(volumeChanged(qreal)), SLOT(_k_volumeChanged(qreal)));
+         connect(output, SIGNAL(mutedChanged(bool)), SLOT(_k_mutedChanged(bool)));
+     } else {
+--- a/phonon/phonon.notifyrc
++++ b/phonon/phonon.notifyrc
+@@ -3,17 +3,24 @@
+ Comment=Phonon: KDE's Multimedia Library
+ Comment[ca]=Phonon: biblioteca multimèdia del KDE
+ Comment[cs]=Phonon: multimediální knihovna KDE
++Comment[de]=Phonon: Die Multimedia-Bibliothek von KDE
+ Comment[el]=Phonon: Βιβλιοθήκη πολυμέσων του KDE
++Comment[et]=Phonon: KDE multimeediateek
+ Comment[ga]=Phonon: Leabharlann Il-mheán KDE
+ Comment[hu]=Phonon: a KDE multimédia modulja
+ Comment[it]=Phonon: Libreria multimediale di KDE
+ Comment[ja]=Phonon: KDE のマルチメディアライブラリ
++Comment[kk]=Phonon: KDE-нің мультимедиа жиыны
+ Comment[km]=Phonon ៖ បណ្ណាល័យ​ពហុព័ត៌មាន​របស់ KDE
++Comment[lv]=Phonon: KDE multimedijas bibliotēka
+ Comment[nds]=Phonon: KDE sien Multimedia-Bibliotheek
+ Comment[nl]=Phonon: KDE's multimediabibliotheek
+ Comment[pt]=Phonon: A Biblioteca Multimédia do KDE
+ Comment[pt_BR]=Phonon: Biblioteca Multimídia do KDE
++Comment[sr]=Фонон: КДЕ-ова мултимедијска библиотека
++Comment[sr at latin]=Phonon: KDE-ova multimedijska biblioteka
+ Comment[sv]=Phonon: KDE:s multimediabibliotek
++Comment[uk]=Phonon: бібліотека мультимедії KDE
+ Comment[x-test]=xxPhonon: KDE's Multimedia Libraryxx
+ Comment[zh_CN]=Phonon:KDE 的多媒体库
+ Comment[zh_TW]=Phonon:KDE 的多媒體函式庫
+@@ -91,32 +98,45 @@
+ Name=Audio Device Fallback
+ Name[ca]=Dispositiu d'àudio de reserva
+ Name[cs]=Záložní zvukové zařízení
++Name[de]=Ausweichgerät für Audio
+ Name[el]=Εφεδρική συσκευή ήχου
++Name[et]=Heliseadme varuvariant
+ Name[ga]=Gléas Tacachumais Fuaime
+ Name[hu]=Másodlagos hangeszköz
+ Name[it]=Ripristino dispositivo audio
+ Name[ja]=オーディオデバイスのフォールバック
++Name[kk]=Қосалқы аудио құрылғысы
+ Name[km]=ឧបករណ៍​អូឌីយ៉ូ Fallback
++Name[lv]=Audioiekārtas atkāpsistēma
+ Name[nds]=Opback-Klangreedschap
+ Name[nl]=Terugvalapparaat voor geluid
+ Name[pa]=ਆਡੀਓ ਜੰਤਰ ਫਾਲਬੈਕ
+ Name[pt]=Dispositivo Áudio Alternativo
+ Name[pt_BR]=Dispositivo de Áudio Alternativo
++Name[sr]=Спадање аудио уређаја
++Name[sr at latin]=Spadanje audio uređaja
+ Name[sv]=Reservenhet för ljud vald
+ Name[x-test]=xxAudio Device Fallbackxx
+ Name[zh_CN]=默认音频设备
+ Name[zh_TW]=預設音效裝置
+ Comment=Notification on automatic fallback if the preferred devices in unavailable
+ Comment[ca]=Notificació del funcionament automàtic del de reserva si el dispositiu preferit no és disponible
++Comment[de]=Benachrichtigung bei automatischem Ausweichen, wenn das bevorzugte Geräte nicht verfügbar ist.
+ Comment[el]=Ειδοποίηση όταν γίνει αυτόματη αλλαγή στην εφεδρική συσκευή ήχου, αν η προκαθορισμένη δεν είναι διαθέσιμη
++Comment[et]=Automaatne varuvariant, kui eelistatud seadmeid pole saadaval
+ Comment[ga]=Fógairt maidir le gléas tacachumais nuair nach bhfuil do rogha gléis ar fáil
+ Comment[hu]=Értesítés a másodlagos hangeszköz aktiválásáról, ha az elsődleges eszköz nem használható
+ Comment[it]=Notifica dopo il ripristino automatico se il dispositivo preferito non è disponibile
+ Comment[ja]=優先デバイスが利用できないために自動的にフォールバックしたときの通知
++Comment[kk]=Таңдалған құрылғысы істемегенде қосалқысына көшу туралы құлақтандыру
++Comment[km]=ការ​ជូន​ដំណឹង​អំពី fallback ដោយ​ស្វ័យ​ប្រវត្តិ​នៅពេល​ដែល​មិនមាន​ឧបករណ៍​ដែល​ចូលចិត្ត
++Comment[lv]=Paziņojums par automātisku atkāpsistēmas izmantošanu, ja vēlamās iekārtas nav pieejamas
+ Comment[nds]=Bescheed, wenn de vörtrocken Reedschap nich verföögbor is un ansteed de Opbackreedschap bruukt warrt
+ Comment[nl]=Melding van automatische terugval als het apparaat van voorkeur niet beschikbaar is
+ Comment[pt]=Notificação automática de último recurso se os dispositivos preferidos estiverem indisponíveis
+ Comment[pt_BR]=Notificação de 'fallback' automático se os dispositivos preferidos estiverem indisponíveis
++Comment[sr]=Обавештење о аутоматском спадању у случају да пожељни уређај није доступан
++Comment[sr at latin]=Obaveštenje o automatskom spadanju u slučaju da poželjni uređaj nije dostupan
+ Comment[sv]=Underrättelse vid automatisk val av reservenhet om önskad enhet inte är tillgänglig
+ Comment[x-test]=xxNotification on automatic fallback if the preferred devices in unavailablexx
+ Comment[zh_CN]=如果首选的设备不可用,在默认设备上通知
+--- /dev/null
++++ b/phonon/tests/guitest/effectitem.cpp
+@@ -0,0 +1,41 @@
++/*  This file is part of the KDE project
++    Copyright (C) 2007 Matthias Kretz <kretz at kde.org>
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Library General Public
++    License version 2 as published by the Free Software Foundation.
++
++    This library 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
++    Library General Public License for more details.
++
++    You should have received a copy of the GNU Library General Public License
++    along with this library; see the file COPYING.LIB.  If not, write to
++    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++    Boston, MA 02110-1301, USA.
++
++*/
++
++#include "effectitem.h"
++#include <QtCore/QModelIndex>
++#include <QtGui/QHBoxLayout>
++#include <QtGui/QListView>
++
++#include <Phonon/BackendCapabilities>
++#include <Phonon/EffectWidget>
++
++using Phonon::EffectWidget;
++
++EffectItem::EffectItem(const EffectDescription &desc, const QPoint &pos, QGraphicsView *widget)
++    : SinkItem(pos, widget),
++    m_effect(desc)
++{
++    setBrush(QColor(255, 200, 0, 150));
++
++    QHBoxLayout *hlayout = new QHBoxLayout(m_frame);
++    hlayout->setMargin(0);
++
++    EffectWidget *w = new EffectWidget(&m_effect, m_frame);
++    hlayout->addWidget(w);
++}
+--- /dev/null
++++ b/phonon/tests/guitest/effectitem.h
+@@ -0,0 +1,48 @@
++/*  This file is part of the KDE project
++    Copyright (C) 2007 Matthias Kretz <kretz at kde.org>
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Library General Public
++    License version 2 as published by the Free Software Foundation.
++
++    This library 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
++    Library General Public License for more details.
++
++    You should have received a copy of the GNU Library General Public License
++    along with this library; see the file COPYING.LIB.  If not, write to
++    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++    Boston, MA 02110-1301, USA.
++
++*/
++
++#ifndef EFFECTITEM_H
++#define EFFECTITEM_H
++
++#include "sinkitem.h"
++#include <Phonon/Effect>
++#include <Phonon/EffectDescription>
++
++class QModelIndex;
++
++using Phonon::Effect;
++using Phonon::EffectDescription;
++
++class EffectItem : public SinkItem
++{
++    Q_OBJECT
++    public:
++        EffectItem(const EffectDescription &, const QPoint &pos, QGraphicsView *widget);
++
++        enum { Type = UserType + 10 };
++        int type() const { return Type; }
++
++        virtual MediaNode *mediaNode() { return &m_effect; }
++        virtual const MediaNode *mediaNode() const { return &m_effect; }
++
++    private:
++        Effect m_effect;
++};
++
++#endif // EFFECTITEM_H
+--- a/phonon/tests/guitest/mygraphicsscene.cpp
++++ b/phonon/tests/guitest/mygraphicsscene.cpp
+@@ -23,6 +23,7 @@
+ #include "redrectitem.h"
+ #include "sinkitem.h"
+ #include "pathitem.h"
++#include "effectitem.h"
+ 
+ using Phonon::Path;
+ 
+@@ -47,7 +48,7 @@
+         if (startItems.size() == 1) {
+             m_startItem = qgraphicsitem_cast<MediaObjectItem *>(startItems.first());
+             if (!m_startItem) {
+-                m_startItem = qgraphicsitem_cast<SinkItem *>(startItems.first());
++                m_startItem = qgraphicsitem_cast<EffectItem *>(startItems.first());
+             }
+             if (m_startItem) {
+                 m_lineItem = new QGraphicsLineItem(QLineF(mouseEvent->scenePos(), mouseEvent->scenePos()));
+@@ -76,22 +77,43 @@
+                 endItems = items(QRectF(mouseEvent->scenePos() - offset, mouseEvent->scenePos() + offset));
+             }
+         }
+-        if (endItems.size() == 1) {
++        if (endItems.size() == 1 && endItems.first() != m_startItem) {
+             QGraphicsItem *endItem = endItems.first();
++            MediaNode *sourceNode = 0;
++            MediaNode *sinkNode = 0;
++            WidgetRectItem *sourceItem = 0;
++            WidgetRectItem *sinkItem = 0;
++
+             MediaObjectItem *source = qgraphicsitem_cast<MediaObjectItem *>(m_startItem);
+-            SinkItem *sink = 0;
+-            if (!source) {
+-                source = qgraphicsitem_cast<MediaObjectItem *>(endItem);
+-                sink = qgraphicsitem_cast<SinkItem *>(m_startItem);
++            if (source) {
++                sourceNode = source->mediaNode();
++                sourceItem = source;
+             } else {
+-                sink = qgraphicsitem_cast<SinkItem *>(endItem);
++                EffectItem *source= qgraphicsitem_cast<EffectItem *>(m_startItem);
++                if (source) {
++                    sourceNode = source->mediaNode();
++                    sourceItem = source;
++                }
+             }
+-            if (source && sink && endItem != m_startItem) {
+-                Path p = Phonon::createPath(source->mediaNode(), sink->mediaNode());
+-                if (p.isValid()) {
+-                    addItem(new PathItem(source, sink, p));
+-                    m_startItem = 0;
+-                    return;
++            if (sourceItem && sourceNode) {
++                SinkItem *sink = qgraphicsitem_cast<SinkItem *>(endItem);
++                if (sink) {
++                    sinkNode = sink->mediaNode();
++                    sinkItem = sink;
++                } else {
++                    EffectItem *sink = qgraphicsitem_cast<EffectItem *>(endItem);
++                    if (sink) {
++                        sinkNode = sink->mediaNode();
++                        sinkItem = sink;
++                    }
++                }
++                if (sinkItem && sinkNode) {
++                    Path p = Phonon::createPath(sourceNode, sinkNode);
++                    if (p.isValid()) {
++                        addItem(new PathItem(sourceItem, sinkItem, p));
++                        m_startItem = 0;
++                        return;
++                    }
+                 }
+             }
+         }
+--- a/phonon/tests/guitest/main.cpp
++++ b/phonon/tests/guitest/main.cpp
+@@ -17,9 +17,11 @@
+ 
+ */
+ 
++#include <QtCore/QSignalMapper>
+ #include <QtGui/QAction>
+ #include <QtGui/QGraphicsView>
+ #include <QtGui/QMainWindow>
++#include <QtGui/QMenu>
+ #include "mediaobjectitem.h"
+ #include "mygraphicsscene.h"
+ #include <kaboutdata.h>
+@@ -30,6 +32,8 @@
+ #include "audiooutputitem.h"
+ #include "videowidgetitem.h"
+ #include "pathitem.h"
++#include "effectitem.h"
++#include <Phonon/BackendCapabilities>
+ 
+ class MainWindow : public QMainWindow
+ {
+@@ -40,6 +44,7 @@
+     private slots:
+         void init();
+         void addMediaObject();
++        void addEffect(int);
+         void addAudioOutput();
+         void addVideoWidget();
+ 
+@@ -153,6 +158,19 @@
+     action = new QAction(i18n("add MediaObject"), m_view);
+     connect(action, SIGNAL(triggered()), SLOT(addMediaObject()));
+     m_view->addAction(action);
++
++    action = new QAction(i18n("add Effect"), m_view);
++    QMenu *menu = new QMenu("Title", m_view);
++    QList<EffectDescription> effectList = Phonon::BackendCapabilities::availableAudioEffects();
++    QSignalMapper *mapper = new QSignalMapper(menu);
++    connect(mapper, SIGNAL(mapped(int)), SLOT(addEffect(int)));
++    foreach (const EffectDescription &d, effectList) {
++        QAction *subAction = menu->addAction(d.name(), mapper, SLOT(map()));
++        mapper->setMapping(subAction, d.index());
++    }
++    action->setMenu(menu);
++    m_view->addAction(action);
++
+     action = new QAction(i18n("add AudioOutput"), m_view);
+     connect(action, SIGNAL(triggered()), SLOT(addAudioOutput()));
+     m_view->addAction(action);
+@@ -180,19 +198,21 @@
+ 
+ void MainWindow::addMediaObject()
+ {
+-    kDebug();
+     m_scene->addItem(new MediaObjectItem(QCursor::pos(), m_view));
+ }
+ 
++void MainWindow::addEffect(int effectIndex)
++{
++    m_scene->addItem(new EffectItem(EffectDescription::fromIndex(effectIndex), QCursor::pos(), m_view));
++}
++
+ void MainWindow::addAudioOutput()
+ {
+-    kDebug();
+     m_scene->addItem(new AudioOutputItem(QCursor::pos(), m_view));
+ }
+ 
+ void MainWindow::addVideoWidget()
+ {
+-    kDebug();
+     m_scene->addItem(new VideoWidgetItem(QCursor::pos(), m_view));
+ }
+ 
+--- a/phonon/tests/guitest/CMakeLists.txt
++++ b/phonon/tests/guitest/CMakeLists.txt
+@@ -4,6 +4,7 @@
+    anglewidget.cpp
+    audiooutputitem.cpp
+    chapterwidget.cpp
++   effectitem.cpp
+    main.cpp
+    mediaobjectitem.cpp
+    mygraphicsscene.cpp
+--- a/phonon/tests/fakebackend/fake.desktop
++++ b/phonon/tests/fakebackend/fake.desktop
+@@ -13,18 +13,23 @@
+ Name[csb]=Sztëczny
+ Name[el]=Πλασματικό
+ Name[es]=Falso
++Name[et]=Liba
+ Name[ga]=Bréag
+ Name[he]=זיוף
+ Name[hu]=Hamis
+ Name[it]=Falso
++Name[km]=បន្លំ
+ Name[kn]=ಫೇಕ್
+ Name[ko]=가짜
++Name[lv]=Neīsts
+ Name[nds]=Namaakt
+ Name[ne]=झुटा
+ Name[pa]=ਫ਼ਰਜ਼ੀ
+ Name[pt]=Falsa
+ Name[pt_BR]=Falso
+ Name[sl]=Ponaredek
++Name[sr]=Лажна
++Name[sr at latin]=Lažna
+ Name[sv]=Test
+ Name[vi]=Giả
+ Name[wa]=Fås
+@@ -36,6 +41,7 @@
+ Comment[de]=Test-Backend
+ Comment[el]=Δοκιμαστικό σύστημα υποστήριξης
+ Comment[es]=Motor de pruebas
++Comment[et]=Testtaustaprogramm
+ Comment[fa]=پایانه پشتیبانی آزمون
+ Comment[ga]=Inneall Tástála
+ Comment[he]=ממשק בדיקה
+@@ -43,8 +49,10 @@
+ Comment[it]=Prova motore
+ Comment[ja]=テストバックエンド
+ Comment[kk]=Сынақ тетігі
++Comment[km]=កម្មវិធី​ខាងក្រោយ​ការ​សាកល្បង
+ Comment[kn]=ಪರೀಕ್ಷಣಾ ಹಿಂಬದಿ (ಬಾಕ್ ಎಂಡ್)
+ Comment[ko]=테스트 백엔드
++Comment[lv]=Aizmugures testēšana
+ Comment[nds]=Utprobeer-Hülpprogramm
+ Comment[ne]=परीक्षण ब्याकइन्ड
+ Comment[nl]=Test-backend
+@@ -52,8 +60,11 @@
+ Comment[pt]=Infra-Estrutura de Testes
+ Comment[pt_BR]=Testando backend
+ Comment[sl]=Ogrodje za testiranje
++Comment[sr]=Пробна позадина
++Comment[sr at latin]=Probna pozadina
+ Comment[sv]=Testgränssnitt
+ Comment[th]=โปรแกรมเบื้องหลังสำหรับทดสอบ
++Comment[uk]=Програма тестування
+ Comment[vi]=Đang thử ra hậu phương
+ Comment[wa]=Saye do programe fondmint
+ Comment[x-test]=xxTesting Backendxx
+--- a/phonon/kcm/kcm_phonon.desktop
++++ b/phonon/kcm/kcm_phonon.desktop
+@@ -1,6 +1,6 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+-Exec=kcmshell kcm_phonon
++Exec=kcmshell4 kcm_phonon
+ Icon=preferences-desktop-sound
+ Type=Service
+ ServiceTypes=KCModule
+@@ -13,16 +13,20 @@
+ 
+ Name=Sound
+ Name[be]=Гук
++Name[br]=Son
+ Name[ca]=So
+ Name[cs]=Zvuk
+ Name[el]=Ήχος
+ Name[eo]=Sono
+ Name[es]=Sonido
++Name[et]=Heli
+ Name[ga]=Fuaim
+ Name[hu]=Hang
+ Name[it]=Suono
+ Name[ja]=サウンド
++Name[kk]=Дыбыс
+ Name[km]=សំឡេង
++Name[lv]=Skaņa
+ Name[nds]=Klang
+ Name[nl]=Geluid
+ Name[pa]=ਸਾਊਂਡ
+@@ -30,8 +34,11 @@
+ Name[pt_BR]=Som
+ Name[ru]=Звук
+ Name[sl]=Zvok
++Name[sr]=Звук
++Name[sr at latin]=Zvuk
+ Name[sv]=Ljud
+ Name[th]=เสียง
++Name[uk]=Звук
+ Name[wa]=Son
+ Name[x-test]=xxSoundxx
+ Name[zh_CN]=声音
+@@ -39,6 +46,7 @@
+ Comment=Sound System Configuration
+ Comment[ar]=ضبط نظام الصوت
+ Comment[be]=Настаўленні гукавай сістэмы
++Comment[br]=Kefluniadur ar reizhiad son
+ Comment[ca]=Configuració del sistema de so
+ Comment[cs]=Nastavení zvukového systému
+ Comment[csb]=Systemòwé òdkôzanié w KDE
+@@ -46,6 +54,7 @@
+ Comment[el]=Ρύθμιση συστήματος ήχου
+ Comment[eo]=Sonsistema Agordo
+ Comment[es]=Configuración del sistema de sonido
++Comment[et]=Helisüsteemi seadistamine
+ Comment[fa]=پیکربندی سیستم صوت
+ Comment[ga]=Cumraíocht an Chórais Fuaime
+ Comment[he]=הגדרות מערכת הצליל
+@@ -65,9 +74,12 @@
+ Comment[pt_BR]=Configurações do Sistema de Som
+ Comment[ru]=Настройка звуковой подсистемы
+ Comment[sl]=Nastavitev zvočnega sistema
++Comment[sr]=Подешавање звучног система
++Comment[sr at latin]=Podešavanje zvučnog sistema
+ Comment[sv]=Ljudsysteminställning
+ Comment[te]=శబ్ద వ్యవస్థ అమరిక
+ Comment[th]=การปรับแต่งระบบเสียง
++Comment[uk]=Налаштування системи звуку
+ Comment[vi]=Cấu hình Hệ thống Âm thanh
+ Comment[wa]=Apontiaedje do sistinme di son
+ Comment[x-test]=xxSound System Configurationxx
+@@ -78,6 +90,7 @@
+ Keywords[ca]=So,Phonon,Àudio,Vídeo,Sortida,Dispositiu,Notificació,Música,Comunicació,Suport,NMM,GStreamer,Xine
+ Keywords[el]=Ήχος,Βίντεο,Έξοδος,Συσκευή,Ειδοποίηση,Μουσική,Μέσα,Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine
+ Keywords[es]=Sonido,Phonon,Audio,Vídeo,Salida,Dispositivo,Notificación,Música,Comunicación,Medios,NMM,GStreamer,Xine
++Keywords[et]=Heli,Phonon,Audio,Video,Väljund,Seade,Märguanne,Muusika,Suhtlemine,Meedia,NMM,GStreamer,Xine
+ Keywords[fa]=صوت، Phonon، صوتی، ویدئویی، خروجی، دستگاه، اخطار، موسیقی، ارتباط، رسانه، NMM، GStreamer، Xine
+ Keywords[ga]=Fuaim,Phonon,Fís,Aschur,Gléas,Fógairt,Ceol,Cumarsáid,Meáin,NMM,GStreamer,Xine
+ Keywords[he]=צליל,Phonon,שמע,וידאו,פלט,התקן,הודעות,מוזיקה,תקשורת,מדיה,NMM,GStreamer,Xine
+@@ -85,11 +98,14 @@
+ Keywords[it]=Suono,Phonon,Audio,Video,Output,Dispositivo,Notifica,Musica,Comunicazione,Supporto,Media,NMM,GStreamer,Xine
+ Keywords[ja]=サウンド,Phonon,オーディオ,ビデオ,動画,出力,デバイス,通知,音楽,通信,メディア,NMM,GStreamer,Xine
+ Keywords[ko]=소리,Phonon,오디오,비디오,출력,알림,음악,미디어,Xine,GStreamer
++Keywords[lv]=Skaņa,Phonon,Audio,Video,Izvade,Iekārta,Paziņojums,Mūzika,Komunikācijas,Mēdiji,NMM,GStreamer,Xine
+ Keywords[nds]=Klang,Phonon,Audio,Video,Utgaav,Reedschap,Bescheed,Musik,Kommunikatschoon,Medien,NMM,GStreamer,Xine
+ Keywords[nl]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,Geluid,Muziek,Communicatie,Uitvoer
+ Keywords[pt]=Som,Phonon,Áudio,Vídeo,Saída,Dispositivo,Notificação,Música,Comunicação,Multimédia,NMM,GStreamer,Xine
+ Keywords[pt_BR]=Som,Phonon,Audio,Vídeo,Saída,Dispositivo,Notificação,Música,Comunicação,Mídia,NMM,GStreamer,Xine
+ Keywords[sl]=zvok,Phonon,audio,avdio,video,izhod,naprava,glasba,komunikacija,NMM,GStreamer,Xine,obvestila
++Keywords[sr]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,Фонон,звук,аудио,видео,излаз,уређај,обавештења,музика,комуникација,медија,Ксине,Гстример
++Keywords[sr at latin]=Sound,Phonon,Audio,Video,Output,Device,Notification,Music,Communication,Media,NMM,GStreamer,Xine,Phonon,zvuk,audio,video,izlaz,uređaj,obaveštenja,muzika,komunikacija,medija,Xine,GStreamer
+ Keywords[sv]=Ljud,Phonon,video,utmatning,enhet,underrättelse,musik,kommunikation,media,NMM,GStreamer,Xine
+ Keywords[th]=เสียง,Phonon,เสียง,วิดีโอ,แสดงผล,อุปกรณ์,การแจ้งเตือน,ดนตรี,การสื่อสาร, สื่อ,NMM,Gstreamer,Xine
+ Keywords[vi]=Sound,Âm thanh,Phonon,Phô-non,Audio,Video,Ảnh động,Output,Xuất,Device,Thiết bị,Notification,Thông báo,Music,Nhạc,Communication,Liên lạc,Giao thông,Media,Vật chứa,Phương tiện,NMM,GStreamer,Xine
+--- a/phonon/phononbackend.desktop
++++ b/phonon/phononbackend.desktop
+@@ -10,6 +10,7 @@
+ Name[el]=Σύστημα υποστήριξης πολυμέσων του KDE
+ Name[eo]=KDE Multmedia Ilo
+ Name[es]=Motor multimedia de KDE
++Name[et]=KDE multimeedia taustaprogramm
+ Name[fa]=پایانۀ پشتیبانی چندرسانه‌ای KDE
+ Name[ga]=Inneall Il-mheán KDE
+ Name[he]=ממשק מולטימדיה של KDE
+@@ -17,6 +18,7 @@
+ Name[it]=Motore multimediale KDE
+ Name[ja]=KDE マルチメディアバックエンド
+ Name[kk]=KDE мультимедиа тетігі
++Name[km]=កម្មវិធី​ខាងក្រោយ​ពហុព័ត៌មាន​របស់ KDE
+ Name[kn]=ಕೆಡಿಇ ಬಹುಮಾಧ್ಯಮ (ಮಲ್ಟಿಮೀಡಿಯಾ) ಹಿಂಬದಿ (ಬಾಕ್ ಎಂಡ್)
+ Name[ko]=KDE 멀티미디어 백엔드
+ Name[lv]=KDE multimēdijas aizmugure
+@@ -27,6 +29,8 @@
+ Name[pt]=Infra-Estrutura Multimédia do KDE
+ Name[pt_BR]=Backend do KDE Multimída
+ Name[sl]=KDE-jevo ogrodje za večpredstavnost
++Name[sr]=КДЕ-ова мултимедијска позадина
++Name[sr at latin]=KDE-ova multimedijska pozadina
+ Name[sv]=KDE:s multimediagränssnitt
+ Name[te]=కెడిఈ బహుళ మాద్యమం బేక్ ఎండ్
+ Name[th]=โปรแกรมเบื้องหลังเกี่ยวกับมัลติมีเดียของ KDE
+--- a/kparts/krop.desktop
++++ b/kparts/krop.desktop
+@@ -37,7 +37,7 @@
+ Comment[ko]=KDE 구성 요소
+ Comment[lb]=KDE-Komponent
+ Comment[lt]=KDE komponentas
+-Comment[lv]=KDE Komponente
++Comment[lv]=KDE komponente
+ Comment[mk]=KDE компонента
+ Comment[ms]=Komponen KDE
+ Comment[nb]=KDE-komponent
+@@ -53,8 +53,8 @@
+ Comment[ru]=Компонент KDE
+ Comment[se]=KDE oassi
+ Comment[sl]=Komponenta KDE
+-Comment[sr]=KDE-ова компонента
+-Comment[sr at latin]=KDE-ova komponenta
++Comment[sr]=КДЕ компонента
++Comment[sr at latin]=KDE komponenta
+ Comment[sv]=KDE-komponent
+ Comment[ta]=கேடிஇ பகுதி
+ Comment[te]=కెడిఈ అంశం
+--- a/kparts/krwp.desktop
++++ b/kparts/krwp.desktop
+@@ -37,7 +37,7 @@
+ Comment[ko]=KDE 구성 요소
+ Comment[lb]=KDE-Komponent
+ Comment[lt]=KDE komponentas
+-Comment[lv]=KDE Komponente
++Comment[lv]=KDE komponente
+ Comment[mk]=KDE компонента
+ Comment[ms]=Komponen KDE
+ Comment[nb]=KDE-komponent
+@@ -53,8 +53,8 @@
+ Comment[ru]=Компонент KDE
+ Comment[se]=KDE oassi
+ Comment[sl]=Komponenta KDE
+-Comment[sr]=KDE-ова компонента
+-Comment[sr at latin]=KDE-ova komponenta
++Comment[sr]=КДЕ компонента
++Comment[sr at latin]=KDE komponenta
+ Comment[sv]=KDE-komponent
+ Comment[ta]=கேடிஇ பகுதி
+ Comment[te]=కెడిఈ అంశం
+--- a/kparts/browserview.desktop
++++ b/kparts/browserview.desktop
+@@ -37,7 +37,7 @@
+ Name[ko]=탐색기 보기
+ Name[lb]=Browser-Siicht
+ Name[lt]=Rodyti naršyklėje
+-Name[lv]=Pārlūka Skatījums
++Name[lv]=Pārlūka skatījums
+ Name[mk]=Разгледување
+ Name[ms]=Pelihat Pelayar
+ Name[nb]=Nettleservisning
+@@ -53,8 +53,8 @@
+ Name[ru]=Вид страницы
+ Name[se]=Fierpmádatlogana čájeheapmi
+ Name[sl]=Pogled brskalnika
+-Name[sr]=Претраживачев приказ
+-Name[sr at latin]=Pretraživačev prikaz
++Name[sr]=Прегледачки приказ
++Name[sr at latin]=Pregledački prikaz
+ Name[sv]=Surfvy
+ Name[ta]=உலாவிக் காட்சி
+ Name[te]=అన్వేషి వీక్షణం
+--- a/kparts/kpart.desktop
++++ b/kparts/kpart.desktop
+@@ -36,7 +36,7 @@
+ Comment[ko]=KDE 구성 요소
+ Comment[lb]=KDE-Komponent
+ Comment[lt]=KDE komponentas
+-Comment[lv]=KDE Komponente
++Comment[lv]=KDE komponente
+ Comment[mk]=KDE компонента
+ Comment[ms]=Komponen KDE
+ Comment[nb]=KDE-komponent
+@@ -52,8 +52,8 @@
+ Comment[ru]=Компонент KDE
+ Comment[se]=KDE oassi
+ Comment[sl]=Komponenta KDE
+-Comment[sr]=KDE-ова компонента
+-Comment[sr at latin]=KDE-ova komponenta
++Comment[sr]=КДЕ компонента
++Comment[sr at latin]=KDE komponenta
+ Comment[sv]=KDE-komponent
+ Comment[ta]=கேடிஇ பகுதி
+ Comment[te]=కెడిఈ అంశం
+--- a/sonnet/plugins/aspell/kspell_aspell.desktop
++++ b/sonnet/plugins/aspell/kspell_aspell.desktop
+@@ -16,6 +16,8 @@
+ Name[ar]=أسبل
+ Name[it]=Aspell
+ Name[kn]=ಎಸ್ಪೆಲ್
++Name[sr]=Аспел
++Name[sr at latin]=Aspell
+ Name[sv]=Aspell
+ Name[ta]=psதேர்ந்தெடு
+ Name[te]=ఏస్పెల్
+--- a/sonnet/plugins/enchant/kspell_enchant.desktop
++++ b/sonnet/plugins/enchant/kspell_enchant.desktop
+@@ -16,5 +16,6 @@
+ Name[ar]=إنشنت
+ Name[kn]=ಎಂಚಾಂಟ್
+ Name[ne]=मोहीत पार्नु
++Name[sr]=Енчант
+ Name[x-test]=xxEnchantxx
+ Name[zh_CN]=增强
+--- a/sonnet/plugins/enchant/enchantclient.h
++++ b/sonnet/plugins/enchant/enchantclient.h
+@@ -25,7 +25,7 @@
+ 
+ #include <QtCore/QSet>
+ #include <QtCore/QVariantList>
+-#include <enchant/enchant.h>
++#include <enchant.h>
+ 
+ namespace Sonnet {
+     class SpellerPlugin;
+--- a/sonnet/plugins/enchant/enchantdict.h
++++ b/sonnet/plugins/enchant/enchantdict.h
+@@ -22,7 +22,7 @@
+ 
+ #include "spellerplugin_p.h"
+ 
+-#include <enchant/enchant.h>
++#include <enchant.h>
+ 
+ class QSpellEnchantDict : public Sonnet::SpellerPlugin
+ {
+--- a/sonnet/plugins/hspell/kspell_hspell.desktop
++++ b/sonnet/plugins/hspell/kspell_hspell.desktop
+@@ -16,6 +16,8 @@
+ Name[ar]=ه‍ سبل
+ Name[kn]=ಎಚ್ ಸ್ಪೆಲ್
+ Name[ne]=एच स्पेल
++Name[sr]=Хспел
++Name[sr at latin]=Hspell
+ Name[sv]=Hspell
+ Name[te]=హెచ్ స్పెల్
+ Name[x-test]=xxHSpellxx
+--- a/kded/test/test.desktop
++++ b/kded/test/test.desktop
+@@ -41,7 +41,7 @@
+ Name[ko]=KDED 테스트 모듈
+ Name[lb]=KDED-Testmodul
+ Name[lt]=KDED testinis modulis
+-Name[lv]=KDED Testa Modulis
++Name[lv]=KDED testa modulis
+ Name[mk]=KDED Тест модул
+ Name[ms]=Modul Uji KDED
+ Name[nb]=KDED-testmodul
+@@ -56,7 +56,7 @@
+ Name[ru]=Тестовая служба KDED
+ Name[se]=KDED-geahččalanmoduvla
+ Name[sl]=Preizkusni modul KDED
+-Name[sr]=KDED пробни модул
++Name[sr]=КДЕД пробни модул
+ Name[sr at latin]=KDED probni modul
+ Name[sv]=KDED-testmodul
+ Name[ta]=KDED சோதனைக் கூறு
+@@ -106,7 +106,7 @@
+ Comment[ko]=KDED 테스트 모듈
+ Comment[lb]=En Testmodul fir KDED
+ Comment[lt]=KDED testinis modulis
+-Comment[lv]=KDED Testa Modulis
++Comment[lv]=KDED testa modulis
+ Comment[mk]=Тест модул за KDED
+ Comment[ms]=Modul Uji untuk KDED
+ Comment[nb]=En test-modul for KDED
+@@ -122,7 +122,7 @@
+ Comment[ru]=Тестовая служба KDED
+ Comment[se]=Geahččalanmoduvla KDED:a várás
+ Comment[sl]=Preizkusni modul za KDED
+-Comment[sr]=Пробни модул за KDED
++Comment[sr]=Пробни модул за КДЕД
+ Comment[sr at latin]=Probni modul za KDED
+ Comment[sv]=Testmodul för KDED
+ Comment[ta]=KDED சோதனைக் கூறு
+--- a/kded/kdedmodule.desktop
++++ b/kded/kdedmodule.desktop
+@@ -36,7 +36,7 @@
+ Comment[ko]=KDED 모듈
+ Comment[lb]=KDED-Modul
+ Comment[lt]=KDED modulis
+-Comment[lv]=KDED Modulis
++Comment[lv]=KDED modulis
+ Comment[mk]=KDED модул
+ Comment[ms]=Modul KDED
+ Comment[nb]=KDED-modul
+@@ -51,7 +51,7 @@
+ Comment[ru]=Служба KDED
+ Comment[se]=KDED-moduvla
+ Comment[sl]=Modul KDED
+-Comment[sr]=KDED модул
++Comment[sr]=КДЕД модул
+ Comment[sr at latin]=KDED modul
+ Comment[sv]=KDED-modul
+ Comment[ta]=KDED கூறு
+--- a/kded/DESIGN
++++ b/kded/DESIGN
+@@ -2,9 +2,9 @@
+ ====
+ 
+ kded is responsible for creating the sycoca file, i.e. the binary 
+-cache of servicetypes, mimetypes and services, for a particular user.
++cache of servicetypes, mimetypes, and services for a particular user.
+ 
+-It uses KDirWatch to monitor the directories contain the .desktop files.
++It uses KDirWatch to monitor the directories containing .desktop files.
+ When a file is added/removed, it waits 5 seconds (in case of series of
+ updates), and then launches kbuildsycoca.
+ 
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -3,9 +3,9 @@
+ # set version
+ set (KDE_VERSION_MAJOR 3)
+ set (KDE_VERSION_MINOR 94)
+-set (KDE_VERSION_RELEASE 00)
++set (KDE_VERSION_RELEASE 1)
+ set (KDE_VERSION "${KDE_VERSION_MAJOR}.${KDE_VERSION_MINOR}.${KDE_VERSION_RELEASE}" )
+-set (KDE_VERSION_STRING "${KDE_VERSION} (KDE 4.0 Beta3)")
++set (KDE_VERSION_STRING "${KDE_VERSION} (KDE 4.0 SVN >= 20071017)")
+ 
+ # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
+ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
+--- a/kioslave/http/kcookiejar/kcookiejar.desktop
++++ b/kioslave/http/kcookiejar/kcookiejar.desktop
+@@ -34,7 +34,7 @@
+ Name[ko]=KDED 쿠키병 모듈
+ Name[lb]=KDED-Modul fir d'Verwaltung vun de Cookien
+ Name[lt]=KDED slapukų rinkinio modulis
+-Name[lv]=KDED Cepumu Jar modulis
++Name[lv]=KDED cepumu Jar modulis
+ Name[mk]=KDED модул Тегла со колачиња
+ Name[ms]=Modul Balang Cecikut KDED
+ Name[nb]=KDEDs modul for informasjonskapsler (Cookie Jar)
+@@ -50,7 +50,7 @@
+ Name[ru]=Служба cookie
+ Name[se]=KDED gáhkošlihtti-moduvla
+ Name[sl]=Modul posode za piškotke KDED
+-Name[sr]=KDED модул тегле за колачиће
++Name[sr]=КДЕД модул тегле за колачиће
+ Name[sr at latin]=KDED modul tegle za kolačiće
+ Name[sv]=KDED-kakburksmodul
+ Name[ta]=KDED தற்காலிக நினைவக சாடி பகுதி
+--- a/kioslave/http/http.cpp
++++ b/kioslave/http/http.cpp
+@@ -247,7 +247,7 @@
+   m_bChunked = false;
+   m_iSize = NO_SIZE;
+ 
+-  m_responseHeader.clear();
++  m_responseHeaders.clear();
+   m_qContentEncodings.clear();
+   m_qTransferEncodings.clear();
+   m_sContentMD5.clear();
+@@ -2564,45 +2564,39 @@
+   // Send the response header if it was requested
+   if ( config()->readEntry("PropagateHttpHeader", false) )
+   {
+-    setMetaData("HTTP-Headers", m_responseHeader);
++    setMetaData("HTTP-Headers", m_responseHeaders.join("\n"));
+     sendMetaData();
+   }
+-  m_responseHeader.clear();
+ }
+ 
+-/**
+- * This function will read in the return header from the server.  It will
+- * not read in the body of the return message.  It will also not transmit
+- * the header to our client as the client doesn't need to know the gory
+- * details of HTTP headers.
+- */
+-bool HTTPProtocol::readHeader()
+-{
+-try_again:
+-  kDebug(7113);
++bool HTTPProtocol::readHeaderFromCache() {
++    m_responseHeaders.clear();
+ 
+-  // Check
+-  if (m_request.bCachedRead)
+-  {
+-     m_responseHeader = QString::fromLatin1("HTTP-CACHE");
+-     forwardHttpResponseHeader();
++    // Read header from cache...
++    char buffer[4097];
++    if (!gzgets(m_request.fcache, buffer, 4096) )
++    {
++    // Error, delete cache entry
++    kDebug(7113) << "Could not access cache to obtain mimetype!";
++    error( ERR_CONNECTION_BROKEN, m_state.hostname );
++    return false;
++    }
+ 
+-     // Read header from cache...
+-     char buffer[4097];
+-     if (!gzgets(m_request.fcache, buffer, 4096) )
+-     {
++    m_strMimeType = QString::fromUtf8( buffer).trimmed();
++
++    kDebug(7113) << "cached data mimetype: " << m_strMimeType;
++
++    // read http-headers, first the response code
++    if (!gzgets(m_request.fcache, buffer, 4096) )
++    {
+         // Error, delete cache entry
+-        kDebug(7113) << "Could not access cache to obtain mimetype!";
++        kDebug(7113) << "Could not access cached data! ";
+         error( ERR_CONNECTION_BROKEN, m_state.hostname );
+         return false;
+-     }
+-
+-     m_strMimeType = QString::fromUtf8( buffer).trimmed();
+-
+-     kDebug(7113) << "cached data mimetype: " << m_strMimeType;
+-
+-     // read optional http-headers
+-     while(true) {
++    }
++    m_responseHeaders << buffer;
++    // then the headers
++    while(true) {
+         if (!gzgets(m_request.fcache, buffer, 4096) )
+         {
+             // Error, delete cache entry
+@@ -2610,40 +2604,52 @@
+             error( ERR_CONNECTION_BROKEN, m_state.hostname );
+             return false;
+         }
++        m_responseHeaders << buffer;
+         QString header = QString::fromUtf8( buffer).trimmed().toLower();
+         if (header.isEmpty()) break;
+-        if (header.startsWith("content-type-charset: ")) {
+-            QString value = header.mid(22);
+-            m_request.strCharset = value;
+-            setMetaData("charset", value);
++        if (header.startsWith("content-type: ")) {
++            int pos = header.indexOf("charset=");
++            if (pos != -1) {
++                QString value = header.mid(pos+8);
++                m_request.strCharset = value;
++                setMetaData("charset", value);
++            }
+         } else
+         if (header.startsWith("content-language: ")) {
+             QString value = header.mid(18);
+-            m_request.strLanguage = value;
+             setMetaData("content-language", value);
+         } else
+-        if (header.startsWith("content-disposition-type: ")) {
+-            QString value = header.mid(26);
+-            m_request.strDisposition = value;
+-            setMetaData("content-disposition-type", value);
+-        } else
+-        if (header.startsWith("content-disposition-filename: ")) {
+-            QString value = header.mid(30);
+-            m_request.strFilename = value;
+-            setMetaData("content-disposition-filename", value);
++        if (header.startsWith("content-disposition: ")) {
++            parseContentDisposition(header.mid(21));
+         }
+-     }
++    }
++    forwardHttpResponseHeader();
+ 
+-     if (!m_request.lastModified.isEmpty())
+-         setMetaData("modified", m_request.lastModified);
+-     QString tmp;
+-     tmp.setNum(m_request.expireDate);
+-     setMetaData("expire-date", tmp);
+-     tmp.setNum(m_request.creationDate);
+-     setMetaData("cache-creation-date", tmp);
+-     mimeType(m_strMimeType);
+-     return true;
+-  }
++    if (!m_request.lastModified.isEmpty())
++        setMetaData("modified", m_request.lastModified);
++    QString tmp;
++    tmp.setNum(m_request.expireDate);
++    setMetaData("expire-date", tmp);
++    tmp.setNum(m_request.creationDate);
++    setMetaData("cache-creation-date", tmp);
++    mimeType(m_strMimeType);
++    return true;
++}
++
++/**
++ * This function will read in the return header from the server.  It will
++ * not read in the body of the return message.  It will also not transmit
++ * the header to our client as the client doesn't need to know the gory
++ * details of HTTP headers.
++ */
++bool HTTPProtocol::readHeader()
++{
++try_again:
++  kDebug(7113);
++
++  // Check
++  if (m_request.bCachedRead)
++      return readHeaderFromCache();
+ 
+   QByteArray locationStr; // In case we get a redirect.
+   QByteArray cookieStr; // In case we get a cookie.
+@@ -2663,6 +2669,7 @@
+   m_request.etag.clear();
+   m_request.lastModified.clear();
+   m_request.strCharset.clear();
++  m_responseHeaders.clear();
+ 
+   time_t dateHeader = 0;
+   time_t expireDate = 0; // 0 = no info, 1 = already expired, > 1 = actual date
+@@ -2670,9 +2677,9 @@
+   int maxAge = -1; // -1 = no max age, 0 already expired, > 0 = actual time
+   int maxHeaderSize = 64*1024; // 64Kb to catch DOS-attacks
+ 
+-  // read in 4096 bytes at a time (HTTP cookies can be quite large.)
++  // read in 8192 bytes at a time (HTTP cookies can be quite large.)
+   int len = 0;
+-  char buffer[4097];
++  char buffer[8193];
+   bool cont = false;
+   bool cacheValidated = false; // Revalidation was successful
+   bool mayCache = true;
+@@ -2773,7 +2780,7 @@
+ 
+     // Store the the headers so they can be passed to the
+     // calling application later
+-    m_responseHeader += QString::fromLatin1(buf);
++    m_responseHeaders << QString::fromLatin1(buf);
+ 
+     if ((strncasecmp(buf, "HTTP", 4) == 0) ||
+         (strncasecmp(buf, "ICY ", 4) == 0)) // Shoutcast support
+@@ -3047,6 +3054,7 @@
+           {
+             mediaValue = mediaValue.toLower();
+             m_request.strCharset = mediaValue;
++            setMetaData("charset", mediaValue);
+           }
+           else
+           {
+@@ -3150,68 +3158,11 @@
+     }
+     // Refer to RFC 2616 sec 15.5/19.5.1 and RFC 2183
+     else if(strncasecmp(buf, "Content-Disposition:", 20) == 0) {
+-      char* dispositionBuf = trimLead(buf + 20);
+-      while ( *dispositionBuf )
+-      {
+-        if ( strncasecmp( dispositionBuf, "filename", 8 ) == 0 )
+-        {
+-          dispositionBuf += 8;
+-
+-          while ( *dispositionBuf == ' ' || *dispositionBuf == '=' )
+-            dispositionBuf++;
+-
+-          char* bufStart = dispositionBuf;
+-
+-          while ( *dispositionBuf && *dispositionBuf != ';' )
+-            dispositionBuf++;
+-
+-          if ( dispositionBuf > bufStart )
+-          {
+-            // Skip any leading quotes...
+-            while ( *bufStart == '"' )
+-              bufStart++;
+-
+-            // Skip any trailing quotes as well as white spaces...
+-            while ( *(dispositionBuf-1) == ' ' || *(dispositionBuf-1) == '"')
+-              dispositionBuf--;
+-
+-            if ( dispositionBuf > bufStart )
+-              m_request.strFilename = QString::fromLatin1( bufStart, dispositionBuf-bufStart );
+-
+-            break;
+-          }
+-        }
+-        else
+-        {
+-          char *bufStart = dispositionBuf;
+-
+-          while ( *dispositionBuf && *dispositionBuf != ';' )
+-            dispositionBuf++;
+-
+-          if ( dispositionBuf > bufStart )
+-            m_request.strDisposition = QString::fromLatin1( bufStart, dispositionBuf-bufStart ).trimmed();
+-
+-          while ( *dispositionBuf == ';' || *dispositionBuf == ' ' )
+-            dispositionBuf++;
+-        }
+-      }
+-
+-      // Content-Dispostion is not allowed to dictate directory
+-      // path, thus we extract the filename only.
+-      if ( !m_request.strFilename.isEmpty() )
+-      {
+-        int pos = m_request.strFilename.lastIndexOf( '/' );
+-
+-        if( pos > -1 )
+-          m_request.strFilename = m_request.strFilename.mid(pos+1);
+-
+-        kDebug(7113) << "Content-Disposition: filename=" << m_request.strFilename;
+-      }
++        parseContentDisposition(QString::fromLatin1(trimLead(buf+20)));
+     }
+     else if(strncasecmp(buf, "Content-Language:", 17) == 0) {
+         QString language = QString::fromLatin1(trimLead(buf+17)).trimmed();
+         if (!language.isEmpty()) {
+-            m_request.strLanguage = language;
+             setMetaData("content-language", language);
+         }
+     }
+@@ -3339,10 +3290,6 @@
+ 
+   } while (!m_bEOF && (len || noHeader) && (headerSize < maxHeaderSize) && (gets(buffer, sizeof(buffer)-1)));
+ 
+-  // Send the current response before processing starts or it
+-  // might never get sent...
+-  forwardHttpResponseHeader();
+-
+   // Now process the HTTP/1.1 upgrade
+   QStringList::Iterator opt = upgradeOffers.begin();
+   for( ; opt != upgradeOffers.end(); ++opt) {
+@@ -3364,8 +3311,6 @@
+      }
+   }
+ 
+-  setMetaData("charset", m_request.strCharset);
+-
+   // If we do not support the requested authentication method...
+   if ( (m_responseCode == 401 && Authentication == AUTH_None) ||
+        (m_responseCode == 407 && ProxyAuthentication == AUTH_None) )
+@@ -3670,19 +3615,6 @@
+         m_strMimeType = QString::fromLatin1("video/x-ms-wmv");
+   }
+ 
+-  if( !m_request.strDisposition.isEmpty() )
+-  {
+-    kDebug(7113) << "Setting Content-Disposition type to: "
+-                  << m_request.strDisposition;
+-    setMetaData("content-disposition-type", m_request.strDisposition);
+-  }
+-  if( !m_request.strFilename.isEmpty() )
+-  {
+-    kDebug(7113) << "Setting Content-Disposition filename to: "
+-                 << m_request.strFilename;
+-    setMetaData("content-disposition-filename", m_request.strFilename);
+-  }
+-
+   if (!m_request.lastModified.isEmpty())
+     setMetaData("modified", m_request.lastModified);
+ 
+@@ -3709,6 +3641,10 @@
+     mimeType( m_strMimeType );
+   }
+ 
++  // Do not move send response header before any redirection as it seems
++  // to screw up some sites. See BR# 150904.
++  forwardHttpResponseHeader();
++
+   if (m_request.method == HTTP_HEAD)
+      return true;
+ 
+@@ -3734,6 +3670,42 @@
+   return true;
+ }
+ 
++void HTTPProtocol::parseContentDisposition(const QString &disposition)
++{
++    QString strDisposition;
++    QString strFilename;
++
++    QStringList parts = disposition.split(';');
++
++    bool first = true;
++    foreach(QString part, parts) {
++        part = part.trimmed();
++        if (first) {
++            strDisposition = part;
++            first = false;
++        } else
++        if (part.startsWith("filename")) {
++            int i = part.indexOf('=');
++            if (i == -1) break;
++            strFilename = part.mid(i);
++        }
++    }
++
++    // Content-Dispostion is not allowed to dictate directory
++    // path, thus we extract the filename only.
++    if ( !strFilename.isEmpty() )
++    {
++        int pos = strFilename.lastIndexOf( '/' );
++
++        if( pos > -1 )
++            strFilename = strFilename.mid(pos+1);
++
++        kDebug(7113) << "Content-Disposition: filename=" << strFilename;
++    }
++    setMetaData("content-disposition-type", strDisposition);
++    if (!strFilename.isEmpty())
++        setMetaData("content-disposition-filename", strFilename);
++}
+ 
+ void HTTPProtocol::addEncoding(const QString &_encoding, QStringList &encs)
+ {
+@@ -4768,26 +4740,9 @@
+    gzputs(m_request.fcache, mimetype.toLatin1());  // Mimetype
+    gzputc(m_request.fcache, '\n');
+ 
+-   if (!m_request.strCharset.isEmpty()) {
+-      gzputs(m_request.fcache, "content-type-charset: ");
+-      gzputs(m_request.fcache, m_request.strCharset.toLatin1());     // Charset
+-      gzputc(m_request.fcache, '\n');
+-   }
+-   if (!m_request.strLanguage.isEmpty()) {
+-      gzputs(m_request.fcache, "content-language: ");
+-      gzputs(m_request.fcache, m_request.strLanguage.toLatin1());    // Content-language
+-      gzputc(m_request.fcache, '\n');
+-   }
+-   if (!m_request.strDisposition.isEmpty()) {
+-      gzputs(m_request.fcache, "content-disposition-type: ");
+-      gzputs(m_request.fcache, m_request.strDisposition.toLatin1()); // Content-Disposition
+-      gzputc(m_request.fcache, '\n');
+-   }
+-   if (!m_request.strFilename.isEmpty()) {
+-      gzputs(m_request.fcache, "content-disposition-filename: ");
+-      gzputs(m_request.fcache, m_request.strFilename.toLatin1());    // Content-Disposition: filename
+-      gzputc(m_request.fcache, '\n');
+-   }
++   gzputs(m_request.fcache, m_responseHeaders.join("\n").toLatin1());
++   gzputc(m_request.fcache, '\n');
++
+    gzputc(m_request.fcache, '\n');
+ 
+    return;
+--- a/kioslave/http/http_cache_cleaner.desktop
++++ b/kioslave/http/http_cache_cleaner.desktop
+@@ -35,7 +35,7 @@
+ Name[ko]=HTTP 캐시 청소기
+ Name[lb]=Opraumer fir den HTTP-Zwëschespäicher
+ Name[lt]=HTTP krepšio ištuštintojas
+-Name[lv]=HTTP Kešatmiņas tīrītājs
++Name[lv]=HTTP kešatmiņas tīrītājs
+ Name[mk]=Бришење на HTTP-кешот
+ Name[ms]=Pembersih Penyimpan HTTP
+ Name[nb]=HTTP Mellomlagerrenser
+@@ -51,7 +51,7 @@
+ Name[ru]=Очистка кэша HTTP
+ Name[se]=HTTP gaskarádjosa buhtisteaddji
+ Name[sl]=Čistilnik predpomnilnika HTTP
+-Name[sr]=Чистач HTTP кеша
++Name[sr]=Чистач ХТТП кеша
+ Name[sr at latin]=Čistač HTTP keša
+ Name[sv]=HTTP-cacherensare
+ Name[ta]=HTTP தற்காலிக நினைவகத்தை சுத்தம் செய்தல்
+@@ -119,7 +119,7 @@
+ Comment[ru]=Удаление устаревших элементов из кэша HTTP
+ Comment[se]=Buhtista boares merko3/4iid HTTP gaskarádjosis
+ Comment[sl]=Zbriše stare vnose iz pomnilnika HTTP
+-Comment[sr]=Чисти старе ставке из HTTP кеша
++Comment[sr]=Чисти старе ставке из ХТТП кеша
+ Comment[sr at latin]=Čisti stare stavke iz HTTP keša
+ Comment[sv]=Rensar bort gamla poster från HTTP-cachen
+ Comment[ta]=HTTP நினைவத்திலிருந்து பழைய உள்ளீடுகளை சுத்தம் செய்கிறது
+--- a/kioslave/http/http.h
++++ b/kioslave/http/http.h
+@@ -164,10 +164,7 @@
+     long bytesCached;
+     time_t expireDate; // Date when the cache entry will expire
+     time_t creationDate; // Date when the cache entry was created
+-    QString strCharset; // Charset
+-    QString strLanguage; // Language
+-    QString strDisposition;
+-    QString strFilename;
++    QString strCharset;
+ 
+     // Cookie flags
+     enum { CookiesAuto, CookiesManual, CookiesNone } cookieMode;
+@@ -299,6 +296,8 @@
+   void forwardHttpResponseHeader();
+ 
+   bool readHeader();
++  bool readHeaderFromCache();
++  void parseContentDisposition(const QString &disposition);
+ 
+   bool sendBody();
+ 
+@@ -480,7 +479,7 @@
+   KIO::filesize_t m_iContentLeft; // # of content bytes left
+   QByteArray m_bufReceive; // Receive buffer
+   char m_lineBuf[1024];
+-  char m_rewindBuf[4096];
++  char m_rewindBuf[8192];
+   size_t m_rewindCount;
+   size_t m_lineCount;
+   size_t m_lineCountUnget;
+@@ -499,7 +498,7 @@
+ 
+ //--- Settings related to a single response only
+   bool m_bRedirect; // Indicates current request is a redirection
+-  QString m_responseHeader; // All response headers
++  QStringList m_responseHeaders; // All headers
+ 
+ 
+   // Language/Encoding related
+--- a/kinit/klauncher.cpp
++++ b/kinit/klauncher.cpp
+@@ -944,9 +944,9 @@
+   for(QStringList::ConstIterator it = params.begin();
+       it != params.end(); ++it)
+   {
+-     request->arg_list.append((*it).toLocal8Bit());
++     request->arg_list.append(*it);
+   }
+-  request->cwd = QFile::encodeName(service->path());
++  request->cwd = service->path();
+ }
+ 
+ ///// IO-Slave functions
+--- a/nepomuk/ontologies/dcq.desktop
++++ b/nepomuk/ontologies/dcq.desktop
+@@ -7,6 +7,7 @@
+ Name[de]=Die Dublin Core Terme
+ Name[el]=Οι όροι Dublin Core
+ Name[es]=Los términos de Dublin Core
++Name[et]=Dublin Core Terms
+ Name[fa]=اصطلاحات هسته Dublin
+ Name[ga]=Téarmaí de chuid Dublin Core
+ Name[he]=מונחים של Dublin Core
+@@ -21,6 +22,8 @@
+ Name[pt]=Os Termos do Dublin Core
+ Name[pt_BR]=Termos do Dublin Core
+ Name[sl]=Izrazi Dublin Core
++Name[sr]=Чиниоци Даблинског језгра
++Name[sr at latin]=Činioci Dablinskog jezgra
+ Name[sv]=Dublin-kärntermer
+ Name[th]=ชุดคำหลักของ Dublin
+ Name[vi]=Điều kiện Lõi Dublin
+@@ -34,6 +37,7 @@
+ Comment[de]=Die Dublin Core Terme
+ Comment[el]=Οι όροι Dublin Core
+ Comment[es]=Los términos de Dublin Core
++Comment[et]=Dublin Core Terms
+ Comment[fa]=اصطلاحات هسته Dublin
+ Comment[ga]=Téarmaí de chuid Dublin Core
+ Comment[he]=מונחים של Dublin Core
+@@ -48,6 +52,8 @@
+ Comment[pt]=Os Termos do Dublin Core
+ Comment[pt_BR]=Termos do Dublin Core
+ Comment[sl]=Izrazi Dublin Core
++Comment[sr]=Чиниоци Даблинског језгра
++Comment[sr at latin]=Činioci Dablinskog jezgra
+ Comment[sv]=Dublin-kärntermer
+ Comment[th]=ชุดคำหลักของ Dublin
+ Comment[vi]=Điều kiện Lõi Dublin
+--- a/nepomuk/ontologies/rdf.desktop
++++ b/nepomuk/ontologies/rdf.desktop
+@@ -2,6 +2,7 @@
+ Encoding=UTF-8
+ Version=1.0
+ Name=RDF
++Name[sr]=РДФ
+ Name[x-test]=xxRDFxx
+ Comment=RDF Vocabulary Description Language 1.0
+ Comment[ar]=لغة وصف المفردات RDF 1.0
+@@ -15,12 +16,16 @@
+ Comment[km]=ភាសា​ពិពណ៌នា​វាក្យ​ស័ព្ទ RDF ១.០
+ Comment[kn]=RDF ಪದಪಟ್ಟಿ (ವೊಕಾಬುಲರಿ) ವಿವರಣಾ ಭಾಷೆ ೧.೦
+ Comment[ko]=RDF 어휘 설명 언어 1.0
++Comment[lv]=RDF vārdnīcas apraksta valoda 1.0
+ Comment[nds]=Woortsett-Beschrievspraak RDF 1.0
+ Comment[ne]=RDF शब्दकोश वर्णन भाषा 1.0
+ Comment[nl]=RDF Vocabulaire Beschrijvingstaal 1.0
+ Comment[pt_BR]=Linguagem de Descrição de Vocabulário RDF 1.0
++Comment[sr]=РДФ језик за опис речника 1.0
++Comment[sr at latin]=RDF jezik za opis rečnika 1.0
+ Comment[sv]=RDF-ordförrådsbeskrivningsspråk 1.0
+ Comment[th]=ภาษาสำหรับอธิบายคำศัพท์ RDF 1.0
++Comment[uk]=Мова RDF опису слів 1.0
+ Comment[vi]=Ngôn ngữ Diễn tả Từ vựng RDF 1.0
+ Comment[wa]=Lingaedje di discrijhaedje di vocabulaire RDF 1.0
+ Comment[x-test]=xxRDF Vocabulary Description Language 1.0xx
+--- a/nepomuk/ontologies/nao.desktop
++++ b/nepomuk/ontologies/nao.desktop
+@@ -8,6 +8,7 @@
+ Name[de]=Nepomuk Vermerk-Ontologie
+ Name[el]=Οντολογία επισήμανσης Nepomuk
+ Name[es]=Ontología de anotaciones Nepomuk
++Name[et]=Nepomuki annotatsiooniontoloogia
+ Name[fa]=هستی‌شناسی حاشیه‌نویسی Nepomuk
+ Name[ga]=Ointeolaíocht Anótála Nepomuk
+ Name[he]=אונטולוגיית הערות של Nepomuk
+@@ -21,8 +22,11 @@
+ Name[nl]=Nepomuk Annotatie Ontologie
+ Name[pt]=Ontologia de Anotações do Nepomuk
+ Name[pt_BR]=Ontologia de Anotação Nepomuk 
++Name[sr]=Непомукова онтологија тумачењâ
++Name[sr at latin]=Nepomukova ontologija tumačenjâ
+ Name[sv]=Nepomuks beteckningsontologi
+ Name[th]=คำศัพท์กำกับหมายเหตุของ Nepomuk
++Name[uk]=Онтологія анотації Nepomuk
+ Name[vi]=Bản thể học cách ghi Nepomuk
+ Name[wa]=Ontolodjeye di notåcion nepomuk
+ Name[x-test]=xxNepomuk Annotation Ontologyxx
+@@ -34,6 +38,7 @@
+ Comment[de]=Die Nepomuk Vermerk-Ontologie legt die grundlegenden Vermerk-Eigenschaften wie Marker oder Wertung fest.
+ Comment[el]=Η οντολογία επισήμανσης Nepomuk ορίζει τις ιδιότητες βασικών επισημάνσεων όπως οι ετικέτες ή η βαθμολόγηση.
+ Comment[es]=La ontología de anotaciones Nepomuk define las propiedades de anotación básicas como etiquetado o calificación.
++Comment[et]=Nepomuki annotatsiooniontoloogia määrab põhilised annoteerimise omadused, näiteks sildistamise ja hindamise.
+ Comment[fa]=هستی‌شناسی حاشیه‌نویسی Nepomuk، ویژگیهای حاشیه‌نویسی پایه‌ای نظیر برچسب‌گذاری یا درجه‌بندی را تعریف می‌کند.
+ Comment[ga]=Sainmhíníonn Ointeolaíocht Anótála Nepomuk na bunairíonna anótála cosúil le clibeáil nó rátáil.
+ Comment[he]=אונטולוגיית ההערות של Nepomuk מגדירה את מאפייני ההערות הבסיסיים כגון תגיות או דירוג.
+@@ -47,6 +52,8 @@
+ Comment[nl]=De Nepomuk Annotatie Ontologie definieert de basis annotatie-eigenschappen zoals tagging en waardering.
+ Comment[pt]=A Ontologia de Anotações do Nepomuk define as propriedades de anotação básicas como a marcação ou a classificação.
+ Comment[pt_BR]=A Ontologia de Anotação Nepomuk define as propriedades básicas de anotação como tags e avaliações
++Comment[sr]=Непомукова онтологија тумачењâ дефинише основна својства тумачењâ, попут означавања и оцењивања.
++Comment[sr at latin]=Nepomukova ontologija tumačenjâ definiše osnovna svojstva tumačenjâ, poput označavanja i ocenjivanja.
+ Comment[sv]=Nepomuks beteckningsontologi definierar de grundläggande beteckningarna för egenskaper som taggning eller betygsättning.
+ Comment[th]=คำศัพท์กำกับหมายเหตุของ Nepomuk จะนิยามคุณสมบัติของหมายเหตุอย่างเช่น การแท็ก หรือการให้เรตติ้ง
+ Comment[vi]=Bản thể học cách ghi Nepomuk thì xác định những thuộc tính cách ghi cơ bản, v.d. đặt thẻ hay đánh giá.
+--- a/nepomuk/ontologies/dces.desktop
++++ b/nepomuk/ontologies/dces.desktop
+@@ -7,6 +7,7 @@
+ Name[de]=Der Dublin Core Element Set
+ Name[el]=Σύνολο στοιχείων Dublin Core
+ Name[es]=El conjunto de elementos Dublin Core
++Name[et]=Dublin Core Element Set
+ Name[fa]=مجموعه عنصر هسته Dublin
+ Name[ga]=Eilimintí de chuid Dublin Core
+ Name[he]=קבוצת המרכיבים Dublin Core
+@@ -21,6 +22,8 @@
+ Name[pt]=O Conjunto de Elementos do Dublin Core
+ Name[pt_BR]=Conjunto Elementos "Dublin Core"
+ Name[sl]=Nabor elementov Dublin Core
++Name[sr]=Скуп елемената Даблинског језгра
++Name[sr at latin]=Skup elemenata Dablinskog jezgra
+ Name[sv]=Dublin-kärnelementmängden
+ Name[th]=ชุดมูลฐาน Dublin
+ Name[vi]=Bộ yếu tố lõi Dublin
+@@ -35,6 +38,7 @@
+ Comment[de]=Der Namensraum des Dublin Core Element Set v1.1, der den Zugriff auf seine Inhalte über ein RDF-Schema anbietet.
+ Comment[el]=O χώρος ονομάτων συνόλου στοιχείων Dublin Core v1.1 προσφέρει πρόσβαση στο περιεχόμενό του μέσω ενός σχήματος RDF
+ Comment[es]=El espacio de nombres del conjunto de elementos Dublin Core versión 1.1 que proporciona acceso a su contenido por medio de un esquema RDF.
++Comment[et]=Dublin Core Element Set v. 1.1 nimeruum tagab ligipääsu selle sisule RDF-skeemi vahendusel
+ Comment[fa]=فضای نام مجموعه عنصر هسته Dublin نسخه ۱.۱، دستیابی به محتوایش را بوسیله یک طرحواره RDF فراهم می‌کند
+ Comment[ga]=Eilimintí de chuid Dublin Core (v1.1) in ainmspás atá ar fáil trí scéimre RDF
+ Comment[he]=תחום השמות של גירסת 1.1 של קבוצת המרכיבים Dublin Core מספקת גישה לתוכן שלה באמצעות סכמת RDF
+@@ -49,6 +53,8 @@
+ Comment[pt]=O espaço de nmes do Conjunto de Elementos Dublin Core v1.1, que oferece o acesso ao seu conteúdo através de um Esquema de RDF
+ Comment[pt_BR]=Espaço de nomes do Conjunto de Elementos "Dublin Core" v1.1, que fornece acesso ao seu conteúdo através de um RDF Schema
+ Comment[sl]=Naslovni prostor nabora elementov Dublin Core različice 1.1 omogoča dostop do svoje vsebine z uporabo sheme RDF
++Comment[sr]=Именски простор скупа елемената Даблинског језгра (в1.1) који омогућава приступ свом садржају РДФ шеме
++Comment[sr at latin]=Imenski prostor skupa elemenata Dablinskog jezgra (v1.1) koji omogućava pristup svom sadržaju RDF šeme
+ Comment[sv]=Dublin-kärnelementmängdens namnrymd version 1.1 som ger tillgång till sitt innehåll via ett RDF-schema
+ Comment[th]=รูปแบบชื่อสำหรับชุดมูลฐาน Dublin รุ่น 1.1 ที่ให้การเข้าถึงเนื้อหาโดยวิธีของ RDF Scema
+ Comment[vi]=Miền tên Bộ yếu tố lõi Dublin phiên bản 1.1 thì cung cấp truy cập cho nội dung thông qua giản đồ RDF.
+--- a/nepomuk/ontologies/nfo.desktop
++++ b/nepomuk/ontologies/nfo.desktop
+@@ -8,6 +8,7 @@
+ Name[de]=Nepomuk Datei-Ontologie
+ Name[el]=Οντολογία αρχείων Nepomuk
+ Name[es]=Ontología de ficheros Nepomuk
++Name[et]=Nepomuki failiontoloogia
+ Name[fa]=هستی‌شناسی پرونده Nepomuk
+ Name[ga]=Ointeolaíocht Comhad Nepomuk
+ Name[he]=אונטולוגיית קובץ של Nepomuk
+@@ -21,8 +22,11 @@
+ Name[nl]=Nepomuk Bestandsontologie
+ Name[pt]=Ontologia de Ficheiros do Nepomuk
+ Name[pt_BR]=Ontologia de Arquivo Nepomuk
++Name[sr]=Непомукова онтологија фајлова
++Name[sr at latin]=Nepomukova ontologija fajlova
+ Name[sv]=Nepomuks filontologi
+ Name[th]=คำศัพท์กำกับแฟ้มของ Nepomuk
++Name[uk]=Онтологія файла Nepomuk
+ Name[vi]=Bản thể học tập tin Nepomuk
+ Name[wa]=Ontolodjeye di fitchîs nepomuk
+ Name[x-test]=xxNepomuk File Ontologyxx
+@@ -34,6 +38,7 @@
+ Comment[de]=Die Nepomuk Datei-Ontologie legt grundlegende Dateitypen fest.
+ Comment[el]=Η οντολογία αρχείων Nepomuk ορίζει τους βασικούς τύπους αρχείων
+ Comment[es]=La ontología de ficheros Nepomuk define tipos básicos de ficheros
++Comment[et]=Nepomuki failiontoloogia määrab põhilised failitüübid
+ Comment[fa]=هستی‌شناسی پرونده Nepomuk، انواع پرونده پایه‌ای را تعریف می‌کند
+ Comment[ga]=Sainmhíníonn Ointeolaíocht Comhad Nepomuk bunchineálacha comhaid
+ Comment[he]=אונטולוגיית הקובץ של Nepomuk מגדירה את סוגי הקבצים הבסיסיים
+@@ -47,6 +52,8 @@
+ Comment[nl]=De Nepomuk Bestandsontologie definieert basis bestandstypen
+ Comment[pt]=A Ontologia de Ficheiros do Nepomuk define os tipos básicos de ficheiros
+ Comment[pt_BR]=A Ontologia de Arquivos Nepomuk define os tipos básicos de arquivos
++Comment[sr]=Непомукова онтологија фајлова дефинише основне типове фајлова
++Comment[sr at latin]=Nepomukova ontologija fajlova definiše osnovne tipove fajlova
+ Comment[sv]=Nepomuks filontologi definerar grundläggande filtyper
+ Comment[th]=คำศัพท์กำกับแฟ้มของ Nepomuk จะนิยามชนิดแฟ้มพื้นฐาน
+ Comment[vi]=Bản thể học tập tin Nepomuk thì xác định các kiểu tập tin cơ bản
+--- a/nepomuk/ontologies/dctype.desktop
++++ b/nepomuk/ontologies/dctype.desktop
+@@ -8,6 +8,7 @@
+ Name[de]=Die DCMI-Typen
+ Name[el]=Οι τύποι DCMI
+ Name[es]=Los tipos DCMI
++Name[et]=DCMI Types
+ Name[fa]=انواع DCMI
+ Name[ga]=Na Cineálacha DCMI
+ Name[he]=טיפוסים של DCMI
+@@ -17,6 +18,7 @@
+ Name[km]=ប្រភេទ DCMI
+ Name[kn]=DCMI ಬಗೆಗಳು
+ Name[ko]=DCMI 형식
++Name[lv]=DCMI tipi
+ Name[nds]=De DCMI-Typen
+ Name[ne]=DCMI प्रकार
+ Name[nl]=De DMCI-typen
+@@ -24,8 +26,11 @@
+ Name[pt]=Os Tipos do DCMI
+ Name[pt_BR]=Tipos DCMI
+ Name[sl]=Vrste DCMI
++Name[sr]=ДЦМИ типови
++Name[sr at latin]=DCMI tipovi
+ Name[sv]=DCMI-typerna
+ Name[th]=ชนิดของ DCMI
++Name[uk]=Типи DCMI
+ Name[vi]=Kiểu DCMI
+ Name[wa]=Les sôres DCMI
+ Name[x-test]=xxThe DCMI Typesxx
+@@ -38,6 +43,7 @@
+ Comment[de]=Der Namensraum der Dublin Core Types stellt URIs für die Einträge des DCMI-Typ-Vokabulars bereit.
+ Comment[el]=Ο χώρος ονομάτων τύπων Dublin Core προσφέρει URI των καταχωρήσεων του λεξικού τύπων DCMI.
+ Comment[es]=El espacio de nombres Dublin Core proporciona URI para las entradas del vocabulario de tipos DCMI.
++Comment[et]=Dublin Core Typesi nimeruum pakub URI-d DCMI Type sõnastiku kirjetele.
+ Comment[fa]=فضای نام انواع هسته Dublin، URIهایی را برای مدخلهای واژگان نوع DCMI فراهم می‌کند.
+ Comment[ga]=Soláthraíonn ainmspás na gcineálacha Dublin Core URIanna le haghaidh iontrálacha sa Stór Cineálacha DCMI.
+ Comment[he]=תחום השמות של הטיפוסים של Dublin Core מספק כתובות עבור רשומות אוצר הטיפוסים של DCMI.
+@@ -51,6 +57,8 @@
+ Comment[nl]=De Dublin Core Types namespace levert URI-adressen voor de items van de DCMI-type-vocabulaire.
+ Comment[pt]=O espaço de nomes dos Tipos do Dublin Core oferece URIs para os itens do Vocabulário de Tipos do DCMI.
+ Comment[pt_BR]=O espaço de nomes Dublin Core Types fornece URIs para os itens do Vocabulário de Tipos DCMI
++Comment[sr]=Именски простор типова Даблинског језгра наводи УРИ-је ставки из Речника ДЦМИ типова.
++Comment[sr at latin]=Imenski prostor tipova Dablinskog jezgra navodi URI-je stavki iz Rečnika DCMI tipova.
+ Comment[sv]=Dublin-kärntypernas namnrymd tillhandahåller adresser för posterna i DCMI- typordförrådet.
+ Comment[th]=รูปแบบชื่อชนิดหลักของ Dublin ที่ให้ URI สำหรับรายการของคำศัพท์แบบ DCMI
+ Comment[vi]=Miền tên Kiểu Lõi Dublin thì cung cấp URI cho mỗi mục Từ vựng Kiểu DCMI.
+--- a/nepomuk/ontologies/nrl.desktop
++++ b/nepomuk/ontologies/nrl.desktop
+@@ -7,6 +7,7 @@
+ Name[csb]=Reprezentowóny jãzëk Napomuk
+ Name[el]=Γλώσσα αναπαράστασης Nepomuk
+ Name[es]=Lenguaje de representación Nepomuk
++Name[et]=Nepomuki esituskeel
+ Name[fa]=زبان بازنمایی Nepomuk
+ Name[ga]=Teanga Léirithe Nepomuk
+ Name[he]=שפת ייצוג של Nepomuk
+@@ -20,8 +21,11 @@
+ Name[nl]=Nepomuk Representatietaal
+ Name[pt]=NRL (Nepomuk Representation Language)
+ Name[pt_BR]=Linguagem de Representação Nepomuk
++Name[sr]=Непомуков репрезентациони језик
++Name[sr at latin]=Nepomukov reprezentacioni jezik
+ Name[sv]=Nepomuks beskrivningsspråk
+ Name[th]=ภาษาตัวแทน Nepomuk
++Name[uk]=Мова репрезентації Nepomuk
+ Name[vi]=Ngôn ngữ đại diện Nepomuk
+ Name[wa]=Lingaedje di reprezintåcion nepomuk
+ Name[x-test]=xxNepomuk Representation Languagexx
+@@ -35,6 +39,7 @@
+ Comment[el]=Η NRL είναι μια γλώσσα αναπαράστασης η οποία ξεπερνά συγκεκριμένους περιορισμούς της RDF/S. Έχει σχεδιαστεί πάνω στην RDF. Συγκεκριμένα περιλαμβάνει υποστήριξη για γραφήματα ονομάτων για την επεξεργασία δεδομένων. Αν και πρόκειται για μια πολύ δημοφιλής έννοια, τα γραφήματα ονομάτων δεν υποστηρίζονταν από οποιαδήποτε γλώσσα αναπαράστασης μέχρι τώρα. Βασισμένα στην οπτική ιδέα χειρισμού των οντοτήτων. Αυτή η οπτική ιδέα αποδείχτηκε εξαιρετικής αξία, καθώς προσφέρει ένα μηχανισμό επιβολής διαφορετικής σημειολογία διατηρώντας την ίδια συντακτική δομή.
+ Comment[en_GB]=NRL is a Representational Language that addresses certain limitations on the part of RDF/S. It is itself designed on top of RDF. In particular it includes support for Named Graphs for modularisation of data. Although being a widely-popular notion, named graphs have not been supported by any Representational Language so far. It is also based on a view concept for the tailoring of ontologies. This view concept turned out to be of additional value, as it also provides a mechanism to impose different semantics on the same syntactical structure.
+ Comment[es]=NRL es un lenguaje de representación que supera algunas limitaciones de RDF/S. Está diseñado sobre RDF. En concreto, implementa gráficos con nombre («named graphs») para modularización de datos. Aunque son una noción muy popular, hasta ahora ningún lenguaje de representación ha implementado los gráficos con nombre. También está basado sobre un concepto de vista para la adaptación de ontologías. Este concepto de vista resultó de ser valor añadido, pues también proporciona un mecanismo para imponer diferentes semánticas sobre la misma estructura sintáctica.
++Comment[et]=NRL (Nepomuk Representation Language) on esituskeel, mille siht on ületada teatud RDF/S-i piirangud. See paikneb RDF-ist kõrgemal. Eelkõige toetab see andmete modulariseerimisel nimega graafe. Ehkki nimega graafid on üsna laialt levinud, ei ole seni ükski esituskeel neid toetanud. Samuti kasutab NRL ontoloogiate käsitlemisel vaatekontseptsiooni. Sellel on omaette väärtus, sest see pakub ka mehhanismi, kuidas rakendada ühe ja sama süntaksistruktuuri korral erinevat semantikat.
+ Comment[ga]=Is teanga léiriúcháin é NRL a thugann aghaidh ar lochtanna áirithe i RDF/S. Tá sé tógtha ar bharr RDF.  Go sonrach, tá tacaíocht do Ghraif Ainmnithe ar fáil ann, le haghaidh modúlaithe sonraí.  Cé go bhfuil siad i mbéal an phobail, ní raibh tacaíocht do Ghraif Ainmnithe ar fáil in aon Teanga Léiriúcháin go dtí seo. Tá NRL bunaithe freisin ar "choincheap amhairc" le haghaidh oiriúnú d'ointeolaíochtaí.  Ba bhreisluach ar an gcoincheap amhairc seo, toisc go soláthraíonn sé meicníocht lenar féidir séimeantaic dhifriúil a chur i bhfeidhm ar aon struchtúr comhréireach amháin.
+ Comment[he]=שפת הייצוג של Nepomuk ‏(NRL) היא שפת ייצוג שנועדה לפתור מגבלות מסויימות של RDF/S. השפה כשלעצמה תוכננה כהרחבה ל־RDF. בפרט, היא כוללת תמיכה בגרפים בעלי שמות כדי לאפשר מודולריזציה של מידע. למרות שזהו מושג נפוץ, עד כה אף שפת ייצוג לא תמכה בגרפים בעלי שמות. כמו כן, השפה מבוססת גם על רעיון של תצוגה לשם התאמת אונטולוגיות. רעיון זה הסתבר כבעל ערך מוסף מכיוון שהוא מספק מנגנון להחיל סמנטיקות שונות על אותו מבנה תחבירי.
+ Comment[hu]=Az NRL egy ábrázoló nyelv, mely az RDF/S kiegészítésére készült. Maga a nyelv az RDF-re épül. Támogatja a nével ellátott grafikonokat az adatmodularizáció érdekében. Jóllehet elterjedt koncepciónak számít, a névvel ellátott grafikonokat eddig egyik ábrázoló nyelv sem támogatta. Támogat továbbá nézeteket is az ontológiák testreszabásához. Ez egy igen hasznos lehetőség, mert lehetővé teszi kölünféle szemnatikák alkalmazását ugyanarra a szintaktikai struktúrára.
+@@ -45,6 +50,8 @@
+ Comment[nl]=NRL is een representationele taal gericht op het oplossen van bepaalde beperkingen in RDF/S. Het is geschreven als een uitbreiding van RDF. Het heeft ondersteuning voor 'Named Graphs' voor de modularisatie van data. Hoewel het een erg populair begrip is worden Named Graphs tot nog toe niet ondersteund in een representationele taal. Het is ook gebaseerd op een experimentele weergavemethode voor het aanpassen van ontologieën. Deze experimentele weergave bleek waarde toe te voegen, daar het een mechanisme bood om verschillende semantieken op de zelfde syntactische structuur te projecteren.
+ Comment[pt]=A NRL é uma Linguagem de Representação que lida com certas limitações por parte do RDF/S. Ela está desenhada em si sobre o RDF. Em particular, inclui o suporte para Grafos com Nomes, para a modularização dos dados. Ainda que seja uma noção bastante popular, os grafos com nomes não foram suportados por nenhuma linguagem de representação até agora. Também se baseia no conceito de vista para a concepção de ontologias. Este conceito de vista acabou por ser um valor acrescentado, dado que oferece também um mecanismo para impor semânticas diferentes sobre a mesma estrutura sintáctica.
+ Comment[pt_BR]=A NRL é uma Linguagem Representacional que aborda certas limitações por parte do RDF/S.  A própria NRL é desenhada em cima do RDF.  Ela conta com suporte para Named Graphs para a modularização de dados.  Embora este seja um conceito muito conhecido, até agora não havia nehuma Linguagem Representacional com suporte para named graphs.  A NRL também se baseia num conceito de visualização para o ajuste de ontologias.  Este conceito de visualização passou a ter um valor a mais, visto que proporciona também um mecanismo para import diferentes semânticas na mesma estrutura sintática.
++Comment[sr]=НРЛ је репрезентациони језик који решава извесна ограничења на страни РДФ шеме; сам је пројектован на основи РДФ-а. Посебно садржи подршку за именоване графове за модуларизацију података, које, иако широко популарне у идејном смислу, пре овога није подржавао ниједан репрезентациони језик. Такође је заснован на приказном концепту за прилагођавање онтологија, код кога је уочена и допунска вредност у томе што пружа механизам за наметање различите семантике над истом синтаксном структуром.
++Comment[sr at latin]=NRL je reprezentacioni jezik koji rešava izvesna ograničenja na strani RDF šeme; sam je projektovan na osnovi RDF-a. Posebno sadrži podršku za imenovane grafove za modularizaciju podataka, koje, iako široko popularne u idejnom smislu, pre ovoga nije podržavao nijedan reprezentacioni jezik. Takođe je zasnovan na prikaznom konceptu za prilagođavanje ontologija, kod koga je uočena i dopunska vrednost u tome što pruža mehanizam za nametanje različite semantike nad istom sintaksnom strukturom.
+ Comment[sv]=Nepomuks beskrivningsspråk (NRL) är ett representationsspråk som tar hand om vissa begränsningar som finns i RDF/S. Det är själv konstruerat med RDF som grund. I synnerhet innehåller det stöd för namngivna grafer för modularisering av data. Även om de är populära på många håll, har inte namngivna grafer tidigare haft stöd i något representationsspråk. Det är också baserat på ett vykoncept för anpassning av ontologier. Vykonceptet visade sig vara värdefullt på flera sätt, eftersom det också tillhandahåller en mekanism för att införa olika semantik med samma syntaktiska struktur.
+ Comment[th]=NRL คือภาษาตัวแทนที่จะบอกถึงข้อจำกัดในส่วนของ RDF/S โดยตัวมันนั้นถูกออกแบบมา ให้อยู่ในขั้นสูงกว่า RDF ว่ากันโดยละเอียดแล้วก็คือ มันจะรวมการสนับสนุนกราฟที่มีชื่อสำหรับ กระทำข้อมูลให้เป็นโมดูล แม้ว่าจะเป็นที่รู้จักกันอย่างกว้างขวาง แต่กราฟที่มีชื่อยังไม่ได้รับ การสนับสนุนจากภาษาตัวแทนในขณะนี้ นอกจากนี้มันยังตั้งอยู่บนพื้นฐานของมุมมองความคิด สำหรับการสร้างคำศัพท์กำกับด้วย โดยมุมมองความคิดนี้ก็กลายเป็นค่าเพิ่มเติม เพราะว่า มันก็ได้ให้กลไกในการกำหนดความหมายต่างๆ กันในแต่ละโครงสร้างทางไวยากรณ์ด้วย
+ Comment[vi]=Ngôn ngữ đại diện Nepomuk (Nepomuk Representation Language: NRL) là một ngôn ngữ đại diện có thỏa mãn một số giới hạn nào đó trong RDF/S. Chính nó được thiết kế bên trên RDF. Đặc biệt nó gồm khả năng hỗ trợ Đồ thị có Tên để mô-đun hoá các dữ liệu. Mặc dù Đồ thị có Tên là ý kiến phổ biến rộng rãi, nó chưa được hỗ trợ bởi Ngôn ngữ Đại diện nào. Nó cũng dựa vào một khái niệm xem để điều chỉnh bản thể học. Khái niệm xem này đã xảy ra hữu ích hơn, vỉ nó cũng cung cấp một cơ chế để điều khiển ngữ nghĩa học khác trên cùng một cấu trúc kiểu cú pháp.
+--- a/nepomuk/ontologies/rdfs.desktop
++++ b/nepomuk/ontologies/rdfs.desktop
+@@ -7,6 +7,7 @@
+ Name[cs]=RDF schéma
+ Name[el]=Σχήμα RDF
+ Name[es]=Esquema RDF
++Name[et]=RDF-skeem
+ Name[fa]=طرحواره RDF
+ Name[he]=סכמת־RDF
+ Name[hu]=RDF séma
+@@ -14,12 +15,16 @@
+ Name[km]=គ្រោងការណ៍ RDF
+ Name[kn]=RDF-ರೂಪರೇಖೆ (ಸ್ಕೀಮಾ)
+ Name[ko]=RDF 스키마
++Name[lv]=RDF shēma
+ Name[ne]=RDF-स्कीमा
+ Name[nl]=RDF-schema
+ Name[pa]=RDF-ਸਕੀਮਾਂ
+ Name[pt]=Esquema RDF
+ Name[sl]=Shema RDF
++Name[sr]=РДФ шема
++Name[sr at latin]=RDF šema
+ Name[sv]=RDF-schema
++Name[uk]=RDF-схема
+ Name[vi]=Giản đồ RDF
+ Name[wa]=Chema RDF
+ Name[x-test]=xxRDF-Schemaxx
+@@ -37,13 +42,17 @@
+ Comment[km]=ភាសា​ពិពណ៌នា​វាក្យ​ស័ព្ទ RDF ១.០ ៖ គ្រោងការណ៍ RDF
+ Comment[kn]=RDF ಪದಪಟ್ಟಿ (ವೊಕಾಬುಲರಿ) ವಿವರಣಾ ಭಾಷೆ ೧.೦: RDF-ರೂಪರೇಖೆ (ಸ್ಕೀಮಾ)
+ Comment[ko]=RDF 어휘 설명 언어 1.0: RDF 스키마
++Comment[lv]=RDF vārdnīcas apraksta valoda 1.0: RDF shēma
+ Comment[nds]=Woortsett-Beschrievspraak RDF 1.0: RDF-Schema
+ Comment[ne]=RDF शब्दकोश वर्णन भाषा 1.0: RDF स्कीमा
+ Comment[nl]=RDF Vocabulaire Beschrijvingstaal 1.0: RDF-schema
+ Comment[pt]=RDF Vocabulary Description Language 1.0: Esquema de RDF
+ Comment[pt_BR]=Linguagem de Descrição de Vocabulário RDF 1.0: RDF Schema
++Comment[sr]=РДФ језик за опис речника 1.0: РДФ шема
++Comment[sr at latin]=RDF jezik za opis rečnika 1.0: RDF šema
+ Comment[sv]=RDF-ordförrådsbeskrivningsspråk 1.0 schema
+ Comment[th]=ภาษาสำหรับอธิบายคำศัพท์ RDF: รูปแบบ RDF
++Comment[uk]=Мова RDF опису слів 1.0: схема RDF
+ Comment[vi]=Ngôn ngữ Diễn tả Từ vựng RDF 1.0: giản đồ RDF
+ Comment[wa]=Chema do lingaedje di discrijhaedje di vocabulaire RDF 1.0
+ Comment[x-test]=xxRDF Vocabulary Description Language 1.0: RDF Schemaxx
+--- a/nepomuk/core/resourcemanager.cpp
++++ b/nepomuk/core/resourcemanager.cpp
+@@ -31,14 +31,22 @@
+ #include <krandom.h>
+ 
+ #include <Soprano/Client/DBusClient>
++#include <Soprano/Client/DBusModel>
+ #include <Soprano/Node>
+ #include <Soprano/Statement>
+-#include <Soprano/DummyModel>
+ #include <Soprano/Vocabulary/RDF>
+ #include <Soprano/StatementIterator>
+ 
++// just to be sure nobody hits me due to the API change in Soprano
++#include <soprano/dummymodel.h>
++namespace Soprano {
++   namespace Util {
++   class Dummy {};
++   }
++}
+ 
+ using namespace Soprano;
++using namespace Soprano::Util;
+ 
+ 
+ static const char* NEPOMUK_NAMESPACE = "http://nepomuk.kde.org/resources#";
+@@ -57,7 +65,7 @@
+     Soprano::Client::DBusClient client;
+     Soprano::Model* mainModel;
+ 
+-    Soprano::DummyModel* dummyModel;
++    DummyModel* dummyModel;
+ 
+ private:
+     ResourceManager* m_parent;
+@@ -218,7 +226,7 @@
+ 
+     if ( !d->mainModel ) {
+         if ( !d->dummyModel ) {
+-            d->dummyModel = new Soprano::DummyModel();
++            d->dummyModel = new DummyModel();
+         }
+         return d->dummyModel;
+     }
+--- a/nepomuk/core/ontology/nepomukontologyloader.cpp
++++ b/nepomuk/core/ontology/nepomukontologyloader.cpp
+@@ -23,6 +23,7 @@
+ #include <Soprano/Statement>
+ #include <Soprano/Model>
+ #include <Soprano/QueryResultIterator>
++#include <Soprano/Client/DBusModel>
+ #include <Soprano/Client/DBusClient>
+ 
+ #include <QtCore/QDebug>
+--- a/kimgio/qimageio_plugin.desktop
++++ b/kimgio/qimageio_plugin.desktop
+@@ -11,6 +11,7 @@
+ Comment[de]=QImageIOHandler-Modul
+ Comment[el]=Πρόσθετο QImageIOHandler
+ Comment[es]=Complemento QImageIOHandler
++Comment[et]=QImageIOHandleri plugin
+ Comment[fa]=وصله QImageIOHandler
+ Comment[ga]=Breiseán QImageIOHandler
+ Comment[he]=תוסף QImageIOHandler
+@@ -21,6 +22,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ QImageIOHandler
+ Comment[kn]=QImageIOHandler ಮಿಳಿತಾನ್ವಯ (ಪ್ಲಗಿನ್)
+ Comment[ko]=QImageIOHandler 플러그인
++Comment[lv]=QImageIOHandler spraudnis
+ Comment[nds]=QImage-In-/Utgaavmoduul
+ Comment[ne]=QImageIOHandler प्लगइन
+ Comment[nl]=QImageIOHandler-plugin
+@@ -28,8 +30,11 @@
+ Comment[pt]='Plugin' do QImageIOHandler
+ Comment[pt_BR]=Plugin do QImageIOHandler
+ Comment[sl]=Vstavek QImageIOHandler
++Comment[sr]=Прикључак QImageIO руковаоца
++Comment[sr at latin]=Priključak QImageIO rukovaoca
+ Comment[sv]=Insticksprogram för QImage I/O-hantering
+ Comment[th]=ปลั๊กอินสำหรับจัดการ IO ของภาพ QImage
++Comment[uk]=Втулок QImageIOHandler
+ Comment[vi]=Bổ sung QImageIOHandler
+ Comment[wa]=Tchôke-divins QImageIOHandler
+ Comment[x-test]=xxQImageIOHandler pluginxx
+--- a/kimgio/dds.desktop
++++ b/kimgio/dds.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=DDS
++Name[sr]=ДДС
+ Name[te]=డిడిఎస్
+ Name[x-test]=xxDDSxx
+ Type=Service
+--- a/kimgio/hdr.desktop
++++ b/kimgio/hdr.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=HDR
++Name[sr]=ХДР
+ Name[te]=హెచ్ డి ఆర్
+ Name[x-test]=xxHDRxx
+ Type=Service
+--- a/kimgio/pbm.desktop
++++ b/kimgio/pbm.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=PBM
++Name[sr]=ПБМ
+ Name[te]=పిబిఎం
+ Name[x-test]=xxPBMxx
+ Type=Service
+--- a/kimgio/mng.desktop
++++ b/kimgio/mng.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=MNG
++Name[sr]=МНГ
+ Name[te]=ఎంఎన్ జి
+ Name[x-test]=xxMNGxx
+ Type=Service
+--- a/kimgio/png.desktop
++++ b/kimgio/png.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=PNG
++Name[sr]=ПНГ
+ Name[te]=పిఎన్ జి
+ Name[x-test]=xxPNGxx
+ Type=Service
+--- a/kimgio/jpeg.desktop
++++ b/kimgio/jpeg.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=JPEG
++Name[sr]=ЈПЕГ
+ Name[te]=జెపిఈజి
+ Name[x-test]=xxJPEGxx
+ Type=Service
+--- a/kimgio/xbm.desktop
++++ b/kimgio/xbm.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=XBM
++Name[sr]=ИксБМ
+ Name[te]=ఎక్స్ బిఎం
+ Name[x-test]=xxXBMxx
+ Type=Service
+--- a/kimgio/eps.desktop
++++ b/kimgio/eps.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=EPS
++Name[sr]=ЕПС
+ Name[te]=ఇపిఎస్
+ Name[x-test]=xxEPSxx
+ Type=Service
+--- a/kimgio/jp2.desktop
++++ b/kimgio/jp2.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=JP2
++Name[sr]=ЈП2
+ Name[te]=జెపి2
+ Name[x-test]=xxJP2xx
+ Type=Service
+--- a/kimgio/ppm.desktop
++++ b/kimgio/ppm.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=PPM
++Name[sr]=ППМ
+ Name[te]=పిపిఎం
+ Name[x-test]=xxPPMxx
+ Type=Service
+--- a/kimgio/exr.desktop
++++ b/kimgio/exr.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=EXR
++Name[sr]=ЕИксР
+ Name[te]=ఇఎక్స్ ఆర్
+ Name[x-test]=xxEXRxx
+ Type=Service
+--- a/kimgio/xpm.desktop
++++ b/kimgio/xpm.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=XPM
++Name[sr]=ИксПМ
+ Name[te]=ఎక్స్ పిఎం
+ Name[x-test]=xxXPMxx
+ Type=Service
+--- a/kimgio/gif.desktop
++++ b/kimgio/gif.desktop
+@@ -2,6 +2,7 @@
+ Encoding=UTF-8
+ Name=GIF
+ Name[ar]=SGI
++Name[sr]=ГИФ
+ Name[te]=జిఐఎఫ్
+ Name[x-test]=xxGIFxx
+ Type=Service
+--- a/kimgio/ico.desktop
++++ b/kimgio/ico.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=ICO
++Name[sr]=ИЦО
+ Name[te]=ఐసిఓ
+ Name[x-test]=xxICOxx
+ Type=Service
+--- a/kimgio/rgb.desktop
++++ b/kimgio/rgb.desktop
+@@ -2,6 +2,7 @@
+ Encoding=UTF-8
+ Name=RGB
+ Name[kn]=ಕೆ.ಹ.ನೀ/RGB
++Name[sr]=РГБ
+ Name[te]=ఆర్ జి బి
+ Name[x-test]=xxRGBxx
+ Type=Service
+--- a/kimgio/tga.desktop
++++ b/kimgio/tga.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=TGA
++Name[sr]=ТГА
+ Name[te]=టిజిఏ
+ Name[x-test]=xxTGAxx
+ Type=Service
+--- a/kimgio/bmp.desktop
++++ b/kimgio/bmp.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=BMP
++Name[sr]=БМП
+ Name[te]=బిఎంపి
+ Name[x-test]=xxBMPxx
+ Type=Service
+--- a/kimgio/xcf.desktop
++++ b/kimgio/xcf.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=XCF
++Name[sr]=ИксЦФ
+ Name[te]=ఎక్స్ సిఎఫ్
+ Name[x-test]=xxXCFxx
+ Type=Service
+--- a/kimgio/pgm.desktop
++++ b/kimgio/pgm.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=PGM
++Name[sr]=ПГМ
+ Name[te]=పిజిఎం
+ Name[x-test]=xxPGMxx
+ Type=Service
+--- a/kimgio/psd.desktop
++++ b/kimgio/psd.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=PSD
++Name[sr]=ПСД
+ Name[te]=పిఎస్ డి
+ Name[x-test]=xxPSDxx
+ Type=Service
+--- a/kimgio/tiff.desktop
++++ b/kimgio/tiff.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=TIFF
++Name[sr]=ТИФФ
+ Name[te]=టిఐ ఎఫ్ఎఫ్
+ Name[x-test]=xxTIFFxx
+ Type=Service
+--- a/kimgio/pcx.desktop
++++ b/kimgio/pcx.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=PCX
++Name[sr]=ПЦИкс
+ Name[te]=పిసిఎక్స్
+ Name[x-test]=xxPCXxx
+ Type=Service
+--- a/kimgio/xv.desktop
++++ b/kimgio/xv.desktop
+@@ -1,6 +1,7 @@
+ [Desktop Entry]
+ Encoding=UTF-8
+ Name=XV
++Name[sr]=ИксВ
+ Name[te]=ఎక్స్ వి
+ Name[x-test]=xxXVxx
+ Type=Service
+--- a/kdeprint/tools/escputil/escputil.desktop
++++ b/kdeprint/tools/escputil/escputil.desktop
+@@ -17,6 +17,8 @@
+ Name[ne]=EPSON इङ्कजेट
+ Name[nn]=EPSON-blekkskrivar
+ Name[pt]=Jacto de Tinta da EPSON
++Name[sr]=Епсонов млазњак
++Name[sr at latin]=Epsonov mlaznjak
+ Name[ta]=EPSON இங்க்ஜெட்
+ Name[te]=ఎప్సన్ ఇంక్ జెట్
+ Name[x-test]=xxEPSON InkJetxx
+--- a/kdeprint/cups/cups.print
++++ b/kdeprint/cups/cups.print
+@@ -35,8 +35,8 @@
+ Comment[ru]=Система печати CUPS (Common Unix Print System)
+ Comment[se]=CUPS («Common Unix Print System», čálihanvuogádat)
+ Comment[sl]=CUPS (skupni tiskalniški sistem za Unix)
+-Comment[sr]=CUPS (Common Unix Print System)
+-Comment[sr at latin]=CUPS (Common Unix Print System)
++Comment[sr]=ЦУПС (заједнички штампарски систем за Униксе)
++Comment[sr at latin]=CUPS (zajednički štamparski sistem za Unixe)
+ Comment[sv]=Cups (Common Unix print system)
+ Comment[ta]=CUPS (பொது யுனிக்ஸ் அச்சுத் தொகுதி)
+ Comment[te]=కెయుపిఎస్ (సామాన్య యునిక్స్ ప్రచురణ వ్యవస్థ)
+--- a/kdeprint/cups/kmwippprinter.cpp
++++ b/kdeprint/cups/kmwippprinter.cpp
+@@ -177,10 +177,10 @@
+         if (req.text("printer-make-and-model", value) && !value.isEmpty()) txt.append(i18n("<b>Model</b>: %1<br />", value));
+         if (req.enumvalue("printer-state", state)) {
+             switch (state) {
+-            case IPP_PRINTER_IDLE: value = i18n("Idle"); break;
+-            case IPP_PRINTER_STOPPED: value = i18n("Stopped"); break;
+-            case IPP_PRINTER_PROCESSING: value = i18n("Processing..."); break;
+-            default: value = i18nc("Unknown State", "Unknown"); break;
++            case IPP_PRINTER_IDLE: value = i18nc("@item:intext Printer state", "Idle"); break;
++            case IPP_PRINTER_STOPPED: value = i18nc("@item:intext Printer state", "Stopped"); break;
++            case IPP_PRINTER_PROCESSING: value = i18nc("@item:intext Printer state", "Processing..."); break;
++            default: value = i18nc("@item:intext Printer state", "Unknown"); break;
+             }
+             txt.append(i18n("<b>State</b>: %1<br />", value));
+         }
+--- a/kdeprint/foomatic/foomatic.print
++++ b/kdeprint/foomatic/foomatic.print
+@@ -8,6 +8,7 @@
+ Comment[fa]=)Foomatic (CUPS,LPRng,PDQ
+ Comment[kn]=ಫೂಮಾಟಿಕ್ (CUPS, LPRng, PDQ)
+ Comment[ne]=फुम्याटिक (CUPS, LPRng, PDQ)
++Comment[sr]=Фуматик (ЦУПС, ЛПРнг, ПДКу)
+ Comment[sv]=Foomatic (Cups, LPRng, PDQ)
+ Comment[te]=ఫూమెటిక్ (సియుపిఎస్, ఎల్ పి ఆర్ అన్ జి,పిడిక్యు) 
+ Comment[x-test]=xxFoomatic (CUPS, LPRng, PDQ)xx
+--- a/kdeprint/lpd/lpd.print
++++ b/kdeprint/lpd/lpd.print
+@@ -14,7 +14,7 @@
+ Comment[el]=LPR (Τυπικό BSD σύστημα εκτύπωσης)
+ Comment[eo]=LPR (Normala BSD-pressistemo)
+ Comment[es]=LPR (sistema de impresión estándar de BSD)
+-Comment[et]=LPR (standardne BSD trükkimise süsteem)
++Comment[et]=LPR (standardne BSD trükkimissüsteem)
+ Comment[eu]=LPR (BSDren inprimatze-sistema estandarra)
+ Comment[fa]=LPR (سیستم چاپ BSD استاندارد)
+ Comment[fi]=LPR (standardi BSD-tulostusjärjestelmä)
+@@ -50,8 +50,8 @@
+ Comment[ru]=LPR (стандартная система печати BSD)
+ Comment[se]=LPR (Standárda BSD čálihanvuogádat)
+ Comment[sl]=LPR (običajni tiskalniški sistem iz BSD)
+-Comment[sr]=LPR (стандардни BSD систем за штампање)
+-Comment[sr at latin]=LPR (standardni BSD sistem za štampanje)
++Comment[sr]=ЛПР (стандардни БСД штампарски систем)
++Comment[sr at latin]=LPR (standardni BSD štamparski sistem)
+ Comment[sv]=LPR (Standardskrivarsystem för BSD)
+ Comment[ta]=LPR (நிலையான BSD அச்சு அமைப்பு)
+ Comment[te]=ఎల్ పి ఆర్  (సాధరణ బి ఎస్ డి ప్రచురణ వ్యవస్థ)
+--- a/kdeprint/lpr/CMakeLists.txt
++++ b/kdeprint/lpr/CMakeLists.txt
+@@ -49,8 +49,3 @@
+ 
+ install( FILES apsdriver1 apsdriver2 lprngtooldriver1  DESTINATION  ${DATA_INSTALL_DIR}/kdeprint )
+ install( FILES lpr.print  DESTINATION  ${DATA_INSTALL_DIR}/kdeprint/plugins )
+-install( FILES printcapentry.h lprhandler.h lprsettings.h  DESTINATION  ${INCLUDE_INSTALL_DIR}/kdeprint/lpr )
+-
+-
+-
+-
+--- a/kdeprint/lpr/lpr.print
++++ b/kdeprint/lpr/lpr.print
+@@ -14,7 +14,7 @@
+ Comment[el]=LPR/LPRng σύστημα εκτύπωσης
+ Comment[eo]=LPR/LPRng-presosistemo
+ Comment[es]=Sistema de impresión LPR/LPRNg
+-Comment[et]=LPR/LPRng trükkimise süsteem
++Comment[et]=LPR/LPRng trükkimissüsteem
+ Comment[eu]=LPR/LPRng inprimatze-sistema
+ Comment[fa]=سیستم چاپ LPR/LPRng
+ Comment[fi]=LPR/LPRng-tulostusjärjestelmä
+@@ -50,8 +50,8 @@
+ Comment[ru]=Система печати LPR/LPRng
+ Comment[se]=LPR/LPRng čálihanvuogádat
+ Comment[sl]=Tiskalniški sistem za LPR/LPRng
+-Comment[sr]=LPR/LPRng систем за штампање
+-Comment[sr at latin]=LPR/LPRng sistem za štampanje
++Comment[sr]=Штампарски систем ЛПР/ЛПРнг
++Comment[sr at latin]=Štamparski sistem LPR/LPRng
+ Comment[sv]=LPR/LPRNG-skrivarsystem
+ Comment[ta]=LPR/LPRng அச்சுத் தொகுதி
+ Comment[te]=ఎల్ పి ఆర్/ఎల్ పి ఆర్ ఎన్ జి ప్రచురణ వ్యవస్థ
+--- a/kdeprint/kdeprintd/kdeprintd.desktop
++++ b/kdeprint/kdeprintd/kdeprintd.desktop
+@@ -43,7 +43,7 @@
+ Name[ko]=KDE 인쇄 데몬
+ Name[lb]=KDE-Dréck-Dämon
+ Name[lt]=KDE spausdinimo tarnyba
+-Name[lv]=KDE Drukas Dēmons
++Name[lv]=KDE drukas dēmons
+ Name[ms]=Daemon Cetak KDE
+ Name[nb]=KDE-utskriftsnisse
+ Name[nds]=KDE-Druckdämoon
+@@ -57,8 +57,8 @@
+ Name[ru]=Служба печати
+ Name[se]=KDE čálihanbálvá
+ Name[sl]=Tiskalniški strežnik za KDE
+-Name[sr]=KDE-ов демон за штампање
+-Name[sr at latin]=KDE-ov demon za štampanje
++Name[sr]=КДЕ-ов штампарски демон
++Name[sr at latin]=KDE-ov štamparski demon
+ Name[sv]=KDE:s skrivardemon
+ Name[ta]=கேமேசைச் சூழல் அச்சு டேமன்
+ Name[te]=కెడిఈ ప్రచురణ సూత్రధారి
+@@ -106,7 +106,7 @@
+ Comment[ko]=KDE용 인쇄 데몬
+ Comment[lb]=Dréck-Dämon fir KDE
+ Comment[lt]=Spausdinimo tarnyba, skirta KDE
+-Comment[lv]=Drukas Dēmons priekš KDE
++Comment[lv]=Drukas dēmons priekš KDE
+ Comment[mk]=KDE даемон за печатење
+ Comment[ms]=Daemon Cetak untuk KDE
+ Comment[nb]=Utskriftsnisse for KDE
+@@ -122,8 +122,8 @@
+ Comment[ru]=Служба печати KDE
+ Comment[se]=KDE:a čálihanbálvá
+ Comment[sl]=Tiskalniški strežnik za KDE
+-Comment[sr]=KDE-ов демон за штампање
+-Comment[sr at latin]=KDE-ov demon za štampanje
++Comment[sr]=Демон за штампање у КДЕ-у
++Comment[sr at latin]=Demon za štampanje u KDE-u
+ Comment[sv]=Skrivardemon för KDE
+ Comment[ta]=கேடிஇக்கான ஒரு அச்ச் டெமான்
+ Comment[te]=కెడిఈ కొరకు సూత్రధారి
+--- a/kdeprint/management/CMakeLists.txt
++++ b/kdeprint/management/CMakeLists.txt
+@@ -66,8 +66,11 @@
+ target_link_libraries(kdeprint_management  ${KDE4_KDECORE_LIBS} kdeprint ${KDE4_KDE3SUPPORT_LIBS} )
+ 
+ set_target_properties(kdeprint_management PROPERTIES VERSION ${KDE_NON_GENERIC_LIB_VERSION} SOVERSION ${KDE_NON_GENERIC_LIB_SOVERSION} )
+-install(TARGETS kdeprint_management  DESTINATION ${LIB_INSTALL_DIR} )
+-
++install(TARGETS kdeprint_management
++             RUNTIME DESTINATION ${BIN_INSTALL_DIR}
++             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
++             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
++)
+ 
+ ########### next target ###############
+ 
+@@ -90,7 +93,11 @@
+ 
+ target_link_libraries(kdeinit_kaddprinterwizard  ${KDE4_KDECORE_LIBS} kdeprint_management)
+ 
+-install(TARGETS kdeinit_kaddprinterwizard  DESTINATION ${LIB_INSTALL_DIR} )
++install(TARGETS kdeinit_kaddprinterwizard 
++             RUNTIME DESTINATION ${BIN_INSTALL_DIR}
++             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
++             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
++)
+ 
+ target_link_libraries( kaddprinterwizard kdeinit_kaddprinterwizard )
+ install(TARGETS kaddprinterwizard DESTINATION ${LIBEXEC_INSTALL_DIR} )
+--- a/kdeprint/rlpr/rlpr.print
++++ b/kdeprint/rlpr/rlpr.print
+@@ -49,7 +49,7 @@
+ Comment[ru]=Среда RLPR (сетевые принт-серверы LPD)
+ Comment[se]=RLPR-biras (LPD-gáiddusbálvvát)
+ Comment[sl]=Okolje RLPR (oddaljeni strežniki LPD)
+-Comment[sr]=RLPR окружење (удаљени LPD сервери)
++Comment[sr]=РЛПР окружење (удаљени ЛПД сервери)
+ Comment[sr at latin]=RLPR okruženje (udaljeni LPD serveri)
+ Comment[sv]=RLPR-miljö (LPD-fjärrservrar)
+ Comment[ta]=RLPR சூழல் (சேய்மை LPD சேவகன்கள்)
+--- a/kdeprint/lpdunix/lpdunix.print
++++ b/kdeprint/lpdunix/lpdunix.print
+@@ -13,7 +13,7 @@
+ Comment[el]=Γενικό σύστημα εκτύπωσης UNIX LPD (προκαθορισμένο)
+ Comment[eo]=Ĝenerala Uniksa LPD-pressistemo (apriora)
+ Comment[es]=Sistema de impresión genérico LPD de Unix (predeterminado)
+-Comment[et]=Tavaline UNIX-i LPD trükkimise süsteem (vaikimisi)
++Comment[et]=Tavaline UNIX-i LPD trükkimissüsteem (vaikimisi)
+ Comment[eu]=UNIX LPD inprimatze-sistema generikoa (lehenetsia)
+ Comment[fa]=سیستم چاپUNIX LPD عمومی )پیش‌فرض(
+ Comment[fi]=Yleinen UNIX LPD-tulostusjärjestelmä (oletus)
+@@ -49,8 +49,8 @@
+ Comment[ru]=Система печати UNIX LPD (по умолчанию)
+ Comment[se]=Oppalaš UNIX LPD čálihanvuogádat (standárda)
+ Comment[sl]=Splošni tiskalniški sistem LDP za Unix (privzeto)
+-Comment[sr]=Генерички UNIX LPD систем за штампање (предефинисано)
+-Comment[sr at latin]=Generički UNIX LPD sistem za štampanje (predefinisano)
++Comment[sr]=Генерички ЛПД штампарски систем за Униксе (подразумеван)
++Comment[sr at latin]=Generički LPD štamparski sistem za Unixe (podrazumevan)
+ Comment[sv]=Generellt Unix LPD-skrivarsystem (standard)
+ Comment[ta]=பொது யுனிக்ஸ் LPD அச்சுத் தொகுதி (முன் இருந்த)
+ Comment[te]=సాధారణ యునిక్స్ ఎల్ పి డి ప్రచురణ వ్యవస్థ (అప్రమేయం)
+--- a/kdeprint/ext/ext.print
++++ b/kdeprint/ext/ext.print
+@@ -49,8 +49,8 @@
+ Comment[ru]=Печать посредством внешней программы (общая)
+ Comment[se]=Čálit olggoldas prográmma bokte (oppalaš)
+ Comment[sl]=Tiskanje skozi zunanji program (splošno)
+-Comment[sr]=Штампање преко спољњег програма (генерички)
+-Comment[sr at latin]=Štampanje preko spoljnjeg programa (generički)
++Comment[sr]=Штампање преко спољашњег програма (генерички)
++Comment[sr at latin]=Štampanje preko spoljašnjeg programa (generički)
+ Comment[sv]=Skriv ut genom ett externt program (generellt)
+ Comment[ta]=ஒரு புற நிரலை முழுவதும் அச்சிடவும் (பொது)
+ Comment[te]=బయటి కార్యము (సాధరణ) ద్వారా ప్రచురించు
+--- a/kdeprint/specials.desktop
++++ b/kdeprint/specials.desktop
+@@ -52,8 +52,8 @@
+ Name[ru]=Печать в файл (PostScript)
+ Name[se]=Čálit fiilii (PostScript)
+ Name[sl]=Tiskanje v datoteko (postscript)
+-Name[sr]=Штампање у фајл (PostScript)
+-Name[sr at latin]=Štampanje u fajl (PostScript)
++Name[sr]=Штампај у фајл (постскрипт)
++Name[sr at latin]=Štampaj u fajl (PostScript)
+ Name[sv]=Skriv ut till fil (Postscript)
+ Name[ta]=கோப்புக்கு அச்சிடு (PostScript)
+ Name[te]=దస్త్రం లొ ప్రచురించు (పొస్ట్ స్క్రిప్ట్)
+@@ -83,7 +83,7 @@
+ Description[el]=Εγγραφή αρχείου PostScript
+ Description[eo]=Skribas Postskripto-dosieron
+ Description[es]=Escribir fichero PostScript
+-Description[et]=PS-faili kirjutamine
++Description[et]=PostScript-faili kirjutamine
+ Description[eu]=Idatzi PostScript fitxategia
+ Description[fa]=نوشتن پروندۀ پست‌اسکریپت
+ Description[fi]=Kirjoita PostScript-tiedosto
+@@ -119,8 +119,8 @@
+ Description[ru]=Запись файла PostScript
+ Description[se]=Čále PostScript fiilla
+ Description[sl]=Izdela postscriptno datoteko
+-Description[sr]=Записује PostScript фајл
+-Description[sr at latin]=Zapisuje PostScript fajl
++Description[sr]=Запиши постскрипт фајл
++Description[sr at latin]=Zapiši PostScript fajl
+ Description[sv]=Skriv Postscript-fil
+ Description[ta]=போஸ்ட்ஸ்கிரிப்ட் கோப்பு எழுது
+ Description[te]=పొస్ట్ స్క్రిప్ట్ దస్త్రం ను వ్రాయుట
+@@ -260,8 +260,8 @@
+ Name[ru]=Печать в файл (PDF)
+ Name[se]=Čálit fiilii (PDF)
+ Name[sl]=Tiskanje v datoteko (PDF)
+-Name[sr]=Штампање у фајл (PDF)
+-Name[sr at latin]=Štampanje u fajl (PDF)
++Name[sr]=Штампај у фајл (ПДФ)
++Name[sr at latin]=Štampaj u fajl (PDF)
+ Name[sv]=Skriv ut till fil (PDF)
+ Name[ta]=கோப்புக்கு அச்சிடு (PDF)
+ Name[te]=దస్త్రం లొ ప్రచురించు (పిడిఎఫ్)
+@@ -327,8 +327,8 @@
+ Description[ru]=Запись файла PDF/Acrobat
+ Description[se]=Čále PDF/Acrobat fiilla
+ Description[sl]=Izdela datoteko v PDF/Acrobat
+-Description[sr]=Записује PDF/Acrobat фајл
+-Description[sr at latin]=Zapisuje PDF/Acrobat fajl
++Description[sr]=Запиши ПДФ фајл
++Description[sr at latin]=Zapiši PDF fajl
+ Description[sv]=Skriv PDF/Acrobat-fil
+ Description[ta]=PDF/Acrobat கோப்பு எழுது
+ Description[te]=పిడిఎఫ్/ఏక్రొబేట్ దస్త్రం ను వ్రాయుట
+@@ -453,7 +453,7 @@
+ Name[ko]=팩스로 보내기
+ Name[lb]=Un e Fax schécken
+ Name[lt]=Siųsti į faksą
+-Name[lv]=Sūtīt uz Faksu
++Name[lv]=Sūtīt uz faksu
+ Name[mk]=Прати на факс
+ Name[ms]=Kirim ke Faks
+ Name[nb]=Send til faks
+@@ -469,8 +469,8 @@
+ Name[ru]=Отправить по факсу
+ Name[se]=Sádde fáksii
+ Name[sl]=Pošlji faks
+-Name[sr]=Слање факсом
+-Name[sr at latin]=Slanje faksom
++Name[sr]=Пошаљи факсом
++Name[sr at latin]=Pošalji faksom
+ Name[sv]=Skicka till fax
+ Name[ta]=தொலைநகலிக்கு அனுப்பு
+ Name[te]=ఫేక్సుకు పంపుట
+@@ -535,8 +535,8 @@
+ Description[ru]=Отправка на внешний факс
+ Description[se]=Sádde olggoldas fáksavuogádahkii
+ Description[sl]=Pošlje faks v zunanji faksirni sistem
+-Description[sr]=Пошаљи на спољни факс систем
+-Description[sr at latin]=Pošalji na spoljni faks sistem
++Description[sr]=Пошаљи спољашњем факс-систему
++Description[sr at latin]=Pošalji spoljašnjem faks-sistemu
+ Description[sv]=Skicka till externt faxsystem
+ Description[ta]=வெளித் தொலைநகலிக்கு அனுப்பு
+ Description[te]=బయటి ఫేక్సు వవస్థకు పంపుట
+@@ -602,8 +602,8 @@
+ Comment[ru]=Внешний
+ Comment[se]=Olggoldas
+ Comment[sl]=Zunanji
+-Comment[sr]=Спољни
+-Comment[sr at latin]=Spoljni
++Comment[sr]=Спољашњи
++Comment[sr at latin]=Spoljašnji
+ Comment[sv]=Extern
+ Comment[ta]=வெளி
+ Comment[te]=బయటి
+@@ -677,8 +677,8 @@
+ Comment[ru]=Вложение для KMail
+ Comment[se]=KMail Composer mielddus
+ Comment[sl]=Pripeta datoteka za sestavljalnik Kmail
+-Comment[sr]=Прилог за KMail-ов састављач
+-Comment[sr at latin]=Prilog za KMail-ov sastavljač
++Comment[sr]=Прилог за К-поштин састављач
++Comment[sr at latin]=Prilog za K-poštin sastavljač
+ Comment[sv]=Bilaga till Kmails e-posteditor
+ Comment[ta]=KMail உருவாக்கிக்கான இணைப்பு
+ Comment[te]=కెతపాలా కంపొజర్ కు అనుబంధం
+@@ -727,7 +727,7 @@
+ Description[ko]=PDF/Acrobat 파일을 만들어서 KMail의 첨부물로 보냅니다
+ Description[lb]=Erstellt eng PDF/Acrobat-Datei als Unhang fir de KMail
+ Description[lt]=Rašyti PDF/Acrobat bylą kaip priesagą KMail programai
+-Description[lv]=Izveido PDF/Akrobāta failu kā pielikumu KPastam
++Description[lv]=Izveido PDF/Akrobāta failu kā pielikumu KMail
+ Description[mk]=Создава PDF/Acrobat датотека како додаток за KMail
+ Description[ms]=Cipta fail PDF/Acrobat sebagai kepilan untuk KMail
+ Description[nb]=Lager PDF/Acrobat-fil som vedlegg til KMail
+@@ -743,8 +743,8 @@
+ Description[ru]=Запись файла PDF/Acrobat как вложения для KMail
+ Description[se]=Ráhkada PDF/Acrobat-fiilla KMail'ii mielddusin
+ Description[sl]=Izdela datoteko v PDF/Acrobat kot prilogo za Kmail
+-Description[sr]=Прави PDF/Acrobat фајл као прилог за KMail
+-Description[sr at latin]=Pravi PDF/Acrobat fajl kao prilog za KMail
++Description[sr]=Прави ПДФ фајл као прилог за К-пошту
++Description[sr at latin]=Pravi PDF fajl kao prilog za K-poštu
+ Description[sv]=Skapar PDF/Acrobat-fil som en bilaga till Kmail
+ Description[ta]=கேஅஞ்சல் இணைப்பாக, PDF/Acrobat கோப்பினை உருவாக்கும்
+ Description[te]=పిడిఎఫ్ దస్త్రంను కెతపాలా కు అనుబంధంగా స్రుష్టిస్తుంది
+@@ -813,8 +813,8 @@
+ Name[ru]=Отправить файл PDF
+ Name[se]=Sádde PDF-fiilla
+ Name[sl]=Pošlji datoteko PDF po pošti
+-Name[sr]=Слање PDF фајла поштом
+-Name[sr at latin]=Slanje PDF fajla poštom
++Name[sr]=Пошаљи ПДФ фајл поштом
++Name[sr at latin]=Pošalji PDF fajl poštom
+ Name[sv]=Skicka PDF-fil
+ Name[ta]=PDF கோப்பை அஞ்சல் அனுப்பு
+ Name[te]=పిFఇఎఫ్ దస్త్ర తపాలా
+@@ -838,6 +838,7 @@
+ Comment[eo]=SendFaksilo
+ Comment[is]=KsendFax
+ Comment[kn]=ಕೆ ಸೆಂಡ್ ಫ್ಯಾಕ್ಸ್
++Comment[sr]=К-сендфакс
+ Comment[sv]=Ksendfax
+ Comment[ta]=கேஃபாக்ஸனுப்பு
+ Comment[te]=కెసెండ్ ఫేక్స్
+@@ -858,7 +859,7 @@
+ Description[el]=Χρήση του ksendfax για την αποστολή με φαξ του τρέχοντος εγγράφου
+ Description[eo]=Uzu ksendfax por faksi la nunan dokumenton
+ Description[es]=Usar ksendfax para enviar el documento actual por fax
+-Description[et]=Ksendfax'i kasutamine aktiivse dokumendi faksimiseks
++Description[et]=Ksendfaxi kasutamine aktiivse dokumendi faksimiseks
+ Description[eu]=Erabili ksendfax uneko dokumentua faxez bidaltzeko
+ Description[fa]=از KSendFax برای دورنگاری سند جاری استفاده کنید
+ Description[fi]=Käytä kdendfax-ohjelmaa faksataksesi asiakirja
+@@ -894,8 +895,8 @@
+ Description[ru]=Использование ksendfax для отправки документа по факсу
+ Description[se]=Geavat ksendfax dálá dokumentta fáksemii
+ Description[sl]=Uporabite kdsendfax za faksiranje trenutnega dokumenta
+-Description[sr]=Користите ksendfax да пошаљте текући документ на факс
+-Description[sr at latin]=Koristite ksendfax da pošaljte tekući dokument na faks
++Description[sr]=Употребите К-сендфакс за слање текућег документа факсом
++Description[sr at latin]=Upotrebite KSendFax za slanje tekućeg dokumenta faksom
+ Description[sv]=Använd Ksendfax för att faxa aktuellt dokument
+ Description[ta]=கேஃபாக்ஸ்அனுப்பு மூலம் நடப்பு ஆவணத்தை தொலைநகலிடு
+ Description[te]=ప్రస్తుత పత్రాన్ని కెసెండ్ ఫేక్స్ ద్వారా ఫేక్స్ పంపించుటకు వాడండి
+@@ -964,8 +965,8 @@
+ Name[ru]=Утилита отправки факсов (ksendfax)
+ Name[se]=Nana buorre fáksareaidu (ksendfax)
+ Name[sl]=Napredno orodje za faksiranje (ksendfax)
+-Name[sr]=Напредни алат за слање факсова (ksendfax)
+-Name[sr at latin]=Napredni alat za slanje faksova (ksendfax)
++Name[sr]=Напредни алат за слање факсова (К-сендфакс)
++Name[sr at latin]=Napredni alat za slanje faksova (KSendFax)
+ Name[sv]=Avancerat faxverktyg (Ksendfax)
+ Name[ta]=மேம்பட்ட தொலைநகலிக் கருவி (ksendfax)
+ Name[te]=ఆధునిక ఫేక్స్ పనిముట్టు (కెసెండ్ ఫేక్స్) 
+--- a/kio/kfileplugin.desktop
++++ b/kio/kfileplugin.desktop
+@@ -33,7 +33,7 @@
+ Name[ko]=KFile 메타 데이터 플러그인
+ Name[lb]=KFile-Metadonnéeë-Plugin
+ Name[lt]=KFile Meta duomenų priedas
+-Name[lv]=KFailu meta datu iespraudnis
++Name[lv]=KFile meta datu spraudnis
+ Name[mk]=KFile приклучок за мета податоци
+ Name[ms]=Plug masuk Data Meta KFile
+ Name[nb]=KFile programtillegg for metadata
+@@ -48,8 +48,8 @@
+ Name[ru]=Модуль метаданных KFile
+ Name[se]=KFile lassemoduvla metadieđuid várás
+ Name[sl]=Vstavek za meta podatke pri KFile
+-Name[sr]=KFile прикључак за мета податке
+-Name[sr at latin]=KFile priključak za meta podatke
++Name[sr]=Прикључак за метаподатке (к-фајл)
++Name[sr at latin]=Priključak za metapodatke (KFile)
+ Name[sv]=Kfil-metadatainsticksprogram
+ Name[ta]=கேகோப்பு மெட்டா தகவல் சொருகுப்பொருள்
+ Name[te]=కెదస్త్రం మెటా దత్తాంసం ప్లగిన్
+--- a/kio/kio/kdesktopfileactions.cpp
++++ b/kio/kio/kdesktopfileactions.cpp
+@@ -31,6 +31,8 @@
+ #include <klocale.h>
+ #include "kservice.h"
+ 
++enum BuiltinServiceType { ST_MOUNT = 0x0E1B05B0, ST_UNMOUNT = 0x0E1B05B1 }; // random numbers
++
+ static bool runFSDevice( const KUrl& _url, const KDesktopFile &cfg );
+ static bool runApplication( const KUrl& _url, const QString & _serviceFile );
+ static bool runLink( const KUrl& _url, const KDesktopFile &cfg );
+@@ -136,9 +138,9 @@
+     return false;
+ }
+ 
+-QList<KDesktopFileActions::Service> KDesktopFileActions::builtinServices( const KUrl& _url )
++QList<KServiceAction> KDesktopFileActions::builtinServices( const KUrl& _url )
+ {
+-    QList<Service> result;
++    QList<KServiceAction> result;
+ 
+     if ( !_url.isLocalFile() )
+         return result;
+@@ -150,30 +152,30 @@
+         return result;
+ 
+     if ( cfg.hasDeviceType() ) {
+-        QString dev = cfg.readDevice();
++        const QString dev = cfg.readDevice();
+         if ( dev.isEmpty() ) {
+             QString tmp = i18n("The desktop entry file\n%1\nis of type FSDevice but has no Dev=... entry.",  _url.path() );
+-            KMessageBoxWrapper::error( 0, tmp);
++            KMessageBoxWrapper::error(0, tmp);
+         } else {
+             KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByDevice( dev );
+             // not mounted ?
+             if ( !mp ) {
+-                Service mount;
+-                mount.m_strName = i18n("Mount");
+-                mount.m_type = ST_MOUNT;
+-                result.append( mount );
++                KServiceAction mount("mount", i18n("Mount"), QString(), QString(), false);
++                mount.setData(QVariant(ST_MOUNT));
++                result.append(mount);
+             } else {
+-                Service unmount;
++                QString text;
+ #ifdef HAVE_VOLMGT
+                 /*
+                  *  Solaris' volume management can only umount+eject
+                  */
+-                unmount.m_strName = i18n("Eject");
++                text = i18n("Eject");
+ #else
+-                unmount.m_strName = i18n("Unmount");
++                text = i18n("Unmount");
+ #endif
+-                unmount.m_type = ST_UNMOUNT;
+-                result.append( unmount );
++                KServiceAction unmount("unmount", text, QString(), QString(), false);
++                unmount.setData(QVariant(ST_UNMOUNT));
++                result.append(unmount);
+             }
+         }
+     }
+@@ -181,120 +183,74 @@
+     return result;
+ }
+ 
+-QList<KDesktopFileActions::Service> KDesktopFileActions::userDefinedServices( const QString& path, bool bLocalFiles )
++QList<KServiceAction> KDesktopFileActions::userDefinedServices( const QString& path, bool bLocalFiles )
+ {
+-  KDesktopFile cfg( path );
+-  return userDefinedServices( path, cfg, bLocalFiles );
++    KDesktopFile cfg( path );
++    return userDefinedServices( path, cfg, bLocalFiles );
+ }
+ 
+-QList<KDesktopFileActions::Service> KDesktopFileActions::userDefinedServices( const QString& path, const KDesktopFile& cfg, bool bLocalFiles, const KUrl::List & file_list )
++QList<KServiceAction> KDesktopFileActions::userDefinedServices( const QString& path, const KDesktopFile& cfg, bool bLocalFiles, const KUrl::List & file_list )
+ {
+-    QList<Service> result;
+-
+-    KConfigGroup cg = cfg.desktopGroup();
++    Q_UNUSED(path); // this was just for debugging; we use service.entryPath() now.
++    KService service(&cfg);
++    return userDefinedServices(service, bLocalFiles, file_list);
++}
+ 
+-    if ( !cg.hasKey( "Actions" ) && !cg.hasKey( "X-KDE-GetActionMenu") )
+-        return result;
++QList<KServiceAction> KDesktopFileActions::userDefinedServices( const KService& service, bool bLocalFiles, const KUrl::List & file_list )
++{
++    QList<KServiceAction> result;
+ 
+-    if ( cg.hasKey( "TryExec" ) && !cfg.tryExec() )
++    if (!service.isValid()) // e.g. TryExec failed
+         return result;
+ 
+     QStringList keys;
+-
+-    if( cg.hasKey( "X-KDE-GetActionMenu" )) {
+-        QStringList dbuscall = cg.readEntry( "X-KDE-GetActionMenu" ).split( QLatin1Char( ' ' ) );
+-
+-        if ( dbuscall.count() >= 4 ) {
+-
+-        const QString& app       = dbuscall.at( 0 );
+-        const QString& object    = dbuscall.at( 1 );
+-        const QString& interface = dbuscall.at( 2 );
+-        const QString& function  = dbuscall.at( 3 );
+-
+-        QDBusInterface remote( app, object, interface );
+-        QDBusReply<QStringList> reply = remote.call( QDBus::BlockWithGui,
+-                                                     function, file_list.toStringList() );
+-        keys = reply;               // ensures that the reply was a QStringList
++    const QString actionMenu = service.property("X-KDE-GetActionMenu", QVariant::String).toString();
++    if (!actionMenu.isEmpty()) {
++        const QStringList dbuscall = actionMenu.split(QChar(' '));
++        if (dbuscall.count() >= 4) {
++            const QString& app       = dbuscall.at( 0 );
++            const QString& object    = dbuscall.at( 1 );
++            const QString& interface = dbuscall.at( 2 );
++            const QString& function  = dbuscall.at( 3 );
++
++            QDBusInterface remote( app, object, interface );
++            QDBusReply<QStringList> reply = remote.call( QDBus::BlockWithGui,
++                                                         function, file_list.toStringList() );
++            keys = reply;               // ensures that the reply was a QStringList
++            if (keys.isEmpty())
++                return result;
+         } else {
+-            qWarning() << i18n("The desktop menu %1 has an invalid X-KDE-GetActionMenu entry.",path);
++            kWarning(7012) << "The desktop file" << service.entryPath()
++                           << "has an invalid X-KDE-GetActionMenu entry.";
+         }
+-
+     }
+ 
+-    keys += cfg.readActions();
+-
+-    if ( keys.count() == 0 )
+-        return result;
+-
+-    QStringList::ConstIterator it = keys.begin();
+-    QStringList::ConstIterator end = keys.end();
+-    for ( ; it != end; ++it )
+-    {
+-        //kDebug(7000) << "CURRENT KEY = " << (*it);
+-
+-        QString group = *it;
+-
+-        if (group == "_SEPARATOR_")
+-        {
+-            Service s;
+-            result.append(s);
+-            continue;
+-        }
+-
+-        bool bInvalidMenu = false;
++    // Now, either keys is empty (all actions) or it's set to the actions we want
+ 
+-        if ( cfg.hasActionGroup( group ) )
+-        {
+-            cg = cfg.actionGroup( group );
+-
+-            if ( !cg.hasKey( "Name" ) || !cg.hasKey( "Exec" ) )
+-                bInvalidMenu = true;
+-            else
+-            {
+-                QString exec = cg.readPathEntry( "Exec" );
+-                if ( bLocalFiles || exec.contains("%U") || exec.contains("%u") )
+-                {
+-                    Service s;
+-                    s.m_strName = cg.readEntry( "Name" );
+-                    s.m_strIcon = cg.readEntry( "Icon" );
+-                    s.m_strExec = exec;
+-                    s.m_type = ST_USER_DEFINED;
+-                    s.m_display = !cg.readEntry( "NoDisplay" , false );
+-                    result.append( s );
+-                }
++    foreach(const KServiceAction& action, service.actions()) {
++        if (keys.isEmpty() || keys.contains(action.name())) {
++            const QString exec = action.exec();
++            if (bLocalFiles || exec.contains("%U") || exec.contains("%u")) {
++                result.append( action );
+             }
+         }
+-        else
+-            bInvalidMenu = true;
+-
+-        if ( bInvalidMenu )
+-        {
+-            QString tmp = i18n("The desktop entry file\n%1\n has an invalid menu entry\n%2.",  path ,  *it );
+-            KMessageBoxWrapper::error( 0, tmp );
+-        }
+     }
+ 
+     return result;
+ }
+ 
+-void KDesktopFileActions::executeService( const KUrl::List& urls, const KDesktopFileActions::Service& _service )
++void KDesktopFileActions::executeService( const KUrl::List& urls, const KServiceAction& action )
+ {
+-    //kDebug(7000) << "EXECUTING Service " << _service.m_strName;
++    //kDebug(7000) << "EXECUTING Service " << action.name();
+ 
+-    if ( _service.m_type == ST_USER_DEFINED ) {
+-        kDebug() << "KDesktopFileActions::executeService " << _service.m_strName
+-                 << " first url's path=" << urls.first().path() << " exec=" << _service.m_strExec << endl;
+-        KRun::run( _service.m_strExec, urls, 0, _service.m_strName, _service.m_strIcon );
+-        // The action may update the desktop file. Example: eject unmounts (#5129).
+-        org::kde::KDirNotify::emitFilesChanged( urls.toStringList() );
+-        return;
+-    } else if ( _service.m_type == ST_MOUNT || _service.m_type == ST_UNMOUNT ) {
++    int actionData = action.data().toInt();
++    if ( actionData == ST_MOUNT || actionData == ST_UNMOUNT ) {
+         Q_ASSERT( urls.count() == 1 );
+-        QString path = urls.first().path();
++        const QString path = urls.first().path();
+         //kDebug(7000) << "MOUNT&UNMOUNT";
+ 
+         KDesktopFile cfg( path );
+-        QString dev = cfg.readDevice();
++        const QString dev = cfg.readDevice();
+         if ( dev.isEmpty() ) {
+             QString tmp = i18n("The desktop entry file\n%1\nis of type FSDevice but has no Dev=... entry.",  path );
+             KMessageBoxWrapper::error( 0, tmp );
+@@ -302,7 +258,7 @@
+         }
+         KMountPoint::Ptr mp = KMountPoint::currentMountPoints().findByDevice( dev );
+ 
+-        if ( _service.m_type == ST_MOUNT ) {
++        if ( actionData == ST_MOUNT ) {
+             // Already mounted? Strange, but who knows ...
+             if ( mp ) {
+                 kDebug(7000) << "ALREADY Mounted";
+@@ -318,7 +274,7 @@
+ #ifndef Q_WS_WIN
+             (void)new KAutoMount( ro, fstype.toLatin1(), dev, point, path, false );
+ #endif
+-        } else if ( _service.m_type == ST_UNMOUNT ) {
++        } else if ( actionData == ST_UNMOUNT ) {
+             // Not mounted? Strange, but who knows ...
+             if ( !mp )
+                 return;
+@@ -327,7 +283,12 @@
+             (void)new KAutoUnmount( mp->mountPoint(), path );
+ #endif
+         }
++    } else {
++        kDebug() << "KDesktopFileActions::executeService " << action.name()
++                 << " first url's path=" << urls.first().path() << " exec=" << action.exec() << endl;
++        KRun::run( action.exec(), urls, 0, action.text(), action.icon() );
++        // The action may update the desktop file. Example: eject unmounts (#5129).
++        org::kde::KDirNotify::emitFilesChanged( urls.toStringList() );
+     }
+-    else
+-        Q_ASSERT( 0 );
+ }
++
+--- a/kio/kio/kdesktopfileactions.h
++++ b/kio/kio/kdesktopfileactions.h
+@@ -20,64 +20,65 @@
+ #ifndef KDESKTOPFILEACTIONS_H
+ #define KDESKTOPFILEACTIONS_H
+ 
++#include <kserviceaction.h>
+ #include <kio/kio_export.h>
+ #include <kurl.h>
+ class KDesktopFile;
++class KService;
+ 
+ /**
+  * KDesktopFileActions provides a number of methods related to actions in desktop files.
+  */
+ namespace KDesktopFileActions
+ {
+-    enum ServiceType { ST_MOUNT, ST_UNMOUNT, /* ST_PROPERTIES, */ ST_USER_DEFINED };
+-
+-    /**
+-     * Structure representing a service, in the list of services
+-     * returned by builtinServices and userDefinedServices
+-     */
+-    struct KIO_EXPORT Service
+-    {
+-        Service() { m_display = true; }
+-        bool isEmpty() const { return m_strName.isEmpty(); }
+-        QString m_strName;
+-        QString m_strIcon;
+-        QString m_strExec;
+-        ServiceType m_type;
+-        bool m_display;
+-    };
+-
+     /**
+      * Returns a list of services for the given .desktop file that are handled
+      * by kio itself. Namely mount/unmount for FSDevice files.
+      * @return the list of services
+      */
+-    KIO_EXPORT QList<Service> builtinServices( const KUrl& url );
++    KIO_EXPORT QList<KServiceAction> builtinServices( const KUrl& url );
+ 
+     /**
+      * Returns a list of services defined by the user as possible actions
+-     * on the given .desktop file. May include empty actions which represent where
+-     * visual separators should appear in user-visible representations of those actions,
++     * on the given .desktop file. May include separators (see KServiceAction::isSeparator)
++     * which should appear in user-visible representations of those actions,
+      * such as separators in a menu.
+      * @param path the path to the desktop file describing the services
+      * @param bLocalFiles true if those services are to be applied to local files only
+      * (if false, services that don't have %u or %U in the Exec line won't be taken into account).
+-     * @return the list of user deviced actions
++     * @return the list of user defined actions
+      */
+-    KIO_EXPORT QList<Service> userDefinedServices( const QString& path, bool bLocalFiles );
++    KIO_EXPORT QList<KServiceAction> userDefinedServices( const QString& path, bool bLocalFiles );
+ 
+     /**
+      * Overload of userDefinedServices but also allows you to pass a list of urls for this file.
+      * This allows for the menu to be changed depending on the exact files via
+      * the X-KDE-GetActionMenu extension.
+      */
+-    KIO_EXPORT QList<Service> userDefinedServices( const QString& path, const KDesktopFile& desktopFile, bool bLocalFiles, const KUrl::List & file_list = KUrl::List());
++    KIO_EXPORT QList<KServiceAction> userDefinedServices( const QString& path, const KDesktopFile& desktopFile, bool bLocalFiles, const KUrl::List & file_list = KUrl::List());
+ 
+     /**
++     * Returns a list of services defined by the user as possible actions
++     * on the given .desktop file represented by the KService instance.
++     * May include separators (see KServiceAction::isSeparator) which should
++     * appear in user-visible representations of those actions,
++     * such as separators in a menu.
++     * @param path the path to the desktop file describing the services
++     * @param bLocalFiles true if those services are to be applied to local files only
++     * (if false, services that don't have %u or %U in the Exec line won't be taken into account).
++     * @param file_list list of urls; this allows for the menu to be changed depending on the exact files via
++     * the X-KDE-GetActionMenu extension.
++     *
++     * @return the list of user defined actions
++     */
++    KIO_EXPORT QList<KServiceAction> userDefinedServices( const KService& service, bool bLocalFiles, const KUrl::List & file_list = KUrl::List() );
++
++   /**
+      * Execute @p service on the list of @p urls.
+      * @param urls the list of urls
+      * @param service the service to execute
+      */
+-    KIO_EXPORT void executeService( const KUrl::List& urls, const Service& service );
++    KIO_EXPORT void executeService( const KUrl::List& urls, const KServiceAction& service );
+ 
+     /**
+      * Invokes the default action for the desktop entry. If the desktop
+--- a/kio/kio/krun.cpp
++++ b/kio/kio/krun.cpp
+@@ -218,7 +218,7 @@
+     if ( l.exec() )
+     {
+       KService::Ptr service = l.service();
+-      if ( !!service )
++      if ( service )
+         return KRun::run( *service, lst, window, tempFiles, suggestedFileName, asn );
+ 
+       kDebug(7010) << "No service set, running " << l.text();
+@@ -308,7 +308,8 @@
+ {
+    switch( option ) {
+    case 'u':
+-      ret << url.pathOrUrl();
++      ret << ((url.isLocalFile() && url.fragment().isNull() && url.encodedQuery().isNull()) ?
++                 url.toLocalFile()  : url.url());
+       break;
+    case 'd':
+       ret << url.directory();
+--- a/kio/kio/kdirwatch.cpp
++++ b/kio/kio/kdirwatch.cpp
+@@ -217,7 +217,7 @@
+ 
+ void KDirWatchPrivate::inotifyEventReceived()
+ {
+-  kDebug(7001) << "KDirWatchPrivate::inotifyEventReceived";
++  //kDebug(7001);
+ #ifdef HAVE_SYS_INOTIFY_H
+   if ( !supports_inotify )
+     return;
+@@ -1168,7 +1168,7 @@
+ 
+   delayRemove = true;
+ 
+-  kDebug(7001) << "Fam event received";
++  //kDebug(7001) << "Fam event received";
+ 
+   while(use_fam && FAMPending(&fc)) {
+     if (FAMNextEvent(&fc, &fe) == -1) {
+@@ -1196,7 +1196,7 @@
+ 
+ void KDirWatchPrivate::checkFAMEvent(FAMEvent* fe)
+ {
+-  kDebug(7001) << "checkFAMEvent";
++  //kDebug(7001);
+ 
+   // Don't be too verbose ;-)
+   if ((fe->code == FAMExists) ||
+--- a/kio/kio/renamedialog.cpp
++++ b/kio/kio/renamedialog.cpp
+@@ -378,7 +378,7 @@
+ 
+ void RenameDialog::cancelPressed()
+ {
+-  done( 0 );
++    done( R_CANCEL );
+ }
+ 
+ // Rename
+@@ -394,7 +394,7 @@
+     return;
+   }
+ 
+-  done( 1 );
++  done( R_RENAME );
+ }
+ 
+ QString RenameDialog::suggestName(const KUrl& baseURL, const QString& oldName)
+@@ -453,32 +453,32 @@
+ 
+ void RenameDialog::skipPressed()
+ {
+-  done( 2 );
++  done( R_SKIP );
+ }
+ 
+ void RenameDialog::autoSkipPressed()
+ {
+-  done( 3 );
++  done( R_AUTO_SKIP );
+ }
+ 
+ void RenameDialog::overwritePressed()
+ {
+-  done( 4 );
++  done( R_OVERWRITE );
+ }
+ 
+ void RenameDialog::overwriteAllPressed()
+ {
+-  done( 5 );
++  done( R_OVERWRITE_ALL );
+ }
+ 
+ void RenameDialog::resumePressed()
+ {
+-  done( 6 );
++  done( R_RESUME );
+ }
+ 
+ void RenameDialog::resumeAllPressed()
+ {
+-  done( 7 );
++  done( R_RESUME_ALL );
+ }
+ 
+ static QString mime( const KUrl& src )
+--- a/kio/kio/http_slave_defaults.h
++++ b/kio/kio/http_slave_defaults.h
+@@ -28,7 +28,7 @@
+ #define DEFAULT_CACHE_EXPIRE            3*60            // 3 MINS
+ #define DEFAULT_CLEAN_CACHE_INTERVAL    30*60           // 30 MINS
+ #define DEFAULT_CACHE_CONTROL           KIO::CC_Refresh // Verify with remote
+-#define CACHE_REVISION                  "8\n"           // Cache version
++#define CACHE_REVISION                  "9\n"           // Cache version
+ 
+ // DEFAULT USER AGENT KEY - ENABLES OS NAME
+ #define DEFAULT_USER_AGENT_KEYS         "o"             // Show OS
+--- a/kio/kio/skipdialog.cpp
++++ b/kio/kio/skipdialog.cpp
+@@ -45,13 +45,13 @@
+     setButtons( Cancel | User1 | User2 );
+ 
+     setButtonText( User1, i18n( "Skip" ) );
+-    connect( this, SIGNAL( user1Clicked() ), SLOT( b1Pressed() ) );
++    connect( this, SIGNAL( user1Clicked() ), SLOT(skipPressed()) );
+ 
+     setButtonText( User2, i18n( "AutoSkip" ) );
+-    connect( this, SIGNAL( user2Clicked() ), SLOT( b2Pressed() ) );
++    connect( this, SIGNAL( user2Clicked() ), SLOT(autoSkipPressed()) );
+   }
+ 
+-  connect( this, SIGNAL( cancelClicked() ), SLOT( b0Pressed() ) );
++  connect( this, SIGNAL( cancelClicked() ), SLOT(cancelPressed()) );
+ 
+   setMainWidget( new QLabel( _error_text, this ) );
+ 
+@@ -62,19 +62,19 @@
+ {
+ }
+ 
+-void SkipDialog::b0Pressed()
++void SkipDialog::cancelPressed()
+ {
+-  done(0);
++  done(S_CANCEL);
+ }
+ 
+-void SkipDialog::b1Pressed()
++void SkipDialog::skipPressed()
+ {
+-  done(0);
++  done(S_SKIP);
+ }
+ 
+-void SkipDialog::b2Pressed()
++void SkipDialog::autoSkipPressed()
+ {
+-  done(0);
++  done(S_AUTO_SKIP);
+ }
+ 
+ #include "skipdialog.moc"
+--- a/kio/kio/kfilewrite.desktop
++++ b/kio/kio/kfilewrite.desktop
+@@ -12,6 +12,7 @@
+ Comment[el]=Πρόσθετο KFileWrite
+ Comment[eo]=KFileWrite kromaĵo
+ Comment[es]=Complemento KFileWrite
++Comment[et]=KFileWrite'i plugin
+ Comment[fa]=وصلۀ KFileWrite
+ Comment[ga]=Breiseán KFileWrite
+ Comment[he]=תוסף KFileWrite
+@@ -22,6 +23,7 @@
+ Comment[km]=កម្មវិធី​ជំនួយ KFileWrite
+ Comment[kn]=ಕೆಫೈಲ್ರೈಟ್ ಮಿಳಿತಾನ್ವಯ (ಪ್ಲಗಿನ್)
+ Comment[ko]=KFileWrite 플러그인
++Comment[lv]=KFileWrite spraudnis
+ Comment[nds]=KFile-Schriefmoduul
+ Comment[ne]=केडीई फाइल राइट प्लगइन
+ Comment[nl]=KFileWrite-plugin
+@@ -29,9 +31,12 @@
+ Comment[pt]='Plugin' do KFileWrite
+ Comment[pt_BR]=Plugin do KFileWrite
+ Comment[sl]=Vstavek KFileWrite
++Comment[sr]=Прикључак за запис фајлова (к-фајл)
++Comment[sr at latin]=Priključak za zapis fajlova (KFile)
+ Comment[sv]=KFileWrite-insticksprogram
+ Comment[te]=కెఫైల్ వ్రైట్ ప్లగిన్
+ Comment[th]=ปลั๊กอินสำหรับเขียนของ KFile
++Comment[uk]=Втулок KFileWrite
+ Comment[vi]=Bổ sung KFileWrite
+ Comment[wa]=Tchôke-divins sicrijhaedje di fitchîs
+ Comment[x-test]=xxKFileWrite pluginxx
+--- a/kio/kio/skipdialog.h
++++ b/kio/kio/skipdialog.h
+@@ -39,12 +39,10 @@
+   SkipDialog( QWidget *parent, bool _multi, const QString& _error_text );
+   ~SkipDialog();
+ 
+-protected:
+-
+-public Q_SLOTS:
+-  void b0Pressed();
+-  void b1Pressed();
+-  void b2Pressed();
++private Q_SLOTS:
++  void cancelPressed();
++  void skipPressed();
++  void autoSkipPressed();
+ 
+ Q_SIGNALS:
+   void result( SkipDialog *_this, int _button );
+--- a/kio/bookmarks/konqbookmarkmenu.cc
++++ b/kio/bookmarks/konqbookmarkmenu.cc
+@@ -66,7 +66,7 @@
+   }
+   else
+   {
+-    if(owner()) 
++    if(owner())
+     {
+       addAction( SmallIcon("window-new"), i18n( "Open in New Window" ), this, SLOT( openInNewWindow() ) );
+       addAction( SmallIcon("tab-new"), i18n( "Open in New Tab" ), this, SLOT( openInNewTab() ) );
+@@ -182,58 +182,59 @@
+ 
+ KonqBookmarkMenu::DynMenuInfo KonqBookmarkMenu::showDynamicBookmarks( const QString &id )
+ {
+-  KConfig bookmarkrc("kbookmarkrc", KConfig::CascadeConfig);
+-  KConfigGroup config(&bookmarkrc, "Bookmarks");
++    KConfig bookmarkrc("kbookmarkrc", KConfig::CascadeConfig);
++    KConfigGroup config(&bookmarkrc, "Bookmarks");
+ 
+-  DynMenuInfo info;
+-  info.show = false;
++    DynMenuInfo info;
++    info.show = false;
+ 
+-  if (!config.hasKey("DynamicMenus")) {
+-      if (bookmarkrc.hasGroup("DynamicMenu-" + id)) {
+-          config.changeGroup("DynamicMenu-" + id);
+-          info.show = config.readEntry("Show", false);
+-          info.location = config.readPathEntry("Location");
+-          info.type = config.readEntry("Type");
+-          info.name = config.readEntry("Name");
+-      }
+-  }
+-  return info;
++    if (!config.hasKey("DynamicMenus")) {
++        if (bookmarkrc.hasGroup("DynamicMenu-" + id)) {
++            KConfigGroup dynGroup(&bookmarkrc, "DynamicMenu-" + id);
++            info.show = dynGroup.readEntry("Show", false);
++            info.location = dynGroup.readPathEntry("Location");
++            info.type = dynGroup.readEntry("Type");
++            info.name = dynGroup.readEntry("Name");
++        }
++    }
++    return info;
+ }
++
+ QStringList KonqBookmarkMenu::dynamicBookmarksList()
+ {
+-  KConfigGroup config = KSharedConfig::openConfig("kbookmarkrc", KConfig::CascadeConfig)->group("Bookmarks");
++    KConfigGroup config = KSharedConfig::openConfig("kbookmarkrc", KConfig::CascadeConfig)->group("Bookmarks");
+ 
+-  QStringList mlist;
+-  if (config.hasKey("DynamicMenus"))
+-    mlist = config.readEntry("DynamicMenus", QStringList());
++    QStringList mlist;
++    if (config.hasKey("DynamicMenus"))
++        mlist = config.readEntry("DynamicMenus", QStringList());
+ 
+-  return mlist;
++    return mlist;
+ }
+ 
+ void KonqBookmarkMenu::setDynamicBookmarks(const QString &id, const DynMenuInfo &newMenu)
+ {
+-  KConfigGroup config = KSharedConfig::openConfig("kbookmarkrc", KConfig::CascadeConfig)->group(QString("DynamicMenu-" + id));
+-
+-  // add group unconditionally
+-  config.writeEntry("Show", newMenu.show);
+-  config.writePathEntry("Location", newMenu.location);
+-  config.writeEntry("Type", newMenu.type);
+-  config.writeEntry("Name", newMenu.name);
++    KSharedConfig::Ptr kbookmarkrc = KSharedConfig::openConfig("kbookmarkrc", KConfig::CascadeConfig);
++    KConfigGroup dynConfig = kbookmarkrc->group(QString("DynamicMenu-" + id));
+ 
+-  QStringList elist;
+-
+-  config.changeGroup("Bookmarks");
+-  if (config.hasKey("DynamicMenus")) {
+-    elist = config.readEntry("DynamicMenus", QStringList());
+-  }
++    // add group unconditionally
++    dynConfig.writeEntry("Show", newMenu.show);
++    dynConfig.writePathEntry("Location", newMenu.location);
++    dynConfig.writeEntry("Type", newMenu.type);
++    dynConfig.writeEntry("Name", newMenu.name);
++
++    QStringList elist;
++    KConfigGroup config = kbookmarkrc->group("Bookmarks");
++    if (config.hasKey("DynamicMenus")) {
++        elist = config.readEntry("DynamicMenus", QStringList());
++    }
+ 
+-  // make sure list includes type
+-  if (!elist.contains(id)) {
+-    elist << id;
+-    config.writeEntry("DynamicMenus", elist);
+-  }
++    // make sure list includes type
++    if (!elist.contains(id)) {
++        elist << id;
++        config.writeEntry("DynamicMenus", elist);
++    }
+ 
+-  config.sync();
++    config.sync();
+ }
+ 
+ KonqBookmarkOwner::~KonqBookmarkOwner()
+--- a/kio/kfile/kfilesharedialog.cpp
++++ b/kio/kfile/kfilesharedialog.cpp
+@@ -210,7 +210,7 @@
+     if (d->m_configProc) return;
+ 
+     d->m_configProc = new KfsProcess(this);
+-    (*d->m_configProc) << KStandardDirs::findExe("kdesu") << "kcmshell" << "fileshare";
++    (*d->m_configProc) << KStandardDirs::findExe("kdesu") << "kcmshell4" << "fileshare";
+     if (!d->m_configProc->start())
+     {
+        delete d->m_configProc;
+--- a/kio/kfile/kpropertiesdialogplugin.desktop
++++ b/kio/kfile/kpropertiesdialogplugin.desktop
+@@ -37,7 +37,7 @@
+ Comment[ko]=속성 대화 상자를 위한 플러그인
+ Comment[lb]=Plugin fir den Eegeschaften-Dialog
+ Comment[lt]=Priedas savybių dialogui
+-Comment[lv]=Īpašību dialoga iespraudnis
++Comment[lv]=Īpašību dialoga spraudnis
+ Comment[mk]=Приклучок за дијалогот за својства
+ Comment[ms]=Plugmasuk untuk Dialog Ciri-ciri
+ Comment[nb]=Programtillegg for dialogvinduet for egenskaper
+@@ -53,8 +53,8 @@
+ Comment[ru]=Модуль для диалога настроек
+ Comment[se]=Lassemoduvla iešvuođahtaláseža várás
+ Comment[sl]=Vstavek za pogovorno okno z lastnostmi
+-Comment[sr]=Прикључак за дијалог са својствима
+-Comment[sr at latin]=Priključak za dijalog sa svojstvima
++Comment[sr]=Прикључак за дијалог својстава
++Comment[sr at latin]=Priključak za dijalog svojstava
+ Comment[sv]=Insticksprogram för egenskapsdialogen
+ Comment[ta]=பண்புகள் உரையாடலுக்கான சொருகுப்பொருள்
+ Comment[te]=లక్షణాల సంభాషణ కొరకు ప్లగిన్
+--- a/kio/kfile/kpropertiesdialog.cpp
++++ b/kio/kfile/kpropertiesdialog.cpp
+@@ -1233,11 +1233,12 @@
+     KIO::filesize_t totalSize = d->dirSizeJob->totalSize();
+     KIO::filesize_t totalFiles = d->dirSizeJob->totalFiles();
+     KIO::filesize_t totalSubdirs = d->dirSizeJob->totalSubdirs();
+-    d->m_sizeLabel->setText( i18n("Calculating... %1 (%2)\n%3, %4",
+-			   KIO::convertSize(totalSize),
+-                          KGlobal::locale()->formatNumber(totalSize, 0),
+-         i18np("1 file","%1 files",totalFiles),
+-         i18np("1 sub-folder","%1 sub-folders",totalSubdirs)));
++    d->m_sizeLabel->setText(
++        i18n("Calculating... %1 (%2)\n%3, %4",
++             KIO::convertSize(totalSize),
++             totalSize,
++             i18np("1 file", "%1 files", totalFiles),
++             i18np("1 sub-folder", "%1 sub-folders", totalSubdirs)));
+ }
+ 
+ void KFilePropsPlugin::slotDirSizeFinished( KJob * job )
+--- a/kio/kdatatool.desktop
++++ b/kio/kdatatool.desktop
+@@ -52,8 +52,8 @@
+ Comment[ru]=Утилита обработки информации KDE
+ Comment[se]=KDE dáhtareaidu
+ Comment[sl]=Podatkovno orodje za KDE
+-Comment[sr]=KDE-ов алат за податке
+-Comment[sr at latin]=KDE-ov alat za podatke
++Comment[sr]=КДЕ-ова алатка за податке
++Comment[sr at latin]=KDE-ova alatka za podatke
+ Comment[sv]=KDE-dataverktyg
+ Comment[ta]=கேடிஇ தகவல் கருவி
+ Comment[te]=కెడిఈ దత్తాంశం పనిముట్టు
+--- a/kio/misc/kssld/kssld.desktop
++++ b/kio/misc/kssld/kssld.desktop
+@@ -39,7 +39,7 @@
+ Name[ko]=KSSL 데몬 모듈
+ Name[lb]=KSSL-Dämonmodul
+ Name[lt]=KSSL tarnybos modulis
+-Name[lv]=KSSL Dēmona Modulis
++Name[lv]=KSSL dēmona modulis
+ Name[ms]=Modul Daemon KSSL
+ Name[nb]=KSSL nisse-modul
+ Name[nds]=KSSL-Dämoon
+@@ -54,8 +54,8 @@
+ Name[ru]=Служба KSSL
+ Name[se]=KSSL-bálvámoduvla
+ Name[sl]=Strežniški modul KSSL
+-Name[sr]=KSSL демон модул
+-Name[sr at latin]=KSSL demon modul
++Name[sr]=Модул КССЛ демона
++Name[sr at latin]=Modul KSSL demona
+ Name[sv]=KSSL-demonmodul
+ Name[ta]=KSSL டெமான் பகுதி
+ Name[te]=కెఎస్ ఎస్ ఎల్ సూత్రధారి మాడ్యూల్
+@@ -104,7 +104,7 @@
+ Comment[ko]=KDED용 KSSL 데몬 모듈
+ Comment[lb]=KSSL-Dämonmodul fir KDED
+ Comment[lt]=KSSL tarnybos modulis, skirtas KDED
+-Comment[lv]=KSSL Dēmona Modulis priekš KDED
++Comment[lv]=KSSL dēmona modulis priekš KDED
+ Comment[mk]=KSSL даемон модул за KDED
+ Comment[ms]=Modul Daemon KSSL untuk KDED
+ Comment[nb]=KSSL nissemodul for KDED
+@@ -120,8 +120,8 @@
+ Comment[ru]=Управление сертификатами SSL
+ Comment[se]=KDED:a KSSL-bálvámoduvla
+ Comment[sl]=Strežniški modul KSSL za KDED
+-Comment[sr]=KSSL демон модул за KDED
+-Comment[sr at latin]=KSSL demon modul za KDED
++Comment[sr]=Модул КССЛ демона за КДЕД
++Comment[sr at latin]=Modul KSSL demona za KDED
+ Comment[sv]=KSSL-demonmodul för KDED
+ Comment[ta]=KDEDக்கான KSSL டெமான் பகுதி
+ Comment[te]=కెడిఈడి కొరకు కెఎస్ ఎస్ ఎల్ సూత్రధారి మాడ్యూల్
+--- a/kio/misc/mms.protocol
++++ b/kio/misc/mms.protocol
+@@ -19,7 +19,7 @@
+ Description[de]=Microsoft Media Server Protokoll
+ Description[el]=Πρωτόκολλο Microsoft Media Server
+ Description[es]=Protocolo Microsoft Media Server
+-Description[et]=Microsoft Media Server protokoll
++Description[et]=Microsoft Media Serveri protokoll
+ Description[eu]=Microsoft Media Server protokoloa
+ Description[fa]=قرارداد کارساز رسانۀ میکروسافت
+ Description[fi]=Microsoft Media -palvelinprotokolla
+@@ -53,8 +53,8 @@
+ Description[ru]=Протокол Microsoft Media Server
+ Description[se]=Microsoft Media Server-protokolla
+ Description[sl]=Protokol Microsoft Media Server
+-Description[sr]=Microsoft Media Server протокол
+-Description[sr at latin]=Microsoft Media Server protokol
++Description[sr]=Протокол Мајкрософтовог медија-сервера
++Description[sr at latin]=Protokol Microsoftovog medija-servera
+ Description[sv]=Microsoft mediaserver-protokoll
+ Description[ta]=மைக்ரோசாப்ட் ஊடக சேவக நெறிமுறை
+ Description[te]=మైక్రొసాఫ్ట్ మీడియా సెర్వర్ ప్రొటొకాల్
+--- a/kio/misc/kwalletd/kwalletd.desktop
++++ b/kio/misc/kwalletd/kwalletd.desktop
+@@ -39,7 +39,7 @@
+ Name[ko]=KWallet 데몬 모듈
+ Name[lb]=KWallet-Dämonmodul
+ Name[lt]=KDE slaptažodinių tarnybos modulis
+-Name[lv]=KWallet Dēmona Modulis
++Name[lv]=KWallet dēmona modulis
+ Name[ms]=Modul Daemon KWallet
+ Name[nb]=KWallet nisseprogramtillegg
+ Name[nds]=KWallet-Dämoon
+@@ -54,8 +54,8 @@
+ Name[ru]=Служба бумажника
+ Name[se]=KWallet-bálvámoduvla
+ Name[sl]=Modul KWallet demon
+-Name[sr]=KWallet демон модул
+-Name[sr at latin]=KWallet demon modul
++Name[sr]=Модул К-новчаниковог демона
++Name[sr at latin]=Modul K-novčanikovog demona
+ Name[sv]=Kwallet-demonmodul
+ Name[ta]=KWallet டெமான் பகுதி
+ Name[te]=కెవాలెట్ సూత్రధారి మాడ్యూల్
+@@ -103,7 +103,7 @@
+ Comment[ko]=KDED용 KWallet 데몬 모듈
+ Comment[lb]=KWallet-Dämonmodul fir KDED
+ Comment[lt]=KDE slaptažodinių tarnybos modulis skirtas KDED
+-Comment[lv]=KWallet Dēmona Modulis priekš KDED
++Comment[lv]=KWallet dēmona modulis priekš KDED
+ Comment[mk]=KWallet даемон модул за KDED
+ Comment[ms]=Modul Daemon KWallet untuk KDED
+ Comment[nb]=KWallet nissemodul for KDED
+@@ -119,8 +119,8 @@
+ Comment[ru]=Управление бумажником KDE
+ Comment[se]=KDED:a KWallet-bálvámoduvla
+ Comment[sl]=Modul KWallet demon za KDED
+-Comment[sr]=KWallet демон модул за KDED
+-Comment[sr at latin]=KWallet demon modul za KDED
++Comment[sr]=Модул К-новчаниковог демона за КДЕД
++Comment[sr at latin]=Modul K-novčanikovog demona za KDED
+ Comment[sv]=Kwallet-demonmodul för KDED
+ Comment[ta]=KDEDக்கான KWallet Daemon  தொகுதி
+ Comment[te]=కెడిఈడి కొరకు కెవాలెట్ సూత్రధారి మాడ్యూల్
+--- a/kio/misc/kpac/proxyscout.notifyrc
++++ b/kio/misc/kpac/proxyscout.notifyrc
+@@ -5,20 +5,27 @@
+ Comment[br]=Kefluniadur emgefreekh ar proksi
+ Comment[ca]=Configuració automàtica de l'intermediari
+ Comment[cs]=Automatické nastavení proxy
++Comment[de]=Sucht nach einem Proxy-Server und richtet ihn ein
+ Comment[el]=Αυτόματη ρύθμιση διαμεσολαβητή
++Comment[et]=Automaatne puhverserveri seadistamine
+ Comment[ga]=Uathchumraíocht an tSeachfhreastalaí
+ Comment[hu]=Automatikus proxybeállítás
+ Comment[it]=Configurazione automatica proxy
+ Comment[ja]=自動プロキシ設定
++Comment[kk]=Проксиді автоматты түрде баптау
+ Comment[km]=ការ​កំណត់​រចនាសម្ព័ន្ធ​ប្រូកស៊ី​ដោយ​ស្វ័យប្រវត្តិ
+ Comment[lt]=Automatinis proxy derinimas
++Comment[lv]=Automātiska starpniekserveru konfigurēšana
+ Comment[nds]=Proxy automaatsch instellen
+ Comment[nl]=Automatische proxyconfiguratie
+ Comment[pa]=ਆਟੋਮੈਟਿਕ ਪਰਾਕਸੀ ਸੰਰਚਨਾ
+ Comment[pt]=Configuração Automática do 'Proxy'
+ Comment[pt_BR]=Configuração Automática do Proxy
+ Comment[ru]=Автонастройка прокси-сервера
++Comment[sr]=Аутоматско подешавање проксија
++Comment[sr at latin]=Automatsko podešavanje proksija
+ Comment[sv]=Automatisk proxyinställning
++Comment[uk]=Автоматичне налаштування проксі сервера
+ Comment[x-test]=xxAutomatic Proxy Configurationxx
+ Comment[zh_CN]=自动代理配置
+ Comment[zh_TW]=自動代理組態
+@@ -28,19 +35,26 @@
+ Name[be]=Няправільны сцэнар проксі
+ Name[ca]=Script de l'intermediari no vàlid
+ Name[cs]=Neplatný proxy skript
++Name[de]=Ungültiges Proxy-Skript
+ Name[el]=Μη έγκυρο σενάριο διαμεσολαβητή
++Name[et]=Vigane puhverserveri skript
+ Name[ga]=Script Neamhbhailí Seachfhreastalaí
+ Name[hu]=Érvénytelen proxyszkript
+ Name[it]=Script proxy non valido
+ Name[ja]=無効なプロキシスクリプト
++Name[kk]=Жарамсыз прокси скрипті
+ Name[km]=ស្គ្រីប​ប្រូកស៊ី​មិនត្រឹមត្រូវ
++Name[lv]=Nederīgs starpniekservera skripts
+ Name[nds]=Leeg Proxy-Skript
+ Name[nl]=Ongeldig proxyscript
+ Name[pa]=ਗਲਤ ਪਰਾਕਸੀ ਸਕ੍ਰਿਪਟ
+ Name[pt]=Programa de 'Proxy' Inválido
+ Name[pt_BR]=Script de Proxy Inválido
+ Name[ru]=Недопустимый сценарий настройки прокси-сервера
++Name[sr]=Неисправна скрипта проксија
++Name[sr at latin]=Neispravna skripta proksija
+ Name[sv]=Ogiltigt proxyskript
++Name[uk]=Не чинний скрипт проксі
+ Name[x-test]=xxInvalid Proxy Scriptxx
+ Name[zh_CN]=无效的代理脚本
+ Name[zh_TW]=不合法的代理文稿
+@@ -52,8 +66,9 @@
+ Comment[cs]=Stažený konfigurační skript pro proxy je neplatný
+ Comment[cy]=Mae'r sgript ffurfweddu'r dirprwy a chafodd ei lawrlwytho yn annilys
+ Comment[da]=Det hentede proxy-indstillingsscript er ugyldigt
++Comment[de]=Das heruntergeladene Konfigurationsskript für den Proxy ist ungültig.
+ Comment[el]=Το ληφθέν σενάριο ρύθμισης διαμεσολαβητή δεν είναι έγκυρο
+-Comment[et]=Allalaaditud proxy seadistuse skript on vigane
++Comment[et]=Allalaaditud puhverserveri seadistuse skript on vigane
+ Comment[eu]=Deskargatutako proxy-aren konfigurazioko script-a baliogabea da
+ Comment[fi]=Ladattu proxy-asetusskripti on virheellinen
+ Comment[fr]=Le script téléchargé de configuration du proxy n'est pas valable
+@@ -65,9 +80,11 @@
+ Comment[is]=Sótt milliþjónsskrifta er ógild
+ Comment[it]=Lo script di configurazione proxy scaricato non è valido
+ Comment[ja]=ダウンロードされたプロキシ設定スクリプトは無効です
++Comment[kk]=Жүктеп алынған проксиді баптау скрипті жарамсыз
+ Comment[km]=ស្គ្រីប​កំណត់​រចនា​សម្ព័ន្ធ​ប្រូកស៊ី​ដែល​បាន​ទាញយក​គឺ​មិនត្រឹមត្រូវ
+ Comment[lb]=D'Proxy-Configuratiounsskript, dat erofgelude gouf, ass ongülteg
+ Comment[lt]=Atsisiųstas proxy derinimo scenarijus yra blogas
++Comment[lv]=Lejuplādētais starpniekservera skripts bija nederīgs
+ Comment[mk]=Симнатата скрипта за конфигурација на прокси е навалидна
+ Comment[ms]=Skrip penyelarasan proksi yang dimuat turun tidak sah
+ Comment[nds]=Dat daallaadte Proxy-Instellskript is leeg
+@@ -78,12 +95,14 @@
+ Comment[ro]=Scriptul de configurare "proxy" este eronat
+ Comment[ru]=Загруженный скрипт настройки прокси содержит ошибки
+ Comment[sl]=Naložen nastavitveni skript posrednika je neveljaven
+-Comment[sr at latin]=Preuzeta skripta za podešavanje proksija je neispravna
++Comment[sr]=Преузета скрипта за подешавање проксија није исправна
++Comment[sr at latin]=Preuzeta skripta za podešavanje proksija nije ispravna
+ Comment[sv]=Det nerladdade proxyinställningsskriptet är ogiltigt
+ Comment[ta]=இறக்கப்பட்ட பதிலாள் வடிவமைப்பு எழுத்தாக்கம் செல்லாது
+ Comment[te]=డౌన్ లోడ్ చేయబడిన్ ప్రాక్సీ రూపకరణపు స్క్రిప్ట్ చెల్లదు
+ Comment[tg]=Шакли дастнависи вакил кардашуда ношоям фаровир
+ Comment[tr]=Vekil sunucu yapılandırma dosyası geçersiz
++Comment[uk]=Звантажено не чинний скрип проксі
+ Comment[uz]=Проксини мослаш учун ёзиб олинган скрипт ҳақиқий эмас
+ Comment[x-test]=xxThe downloaded proxy configuration script is invalidxx
+ Comment[zh_CN]=下载的代理服务器配置脚本无效
+@@ -96,17 +115,24 @@
+ Name[be]=Памылка сцягвання сцэнара
+ Name[ca]=Error de descàrrega de l'script
+ Name[cs]=Chyba ve stažení skriptu
++Name[de]=Fehler beim Herunterladen des Skripts
+ Name[el]=Σφάλμα λήψης σεναρίου
++Name[et]=Viga skripti allalaadimisel
+ Name[ga]=Earráid Íosluchtaithe Scripte
+ Name[hu]=Szkriptletöltési hiba
+ Name[it]=Errore scaricamento script
+ Name[ja]=スクリプトのダウンロードエラー
++Name[kk]=Скриптті жүктеу қатесі
+ Name[km]=កំហុស​ក្នុង​ការ​ទាញយក​ស្គ្រីប
++Name[lv]=Skripta lejuplādes kļūda
+ Name[nds]=Skript-Daallaadfehler
+ Name[nl]=Fout bij scriptdownload
+ Name[pt]=Erro de Transferência do Programa
+ Name[pt_BR]=Erro no Download do Script
++Name[sr]=Грешка у преузимању скрипте
++Name[sr at latin]=Greška u preuzimanju skripte
+ Name[sv]=Nerladdningsfel för skript
++Name[uk]=Помилка звантаження проксі
+ Name[x-test]=xxScript Download Errorxx
+ Name[zh_CN]=脚本下载错误
+ Name[zh_TW]=文稿下載錯誤
+@@ -118,8 +144,9 @@
+ Comment[cs]=Nelze stáhnout konfigurační skript pro proxy
+ Comment[cy]=Y sgript ffurfweddu'r dirprwy
+ Comment[da]=Proxy-indstillingsscriptet kunne ikke hentes
++Comment[de]=Das Konfigurationskript für den Proxy kann nicht heruntergeladen werden.
+ Comment[el]=Αδύνατη η λήψη του σεναρίου ρύθμισης διαμεσολαβητή
+-Comment[et]=Proxy seadistuse skripti ei õnnestu alla laadida
++Comment[et]=Puhverserveri seadistuse skripti allalaadimine nurjus
+ Comment[eu]=Proxy-aren konfigurazioko script-a ezin izan da deskargatu
+ Comment[fi]=Proxyn asetusskriptiä ei voitu ladata
+ Comment[fr]=Le script de configuration du proxy n'a pas pu être téléchargé
+@@ -131,9 +158,11 @@
+ Comment[is]=Gat ekki sótt stillingaskriftu milliþjóns
+ Comment[it]=Impossibile scaricare lo script di configurazione proxy
+ Comment[ja]=プロキシ設定スクリプトをダウンロードできませんでした
++Comment[kk]=Проксиді баптау скрипті жүктеп алынбайды
+ Comment[km]=មិន​អាច​ទាញយក​ស្គ្រីប​កំណត់រចនា​សម្ព័ន្ធ​ប្រូកស៊ី​បាន​ឡើយ
+ Comment[lb]=D'Proxy-Konfiguratiounsskript konnt net erofgeluede ginn
+ Comment[lt]=Proxy derinimo scenarijus negali būti atsisiųstas
++Comment[lv]=Nebija iespējams lejuplādēt starpniekservera konfigurācijas skriptu
+ Comment[mk]=Скриптата за конфигурација на прокси не можеше да се симне
+ Comment[ms]=Skrip penyelarasan proksi tidak boleh dimuat turun
+ Comment[nds]=Dat Proxy-Instellskript lett sik nich daalladen
+@@ -144,12 +173,14 @@
+ Comment[ro]=Nu am putut transfera scriptul de configurare "proxy"
+ Comment[ru]=Не удаётся загрузить скрипт настройки прокси
+ Comment[sl]=Nastavitveni skript posrednika ni mogel biti naložen
++Comment[sr]=Скрипта за подешавање проксија не може бити преузета
+ Comment[sr at latin]=Skripta za podešavanje proksija ne može biti preuzeta
+ Comment[sv]=Proxyinställningsskriptet kunde inte laddas ner
+ Comment[ta]=பதிலாள் வடிவமைப்பு எழுத்தாக்கத்தை இறக்க முடியவில்லை
+ Comment[te]=ప్రాక్సీ రూపకరణపు స్క్రిప్ట్ ని డౌన్ లోడ్ చేయలేకపోయాం
+ Comment[tg]=Шакли дастнависи вакил кардашуда фаровир наметавонад
+ Comment[tr]=Vekil sunucu yapılandırma dosyası indirilemedi
++Comment[uk]=Неможливо звантажити скрип налаштування проксі
+ Comment[uz]=Проксини мослаш учун скриптни ёзиб олиб бўлмади
+ Comment[x-test]=xxThe proxy configuration script could not be downloadedxx
+ Comment[zh_CN]=无法下载代理配置脚本
+@@ -162,17 +193,24 @@
+ Name[be]=Памылка выканання сцэнару
+ Name[ca]=Error d'avaluació de l'script
+ Name[cs]=Chyba v analýze skriptu
++Name[de]=Fehler bei der Auswertung des Skripts
+ Name[el]=Σφάλμα αποτίμησης σεναρίου
++Name[et]=Viga skripti hindamisel
+ Name[ga]=Earráid agus Script á Luacháil
+ Name[hu]=Szkriptkiértékelési hiba
+ Name[it]=Errore di valutazione script
+ Name[ja]=スクリプト評価エラー
++Name[kk]=Скриптті орындау қатесі
+ Name[km]=កំហុស​ក្នុង​ការ​វាយ​តម្លៃ​ស្គ្រីប
++Name[lv]=Skripta novērtēšanas kļūda
+ Name[nds]=Skript-Utföhrfehler
+ Name[nl]=Fout bij evalueren van script
+ Name[pt]=Erro de Avaliação do Programa
+ Name[pt_BR]=Erro de Avaliação do Script
++Name[sr]=Грешка у извршавању скрипте
++Name[sr at latin]=Greška u izvršavanju skripte
+ Name[sv]=Utvärderingsfel för skript
++Name[uk]=Помилка оцінки скрипту
+ Name[x-test]=xxScript Evaluation Errorxx
+ Name[zh_CN]=脚本执行错误
+ Name[zh_TW]=文稿執行錯誤
+@@ -184,8 +222,9 @@
+ Comment[cs]=Nastala chyba při spouštění konfiguračního skriptu proxy
+ Comment[cy]=Digwyddodd gwall wrth weithredu'r sgript ffurfweddu'r dirprwy
+ Comment[da]=Der opstod en fejl ved kørslen af proxy-indstillingsscriptet
++Comment[de]=Beim Ausführen des Skripts zur Proxy-Konfiguration ist ein Fehler aufgetreten.
+ Comment[el]=Παρουσιάστηκε σφάλμα κατά την εκτέλεση του σεναρίου ρύθμισης του διαμεσολαβητή
+-Comment[et]=Ilmnes tõsine viga proxy seadistuse skripti käivitamisel
++Comment[et]=Ilmnes tõsine viga puhverserveri seadistuse skripti käivitamisel
+ Comment[eu]=Errorea gertatu da proxy-a konfiguratzeko script-ean
+ Comment[fi]=Proxy-skriptin suorittamisessa tapahtui virhe
+ Comment[fr]=Une erreur s'est produite lors de l'exécution du script de configuration du proxy
+@@ -197,9 +236,11 @@
+ Comment[is]=Það kom upp villa við keyrslu stillingaskriftu milliþjóns
+ Comment[it]=Si è verificato un errore durante l'esecuzione dello script di configurazione proxy
+ Comment[ja]=プロキシ設定スクリプトの実行でエラーが発生しました
++Comment[kk]=Проксиді баптау скриптін орындау қатесі
+ Comment[km]=មាន​កំហុស​ក្នុង​ការ​ប្រតិបត្តិ​ស្គ្រីប​កំណត់​រចនា​សម្ព័ន្ធ​ប្រូកស៊ី
+ Comment[lb]=Et gouf e Feeler beim Ausféiere vum Proxy-Konfiguratiounsskript
+ Comment[lt]=Paleidžiant proxy derinimo scenarijų įvyko klaida
++Comment[lv]=Gadījās kļūda izpildot starpniekservera konfigurēšanas skriptu
+ Comment[mk]=Имаше грешка при извршувањето на скриптата за конфигурација на прокси
+ Comment[ms]=Terdapat ralat melaksanakan skrip penyelarasan proksi
+ Comment[nds]=Bi't Utföhren vun't Proxy-Instellskript geev dat en Fehler
+@@ -210,12 +251,14 @@
+ Comment[ro]=A apărut o eroare la execuţia scriptului de configurare "proxy"
+ Comment[ru]=Ошибка при выполнении скрипта настройки прокси
+ Comment[sl]=Prišlo je do napake pri izvajanju nastavitvenega skripta posrednika
+-Comment[sr at latin]=Desila se greška prilikom izvršavanja skripte za podešavanje proksija
++Comment[sr]=Дошло је до грешке током извршавања скрипте за подешавање проксија
++Comment[sr at latin]=Došlo je do greške tokom izvršavanja skripte za podešavanje proksija
+ Comment[sv]=Fel uppstod vid körning av proxyinställningsskriptet
+ Comment[ta]=பதிலாள் வடிவமைப்பு எழுத்தாக்கத்தை செயல்படுத்தும்போது ஒரு பிழை நேர்ந்தது
+ Comment[te]=ప్రాక్సీ రూపకరణపు స్క్రిప్ట్ నిర్వహణలొ దోషం వున్నది
+ Comment[tg]=Хато фаразани дар шакли дастнависи вакил кардашуда
+ Comment[tr]=Vekil sunucu yapılandırma dosyası çalıştırılamadı
++Comment[uk]=Помилка запуску скрипту налаштування проксі
+ Comment[uz]=Проксини мослаш учун скриптни ишга туширишда хато рўй берди
+ Comment[x-test]=xxThere was an error executing the proxy configuration scriptxx
+ Comment[zh_CN]=执行代理配置脚本时出错
+--- a/kio/misc/kpac/proxyscout.desktop
++++ b/kio/misc/kpac/proxyscout.desktop
+@@ -65,7 +65,7 @@
+ Comment[el]=Αυτόματη ρύθμιση διαμεσολαβητή
+ Comment[eo]=Aŭtomata Prokuragordo
+ Comment[es]=Configuración automática del Proxy
+-Comment[et]=Automaatne proxy konfigureerimine
++Comment[et]=Automaatne puhverserveri seadistamine
+ Comment[eu]=Proxy-aren konfigurazio automatikoa
+ Comment[fa]=پیکربندی خودکار پیشکار
+ Comment[fi]=Automaattiset proxy-asetukset
+@@ -85,6 +85,7 @@
+ Comment[ko]=자동 프록시 설정
+ Comment[lb]=Automatesch Proxy-Configuratioun
+ Comment[lt]=Automatinis proxy derinimas
++Comment[lv]=Automātiska starpniekserveru konfigurēšana
+ Comment[mk]=Автоматска конфигурација на прокси
+ Comment[ms]=Penyelarasan Proksi Automatik
+ Comment[nb]=Automatisk mellomtjeneroppsett
+--- a/kio/kcmoduleinit.desktop
++++ b/kio/kcmoduleinit.desktop
+@@ -11,6 +11,7 @@
+ Name[el]=Αρχικοποίηση ρυθμίσεων του KDE
+ Name[en_GB]=KDE Configuration Initialisation
+ Name[es]=Inicialización de la configuración de KDE
++Name[et]=KDE seadistamise initsialiseerimine
+ Name[fa]=مقداردهی اولیه پیکربندی KDE
+ Name[ga]=Túsú Cumraíochta KDE
+ Name[he]=איתחול ההגדרות של KDE
+@@ -29,8 +30,11 @@
+ Name[pt]=Inicialização da Configuração do KDE
+ Name[pt_BR]=Inicialização da Configuração do KDE
+ Name[sl]=Začetno nastavljanje KDE-ja
++Name[sr]=Успостављање подешавања КДЕ-а
++Name[sr at latin]=Uspostavljanje podešavanja KDE-a
+ Name[sv]=Initiering av KDE-inställningar
+ Name[th]=เริ่มงานการปรับแต่ง KDE
++Name[uk]=Започаткування конфігурації KDE
+ Name[vi]=Sở khởi cấu hình KDE
+ Name[wa]=Inicialijhaedje di l' apontiaedje di KDE
+ Name[x-test]=xxKDE Configuration Initializationxx
+--- a/kio/tests/krununittest.cpp
++++ b/kio/tests/krununittest.cpp
+@@ -94,7 +94,7 @@
+     KUrl::List l3; l3 << KUrl( "file:/local/file" ) << KUrl( "http://remotehost.org/bar" );
+ 
+     static const char
+-        *execs[] = { "Exec=date -u", "Exec=echo $$PWD" },
++        *execs[] = { "Exec=date -u", "Exec=echo $PWD" },
+         *terms[] = { "Terminal=false", "Terminal=true\nTerminalOptions=-T \"%f - %c\"" },
+           *sus[] = { "X-KDE-SubstituteUID=false", "X-KDE-SubstituteUID=true\nX-KDE-Username=sprallo" },
+         *rslts[] = {
+@@ -133,6 +133,7 @@
+     KUrl::List l1; l1 << KUrl( "file:/tmp" );
+     KUrl::List l2; l2 << KUrl( "http://localhost/foo" );
+     KUrl::List l3; l3 << KUrl( "file:/local/file" ) << KUrl( "http://remotehost.org/bar" );
++    KUrl::List l4; l4 << KUrl( "http://login:password@www.kde.org" );
+ 
+     // A real-world use case would be kate.
+     // But I picked kdeinit4 since it's installed by kdelibs
+@@ -167,6 +168,7 @@
+                                    << l1 << false << "/bin/sh -c 'kdeinit4 \\\"/tmp\\\"'";
+ 
+     QTest::newRow("kmailservice %u l1") << "kmailservice %u" << l1 << false << kmailservice + " /tmp";
++    QTest::newRow("kmailservice %u l4") << "kmailservice %u" << l4 << false << kmailservice + " http://login:password@www.kde.org";
+ }
+ 
+ void KRunUnitTest::testProcessDesktopExecNoFile()
+--- a/kio/tests/dummymeta.desktop
++++ b/kio/tests/dummymeta.desktop
+@@ -24,6 +24,7 @@
+ Name[ko]=가짜 메타
+ Name[lb]=Dummy-Meta
+ Name[lt]=Netikras Meta
++Name[lv]=Testa metadati
+ Name[ms]=Meta Olok-olok
+ Name[ne]=डमी मेटा
+ Name[pa]=ਫ਼ਰਜੀ ਮੈਟਾ
+--- a/kio/kscan.desktop
++++ b/kio/kscan.desktop
+@@ -10,6 +10,7 @@
+ Name[ne]=केडीई स्क्यान
+ Name[pl]=Skan
+ Name[ru]=Сканер
++Name[sr]=К-скен
+ Name[sv]=Kscan
+ Name[ta]=Kவருடல்
+ Name[te]=కేస్కేన్
+--- a/kio/kurifilterplugin.desktop
++++ b/kio/kurifilterplugin.desktop
+@@ -52,8 +52,8 @@
+ Name[ru]=Модуль расширенного просмотра
+ Name[se]=Njuovžilut fierbmádatlogadeami lassemoduvla
+ Name[sl]=Vstavek za izboljšano brskanje
+-Name[sr]=Прикључак за побољшано претраживање
+-Name[sr at latin]=Priključak za poboljšano pretraživanje
++Name[sr]=Прикључак за побољшано прегледање
++Name[sr at latin]=Priključak za poboljšano pregledanje
+ Name[sv]=Utökad webbläsning
+ Name[ta]=மேம்படுத்திய உலாவும் சொருகுப்பொருள்
+ Name[te]=అభివ్రుద్దిపరచిన బ్రౌజింగ్ ప్లగిన్
+--- a/kio/data.protocol
++++ b/kio/data.protocol
+@@ -37,6 +37,7 @@
+ Description[ko]=데이터 URI를 위한 KIO 슬레이브 (RFC 2397)
+ Description[lb]=E kioslave fir Donnéen-URIs (rfc2397)
+ Description[lt]=Antrinė KDE programa duomenų URI (rfc2397)
++Description[lv]=Kioslave priekš datu URI (rfc2397)
+ Description[mk]=kio-служител за податочни URI (rfc2397)
+ Description[ms]=Kioslave untuk URI data (rfc2397)
+ Description[nb]=kioslave for data URI-er (rfc2397)
+@@ -52,8 +53,8 @@
+ Description[ru]=Обработчик URI данных (rfc2397)
+ Description[se]=kiošláva dáhta-URI:aid várás (rfc2397)
+ Description[sl]=kioslave za podatkovne URI-je (rfc2397)
+-Description[sr]=kioslave за URI-ије података (rfc2397)
+-Description[sr at latin]=kioslave za URI-ije podataka (rfc2397)
++Description[sr]=У/И-захват за УРИ-је података (РФЦ 2397)
++Description[sr at latin]=U/I-zahvat za URI-je podataka (RFC 2397)
+ Description[sv]=En I/O-slav för datawebbadresser (RFC 2397)
+ Description[ta]=தரவு வலைமனைகளுக்கான ஒரு kioslave (rfc2397)
+ Description[te]=దత్తాంశం యుఆరైల కొరకు కెఐఓబానిస (rfc2397)
+--- a/kio/kcmodule.desktop
++++ b/kio/kcmodule.desktop
+@@ -5,6 +5,7 @@
+ Name=KDE Configuration Module
+ Name[ar]=وحدة تحكم كيدي
+ Name[be]=Модуль настаўлення KDE
++Name[br]=Mollad kreizenn ren KDE
+ Name[ca]=Mòdul de configuració del KDE
+ Name[cs]=Ovládací modul KDE
+ Name[csb]=Kòntrolny mòduł pùltu KDE
+@@ -12,6 +13,7 @@
+ Name[el]=Άρθρωμα ρύθμισης του KDE
+ Name[eo]=KDE Agordmodulo
+ Name[es]=Módulo de configuración de KDE
++Name[et]=KDE seadistamismoodul
+ Name[fa]=پیمانۀ پیکربندی KDE
+ Name[ga]=Modúl Cumraíochta KDE
+ Name[he]=מודול הגדרות של KDE
+@@ -30,9 +32,12 @@
+ Name[pt]=Módulo de Configuração do KDE
+ Name[pt_BR]=Módulo de Configuração do KDE
+ Name[sl]=Modul za nastavljanje KDE
++Name[sr]=КДЕ модул за подешавање
++Name[sr at latin]=KDE modul za podešavanje
+ Name[sv]=KDE-inställningsmodul
+ Name[te]=కెడిఈ అమరిక మాడ్యూల్
+ Name[th]=โมดูลปรับแต่งของ KDE
++Name[uk]=Модуль налаштування KDE
+ Name[vi]=Mô-đun Cấu hình KDE
+ Name[wa]=Module d' apontiaedje di KDE
+ Name[x-test]=xxKDE Configuration Modulexx
+--- a/kio/kpasswdserver.desktop
++++ b/kio/kpasswdserver.desktop
+@@ -51,7 +51,7 @@
+ Name[ru]=Служба паролей
+ Name[se]=KDED beassansátni-moduvla
+ Name[sl]=Geselni modul KDED
+-Name[sr]=KDED модул за лозинке
++Name[sr]=КДЕД модул за лозинке
+ Name[sr at latin]=KDED modul za lozinke
+ Name[sv]=KDED-lösenordsmodul
+ Name[ta]=KDED கடவுச்சொல் பகுதி
+--- a/kio/kssl/ksslinfodialog.cpp
++++ b/kio/kssl/ksslinfodialog.cpp
+@@ -136,7 +136,7 @@
+ }
+ 
+ void KSSLInfoDialog::launchConfig() {
+-    QProcess::startDetached("kcmshell", QStringList() << "crypto");
++    QProcess::startDetached("kcmshell4", QStringList() << "crypto");
+ }
+ 
+ 
+--- a/kio/renamedialogplugin.desktop
++++ b/kio/renamedialogplugin.desktop
+@@ -36,7 +36,7 @@
+ Comment[ko]=이름 바꾸기 대화상자용 플러그인
+ Comment[lb]=Plugin fir den Ëmbenennen-Dialog
+ Comment[lt]=Priedas pervadinimo dialogui
+-Comment[lv]=Spraudnis Pārsaukšanas Dialogam
++Comment[lv]=Spraudnis pārsaukšanas dialogam
+ Comment[mk]=Приклучок за дијалогот за преименување
+ Comment[ms]=Plug masuk untuk namakan semula Dialog
+ Comment[nb]=Programtillegg for omnavningsdialogen
+@@ -52,8 +52,8 @@
+ Comment[ru]=Модуль для диалога переименования
+ Comment[se]=Lassemoduvla nammarievdadanláseža várás
+ Comment[sl]=Vstavek za pogovorno okno za preimenovanje
+-Comment[sr]=Прикључак за дијалог за преименовање
+-Comment[sr at latin]=Priključak za dijalog za preimenovanje
++Comment[sr]=Прикључак за дијалог преименовања
++Comment[sr at latin]=Priključak za dijalog preimenovanja
+ Comment[sv]=Insticksprogram för Byt namn-dialogrutan
+ Comment[ta]=மறுபெயரிடல் உரையாடலுக்கான சொருகுப்பொருள்
+ Comment[te]=పేరు మార్చు సంభాషణ కొరకు ప్లగిన్
+--- a/DEBUG
++++ b/DEBUG
+@@ -8,12 +8,12 @@
+ Configuring for debugging
+ =========================
+ 
+-You can use --enable-debug with the configure script, if you want to have
++You can use -DCMAKE_BUILD_TYPE=Debug with the configure script, if you want to have
+ debug code in your KDE libs. If you have the space and can stand code that's
+ somewhat slower, this is worth it. The extra information really
+ helps debugging and thus bugfixing.
+ 
+-On the other hand, --disable-debug removes all debug messages, leading
++On the other hand, -DCMAKE_BUILD_TYPE=None removes all debug messages, leading
+ to a faster and cleaner desktop.
+ 
+ 
+--- a/kpty/CMakeLists.txt
++++ b/kpty/CMakeLists.txt
+@@ -13,7 +13,7 @@
+ 
+ target_link_libraries(kpty ${KDE4_KDECORE_LIBS} ${UTIL_LIBRARY})
+ 
+-#set_target_properties(kdecore PROPERTIES VERSION ${KDE_NON_GENERIC_LIB_VERSION} SOVERSION ${KDE_NON_GENERIC_LIB_SOVERSION} )
++set_target_properties(kpty PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION} )
+ install(TARGETS kpty
+              RUNTIME DESTINATION ${BIN_INSTALL_DIR}
+              LIBRARY DESTINATION ${LIB_INSTALL_DIR}
+--- a/KDE4PORTING.html
++++ b/KDE4PORTING.html
+@@ -84,6 +84,7 @@
+ <li><a href="#mimetypes">Mime types names</a></li>
+ <li><a href="#knewstuff">KNewStuff</a></li>
+ <li><a href="#dcop">DCOP</a></li>
++<li><a href="#printing">Printing</a></li>
+ </UL>
+ 
+ <h3><a name="gettingstarted">Getting started</a></h3>
+@@ -257,6 +258,7 @@
+ <li>caption() has moved to KComponentData </li>
+ <li>makeStdCaption(const QString&amp;, bool, bool) has moved to KDialog and changed signature to makeStdCaption(const QString&amp;, CaptionFlags) </li>
+ <li>addKipcEventMask() is unneeded now, and the signals like settingsChanged(), fontChanged() etc. with enums SettingsCategory have moved to KGlobalSettings::self() which is now a QObject</li>
++<li>updateRemoteUserTimestamp() now takes DBUS service id instead of dbus name (i.e. something like org.kde. needs to be prepended)</li>
+ </ul>
+ 
+ <h4>KAudioPlayer</h4>
+@@ -1194,6 +1196,8 @@
+   item-&gt;setIcon( KIcon( "image" ) );
+ </pre>
+ </li>
++<li>The virtual methods associated with each button (slotOk(), slotCancel(), etc.) have been merged into a single KDialog::slotButtonClicked(int button) virtual method. However, the most direct replacement for slotOk() and slotCancel() is to reimplement QDialog::accept() and QDialog::reject(), respectively. For all other buttons, consider connect()ing to the corresponding signals provided by KDialog (helpClicked(), etc.).
++</li>
+ </ul>
+ 
+ <h4>KDockWindow</h4>
+@@ -1324,6 +1328,11 @@
+ <li>setMaxValue(min) -&gt; setMaximum(min) / maxValue() -&gt; maximum()</li>
+ </ul>
+ 
++<h4>KIntSpinBox</h4>
++<ul>
++<li>In the long version of the constructor, the arguments parent and base have switched places.</li>
++</ul>
++
+ <h4>KJanusWidget</h4>
+ <p>Deprecated. Use KPageWidget instead.</p>
+ 
+@@ -2959,5 +2968,40 @@
+ 
+ <h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>
+ 
++
++<h3><a name="printing">Printing</a></h3>
++
++<p>libkdeprint has been replaced by enhanced printing support in Qt 4.  Qt 4.3
++is still lacking in a print preview feature and a customisable print dialog.
++KPrintPreview (kutils) provides the former, and KdePrint::createPrintDialog()
++(kdeui) provides the latter, at least for Qt 4.3.2 onwards.</p>
++
++<h4>Porting involves the following</h4>
++<ul>
++<li>using QPrinter instead of KPrinter</li>
++<li>using KdePrint::createPrintDialog() (in kdeui) to get a (customised) QPrintDialog, rather than using KPrinter::setup()</li>
++<li>using KPrintPreview (in kutils) for print preview, rather than KPrinter::setPreviewOnly(true)</li>
++<li>removing the dependency on libkdeprint</li>
++</ul>
++
++<p>If the code uses addDialogPage, you need to change the KPrintDialogPage to a
++QWidget, and you can get rid of the getOptions and setOptions methods in favor
++of a method for each option (since QPrintDialog doesn't do anything with the widget
++except display it). Then the code that called KPrinter::addDialogPage and
++KPrinter::setup needs to use KdePrint::createPrintDialog instead and get the options
++directly from the widgets passed to createPrintDialog rather than from the QPrinter.
++The widgets should also use setWindowTitle() rather than setTitle().</p>
++
++<h4>For more details, see the following:</h4>
++<ul>
++<li><a href="http://doc.trolltech.com/4.3/printing.html">Printing with Qt</a></li>
++<li><a href="http://api.kde.org/4.0-api/kdelibs-apidocs/kutils/html/classKPrintPreview.html">KPrintPreview apidocs</a></li>
++<li><a href="http://api.kde.org/4.0-api/kdelibs-apidocs/kdeui/html/namespaceKdePrint.html">KdePrint::createPrintDialog apidocs</a></li>
++<li><a href="http://techbase.kde.org/Projects/KDEPrint/KDE4#Porting">KDEPrint Porting on TechBase</a></li>
++</ul>
++
++
++<h4 align="right"><a href="#TOC">Return to the Table of Contents</a></h4>
++
+ </body>
+ </html>
+--- a/kdeui/kernel/kglobalsettings.h
++++ b/kdeui/kernel/kglobalsettings.h
+@@ -435,10 +435,11 @@
+      *
+      * This is only useful for configuration modules such as krdb and should not be
+      * used in normal circumstances.
++     * @param config KConfig from which to load the colors (passed as-is to
++     * ::KColorScheme).
+      *
+      * @return the QPalette
+      */
+-    // TODO should the parameter be documented, or should it be hidden from doxygen?
+     static QPalette createApplicationPalette(const KSharedConfigPtr &config = KSharedConfigPtr());
+ 
+     /**
+--- a/kdeui/kernel/kstyle.cpp
++++ b/kdeui/kernel/kstyle.cpp
+@@ -1730,19 +1730,33 @@
+ 
+         case CE_ScrollBarAddPage:
+         {
+-            drawKStylePrimitive(WT_ScrollBar,
+-                                (flags & State_Horizontal) ? ScrollBar::GrooveAreaHorRight :
+-                                        ScrollBar::GrooveAreaVertBottom,
++            const QStyleOptionSlider* slOpt = ::qstyleoption_cast<const QStyleOptionSlider*>(option);
++            if (!slOpt) return;
++
++            if (flags & State_Horizontal)
++                drawKStylePrimitive(WT_ScrollBar,
++                                (slOpt->direction == Qt::LeftToRight) ? ScrollBar::GrooveAreaHorRight :
++                                        ScrollBar::GrooveAreaHorLeft,
+                                 option, r, pal, flags, p, widget);
++            else
++                drawKStylePrimitive(WT_ScrollBar, ScrollBar::GrooveAreaVertBottom,
++                                                     option, r, pal, flags, p, widget);
+             return;
+         }
+ 
+         case CE_ScrollBarSubPage:
+         {
+-            drawKStylePrimitive(WT_ScrollBar,
+-                                (flags & State_Horizontal) ? ScrollBar::GrooveAreaHorLeft :
+-                                        ScrollBar::GrooveAreaVertTop,
++            const QStyleOptionSlider* slOpt = ::qstyleoption_cast<const QStyleOptionSlider*>(option);
++            if (!slOpt) return;
++
++            if (flags & State_Horizontal)
++                drawKStylePrimitive(WT_ScrollBar,
++                                (slOpt->direction == Qt::LeftToRight) ? ScrollBar::GrooveAreaHorLeft :
++                                        ScrollBar::GrooveAreaHorRight,
+                                 option, r, pal, flags, p, widget);
++            else
++                drawKStylePrimitive(WT_ScrollBar, ScrollBar::GrooveAreaVertTop,
++                                                     option, r, pal, flags, p, widget);
+             return;
+         }
+ 
+@@ -3135,8 +3149,11 @@
+                         return handleRTL(option,
+                                          QRect(buttonsLeft, r.bottom()-bmb-heightDown+1, buttonsWidth, heightDown) );
+                     case SC_SpinBoxEditField:
+-                        return handleRTL(option,
+-                                         QRect(r.left()+fw, r.top()+fw, r.width()-fw-bw, r.height()-2*fw) );
++                    {
++                        QRect labelRect(r.left()+fw, r.top()+fw, r.width()-fw-bw, r.height()-2*fw);
++                        labelRect = insideMargin(labelRect, WT_SpinBox, SpinBox::ContentsMargin, option, widget);
++                        return handleRTL(option, labelRect );
++                    }
+                     case SC_SpinBoxFrame:
+                         return (sb->frame || !supportFrameless) ? r : QRect();
+                     default:
+@@ -3149,14 +3166,14 @@
+         {
+             if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
+ 
+-                int fw = widgetLayoutProp(WT_ComboBox, SpinBox::FrameWidth, option, widget);
+-                int bw = widgetLayoutProp(WT_ComboBox, SpinBox::ButtonWidth, option, widget);
+-                int bm = widgetLayoutProp(WT_ComboBox, SpinBox::ButtonMargin, option, widget);
+-                int bml = bm + widgetLayoutProp(WT_ComboBox, SpinBox::ButtonMargin + Left, option, widget);
+-                int bmr = bm + widgetLayoutProp(WT_ComboBox, SpinBox::ButtonMargin + Right, option, widget);
+-                int bmt = bm + widgetLayoutProp(WT_ComboBox, SpinBox::ButtonMargin + Top, option, widget);
+-                int bmb = bm + widgetLayoutProp(WT_ComboBox, SpinBox::ButtonMargin + Bot, option, widget);
+-                bool supportFrameless = widgetLayoutProp(WT_ComboBox, SpinBox::SupportFrameless, option, widget);
++                int fw = widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget);
++                int bw = widgetLayoutProp(WT_ComboBox, ComboBox::ButtonWidth, option, widget);
++                int bm = widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin, option, widget);
++                int bml = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Left, option, widget);
++                int bmr = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Right, option, widget);
++                int bmt = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Top, option, widget);
++                int bmb = bm + widgetLayoutProp(WT_ComboBox, ComboBox::ButtonMargin + Bot, option, widget);
++                bool supportFrameless = widgetLayoutProp(WT_ComboBox, ComboBox::SupportFrameless, option, widget);
+ 
+                 // ComboBox without a frame, set the corresponding layout values to 0, reduce button width.
+                 if (supportFrameless && !cb->frame)
+@@ -3173,8 +3190,11 @@
+                         return handleRTL(option,
+                                          QRect(r.right()-bw+bml+1, r.top()+bmt, bw-bml-bmr, r.height()-bmt-bmb) );
+                     case SC_ComboBoxEditField:
+-                        return handleRTL(option,
+-                                         QRect(r.left()+fw, r.top()+fw, r.width()-fw-bw, r.height()-2*fw) );
++                    {
++                        QRect labelRect(r.left()+fw, r.top()+fw, r.width()-fw-bw, r.height()-2*fw);
++                        labelRect = insideMargin(labelRect, WT_ComboBox, ComboBox::ContentsMargin, option, widget);
++                        return handleRTL(option, labelRect );
++                    }
+                     case SC_ComboBoxListBoxPopup:
+                         // TODO: need to add layoutProps to control the popup rect?
+ //                         return cb->popupRect;
+@@ -3643,6 +3663,25 @@
+                 return expandDim(QSize(w, h), WT_Header, Header::ContentsMargin, option, widget);
+             }
+         }
++
++        case CT_ComboBox:
++        {
++            // TODO: Figure out what to do with the button margins
++            QSize size = contentsSize;
++
++            // Add the contents margin
++            size = expandDim(size, WT_ComboBox, ComboBox::ContentsMargin, option, widget);
++
++            // Add the button width
++            size.rwidth() += widgetLayoutProp(WT_ComboBox, ComboBox::ButtonWidth, option, widget);
++
++            // Add the frame width
++            size.rwidth()  += widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget) * 2;
++            size.rheight() += widgetLayoutProp(WT_ComboBox, ComboBox::FrameWidth, option, widget) * 2;
++
++            return size;
++        }
++
+         default:
+             break;
+     }
+--- a/kdeui/kernel/kapplication.cpp
++++ b/kdeui/kernel/kapplication.cpp
+@@ -1026,9 +1026,10 @@
+ void KApplication::updateRemoteUserTimestamp( const QString& service, int time )
+ {
+ #if defined Q_WS_X11
++    Q_ASSERT(service.contains('.'));
+     if( time == 0 )
+         time = QX11Info::appUserTime();
+-    QDBusInterface(service.contains('.')?service:"org.kde."+service, QLatin1String("/MainApplication"),
++    QDBusInterface(service, QLatin1String("/MainApplication"),
+             QString(QLatin1String("org.kde.KApplication")))
+         .call(QLatin1String("updateUserTimestamp"), time);
+ #endif
+--- a/kdeui/kernel/kstyle.h
++++ b/kdeui/kernel/kstyle.h
+@@ -1051,10 +1051,13 @@
+                                 * spacing of the buttons will be reduced by 1 if
+                                 * necessary to avoid rounding problems. Needs to be
+                                 * handled in your drawing code. */
+-            SupportFrameless   /**< (\b 0) Set to non-zero to indicate that you are able to
++            SupportFrameless,   /**< (\b 0) Set to non-zero to indicate that you are able to
+                                 * handle frame-less SpinBoxes. For a SpinBox with no
+                                 * frame, FrameWidth and Top/Bottom/Right ButtonMargin
+                                 * is ignored. */
++            ContentsMargin
++                                /**< (\b 5) space between the bevel and the spinbox contents
++                                    */
+         };
+ 
+         /**
+@@ -1104,9 +1107,12 @@
+             FocusMargin = ButtonMargin + MarginInc,
+                                 /**< (\b 1) Focus margin for ComboBoxes that aren't
+                                  * editable, measured from the EditField rect */
+-            SupportFrameless = FocusMargin + MarginInc
++            SupportFrameless = FocusMargin + MarginInc,
+                                 /**< (\b 0) @see LP_SpinBox_SupportFrameless same description
+                                  * applies here */
++            ContentsMargin
++                                /**< (\b 5) space between the bevel and the combobox contents
++                                    */
+         };
+ 
+         /**
+--- a/kdeui/kernel/kapplication.h
++++ b/kdeui/kernel/kapplication.h
+@@ -339,7 +339,7 @@
+   unsigned long userTimestamp() const;
+ 
+   /**
+-   * Updates the last user action timestamp in the application registered to DCOP with dcopId
++   * Updates the last user action timestamp in the application registered to DBUS with id service
+    * to the given time, or to this application's user time, if 0 is given.
+    * Use before causing user interaction in the remote application, e.g. invoking a dialog
+    * in the application using a DCOP call.
+--- a/kdeui/kernel/kstartupinfo.cpp
++++ b/kdeui/kernel/kstartupinfo.cpp
+@@ -640,7 +640,7 @@
+ 
+ void KStartupInfo::setNewStartupId( QWidget* window, const QByteArray& startup_id )
+     {
+-    long activate = true;
++    bool activate = true;
+     kapp->setStartupId( startup_id );
+ #ifdef Q_WS_X11
+     if( window != NULL )
+@@ -1018,9 +1018,9 @@
+     if (!gethostname( hostname, 255 ))
+ 	hostname[sizeof(hostname)-1] = '\0';
+ #ifdef Q_WS_X11
+-    long qt_x_user_time = QX11Info::appUserTime();
++    unsigned long qt_x_user_time = QX11Info::appUserTime();
+ #else
+-    long qt_x_user_time = 0;
++    unsigned long qt_x_user_time = 0;
+ #endif
+     QByteArray id = QString::fromLatin1( "%1;%2;%3;%4_TIME%5" ).arg( hostname ).arg( tm.tv_sec )
+         .arg( tm.tv_usec ).arg( getpid()).arg( qt_x_user_time ).toUtf8();
+@@ -1151,7 +1151,9 @@
+     if( pos >= 0 )
+         {
+         bool ok;
+-        long time = QString( d->id.mid( pos + 5 ) ).toLong( &ok );
++        unsigned long time = QString( d->id.mid( pos + 5 ) ).toULong( &ok );
++        if( !ok && d->id[ pos + 5 ] == '-' ) // try if it's as a negative signed number perhaps
++            time = QString( d->id.mid( pos + 5 ) ).toLong( &ok );
+         if( ok )
+             return time;
+         }
+@@ -1166,7 +1168,9 @@
+         if( pos2 >= 0 )
+             {
+             bool ok;
+-            long time = QString( d->id.mid( pos2 + 1, pos1 - pos2 - 1 ) ).toLong( &ok );
++            unsigned long time = QString( d->id.mid( pos2 + 1, pos1 - pos2 - 1 ) ).toULong( &ok );
++            if( !ok && d->id[ pos2 + 1 ] == '-' )
++                time = QString( d->id.mid( pos2 + 1, pos1 - pos2 - 1 ) ).toLong( &ok );
+             if( ok )
+                 return time;
+             }
+--- a/kdeui/kernel/kglobalsettings.cpp
++++ b/kdeui/kernel/kglobalsettings.cpp
+@@ -45,6 +45,10 @@
+ #include <QtDBus/QtDBus>
+ #include <QtGui/QStyleFactory>
+ 
++// next two needed so we can set their palettes
++#include <QtGui/QToolTip>
++#include <QtGui/QWhatsThis>
++
+ #ifdef Q_WS_WIN
+ #include <windows.h>
+ #include <kkernel_win.h>
+@@ -100,6 +104,9 @@
+         void kdisplaySetFont();
+         void applyGUIStyle();
+ 
++        // TODO (4.1?) - make not-private, if used in KStyle
++        static QPalette createTooltipPalette(const KSharedConfigPtr &config = KSharedConfigPtr());
++
+         /**
+          * @internal
+          *
+@@ -885,6 +892,47 @@
+ }
+ 
+ 
++QPalette KGlobalSettings::Private::createTooltipPalette(const KSharedConfigPtr &config)
++{
++    QPalette palette = QToolTip::palette();
++
++    QPalette::ColorGroup setStates[3] = { QPalette::Active, QPalette::Inactive,
++                                          QPalette::Disabled };
++    QPalette::ColorGroup useStates[3] = { QPalette::Active, QPalette::Active,
++                                          QPalette::Disabled };
++
++    for ( int i = 0; i < 3 ; i++ ) {
++        // tooltips are never active (arguably a bug?), but should be drawn as if they were
++        QPalette::ColorGroup state = setStates[i];
++        QPalette::ColorGroup stateUsed = useStates[i];
++        KColorScheme schemeButton(stateUsed, KColorScheme::Button, config);
++        KColorScheme schemeSelection(stateUsed, KColorScheme::Selection, config);
++        KColorScheme schemeTooltip(stateUsed, KColorScheme::Tooltip, config);
++
++        palette.setBrush( state, QPalette::WindowText, schemeTooltip.foreground() );
++        palette.setBrush( state, QPalette::Window, schemeTooltip.background() );
++        palette.setBrush( state, QPalette::Base, schemeTooltip.background() );
++        palette.setBrush( state, QPalette::Text, schemeTooltip.foreground() );
++        palette.setBrush( state, QPalette::Button, schemeButton.background() );
++        palette.setBrush( state, QPalette::ButtonText, schemeButton.foreground() );
++        palette.setBrush( state, QPalette::Highlight, schemeSelection.background() );
++        palette.setBrush( state, QPalette::HighlightedText, schemeSelection.foreground() );
++
++        palette.setColor( state, QPalette::Light, schemeTooltip.shade( KColorScheme::LightShade ) );
++        palette.setColor( state, QPalette::Midlight, schemeTooltip.shade( KColorScheme::MidlightShade ) );
++        palette.setColor( state, QPalette::Mid, schemeTooltip.shade( KColorScheme::MidShade ) );
++        palette.setColor( state, QPalette::Dark, schemeTooltip.shade( KColorScheme::DarkShade ) );
++        palette.setColor( state, QPalette::Shadow, schemeTooltip.shade( KColorScheme::ShadowShade ) );
++
++        palette.setBrush( state, QPalette::AlternateBase, schemeTooltip.background( KColorScheme::AlternateBackground) );
++        palette.setBrush( state, QPalette::Link, schemeTooltip.foreground( KColorScheme::LinkText ) );
++        palette.setBrush( state, QPalette::LinkVisited, schemeTooltip.foreground( KColorScheme::VisitedText ) );
++    }
++
++    return palette;
++}
++
++
+ void KGlobalSettings::Private::kdisplaySetPalette()
+ {
+     // Added by Sam/Harald (TT) for Mac OS X initially, but why?
+@@ -894,6 +942,9 @@
+ 
+     if (qApp && qApp->type() == QApplication::GuiClient) {
+         QApplication::setPalette( q->createApplicationPalette() );
++        QPalette ttp = createTooltipPalette();
++        QToolTip::setPalette( ttp );
++        // QWhatsThis::setPalette( ttp ); // TODO (when Qt supports it)
+         emit q->kdisplayPaletteChanged();
+         emit q->appearanceChanged();
+     }
+--- a/kdeui/dialogs/kprogressdialog.cpp
++++ b/kdeui/dialogs/kprogressdialog.cpp
+@@ -46,12 +46,12 @@
+     void slotAutoActions(int percentage);
+ 
+     KProgressDialog *q;
+-    bool          cancelButtonShown;
+-    bool          mAutoClose;
+-    bool          mAutoReset;
+-    bool          mCancelled;
+-    bool          mAllowCancel;
+-    bool          mShown;
++    bool          cancelButtonShown : 1;
++    bool          mAutoClose : 1;
++    bool          mAutoReset : 1;
++    bool          mCancelled : 1;
++    bool          mAllowCancel : 1;
++    bool          mShown : 1;
+     QString       mCancelText;
+     QLabel*       mLabel;
+     QProgressBar* mProgressBar;
+--- /dev/null
++++ b/kdeui/dialogs/kdeprintdialog.cpp
+@@ -0,0 +1,64 @@
++/*
++ *  This file is part of the KDE libraries
++ *  Copyright (c) 2007 Alex Merry <huntedhacker at tiscali.co.uk>
++ *  Copyright (c) 2007 Thomas Zander <zander at kde.org>
++ *
++ *  This library is free software; you can redistribute it and/or
++ *  modify it under the terms of the GNU Library General Public
++ *  License as published by the Free Software Foundation; either
++ *  version 2 of the License, or (at your option) any later version.
++ *
++ *  This library 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
++ *  Library General Public License for more details.
++ *
++ *  You should have received a copy of the GNU Library General Public License
++ *  along with this library; see the file COPYING.LIB.  If not, write to
++ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++ *  Boston, MA 02110-1301, USA.
++ **/
++
++#include "kdeprintdialog.h"
++
++#include <klocale.h>
++
++#include <QLayout>
++#include <QPrintDialog>
++#include <QStyle>
++#include <QTabWidget>
++
++QPrintDialog *KdePrint::createPrintDialog(QPrinter *printer,
++                                               const QList<QWidget*> &customTabs,
++                                               QWidget *parent)
++{
++    QPrintDialog *dialog = createPrintDialog(printer, parent);
++    if (! customTabs.isEmpty()) {
++        QWidget *generalWidget = dialog->findChild<QWidget*>("generalWidget");
++        QWidget *buttons = dialog->findChild<QWidget*>("buttonBox");
++        if (generalWidget && buttons) {
++            QTabWidget *tabs = new QTabWidget(dialog);
++            tabs->addTab(generalWidget, i18n("General"));
++            QStyle *style = dialog->style();
++            generalWidget->layout()->setContentsMargins(style->pixelMetric(QStyle::PM_LayoutLeftMargin),
++                                       style->pixelMetric(QStyle::PM_LayoutTopMargin),
++                                       style->pixelMetric(QStyle::PM_LayoutRightMargin),
++                                       style->pixelMetric(QStyle::PM_LayoutBottomMargin));
++            dialog->layout()->addWidget(tabs);
++            dialog->layout()->addWidget(buttons);
++
++            foreach(QWidget* tab, customTabs)
++                tabs->addTab(tab, tab->windowTitle());
++        }
++    }
++
++    return dialog;
++}
++
++
++QPrintDialog *KdePrint::createPrintDialog(QPrinter *printer,
++                                               QWidget *parent)
++{
++    return new QPrintDialog(printer, parent);
++}
++
+--- a/kdeui/dialogs/kedittoolbar.cpp
++++ b/kdeui/dialogs/kedittoolbar.cpp
+@@ -355,7 +355,6 @@
+   QString            m_globalFile;
+   QString            m_rcFile;
+   QDomDocument       m_localDoc;
+-  bool               m_isPart;
+ 
+   ToolBarList        m_barList;
+   ToolBarListView *m_inactiveList;
+@@ -368,8 +367,9 @@
+   QLabel * m_helpArea;
+   KPushButton* m_changeIcon;
+   KProcess* m_kdialogProcess;
+-  bool m_hasKDialog;
+-  bool m_loadedOnce;
++  bool m_isPart : 1;
++  bool m_hasKDialog : 1;
++  bool m_loadedOnce : 1;
+ };
+ 
+ }
+--- a/kdeui/dialogs/kbugreport.h
++++ b/kdeui/dialogs/kbugreport.h
+@@ -71,7 +71,7 @@
+   
+ private:
+   /**
+-   * "Configure email" has been clicked - this calls kcmshell System/email
++   * "Configure email" has been clicked - this calls kcmshell4 System/email
+    */
+   Q_PRIVATE_SLOT(d, void _k_slotConfigureEmail())
+   
+--- a/kdeui/dialogs/kconfigdialogmanager.cpp
++++ b/kdeui/dialogs/kconfigdialogmanager.cpp
+@@ -60,8 +60,8 @@
+ 
+   QHash<QString, QWidget *> knownWidget;
+   QHash<QString, QWidget *> buddyWidget;
+-  bool insideGroupBox;
+-  bool trackChanges;
++  bool insideGroupBox : 1;
++  bool trackChanges : 1;
+ };
+ 
+ KConfigDialogManager::KConfigDialogManager(QWidget *parent, KConfigSkeleton *conf)
+--- a/kdeui/dialogs/kdialog_p.h
++++ b/kdeui/dialogs/kdialog_p.h
+@@ -53,8 +53,8 @@
+         KPushButton *button( KDialog::ButtonCode code ) const;
+ 
+ 
+-        bool mDetailsVisible;
+-        bool mSettingDetails;
++        bool mDetailsVisible : 1;
++        bool mSettingDetails : 1;
+         QWidget *mDetailsWidget;
+         QSize mIncSize;
+         QSize mMinSize;
+--- /dev/null
++++ b/kdeui/dialogs/kdeprintdialog.h
+@@ -0,0 +1,71 @@
++/*
++ *  This file is part of the KDE libraries
++ *  Copyright (c) 2007 Alex Merry <huntedhacker at tiscali.co.uk>
++ *
++ *  This library is free software; you can redistribute it and/or
++ *  modify it under the terms of the GNU Library General Public
++ *  License as published by the Free Software Foundation; either
++ *  version 2 of the License, or (at your option) any later version.
++ *
++ *  This library 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
++ *  Library General Public License for more details.
++ *
++ *  You should have received a copy of the GNU Library General Public License
++ *  along with this library; see the file COPYING.LIB.  If not, write to
++ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++ *  Boston, MA 02110-1301, USA.
++ **/
++
++#ifndef KDEPRINTDIALOG_H
++#define KDEPRINTDIALOG_H
++
++#include <kdeui_export.h>
++
++#include <QtCore/QList>
++
++class QPrintDialog;
++class QPrinter;
++class QWidget;
++
++/**
++ * Namespace for the KDE printing system
++ */
++namespace KdePrint
++{
++    /**
++     * Creates a printer dialog for a QPrinter with the given custom widgets.
++     *
++     * Note that the custom widgets will @b not be shown on Qt versions prior to
++     * 4.3.2.
++     *
++     * The caller takes ownership of the dialog and is responsible
++     * for deleting it.
++     *
++     * @param printer the QPrinter to apply settings to
++     * @param parent the parent for the dialog
++     * @param customTabs a list of custom widgets to show as tabs, the name printed on the tab will
++     *      be taken from the widgets windowTitle().
++     * @see QWidget::setWindowTitle()
++     */
++    KDEUI_EXPORT QPrintDialog *createPrintDialog(QPrinter *printer,
++                                                      const QList<QWidget*> &customTabs,
++                                                      QWidget *parent = 0);
++
++    /**
++     * Creates a printer dialog for a QPrinter
++     *
++     * The caller takes ownership of the dialog and is responsible
++     * for deleting it.
++     *
++     * @param printer the QPrinter to apply settings to
++     * @param parent the parent for the dialog
++     */
++    KDEUI_EXPORT QPrintDialog *createPrintDialog(QPrinter *printer,
++                                                      QWidget *parent = 0);
++}
++
++
++#endif // KDEPRINTDIALOG_H
++
+--- a/kdeui/dialogs/kbugreport.cpp
++++ b/kdeui/dialogs/kbugreport.cpp
+@@ -360,10 +360,10 @@
+   if (m_process) return;
+   m_process = new QProcess;
+   QObject::connect( m_process, SIGNAL(finished( int, QProcess::ExitStatus )), q, SLOT(_k_slotSetFrom()) );
+-  m_process->start( QString::fromLatin1("kcmshell"), QStringList() << QString::fromLatin1("kcm_useraccount") );
++  m_process->start( QString::fromLatin1("kcmshell4"), QStringList() << QString::fromLatin1("kcm_useraccount") );
+   if ( !m_process->waitForStarted() )
+   {
+-    kDebug() << "Couldn't start kcmshell..";
++    kDebug() << "Couldn't start kcmshell4..";
+     delete m_process;
+     m_process = 0;
+     return;
+--- a/kdeui/dialogs/kaboutapplicationdialog.cpp
++++ b/kdeui/dialogs/kaboutapplicationdialog.cpp
+@@ -152,14 +152,14 @@
+ 
+         QList<KAboutPerson> lst = aboutData->authors();
+         for (int i = 0; i < lst.size(); ++i) {
+-            authorPageText += QString("%1<p style=\"margin: 0px; margin-bottom: 10px; margin-left: 15px;\">").arg(lst.at(i).name());
++            authorPageText += QString("<p style=\"margin: 0px;\">%1</p>").arg(lst.at(i).name());
+             if (!lst.at(i).emailAddress().isEmpty())
+-                authorPageText += QString("<a href=\"mailto:%1\">%1</a><br />").arg(lst.at(i).emailAddress());
++                authorPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\"><a href=\"mailto:%1\">%1</a></p>").arg(lst.at(i).emailAddress());
+             if (!lst.at(i).webAddress().isEmpty())
+-                authorPageText += QString("<a href=\"%3\">%3</a><br />").arg(lst.at(i).webAddress());
++                authorPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\"><a href=\"%3\">%3</a></p>").arg(lst.at(i).webAddress());
+             if (!lst.at(i).task().isEmpty())
+-                authorPageText += QString("%4").arg(lst.at(i).task());
+-            authorPageText += "</p>";
++                authorPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\">%4</p>").arg(lst.at(i).task());
++            authorPageText += "<br />";
+         }
+ 
+         KTextBrowser *authorTextBrowser = new KTextBrowser;
+@@ -174,14 +174,14 @@
+ 
+         QList<KAboutPerson> lst = aboutData->credits();
+         for (int i = 0; i < lst.size(); ++i) {
+-            creditsPageText += QString("%1<p style=\"margin: 0px; margin-bottom: 10px; margin-left: 15px;\">").arg(lst.at(i).name());
++            creditsPageText += QString("<p style=\"margin: 0px;\">%1</p>").arg(lst.at(i).name());
+             if (!lst.at(i).emailAddress().isEmpty())
+-                creditsPageText += QString("<a href=\"mailto:%1\">%1</a><br />").arg(lst.at(i).emailAddress());
++                creditsPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\"><a href=\"mailto:%1\">%1</a></p>").arg(lst.at(i).emailAddress());
+             if (!lst.at(i).webAddress().isEmpty())
+-                creditsPageText += QString("<a href=\"%3\">%3</a><br />").arg(lst.at(i).webAddress());
++                creditsPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\"><a href=\"%3\">%3</a></p>").arg(lst.at(i).webAddress());
+             if (!lst.at(i).task().isEmpty())
+-                creditsPageText += QString("%4").arg(lst.at(i).task());
+-            creditsPageText += "</p>";
++                creditsPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\">%4</p>").arg(lst.at(i).task());
++            creditsPageText += "<br />";
+         }
+ 
+         KTextBrowser *creditsTextBrowser = new KTextBrowser;
+@@ -197,10 +197,10 @@
+ 
+         QList<KAboutPerson>::ConstIterator it;
+         for(it = translatorList.begin(); it != translatorList.end(); ++it) {
+-            translatorPageText += QString("%1<p style=\"margin: 0px; margin-bottom: 10px; margin-left: 15px;\">").arg((*it).name());
++            translatorPageText += QString("<p style=\"margin: 0px;\">%1</p>").arg((*it).name());
+             if (!(*it).emailAddress().isEmpty())
+-                translatorPageText += QString("<a href=\"mailto:%1\">%1</a>").arg((*it).emailAddress());
+-            translatorPageText += "</p>";
++                translatorPageText += QString("<p style=\"margin: 0px; margin-left: 15px;\"><a href=\"mailto:%1\">%1</a></p>").arg((*it).emailAddress());
++            translatorPageText += "<br />";
+         }
+ 
+         translatorPageText += KAboutData::aboutTranslationTeam();
+--- a/kdeui/dialogs/kinputdialog.cpp
++++ b/kdeui/dialogs/kinputdialog.cpp
+@@ -446,7 +446,7 @@
+     if (_ok) {
+         if (editable)
+             result = dlg.comboBox()->currentText();
+-        else
++        else if( dlg.listBox()->currentItem())
+             result = dlg.listBox()->currentItem()->text();
+     }
+ 
+--- a/kdeui/jobs/kabstractwidgetjobtracker.cpp
++++ b/kdeui/jobs/kabstractwidgetjobtracker.cpp
+@@ -37,8 +37,8 @@
+     KAbstractWidgetJobTracker *const q;
+ 
+     struct MoreOptions {
+-        bool stopOnClose;
+-        bool autoDelete;
++        bool stopOnClose : 1;
++        bool autoDelete : 1;
+     };
+ 
+     QMap<KJob*, MoreOptions> moreOptions;
+--- a/kdeui/shortcuts/kdedglobalaccel.desktop
++++ b/kdeui/shortcuts/kdedglobalaccel.desktop
+@@ -15,6 +15,7 @@
+ Name[de]=KDED Server für globale Aktionen
+ Name[el]=Εξυπηρετητής καθολικών συντομεύσεων KDED
+ Name[es]=Servidor de accesos rápidos globales KDED
++Name[et]=KDED globaalsete kiirklahvide server
+ Name[fa]=کارساز میان‌برهای سراسری KDED
+ Name[ga]=Freastalaí Aicearraí Comhchoiteanna KDED
+ Name[he]=שרת הקיצורים הגלובלי של KDED
+@@ -25,6 +26,7 @@
+ Name[km]=KDED ម៉ាស៊ីន​បម្រើ​ផ្លូវ​កាត់​សកល
+ Name[kn]=ಕೆಡಿಇಡಿ ಸಾರ್ವತ್ರಿಕ ಶೀಘ್ರಮಾರ್ಗಗಳ (ಶಾರ್ಟ್ ಕಟ್) ಪರಿಚಾರಕ (ಸರ್ವರ್)
+ Name[ko]=KDED 전역 단축키 서버
++Name[lv]=KDED globālo īsceļu serveris
+ Name[nds]=KDED-Server för globaal Tastkombinatschonen
+ Name[ne]=KDED विश्वब्यापी सर्टकट सर्भर
+ Name[nl]=KDED globale-sneltoetsen-server
+@@ -32,8 +34,11 @@
+ Name[pt]=Servidor de Atalhos Globais do KDED
+ Name[pt_BR]=Servidor de Atalhos Globais do KDED
+ Name[sl]=Globalni strežnik za bližnjice KDED
++Name[sr]=Глобални сервер за пречице (КДЕД)
++Name[sr at latin]=Globalni server za prečice (KDED)
+ Name[sv]=KDED-server för globala genvägar
+ Name[th]=เซิรฟเวอร์คีย์ลัดระบบ KDED
++Name[uk]=Сервер глобальних скорочень KDED
+ Name[wa]=Sierveu di rascourtis globås po KDED
+ Name[x-test]=xxKDED Global Shortcuts Serverxx
+ Name[zh_CN]=KDED 全局快捷键服务器
+--- a/kdeui/shortcuts/kstandardshortcut.cpp
++++ b/kdeui/shortcuts/kstandardshortcut.cpp
+@@ -17,7 +17,6 @@
+     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
+ */
+-#define KSTDACCEL_CPP 1
+ 
+ #include "kstandardshortcut.h"
+ 
+@@ -87,8 +86,9 @@
+ 	{ Replace,             I18N_NOOP2("@action","Replace"), 0,  CTRL(R), 0, KShortcut(), false },
+ 
+ //Group Navigation
+-	{ Home,                I18N_NOOP2("@action Opposite to End","Home"), 0, CTRL(Home), Qt::Key_HomePage, KShortcut(), false },
+-	{ End,                 I18N_NOOP2("@action","End"), 0,      CTRL(End), 0, KShortcut(), false },
++	{ Home,                I18N_NOOP2("@action Go to main page","Home"), 0, ALT(Home), Qt::Key_HomePage, KShortcut(), false },
++	{ Begin,               I18N_NOOP2("@action Beginning of document","Begin"), 0, CTRL(Home), Qt::Key_Home, KShortcut(), false },
++	{ End,                 I18N_NOOP2("@action End of document","End"), 0,      CTRL(End), 0, KShortcut(), false },
+ 	{ Prior,               I18N_NOOP2("@action","Prior"), 0,    Qt::Key_PageUp, 0,KShortcut(), false },
+ 	{ Next,                I18N_NOOP2("@action Opposite to Prior","Next"), 0, Qt::Key_PageDown, 0, KShortcut(), false },
+ 
+@@ -277,6 +277,7 @@
+ const KShortcut& findPrev()              { return shortcut( FindPrev ); }
+ const KShortcut& replace()               { return shortcut( Replace ); }
+ const KShortcut& home()                  { return shortcut( Home ); }
++const KShortcut& begin()                 { return shortcut( Begin ); }
+ const KShortcut& end()                   { return shortcut( End ); }
+ const KShortcut& beginningOfLine()       { return shortcut( BeginningOfLine ); }
+ const KShortcut& endOfLine()             { return shortcut( EndOfLine ); }
+@@ -308,5 +309,3 @@
+ const KShortcut& showMenubar()           { return shortcut( ShowMenubar ); }
+ 
+ }
+-
+-#undef KSTDACCEL_CPP
+--- a/kdeui/shortcuts/kstandardshortcut.h
++++ b/kdeui/shortcuts/kstandardshortcut.h
+@@ -36,11 +36,12 @@
+ { // STUFF WILL BREAK IF YOU DON'T READ THIS!!!
+   /*
+    *Always add new std-accels to the end of this enum, never in the middle!
+-   *Don't forget to add the corresponding entries in g_infoStandardShortcut[] in kstdaccel.cpp, too.
++   *Don't forget to add the corresponding entries in g_infoStandardShortcut[] in kstandardshortcut.cpp, too.
+    *Values of elements here and positions of the corresponding entries in
+    *the big array g_infoStandardShortcut[] ABSOLUTELY MUST BE THE SAME.
+    * !!!    !!!!   !!!!!    !!!!
+    *    !!!!    !!!     !!!!    !!!!
++   * Remember to also update kdoctools/genshortcutents.cpp.
+    */
+ 
+   /**
+@@ -60,7 +61,7 @@
+     SelectAll, Deselect, DeleteWordBack, DeleteWordForward,
+     Find, FindNext, FindPrev, Replace,
+     // Navigation
+-    Home, End, Prior, Next,
++    Home, Begin, End, Prior, Next,
+     Up, Back, Forward, Reload,
+     // Text Navigation
+     BeginningOfLine, EndOfLine, GotoLine,
+@@ -75,7 +76,11 @@
+     // Text completion
+     TextCompletion, PrevCompletion, NextCompletion, SubstringCompletion,
+ 
+-    RotateUp, RotateDown
++    RotateUp, RotateDown,
++
++    // Insert new items here!
++
++    StandardShortcutCount // number of standard shortcuts
+   };
+ 
+   /**
+@@ -273,12 +278,18 @@
+   KDEUI_EXPORT const KShortcut &insert();
+ 
+   /**
+-   * Goto beginning of the document. Default: Ctrl-Home
++   * Goto home page. Default: Alt-Home
+    * @return the shortcut of the standard accelerator
+    */
+   KDEUI_EXPORT const KShortcut &home();
+ 
+   /**
++   * Goto beginning of the document. Default: Ctrl-Home
++   * @return the shortcut of the standard accelerator
++   */
++  KDEUI_EXPORT const KShortcut &begin();
++
++  /**
+    * Goto end of the document. Default: Ctrl-End
+    * @return the shortcut of the standard accelerator
+    */
+--- a/kdeui/shortcuts/kdedglobalaccel.cpp
++++ b/kdeui/shortcuts/kdedglobalaccel.cpp
+@@ -236,8 +236,10 @@
+         if (!ad->isPresent && setPresent) {
+             ad->isPresent = true;
+             foreach (int key, ad->keys)
+-                if (key != 0)
++                if (key != 0) {
++                    Q_ASSERT(d->keyToAction.value(key) == ad);
+                     d->impl->grabKey(key, true);
++                }
+         }
+         ad->isDefaultEmpty = isDefaultEmpty;
+         return ad->keys;
+@@ -307,8 +309,10 @@
+     }
+ 
+     if (ad->isPresent)
+-        foreach (int key, added)
++        foreach (int key, added) {
++            Q_ASSERT(d->keyToAction.value(key) == ad);
+             d->impl->grabKey(key, true);
++        }
+ 
+     scheduleWriteSettings();
+ 
+@@ -468,7 +472,7 @@
+     QStringList data = ad->actionId;
+ #ifdef Q_WS_X11
+     // pass X11 timestamp
+-    data.append( QString::number( QX11Info::appTime()));
++    data.append(QString::number(QX11Info::appTime()));
+ #endif
+     emit invokeAction(data);
+     return true;
+--- a/kdeui/actions/krecentfilesaction.cpp
++++ b/kdeui/actions/krecentfilesaction.cpp
+@@ -133,11 +133,11 @@
+         break;
+       }
+     }
+-    // remove last item if already maxitems in list
++    // remove oldest item if already maxitems in list
+     if( d->m_maxItems && selectableActionGroup()->actions().count() == d->m_maxItems )
+     {
+-        // remove last item
+-        delete removeAction(selectableActionGroup()->actions().last());
++        // remove oldest added item
++        delete removeAction(selectableActionGroup()->actions().first());
+     }
+ 
+     if (d->m_noEntriesAction) removeAction(d->m_noEntriesAction)->deleteLater();
+--- a/kdeui/actions/kstandardaction.h
++++ b/kdeui/actions/kstandardaction.h
+@@ -135,7 +135,7 @@
+     Zoom, Redisplay,
+ 
+     // Go Menu
+-    Up, Back, Forward, Home, Prior, Next, Goto, GotoPage, GotoLine,
++    Up, Back, Forward, Home /*Home page*/, Prior, Next, Goto, GotoPage, GotoLine,
+     FirstPage, LastPage,
+ 
+     // Bookmarks Menu
+@@ -153,7 +153,7 @@
+     Help, HelpContents, WhatsThis, ReportBug, AboutApp, AboutKDE,
+     TipofDay,
+ 
+-    // Another settings menu item
++    // Other standard actions
+     ConfigureNotifications,
+     FullScreen,
+     Clear,
+--- a/kdeui/actions/kfontaction.cpp
++++ b/kdeui/actions/kfontaction.cpp
+@@ -9,6 +9,7 @@
+               (C) 2002 Joseph Wenninger <jowenn at kde.org>
+               (C) 2003 Andras Mantia <amantia at kde.org>
+               (C) 2005-2006 Hamish Rodda <rodda at kde.org>
++              (C) 2007 Clarence Dang <dang at kde.org>
+ 
+     This library is free software; you can redistribute it and/or
+     modify it under the terms of the GNU Library General Public
+@@ -40,17 +41,27 @@
+ {
+     public:
+         KFontActionPrivate(KFontAction *parent)
+-            : q(parent)
++            : q(parent),
++              settingFont(0)
+         {
+         }
+ 
+         void _k_slotFontChanged(const QFont &font)
+         {
++            kDebug(129) << "QFontComboBox - slotFontChanged("
++                        << font.family() << ") settingFont=" << settingFont;
++            if (settingFont)
++                return;
++
++            q->setFont(font.family());
+             q->triggered(font.family());
++
++            kDebug(129) << "\tslotFontChanged done";
+         }
+ 
+ 
+         KFontAction *q;
++        int settingFont;
+ };
+ 
+ KFontAction::KFontAction(uint fontListCriteria, QObject *parent)
+@@ -101,6 +112,8 @@
+ 
+ QWidget* KFontAction::createWidget(QWidget* _parent)
+ {
++    kDebug(129) << "KFontAction::createWidget()";
++
+     QToolBar *parent = qobject_cast<QToolBar *>(_parent);
+     if (!parent)
+         return KSelectAction::createWidget(_parent);
+@@ -108,7 +121,16 @@
+ #ifdef __GNUC__
+ #warning FIXME: items need to be converted
+ #endif
++    // This is the visual element on the screen.  This method overrides
++    // the KSelectAction one, preventing KSelectAction from creating its
++    // regular KComboBox.
+     QFontComboBox *cb = new QFontComboBox( parent );
++
++    kDebug(129) << "\tset=" << font();
++    // Do this before connecting the signal so that nothing will fire.
++    cb->setCurrentFont( QFont( font().toLower() ) );
++    kDebug(129) << "\tspit back=" << cb->currentFont().family();
++
+     connect( cb, SIGNAL( currentFontChanged( const QFont & ) ), SLOT(_k_slotFontChanged( const QFont&  ) ) );
+     cb->setMinimumWidth( cb->sizeHint().width() );
+     return cb;
+@@ -119,6 +141,26 @@
+  */
+ void KFontAction::setFont( const QString &family )
+ {
++    kDebug(129) << "KFontAction::setFont(" << family << ")";
++
++    // Supress triggered(QString) signal and prevent recursive call to ourself.
++    d->settingFont++;
++
++    foreach(QWidget *w, createdWidgets())
++    {
++        QFontComboBox *cb = qobject_cast<QFontComboBox *>(w);
++        kDebug(129) << "\tw=" << w << "cb=" << cb;
++
++        if(!cb) continue;
++
++        cb->setCurrentFont(QFont(family.toLower()));
++        kDebug(129) << "\t\tw spit back=" << cb->currentFont().family();
++    }
++
++    d->settingFont--;
++
++    kDebug(129) << "\tcalling setCurrentAction()";
++
+     QString lowerName = family.toLower();
+     if (setCurrentAction(lowerName, Qt::CaseInsensitive))
+        return;
+@@ -136,6 +178,8 @@
+     if (setCurrentAction(lowerName, Qt::CaseInsensitive))
+       return;
+ 
++    // TODO: Inconsistent state if QFontComboBox::setCurrentFont() succeeded
++    //       but setCurrentAction() did not and vice-versa.
+     kDebug(129) << "Font not found " << family.toLower();
+ }
+ 
+--- a/kdeui/actions/kactioncollection.cpp
++++ b/kdeui/actions/kactioncollection.cpp
+@@ -75,10 +75,11 @@
+ 
+   QList<QWidget*> associatedWidgets;
+ 
+-  bool configIsGlobal;
+   QString configGroup;
++  bool configIsGlobal : 1;
+ 
+-  bool connectTriggered, connectHighlighted;
++  bool connectTriggered : 1;
++  bool connectHighlighted : 1;
+ 
+   KActionCollection *q;
+ };
+--- a/kdeui/actions/kstandardaction.cpp
++++ b/kdeui/actions/kstandardaction.cpp
+@@ -81,7 +81,7 @@
+         break;
+ 
+       case Home:
+-        sLabel = i18nc( "beginning (of line)", "&Home" );
++        sLabel = i18nc( "home page", "&Home" );
+         break;
+       case Help:
+         sLabel = i18nc( "show help", "&Help" );
+--- a/kdeui/actions/kselectaction_p.h
++++ b/kdeui/actions/kselectaction_p.h
+@@ -64,7 +64,8 @@
+ 
+   void init(KSelectAction*);
+ 
+-  bool m_edit, m_menuAccelsEnabled;
++  bool m_edit : 1;
++  bool m_menuAccelsEnabled : 1;
+   int m_comboWidth;
+   int m_maxComboViewCount;
+ 
+--- a/kdeui/actions/kstandardaction_p.h
++++ b/kdeui/actions/kstandardaction_p.h
+@@ -85,7 +85,7 @@
+   { Goto,          KStandardShortcut::AccelNone, "go_goto", I18N_NOOP("&Go To..."), 0, 0 },
+   { GotoPage,      KStandardShortcut::AccelNone, "go_goto_page", I18N_NOOP("&Go to Page..."), 0, "go-jump" },
+   { GotoLine,      KStandardShortcut::GotoLine, "go_goto_line", I18N_NOOP("&Go to Line..."), 0, 0 },
+-  { FirstPage,     KStandardShortcut::Home, "go_first", I18N_NOOP("&First Page"), 0, "go-first" },
++  { FirstPage,     KStandardShortcut::Begin, "go_first", I18N_NOOP("&First Page"), 0, "go-first" },
+   { LastPage,      KStandardShortcut::End, "go_last", I18N_NOOP("&Last Page"), 0, "go-last" },
+ 
+   { AddBookmark,   KStandardShortcut::AddBookmark, "bookmark_add", I18N_NOOP("&Add Bookmark"), 0, "bookmark-new" },
+@@ -101,7 +101,7 @@
+   { KeyBindings,   KStandardShortcut::AccelNone, "options_configure_keybinding", I18N_NOOP("Configure S&hortcuts..."), 0,"configure-shortcuts" },
+   { Preferences,   KStandardShortcut::AccelNone, "options_configure", I18N_NOOP("&Configure %1..."), 0, "configure" },
+   { ConfigureToolbars, KStandardShortcut::AccelNone, "options_configure_toolbars", I18N_NOOP("Configure Tool&bars..."), 0,"configure-toolbars" },
+-  { ConfigureNotifications, KStandardShortcut::AccelNone, "options_configure_notifications", I18N_NOOP("Configure &Notifications..."), 0, "knotify" },
++  { ConfigureNotifications, KStandardShortcut::AccelNone, "options_configure_notifications", I18N_NOOP("Configure &Notifications..."), 0, "preferences-desktop-notification" },
+ 
+   // the idea here is that Contents is used in menus, and Help in dialogs, so both share the same
+   // shortcut
+--- a/kdeui/plotting/kplotaxis.cpp
++++ b/kdeui/plotting/kplotaxis.cpp
+@@ -38,8 +38,8 @@
+ 
+         KPlotAxis *q;
+ 
+-        bool m_visible; // Property "visible" defines if Axis is drawn or not.
+-        bool m_showTickLabels;
++        bool m_visible : 1; // Property "visible" defines if Axis is drawn or not.
++        bool m_showTickLabels : 1;
+         char m_labelFmt; // Number format for number labels, see QString::arg()
+         QString m_label; // The label of the axis.
+         int m_labelFieldWidth; // Field width for number labels, see QString::arg()
+--- a/kdeui/plotting/kplotwidget.cpp
++++ b/kdeui/plotting/kplotwidget.cpp
+@@ -84,7 +84,9 @@
+     //Colors
+     QColor cBackground, cForeground, cGrid;
+     //draw options
+-    bool showGrid, showObjectToolTip, useAntialias;
++    bool showGrid : 1;
++    bool showObjectToolTip : 1;
++    bool useAntialias : 1;
+     //padding
+     int leftPadding, rightPadding, topPadding, bottomPadding;
+     // hashmap with the axes we have
+--- a/kdeui/colors/kcolordialog.cpp
++++ b/kdeui/colors/kcolordialog.cpp
+@@ -1154,7 +1154,7 @@
+   button->setIcon( KIcon("color-picker"));
+   int commonHeight = addButton->sizeHint().height();
+   button->setMinimumHeight( commonHeight );
+-  kDebug() << commonHeight;
++  //kDebug() << commonHeight;
+   button->setIconSize(QSize(commonHeight, commonHeight));
+   l_hbox->addWidget(button, 0, Qt::AlignHCenter );
+   connect( button, SIGNAL( clicked()), SLOT( slotColorPicker()));
+--- a/kdeui/colors/kcolorcombo.cpp
++++ b/kdeui/colors/kcolorcombo.cpp
+@@ -155,7 +155,7 @@
+ K_GLOBAL_STATIC_WITH_ARGS(QVector<QColor>, standardPalette, (STANDARD_PAL_SIZE))
+ static void createStandardPalette()
+ {
+-    if ( standardPalette )
++    if ( standardPalette->isEmpty() )
+         return;
+ 
+     int i = 0;
+--- a/kdeui/colors/kcolorbutton.cpp
++++ b/kdeui/colors/kcolorbutton.cpp
+@@ -44,9 +44,9 @@
+ 
+     KColorButton *q;
+     QColor m_defaultColor;
+-    bool m_bdefaultColor;
++    bool m_bdefaultColor : 1;
+ 
+-    bool dragFlag;
++    bool dragFlag : 1;
+     QColor col;
+     QPoint mPos;
+ 
+--- a/kdeui/tests/kxmlguitest.cpp
++++ b/kdeui/tests/kxmlguitest.cpp
+@@ -47,7 +47,7 @@
+     a = new KAction( KIcon( "view-left-right" ), "Split", shell );
+     shell->actionCollection()->addAction( "splitviewh", a );
+ 
+-    shell->setXMLFile( "./kxmlguitest_shell.rc" );
++    shell->setXMLFile( KDESRCDIR "/kxmlguitest_shell.rc" );
+ 
+     factory->addClient( shell );
+ 
+@@ -60,7 +60,7 @@
+     a->setShortcut( KShortcut(Qt::ALT + Qt::Key_1), KAction::DefaultShortcut );
+     a->connect( a, SIGNAL(triggered(bool)), part, SLOT( slotSec() ) );
+ 
+-    part->setXMLFile( "./kxmlguitest_part.rc" );
++    part->setXMLFile( KDESRCDIR "/kxmlguitest_part.rc" );
+ 
+     factory->addClient( part );
+     for ( int i = 0; i < 10; ++i )
+--- a/kdeui/widgets/kcmodule.cpp
++++ b/kdeui/widgets/kcmodule.cpp
+@@ -51,16 +51,16 @@
+     KComponentData _componentData;
+     const KAboutData *_about;
+     QString _rootOnlyMessage;
+-    bool _useRootOnlyMessage;
+-    bool _firstshow;
+     QList<KConfigDialogManager*> managers;
+     QString _quickHelp;
++    bool _useRootOnlyMessage : 1;
++    bool _firstshow : 1;
+ 
+     // this member is used to record the state on non-automatically
+     // managed widgets, allowing for mixed KConfigXT-drive and manual
+     // widgets to coexist peacefully and do the correct thing with
+     // the changed(bool) signal
+-    bool _unmanagedWidgetChangeState;
++    bool _unmanagedWidgetChangeState : 1;
+ };
+ 
+ KCModule::KCModule( QWidget *parent, const char *name, const QStringList& )
+--- a/kdeui/widgets/ktextedit.cpp
++++ b/kdeui/widgets/ktextedit.cpp
+@@ -59,7 +59,7 @@
+     void spellCheckerCorrected( const QString &, int,const QString &);
+     void spellCheckerAutoCorrect(const QString&,const QString&);
+     void spellCheckerCanceled();
+-    
++
+     void spellCheckerFinished();
+     void toggleAutoSpellCheck();
+     void slotAllowTab();
+@@ -69,9 +69,9 @@
+     QAction *autoSpellCheckAction;
+     QAction *allowTab;
+     QAction *spellCheckAction;
+-    bool customPalette;
++    bool customPalette : 1;
+ 
+-    bool checkSpellingEnabled;
++    bool checkSpellingEnabled : 1;
+     QString originalBuffer;
+     QString spellChechingConfigFileName;
+     Sonnet::Highlighter *highlighter;
+@@ -226,7 +226,7 @@
+     } while ( moved && verticalScrollBar()->value() > targetY );
+     event->accept();
+     return;
+-  } else if ( KStandardShortcut::home().contains( key ) ) {
++  } else if ( KStandardShortcut::begin().contains( key ) ) {
+     QTextCursor cursor = textCursor();
+     cursor.movePosition( QTextCursor::Start );
+     setTextCursor( cursor );
+--- a/kdeui/widgets/kurllabel.cpp
++++ b/kdeui/widgets/kurllabel.cpp
+@@ -74,12 +74,12 @@
+     QColor linkColor;
+     QColor highlightedLinkColor;
+     QCursor* cursor;
+-    bool textUnderlined;
+-    bool realUnderlined;
+-    bool useTips;
+-    bool useCursor;
+-    bool glowEnabled;
+-    bool floatEnabled;
++    bool textUnderlined : 1;
++    bool realUnderlined : 1;
++    bool useTips : 1;
++    bool useCursor : 1;
++    bool glowEnabled : 1;
++    bool floatEnabled : 1;
+     QPixmap alternatePixmap;
+     QPixmap realPixmap;
+     QTimer* timer;
+--- a/kdeui/widgets/kstringvalidator.cpp
++++ b/kdeui/widgets/kstringvalidator.cpp
+@@ -25,8 +25,8 @@
+ {
+   public:
+     QStringList mStringList;
+-    bool mRejecting;
+-    bool mFixupEnabled;
++    bool mRejecting : 1;
++    bool mFixupEnabled : 1;
+ };
+ 
+ //
+--- a/kdeui/widgets/kactionselector.cpp
++++ b/kdeui/widgets/kactionselector.cpp
+@@ -38,10 +38,11 @@
+   QListWidget *availableListWidget, *selectedListWidget;
+   QToolButton *btnAdd, *btnRemove, *btnUp, *btnDown;
+   QLabel *lAvailable, *lSelected;
+-  bool moveOnDoubleClick, keyboardEnabled;
++  bool moveOnDoubleClick : 1;
++  bool keyboardEnabled : 1;
++  bool showUpDownButtons : 1;
+   QString addIcon, removeIcon, upIcon, downIcon;
+   KActionSelector::InsertionPolicy availableInsertionPolicy, selectedInsertionPolicy;
+-  bool showUpDownButtons;
+ 
+   /**
+     Move item @p item to the other listbox
+--- a/kdeui/widgets/klanguagebutton.cpp
++++ b/kdeui/widgets/klanguagebutton.cpp
+@@ -70,8 +70,8 @@
+   QMenu *popup;
+   QString current;
+   const KLocale *locale;
+-  bool staticText;
+-  bool showCodes;
++  bool staticText : 1;
++  bool showCodes : 1;
+ };
+ 
+ KLanguageButton::KLanguageButton( QWidget * parent )
+--- a/kdeui/widgets/klineedit.cpp
++++ b/kdeui/widgets/klineedit.cpp
+@@ -244,7 +244,7 @@
+ 
+         // we don't need to check for RTL here as Qt does that for us
+         // when it comes to style sheets
+-        kDebug() << "setting padding right to " << buttonWidth;
++        //kDebug() << "setting padding right to" << buttonWidth;
+         setStyleSheet( QString( "QLineEdit { padding-right: %1; }" )
+                        .arg( buttonWidth ) );
+     }
+--- a/kdeui/widgets/kcompletionbox.cpp
++++ b/kdeui/widgets/kcompletionbox.cpp
+@@ -39,10 +39,10 @@
+ public:
+     QWidget *m_parent; // necessary to set the focus back
+     QString cancelText;
+-    bool tabHandling;
+-    bool down_workaround;
+-    bool upwardBox;
+-    bool emitSelected;
++    bool tabHandling : 1;
++    bool down_workaround : 1;
++    bool upwardBox : 1;
++    bool emitSelected : 1;
+ };
+ 
+ KCompletionBox::KCompletionBox( QWidget *parent )
+--- a/kdeui/widgets/kdatetable.cpp
++++ b/kdeui/widgets/kdatetable.cpp
+@@ -7,12 +7,12 @@
+     modify it under the terms of the GNU Library General Public
+     License as published by the Free Software Foundation; either
+     version 2 of the License, or (at your option) any later version.
+- 
++
+     This library 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
+     Library General Public License for more details.
+- 
++
+     You should have received a copy of the GNU Library General Public License
+     along with this library; see the file COPYING.LIB.  If not, write to
+     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+@@ -106,8 +106,8 @@
+      */
+     int numDayColumns;
+ 
+-    bool popupMenuEnabled;
+-    bool useCustomColors;
++    bool popupMenuEnabled : 1;
++    bool useCustomColors : 1;
+ 
+     struct DatePaintingMode
+     {
+@@ -242,7 +242,7 @@
+     connect( prior, SIGNAL( triggered( bool ) ), SLOT( previousMonth() ) );
+ 
+     QAction* beginMonth = localCollection->addAction( QLatin1String( "beginMonth" ) );
+-    beginMonth->setShortcuts( KStandardShortcut::home() );
++    beginMonth->setShortcuts( KStandardShortcut::begin() );
+     connect( beginMonth, SIGNAL( triggered( bool ) ), SLOT( beginningOfMonth() ) );
+ 
+     QAction* endMonth = localCollection->addAction( QLatin1String( "endMonth" ) );
+@@ -489,7 +489,7 @@
+ void KDateTable::KDateTablePrivate::endOfWeek()
+ {
+     // setDate does validity checking for us
+-    q->setDate( q->calendar()->addDays( mDate, 
++    q->setDate( q->calendar()->addDays( mDate,
+                 q->calendar()->daysInWeek( mDate ) - q->calendar()->dayOfWeek( mDate ) ) );
+ }
+ 
+@@ -638,7 +638,7 @@
+     // set weekday number of first day of this month, but this may not be a valid date so fake
+     // it if needed e.g. in QDate Mon 1 Jan -4713 is not valid when it should be, so fake as day 1
+     QDate firstDayOfMonth;
+-    if ( calendar()->setYMD( firstDayOfMonth, 
++    if ( calendar()->setYMD( firstDayOfMonth,
+                              calendar()->year( d->mDate ), calendar()->month( d->mDate ), 1 ) ) {
+         d->weekDayFirstOfMonth = calendar()->dayOfWeek( firstDayOfMonth );
+     } else {
+--- a/kdeui/widgets/kmenubar.cpp
++++ b/kdeui/widgets/kmenubar.cpp
+@@ -93,11 +93,11 @@
+     int frameStyle; // only valid in toplevel mode
+     int lineWidth;  // dtto
+     int margin;     // dtto
+-    bool fallback_mode; // dtto
++    bool fallback_mode : 1; // dtto
+ 
+-    bool forcedTopLevel;
+-    bool topLevel;
+-    bool wasTopLevel; // when TLW is fullscreen, remember state
++    bool forcedTopLevel : 1;
++    bool topLevel : 1;
++    bool wasTopLevel : 1; // when TLW is fullscreen, remember state
+ 
+ #ifdef Q_WS_X11
+     KSelectionWatcher* selection;
+--- a/kdeui/widgets/ktoolbar.h
++++ b/kdeui/widgets/ktoolbar.h
+@@ -192,8 +192,6 @@
+   protected:
+     virtual void contextMenuEvent( QContextMenuEvent* );
+     virtual void actionEvent( QActionEvent* );
+-    void applyAppearanceSettings( KConfigGroup &cg, bool forceGlobal = false );
+-    QString settingsGroup() const;
+ 
+     // Draggable toolbar configuration
+     virtual void dragEnterEvent( QDragEnterEvent* );
+@@ -205,6 +203,8 @@
+     virtual void mouseReleaseEvent( QMouseEvent* );
+ 
+   private:
++    void applyAppearanceSettings( const KConfigGroup &cg, bool forceGlobal = false );
++
+     class Private;
+     Private* const d;
+ 
+--- a/kdeui/widgets/kmainwindow.cpp
++++ b/kdeui/widgets/kmainwindow.cpp
+@@ -592,14 +592,11 @@
+     int n = 1; // Toolbar counter. toolbars are counted from 1,
+     foreach (KToolBar* toolbar, toolBars()) {
+         QString group;
+-        if (!configGroup.isEmpty())
+-        {
+-           // Give a number to the toolbar, but prefer a name if there is one,
+-           // because there's no real guarantee on the ordering of toolbars
+-           group = (toolbar->objectName().isEmpty() ? QString::number(n) : QString(" ")+toolbar->objectName());
+-           group.prepend(" Toolbar");
+-           group.prepend(configGroup);
+-        }
++        // Give a number to the toolbar, but prefer a name if there is one,
++        // because there's no real guarantee on the ordering of toolbars
++        group = (toolbar->objectName().isEmpty() ? QString::number(n) : QString(" ")+toolbar->objectName());
++        group.prepend(" Toolbar");
++        group.prepend(configGroup);
+         KConfigGroup groupGrp(cg.config(), group);
+         toolbar->saveSettings(groupGrp);
+         n++;
+--- a/kdeui/widgets/kruler.cpp
++++ b/kdeui/widgets/kruler.cpp
+@@ -75,9 +75,6 @@
+ class KRuler::KRulerPrivate
+ {
+ public:
+-  bool showpointer;
+-  bool showEndL;
+-  bool lengthFix;
+   int  endOffset_length;  /* marks the offset at the end of the ruler
+                            * i.e. right side at horizontal and down side
+                            * at vertical rulers.
+@@ -96,11 +93,15 @@
+   int mmDist;
+   int bmDist;
+   int offset;
+-  bool showtm; /* show tiny, little, medium, big, endmarks */
+-  bool showlm;
+-  bool showmm;
+-  bool showbm;
+-  bool showem;
++  bool showtm : 1; /* show tiny, little, medium, big, endmarks */
++  bool showlm : 1;
++  bool showmm : 1;
++  bool showbm : 1;
++  bool showem : 1;
++
++  bool showpointer : 1;
++  bool showEndL : 1;
++  bool lengthFix : 1;
+ 
+   double ppm; /* pixel per mark */
+ 
+--- a/kdeui/widgets/ktitlewidget.h
++++ b/kdeui/widgets/ktitlewidget.h
+@@ -89,7 +89,7 @@
+     };
+ 
+     /**
+-     * Constructs a progress bar with the given @param parent.
++     * Constructs a title widget with the given @param parent.
+      */
+     explicit KTitleWidget(QWidget *parent = 0);
+ 
+--- a/kdeui/widgets/ktabbar.cpp
++++ b/kdeui/widgets/ktabbar.cpp
+@@ -59,8 +59,8 @@
+ 
+     //bool mHoverCloseButtonEnabled;
+     //bool mHoverCloseButtonDelayed;
+-    bool mTabReorderingEnabled;
+-    bool mTabCloseActivatePrevious;
++    bool mTabReorderingEnabled : 1;
++    bool mTabCloseActivatePrevious : 1;
+ 
+ };
+ 
+--- a/kdeui/widgets/ksqueezedtextlabel.h
++++ b/kdeui/widgets/ksqueezedtextlabel.h
+@@ -76,6 +76,20 @@
+   void setTextElideMode( Qt::TextElideMode mode );
+ 
+ public Q_SLOTS:
++  /**
++   * Sets the text. Note that this is not technically a reimplementation of QLabel::setText(),
++   * which is not virtual (in Qt 4.3). Therefore, you may need to cast the object to
++   * KSqueezedTextLabel in some situations:
++   * \Example
++   * \code
++   * KSqueezedTextLabel* squeezed = new KSqueezedTextLabel("text", parent);
++   * QLabel* label = squeezed;
++   * label->setText("new text");	// this will not work
++   * squeezed->setText("new text");	// works as expected
++   * static_cast<KSqueezedTextLabel*>(label)->setText("new text");	// works as expected
++   * \endcode
++   * @param mode The new text.
++   */
+   void setText( const QString &text );
+ 
+ protected:
+--- a/kdeui/widgets/ktoolbar.cpp
++++ b/kdeui/widgets/ktoolbar.cpp
+@@ -154,8 +154,8 @@
+     // Default Values.
+     int IconSizeDefault;
+     Qt::ToolButtonStyle ToolButtonStyleDefault;
+-    bool HiddenDefault;
+-    bool NewLineDefault;
++    bool HiddenDefault : 1;
++    bool NewLineDefault : 1;
+     int OffsetDefault;
+     QString PositionDefault;
+ 
+@@ -664,27 +664,9 @@
+   return d->enableContext;
+ }
+ 
+-QString KToolBar::settingsGroup() const
++void KToolBar::saveSettings( KConfigGroup &cg )
+ {
+-  QString configGroup;
+-  if ( objectName().isEmpty() || d->isMainToolBar() )
+-    configGroup = "Toolbar style";
+-  else
+-    configGroup = QString( objectName() ) + " Toolbar style";
+-
+-  if ( mainWindow() ) {
+-    configGroup.prepend(" ");
+-    configGroup.prepend( mainWindow()->objectName() );
+-  }
+-
+-  return configGroup;
+-}
+-
+-void KToolBar::saveSettings( KConfigGroup &_cg )
+-{
+-  KConfigGroup cg = _cg;
+-    if ( cg.name().isEmpty() )
+-        cg.changeGroup(settingsGroup());
++    Q_ASSERT(!cg.name().isEmpty());
+ 
+   QString position;
+   Qt::ToolButtonStyle ToolButtonStyle;
+@@ -722,18 +704,14 @@
+     // The whole set of indexes has to be saved.
+     //kDebug(220) << name() << "                writing index " << index;
+ 
+-    // don't save if there's only one toolbar
+-
+-    // Don't use kmw->toolBarIterator() because you might
+-    // mess up someone else's iterator.  Make the list on your own
+-
+-    /* FIXME KMainWindow port - no replacement
+-    QList<KToolBar*> toolbarList = mainWindow()->findChildren<KToolBar*>();
++    KMainWindow* kmw = mainWindow();
++    QList<KToolBar*> toolbarList = kmw->findChildren<KToolBar*>();
+ 
++    // don't save if there's only one toolbar
+     if ( !kmw || toolbarList.count() > 1 )
+         cg.writeEntry("Index", index);
+     else
+-        cg.revertToDefault("Index");*/
++        cg.revertToDefault("Index");
+ 
+     /* FIXME KMainWindow port - no replacement
+     if(!cg.hasDefault("Offset") && offset() == d->OffsetDefault )
+@@ -932,11 +910,9 @@
+   current.setAttribute( "toolButtonStyleDefault", d->toolButtonStyleToString( d->ToolButtonStyleDefault ) );
+ }
+ 
+-void KToolBar::applySettings( const KConfigGroup &_cg, bool force )
++void KToolBar::applySettings( const KConfigGroup &cg, bool force )
+ {
+-    KConfigGroup cg = _cg;
+-    if ( cg.name().isEmpty() )
+-        cg.changeGroup(settingsGroup());
++    Q_ASSERT( !cg.name().isEmpty() );
+ 
+   /*
+     Let's explain this a bit more in details.
+@@ -983,11 +959,9 @@
+   }
+ }
+ 
+-void KToolBar::applyAppearanceSettings( KConfigGroup &_cg, bool forceGlobal )
++void KToolBar::applyAppearanceSettings( const KConfigGroup &cg, bool forceGlobal )
+ {
+-    KConfigGroup cg = _cg;
+-    if ( cg.name().isEmpty() )
+-        cg.changeGroup(settingsGroup());
++    Q_ASSERT(! cg.name().isEmpty() );
+ 
+   // If we have application-specific settings in the XML file,
+   // and nothing in the application's config file, then
+@@ -1287,14 +1261,14 @@
+     QAction* act = tb->actions().first();
+     if ( event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonRelease ) {
+       QMouseEvent* me = static_cast<QMouseEvent*>( event );
+-      if ( me->button() == Qt::MidButton /*&& 
++      if ( me->button() == Qt::MidButton /*&&
+            act->receivers(SIGNAL(triggered(Qt::MouseButtons,Qt::KeyboardModifiers)))*/ ) {
+-        if ( me->type() == QEvent::MouseButtonPress )  
+-          tb->setDown(true); 
++        if ( me->type() == QEvent::MouseButtonPress )
++          tb->setDown(true);
+         else {
+           tb->setDown(false);
+           QMetaObject::invokeMethod(act, "triggered", Qt::DirectConnection,
+-               Q_ARG(Qt::MouseButtons, me->button()), 
++               Q_ARG(Qt::MouseButtons, me->button()),
+                Q_ARG(Qt::KeyboardModifiers, QApplication::keyboardModifiers() ));
+         }
+       }
+--- a/kdeui/icons/kicontheme.cpp
++++ b/kdeui/icons/kicontheme.cpp
+@@ -48,6 +48,10 @@
+ 
+ #include <kconfiggroup.h>
+ 
++// The following define exists because the Qt SVG renderer needs
++// to be improved. This will be removed soon. (ereslibre)
++#undef KDE_QT_SVG_RENDERER_FIXED
++
+ class KIconTheme::KIconThemePrivate
+ {
+ public:
+@@ -442,7 +446,7 @@
+                 ((size < dir->minSize()) || (size > dir->maxSize())))
+               continue;
+             if ((dir->type() == KIconLoader::Threshold) &&
+-		(abs(dir->size()-size) > dir->threshold()))
++                (abs(dir->size()-size) > dir->threshold()))
+                 continue;
+         } else
+         {
+@@ -471,8 +475,7 @@
+              it's a downscale, and we only had upscales befores.
+              This is to avoid scaling up unless we have to,
+              since that looks very ugly */
+-          if ((abs(dw) >= abs(delta)) ||
+-              (delta > 0 && dw < 0))
++          if ((abs(dw) >= abs(delta)) || (delta > 0 && dw < 0))
+             continue;
+         }
+ 
+@@ -480,18 +483,25 @@
+         if (path.isEmpty())
+             continue;
+         icon.path = path;
++// The following code has been commented out because the Qt SVG renderer needs
++// to be improved. If you are going to change/remove some code from this part,
++// please contact me before (ereslibre at kde.org), or kde-core-devel at kde.org. (ereslibre)
++#ifdef KDE_QT_SVG_RENDERER_FIXED
++        icon.size = size;
++#else
+         icon.size = dir->size();
++#endif
+         icon.type = dir->type();
+-	icon.threshold = dir->threshold();
++        icon.threshold = dir->threshold();
+         icon.context = dir->context();
+ 
+         // if we got in MatchExact that far, we find no better
+         if (match == KIconLoader::MatchExact)
+             return icon;
+-	else
++        else
+         {
+-	    delta = dw;
+-	    if (delta==0) return icon; // We won't find a better match anyway
++            delta = dw;
++            if (delta==0) return icon; // We won't find a better match anyway
+         }
+     }
+     return icon;
+--- a/kdeui/icons/kiconloader.cpp
++++ b/kdeui/icons/kiconloader.cpp
+@@ -56,6 +56,9 @@
+ #include <assert.h>
+ #include <kconfiggroup.h>
+ 
++// The following define exists because the Qt SVG renderer needs
++// to be improved. This will be removed soon. (ereslibre)
++#undef KDE_QT_SVG_RENDERER_FIXED
+ 
+ //#define NO_LAZYLOAD_ICONTHEME
+ 
+@@ -615,9 +618,39 @@
+     const_cast<KIconLoaderPrivate*>(this)->initIconThemes();
+ 
+     K3Icon icon;
+-    const char * const ext[4] = { ".png", ".svgz", ".svg", ".xpm" };
+ 
+-    /* To follow the XDG icon theme and icon naming specifications,
++// The following code has been commented out because the Qt SVG renderer needs
++// to be improved. If you are going to change/remove some code from this part,
++// please contact me before (ereslibre at kde.org), or kde-core-devel at kde.org. (ereslibre)
++#ifdef KDE_QT_SVG_RENDERER_FIXED
++    const char * ext1[4] = { ".png", ".svgz", ".svg", ".xpm" };
++    const char * ext2[4] = { ".svgz", ".svg", ".png", ".xpm" };
++    const char ** ext;
++
++    if (size == KIconLoader::SizeSmall ||
++        size == KIconLoader::SizeSmallMedium ||
++        size == KIconLoader::SizeMedium ||
++        size == KIconLoader::SizeLarge ||
++        size == KIconLoader::SizeHuge ||
++        size == KIconLoader::SizeEnormous)
++    {
++        ext = ext1; // size is standard, give preference to PNG over SVG when searching
++    }
++    else
++    {
++        ext = ext2; // size is non-standard, give preference to SVG over PNG when searching
++    }
++
++    /* If size parameter is a standard one, that means:
++
++           - KIconLoader::SizeSmall
++           - KIconLoader::SizeSmallMedium
++           - KIconLoader::SizeMedium
++           - KIconLoader::SizeLarge
++           - KIconLoader::SizeHuge
++           - KIconLoader::SizeEnormous
++
++       To follow the XDG icon theme and icon naming specifications,
+        the order in which we look for an icon is:
+ 
+        png, svgz, svg, xpm exact match
+@@ -638,7 +671,35 @@
+        (...)
+ 
+        and so on.
++
++       If size parameter is a non-standard one, then we give more preference to
++       SVG format since drawing SVG's gives better quality and despite being
++       slower than resizing a PNG image, the cases where non-standard sizes are
++       asked are very rare. For non-standard sizes what we have is:
++
++       svgz, svg, png, xpm exact match
++       svgz, svg, png, xpm best match
++       less specific fallback in this theme: svgz, svg, png, xpm exact match
++                                             svgz, svg, png, xpm best match
++       even less specific fallback in this theme: [same order]
++       (...)
++
++       next theme in inheritance tree: svgz, svg, png, xpm exact match
++                                       svgz, svg, png, xpm best match
++       less specific fallbacks in this next theme
++       (...)
++
++       next theme in inheritance tree: svgz, svg, png, xpm exact match
++                                       svgz, svg, png, xpm best match
++       less specific fallbacks in this next theme
++       (...)
++
++       and so on.
+        */
++#else
++    const char * const ext[4] = { ".png", ".svgz", ".svg", ".xpm" };
++#endif
++
+     foreach(KIconThemeNode *themeNode, links)
+     {
+         QStringList nameParts = name.split("-");
+@@ -646,6 +707,10 @@
+ 
+         while (!nameParts.isEmpty())
+         {
++// The following code has been commented out because the Qt SVG renderer needs
++// to be improved. If you are going to change/remove some code from this part,
++// please contact me before (ereslibre at kde.org), or kde-core-devel at kde.org. (ereslibre)
++#ifdef KDE_QT_SVG_RENDERER_FIXED
+             for (int i = 0 ; i < 4 ; i++)
+             {
+                 icon = themeNode->theme->iconPath(currentName + ext[i], size, KIconLoader::MatchExact);
+@@ -659,6 +724,18 @@
+                 if (icon.isValid())
+                     return icon;
+             }
++#else
++            for (int i = 0 ; i < 4 ; i++)
++            {
++                icon = themeNode->theme->iconPath(currentName + ext[i], size, KIconLoader::MatchExact);
++                if (icon.isValid())
++                    return icon;
++
++                icon = themeNode->theme->iconPath(currentName + ext[i], size, KIconLoader::MatchBest);
++                if (icon.isValid())
++                    return icon;
++            }
++#endif
+ 
+             nameParts.removeLast();
+             currentName = nameParts.join("-");
+@@ -981,10 +1058,15 @@
+     }
+ 
+     // Scale the icon and apply effects if necessary
++#ifndef KDE_QT_SVG_RENDERER_FIXED
++    // The following code needs to be removed after the SVG rendering has been
++    // fixed (please take a look at the comment above). Please do not remove the
++    // #if condition as it marks what needs to be removed (ereslibre)
+     if (iconType == KIconLoader::Scalable && size != img->width())
+     {
+         *img = img->scaled(size, size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+     }
++#endif
+     if (iconType == KIconLoader::Threshold && size != img->width())
+     {
+         if ( abs(size-img->width())>iconThreshold )
+--- a/kdeui/itemviews/kcategorizedsortfilterproxymodel_p.h
++++ b/kdeui/itemviews/kcategorizedsortfilterproxymodel_p.h
+@@ -212,10 +212,10 @@
+     Qt::SortOrder sortOrder;
+     Qt::CaseSensitivity sortCaseSensitivity;
+     int sortRole;
+-    bool sortLocaleAware;
++    bool sortLocaleAware : 1;
+ 
+-    bool dynamicSortFilter;
+-    bool categorizedModel;
++    bool dynamicSortFilter : 1;
++    bool categorizedModel : 1;
+ 
+     int filterColumn;
+     QRegExp filterRegExp;
+--- a/kdeui/itemviews/klistwidget.cpp
++++ b/kdeui/itemviews/klistwidget.cpp
+@@ -42,8 +42,8 @@
+         void _k_slotAutoSelect();
+ 
+         KListWidget *q;
+-        bool m_bUseSingle;
+-        bool m_bChangeCursorOverItem;
++        bool m_bUseSingle : 1;
++        bool m_bChangeCursorOverItem : 1;
+ 
+         QListWidgetItem* m_pCurrentItem;
+         QTimer* m_pAutoSelect;
+--- a/kdeui/itemviews/kcategorizedsortfilterproxymodel.cpp
++++ b/kdeui/itemviews/kcategorizedsortfilterproxymodel.cpp
+@@ -130,11 +130,11 @@
+ 
+ void KCategorizedSortFilterProxyModel::sort(int column, Qt::SortOrder order)
+ {
++    emit layoutAboutToBeChanged();
++
+     d->sortColumn = column;
+     d->sortOrder = order;
+ 
+-    emit layoutAboutToBeChanged();
+-
+     QModelIndexList sourceIndexes = d->storePersistentIndexes();
+ 
+     QMap<QModelIndex, Private::InternalInformation*>::const_iterator it = d->sourceIndexMap.constBegin();
+@@ -750,7 +750,13 @@
+ 
+ void KCategorizedSortFilterProxyModel::setCategorizedModel(bool categorizedModel)
+ {
++    if (categorizedModel == d->categorizedModel)
++    {
++        return;
++    }
++
+     d->categorizedModel = categorizedModel;
++    sort(d->sortColumn, d->sortOrder); // items need to be sorted again
+ }
+ 
+ void KCategorizedSortFilterProxyModel::setFilterWildcard(const QString &pattern)
+--- a/kdeui/findreplace/kfind_p.h
++++ b/kdeui/findreplace/kfind_p.h
+@@ -96,8 +96,8 @@
+     KFind *q;
+     QPointer<QWidget>  findDialog;
+     int                   currentId;
+-    bool                  customIds;
+-    bool                  patternChanged;
++    bool                  customIds : 1;
++    bool                  patternChanged : 1;
+     QString               matchedPattern;
+     QHash<QString,Match>  incrementalPath;
+     Match *               emptyMatch;
+@@ -112,8 +112,8 @@
+     QString text; // the text set by setData
+     int index;
+     int matchedLength;
+-    bool dialogClosed;
+-    bool lastResult;
++    bool dialogClosed : 1;
++    bool lastResult : 1;
+ };
+ 
+ #endif // KFIND_P_H
+--- a/kdeui/findreplace/kfinddialog_p.h
++++ b/kdeui/findreplace/kfinddialog_p.h
+@@ -41,8 +41,8 @@
+         : q(q),
+         regexpDialog(0),
+         regexpDialogQueryDone(false),
+-        enabled(KFind::WholeWordsOnly | KFind::FromCursor |  KFind::SelectedText | KFind::CaseSensitive | KFind::FindBackwards | KFind::RegularExpression),
+         initialShowDone(false),
++        enabled(KFind::WholeWordsOnly | KFind::FromCursor |  KFind::SelectedText | KFind::CaseSensitive | KFind::FindBackwards | KFind::RegularExpression),
+         findExtension(0)
+         {}
+ 
+@@ -57,9 +57,9 @@
+ 
+     KFindDialog *q;
+     QDialog *regexpDialog;
+-    bool regexpDialogQueryDone;
++    bool regexpDialogQueryDone : 1;
++    bool initialShowDone : 1;
+     long enabled; // uses Options to define which search options are enabled
+-    bool initialShowDone;
+     QStringList findStrings;
+     QString pattern;
+     QWidget *findExtension;
+--- a/kdeui/CMakeLists.txt
++++ b/kdeui/CMakeLists.txt
+@@ -69,6 +69,7 @@
+  dialogs/kconfigdialog.cpp
+  dialogs/kconfigdialogmanager.cpp
+  dialogs/kbugreport.cpp
++ dialogs/kdeprintdialog.cpp
+  dialogs/kdialog.cpp
+  dialogs/kedittoolbar.cpp
+  dialogs/kinputdialog.cpp
+@@ -327,6 +328,7 @@
+  dialogs/kbugreport.h
+  dialogs/kconfigdialog.h
+  dialogs/kconfigdialogmanager.h
++ dialogs/kdeprintdialog.h
+  dialogs/kdialog.h
+  dialogs/kedittoolbar.h
+  dialogs/kinputdialog.h
+--- a/kdeui/util/ksystemtrayicon.cpp
++++ b/kdeui/util/ksystemtrayicon.cpp
+@@ -64,8 +64,8 @@
+     KActionCollection* actionCollection;
+     KMenu* menu;
+     QWidget* window;
+-    bool onAllDesktops; // valid only when the parent widget was hidden
+-    bool hasQuit;
++    bool onAllDesktops : 1; // valid only when the parent widget was hidden
++    bool hasQuit : 1;
+ };
+ 
+ KSystemTrayIcon::KSystemTrayIcon( QWidget* parent )
+--- a/kdeui/util/kkeyserver_x11.cpp
++++ b/kdeui/util/kkeyserver_x11.cpp
+@@ -453,7 +453,7 @@
+ 	int symQt = keyQt & ~Qt::KeyboardModifierMask;
+ 
+ 	if( symQt < 0x1000 ) {
+-		*keySym = QChar(symQt).toLower().unicode();
++		*keySym = QChar(symQt).toUpper().unicode();
+ 		return true;
+ 	}
+ 
+@@ -477,7 +477,7 @@
+ 	*keyQt = Qt::Key_unknown;
+ 	if( keySym < 0x1000 ) {
+ 		if( keySym >= 'a' && keySym <= 'z' )
+-			*keyQt = QChar(keySym).toLower().unicode();
++			*keyQt = QChar(keySym).toUpper().unicode();
+ 		else
+ 			*keyQt = keySym;
+ 	}
+--- a/kdeui/util/kcompletion.cpp
++++ b/kdeui/util/kcompletion.cpp
+@@ -54,8 +54,8 @@
+     QString                myCurrentMatch;
+     KCompTreeNode *        myTreeRoot;
+     //QStringList            myRotations;
+-    bool                   myBeep;
+-    bool                   myIgnoreCase;
++    bool                   myBeep : 1;
++    bool                   myIgnoreCase : 1;
+     bool                   myHasMultipleMatches;
+     int                    myRotationIndex;
+ };
+--- a/security/crypto/crypto.desktop
++++ b/security/crypto/crypto.desktop
+@@ -3,7 +3,7 @@
+ Icon=preferences-desktop-cryptography
+ Type=Service
+ ServiceTypes=KCModule
+-Exec=kcmshell crypto
++Exec=kcmshell4 crypto
+ X-DocPath=kcontrol/crypto/index.html
+ 
+ X-KDE-Library=kcm_crypto
+@@ -16,6 +16,7 @@
+ Name[de]=Krypto
+ Name[el]=Κρυπτογράφηση
+ Name[es]=Criptografía
++Name[et]=Krüpto
+ Name[fa]=رمز
+ Name[he]=הצפנה
+ Name[hu]=Titkosítás
+@@ -24,11 +25,14 @@
+ Name[kn]=ಕ್ರಿಪ್ಟೋ
+ Name[ko]=암호화
+ Name[lt]=Šifravimas
++Name[lv]=Kriptogrāfija
+ Name[ne]=गुप्त
+ Name[pa]=ਕਰਿਪਟੂ
+ Name[pt]=Cifra
+ Name[ru]=Шифрование
+ Name[sl]=Šifriranje
++Name[sr]=Крипто
++Name[sr at latin]=Kripto
+ Name[sv]=Krypto
+ Name[th]=การเข้ารหัส
+ Name[vi]=Mật mã
+@@ -43,6 +47,7 @@
+ Comment[el]=Ρύθμιση SSL, διαχείριση πιστοποιητικών, και άλλες ρυθμίσεις κρυπτογραφίας
+ Comment[en_GB]=Configure SSL, manage certificates and other cryptography settings
+ Comment[es]=Configurar SSL, gestionar certificados y otras preferencias de criptografía
++Comment[et]=SSL-i seadistamine, sertifikaatide haldamine ja muud krüptoseadistused
+ Comment[fa]=پیکربندی SSL، مدیریت گواهی‌نامه‌ها، و تنظیمات رمزنگاری دیگر
+ Comment[ga]=Cumraigh SSL, bainistigh teastais, agus socruithe criptiúcháin eile
+ Comment[he]=שינוי הגדרות SSL, ניהול תעודות והגדרות הצפנה אחרות
+@@ -50,15 +55,19 @@
+ Comment[it]=Configura SSL, gestisce i certificati ed altre impostazioni di crittografia
+ Comment[ja]=SSL の設定、証明書の管理、その他の暗号作成形式の設定
+ Comment[kk]=SSL баптаулары, күаліктерді басқару және басқа криптография параметрлері
++Comment[km]=កំណត់​រចនា​សម្ព័ន្ធ SSL គ្រប់គ្រង​វិញ្ញាបនបត្រ និង​ការ​កំណត់​កូដសាស្ដ្រ
+ Comment[kn]=SSL ಅನ್ನು ಸಂರಚಿಸು, ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ನಿಭಾಯಿಸು, ಮತ್ತು ಇತರ ಗೂಢಲಿಪಿಶಾಸ್ತ್ರ (ಕ್ರಿಪ್ಟೋಗ್ರಫಿ) ಸಂಯೋಜನೆಗಳು
+ Comment[ko]=SSL과 같은 암호화를 설정하고, 인증서를 관리합니다
+ Comment[lt]=Derina SSL, tvarko sertifikatus ir kitus šifravimo parametrus
++Comment[lv]=Konfigurē SSL, pārvalda sertifikātus un citus kriptogrāfijas iestatījumus
+ Comment[nds]=SSL inrichten, Zertifikaten plegen un anner Verslötel-Instellen
+ Comment[ne]=SSL कन्फिगरेसन, प्रमाणपत्र प्रबन्ध, र अन्य गुप्तिकरण सेटिङ
+ Comment[nl]=Stel SSL in, beheer certificaten en configureer andere cryptografische instellingen
+ Comment[pt]=Configurar o SSL, gerir os certificados e outras opções de criptografia
+ Comment[pt_BR]=Configura SSL, gerencia certificados e outras configurações de criptografia
+ Comment[sl]=Nastavljanje SSL, upravljanje s potrdili in ostale nastavitve šifriranja
++Comment[sr]=Подешавање ССЛ-а, управљање сертификатима, и друге криптографске поставке
++Comment[sr at latin]=Podešavanje SSL-a, upravljanje sertifikatima, i druge kriptografske postavke
+ Comment[sv]=Anpassa SSL, hantera certifikat och andra kryptografiska inställningar
+ Comment[th]=ปรับแต่ง SSL, จัดการใบรับรอง, และการตั้งค่าเกี่ยวกับการเข้ารหัสอื่นๆ
+ Comment[vi]=Cấu hình SSL, quản lý chứng nhận và các thiết lập mật mã khác
+@@ -73,6 +82,7 @@
+ Keywords[de]=Crypto, Krypto, Kryptographie, Verschlüsselung, SSL, https, Zertifikate, Chiffren, TLS, sicher, Sicherheit
+ Keywords[el]=Κρυπτογράφηση,Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,πιστοποιητικά,ciphers,TLS,secure,security,ασφαλές,ασφάλεια
+ Keywords[es]=Criptografía,cifrado,SSL,https,certificados,código,códigos,TLS,seguro,seguridad
++Keywords[et]=Krüpto,Krüptograafia,krüptimine,SSL,https,sertificaadid,šifrid,TLS,turvalisus
+ Keywords[fa]=رمز، Krypto، رمزنگاری، رمزبندی، SSL، https، گواهی‌نامه‌ها، رمزها، TLS، امن، امنیت
+ Keywords[ga]=Crypto,Krypto,cripteagrafaíocht,criptiú,SSL,https,teastais,sifir,TLS,daingean,slándáil
+ Keywords[he]=הצפנה,SSL,https,תעודות,צפנים,TLS,אבטחה
+@@ -81,11 +91,14 @@
+ Keywords[ja]=暗号化,Krypto,暗号作成形式,暗号化,SSL,http,証明書,暗号,TLS,セキュア,セキュリティ
+ Keywords[ko]=암호화,보안,SSL,https,인증서,TLS
+ Keywords[lt]=Crypto,Krypto,Cryptography,kriptografija,encryption,šifravimas,SSL,https,certificates,sertifikatai,ciphers,šifrai,TLS,secure,saugus,security,saugumas,apsauga
++Keywords[lv]=Kriptogrāfija,šifrēšana,SSL,https,sertifikāti,čiperi,TLS,drošs,drošība
+ Keywords[nds]=Crypto,Krypto,Kryptografie,Verslöteln,SSL,https,Zertifikaten,Verslötelmetoden,TLS,seker,Sekerheit
+ Keywords[nl]=Crypto,Krypto,Cryptografie,encryptie,SSL,https,certificaten,ciphers,TLS,secure,security,veiligheid,beveiliging,versleuteling,
+ Keywords[pt]=Cifra,Criptografia,encriptação,SSL,HTTPS,certificados,cifras,TLS,seguro,segurança
+ Keywords[pt_BR]=Crypto,Krypto,Criptografia,encriptação,SSL,https,certificados,cifras,TLS,seguro,segurança
+ Keywords[sl]=Šifriranje,šifre,šifra,SSL,HTTPS,potrdila,TLS,varnost
++Keywords[sr]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,крипто,криптографија,шифровање,ССЛ,ХТТПС,сертификати,шифрари,ТЛС,безбедност
++Keywords[sr at latin]=Crypto,Krypto,Cryptography,encryption,SSL,https,certificates,ciphers,TLS,secure,security,kripto,kriptografija,šifrovanje,SSL,HTTPS,sertifikati,šifrari,TLS,bezbednost
+ Keywords[sv]=Krypto,Kryptografi,kryptering,SSL,https,certifikat,chiffer,TLS,säker,säkerhet
+ Keywords[th]=เข้า-ถอดรหัส,Krypto,เรื่องเกี่ยวกับการเข้า-ถอดรหัส,การเข้ารหัส,SSL,https,ใบรับรอง,ciphers,TLS,ปลอดภัย,ความปลอดภัย
+ Keywords[vi]=Crypto,mật mã,mã hoá,Krypto,Cryptography,encryption,SSL,https,certificates,chứng nhận,ciphers,TLS,secure,bảo mật,security
+--- a/security/kcert/kcertpart.cc
++++ b/security/kcert/kcertpart.cc
+@@ -784,7 +784,7 @@
+ 
+ 
+ void KCertPart::slotLaunch() {
+-	QProcess::startDetached("kcmshell", QStringList() << "crypto");
++	QProcess::startDetached("kcmshell4", QStringList() << "crypto");
+ }
+ 
+ 
+--- a/security/kcert/kcertpart.desktop
++++ b/security/kcert/kcertpart.desktop
+@@ -29,11 +29,12 @@
+ Comment[it]=Gestione integrabile dei certificati personali
+ Comment[ja]=埋め込み可能な個人証明書マネージャ
+ Comment[kk]=Ендірілетін дербес куәлік менеджері
+-Comment[km]=កម្មវិធី​គ្រប់គ្រង​វិញ្ញាបនបត្រ​ឯកជន​ដែល​អាច​បង្កប់
++Comment[km]=កម្មវិធី​គ្រប់គ្រង​វិញ្ញាបនបត្រ​ឯកជន​ដែល​អាច​បង្កប់​បាន
+ Comment[kn]=ಹುದುಗಿಸಬಹುದಾದ (ಎಂಬೆಡಬಲ್) ವೈಯಕ್ತಿಕ ಪ್ರಮಾಣಪತ್ರ ವ್ಯವಸ್ಥಾಪಕ
+ Comment[ko]=첨부할 수 있는 개인 인증서 관리자
+ Comment[lb]=Abettbare perséinlechen Zertifikatsmanager
+ Comment[lt]=Įdedama asmeninių sertifikatų tvarkyklė
++Comment[lv]=Iegulstams personīgo sertifikātu pārvaldnieks
+ Comment[mk]=Вгнездлив менаџер на лични сертификати
+ Comment[ms]=Pengurus Sijil Peribadi Boleh Serta
+ Comment[nb]=Innebyggbar personlig sertifikathåndterer
+@@ -49,8 +50,8 @@
+ Comment[ru]=Встраиваемый персональный менеджер сертификатов
+ Comment[se]=Vuojuhanláhkái persuvnnalaš duođaštusaid gieđahalli
+ Comment[sl]=Vgradljivi osebni upravljalnik certifikatov
+-Comment[sr]=Уградиви менаџер личних сертификата
+-Comment[sr at latin]=Ugradivi menadžer ličnih sertifikata
++Comment[sr]=Угњездиви менаџер личних сертификата
++Comment[sr at latin]=Ugnjezdivi menadžer ličnih sertifikata
+ Comment[sv]=Inbäddningsbar personlig certifikatshanterare
+ Comment[ta]=உட்பொதிந்த சொந்தச் சான்றிதழ் மேலாளர்
+ Comment[te]=పొదగబడె వక్తిగత ప్రమాణ పత్రాల అభికర్త
+@@ -74,6 +75,8 @@
+ Name[cy]=KRhanTyst
+ Name[eo]=Atestilo-parto
+ Name[kn]=ಕೆಸರ್ಟ್ ಪಾರ್ಟ್
++Name[sr]=Сертификатски део
++Name[sr at latin]=Sertifikatski deo
+ Name[sv]=Kcertpart
+ Name[ta]=கேசான்றிதழ்பகுதி
+ Name[te]=కెసెర్ట్ పార్ట్
+--- a/kutils/kprintpreview.h
++++ b/kutils/kprintpreview.h
+@@ -26,14 +26,38 @@
+ 
+ class KPrintPreviewPrivate;
+ 
++/**
++ * KPrintPreview provides a print preview dialog.
++ *
++ * Use it like this:
++ *
++ * @code
++ * QPrinter printer;
++ * KPrintPreview preview(&printer);
++ * doPrint(printer); // draws to the QPrinter
++ * preview.exec();
++ * @endcode
++ */
+ class KUTILS_EXPORT KPrintPreview : public KDialog
+ {
+     Q_OBJECT
+ 
+ public:
++    /**
++     * Create a KPrintPreview object.
++     *
++     * This will change the settings on the QPrinter, so you
++     * should not re-use the QPrinter object for printing
++     * normally.
++     *
++     * @param printer pointer to a QPrinter to configure for
++     *                print preview
++     * @param parent  pointer to the parent widget for the dialog
++     */
+     explicit KPrintPreview(QPrinter *printer, QWidget *parent = 0);
+     virtual ~KPrintPreview();
+ 
++protected:
+     void showEvent(QShowEvent *event);
+ 
+ private:
+--- a/kdecore/kernel/kcmdlineargs.cpp
++++ b/kdecore/kernel/kcmdlineargs.cpp
+@@ -167,8 +167,8 @@
+ 
+     int argc; // The original argc
+     char **argv; // The original argv
+-    bool parsed; // Whether we have parsed the arguments since calling init
+-    bool ignoreUnknown; // Ignore unknown options and arguments
++    bool parsed : 1; // Whether we have parsed the arguments since calling init
++    bool ignoreUnknown : 1; // Ignore unknown options and arguments
+     QString mCwd; // Current working directory. Important for KUnqiueApp!
+     KCmdLineArgs::StdCmdLineArgs mStdargs;
+ 
+--- a/kdecore/kernel/kstandarddirs.cpp
++++ b/kdecore/kernel/kstandarddirs.cpp
+@@ -67,9 +67,9 @@
+           checkRestrictions(true)
+     { }
+ 
+-    bool restrictionsActive;
+-    bool dataRestrictionActive;
+-    bool checkRestrictions;
++    bool restrictionsActive : 1;
++    bool dataRestrictionActive : 1;
++    bool checkRestrictions : 1;
+     QMap<QByteArray, bool> restrictions;
+     QStringList xdgdata_prefixes;
+     QStringList xdgconf_prefixes;
+--- a/kdecore/services/kservice_p.h
++++ b/kdecore/services/kservice_p.h
+@@ -41,6 +41,7 @@
+     }
+ 
+     void init(const KDesktopFile *config, KService* q);
++    void parseActions(const KDesktopFile *config, KService* q);
+     void load( QDataStream& );
+     virtual void save( QDataStream& );
+ 
+@@ -77,8 +78,9 @@
+     QMap<QString,QVariant> m_mapProps;
+     QStringList m_lstKeywords;
+     QString m_strGenName;
+-    bool m_bAllowAsDefault;
+-    bool m_bTerminal;
+-    bool m_bValid;
++    QList<KServiceAction> m_actions;
++    bool m_bAllowAsDefault : 1;
++    bool m_bTerminal : 1;
++    bool m_bValid : 1;
+ };
+ #endif
+--- a/kdecore/services/kservicegroup_p.h
++++ b/kdecore/services/kservicegroup_p.h
+@@ -64,11 +64,11 @@
+     void parseAttribute( const QString &item ,  bool &showEmptyMenu, bool &showInline, bool &showInlineHeader, bool & showInlineAlias ,int &inlineValue );
+ 
+ 
+-    bool m_bNoDisplay;
+-    bool m_bShowEmptyMenu;
+-    bool m_bShowInlineHeader;
+-    bool m_bInlineAlias;
+-    bool m_bAllowInline;
++    bool m_bNoDisplay : 1;
++    bool m_bShowEmptyMenu : 1;
++    bool m_bShowInlineHeader : 1;
++    bool m_bInlineAlias : 1;
++    bool m_bAllowInline : 1;
+     int m_inlineValue;
+     QStringList suppressGenericNames;
+     QString directoryEntryPath;
+--- a/kdecore/services/kplugininfo.desktop
++++ b/kdecore/services/kplugininfo.desktop
+@@ -52,8 +52,8 @@
+ Name[ru]=Сведения о модуле KDE
+ Name[se]=Dieđut KDE-moduvlla birra
+ Name[sl]=Informacija o vstavkih v KDE
+-Name[sr]=Информација о KDE dodatku
+-Name[sr at latin]=Informacija o KDE dodatku
++Name[sr]=Подаци о КДЕ прикључку
++Name[sr at latin]=Podaci o KDE priključku
+ Name[sv]=KDE-insticksinformation
+ Name[ta]=KDE சொருகுப்பொருள் தகவல்
+ Name[te]=కెడిఈ ప్లగిన్ సమాచారం
+--- /dev/null
++++ b/kdecore/services/kserviceaction.h
+@@ -0,0 +1,120 @@
++/* This file is part of the KDE project
++   Copyright 2007 David Faure <faure at kde.org>
++
++   This library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public
++   License as published by the Free Software Foundation; either
++   version 2 of the License, or (at your option) any later version.
++
++   This library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public License
++   along with this library; see the file COPYING.LIB.  If not, write to
++   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.
++*/
++
++#ifndef KSERVICEACTION_H
++#define KSERVICEACTION_H
++
++#include <kdecore_export.h>
++#include <QtCore/QSharedDataPointer>
++class QVariant;
++class KServiceActionPrivate;
++
++/**
++ * Represents an action in a .desktop file
++ * Actions are defined with the config key Actions in the [Desktop Entry]
++ * group, followed by one group per action, as per the desktop entry standard.
++ * @see KService::actions
++ */
++class KDECORE_EXPORT KServiceAction
++{
++public:
++    /**
++     * Creates a KServiceAction.
++     * Normally you don't have to do this, KService creates the actions
++     * when parsing the .desktop file.
++     */
++    KServiceAction(const QString& name, const QString& text,
++                   const QString& icon, const QString& exec,
++                   bool noDisplay = false);
++    /**
++     * @internal
++     * Needed for operator>>
++     */
++    KServiceAction();
++    /**
++     * Destroys a KServiceAction.
++     */
++    ~KServiceAction();
++
++    /**
++     * Copy constructor
++     */
++    KServiceAction(const KServiceAction& other);
++    /**
++     * Assignment operator
++     */
++    KServiceAction& operator=(const KServiceAction& other);
++
++    /**
++     * Sets the action's internal data to the given @p userData.
++     */
++    void setData( const QVariant& userData );
++    /**
++     * @return the action's internal data.
++     */
++    QVariant data() const;
++
++    /**
++     * @return the action's internal name
++     * For instance Actions=Setup;... and the group [Desktop Action Setup]
++     * define an action with the name "Setup".
++     */
++    QString name() const;
++
++    /**
++     * @return the action's text, as defined by the Name key in the desktop action group
++     */
++    QString text() const;
++
++    /**
++     * @return the action's icon, as defined by the Icon key in the desktop action group
++     */
++    QString icon() const;
++
++    /**
++     * @return the action's exec command, as defined by the Exec key in the desktop action group
++     */
++    QString exec() const;
++
++    /**
++     * Returns whether the action should be suppressed in menus.
++     * This is useful for having actions with a known name that the code
++     * looks for explicitely, like Setup and Root for kscreensaver actions,
++     * and which should not appear in popup menus.
++     * @return true to suppress this service
++     */
++    bool noDisplay() const;
++
++    /**
++     * Returns whether the action is a separator.
++     * This is true when the Actions key contains "_SEPARATOR_".
++     */
++    bool isSeparator() const;
++
++private:
++    QSharedDataPointer<KServiceActionPrivate> d;
++    friend KDECORE_EXPORT QDataStream& operator>>( QDataStream& str, KServiceAction& act );
++    friend KDECORE_EXPORT QDataStream& operator<<( QDataStream& str, const KServiceAction& act );
++};
++
++KDECORE_EXPORT QDataStream& operator>>( QDataStream& str, KServiceAction& act );
++KDECORE_EXPORT QDataStream& operator<<( QDataStream& str, const KServiceAction& act );
++
++#endif /* KSERVICEACTION_H */
++
+--- a/kdecore/services/kservice.h
++++ b/kdecore/services/kservice.h
+@@ -21,6 +21,7 @@
+ #ifndef KSERVICE_H
+ #define KSERVICE_H
+ 
++#include "kserviceaction.h"
+ #include <QtCore/QStringList>
+ #include <QtCore/QVariant>
+ #include <klibloader.h>
+@@ -305,6 +306,11 @@
+     bool allowAsDefault() const;
+ 
+     /**
++     * Returns the actions defined in this desktop file
++     */
++    QList<KServiceAction> actions() const;
++
++    /**
+      * Checks whether this service can handle several files as
+      * startup arguments.
+      * @return true if multiple files may be passed to this service at
+--- /dev/null
++++ b/kdecore/services/kserviceaction.cpp
+@@ -0,0 +1,127 @@
++/* This file is part of the KDE project
++   Copyright 2007 David Faure <faure at kde.org>
++
++   This library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Library General Public
++   License as published by the Free Software Foundation; either
++   version 2 of the License, or (at your option) any later version.
++
++   This library 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
++   Library General Public License for more details.
++
++   You should have received a copy of the GNU Library General Public License
++   along with this library; see the file COPYING.LIB.  If not, write to
++   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
++   Boston, MA 02110-1301, USA.
++*/
++#include "kserviceaction.h"
++#include <QVariant>
++
++class KServiceActionPrivate : public QSharedData
++{
++public:
++    KServiceActionPrivate(const QString& name, const QString& text,
++                          const QString& icon, const QString& exec,
++                          bool noDisplay)
++        : m_name(name), m_text(text), m_icon(icon), m_exec(exec), m_noDisplay(noDisplay) {}
++    QString m_name;
++    QString m_text;
++    QString m_icon;
++    QString m_exec;
++    QVariant m_data;
++    bool m_noDisplay;
++    // warning keep QDataStream operators in sync if adding data here
++};
++
++KServiceAction::KServiceAction()
++    : d(new KServiceActionPrivate(QString(), QString(), QString(), QString(), false))
++{
++}
++
++KServiceAction::KServiceAction(const QString& name, const QString& text,
++                               const QString& icon, const QString& exec,
++                               bool noDisplay)
++    : d(new KServiceActionPrivate(name, text, icon, exec, noDisplay))
++{
++}
++
++KServiceAction::~KServiceAction()
++{
++}
++
++KServiceAction::KServiceAction(const KServiceAction& other)
++    : d(other.d)
++{
++}
++
++KServiceAction& KServiceAction::operator=(const KServiceAction& other)
++{
++    d = other.d;
++    return *this;
++}
++
++QVariant KServiceAction::data() const
++{
++     return d->m_data;
++}
++
++void KServiceAction::setData( const QVariant& data )
++{
++     d->m_data = data;
++}
++
++QString KServiceAction::name() const
++{
++    return d->m_name;
++}
++
++QString KServiceAction::text() const
++{
++    return d->m_text;
++}
++
++QString KServiceAction::icon() const
++{
++    return d->m_icon;
++}
++
++QString KServiceAction::exec() const
++{
++    return d->m_exec;
++}
++
++bool KServiceAction::noDisplay() const
++{
++    return d->m_noDisplay;
++}
++
++bool KServiceAction::isSeparator() const
++{
++    return d->m_name == QLatin1String("_SEPARATOR_");
++}
++
++QDataStream& operator>>( QDataStream& str, KServiceAction& act )
++{
++    KServiceActionPrivate* d = act.d;
++    str >> d->m_name;
++    str >> d->m_text;
++    str >> d->m_icon;
++    str >> d->m_exec;
++    str >> d->m_data;
++    str >> d->m_noDisplay;
++    return str;
++}
++
++QDataStream& operator<<( QDataStream& str, const KServiceAction& act )
++{
++    const KServiceActionPrivate* d = act.d;
++    str << d->m_name;
++    str << d->m_text;
++    str << d->m_icon;
++    str << d->m_exec;
++    str << d->m_data;
++    str << d->m_noDisplay;
++    return str;
++}
+--- a/kdecore/services/kservice.cpp
++++ b/kdecore/services/kservice.cpp
+@@ -48,7 +48,7 @@
+     bool absPath = !QDir::isRelativePath(entryPath);
+ 
+     // TODO: it makes sense to have a KConstConfigGroup I guess
+-    KConfigGroup desktopGroup = const_cast<KDesktopFile*>(config)->desktopGroup();
++    const KConfigGroup desktopGroup = const_cast<KDesktopFile*>(config)->desktopGroup();
+     QMap<QString, QString> entryMap = desktopGroup.entryMap();
+ 
+     entryMap.remove("Encoding"); // reserved as part of Desktop Entry Standard
+@@ -65,11 +65,6 @@
+     entryMap.remove("Name");
+     if ( m_strName.isEmpty() )
+     {
+-        if (desktopGroup.readEntry( "Exec" ).isEmpty())
+-        {
+-            m_bValid = false;
+-            return;
+-        }
+         // Try to make up a name.
+         m_strName = entryPath;
+         int i = m_strName.lastIndexOf('/');
+@@ -98,6 +93,20 @@
+         return;
+     }
+ 
++    m_strExec = desktopGroup.readPathEntry( "Exec" );
++    entryMap.remove("Exec");
++
++    if ( m_strType == "Application" ) {
++        // It's an application? Should have an Exec line then, otherwise we can't run it
++        if (m_strExec.isEmpty()) {
++            kWarning(7012) << "The desktop entry file " << entryPath
++                           << " has Type=" << m_strType
++                           << " but no Exec line" << endl;
++            m_bValid = false;
++            return;
++        }
++    }
++
+     // In case Try Exec is set, check if the application is available
+     if (!config->tryExec()) {
+         q->setDeleted( true );
+@@ -139,9 +148,6 @@
+     if (pos != -1)
+         _name = _name.left(pos);
+ 
+-    m_strExec = desktopGroup.readPathEntry( "Exec" );
+-    entryMap.remove("Exec");
+-
+     m_strIcon = desktopGroup.readEntry( "Icon" );
+     entryMap.remove("Icon");
+     m_bTerminal = desktopGroup.readEntry( "Terminal", false); // should be a property IMHO
+@@ -155,7 +161,8 @@
+     m_strGenName = config->readGenericName();
+     entryMap.remove("GenericName");
+     QString _untranslatedGenericName = desktopGroup.readEntryUntranslated( "GenericName" );
+-    entryMap.insert("UntranslatedGenericName", _untranslatedGenericName);
++    if (!_untranslatedGenericName.isEmpty())
++        entryMap.insert("UntranslatedGenericName", _untranslatedGenericName);
+ 
+     m_lstKeywords = desktopGroup.readEntry("Keywords", QStringList());
+     entryMap.remove("Keywords");
+@@ -177,6 +184,10 @@
+         // Applications implement the service type "Application" ;-)
+         m_lstServiceTypes += "Application";
+ 
++    if (entryMap.contains("Actions")) {
++        parseActions(config, q);
++    }
++
+     QString dbusStartupType = desktopGroup.readEntry("X-DBUS-StartupType").toLower();
+     //Compatibility
+     if( dbusStartupType.isEmpty() && desktopGroup.hasKey("X-DCOP-ServiceType"))
+@@ -207,18 +218,52 @@
+     // break BC, so we have to store it in m_mapProps.
+ //  qDebug("Path = %s", entryPath.toLatin1().constData());
+     QMap<QString,QString>::ConstIterator it = entryMap.begin();
+-    for( ; it != entryMap.end();++it)
+-    {
+-//     qDebug("   Key = %s Data = %s", it.key().toLatin1().data(), it->toLatin1().data());
+-        m_mapProps.insert( it.key(), QVariant( *it));
++    for( ; it != entryMap.end();++it) {
++        const QString key = it.key();
++        // do not store other translations like Name[fr]; kbuildsycoca will rerun if we change languages anyway
++        if (!key.contains('[')) {
++            //kDebug(7012) << "  Key =" << key << " Data =" << *it;
++            m_mapProps.insert(key, QVariant(*it));
++        }
++    }
++}
++
++void KServicePrivate::parseActions(const KDesktopFile *config, KService* q)
++{
++    const QStringList keys = config->readActions();
++    if (keys.isEmpty())
++        return;
++
++    QStringList::ConstIterator it = keys.begin();
++    const QStringList::ConstIterator end = keys.end();
++    for ( ; it != end; ++it ) {
++        const QString group = *it;
++        if (group == "_SEPARATOR_") {
++            m_actions.append(KServiceAction(group, QString(), QString(), QString(), false));
++            continue;
++        }
++
++        if (config->hasActionGroup(group)) {
++            const KConfigGroup cg = config->actionGroup(group);
++            if ( !cg.hasKey( "Name" ) || !cg.hasKey( "Exec" ) ) {
++                kWarning(7012) << "The action" << group << "in the desktop file" << q->entryPath()
++                               << "has no Name or no Exec key";
++            } else {
++                m_actions.append(KServiceAction(group,
++                                                cg.readEntry("Name"),
++                                                cg.readEntry("Icon"),
++                                                cg.readEntry("Exec"),
++                                                cg.readEntry("NoDisplay", false)));
++            }
++        } else {
++            kWarning(7012) << "The desktop file" << q->entryPath()
++                           << "references the action" << group << "but doesn't define it";
++        }
+     }
+ }
+ 
+ void KServicePrivate::load(QDataStream& s)
+ {
+-    // dummies are here because of fields that were removed, to keep bin compat.
+-    // Feel free to re-use, but fields for Applications only (not generic services)
+-    // should rather be added to application.desktop
+     qint8 def, term;
+     qint8 dst, initpref;
+ 
+@@ -234,10 +279,10 @@
+       >> m_strDesktopEntryName
+       >> initpref
+       >> m_lstKeywords >> m_strGenName
+-      >> categories >> menuId;
++      >> categories >> menuId >> m_actions;
+ 
+-    m_bAllowAsDefault = def;
+-    m_bTerminal = term;
++    m_bAllowAsDefault = (bool)def;
++    m_bTerminal = (bool)term;
+     m_DBUSStartusType = (KService::DBusStartupType) dst;
+     m_initialPreference = initpref;
+ 
+@@ -263,7 +308,7 @@
+       << m_strDesktopEntryName
+       << initpref
+       << m_lstKeywords << m_strGenName
+-      << categories << menuId;
++      << categories << menuId << m_actions;
+ }
+ 
+ ////
+@@ -827,3 +872,9 @@
+     Q_D(KService);
+     return d->m_lstServiceTypes;
+ }
++
++QList<KServiceAction> KService::actions() const
++{
++    Q_D(const KService);
++    return d->m_actions;
++}
+--- a/kdecore/localization/klocale.cpp
++++ b/kdecore/localization/klocale.cpp
+@@ -175,8 +175,8 @@
+   int fracDigits;
+   KLocale::SignPosition positiveMonetarySignPosition;
+   KLocale::SignPosition negativeMonetarySignPosition;
+-  bool positivePrefixCurrencySymbol;
+-  bool negativePrefixCurrencySymbol;
++  bool positivePrefixCurrencySymbol : 1;
++  bool negativePrefixCurrencySymbol : 1;
+ 
+   // Date and time
+   QString timeFormat;
+--- a/kdecore/localization/kencodingdetector.cpp
++++ b/kdecore/localization/kencodingdetector.cpp
+@@ -82,10 +82,10 @@
+     KEncodingDetector::EncodingChoiceSource m_source;
+     KEncodingDetector::AutoDetectScript m_autoDetectLanguage;
+ 
+-    bool m_visualRTL;
+-    bool m_seenBody;
+-    bool m_writtingHappened;
+-    bool m_analyzeCalled; //for decode()
++    bool m_visualRTL : 1;
++    bool m_seenBody : 1;
++    bool m_writtingHappened : 1;
++    bool m_analyzeCalled : 1; //for decode()
+     int m_multiByte;
+ 
+     QByteArray m_bufferForDefferedEncDetection;
+--- a/kdecore/tests/kservicetest.cpp
++++ b/kdecore/tests/kservicetest.cpp
+@@ -68,6 +68,8 @@
+     QCOMPARE(kdeprintd->property("ServiceTypes").toStringList().join(","), QString("KDEDModule"));
+     QCOMPARE(kdeprintd->property("X-KDE-Kded-autoload").toBool(), false);
+     QCOMPARE(kdeprintd->property("X-KDE-Kded-load-on-demand").toBool(), true);
++    QVERIFY(!kdeprintd->property("Name").toString().isEmpty());
++    QVERIFY(!kdeprintd->property("Name[fr]", QVariant::String).isValid());
+ 
+     KService::Ptr kjavaappletviewer = KService::serviceByDesktopPath("kjavaappletviewer.desktop");
+     QVERIFY(kjavaappletviewer);
+@@ -306,3 +308,39 @@
+         QSKIP( "testServiceTypeTraderForReadOnlyPart not run", SkipAll );
+     QCOMPARE( offers[0]->entryPath(), m_firstOffer );
+ }
++
++void KServiceTest::testActionsAndDataStream()
++{
++    const QString servicePath = KStandardDirs::locate( "services", "ScreenSavers/krandom.desktop" );
++    if (servicePath.isEmpty() )
++        QSKIP("kdebase not installed, krandom.desktop not found", SkipAll);
++    KService service( servicePath );
++    QVERIFY(!service.property("Name[fr]", QVariant::String).isValid());
++    const QList<KServiceAction> actions = service.actions();
++    QCOMPARE(actions.count(), 3);
++    const KServiceAction setupAction = actions[0];
++    QCOMPARE(setupAction.name(), QString("Setup"));
++    QCOMPARE(setupAction.exec(), QString("krandom.kss -setup"));
++    QVERIFY(!setupAction.icon().isEmpty());
++    QCOMPARE(setupAction.noDisplay(), false);
++    QVERIFY(!setupAction.isSeparator());
++    const KServiceAction rootAction = actions[2];
++    QCOMPARE(rootAction.name(), QString("Root"));
++
++    QByteArray data;
++    QDataStream stream(&data, QIODevice::WriteOnly);
++    service.save(stream);
++    QVERIFY(!data.isEmpty());
++    // The binary size of that KService in ksycoca was 3700 when storing all Name[...] translations!
++    // Now down to 755. This is on x86, so make the assert for 1500 in case x86_64 needs more.
++    QVERIFY(data.size() < 1500);
++    QDataStream loadingStream(data);
++    // loading must first get type, see KSycocaEntryPrivate::save
++    // (the path that save writes out, is read by the KSycocaEntryPrivate ctor)
++    qint32 type;
++    loadingStream >> type;
++    KService loadedService(loadingStream, 0);
++    QCOMPARE(loadedService.name(), service.name());
++    QCOMPARE(loadedService.exec(), service.exec());
++    QCOMPARE(loadedService.actions().count(), 3);
++}
+--- a/kdecore/tests/kmimetypetest.cpp
++++ b/kdecore/tests/kmimetypetest.cpp
+@@ -320,34 +320,39 @@
+     QCOMPARE( mime->name(), QString::fromLatin1("application/x-php") );
+ }
+ 
+-void KMimeTypeTest::testFindByContent()
++void KMimeTypeTest::testFindByContent_data()
+ {
+-    KMimeType::Ptr mime;
+-
+-    QByteArray textData = "Hello world";
+-    mime = KMimeType::findByContent(textData);
+-    QVERIFY( mime );
+-    QCOMPARE( mime->name(), QString::fromLatin1("text/plain") );
+-
++    QTest::addColumn<QByteArray>("data");
++    QTest::addColumn<QString>("expectedMimeType");
++    QTest::newRow("simple text") << QByteArray("Hello world") << "text/plain";
++    QTest::newRow("html: <html>") << QByteArray("<html>foo</html>") << "text/html";
++#if 0 // currently buggy, xml and html have conflicting magic rules, discussed on xdg list.
++    QTest::newRow("html: comment+<html>") << QByteArray("<!--foo--><html>foo</html>") << "text/html";
++#endif
+ #if 0 // https://bugs.freedesktop.org/show_bug.cgi?id=11259
+-    QByteArray htmlData = "<script>foo</script>";
+-    mime = KMimeType::findByContent(htmlData);
+-    QVERIFY( mime );
+-    QCOMPARE( mime->name(), QString::fromLatin1("text/html") );
++    QTest::newRow("html: <script>") << QByteArray("<script>foo</script>") << "text/html";
+ #endif
+-
+-    QByteArray pdfData = "%PDF-";
+-    mime = KMimeType::findByContent(pdfData);
+-    QVERIFY( mime );
+-    QCOMPARE( mime->name(), QString::fromLatin1("application/pdf") );
++    QTest::newRow("pdf") << QByteArray("%PDF-") << "application/pdf";
+ 
+     QByteArray mswordData = "\320\317\021\340\241\261\032\341";
+     QVERIFY(KMimeType::isBufferBinaryData(mswordData));
+-    mime = KMimeType::findByContent(mswordData);
+-    QVERIFY( mime );
+     // We have no magic specific to msword data, so finding x-ole-storage is correct.
+-    QCOMPARE( mime->name(), QString::fromLatin1("application/x-ole-storage") );
++    QTest::newRow("msword") << mswordData << "application/x-ole-storage";
++}
+ 
++void KMimeTypeTest::testFindByContent()
++{
++    QFETCH(QByteArray, data);
++    QFETCH(QString, expectedMimeType);
++
++    KMimeType::Ptr mime = KMimeType::findByContent(data);
++    QVERIFY( mime );
++    QCOMPARE( mime->name(), expectedMimeType );
++}
++
++void KMimeTypeTest::testFindByFileContent()
++{
++    KMimeType::Ptr mime;
+     // Calling findByContent on a directory
+     mime = KMimeType::findByFileContent("/");
+     QVERIFY( mime );
+--- a/kdecore/tests/kurltest.cpp
++++ b/kdecore/tests/kurltest.cpp
+@@ -1056,6 +1056,11 @@
+   QCOMPARE( emptyUserTest2.user(), QString::fromLatin1( "foo" ) );
+   emptyUserTest2.setUser( QString() );
+   QCOMPARE( emptyUserTest1==emptyUserTest2, true );
++
++  KUrl uga("ftp://ftp.kde.org");
++  uga.setUser("foo at bar");
++  QCOMPARE(uga.user(), QString::fromLatin1("foo at bar"));
++  QCOMPARE(uga.url(), QString::fromLatin1("ftp://foo%40bar@ftp.kde.org"));
+ }
+ 
+ void KUrlTest::testComparisons()
+--- a/kdecore/tests/kconfigtest.cpp
++++ b/kdecore/tests/kconfigtest.cpp
+@@ -27,6 +27,8 @@
+ #include <kconfiggroup.h>
+ #include <kstandarddirs.h>
+ 
++#include <QtNetwork/QHostInfo>
++
+ KCONFIGGROUP_DECLARE_ENUM_QOBJECT(KConfigTest,Testing)
+ KCONFIGGROUP_DECLARE_FLAGS_QOBJECT(KConfigTest,Flags)
+ 
+@@ -41,6 +43,7 @@
+ #define STRINGENTRY5 " "
+ #define STRINGENTRY6 ""
+ #define UTF8BITENTRY "Hello äöü"
++#define TRANSLATEDSTRINGENTRY1 "bonjour"
+ #define BYTEARRAYENTRY QByteArray( "\x00\xff\x7f\x3c abc\x00\x00", 10 )
+ #define ESCAPEKEY " []\0017[]==]"
+ #define ESCAPEENTRY "[]\170[]]=3=]\\] "
+@@ -85,6 +88,7 @@
+   cg.writeEntry( ESCAPEKEY, ESCAPEENTRY );
+   cg.writeEntry( "emptyEntry", "");
+   cg.writeEntry( "stringEntry1", STRINGENTRY1 );
++  cg.writeEntry( "stringEntry1[fr]", TRANSLATEDSTRINGENTRY1 );
+   cg.writeEntry( "stringEntry2", STRINGENTRY2 );
+   cg.writeEntry( "stringEntry3", STRINGENTRY3 );
+   cg.writeEntry( "stringEntry4", STRINGENTRY4 );
+@@ -286,6 +290,48 @@
+   QString p = sc3.readPathEntry("homepath");
+   QCOMPARE( sc3.readPathEntry( "homepath", QString() ), HOMEPATH );
+   QCOMPARE( sc3.readPathEntry( "homepathescape", QString() ), HOMEPATHESCAPE );
++  
++  {
++      QFile file(KStandardDirs::locateLocal("config", "pathtest"));
++      file.open(QIODevice::WriteOnly|QIODevice::Text);
++      QTextStream out(&file);
++      out.setCodec("UTF-8");
++      out << "[Test Group]" << endl
++              << "homePath=$HOME/foo" << endl
++              << "homePath2=file://$HOME/foo" << endl
++              << "hostname[$e]=$(hostname)" << endl;
++  }
++  KConfig cf2("pathtest");
++  KConfigGroup group = cf2.group("Test Group");
++  QVERIFY(group.hasKey("homePath"));
++  QCOMPARE(group.readPathEntry("homePath"), HOMEPATH);
++  QVERIFY(group.hasKey("homePath2"));
++  QCOMPARE(group.readPathEntry("homePath2"), QString("file://") + HOMEPATH );
++#ifndef Q_OS_WIN32
++  // I don't know if this will work on windows
++  QVERIFY(group.hasKey("hostname"));
++  QCOMPARE(group.readEntry("hostname", QString()), QHostInfo::localHostName());
++#endif
++}
++
++void KConfigTest::testPersistenceOfExpandFlagForPath()
++{
++  // This test checks that a path entry starting with $HOME is still flagged
++  // with the expand flag after the config was altered without rewriting the
++  // path entry.
++
++  // 1st step: Open the config, add a new dummy entry and then sync the config
++  // back to the storage.
++  {
++  KConfig sc2( "kconfigtest" );
++  KConfigGroup sc3(&sc2, "Path Type");
++  sc3.writeEntry( "dummy", "dummy" );
++  sc2.sync();
++  }
++
++  // 2nd step: Call testPath() again. Rewriting the config must not break
++  // the testPath() test.
++  testPath();
+ }
+ 
+ void KConfigTest::testComplex()
+@@ -324,6 +370,31 @@
+   QVERIFY( sc3.readEntry( "flags-bit0-bit1", Flags() ) == bitfield );
+ }
+ 
++void KConfigTest::testEntryMap()
++{
++    KConfig sc("kconfigtest");
++    KConfigGroup cg(&sc, "Hello");
++    QMap<QString, QString> entryMap = cg.entryMap();
++    qDebug() << entryMap.keys();
++    QCOMPARE(entryMap.value("stringEntry1"), QString(STRINGENTRY1));
++    // #### Why is this translated entry here? This just bloats the entryMap.
++    QCOMPARE(entryMap.value("stringEntry1[fr]"), QString(TRANSLATEDSTRINGENTRY1));
++    QCOMPARE(entryMap.value("stringEntry2"), QString(STRINGENTRY2));
++    QCOMPARE(entryMap.value("stringEntry3"), QString(STRINGENTRY3));
++    QCOMPARE(entryMap.value("stringEntry4"), QString(STRINGENTRY4));
++    QVERIFY(!entryMap.contains("stringEntry5"));
++    QVERIFY(!entryMap.contains("stringEntry6"));
++    QCOMPARE(entryMap.value("Test"), QString::fromUtf8(UTF8BITENTRY));
++    QCOMPARE(entryMap.value("bytearrayEntry"), QString::fromUtf8(BYTEARRAYENTRY));
++    QCOMPARE(entryMap.value("emptyEntry"), QString());
++    QVERIFY(entryMap.contains("emptyEntry"));
++    QCOMPARE(entryMap.value("boolEntry1"), QString(BOOLENTRY1?"true":"false"));
++    QCOMPARE(entryMap.value("boolEntry2"), QString(BOOLENTRY2?"true":"false"));
++    QCOMPARE(entryMap.value("keywith=equalsign"), QString(STRINGENTRY1));
++    QCOMPARE(entryMap.value("byteArrayEntry1"), QString(STRINGENTRY1));
++    QCOMPARE(entryMap.value("doubleEntry1"), QString::number(DOUBLEENTRY, 'g', 15));
++}
++
+ void KConfigTest::testInvalid()
+ {
+   KConfig sc( "kconfigtest" );
+@@ -397,7 +468,7 @@
+     KConfigGroup sc3(&sc, "Hello");
+     QCOMPARE(sc3.name(), QString("Hello"));
+     KConfigGroup newGroup(sc3);
+-    newGroup.changeGroup("FooBar");
++    newGroup.changeGroup("FooBar"); // deprecated!
+     QCOMPARE(newGroup.name(), QString("FooBar"));
+     QCOMPARE(sc3.name(), QString("Hello")); // unchanged
+ }
+--- a/kdecore/tests/kmimetypetest.h
++++ b/kdecore/tests/kmimetypetest.h
+@@ -35,6 +35,8 @@
+     void testFindByPathWithContent();
+     void testFindByNameAndContent();
+     void testFindByContent();
++    void testFindByContent_data();
++    void testFindByFileContent();
+     void testAllMimeTypes();
+     void testAlias();
+     void testMimeTypeParent();
+--- a/kdecore/tests/kconfigtest.h
++++ b/kdecore/tests/kconfigtest.h
+@@ -38,8 +38,10 @@
+     void testSimple();
+     void testLists();
+     void testPath();
++    void testPersistenceOfExpandFlagForPath();
+     void testComplex();
+     void testEnums();
++    void testEntryMap();
+     void testInvalid();
+     void testDelete();
+     void testDefaultGroup();
+--- a/kdecore/tests/kservicetest.h
++++ b/kdecore/tests/kservicetest.h
+@@ -37,6 +37,7 @@
+     void testDefaultOffers();
+     void testDeleteServiceTypeProfile();
+     void testDBUSStartupType();
++    void testActionsAndDataStream();
+ 
+ private:
+     QString m_firstOffer;
+--- a/kdecore/sonnet/sonnetspeller.desktop
++++ b/kdecore/sonnet/sonnetspeller.desktop
+@@ -12,6 +12,7 @@
+ Comment[el]=Πελάτης ορθογραφικού ελέγχου Sonnet
+ Comment[eo]=Sonnet Literumil-Kliento
+ Comment[es]=Cliente de revisión ortográfica Sonnet
++Comment[et]=Sonneti õigekirja kontrollimise klient
+ Comment[fa]=کارخواه هجی Sonnet
+ Comment[ga]=Cliant Litrithe Sonnet
+ Comment[he]=תוכנית בדיקת איות Sonnet
+@@ -22,6 +23,7 @@
+ Comment[km]=កម្មវិធី​អក្ខរាវិរុទ្ធ Sonnet
+ Comment[kn]=ಸಾನೆಟ್ ಕಾಗುಣಿತ ಸೇವನಾರ್ಥಿ
+ Comment[ko]=Sonnet 스펠링 클라이언트
++Comment[lv]=Sonnet pareizrakstības pārbaudes klients
+ Comment[nds]=Schriefwiesprööv-Client Sonnet
+ Comment[ne]=सोनेट स्पेल क्लाइन्ट
+ Comment[nl]=Sonnet Spellingcontrole
+@@ -30,8 +32,11 @@
+ Comment[pt_BR]=Cliente do Verificador Ortográfico Sonnet
+ Comment[ru]=Клиент Sonnet
+ Comment[sl]=Odjemnik za črkovanje Sonnet
++Comment[sr]=Сонет, правописни клијент
++Comment[sr at latin]=Sonnet, pravopisni klijent
+ Comment[sv]=Sonnet stavningsklient
+ Comment[th]=ไคลเอนท์ Sonnet Spell
++Comment[uk]=Клієнт перевірки орфографії Sonnet
+ Comment[wa]=Cliyint coridjrece sonnet
+ Comment[x-test]=xxSonnet Spell Clientxx
+ Comment[zh_CN]=Sonnet Spell 客户
+--- a/kdecore/CMakeLists.txt
++++ b/kdecore/CMakeLists.txt
+@@ -146,6 +146,7 @@
+    services/kmimetypetrader.cpp
+    services/kmimetype.cpp
+    services/kservice.cpp
++   services/kserviceaction.cpp
+    services/kservicefactory.cpp
+    services/kservicegroup.cpp
+    services/kservicegroupfactory.cpp
+@@ -340,6 +341,7 @@
+    services/kmimetype.h
+    services/kmimetypetrader.h
+    services/kservice.h
++   services/kserviceaction.h
+    services/kservicegroup.h
+    #services/kservicefactory.h: do not install, internal API
+    services/kservicetype.h
+--- a/kdecore/sycoca/ksycoca.h
++++ b/kdecore/sycoca/ksycoca.h
+@@ -35,7 +35,7 @@
+  * If the existing file is outdated, it will not get read
+  * but instead we'll ask kded to regenerate a new one...
+  */
+-#define KSYCOCA_VERSION 109
++#define KSYCOCA_VERSION 110
+ 
+ /**
+  * Sycoca file name, used internally (by kbuildsycoca)
+--- a/kdecore/sycoca/kprotocolinfo_p.h
++++ b/kdecore/sycoca/kprotocolinfo_p.h
+@@ -49,11 +49,11 @@
+   QString docPath;
+   QString protClass;
+   KProtocolInfo::ExtraFieldList extraFields;
+-  bool showPreviews;
+-  bool canRenameFromFile;
+-  bool canRenameToFile;
+-  bool canDeleteRecursive;
+-  bool fileNameUsedForCopying; // true if using UDS_NAME, false if using KUrl::fileName() [default]
++  bool showPreviews : 1;
++  bool canRenameFromFile : 1;
++  bool canRenameToFile : 1;
++  bool canDeleteRecursive : 1;
++  bool fileNameUsedForCopying : 1; // true if using UDS_NAME, false if using KUrl::fileName() [default]
+   //KUrl::URIMode uriMode;
+   QStringList capabilities;
+   QString proxyProtocol;
+--- a/kdecore/jobs/kjobuidelegate.cpp
++++ b/kdecore/jobs/kjobuidelegate.cpp
+@@ -33,8 +33,8 @@
+     KJobUiDelegate * const q;
+ 
+     KJob *job;
+-    bool autoErrorHandling;
+-    bool autoWarningHandling;
++    bool autoErrorHandling : 1;
++    bool autoWarningHandling : 1;
+ 
+     void connectJob(KJob *job);
+     void _k_result(KJob *job);
+--- a/kdecore/config/kconfiggroup.h
++++ b/kdecore/config/kconfiggroup.h
+@@ -113,9 +113,9 @@
+      * not be overused. Prefer another object for another group to avoid mixture of
+      * groups. A subgroup can only change to another subgroup of the parent.
+      */
+-    void changeGroup( const QString &group );
+-    void changeGroup( const QByteArray &group);
+-    void changeGroup( const char *group);
++    KDE_DEPRECATED void changeGroup( const QString &group );
++    KDE_DEPRECATED void changeGroup( const QByteArray &group);
++    KDE_DEPRECATED void changeGroup( const char *group);
+ 
+     QString name() const;
+     bool exists() const;
+@@ -548,7 +548,7 @@
+   Q_FOREACH(const T &value, list)
+     vList.append(value);
+ 
+-  writeEntry( key, QVariant(vList), pFlags );
++  writeEntry( key, vList, pFlags );
+ }
+ 
+ template <typename T>
+--- a/kdecore/config/kconfigini_p.h
++++ b/kdecore/config/kconfigini_p.h
+@@ -44,6 +44,7 @@
+                      WriteOptions options, const KComponentData &data);
+ 
+     bool isWritable() const;
++    KConfigBase::ConfigState getConfigState() const;
+     void createEnclosing();
+     void setFilePath(const QString& path);
+     bool lock(const KComponentData& componentData);
+--- a/kdecore/config/kconfig_p.h
++++ b/kdecore/config/kconfig_p.h
+@@ -50,14 +50,12 @@
+ 
+     // functions for KConfigGroup
+     bool canWriteEntry(const QByteArray& group, const QByteArray& key, bool isDefault=false) const;
+-    QString lookupData(const QByteArray& group, const QByteArray& key, int flags, bool* expand) const;
+-    QByteArray lookupData(const QByteArray& group, const QByteArray& key, int flags) const;
++    QString lookupData(const QByteArray& group, const QByteArray& key, KEntryMap::SearchFlags flags,
++                       bool* expand) const;
++    QByteArray lookupData(const QByteArray& group, const QByteArray& key, KEntryMap::SearchFlags flags) const;
+ 
+-    enum ExtendedWriteFlag { NoFlag = 0x0, Expand = 0x1, Delete =0x2 };
+-    Q_DECLARE_FLAGS(ExtendedWriteFlags, ExtendedWriteFlag)
+-
+-    void putData(const QByteArray& group, const QByteArray& key,
+-        const QByteArray& value, KConfigBase::WriteConfigFlags flags, ExtendedWriteFlags = NoFlag);
++    void putData(const QByteArray& group, const QByteArray& key, const QByteArray& value,
++                 KConfigBase::WriteConfigFlags flags, bool expand=false);
+     QStringList groupList(const QByteArray& group) const;
+ 
+ protected:
+@@ -65,7 +63,7 @@
+ 
+     KConfigPrivate(const KComponentData &componentData_, KConfig::OpenFlags flags,
+            const char* resource);
+-    
++
+     ~KConfigPrivate()
+     {
+     }
+@@ -108,6 +106,4 @@
+     void setDirty(bool b);
+ };
+ 
+-Q_DECLARE_OPERATORS_FOR_FLAGS(KConfigPrivate::ExtendedWriteFlags)
+-
+-#endif // KCONFIG_H
++#endif // KCONFIG_P_H
+--- a/kdecore/config/kconfigini.cpp
++++ b/kdecore/config/kconfigini.cpp
+@@ -412,8 +412,21 @@
+     }
+ }
+ 
++KConfigBase::ConfigState KConfigIniBackend::getConfigState() const
++{
++    if (filePath().isEmpty())
++        return KConfigBase::NoAccess;
++
++    if (KStandardDirs::checkAccess(filePath(), W_OK))
++        return KConfigBase::ReadWrite;
++
++    return KConfigBase::ReadOnly;
++}
++
+ bool KConfigIniBackend::lock(const KComponentData& componentData)
+ {
++    Q_ASSERT(!filePath().isEmpty());
++
+     lockFile = new KLockFile(filePath() + QLatin1String(".lock"), componentData);
+ 
+     if (lockFile->lock() == KLockFile::LockStale) // attempt to break the lock
+--- a/kdecore/config/kconfig.cpp
++++ b/kdecore/config/kconfig.cpp
+@@ -56,7 +56,7 @@
+     : openFlags(flags), resourceType(resource), mBackend(0),
+       bDynamicBackend(true),  bDirty(false), bReadDefaults(false),
+       bFileImmutable(false), bForceGlobal(false), componentData(componentData_),
+-      configState(KConfigBase::ReadWrite)
++      configState(KConfigBase::NoAccess)
+ {
+     sGlobalFileName = componentData.dirs()->saveLocation("config") +
+                           QString::fromLatin1("kdeglobals");
+@@ -245,15 +245,15 @@
+         }
+ 
+         // lock the local file
+-        if (!d->lockLocal()) {
+-            kWarning() << "couldn't lock local file";
++        if (d->configState == ReadWrite && !d->lockLocal()) {
++            qWarning() << "couldn't lock local file";
+             return;
+         }
+ 
+         KEntryMap toMerge;
+         if (d->wantGlobals()) {
+             KSharedPtr<KConfigBackend> tmp = KConfigBackend::create(componentData(), d->sGlobalFileName);
+-            if (!tmp->lock(componentData())) {
++            if (d->configState == ReadWrite && !tmp->lock(componentData())) {
+                 qWarning() << "couldn't lock global file";
+                 return;
+             }
+@@ -354,6 +354,8 @@
+         mBackend = KConfigBackend::create(componentData, file);
+     else
+         mBackend->setFilePath(file);
++
++    configState = mBackend->getConfigState();
+ }
+ 
+ void KConfig::reparseConfiguration()
+@@ -368,31 +370,10 @@
+     d->bFileImmutable = false;
+ 
+     // Parse all desired files from the least to the most specific.
+-
+-    // lock the local file
+-    if (!d->lockLocal()) {
+-        //what do we do now?
+-    }
+-
+-    if (d->wantGlobals()) {
+-        KSharedPtr<KConfigBackend> global = KConfigBackend::create(componentData(), d->sGlobalFileName);
+-        // lock the global file
+-        if (!global->lock(componentData())) {
+-            //what do we do now?
+-        }
+-
++    if (d->wantGlobals())
+         d->parseGlobalFiles();
+ 
+-        // unlock the global file
+-        if (global->isLocked())
+-            global->unlock();
+-    }
+-
+     d->parseConfigFiles();
+-
+-    // unlock local file
+-    if (d->mBackend && d->mBackend->isLocked())
+-        d->mBackend->unlock();
+ }
+ 
+ void KConfigPrivate::parseGlobalFiles()
+@@ -652,7 +633,7 @@
+ }
+ 
+ void KConfigPrivate::putData( const QByteArray& group, const QByteArray& key,
+-                      const QByteArray& value, KConfigBase::WriteConfigFlags flags, ExtendedWriteFlags extendedFlags)
++                      const QByteArray& value, KConfigBase::WriteConfigFlags flags, bool expand)
+ {
+     // the KConfig object is dirty now
+     // set this before any IO takes place so that if any derivative
+@@ -669,26 +650,28 @@
+         options |= KEntryMap::EntryLocalized;
+     if (flags& KConfigBase::Persistent)
+         options |= KEntryMap::EntryDirty;
+-    if (extendedFlags & Expand)
+-        options |=KEntryMap::EntryExpansion;
++    if (expand)
++        options |= KEntryMap::EntryExpansion;
+ 
+-    if (extendedFlags & Delete) // deleting entry
++    if (value.isNull()) // deleting entry
+         options |= KEntryMap::EntryDeleted;
+ 
+     entryMap.setEntry(group, key, value, options);
+ }
+ 
+-QByteArray KConfigPrivate::lookupData(const QByteArray& group, const QByteArray& key, int flags) const
++QByteArray KConfigPrivate::lookupData(const QByteArray& group, const QByteArray& key,
++                                      KEntryMap::SearchFlags flags) const
+ {
+-    KEntryMapConstIterator it = entryMap.findEntry(group, key, KEntryMap::SearchFlags(flags));
++    KEntryMapConstIterator it = entryMap.findEntry(group, key, flags);
+     if (it == entryMap.constEnd())
+         return QByteArray();
+     return it->mValue;
+ }
+ 
+-QString KConfigPrivate::lookupData(const QByteArray& group, const QByteArray& key, int flags, bool *expand) const
++QString KConfigPrivate::lookupData(const QByteArray& group, const QByteArray& key,
++                                   KEntryMap::SearchFlags flags, bool *expand) const
+ {
+-    return entryMap.getEntry(group, key, QString(), KEntryMap::SearchFlags(flags), expand);
++    return entryMap.getEntry(group, key, QString(), flags, expand);
+ }
+ 
+ void KConfig::virtual_hook(int /*id*/, void* /*data*/)
+--- a/kdecore/config/kconfigbackend.cpp
++++ b/kdecore/config/kconfigbackend.cpp
+@@ -49,14 +49,14 @@
+     QDateTime lastModified;
+     QString localFileName;
+ 
+-    static QString whatSystem(const QString& fileName)
++    static QString whatSystem(const QString& /*fileName*/)
+     {
+         return QLatin1String("INI");
+     }
+ };
+ 
+ 
+-void KConfigBackend::registerMappings(KEntryMap& entryMap)
++void KConfigBackend::registerMappings(const KEntryMap& /*entryMap*/)
+ {
+ }
+ 
+--- a/kdecore/config/kconfiggroup.cpp
++++ b/kdecore/config/kconfiggroup.cpp
+@@ -227,7 +227,7 @@
+     KConfigGroupPrivate sub = *d;
+     sub.mParent = d;
+     sub.mName = aGroup;
+-    bool subImmutable = config()->groupIsImmutable(sub.fullName().constData());
++    bool subImmutable = config()->groupIsImmutable(sub.fullName());
+     newGroup.d = new KConfigGroupPrivate(&sub, subImmutable, true);
+ 
+     return newGroup;
+@@ -237,7 +237,7 @@
+ {
+     Q_ASSERT(!d->bConst);
+ 
+-    config()->deleteGroup(d->fullName().constData(), flags);
++    config()->deleteGroup(d->fullName(), flags);
+ }
+ 
+ void KConfigGroup::changeGroup( const QString &group )
+@@ -306,7 +306,7 @@
+ 
+ QString KConfigGroup::readEntryUntranslated( const QByteArray& key, const QString& aDefault ) const
+ {
+-    QString result = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::EntryOptions(), 0);
++    QString result = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::SearchFlags(), 0);
+     if (result.isNull())
+         return aDefault;
+     return result;
+@@ -410,18 +410,17 @@
+ template <>
+ QString KConfigGroup::readEntry<QString>( const QByteArray& key, const QString& aDefault ) const
+ {
+-    const char *pKey = key.constData();
+-    if ( !hasKey(pKey) )
+-        return aDefault;
+-
+     bool expand = false;
+ 
+     // read value from the entry map
+-    QString aValue = config()->d_func()->lookupData(d->fullName().constData(), pKey, KEntryMap::SearchLocalized,
++    QString aValue = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::SearchLocalized,
+                                            &expand);
+     if (aValue.isNull())
+         aValue = aDefault;
+ 
++    if (expand)
++        return KConfigGroupPrivate::expandString(aValue);
++
+     return aValue;
+ }
+ 
+@@ -624,7 +623,7 @@
+ template<>
+ QVariant KConfigGroup::readEntry<QVariant>( const QByteArray &key, const QVariant &aDefault ) const
+ {
+-    const QByteArray data = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::EntryOptions());
++    const QByteArray data = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::SearchFlags());
+     if (data.isNull())
+         return aDefault;
+ 
+@@ -638,7 +637,7 @@
+ template<>
+ QVariantList KConfigGroup::readEntry<QVariantList>( const QByteArray &key, const QVariantList& aDefault) const
+ {
+-    const QByteArray data = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::EntryOptions());
++    const QByteArray data = config()->d_func()->lookupData(d->fullName(), key, KEntryMap::SearchFlags());
+ 
+     if (data.isNull())
+         return aDefault;
+@@ -673,8 +672,8 @@
+     }
+ 
+     QVariantList value;
+-    foreach(const QByteArray& v, list)
+-        value << QString::fromUtf8(QByteArray(v).replace("\\,", ","));
++    foreach(QByteArray v, list)
++        value << QString::fromUtf8(v.replace("\\,", ","));
+ 
+     return value;
+ }
+@@ -691,8 +690,8 @@
+     const QString escaped = QString(separator).prepend(QLatin1Char('\\'));
+ 
+     QStringList value;
+-    if (!data.contains(escaped)) {
+-        value = data.split(separator); // easy no escaped separators
++    if (!data.contains(escaped)) { // easy no escaped separators
++        value = data.split(separator);
+     } else {
+         // now look out for escaped separators
+         for(int i=0; i < data.size(); /* nothing */) {
+@@ -720,7 +719,7 @@
+ 
+ QStringList KConfigGroup::readEntry(const QString& pKey, const QStringList& aDefault, char sep) const
+ {
+-    return readEntry(pKey.toUtf8().constData(), aDefault, sep);
++    return readEntry(pKey.toUtf8(), aDefault, sep);
+ }
+ 
+ QStringList KConfigGroup::readEntry(const char *key, const QStringList& aDefault, char sep) const
+@@ -747,10 +746,7 @@
+     if (aValue.isNull())
+         aValue = aDefault;
+ 
+-    // only do dollar expansion if it's an expandable string
+-    if (expand)
+-        return KConfigGroupPrivate::expandString(aValue);
+-    return aValue;
++    return KConfigGroupPrivate::expandString(aValue);
+ }
+ 
+ QStringList KConfigGroup::readPathListEntry( const QString& pKey, char sep ) const
+@@ -777,10 +773,7 @@
+ 
+     if (!data.contains(escaped)) { // easy no escaped separators
+         foreach(const QString& s, data.split(separator)) {
+-            if (expand)
+-                value << KConfigGroupPrivate::expandString(s);
+-            else
+-                value << s;
++            value << KConfigGroupPrivate::expandString(s);
+         }
+     } else { // now look out for escaped separators
+         QStringList value;
+@@ -788,10 +781,7 @@
+             int end = data.indexOf(separator, i);
+     again:
+             if (end < 0) { // no more separators found, end of entry
+-                if (expand)
+-                    value << KConfigGroupPrivate::expandString(data.mid(i).replace(escaped, separator));
+-                else
+-                    value << data.mid(i).replace(escaped, separator);
++                value << KConfigGroupPrivate::expandString(data.mid(i).replace(escaped, separator));
+                 i = data.size();
+             } else if (end == 0) { // empty first element
+                 value << QString();
+@@ -800,10 +790,7 @@
+                 end = data.indexOf(separator, end+1);
+                 goto again;
+             } else {
+-                if (expand)
+-                    value << KConfigGroupPrivate::expandString(data.mid(i, end-i).replace(escaped, separator));
+-                else
+-                    value << data.mid(i, end-i).replace(escaped, separator);
++                value << KConfigGroupPrivate::expandString(data.mid(i, end-i).replace(escaped, separator));
+                 i = end+1;
+             }
+         }
+@@ -849,12 +836,12 @@
+ {
+     Q_ASSERT(!d->bConst);
+ 
+-    config()->d_func()->putData(d->fullName(), key, value, flags);
++    config()->d_func()->putData(d->fullName(), key, value.isNull()? QByteArray(""): value, flags);
+ }
+ 
+ void KConfigGroup::deleteEntry(const QByteArray& key, WriteConfigFlags flags)
+ {
+-   config()->d_func()->putData(d->fullName(), key, QByteArray(), flags, KConfigPrivate::Delete);
++   config()->d_func()->putData(d->fullName(), key, QByteArray(), flags);
+ }
+ 
+ void KConfigGroup::deleteEntry( const QString& key, WriteConfigFlags flags)
+@@ -1009,7 +996,7 @@
+ {
+     const QByteArray escaped = QByteArray(1, '\\') + sep;
+ 
+-    QByteArray value;
++    QByteArray value = "";
+ 
+     if (!list.isEmpty()) {
+         QList<QByteArray>::ConstIterator it = list.constBegin();
+@@ -1039,8 +1026,7 @@
+     const QByteArray theDefault = config()->d_func()->lookupData(d->fullName(), key,
+                       KEntryMap::SearchDefaults|KEntryMap::SearchLocalized);
+ 
+-    config()->d_func()->putData(d->fullName(), key, theDefault, KConfig::Normal,
+-                                theDefault.isNull() ? KConfigPrivate::Delete : KConfigPrivate::NoFlag);
++    config()->d_func()->putData(d->fullName(), key, theDefault, KConfig::Normal);
+ }
+ 
+ void KConfigGroup::revertToDefault(const char *key)
+@@ -1056,7 +1042,6 @@
+ bool KConfigGroup::hasDefault(const QByteArray& key) const
+ {
+     KEntryMap::SearchFlags flags = KEntryMap::SearchDefaults|KEntryMap::SearchLocalized;
+-    flags |= KEntryMap::SearchLocalized;
+ 
+     return !config()->d_func()->lookupData(d->fullName(), key, flags).isNull();
+ }
+@@ -1174,7 +1159,7 @@
+ {
+     Q_ASSERT(!d->bConst);
+ 
+-    config()->d_func()->putData(d->fullName(), key, translatePath(path).toUtf8(), flags, KConfigPrivate::Expand);
++    config()->d_func()->putData(d->fullName(), key, translatePath(path).toUtf8(), flags, true);
+ }
+ 
+ void KConfigGroup::writePathEntry(const QString &key, const QStringList &value, char sep, WriteConfigFlags flags)
+@@ -1195,7 +1180,7 @@
+     foreach(const QString& path, value)
+         list << translatePath(path).toUtf8();
+ 
+-    config()->d_func()->putData(d->fullName(), key, KConfigGroupPrivate::convertList(list, sep), flags, KConfigPrivate::Expand);
++    config()->d_func()->putData(d->fullName(), key, KConfigGroupPrivate::convertList(list, sep), flags, true);
+ }
+ 
+ QStringList KConfigGroup::groupList() const
+--- a/kdecore/config/kconfigbackend.h
++++ b/kdecore/config/kconfigbackend.h
+@@ -55,7 +55,7 @@
+     /** registers mappings from directory to configuration system
+      * @param entryMap the KEntryMap to build the mappings from
+      */
+-    static void registerMappings(KEntryMap& entryMap);
++    static void registerMappings(const KEntryMap& entryMap);
+ 
+     /** destroys the backend */
+     virtual ~KConfigBackend();
+@@ -110,6 +110,11 @@
+      */
+     virtual bool isWritable() const = 0;
+     /**
++     * get the read/write status of the configuration object.
++     * @note This function @b MUST be implemented by sub-classes.
++     */
++    virtual KConfigBase::ConfigState getConfigState() const = 0;
++    /**
+      * create the enclosing object of @em this object.
+      * @note This function @b MUST be implemented by sub-classes.
+      */
+--- a/kdecore/all_languages.desktop
++++ b/kdecore/all_languages.desktop
+@@ -7,6 +7,7 @@
+ Name[csb]=Afarsczi
+ Name[cy]=Afareg
+ Name[eo]=Afara
++Name[et]=Afari
+ Name[fa]=افار
+ Name[ga]=Afárais
+ Name[he]=אפאר
+@@ -27,8 +28,8 @@
+ Name[ru]=Афарский
+ Name[se]=Afárgiella
+ Name[sl]=afarsko
+-Name[sr]=Афарски
+-Name[sr at latin]=Afarski
++Name[sr]=афарски
++Name[sr at latin]=afarski
+ Name[ta]=அஃபார்
+ Name[te]=ఎఫార్
+ Name[tg]=Афарӣ
+@@ -86,8 +87,8 @@
+ Name[ru]=Абхазский
+ Name[se]=Abhásiagiella
+ Name[sl]=abkazijansko
+-Name[sr]=Абхазијски
+-Name[sr at latin]=Abhazijski
++Name[sr]=абхазијски
++Name[sr at latin]=abhazijski
+ Name[sv]=Abkhasiska
+ Name[ta]=அப்காசியன்
+ Name[te]=అబ్ఖజియన్
+@@ -128,6 +129,7 @@
+ Name[km]=អាវែស្តង់
+ Name[kn]=ಅವೆಸ್ತನ್
+ Name[ko]=아베스탄어
++Name[lv]=Avestāņu
+ Name[mk]=Авестан
+ Name[nb]=Avestisk
+ Name[nds]=Avesta
+@@ -140,8 +142,8 @@
+ Name[ru]=Авестийский
+ Name[se]=Avestánagiella
+ Name[sl]=avestansko
+-Name[sr]=Авестански
+-Name[sr at latin]=Avestanski
++Name[sr]=авестански
++Name[sr at latin]=avestanski
+ Name[sv]=Avestiska
+ Name[ta]=அவெஸ்தன்
+ Name[te]=అవెస్థన్
+@@ -189,8 +191,8 @@
+ Name[ru]=Африкаанс
+ Name[se]=Afrikánsgiella
+ Name[sl]=afrikansko
+-Name[sr]=Африканерски
+-Name[sr at latin]=Afrikanerski
++Name[sr]=африканерски
++Name[sr at latin]=afrikanerski
+ Name[sv]=Sydafrikansk holländska
+ Name[ta]=ஆஃபரிகான்ஸ்
+ Name[te]=ఆఫ్రికాన్స్
+@@ -251,8 +253,8 @@
+ Name[ru]=Амхарский
+ Name[se]=Ambháriagiella
+ Name[sl]=amharik
+-Name[sr]=Амарски
+-Name[sr at latin]=Amarski
++Name[sr]=амарски
++Name[sr at latin]=amarski
+ Name[sv]=Amarinja
+ Name[ta]=அம்ஹாரிக்
+ Name[te]=అమ్హరిక్
+@@ -318,8 +320,8 @@
+ Name[ru]=Арабский
+ Name[se]=Arábiagiella
+ Name[sl]=arabsko
+-Name[sr]=Арапски
+-Name[sr at latin]=Arapski
++Name[sr]=арапски
++Name[sr at latin]=arapski
+ Name[sv]=Arabiska
+ Name[ta]=அராபிக்
+ Name[te]=అరబిక్
+@@ -377,8 +379,8 @@
+ Name[ru]=Ассамский
+ Name[se]=Assamesegiella
+ Name[sl]=asamese
+-Name[sr]=Асамски
+-Name[sr at latin]=Asamski
++Name[sr]=асамејски
++Name[sr at latin]=asamejski
+ Name[sv]=Assamesiska
+ Name[ta]=அஸ்ஸாமிய
+ Name[te]=అస్సామీ
+@@ -414,7 +416,7 @@
+ Name[kn]=ಅಯಮಾರಾ
+ Name[ko]=아이마라어
+ Name[lb]=Aimara
+-Name[lv]=Ajmaru
++Name[lv]=Aimaru
+ Name[mk]=Ајмара
+ Name[ne]=एमरा
+ Name[pa]=ਅਯਮਾਰਾ
+@@ -423,8 +425,8 @@
+ Name[ru]=Аймарский
+ Name[se]=Aimáragiella
+ Name[sl]=ajmarsko
+-Name[sr]=Ајмарски
+-Name[sr at latin]=Ajmarski
++Name[sr]=ајмарски
++Name[sr at latin]=ajmarski
+ Name[ta]=அய்மாரா
+ Name[te]=అయ్మరా
+ Name[tg]=Аймарагӣ
+@@ -487,8 +489,8 @@
+ Name[ru]=Азербайджанский
+ Name[se]=Azerbaižánagiella
+ Name[sl]=azerbajdžansko
+-Name[sr]=Азербејџански
+-Name[sr at latin]=Azerbejdžanski
++Name[sr]=азербејџански
++Name[sr at latin]=azerbejdžanski
+ Name[sv]=Azerbajdzjanska
+ Name[ta]=அசர்பைசானி
+ Name[te]=అజెర్ బైజాని
+@@ -543,8 +545,8 @@
+ Name[ru]=Башкирский
+ Name[se]=Baškiriagiella
+ Name[sl]=baškirsko
+-Name[sr]=Башкирски
+-Name[sr at latin]=Baškirski
++Name[sr]=башкирски
++Name[sr at latin]=baškirski
+ Name[ta]=பாக்ஷீர்
+ Name[te]=బాష్కిర్
+ Name[tg]=Бошқирдӣ
+@@ -607,8 +609,8 @@
+ Name[ru]=Белорусский
+ Name[se]=Vilgesruoššagiella
+ Name[sl]=belorusko
+-Name[sr]=Белоруски
+-Name[sr at latin]=Beloruski
++Name[sr]=белоруски
++Name[sr at latin]=beloruski
+ Name[sv]=Vitryska
+ Name[ta]=பெலாரூசியன்
+ Name[te]=బెలరషియన్
+@@ -675,8 +677,8 @@
+ Name[ru]=Болгарский
+ Name[se]=Bulgáriagiella
+ Name[sl]=bolgarsko
+-Name[sr]=Бугарски
+-Name[sr at latin]=Bugarski
++Name[sr]=бугарски
++Name[sr at latin]=bugarski
+ Name[sv]=Bulgariska
+ Name[ta]=பல்கேரியன்
+ Name[te]=బల్గెరియన్
+@@ -715,8 +717,8 @@
+ Name[ru]=Бихарский
+ Name[se]=Biháragiella
+ Name[sl]=bihari
+-Name[sr]=Бихарски
+-Name[sr at latin]=Biharski
++Name[sr]=бихарски
++Name[sr at latin]=biharski
+ Name[ta]=பீகாரி
+ Name[te]=బిహారి
+ Name[tg]=Бихарӣ
+@@ -751,8 +753,8 @@
+ Name[ru]=Бислама
+ Name[se]=Bislamagiella
+ Name[sl]=bislama
+-Name[sr]=Бисламски
+-Name[sr at latin]=Bislamski
++Name[sr]=бисламски
++Name[sr at latin]=bislamski
+ Name[ta]=பிஸ்லாமா
+ Name[te]=బిస్లమా
+ Name[tg]=Бислама
+@@ -801,8 +803,8 @@
+ Name[ru]=Бенгали
+ Name[se]=Bengalagiella
+ Name[sl]=bengalsko
+-Name[sr]=Бенгалски
+-Name[sr at latin]=Bengalski
++Name[sr]=бенгалски
++Name[sr at latin]=bengalski
+ Name[ta]=பெங்காலி
+ Name[te]=బెంగాలి
+ Name[tg]=Бенголӣ
+@@ -866,8 +868,8 @@
+ Name[ru]=Тибетский
+ Name[se]=Tibehtagiella
+ Name[sl]=tibetansko
+-Name[sr]=Тибетански
+-Name[sr at latin]=Tibetanski
++Name[sr]=тибетански
++Name[sr at latin]=tibetanski
+ Name[sv]=Tibetanska
+ Name[ta]=திபெத்தியன்
+ Name[te]=టిబెటియన్
+@@ -929,8 +931,8 @@
+ Name[ru]=Бретонский
+ Name[se]=Bretonagiella
+ Name[sl]=bretonsko
+-Name[sr]=Бретонски
+-Name[sr at latin]=Bretonski
++Name[sr]=бретонски
++Name[sr at latin]=bretonski
+ Name[sv]=Bretonska
+ Name[ta]=பிரெடான்
+ Name[te]=బ్రెటన్
+@@ -997,8 +999,8 @@
+ Name[ru]=Боснийский
+ Name[se]=Bosniagiella
+ Name[sl]=bosansko
+-Name[sr]=Бошњачки
+-Name[sr at latin]=Bošnjački
++Name[sr]=бошњачки
++Name[sr at latin]=bošnjački
+ Name[sv]=Bosniska
+ Name[ta]=பொஸ்னியன்
+ Name[te]=బొస్నియన్
+@@ -1063,8 +1065,8 @@
+ Name[ru]=Каталонский
+ Name[se]=Katalánagiella
+ Name[sl]=katalonsko
+-Name[sr]=Каталонски
+-Name[sr at latin]=Katalonski
++Name[sr]=каталонски
++Name[sr at latin]=katalonski
+ Name[sv]=Katalanska
+ Name[ta]=கடலான்
+ Name[te]=కెటలన్
+@@ -1124,8 +1126,8 @@
+ Name[ru]=Чеченский
+ Name[se]=Čečeniagiella
+ Name[sl]=čečensko
+-Name[sr]=Чеченски
+-Name[sr at latin]=Čečenski
++Name[sr]=чеченски
++Name[sr at latin]=čečenski
+ Name[sv]=Tjetjenska
+ Name[ta]=செச்சென்
+ Name[te]=చెచన్
+@@ -1164,8 +1166,8 @@
+ Name[ru]=Чаморро
+ Name[se]=Chamorrogiella
+ Name[sl]=chamorro
+-Name[sr]=Чаморски
+-Name[sr at latin]=Čamorski
++Name[sr]=чаморски
++Name[sr at latin]=čamorski
+ Name[ta]=சமாரோ
+ Name[te]=చమొర్రొ
+ Name[tg]=Чаморроӣ
+@@ -1227,8 +1229,8 @@
+ Name[ru]=Корсиканский
+ Name[se]=Korsikagiella
+ Name[sl]=korzijško
+-Name[sr]=Корзикански
+-Name[sr at latin]=Korzikanski
++Name[sr]=корзикански
++Name[sr at latin]=korzikanski
+ Name[sv]=Korsikanska
+ Name[ta]=கோர்சிகன்
+ Name[te]=కొర్సికన్
+@@ -1293,8 +1295,8 @@
+ Name[ru]=Чешский
+ Name[se]=Čehkagiella
+ Name[sl]=češko
+-Name[sr]=Чешки
+-Name[sr at latin]=Češki
++Name[sr]=чешки
++Name[sr at latin]=češki
+ Name[sv]=Tjeckiska
+ Name[ta]=செக்
+ Name[te]=చెక్
+@@ -1358,8 +1360,8 @@
+ Name[ru]=Церковно-славянский
+ Name[se]=Slávagiella
+ Name[sl]=cerkvena slovanščina
+-Name[sr]=Црквени православни
+-Name[sr at latin]=Crkveni pravoslavni
++Name[sr]=црквенословенски
++Name[sr at latin]=crkvenoslovenski
+ Name[sv]=Kyrkoslaviska
+ Name[ta]=சர்ச் ஸ்லாவிக்
+ Name[te]=చర్చి స్లావిక్
+@@ -1411,8 +1413,8 @@
+ Name[ru]=Чувашский
+ Name[se]=Chuvashgiella
+ Name[sl]=chuvash
+-Name[sr]=Чувашки
+-Name[sr at latin]=Čuvaški
++Name[sr]=чувашки
++Name[sr at latin]=čuvaški
+ Name[sv]=Tjuvasjiska
+ Name[ta]=சுவாஷ்
+ Name[te]=చువాష్
+@@ -1477,8 +1479,8 @@
+ Name[ru]=Уэльский
+ Name[se]=Walesagiella
+ Name[sl]=valižansko
+-Name[sr]=Велшански
+-Name[sr at latin]=Velšanski
++Name[sr]=велшки
++Name[sr at latin]=velški
+ Name[sv]=Walesiska
+ Name[ta]=வெல்ஷ்
+ Name[te]=వెల్ష్
+@@ -1543,8 +1545,8 @@
+ Name[ru]=Датский
+ Name[se]=Dánskkagiella
+ Name[sl]=dansko
+-Name[sr]=Дански
+-Name[sr at latin]=Danski
++Name[sr]=дански
++Name[sr at latin]=danski
+ Name[sv]=Danska
+ Name[ta]=டேனிஷ்
+ Name[te]=డెనిష్
+@@ -1611,8 +1613,8 @@
+ Name[ru]=Немецкий
+ Name[se]=Duiskkagiella
+ Name[sl]=nemško
+-Name[sr]=Немачки
+-Name[sr at latin]=Nemački
++Name[sr]=немачки
++Name[sr at latin]=nemački
+ Name[sv]=Tyska
+ Name[ta]=ஜெர்மன்
+ Name[te]=జెర్మన్
+@@ -1648,8 +1650,8 @@
+ Name[ru]=Дзонгка (Бутан)
+ Name[se]=Dzongkhagiella
+ Name[sl]=dzonkha
+-Name[sr]=Џонка
+-Name[sr at latin]=Džonka
++Name[sr]=џонка
++Name[sr at latin]=džonka
+ Name[ta]=ட்சொங்க்ஹா
+ Name[te]=జొంగ్ఖ
+ Name[tg]=Дзонгка (Бутан)
+@@ -1713,8 +1715,8 @@
+ Name[ru]=Греческий
+ Name[se]=Greikkagiella
+ Name[sl]=grško
+-Name[sr]=Грчки
+-Name[sr at latin]=Grčki
++Name[sr]=грчки
++Name[sr at latin]=grčki
+ Name[sv]=Grekiska
+ Name[ta]=கிரேக்கம்
+ Name[te]=గ్రీక్
+@@ -1782,8 +1784,8 @@
+ Name[ru]=Английский
+ Name[se]=Eŋgelasgiella
+ Name[sl]=angleško
+-Name[sr]=Енглески
+-Name[sr at latin]=Engleski
++Name[sr]=енглески
++Name[sr at latin]=engleski
+ Name[sv]=Engelska
+ Name[ta]=ஆங்கிலம்
+ Name[te]=ఆంగ్లం
+@@ -1850,8 +1852,8 @@
+ Name[ru]=Английский (Великобритания)
+ Name[se]=Eŋgelasgiella (Stuorra Brittania)
+ Name[sl]=britansko angleško
+-Name[sr]=Британски енглески
+-Name[sr at latin]=Britanski engleski
++Name[sr]=британски енглески
++Name[sr at latin]=britanski engleski
+ Name[sv]=Brittisk engelska
+ Name[ta]=பிரிட்டிஷ் ஆங்கிலம்
+ Name[te]=బ్రిటిష్ ఆంగ్లం
+@@ -1916,8 +1918,8 @@
+ Name[ru]=Английский (США)
+ Name[se]=Eŋgelasgiella (Amerihkáhlaš)
+ Name[sl]=ameriško angleško
+-Name[sr]=Амерички енглески
+-Name[sr at latin]=Američki engleski
++Name[sr]=амерички енглески
++Name[sr at latin]=američki engleski
+ Name[sv]=Amerikansk engelska
+ Name[ta]=அமெரிக்கன் ஆங்கிலம்
+ Name[te]=అమెరికన్ ఆంగ్లం
+@@ -1953,7 +1955,8 @@
+ Name[pa]=ਇਸਪੀਰਨਟੋ
+ Name[ru]=Эсперанто
+ Name[sl]=esperanto
+-Name[sr]=Есперанто
++Name[sr]=есперанто
++Name[sr at latin]=esperanto
+ Name[ta]=எஸ்பரான்டோ
+ Name[te]=ఎస్పరాన్టొ
+ Name[tg]=Эсперантоӣ
+@@ -2017,8 +2020,8 @@
+ Name[ru]=Испанский
+ Name[se]=Spánskkagiella
+ Name[sl]=špansko
+-Name[sr]=Шпански
+-Name[sr at latin]=Španski
++Name[sr]=шпански
++Name[sr at latin]=španski
+ Name[sv]=Spanska
+ Name[ta]=ஸ்பானிய
+ Name[te]=స్పెనిష్
+@@ -2086,8 +2089,8 @@
+ Name[ru]=Эстонский
+ Name[se]=Esttegiella
+ Name[sl]=estonsko
+-Name[sr]=Естонски
+-Name[sr at latin]=Estonski
++Name[sr]=естонски
++Name[sr at latin]=estonski
+ Name[sv]=Estniska
+ Name[ta]=எஸ்டோனியன்
+ Name[te]=ఎస్టొనియన్
+@@ -2151,8 +2154,8 @@
+ Name[ru]=Баскский
+ Name[se]=Baskalašgiella
+ Name[sl]=baskovsko
+-Name[sr]=Баскијски
+-Name[sr at latin]=Baskijski
++Name[sr]=баскијски
++Name[sr at latin]=baskijski
+ Name[sv]=Baskiska
+ Name[ta]=பாஸ்க்
+ Name[te]=బాస్క్
+@@ -2219,8 +2222,8 @@
+ Name[ru]=Фарси
+ Name[se]=Farsigiella (Persialaš)
+ Name[sl]=Farsi (perzijsko)
+-Name[sr]=Фарси (Персијски)
+-Name[sr at latin]=Farsi (Persijski)
++Name[sr]=фарси (персијски)
++Name[sr at latin]=farsi (persijski)
+ Name[sv]=Persiska
+ Name[ta]=பார்சி (பெர்சியன்)
+ Name[te]=ఫార్సి (పెర్షియన్)
+@@ -2286,8 +2289,8 @@
+ Name[ru]=Финский
+ Name[se]=Suomagiella
+ Name[sl]=finsko
+-Name[sr]=Фински
+-Name[sr at latin]=Finski
++Name[sr]=фински
++Name[sr at latin]=finski
+ Name[sv]=Finska
+ Name[ta]=ஃபின்னிஷ்
+ Name[te]=ఫిన్నిష్
+@@ -2350,8 +2353,8 @@
+ Name[ru]=Фиджи
+ Name[se]=Fižigiella
+ Name[sl]=fidžijsko
+-Name[sr]=Фиџијски
+-Name[sr at latin]=Fidžijski
++Name[sr]=фиџијски
++Name[sr at latin]=fidžijski
+ Name[sv]=Fijianska
+ Name[ta]=ஃபிஜியன்
+ Name[te]=ఫిజియన్
+@@ -2412,8 +2415,8 @@
+ Name[ru]=Фарерский
+ Name[se]=Fearagiella
+ Name[sl]=fersko
+-Name[sr]=Фарски
+-Name[sr at latin]=Farski
++Name[sr]=фарски
++Name[sr at latin]=farski
+ Name[sv]=Färöiska
+ Name[ta]=ஃபாரோவீஸ்
+ Name[te]=ఫారొఈస్
+@@ -2479,8 +2482,8 @@
+ Name[ru]=Французский
+ Name[se]=Fránskkagiella
+ Name[sl]=francosko
+-Name[sr]=Француски
+-Name[sr at latin]=Francuski
++Name[sr]=француски
++Name[sr at latin]=francuski
+ Name[sv]=Franska
+ Name[ta]=பிரென்ச்
+ Name[te]=ఫ్రెంచ్
+@@ -2546,8 +2549,8 @@
+ Name[ru]=Фризийский
+ Name[se]=Frisagiella
+ Name[sl]=frizijsko
+-Name[sr]=Фризијски
+-Name[sr at latin]=Frizijski
++Name[sr]=фризијски
++Name[sr at latin]=frizijski
+ Name[sv]=Frisiska
+ Name[ta]=ஃபரீசியன்
+ Name[te]=ఫ్రిసియన్
+@@ -2607,8 +2610,8 @@
+ Name[ru]=Галльский (Ирландия)
+ Name[se]=Irlánddalaš gaelagiella
+ Name[sl]=irsko galsko
+-Name[sr]=Ирски галски
+-Name[sr at latin]=Irski galski
++Name[sr]=ирски галски
++Name[sr at latin]=irski galski
+ Name[sv]=Irländsk galiciska
+ Name[ta]=ஐரிஷ் காலிக்
+ Name[te]=ఐరిష్ గెలిక్
+@@ -2666,8 +2669,8 @@
+ Name[ru]=Галльский
+ Name[se]=Gaelagiella
+ Name[sl]=galsko
+-Name[sr]=Галски
+-Name[sr at latin]=Galski
++Name[sr]=галски
++Name[sr at latin]=galski
+ Name[sv]=Galiciska
+ Name[ta]=கேலிக்
+ Name[te]=గెలిక్
+@@ -2731,8 +2734,8 @@
+ Name[ru]=Галицийский
+ Name[se]=Galisiagiella
+ Name[sl]=galicijsko
+-Name[sr]=Галицијски
+-Name[sr at latin]=Galicijski
++Name[sr]=галицијски
++Name[sr at latin]=galicijski
+ Name[sv]=Galiciska
+ Name[ta]=காலிசியன்
+ Name[te]=గలిచియన్
+@@ -2774,8 +2777,8 @@
+ Name[ru]=Гуарани
+ Name[se]=Guaránagiella
+ Name[sl]=guarani
+-Name[sr]=Гварански
+-Name[sr at latin]=Gvaranski
++Name[sr]=гварани
++Name[sr at latin]=gvarani
+ Name[sv]=Gujarati
+ Name[ta]=குவரானி
+ Name[te]=గువారాని
+@@ -2819,8 +2822,8 @@
+ Name[ru]=Гуджарати
+ Name[se]=Gujaratigiella
+ Name[sl]=gujarati
+-Name[sr]=Гујаратски
+-Name[sr at latin]=Gujaratski
++Name[sr]=гујарати
++Name[sr at latin]=gujarati
+ Name[ta]=குஜராத்தி
+ Name[te]=గుజరాతీ
+ Name[tg]=Гӯҷаратӣ
+@@ -2862,8 +2865,8 @@
+ Name[ru]=Манкс
+ Name[se]=Mánksagiella
+ Name[sl]=manx
+-Name[sr]=Манкски
+-Name[sr at latin]=Mankski
++Name[sr]=манкс
++Name[sr at latin]=manks
+ Name[ta]=மான்க்ஸ்
+ Name[te]=మేన్క్స్
+ Name[tg]=Манксӣ
+@@ -2903,7 +2906,8 @@
+ Name[ru]=Хауса
+ Name[se]=Hausagiella
+ Name[sl]=hausa
+-Name[sr]=Хауса
++Name[sr]=хауса
++Name[sr at latin]=hausa
+ Name[ta]=ஹவுசா
+ Name[te]=హౌసా
+ Name[tg]=Хаусагӣ
+@@ -2967,8 +2971,8 @@
+ Name[ru]=Иврит
+ Name[se]=Hebreagiella
+ Name[sl]=hebrejsko
+-Name[sr]=Хебрејски
+-Name[sr at latin]=Hebrejski
++Name[sr]=хебрејски
++Name[sr at latin]=hebrejski
+ Name[sv]=Hebreiska
+ Name[ta]=எபிரேயம்
+ Name[te]=హీబ్రూ
+@@ -3011,8 +3015,8 @@
+ Name[ru]=Хинди
+ Name[se]=Hindigiella
+ Name[sl]=hindujsko
+-Name[sr]=Хинду
+-Name[sr at latin]=Hindu
++Name[sr]=хинду
++Name[sr at latin]=hindu
+ Name[ta]=ஹிந்தி
+ Name[te]=హింది
+ Name[tg]=Ҳиндӣ
+@@ -3050,8 +3054,8 @@
+ Name[ru]=Хири Моту
+ Name[se]=Hiri Motu-giella
+ Name[sl]=hiri motu
+-Name[sr]=Хиримотски
+-Name[sr at latin]=Hirimotski
++Name[sr]=хири-моту
++Name[sr at latin]=hiri-motu
+ Name[sv]=Hirimotu
+ Name[ta]=ஹிரி மொட்டு
+ Name[te]=హిరి మోటు
+@@ -3116,8 +3120,8 @@
+ Name[ru]=Хорватский
+ Name[se]=Kroatiagiella
+ Name[sl]=hrvaško
+-Name[sr]=Хрватски
+-Name[sr at latin]=Hrvatski
++Name[sr]=хрватски
++Name[sr at latin]=hrvatski
+ Name[sv]=Kroatiska
+ Name[ta]=குரொவேசியன்
+ Name[te]=క్రొయెషియన్
+@@ -3163,6 +3167,7 @@
+ Name[kn]=ಮೇಲಿನ ಸೋರ್ಬಿಯನ್
+ Name[ko]=고지대 소르비아어
+ Name[lb]=Uewersorbesch
++Name[lv]=Augšvendu
+ Name[mk]=Јужно лужички
+ Name[nb]=Øvresorbisk
+ Name[nds]=Böversorbsch
+@@ -3177,8 +3182,8 @@
+ Name[ru]=Верхнелужицкий
+ Name[se]=Bajil Sorbiagiella
+ Name[sl]=zgornjesorbijsko
+-Name[sr]=Горње лужичко српски
+-Name[sr at latin]=Gornje lužičko srpski
++Name[sr]=горњолужичкосрпски
++Name[sr at latin]=gornjolužičkosrpski
+ Name[sv]=Högsorbiska
+ Name[ta]=அப்பர் செர்பியன்
+ Name[te]=అప్పర్ సొర్బియన్
+@@ -3244,8 +3249,8 @@
+ Name[ru]=Венгерский
+ Name[se]=Ungárgiella
+ Name[sl]=madžarsko
+-Name[sr]=Мађарски
+-Name[sr at latin]=Mađarski
++Name[sr]=мађарски
++Name[sr at latin]=mađarski
+ Name[sv]=Ungerska
+ Name[ta]=ஹங்கேரியன்
+ Name[te]=హంగెరియన్
+@@ -3312,8 +3317,8 @@
+ Name[ru]=Армянский
+ Name[se]=Armeniagiella
+ Name[sl]=armensko
+-Name[sr]=Јерменски
+-Name[sr at latin]=Jermenski
++Name[sr]=јерменски
++Name[sr at latin]=jermenski
+ Name[sv]=Armenska
+ Name[ta]=ஆர்மீனியன்
+ Name[te]=అర్మెనియన్
+@@ -3352,8 +3357,8 @@
+ Name[ru]=Эреро
+ Name[se]=Hererogiella
+ Name[sl]=herero
+-Name[sr]=Херерски
+-Name[sr at latin]=Hererski
++Name[sr]=хереро
++Name[sr at latin]=herero
+ Name[ta]=ஹெர்ரோ
+ Name[te]=హెరెరో
+ Name[tg]=Херэро
+@@ -3386,8 +3391,8 @@
+ Name[pt_BR]=Interlíngua
+ Name[ru]=Интерлингва
+ Name[sl]=interlingua
+-Name[sr]=Интерлингвански
+-Name[sr at latin]=Interlingvanski
++Name[sr]=интерлингва
++Name[sr at latin]=interlingva
+ Name[ta]=இன்டெர்லிங்குவா
+ Name[te]=ఇంటర్ లింగువా
+ Name[tg]=Забони миёнрав
+@@ -3452,8 +3457,8 @@
+ Name[ru]=Индонезийский
+ Name[se]=Indonesiagiella
+ Name[sl]=indonezijsko
+-Name[sr]=Индонезијски
+-Name[sr at latin]=Indonezijski
++Name[sr]=индонезијски
++Name[sr at latin]=indonezijski
+ Name[sv]=Indonesiska
+ Name[ta]=இந்தோனீசியன்
+ Name[te]=ఇన్డొనెషియన్
+@@ -3492,8 +3497,8 @@
+ Name[ne]=इन्टरलिङ्गुवा
+ Name[pa]=ਇੰਟਰਈਨੂਗੂਈ
+ Name[sl]=interlingue
+-Name[sr]=Интерлингвијски
+-Name[sr at latin]=Interlingvijski
++Name[sr]=интерлингве
++Name[sr at latin]=interlingve
+ Name[sv]=Interlingua
+ Name[ta]=இன்டெர்லிங்கு
+ Name[te]=ఇంటర్ లింగె
+@@ -3531,8 +3536,8 @@
+ Name[ru]=Инупиак
+ Name[se]=Inupiaqgiella
+ Name[sl]=inupiaq
+-Name[sr]=Инупиакски
+-Name[sr at latin]=Inupiakski
++Name[sr]=инупијак
++Name[sr at latin]=inupijak
+ Name[ta]=இனுபியாக்
+ Name[te]=ఇనుపియాక్
+ Name[tg]=Инупиакӣ
+@@ -3563,8 +3568,8 @@
+ Name[ru]=Идо
+ Name[se]=Idogiella
+ Name[sl]=ido
+-Name[sr]=Идоски
+-Name[sr at latin]=Idoski
++Name[sr]=идо
++Name[sr at latin]=ido
+ Name[ta]=ஈடோ
+ Name[te]=ఇడొ
+ Name[tg]=Идо
+@@ -3627,8 +3632,8 @@
+ Name[ru]=Исландский
+ Name[se]=Islánddagiella
+ Name[sl]=islandsko
+-Name[sr]=Исландски
+-Name[sr at latin]=Islandski
++Name[sr]=исландски
++Name[sr at latin]=islandski
+ Name[sv]=Isländska
+ Name[ta]=ஐஸ்லாந்திக்
+ Name[te]=ఐస్ లేండిక్
+@@ -3695,8 +3700,8 @@
+ Name[ru]=Итальянский
+ Name[se]=Itáliagiella
+ Name[sl]=italijansko
+-Name[sr]=Италијански
+-Name[sr at latin]=Italijanski
++Name[sr]=италијански
++Name[sr at latin]=italijanski
+ Name[sv]=Italienska
+ Name[ta]=இத்தாலியன்
+ Name[te]=ఇటాలియన్
+@@ -3732,8 +3737,8 @@
+ Name[ru]=Инуктитут
+ Name[se]=Inuhkagiella
+ Name[sl]=inuktitut
+-Name[sr]=Инуктитутски
+-Name[sr at latin]=Inuktitutski
++Name[sr]=инуктитут
++Name[sr at latin]=inuktitut
+ Name[ta]=இனுக்டிடுட்
+ Name[te]=ఇనుక్తిటుట్
+ Name[tg]=Инуктитут
+@@ -3797,8 +3802,8 @@
+ Name[ru]=Японский
+ Name[se]=Jáhpangiella
+ Name[sl]=japonsko
+-Name[sr]=Јапански
+-Name[sr at latin]=Japanski
++Name[sr]=јапански
++Name[sr at latin]=japanski
+ Name[sv]=Japanska
+ Name[ta]=ஜப்பானியம்
+ Name[te]=జపనీస్
+@@ -3864,8 +3869,8 @@
+ Name[ru]=Яванский
+ Name[se]=Jávagiella
+ Name[sl]=javansko
+-Name[sr]=Јавански
+-Name[sr at latin]=Javanski
++Name[sr]=јавански
++Name[sr at latin]=javanski
+ Name[sv]=Javanska
+ Name[ta]=ஜாவானீஸ்
+ Name[te]=జావానీస్
+@@ -3931,8 +3936,8 @@
+ Name[ru]=Грузинский
+ Name[se]=Grusiagiella
+ Name[sl]=gruzijsko
+-Name[sr]=Грузијски
+-Name[sr at latin]=Gruzijski
++Name[sr]=грузијски
++Name[sr at latin]=gruzijski
+ Name[sv]=Georgiska
+ Name[ta]=ஜார்ஜியன்
+ Name[te]=జార్జియన్
+@@ -3970,8 +3975,8 @@
+ Name[ru]=Кикую
+ Name[se]=Kikujugiella
+ Name[sl]=kikuyu
+-Name[sr]=Кикујски
+-Name[sr at latin]=Kikujski
++Name[sr]=кикују
++Name[sr at latin]=kikuju
+ Name[ta]=கியுகு
+ Name[te]=కికుయు
+ Name[tg]=Кикуягӣ
+@@ -4025,8 +4030,8 @@
+ Name[ru]=Казахский
+ Name[se]=Kazakhagiella
+ Name[sl]=kazaško
+-Name[sr]=Казачки
+-Name[sr at latin]=Kazački
++Name[sr]=казачки
++Name[sr at latin]=kazački
+ Name[sv]=Kazakiska
+ Name[ta]=கசாக்
+ Name[te]=కజాఖ్
+@@ -4064,8 +4069,8 @@
+ Name[ru]=Калаалисут
+ Name[se]=Kalállisutgiella
+ Name[sl]=kalaallisut
+-Name[sr]=Калалисутски
+-Name[sr at latin]=Kalalisutski
++Name[sr]=калалисут
++Name[sr at latin]=kalalisut
+ Name[sv]=Grönländska
+ Name[ta]=கலாலிசுட்
+ Name[te]=కలాల్లిసుత్
+@@ -4109,8 +4114,8 @@
+ Name[ru]=Кхмерский
+ Name[se]=Khmeragiella
+ Name[sl]=kmersko
+-Name[sr]=Кмерски
+-Name[sr at latin]=Kmerski
++Name[sr]=кмерски
++Name[sr at latin]=kmerski
+ Name[sv]=Kambodjanska
+ Name[ta]=கெமர்
+ Name[te]=ఖ్మెర్
+@@ -4147,8 +4152,8 @@
+ Name[ru]=Каннада
+ Name[se]=Kannadagiella
+ Name[sl]=kannada
+-Name[sr]=Канадски
+-Name[sr at latin]=Kanadski
++Name[sr]=канадски
++Name[sr at latin]=kanadski
+ Name[sv]=Kanaresiska
+ Name[ta]=கன்னடம்
+ Name[te]=కన్నడ
+@@ -4213,8 +4218,8 @@
+ Name[ru]=Корейский
+ Name[se]=Koreagiella
+ Name[sl]=korejsko
+-Name[sr]=Корејски
+-Name[sr at latin]=Korejski
++Name[sr]=корејски
++Name[sr at latin]=korejski
+ Name[sv]=Koreanska
+ Name[ta]=கொரியன்
+ Name[te]=కొరియన్
+@@ -4269,8 +4274,8 @@
+ Name[ru]=Кашмирский
+ Name[se]=Kašmirgiella
+ Name[sl]=kašmirsko
+-Name[sr]=Кашмирски
+-Name[sr at latin]=Kašmirski
++Name[sr]=кашмирски
++Name[sr at latin]=kašmirski
+ Name[ta]=காஷ்மீரி
+ Name[te]=కష్మీరీ
+ Name[tg]=Кашмирӣ
+@@ -4333,8 +4338,8 @@
+ Name[ru]=Курдский
+ Name[se]=Kurdigiella
+ Name[sl]=kurdsko
+-Name[sr]=Курдски
+-Name[sr at latin]=Kurdski
++Name[sr]=курдски
++Name[sr at latin]=kurdski
+ Name[sv]=Kurdiska
+ Name[ta]=குர்திஷ்
+ Name[te]=కుర్దిష్
+@@ -4373,8 +4378,8 @@
+ Name[ru]=Коми
+ Name[se]=Komigiella
+ Name[sl]=komi
+-Name[sr]=Комски
+-Name[sr at latin]=Komski
++Name[sr]=коми
++Name[sr at latin]=komi
+ Name[ta]=கோமி
+ Name[te]=కోమి
+ Name[tg]=Коми
+@@ -4431,8 +4436,8 @@
+ Name[ru]=Корнуольский
+ Name[se]=Kornagiella
+ Name[sl]=cornish
+-Name[sr]=Корнски
+-Name[sr at latin]=Kornski
++Name[sr]=корниш
++Name[sr at latin]=korniš
+ Name[sv]=Korniska
+ Name[ta]=கோர்னிஷ்
+ Name[te]=కొర్నిష్
+@@ -4493,8 +4498,8 @@
+ Name[ru]=Киргизский
+ Name[se]=Kirgisiagiella
+ Name[sl]=kirgizijsko
+-Name[sr]=Киргиски
+-Name[sr at latin]=Kirgiski
++Name[sr]=киргиз
++Name[sr at latin]=kirgiz
+ Name[sv]=Kirghiziska
+ Name[ta]=கிர்கிஸ்
+ Name[te]=కిర్ఘిజ్
+@@ -4540,6 +4545,7 @@
+ Name[ko]=라틴어
+ Name[lb]=Latäin
+ Name[lt]=Lotynų
++Name[lv]=Latīņu
+ Name[mk]=Латински
+ Name[nds]=Latiensch
+ Name[ne]=ल्याटिन
+@@ -4552,8 +4558,8 @@
+ Name[ru]=Латинский
+ Name[se]=Láhtengiella
+ Name[sl]=latinsko
+-Name[sr]=Латински
+-Name[sr at latin]=Latinski
++Name[sr]=латински
++Name[sr at latin]=latinski
+ Name[ta]=இலத்தீன்
+ Name[te]=లాటిన్
+ Name[tg]=Лотинӣ
+@@ -4615,8 +4621,8 @@
+ Name[ru]=Люксембургский
+ Name[se]=Luksenburggagiella
+ Name[sl]=luksemburško
+-Name[sr]=Луксембуршки
+-Name[sr at latin]=Luksemburški
++Name[sr]=луксембуршки
++Name[sr at latin]=luksemburški
+ Name[sv]=Luxemburgiska
+ Name[ta]=லக்சம்போர்கிஷ்
+ Name[te]=లక్సెంబర్గిష్
+@@ -4674,8 +4680,8 @@
+ Name[ru]=Лимбуржский
+ Name[se]=Limburggagiella
+ Name[sl]=limburgan
+-Name[sr]=Лимбуршки
+-Name[sr at latin]=Limburški
++Name[sr]=лимбуршки
++Name[sr at latin]=limburški
+ Name[sv]=Limburgiska
+ Name[ta]=லக்சம்பேர்க்
+ Name[te]=లింబర్గన్
+@@ -4709,8 +4715,8 @@
+ Name[ru]=Лингала
+ Name[se]=Lingalagiella
+ Name[sl]=lingala
+-Name[sr]=Лингалски
+-Name[sr at latin]=Lingalski
++Name[sr]=лингала
++Name[sr at latin]=lingala
+ Name[ta]=லிங்காலா
+ Name[te]=లింగాలా
+ Name[tg]=Лингалӣ
+@@ -4752,7 +4758,8 @@
+ Name[ru]=Лао
+ Name[se]=Laogiella
+ Name[sl]=laoško
+-Name[sr]=Лао
++Name[sr]=лаоћански
++Name[sr at latin]=laoćanski
+ Name[sv]=Laotiska
+ Name[ta]=லாவோ
+ Name[te]=లావో
+@@ -4818,8 +4825,8 @@
+ Name[ru]=Литовский
+ Name[se]=Lietuvagiella
+ Name[sl]=litvansko
+-Name[sr]=Литвански
+-Name[sr at latin]=Litvanski
++Name[sr]=литвански
++Name[sr at latin]=litvanski
+ Name[sv]=Litauiska
+ Name[ta]=லிதுவேனியன்
+ Name[te]=లితువెనియన్
+@@ -4885,8 +4892,8 @@
+ Name[ru]=Латышский
+ Name[se]=Látviagiella
+ Name[sl]=latvijsko
+-Name[sr]=Латвијски
+-Name[sr at latin]=Latvijski
++Name[sr]=латвијски
++Name[sr at latin]=latvijski
+ Name[sv]=Lettiska
+ Name[ta]=இலட்வியன்
+ Name[te]=లాటివ్యన్
+@@ -4946,8 +4953,8 @@
+ Name[ru]=Мальгашский
+ Name[se]=Malagasigiella
+ Name[sl]=malagaško
+-Name[sr]=Малагаски
+-Name[sr at latin]=Malagaski
++Name[sr]=малагаси
++Name[sr at latin]=malagasi
+ Name[sv]=Malagassiska
+ Name[ta]=மலகாசி
+ Name[te]=మలగాసి
+@@ -5010,8 +5017,8 @@
+ Name[ru]=Маршалльский
+ Name[se]=Marshallagiella
+ Name[sl]=maršalsko
+-Name[sr]=Маршалески
+-Name[sr at latin]=Maršaleski
++Name[sr]=маршалески
++Name[sr at latin]=maršaleski
+ Name[sv]=Marshall
+ Name[ta]=மார்ஷலீஸ்
+ Name[te]=మార్షలీస్
+@@ -5057,8 +5064,8 @@
+ Name[ru]=Маори
+ Name[se]=Maoragiella
+ Name[sl]=maorsko
+-Name[sr]=Маорски
+-Name[sr at latin]=Maorski
++Name[sr]=маорски
++Name[sr at latin]=maorski
+ Name[sv]=Maoriska
+ Name[ta]=மாவோரி
+ Name[te]=మావొరి
+@@ -5124,8 +5131,8 @@
+ Name[ru]=Македонский
+ Name[se]=Makedoniagiella
+ Name[sl]=makedonsko
+-Name[sr]=Македонски
+-Name[sr at latin]=Makedonski
++Name[sr]=македонски
++Name[sr at latin]=makedonski
+ Name[sv]=Makedonska
+ Name[ta]=மாசிடோனியன்
+ Name[te]=మసిడొనియన్
+@@ -5174,8 +5181,8 @@
+ Name[ru]=Малайялам
+ Name[se]=Malajalamagiella
+ Name[sl]=malayalam
+-Name[sr]=Малајамски
+-Name[sr at latin]=Malajamski
++Name[sr]=малајалам
++Name[sr at latin]=malajalam
+ Name[ta]=மலையாளம்
+ Name[te]=మలయాళం
+ Name[tg]=Малаямӣ
+@@ -5239,8 +5246,8 @@
+ Name[ru]=Монгольский
+ Name[se]=Mongoliagiella
+ Name[sl]=mongolsko
+-Name[sr]=Монголски
+-Name[sr at latin]=Mongolski
++Name[sr]=монголски
++Name[sr at latin]=mongolski
+ Name[sv]=Mongoliska
+ Name[ta]=மொங்கோலியன்
+ Name[te]=మంగోలియన్
+@@ -5306,8 +5313,8 @@
+ Name[ru]=Молдавский
+ Name[se]=Moldáviagiella
+ Name[sl]=moldavsko
+-Name[sr]=Молдавски
+-Name[sr at latin]=Moldavski
++Name[sr]=молдавски
++Name[sr at latin]=moldavski
+ Name[sv]=Moldaviska
+ Name[ta]=மோல்டோவியன்
+ Name[te]=మొల్దావియన్
+@@ -5352,8 +5359,8 @@
+ Name[ru]=Марати
+ Name[se]=Marathagiella
+ Name[sl]=marathi
+-Name[sr]=Маратски
+-Name[sr at latin]=Maratski
++Name[sr]=марати
++Name[sr at latin]=marati
+ Name[ta]=மராத்தி
+ Name[te]=మరాఠి
+ Name[tg]=Маравӣ
+@@ -5411,8 +5418,8 @@
+ Name[ru]=Малайский
+ Name[se]=Malaigiella
+ Name[sl]=malajsko
+-Name[sr]=Малајски
+-Name[sr at latin]=Malajski
++Name[sr]=малајски
++Name[sr at latin]=malajski
+ Name[sv]=Malajiska
+ Name[ta]=மலாய்
+ Name[te]=మలయ
+@@ -5475,8 +5482,8 @@
+ Name[ru]=Мальтийский
+ Name[se]=Maltagiella
+ Name[sl]=maltežansko
+-Name[sr]=Малтешки
+-Name[sr at latin]=Malteški
++Name[sr]=малтешки
++Name[sr at latin]=malteški
+ Name[sv]=Maltesiska
+ Name[ta]=மால்டீசிய
+ Name[te]=మాల్టీస్
+@@ -5542,8 +5549,8 @@
+ Name[ru]=Бирманский
+ Name[se]=Burmagiella
+ Name[sl]=burmansko
+-Name[sr]=Бурмански
+-Name[sr at latin]=Burmanski
++Name[sr]=бурмански
++Name[sr at latin]=burmanski
+ Name[sv]=Burmesiska
+ Name[ta]=பர்மிய
+ Name[te]=బర్మీస్
+@@ -5587,8 +5594,8 @@
+ Name[ru]=Науру
+ Name[se]=Naurugiella
+ Name[sl]=nauru
+-Name[sr]=Наурски
+-Name[sr at latin]=Naurski
++Name[sr]=науру
++Name[sr at latin]=nauru
+ Name[ta]=நவுரு
+ Name[te]=నౌరు
+ Name[tg]=Науру
+@@ -5651,8 +5658,8 @@
+ Name[ru]=Норвежский (литературный)
+ Name[se]=Girjedárogiella
+ Name[sl]=norveško (bokmaal)
+-Name[sr]=Норвешки (Бокмалски)
+-Name[sr at latin]=Norveški (Bokmalski)
++Name[sr]=норвешки (бокмал)
++Name[sr at latin]=norveški (bokmal)
+ Name[sv]=Norskt bokmål
+ Name[ta]=நார்வீஜியன் பொக்மால்
+ Name[te]=నార్వీజియన్ బోక్మాల్
+@@ -5715,8 +5722,8 @@
+ Name[ru]=Сев. Ндебеле
+ Name[se]=Ndebelegiella, davvi
+ Name[sl]=ndebele, severno
+-Name[sr]=Ндебеле, Северни
+-Name[sr at latin]=Ndebele, Severni
++Name[sr]=ндебеле, северни
++Name[sr at latin]=ndebele, severni
+ Name[sv]=Nordndebele
+ Name[ta]=டெபெலே, வட
+ Name[te]=నెబేలె, ఉత్తర
+@@ -5780,15 +5787,15 @@
+ Name[ru]=Нижнесаксонский
+ Name[se]=Vuolil Sáksonagiella
+ Name[sl]=spodnjesaško
+-Name[sr]=Доњи саксонски
+-Name[sr at latin]=Donji saksonski
++Name[sr]=доњосаксонски
++Name[sr at latin]=donjosaksonski
+ Name[sv]=Lågsaxiska
+ Name[ta]=லோ சாக்ஸான்
+ Name[te]=లో సాక్సన్
+ Name[tg]=Саксон
+ Name[th]=ภาษาเยอรมัน ระดับล่าง
+ Name[tr]=Aşağı Sakson
+-Name[uk]=Ніжньосаксонська
++Name[uk]=Нижньосаксонська
+ Name[uz]=Паст Саксонча
+ Name[vi]=Xác-xọnh thấp
+ Name[wa]=Bas sacson
+@@ -5837,8 +5844,8 @@
+ Name[ru]=Непальский
+ Name[se]=Nepálagiella
+ Name[sl]=nepalsko
+-Name[sr]=Непалски
+-Name[sr at latin]=Nepalski
++Name[sr]=непалски
++Name[sr at latin]=nepalski
+ Name[ta]=நேபாளி
+ Name[te]=నేపాలి
+ Name[tg]=Непалӣ
+@@ -5873,7 +5880,8 @@
+ Name[ru]=Ндонга
+ Name[se]=Ndongagiella
+ Name[sl]=ndonga
+-Name[sr]=Ндонга
++Name[sr]=ндонга
++Name[sr at latin]=ndonga
+ Name[ta]=டொங்கா
+ Name[te]=డొంగా
+ Name[tg]=Ндонга
+@@ -5937,8 +5945,8 @@
+ Name[ru]=Голландский
+ Name[se]=Hollánddagiella
+ Name[sl]=nizozemsko
+-Name[sr]=Холандски
+-Name[sr at latin]=Holandski
++Name[sr]=холандски
++Name[sr at latin]=holandski
+ Name[sv]=Holländska
+ Name[ta]=டச்சு
+ Name[te]=డచ్
+@@ -6005,8 +6013,8 @@
+ Name[ru]=Норвежский (нинорский)
+ Name[se]=Ođđadárogiella
+ Name[sl]=norveško (nyorsk)
+-Name[sr]=Норвешки (Ниноршки)
+-Name[sr at latin]=Norveški (Ninorški)
++Name[sr]=норвешки (нинорск)
++Name[sr at latin]=norveški (ninorsk)
+ Name[sv]=Nynorska
+ Name[ta]=நார்வீஜியன் (நையோர்ஸ்க்)
+ Name[te]=నార్వీజియన్ న్యోర్స్క్
+@@ -6070,8 +6078,8 @@
+ Name[ru]=Юж. Ндебеле
+ Name[se]=Ndebelegiella, lulli
+ Name[sl]=ndebele, južno
+-Name[sr]=Ндебеле, Јужни
+-Name[sr at latin]=Ndebele, Južni
++Name[sr]=ндебеле, јужни
++Name[sr at latin]=ndebele, južni
+ Name[sv]=Sydndebele
+ Name[ta]=டெபெலே, தென்
+ Name[te]=నెబేలె, దక్షిణ
+@@ -6137,8 +6145,8 @@
+ Name[ru]=Северное Сото
+ Name[se]=Davvi-sothogiella
+ Name[sl]=severni sotho
+-Name[sr]=Северни сото
+-Name[sr at latin]=Severni soto
++Name[sr]=сото, северни
++Name[sr at latin]=soto, severni
+ Name[sv]=Nordsotho
+ Name[ta]=நார்தன் சோத்தோ
+ Name[te]=ఉత్తర సొతొ
+@@ -6176,8 +6184,8 @@
+ Name[ru]=Навахо
+ Name[se]=Naváhogiella
+ Name[sl]=navajo
+-Name[sr]=Навахо
+-Name[sr at latin]=Navaho
++Name[sr]=навахо
++Name[sr at latin]=navaho
+ Name[sv]=Navaho
+ Name[ta]=நவாஜோ
+ Name[te]=నవాజొ
+@@ -6218,8 +6226,8 @@
+ Name[ru]=Чичева
+ Name[se]=Chichevagiella
+ Name[sl]=chichewa
+-Name[sr]=Чичевски
+-Name[sr at latin]=Čičevski
++Name[sr]=чичева
++Name[sr at latin]=čičeva
+ Name[sv]=Chewa
+ Name[ta]=சிச்செவா
+ Name[te]=చిచెవా
+@@ -6277,8 +6285,8 @@
+ Name[ru]=Французский (диалект Occitan)
+ Name[se]=Oksitánagiella
+ Name[sl]=očitansko
+-Name[sr]=Оцитански
+-Name[sr at latin]=Ocitanski
++Name[sr]=оцитански
++Name[sr at latin]=ocitanski
+ Name[sv]=Occitanska
+ Name[ta]=ஒக்சிட்டான்
+ Name[te]=ఒస్సిటాన్
+@@ -6314,8 +6322,8 @@
+ Name[ru]=Оромо
+ Name[se]=Oromogiella
+ Name[sl]=oromo
+-Name[sr]=Оромски
+-Name[sr at latin]=Oromski
++Name[sr]=оромо
++Name[sr at latin]=oromo
+ Name[ta]=ஒரோமோ
+ Name[te]=ఒరొమొ
+ Name[tg]=Оромо
+@@ -6354,8 +6362,8 @@
+ Name[ru]=Ория
+ Name[se]=Orijagiella
+ Name[sl]=oriya
+-Name[sr]=Оријски
+-Name[sr at latin]=Orijski
++Name[sr]=оријски
++Name[sr at latin]=orijski
+ Name[ta]=ஒரியா
+ Name[te]=ఒరియా
+ Name[tg]=Ориёӣ
+@@ -6414,8 +6422,8 @@
+ Name[ru]=Осетинский
+ Name[se]=Ossetiagiella
+ Name[sl]=osetijsko
+-Name[sr]=Осетски
+-Name[sr at latin]=Osetski
++Name[sr]=осетски
++Name[sr at latin]=osetski
+ Name[sv]=Ossetsiska
+ Name[ta]=ஒசெட்டியன்
+ Name[te]=ఒస్సెషియన్
+@@ -6434,11 +6442,13 @@
+ Name[ar]=بنجابية
+ Name[be]=Панджабі
+ Name[bn_IN]=পাঞ্জাবি
++Name[br]=Pendjabieg
+ Name[ca]=Panjabi
+ Name[cs]=Pandžábský
+ Name[de]=Pandschabi
+ Name[eo]=Panĝaba
+ Name[es]=Punjabi
++Name[et]=Pandžabi
+ Name[fa]=پنجابی/پنجابی
+ Name[ga]=Painseáibis
+ Name[he]=פנג'אבית
+@@ -6448,14 +6458,18 @@
+ Name[km]=ពូនយ៉ាប៊ី
+ Name[kn]=ಪಂಜಾಬಿ
+ Name[ko]=펀자브어
++Name[lv]=Pandžabu
+ Name[nds]=Pandschaabsch
+ Name[ne]=पन्जाबी/पन्जाबी
+ Name[nl]=Panjabi
+ Name[pa]=ਪੰਜਾਬੀ
+ Name[pt]=Panjabi/Punjabi
+ Name[sl]=pandžabsko
++Name[sr]=панџаби/панџаби
++Name[sr at latin]=pandžabi/pandžabi
+ Name[te]=పంజాబి
+ Name[th]=ภาษาปัญจาบี/ปัญจาบ
++Name[uk]=Панджабська
+ Name[vi]=Pan-gia-bi
+ Name[wa]=Pundjabi
+ Name[x-test]=xxPunjabi/Panjabixx
+@@ -6482,8 +6496,8 @@
+ Name[ru]=Пали
+ Name[se]=Páligiella
+ Name[sl]=pali
+-Name[sr]=Палијски
+-Name[sr at latin]=Palijski
++Name[sr]=пали
++Name[sr at latin]=pali
+ Name[ta]=பாலி
+ Name[te]=పాళి
+ Name[tg]=Пали
+@@ -6547,8 +6561,8 @@
+ Name[ru]=Польский
+ Name[se]=Polskkagiella
+ Name[sl]=poljsko
+-Name[sr]=Пољски
+-Name[sr at latin]=Poljski
++Name[sr]=пољски
++Name[sr at latin]=poljski
+ Name[sv]=Polska
+ Name[ta]=போலிஷ்
+ Name[te]=పోలిష్
+@@ -6597,8 +6611,8 @@
+ Name[ru]=Пуштунский
+ Name[se]=Puštugiella
+ Name[sl]=pushto
+-Name[sr]=Пушто
+-Name[sr at latin]=Pušto
++Name[sr]=пушто
++Name[sr at latin]=pušto
+ Name[sv]=Pashto
+ Name[ta]=பாஷ்டுன்
+ Name[te]=పుష్తొ
+@@ -6664,8 +6678,8 @@
+ Name[ru]=Португальский
+ Name[se]=Portugálagiella
+ Name[sl]=portugalsko
+-Name[sr]=Португалски
+-Name[sr at latin]=Portugalski
++Name[sr]=португалски
++Name[sr at latin]=portugalski
+ Name[sv]=Portugisiska
+ Name[ta]=போர்த்துக்கீசிய
+ Name[te]=పోర్ట్యుగీస్
+@@ -6731,8 +6745,8 @@
+ Name[ru]=Португальский (Бразилия)
+ Name[se]=Brasilialaš portugálagiella
+ Name[sl]=brazilska portugalščina
+-Name[sr]=Бразилско португалски
+-Name[sr at latin]=Brazilsko portugalski
++Name[sr]=бразилски португалски
++Name[sr at latin]=brazilski portugalski
+ Name[sv]=Brasiliansk portugisiska
+ Name[ta]=பிரேஸிலிய போர்த்துக்கீசிய
+ Name[te]=బ్రాజిలియన్ పోర్ట్యుగీస్
+@@ -6776,8 +6790,8 @@
+ Name[ru]=Кечуа
+ Name[se]=Keččuagiella
+ Name[sl]=quechua
+-Name[sr]=Квечва
+-Name[sr at latin]=Kvečva
++Name[sr]=квечва
++Name[sr at latin]=kvečva
+ Name[ta]=குவெச்சா
+ Name[te]=క్వెచువా
+ Name[tg]=Квечуа
+@@ -6813,7 +6827,8 @@
+ Name[ru]=Рунди
+ Name[se]=Rundigiella
+ Name[sl]=rundi
+-Name[sr]=Рунди
++Name[sr]=рунди
++Name[sr at latin]=rundi
+ Name[ta]=ருண்டி
+ Name[te]=రుండి
+ Name[tg]=Рунди
+@@ -6878,8 +6893,8 @@
+ Name[ru]=Румынский
+ Name[se]=Romániagiella
+ Name[sl]=romunsko
+-Name[sr]=Румунски
+-Name[sr at latin]=Rumunski
++Name[sr]=румунски
++Name[sr at latin]=rumunski
+ Name[sv]=Rumänska
+ Name[ta]=உருமேனியன்
+ Name[te]=రొమేనియన్
+@@ -6925,6 +6940,7 @@
+ Name[kn]=ರೋಮನೀ
+ Name[ko]=로마니어
+ Name[lb]=Romani
++Name[lv]=Čigānu
+ Name[mk]=Ромски
+ Name[ms]=Romania
+ Name[nb]=Romani
+@@ -6940,8 +6956,8 @@
+ Name[ru]=Цыганский
+ Name[se]=Románigiella
+ Name[sl]=romsko
+-Name[sr]=Ромски
+-Name[sr at latin]=Romski
++Name[sr]=ромски
++Name[sr at latin]=romski
+ Name[sv]=Romanés
+ Name[te]=రొమని
+ Name[tg]=Романӣ
+@@ -7004,8 +7020,8 @@
+ Name[ru]=Русский
+ Name[se]=Ruoššagiella
+ Name[sl]=rusko
+-Name[sr]=Руски
+-Name[sr at latin]=Ruski
++Name[sr]=руски
++Name[sr at latin]=ruski
+ Name[sv]=Ryska
+ Name[ta]=இரஷியன்
+ Name[te]=రషియన్
+@@ -7048,8 +7064,8 @@
+ Name[ru]=Киньяруанда
+ Name[se]=Kinyarwandagiella
+ Name[sl]=kinyarwanda
+-Name[sr]=Кинијарвандаски
+-Name[sr at latin]=Kinijarvandaski
++Name[sr]=кинијарванда
++Name[sr at latin]=kinijarvanda
+ Name[sv]=Rwanda
+ Name[ta]=கின்யார்வாண்டா
+ Name[te]=కిన్న్యార్వాండా
+@@ -7100,7 +7116,8 @@
+ Name[ru]=Санскрит
+ Name[se]=Sanskrihtagiella
+ Name[sl]=sanskrt
+-Name[sr]=Санскрит
++Name[sr]=санскрит
++Name[sr at latin]=sanskrit
+ Name[ta]=சமஸ்கிருதம்
+ Name[te]=సంస్క్రుతం
+ Name[tg]=Санскрит
+@@ -7162,8 +7179,8 @@
+ Name[ru]=Сардинийский
+ Name[se]=Sardiniagiella
+ Name[sl]=sardinsko
+-Name[sr]=Сардинијски
+-Name[sr at latin]=Sardinijski
++Name[sr]=сардинијски
++Name[sr at latin]=sardinijski
+ Name[sv]=Sardiska
+ Name[ta]=சார்டீனியன்
+ Name[te]=సార్డినియన్
+@@ -7203,8 +7220,8 @@
+ Name[ru]=Синдхи
+ Name[se]=Sindhigiella
+ Name[sl]=sindijsko
+-Name[sr]=Синдиски
+-Name[sr at latin]=Sindiski
++Name[sr]=синди
++Name[sr at latin]=sindi
+ Name[ta]=சிந்தி
+ Name[te]=సింధి
+ Name[tg]=Синдхӣ
+@@ -7232,7 +7249,7 @@
+ Name[de]=Nördliches Sami
+ Name[eo]=Norda Samea
+ Name[es]=Samí del norte
+-Name[et]=Põhja-saami
++Name[et]=Põhjasaami
+ Name[eu]=Samia (iparrekoa)
+ Name[fa]=سامی شمالی
+ Name[fi]=Pohjoissaame
+@@ -7252,7 +7269,7 @@
+ Name[ko]=북부 사미어
+ Name[lb]=Nördlecht Sami
+ Name[lt]=Šiaurės Sami
+-Name[lv]=Ziemeļu Sāmu
++Name[lv]=Ziemeļu sāmu
+ Name[mk]=Северен Сами
+ Name[ms]=Sami Utara
+ Name[nb]=Nordsamisk
+@@ -7268,8 +7285,8 @@
+ Name[ru]=Северное Саами
+ Name[se]=Davvisámegiella
+ Name[sl]=severno sami
+-Name[sr]=Северносамски
+-Name[sr at latin]=Severnosamski
++Name[sr]=северни сами
++Name[sr at latin]=severni sami
+ Name[sv]=Samiska
+ Name[ta]=நார்தன் சாமி
+ Name[te]=ఉత్తర సమి
+@@ -7307,7 +7324,8 @@
+ Name[ru]=Санго
+ Name[se]=Sangogiella
+ Name[sl]=sango
+-Name[sr]=Санго
++Name[sr]=санго
++Name[sr at latin]=sango
+ Name[ta]=சாங்கோ
+ Name[te]=సాంగొ
+ Name[tg]=Санго
+@@ -7366,8 +7384,8 @@
+ Name[ru]=Сингальский
+ Name[se]=Singalesagiella
+ Name[sl]=sinhalese
+-Name[sr]=Синхалски
+-Name[sr at latin]=Sinhalski
++Name[sr]=синхалски
++Name[sr at latin]=sinhalski
+ Name[sv]=Singalesiska
+ Name[ta]=சிங்களம்
+ Name[te]=సింహలీస్
+@@ -7432,8 +7450,8 @@
+ Name[ru]=Словацкий
+ Name[se]=Slovákagiella
+ Name[sl]=slovaško
+-Name[sr]=Словачки
+-Name[sr at latin]=Slovački
++Name[sr]=словачки
++Name[sr at latin]=slovački
+ Name[sv]=Slovakiska
+ Name[ta]=சுலோவாக்
+ Name[te]=స్లొవాక్
+@@ -7501,8 +7519,8 @@
+ Name[ru]=Словенский
+ Name[se]=Slovenagiella
+ Name[sl]=slovensko
+-Name[sr]=Словеначки
+-Name[sr at latin]=Slovenački
++Name[sr]=словеначки
++Name[sr at latin]=slovenački
+ Name[sv]=Slovenska
+ Name[ta]=சுலோவீனியன்
+ Name[te]=స్లొవేనియన్
+@@ -7564,8 +7582,8 @@
+ Name[ru]=Самоа
+ Name[se]=Samoagiella
+ Name[sl]=samojsko
+-Name[sr]=Самоански
+-Name[sr at latin]=Samoanski
++Name[sr]=самоански
++Name[sr at latin]=samoanski
+ Name[sv]=Samoanska
+ Name[ta]=சமோவன்
+ Name[te]=సమొవన్
+@@ -7604,8 +7622,8 @@
+ Name[ru]=Схона
+ Name[se]=Šonagiella
+ Name[sl]=shona
+-Name[sr]=Шонски
+-Name[sr at latin]=Šonski
++Name[sr]=шона
++Name[sr at latin]=šona
+ Name[ta]=ஷோனா
+ Name[te]=షొనా
+ Name[tg]=Шонӣ
+@@ -7659,8 +7677,8 @@
+ Name[ru]=Сомалийский
+ Name[se]=Somálagiella
+ Name[sl]=somalsko
+-Name[sr]=Сомалијски
+-Name[sr at latin]=Somalijski
++Name[sr]=сомалијски
++Name[sr at latin]=somalijski
+ Name[ta]=சோமாலி
+ Name[te]=సొమాలి
+ Name[tg]=Сомалӣ
+@@ -7725,8 +7743,8 @@
+ Name[ru]=Албанский
+ Name[se]=Albániagiella
+ Name[sl]=albansko
+-Name[sr]=Албански
+-Name[sr at latin]=Albanski
++Name[sr]=албански
++Name[sr at latin]=albanski
+ Name[sv]=Albanska
+ Name[ta]=அல்பேனியன்
+ Name[te]=అల్బేనియన్
+@@ -7792,8 +7810,8 @@
+ Name[ru]=Сербский
+ Name[se]=Serbiagiella
+ Name[sl]=srbsko
+-Name[sr]=Српски
+-Name[sr at latin]=Srpski
++Name[sr]=српски
++Name[sr at latin]=srpski
+ Name[sv]=Serbiska
+ Name[ta]=செர்பியன்
+ Name[te]=సెర్బియన్
+@@ -7859,8 +7877,8 @@
+ Name[ru]=Сербский латинницей
+ Name[se]=Serbialaš latiidnagiella
+ Name[sl]=srbsko latinsko
+-Name[sr]=Српски латинични
+-Name[sr at latin]=Srpski latinični
++Name[sr]=српски (латиница)
++Name[sr at latin]=srpski (latinica)
+ Name[sv]=Latinsk serbiska
+ Name[te]=సెర్బియన్ లాటిన్
+ Name[tg]=Лотини Сербиявӣ
+@@ -7897,8 +7915,8 @@
+ Name[ru]=Свати
+ Name[se]=Svatigiella
+ Name[sl]=swati
+-Name[sr]=Свати
+-Name[sr at latin]=Svati
++Name[sr]=свати
++Name[sr at latin]=svati
+ Name[sv]=Swazi
+ Name[ta]=சுவாதி
+ Name[te]=స్వాతి
+@@ -7963,8 +7981,8 @@
+ Name[ru]=Юж. Сото
+ Name[se]=Sothogiella, lulli
+ Name[sl]=sotho, južni
+-Name[sr]=Сото, јужни
+-Name[sr at latin]=Soto, južni
++Name[sr]=сото, јужни
++Name[sr at latin]=soto, južni
+ Name[sv]=Sydsotho
+ Name[ta]=சோத்தோ, தென்
+ Name[te]=సోతొ, దక్షిణ
+@@ -8025,8 +8043,8 @@
+ Name[ru]=Суданский
+ Name[se]=Sundanesagiella
+ Name[sl]=sudansko
+-Name[sr]=Сундански
+-Name[sr at latin]=Sundanski
++Name[sr]=сундански
++Name[sr at latin]=sundanski
+ Name[sv]=Sundanesiska
+ Name[ta]=சூடானீஸ்
+ Name[te]=సన్దనీస్
+@@ -8091,8 +8109,8 @@
+ Name[ru]=Шведский
+ Name[se]=Ruoŧagiella
+ Name[sl]=švedsko
+-Name[sr]=Шведски
+-Name[sr at latin]=Švedski
++Name[sr]=шведски
++Name[sr at latin]=švedski
+ Name[sv]=Svenska
+ Name[ta]=சுவீடிஷ்
+ Name[te]=స్వీడిష్
+@@ -8140,8 +8158,8 @@
+ Name[ru]=Суахили
+ Name[se]=Svahilagiella
+ Name[sl]=svahili
+-Name[sr]=Свахили
+-Name[sr at latin]=Svahili
++Name[sr]=свахили
++Name[sr at latin]=svahili
+ Name[ta]=ஸ்வாஹிலி
+ Name[te]=స్వాహిలి
+ Name[tg]=Свахили
+@@ -8165,6 +8183,7 @@
+ Name[cs]=Tamilský
+ Name[csb]=Tamilsczi
+ Name[da]=Tamilsk
++Name[de]=Tamilisch
+ Name[eo]=Tamila
+ Name[et]=Tamili
+ Name[eu]=Tamilera
+@@ -8193,8 +8212,8 @@
+ Name[ru]=Тамильский
+ Name[se]=Tamilgiella
+ Name[sl]=tamilsko
+-Name[sr]=Тамилски
+-Name[sr at latin]=Tamilski
++Name[sr]=тамилски
++Name[sr at latin]=tamilski
+ Name[ta]=தமிழ்
+ Name[te]=తమిళం
+ Name[tg]=Тамилӣ
+@@ -8232,8 +8251,8 @@
+ Name[ru]=Телугу
+ Name[se]=Telugugiella
+ Name[sl]=telugu
+-Name[sr]=Телугски
+-Name[sr at latin]=Telugski
++Name[sr]=телугу
++Name[sr at latin]=telugu
+ Name[ta]=தெலுங்கு
+ Name[te]=తెలుగు
+ Name[tg]=Телугуягӣ
+@@ -8294,8 +8313,8 @@
+ Name[ru]=Таджикский
+ Name[se]=Tažihkagiella
+ Name[sl]=tadžiško
+-Name[sr]=Таџикистански
+-Name[sr at latin]=Tadžikistanski
++Name[sr]=таџикистански
++Name[sr at latin]=tadžikistanski
+ Name[sv]=Tadzjikiska
+ Name[ta]=தஜிக்
+ Name[te]=తాజిక్
+@@ -8320,6 +8339,7 @@
+ Name[cs]=Thajský
+ Name[csb]=Tajsczi
+ Name[da]=Thailandsk
++Name[de]=Thailändische Schrift
+ Name[el]=Ταϊλανδικά
+ Name[eo]=Taja
+ Name[es]=Tailandés
+@@ -8353,8 +8373,8 @@
+ Name[ru]=Тайский
+ Name[se]=Thaigiella
+ Name[sl]=tajsko
+-Name[sr]=Тајландски
+-Name[sr at latin]=Tajlandski
++Name[sr]=тајландски
++Name[sr at latin]=tajlandski
+ Name[sv]=Thailändska
+ Name[ta]=தாய்
+ Name[te]=థాయి
+@@ -8399,8 +8419,8 @@
+ Name[ru]=Тигринья
+ Name[se]=Tigrinjágiella
+ Name[sl]=tigrinya
+-Name[sr]=Тигрински
+-Name[sr at latin]=Tigrinski
++Name[sr]=тигрињи
++Name[sr at latin]=tigrinji
+ Name[sv]=Tigrinja
+ Name[ta]=திகிரின்யா
+ Name[te]=టిగ్రిన్యా
+@@ -8461,8 +8481,8 @@
+ Name[ru]=Туркменский
+ Name[se]=Turkmenagiella
+ Name[sl]=turkmensko
+-Name[sr]=Туркменистански
+-Name[sr at latin]=Turkmenistanski
++Name[sr]=туркменистански
++Name[sr at latin]=turkmenistanski
+ Name[sv]=Turkmenska
+ Name[ta]=துருக்மென்
+ Name[te]=తుర్క్మెన్
+@@ -8505,8 +8525,8 @@
+ Name[ru]=Тсвана
+ Name[se]=Tswanagiella
+ Name[sl]=tswana
+-Name[sr]=Цвана
+-Name[sr at latin]=Cvana
++Name[sr]=цвана
++Name[sr at latin]=cvana
+ Name[ta]=ஸ்வானா
+ Name[te]=స్వానా
+ Name[tg]=Сванавӣ
+@@ -8547,7 +8567,8 @@
+ Name[ru]=Тонга
+ Name[se]=Tongagiella
+ Name[sl]=tongaško
+-Name[sr]=Тонга
++Name[sr]=тонга
++Name[sr at latin]=tonga
+ Name[ta]=டோங்கா
+ Name[te]=టొన్గా
+ Name[tg]=Тонгаӣ
+@@ -8611,8 +8632,8 @@
+ Name[ru]=Турецкий
+ Name[se]=Turkiijagiella
+ Name[sl]=turško
+-Name[sr]=Турски
+-Name[sr at latin]=Turski
++Name[sr]=турски
++Name[sr at latin]=turski
+ Name[sv]=Turkiska
+ Name[ta]=துருக்கிய
+ Name[te]=టర్కిష్
+@@ -8650,8 +8671,8 @@
+ Name[ru]=Тсонга
+ Name[se]=Tsongagiella
+ Name[sl]=tsonga
+-Name[sr]=Цонга
+-Name[sr at latin]=Conga
++Name[sr]=цонга
++Name[sr at latin]=conga
+ Name[ta]=டிசோங்கா
+ Name[te]=సొంగా
+ Name[tg]=Сонгавӣ
+@@ -8703,8 +8724,8 @@
+ Name[ru]=Татарский
+ Name[se]=Tatáragiella
+ Name[sl]=tatarsko
+-Name[sr]=Татарски
+-Name[sr at latin]=Tatarski
++Name[sr]=татарски
++Name[sr at latin]=tatarski
+ Name[sv]=Tatariska
+ Name[ta]=டாடார்
+ Name[te]=తతర్
+@@ -8738,8 +8759,8 @@
+ Name[ru]=Тви
+ Name[se]=Twigiella
+ Name[sl]=twi
+-Name[sr]=Твиски
+-Name[sr at latin]=Tviski
++Name[sr]=тви
++Name[sr at latin]=tvi
+ Name[ta]=த்வீ
+ Name[te]=ట్వి
+ Name[tg]=Твиягӣ
+@@ -8800,8 +8821,8 @@
+ Name[ru]=Таити
+ Name[se]=Tahitigiella
+ Name[sl]=tahitijsko
+-Name[sr]=Тахићански
+-Name[sr at latin]=Tahićanski
++Name[sr]=тахићански
++Name[sr at latin]=tahićanski
+ Name[sv]=Tahitiska
+ Name[ta]=தஹிடியன்
+ Name[te]=టహితియన్
+@@ -8850,8 +8871,8 @@
+ Name[ru]=Уйгурский
+ Name[se]=Uiguragiella
+ Name[sl]=ujgursko
+-Name[sr]=Ујгурски
+-Name[sr at latin]=Ujgurski
++Name[sr]=ујгур
++Name[sr at latin]=ujgur
+ Name[sv]=Uiguriska
+ Name[ta]=உயிகூர்
+ Name[te]=ఉఇఘర్
+@@ -8918,8 +8939,8 @@
+ Name[ru]=Украинский
+ Name[se]=Ukrainagiella
+ Name[sl]=ukrajinsko
+-Name[sr]=Украјински
+-Name[sr at latin]=Ukrajinski
++Name[sr]=украјински
++Name[sr at latin]=ukrajinski
+ Name[sv]=Ukrainska
+ Name[ta]=உக்ரேனியன்
+ Name[te]=ఉక్రేనియన్
+@@ -8958,7 +8979,8 @@
+ Name[ru]=Урду
+ Name[se]=Urdugiella
+ Name[sl]=urdu
+-Name[sr]=Урду
++Name[sr]=урду
++Name[sr at latin]=urdu
+ Name[ta]=உருது
+ Name[te]=ఉర్దు
+ Name[tg]=Урду
+@@ -9017,8 +9039,8 @@
+ Name[ru]=Узбекский
+ Name[se]=Uzbehkagiella
+ Name[sl]=uzbeško
+-Name[sr]=Узбечки
+-Name[sr at latin]=Uzbečki
++Name[sr]=узбечки
++Name[sr at latin]=uzbečki
+ Name[sv]=Uzbekiska
+ Name[ta]=உஸ்பெக்
+ Name[te]=ఉజ్బెక్
+@@ -9053,7 +9075,8 @@
+ Name[ru]=Венда
+ Name[se]=Vendagiella
+ Name[sl]=venda
+-Name[sr]=Венда
++Name[sr]=венда
++Name[sr at latin]=venda
+ Name[ta]=வெண்டா
+ Name[te]=వెండా
+ Name[tg]=Вендаӣ
+@@ -9115,8 +9138,8 @@
+ Name[ru]=Вьетнамский
+ Name[se]=Vietnamagiella
+ Name[sl]=vietnamsko
+-Name[sr]=Вијетнамски
+-Name[sr at latin]=Vijetnamski
++Name[sr]=вијетнамски
++Name[sr at latin]=vijetnamski
+ Name[sv]=Vietnamesiska
+ Name[ta]=வியட்னாமிய
+ Name[te]=వియత్నామీస్
+@@ -9157,8 +9180,8 @@
+ Name[ru]=Волапюк
+ Name[se]=Volapükgiella
+ Name[sl]=volapük
+-Name[sr]=Волапикски
+-Name[sr at latin]=Volapikski
++Name[sr]=волапик
++Name[sr at latin]=volapik
+ Name[ta]=வொல்பாக்
+ Name[te]=వొలపుక్
+ Name[tg]=Волапёкӣ
+@@ -9215,8 +9238,8 @@
+ Name[ru]=Валлонский
+ Name[se]=Vallonagiella
+ Name[sl]=walloonsko
+-Name[sr]=Валонски
+-Name[sr at latin]=Valonski
++Name[sr]=валонски
++Name[sr at latin]=valonski
+ Name[sv]=Vallonska
+ Name[ta]=வாலூன்
+ Name[te]=వాలూన్
+@@ -9259,8 +9282,8 @@
+ Name[ru]=Уолоф
+ Name[se]=Volofagiella
+ Name[sl]=wolof
+-Name[sr]=Волофски
+-Name[sr at latin]=Volofski
++Name[sr]=волоф
++Name[sr at latin]=volof
+ Name[ta]=வொலொஃப்
+ Name[te]=వొలొఫ్
+ Name[tg]=Волофӣ
+@@ -9289,19 +9312,20 @@
+ Name[km]=ឃូសា
+ Name[kn]=ಗ್ಝೋಸಾ
+ Name[ko]=크호사어
++Name[lv]=Khosu
+ Name[mk]=Ксоса
+ Name[ne]=होसा
+ Name[pa]=ਝੋਸਾ
+ Name[ru]=Кшоса
+ Name[se]=Xhosagiella
+ Name[sl]=xhosa
+-Name[sr]=Зоса
+-Name[sr at latin]=Zosa
++Name[sr]=гзоса
++Name[sr at latin]=gzosa
+ Name[ta]=சோசா
+ Name[te]=క్జొసా
+ Name[tg]=Хоса
+ Name[th]=ภาษาโคซา
+-Name[uk]=Ксоза
++Name[uk]=Хоза
+ Name[uz]=Хҳоса
+ Name[vi]=Xô-xa
+ Name[wa]=Xhossa
+@@ -9352,8 +9376,8 @@
+ Name[ru]=Идиш
+ Name[se]=Jiddišgiella
+ Name[sl]=yiddish
+-Name[sr]=Јидијски
+-Name[sr at latin]=Jidijski
++Name[sr]=јидиш
++Name[sr at latin]=jidiš
+ Name[ta]=யிட்டிஷ்
+ Name[te]=యిడ్డిష్
+ Name[tg]=Йидишӣ
+@@ -9397,8 +9421,8 @@
+ Name[ru]=Йоруба
+ Name[se]=Jorubagiella
+ Name[sl]=yoruba
+-Name[sr]=Јорубски
+-Name[sr at latin]=Jorubski
++Name[sr]=јоруба
++Name[sr at latin]=joruba
+ Name[ta]=யொரூபா
+ Name[te]=యొరుబా
+ Name[tg]=Ёруба
+@@ -9432,8 +9456,8 @@
+ Name[ru]=Чжуанг
+ Name[se]=Zhuangagiella
+ Name[sl]=zhuang
+-Name[sr]=Цуанг
+-Name[sr at latin]=Cuang
++Name[sr]=жуанг
++Name[sr at latin]=žuang
+ Name[ta]=சுவாங்
+ Name[te]=జువాంగ్
+ Name[tg]=Жуанг
+@@ -9497,8 +9521,8 @@
+ Name[ru]=Китайский
+ Name[se]=Kiinnágiella
+ Name[sl]=kitajsko
+-Name[sr]=Кинески
+-Name[sr at latin]=Kineski
++Name[sr]=кинески
++Name[sr at latin]=kineski
+ Name[sv]=Kinesiska
+ Name[ta]=சீனம்
+ Name[te]=చైనీస్
+@@ -9565,8 +9589,8 @@
+ Name[ru]=Китайский (КНР)
+ Name[se]=Álkiduvvon kiinnágiella
+ Name[sl]=poenostavljeno kitajsko
+-Name[sr]=Поједностављени кинески
+-Name[sr at latin]=Pojednostavljeni kineski
++Name[sr]=кинески, поједностављени
++Name[sr at latin]=kineski, pojednostavljeni
+ Name[sv]=Förenklad kinesiska
+ Name[ta]=சீனம் சுலபமாக்கப்பட்டது
+ Name[te]=సరళికరించిన చైనీస్
+@@ -9631,8 +9655,8 @@
+ Name[ru]=Китайский (Гонконг)
+ Name[se]=Kiinnágiella (Hong Kong)
+ Name[sl]=kitajsko (Hong Kong)
+-Name[sr]=Кинески (Хонгконг)
+-Name[sr at latin]=Kineski (Hongkong)
++Name[sr]=кинески (хонконшки)
++Name[sr at latin]=kineski (honkonški)
+ Name[sv]=Kinesiska (Hong Kong)
+ Name[te]=చైనీస్ (హాంగ్ కాంగ్)
+ Name[tg]=Хитоӣ (Гон-Конг)
+@@ -9695,8 +9719,8 @@
+ Name[ru]=Китайский (Тайвань)
+ Name[se]=Árbevirolaš kiinnágiella
+ Name[sl]=tradicionalno kitajsko
+-Name[sr]=Традиционални кинески
+-Name[sr at latin]=Tradicionalni kineski
++Name[sr]=кинески, традиционални
++Name[sr at latin]=kineski, tradicionalni
+ Name[sv]=Traditionell kinesiska
+ Name[ta]=சீனம் பழமையானது
+ Name[te]=సాంప్రదాయక చైనీస్
+@@ -9741,7 +9765,8 @@
+ Name[ru]=Зулусский
+ Name[se]=Zulugiella
+ Name[sl]=zulu
+-Name[sr]=Зулу
++Name[sr]=зулу
++Name[sr at latin]=zulu
+ Name[ta]=ஜுலு
+ Name[te]=జూలు
+ Name[tg]=Зулу
+--- a/kdecore/util/qtest_kde.h
++++ b/kdecore/util/qtest_kde.h
+@@ -78,6 +78,7 @@
+ { \
+     setenv("LC_ALL", "C", 1); \
+     setenv("KDEHOME", QFile::encodeName( QDir::homePath() + "/.kde-unit-test" ), 1); \
++    unsetenv("KDE_COLOR_DEBUG"); \
+     KAboutData aboutData( componentName, 0, ki18n("qttest"), "version" );  \
+     KDEMainFlags mainFlags = flags;                         \
+     KComponentData cData(&aboutData); \
+--- a/knewstuff/knewstuff2/engine.cpp
++++ b/knewstuff/knewstuff2/engine.cpp
+@@ -46,6 +46,7 @@
+         setDxsPolicy(DxsEngine::DxsNever); // FIXME: until KIO/cDXS gets fixed!
+         m_entry = NULL;
+         m_modal = false;
++        m_parent = parent;
+     }
+ 
+     enum Command
+@@ -65,6 +66,7 @@
+     KNS::Entry *m_entry;
+     KNS::Provider::List m_providers;
+     bool m_modal;
++    QWidget * m_parent;
+ 
+   private Q_SLOTS:
+     void slotProviderLoaded(KNS::Provider *provider);
+@@ -128,7 +130,7 @@
+                 SIGNAL(signalEntriesFeedFinished(const KNS::Feed*)),
+                 SLOT(slotEntriesFeedFinished(const KNS::Feed*)));
+ 
+-        m_downloaddialog = new DownloadDialog(this, 0);
++        m_downloaddialog = new DownloadDialog(this,m_parent);
+         m_downloaddialog->show();
+ 
+         connect(m_downloaddialog, SIGNAL(finished()), SLOT(slotDownloadDialogClosed()));

Modified: branches/kde4/packages/kdelibs/debian/patches/10_kdehome_kde4.diff
===================================================================
--- branches/kde4/packages/kdelibs/debian/patches/10_kdehome_kde4.diff	2007-10-18 17:58:43 UTC (rev 7533)
+++ branches/kde4/packages/kdelibs/debian/patches/10_kdehome_kde4.diff	2007-10-18 18:58:49 UTC (rev 7534)
@@ -1,6 +1,6 @@
 --- a/kdecore/kernel/kstandarddirs.cpp
 +++ b/kdecore/kernel/kstandarddirs.cpp
-@@ -1431,7 +1431,7 @@
+@@ -1432,7 +1432,7 @@
  #ifdef Q_WS_MACX
          localKdeDir =  QDir::homePath() + "/Library/Preferences/KDE/";
  #else

Modified: branches/kde4/packages/kdelibs/debian/patches/13_qt4_designer_plugins_path.diff
===================================================================
--- branches/kde4/packages/kdelibs/debian/patches/13_qt4_designer_plugins_path.diff	2007-10-18 17:58:43 UTC (rev 7533)
+++ branches/kde4/packages/kdelibs/debian/patches/13_qt4_designer_plugins_path.diff	2007-10-18 18:58:49 UTC (rev 7534)
@@ -1,5 +1,5 @@
---- kdelibs-3.92.0.orig/kdewidgets/CMakeLists.txt
-+++ kdelibs-3.92.0/kdewidgets/CMakeLists.txt
+--- a/kdewidgets/CMakeLists.txt
++++ b/kdewidgets/CMakeLists.txt
 @@ -48,7 +48,7 @@
  target_link_libraries(kdewidgets  ${KDE4_KIO_LIBS} kde3support)
  set_target_properties(kdewidgets PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE  SKIP_BUILD_RPATH TRUE BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH ${LIB_INSTALL_DIR})

Modified: branches/kde4/packages/kdelibs/debian/patches/series
===================================================================
--- branches/kde4/packages/kdelibs/debian/patches/series	2007-10-18 17:58:43 UTC (rev 7533)
+++ branches/kde4/packages/kdelibs/debian/patches/series	2007-10-18 18:58:49 UTC (rev 7534)
@@ -1,3 +1,4 @@
+01_kdelibs_branch_r726725.diff
 10_kdehome_kde4.diff
 11_applications_menu_kde4.diff
 13_qt4_designer_plugins_path.diff




More information about the pkg-kde-commits mailing list