[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    KJSEmbed and scripting problems
From:       Andreas Marschke <xxtjaxx () googlemail ! com>
Date:       2010-02-19 15:18:36
Message-ID: 201002191618.36322.xxtjaxx () gmail ! com
[Download RAW message or body]

Hi felllow KDE developers,

I'm playing around with Kross and KJSEmbed to make a Scripting frontend for 
Bangarang. The problem is that I get a disturbing error that I cant really 
tell from what it means or what it actually does. 

I simply tried to run this code:
    import("qt.gui");
But on th console I got a dump of a lot of library symbols and a bugtrace.
Both are attached in the bug.txt.
How I run the code is in  the scriptconsole.cpp and scriptconsole.h attached 
aswell.

Can you tell me if this is a fault of my poor coding skills or something 
below. And if I did it wrong what is it actually that I did wrong?

Sincerely,

Andreas Marschke.

["bug.txt" (text/plain)]

Kross: "Loading the interpreter library for javascript" 
Kross: "Successfully loaded Interpreter instance from library." 
Kross: "KjsScript::KjsScript" 
Kross: "KjsScript::initialize" 
[26512]  line 0: SyntaxError: Parse error
Kross: "Error error=Throw line 0: SyntaxError: Parse error lineno=0 trace=
" 
Kross: "KjsScript::~KjsScript" 
bangarang(26512) ScriptConsole::runScript: "Throw line 0: SyntaxError: Parse error"
Kross: "KjsScript::KjsScript" 
Kross: "KjsScript::initialize" 
*** glibc detected *** bangarang: double free or corruption (out): 0x00007fff1e25e350 \
*** ======= Backtrace: =========
/lib/libc.so.6[0x7feea921cd56]
/lib/libc.so.6(cfree+0x6c)[0x7feea92219bc]
bangarang[0x42983a]
/usr/lib/libkjsembed.so.4[0x7fee8fd1f1b3]
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13ObjectBindingD2Ev+0x5a)[0x7fee8fd17b6a]
/usr/lib/libkjs.so.4(_ZN3KJS9Collector7collectEv+0x41c)[0x7fee942b5c6c]
/usr/lib/libkjs.so.4(_ZN3KJS9Collector8allocateEm+0xce)[0x7fee942b5f8e]
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x33f)[0x7fee8fd22e7f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBindingC1EPN3KJS9ExecStateEP7QWidget+0x19)[0x7fee8fd29d89]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QWidgetBinding10bindMethodEPN3KJS9ExecStateER11PointerBase+0x7f)[0x7fee8fd29e3f]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed17StaticConstructor4bindEPN3KJS9ExecStateERK7QStringR11PointerBase+0x98)[0x7fee8fd13198]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed13createQObjectEPN3KJS9ExecStateEP7QObjectNS_13ObjectBinding9OwnershipE+0x281)[0x7fee8fd22911]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBinding14publishQObjectEPN3KJS9ExecStateEPNS1_8JSObjectEP7QObject+0x160)[0x7fee8fd22ca0]
                
/usr/lib/libkjsembed.so.4(_ZN8KJSEmbed14QObjectBindingC2EPN3KJS9ExecStateEP7QObject+0xf1)[0x7fee8fd23371]
 ======= Memory map: ========
00400000-004e3000 r-xp 00000000 08:02 7062152                            \
/home/andreas/devel/trunk/bangarang/bangarang-kross/build/src/bangarang \
006e3000-006e6000 rw-p 000e3000 08:02 7062152                            \
/home/andreas/devel/trunk/bangarang/baKCrash: Application 'bangarang' crashing... \
sock_file=/home/andreas/.kde/socket-andreas/kdeinit4__0


Application: Bangarang (bangarang), signal: Aborted
The current source language is "auto; currently c".
[Current thread is 1 (Thread 0x7feeae0ef750 (LWP 26512))]

Thread 6 (Thread 0x7fee9a8ee910 (LWP 26513)):
#0  pthread_cond_timedwait@@GLIBC_2.3.2 () at \
../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S:220 #1  \
0x00007feea0303e31 in ?? () from /usr/lib/libxine.so.1 #2  0x00007feea70e273a in \
start_thread (arg=<value optimized out>) at pthread_create.c:300 #3  \
0x00007feea927769d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112 #4  \
0x0000000000000000 in ?? ()

Thread 5 (Thread 0x7fee99465910 (LWP 26514)):
#0  0x00007feea9270f82 in select () from /lib/libc.so.6
#1  0x00007feea032c5b5 in xine_usec_sleep () from /usr/lib/libxine.so.1
#2  0x00007feea0311789 in ?? () from /usr/lib/libxine.so.1
#3  0x00007feea70e273a in start_thread (arg=<value optimized out>) at \
pthread_create.c:300 #4  0x00007feea927769d in clone () at \
../sysdeps/unix/sysv/linux/x86_64/clone.S:112 #5  0x0000000000000000 in ?? ()
The current source language is "auto; currently asm".

Thread 4 (Thread 0x7fee978b9910 (LWP 26515)):
#0  __lll_lock_wait_private () at \
../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:97 #1  0x00007feea9223822 in \
_L_lock_11258 () from /lib/libc.so.6 #2  0x00007feea9222b54 in *__GI___libc_realloc \
(oldmem=0x7feea94fbe60, bytes=64) at malloc.c:3813 #3  0x00007feeaa2b56fb in \
QListData::realloc (this=0x2cfe760, alloc=<value optimized out>) at \
tools/qlistdata.cpp:111 #4  0x00007feeaa2b591b in QListData::append (this=0x2cfe760) \
at tools/qlistdata.cpp:131 #5  0x00007feeaa3a3eba in QList<QTimerInfo*>::insert \
(this=0x2cfe760, ti=0x7fee90034cf0) at \
../../include/QtCore/../../src/corelib/tools/qlist.h:453 #6  \
QTimerInfoList::timerInsert (this=0x2cfe760, ti=0x7fee90034cf0) at \
kernel/qeventdispatcher_unix.cpp:399 #7  0x00007feeaa36c0af in \
QAbstractEventDispatcher::registerTimer (this=0x2d13900, interval=10000, \
object=0x280b570) at kernel/qabstracteventdispatcher.cpp:313 #8  0x00007feea05712e6 \
in ?? () from /usr/lib/qt4/plugins/phonon_backend/phonon_xine.so #9  \
0x00007feeaaf4801d in QApplicationPrivate::notify_helper (this=0x264c2b0, \
receiver=0x280b570, e=0x280b4d0) at kernel/qapplication.cpp:4065 #10 \
0x00007feeaaf5007a in QApplication::notify (this=0x7fff1e25e4e0, receiver=0x280b570, \
e=0x280b4d0) at kernel/qapplication.cpp:4030 #11 0x00007feeadb21e06 in \
KApplication::notify (this=0x7fff1e25e4e0, receiver=0x280b570, event=0x280b4d0) at \
../../kdeui/kernel/kapplication.cpp:302 #12 0x00007feeaa377c9c in \
QCoreApplication::notifyInternal (this=0x7fff1e25e4e0, receiver=0x280b570, \
event=0x280b4d0) at kernel/qcoreapplication.cpp:610 #13 0x00007feeaa3788e4 in \
QCoreApplication::sendEvent (receiver=0x0, event_type=0, data=0x2d13480) at \
../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:213 #14 \
QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, \
data=0x2d13480) at kernel/qcoreapplication.cpp:1247 #15 0x00007feeaa3a07d3 in \
QCoreApplication::sendPostedEvents (s=<value optimized out>) at \
../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:218 #16 \
postEventSourceDispatch (s=<value optimized out>) at \
kernel/qeventdispatcher_glib.cpp:276 #17 0x00007feea57bf90e in \
g_main_context_dispatch () from /lib/libglib-2.0.so.0 #18 0x00007feea57c32c8 in ?? () \
from /lib/libglib-2.0.so.0 #19 0x00007feea57c33f0 in g_main_context_iteration () from \
/lib/libglib-2.0.so.0 #20 0x00007feeaa3a039c in QEventDispatcherGlib::processEvents \
(this=0x2d13900, flags=<value optimized out>) at kernel/qeventdispatcher_glib.cpp:407 \
#21 0x00007feeaa376562 in QEventLoop::processEvents (this=<value optimized out>, \
flags=...) at kernel/qeventloop.cpp:149 #22 0x00007feeaa376934 in QEventLoop::exec \
(this=0x7fee978b9000, flags=...) at kernel/qeventloop.cpp:201 #23 0x00007feeaa28f5a8 \
in QThread::exec (this=<value optimized out>) at thread/qthread.cpp:487 #24 \
0x00007feea055eaec in ?? () from /usr/lib/qt4/plugins/phonon_backend/phonon_xine.so \
#25 0x00007feeaa2924a5 in QThreadPrivate::start (arg=0x2cfdf50) at \
thread/qthread_unix.cpp:188 #26 0x00007feea70e273a in start_tding.cpp:142
#24 0x00007fee8fd29e3f in KJSEmbed::QWidgetBindin) at \
../../../kjsembed/kjsembed/static_binding.cpp:135 #50 0x00jen.h:203
#103 0x000000000046ff44 in ScriptCons


["scriptconsole.cpp" (text/x-c++src)]

/* BANGARANG MEDIA PLAYER
* Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)
* <http://gitorious.org/bangarang>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "scriptconsole.h"
#include <QWidget>
#include <QList>
#include <KPushButton>
#include <QVBoxLayout>
#include <QListWidget>
#include <KTextEdit>
#include <QTextEdit>
#include <QByteArray>
#include <KPushButton>
#include <kross/core/action.h>
#include <KLocale>
#include <KUrl>
#include <KDebug>

ScriptConsole::ScriptConsole(QWidget *parent) : QWidget(parent) ,
						m_action(0) ,
						m_layout(0) ,
						m_listWidget(0) ,
						m_sourceEdit(0) ,
						m_runScriptButton(0)
{
  m_layout = new QVBoxLayout(this);
  m_listWidget = new QListWidget();
  m_sourceEdit = new KTextEdit();
  m_runScriptButton = new KPushButton(i18n("Run Script"));
  
  m_layout->addWidget(m_listWidget);
  m_layout->addWidget(m_sourceEdit);
  m_layout->addWidget(m_runScriptButton);

  setLayout(m_layout);
  m_action = new Kross::Action(this,KUrl(""));
  m_action->setInterpreter("javascript");
  connect(m_runScriptButton,SIGNAL(clicked()),this,SLOT(runScript()));
}

ScriptConsole::~ScriptConsole()
{}

void 
ScriptConsole::runScript()
{ 
  QByteArray code;
  // 
  code =  m_sourceEdit->document()->toPlainText().toAscii();
  m_action->setCode(code);
  m_action->trigger();
  if( m_action->hadError() ) {
    kDebug() << m_action->errorMessage();
    m_listWidget->addItem(m_action->errorMessage());
  }

}

Kross::Action*
ScriptConsole::action()
{
  return m_action;
}

#include "moc_scriptconsole.cpp"



["scriptconsole.h" (text/x-chdr)]

/* BANGARANG MEDIA PLAYER
* Copyright (C) 2009 Andrew Lake (jamboarder@yahoo.com)
* <http://gitorious.org/bangarang>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef SCRIPTCONSOLE_H
#define SCRIPTCONSOLE_H

#include <QWidget>
#include <QList>
#include <KPushButton>
#include <QVBoxLayout>
#include <QListWidget>
#include <KTextEdit>
#include <KPushButton>
#include <kross/core/action.h>

class ScriptConsole : public QWidget
{
  Q_OBJECT
  
  public: 
    ScriptConsole(QWidget *parent = 0 );
    ~ScriptConsole();

    Kross::Action* action();

  private:
    Kross::Action *m_action;
    QVBoxLayout *m_layout;
    QListWidget *m_listWidget;
    KTextEdit *m_sourceEdit;
    KPushButton *m_runScriptButton;
  
  private slots:
    void runScript();
    
   
  
};

#endif //SCRIPTCONSOLE_H


>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic