diff --git a/.htaccess b/.htaccess
index 69dddc9abb6f4010d8b83094199e2029c32030ea..095a0cc6375baff9be13b2a485a873fde15b2015 100644
--- a/.htaccess
+++ b/.htaccess
@@ -1,9 +1,5 @@
 ErrorDocument 403 /core/templates/403.php
 ErrorDocument 404 /core/templates/404.php
-Redirect 301 /apps/calendar/caldav.php /remote.php/caldav/
-Redirect 301 /apps/contacts/carddav.php /remote.php/carddav/
-Redirect 301 /apps/files/webdav.php /remote.php/webdav/
-Redirect 301 /files/webdav.php /remote.php/webdav/
 <IfModule mod_php5.c>
 php_value upload_max_filesize 512M
 php_value post_max_size 512M
@@ -18,6 +14,8 @@ RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
 RewriteRule ^.well-known/host-meta /public.php?service=host-meta [QSA,L]
 RewriteRule ^.well-known/carddav /remote.php/carddav/ [R]
 RewriteRule ^.well-known/caldav /remote.php/caldav/ [R]	
+RewriteRule ^apps/calendar/caldav.php remote.php/caldav/ [QSA,L]
+RewriteRule ^apps/contacts/carddav.php remote.php/carddav/ [QSA,L]
 RewriteRule ^apps/([^/]*)/(.*\.(css|php))$ index.php?app=$1&getfile=$2 [QSA,L]
 RewriteRule ^remote/(.*) remote.php [QSA,L]
 </IfModule>
diff --git a/3rdparty/Archive/Tar.php b/3rdparty/Archive/Tar.php
index d8eae851bdcde846279a7832bbfca0ac9181c7db..e9969501a077e663795602476398bdd6c754c8f8 100644
--- a/3rdparty/Archive/Tar.php
+++ b/3rdparty/Archive/Tar.php
@@ -577,7 +577,7 @@ class Archive_Tar extends PEAR
         }
 
         // ----- Get the arguments
-        $v_att_list = &func_get_args();
+        $v_att_list = func_get_args();
 
         // ----- Read the attributes
         $i=0;
diff --git a/3rdparty/MDB2.php b/3rdparty/MDB2.php
index 2814f88ac0cd24e0cfcaab34710e86d6058e5810..a0ead9b9bcf27784b020c2b4fef3b08b17c4ee21 100644
--- a/3rdparty/MDB2.php
+++ b/3rdparty/MDB2.php
@@ -1,4270 +1,4587 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: MDB2.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-/**
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-
-require_once 'PEAR.php';
-
-// {{{ Error constants
-
-/**
- * The method mapErrorCode in each MDB2_dbtype implementation maps
- * native error codes to one of these.
- *
- * If you add an error code here, make sure you also add a textual
- * version of it in MDB2::errorMessage().
- */
-
-define('MDB2_OK',                      true);
-define('MDB2_ERROR',                     -1);
-define('MDB2_ERROR_SYNTAX',              -2);
-define('MDB2_ERROR_CONSTRAINT',          -3);
-define('MDB2_ERROR_NOT_FOUND',           -4);
-define('MDB2_ERROR_ALREADY_EXISTS',      -5);
-define('MDB2_ERROR_UNSUPPORTED',         -6);
-define('MDB2_ERROR_MISMATCH',            -7);
-define('MDB2_ERROR_INVALID',             -8);
-define('MDB2_ERROR_NOT_CAPABLE',         -9);
-define('MDB2_ERROR_TRUNCATED',          -10);
-define('MDB2_ERROR_INVALID_NUMBER',     -11);
-define('MDB2_ERROR_INVALID_DATE',       -12);
-define('MDB2_ERROR_DIVZERO',            -13);
-define('MDB2_ERROR_NODBSELECTED',       -14);
-define('MDB2_ERROR_CANNOT_CREATE',      -15);
-define('MDB2_ERROR_CANNOT_DELETE',      -16);
-define('MDB2_ERROR_CANNOT_DROP',        -17);
-define('MDB2_ERROR_NOSUCHTABLE',        -18);
-define('MDB2_ERROR_NOSUCHFIELD',        -19);
-define('MDB2_ERROR_NEED_MORE_DATA',     -20);
-define('MDB2_ERROR_NOT_LOCKED',         -21);
-define('MDB2_ERROR_VALUE_COUNT_ON_ROW', -22);
-define('MDB2_ERROR_INVALID_DSN',        -23);
-define('MDB2_ERROR_CONNECT_FAILED',     -24);
-define('MDB2_ERROR_EXTENSION_NOT_FOUND',-25);
-define('MDB2_ERROR_NOSUCHDB',           -26);
-define('MDB2_ERROR_ACCESS_VIOLATION',   -27);
-define('MDB2_ERROR_CANNOT_REPLACE',     -28);
-define('MDB2_ERROR_CONSTRAINT_NOT_NULL',-29);
-define('MDB2_ERROR_DEADLOCK',           -30);
-define('MDB2_ERROR_CANNOT_ALTER',       -31);
-define('MDB2_ERROR_MANAGER',            -32);
-define('MDB2_ERROR_MANAGER_PARSE',      -33);
-define('MDB2_ERROR_LOADMODULE',         -34);
-define('MDB2_ERROR_INSUFFICIENT_DATA',  -35);
-define('MDB2_ERROR_NO_PERMISSION',      -36);
-define('MDB2_ERROR_DISCONNECT_FAILED',  -37);
-
-// }}}
-// {{{ Verbose constants
-/**
- * These are just helper constants to more verbosely express parameters to prepare()
- */
-
-define('MDB2_PREPARE_MANIP', false);
-define('MDB2_PREPARE_RESULT', null);
-
-// }}}
-// {{{ Fetchmode constants
-
-/**
- * This is a special constant that tells MDB2 the user hasn't specified
- * any particular get mode, so the default should be used.
- */
-define('MDB2_FETCHMODE_DEFAULT', 0);
-
-/**
- * Column data indexed by numbers, ordered from 0 and up
- */
-define('MDB2_FETCHMODE_ORDERED', 1);
-
-/**
- * Column data indexed by column names
- */
-define('MDB2_FETCHMODE_ASSOC', 2);
-
-/**
- * Column data as object properties
- */
-define('MDB2_FETCHMODE_OBJECT', 3);
-
-/**
- * For multi-dimensional results: normally the first level of arrays
- * is the row number, and the second level indexed by column number or name.
- * MDB2_FETCHMODE_FLIPPED switches this order, so the first level of arrays
- * is the column name, and the second level the row number.
- */
-define('MDB2_FETCHMODE_FLIPPED', 4);
-
-// }}}
-// {{{ Portability mode constants
-
-/**
- * Portability: turn off all portability features.
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_NONE', 0);
-
-/**
- * Portability: convert names of tables and fields to case defined in the
- * "field_case" option when using the query*(), fetch*() and tableInfo() methods.
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_FIX_CASE', 1);
-
-/**
- * Portability: right trim the data output by query*() and fetch*().
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_RTRIM', 2);
-
-/**
- * Portability: force reporting the number of rows deleted.
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_DELETE_COUNT', 4);
-
-/**
- * Portability: not needed in MDB2 (just left here for compatibility to DB)
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_NUMROWS', 8);
-
-/**
- * Portability: makes certain error messages in certain drivers compatible
- * with those from other DBMS's.
- *
- * + mysql, mysqli:  change unique/primary key constraints
- *   MDB2_ERROR_ALREADY_EXISTS -> MDB2_ERROR_CONSTRAINT
- *
- * + odbc(access):  MS's ODBC driver reports 'no such field' as code
- *   07001, which means 'too few parameters.'  When this option is on
- *   that code gets mapped to MDB2_ERROR_NOSUCHFIELD.
- *
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_ERRORS', 16);
-
-/**
- * Portability: convert empty values to null strings in data output by
- * query*() and fetch*().
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_EMPTY_TO_NULL', 32);
-
-/**
- * Portability: removes database/table qualifiers from associative indexes
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES', 64);
-
-/**
- * Portability: turn on all portability features.
- * @see MDB2_Driver_Common::setOption()
- */
-define('MDB2_PORTABILITY_ALL', 127);
-
-// }}}
-// {{{ Globals for class instance tracking
-
-/**
- * These are global variables that are used to track the various class instances
- */
-
-$GLOBALS['_MDB2_databases'] = array();
-$GLOBALS['_MDB2_dsninfo_default'] = array(
-    'phptype'  => false,
-    'dbsyntax' => false,
-    'username' => false,
-    'password' => false,
-    'protocol' => false,
-    'hostspec' => false,
-    'port'     => false,
-    'socket'   => false,
-    'database' => false,
-    'mode'     => false,
-);
-
-// }}}
-// {{{ class MDB2
-
-/**
- * The main 'MDB2' class is simply a container class with some static
- * methods for creating DB objects as well as some utility functions
- * common to all parts of DB.
- *
- * The object model of MDB2 is as follows (indentation means inheritance):
- *
- * MDB2          The main MDB2 class.  This is simply a utility class
- *              with some 'static' methods for creating MDB2 objects as
- *              well as common utility functions for other MDB2 classes.
- *
- * MDB2_Driver_Common   The base for each MDB2 implementation.  Provides default
- * |            implementations (in OO lingo virtual methods) for
- * |            the actual DB implementations as well as a bunch of
- * |            query utility functions.
- * |
- * +-MDB2_Driver_mysql  The MDB2 implementation for MySQL. Inherits MDB2_Driver_Common.
- *              When calling MDB2::factory or MDB2::connect for MySQL
- *              connections, the object returned is an instance of this
- *              class.
- * +-MDB2_Driver_pgsql  The MDB2 implementation for PostGreSQL. Inherits MDB2_Driver_Common.
- *              When calling MDB2::factory or MDB2::connect for PostGreSQL
- *              connections, the object returned is an instance of this
- *              class.
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2
-{
-    // {{{ function setOptions($db, $options)
-
-    /**
-     * set option array   in an exiting database object
-     *
-     * @param   MDB2_Driver_Common  MDB2 object
-     * @param   array   An associative array of option names and their values.
-     *
-     * @return mixed   MDB2_OK or a PEAR Error object
-     *
-     * @access  public
-     */
-    static function setOptions($db, $options)
-    {
-        if (is_array($options)) {
-            foreach ($options as $option => $value) {
-                $test = $db->setOption($option, $value);
-                if (PEAR::isError($test)) {
-                    return $test;
-                }
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function classExists($classname)
-
-    /**
-     * Checks if a class exists without triggering __autoload
-     *
-     * @param   string  classname
-     *
-     * @return  bool    true success and false on error
-     * @static
-     * @access  public
-     */
-    static function classExists($classname)
-    {
-        return class_exists($classname, false);
-    }
-
-    // }}}
-    // {{{ function loadClass($class_name, $debug)
-
-    /**
-     * Loads a PEAR class.
-     *
-     * @param   string  classname to load
-     * @param   bool    if errors should be suppressed
-     *
-     * @return  mixed   true success or PEAR_Error on failure
-     *
-     * @access  public
-     */
-    static function loadClass($class_name, $debug)
-    {
-        if (!MDB2::classExists($class_name)) {
-            $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';
-            if ($debug) {
-                $include = include_once($file_name);
-            } else {
-                $include = @include_once($file_name);
-            }
-            if (!$include) {
-                if (!MDB2::fileExists($file_name)) {
-                    $msg = "unable to find package '$class_name' file '$file_name'";
-                } else {
-                    $msg = "unable to load class '$class_name' from file '$file_name'";
-                }
-                $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg);
-                return $err;
-            }
-            if (!MDB2::classExists($class_name)) {
-                $msg = "unable to load class '$class_name' from file '$file_name'";
-                $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg);
-                return $err;
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function factory($dsn, $options = false)
-
-    /**
-     * Create a new MDB2 object for the specified database type
-     *
-     * @param   mixed   'data source name', see the MDB2::parseDSN
-     *                      method for a description of the dsn format.
-     *                      Can also be specified as an array of the
-     *                      format returned by MDB2::parseDSN.
-     * @param   array   An associative array of option names and
-     *                            their values.
-     *
-     * @return  mixed   a newly created MDB2 object, or false on error
-     *
-     * @access  public
-     */
-    static function factory($dsn, $options = false)
-    {
-        $dsninfo = MDB2::parseDSN($dsn);
-        if (empty($dsninfo['phptype'])) {
-            $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND,
-                null, null, 'no RDBMS driver specified');
-            return $err;
-        }
-        $class_name = 'MDB2_Driver_'.$dsninfo['phptype'];
-
-        $debug = (!empty($options['debug']));
-        $err = MDB2::loadClass($class_name, $debug);
-        if (PEAR::isError($err)) {
-            return $err;
-        }
-
-        $db = new $class_name();
-        $db->setDSN($dsninfo);
-        $err = MDB2::setOptions($db, $options);
-        if (PEAR::isError($err)) {
-            return $err;
-        }
-
-        return $db;
-    }
-
-    // }}}
-    // {{{ function connect($dsn, $options = false)
-
-    /**
-     * Create a new MDB2_Driver_* connection object and connect to the specified
-     * database
-     *
-     * @param mixed $dsn     'data source name', see the MDB2::parseDSN
-     *                       method for a description of the dsn format.
-     *                       Can also be specified as an array of the
-     *                       format returned by MDB2::parseDSN.
-     * @param array $options An associative array of option names and
-     *                       their values.
-     *
-     * @return mixed a newly created MDB2 connection object, or a MDB2
-     *               error object on error
-     *
-     * @access  public
-     * @see     MDB2::parseDSN
-     */
-    static function connect($dsn, $options = false)
-    {
-        $db = MDB2::factory($dsn, $options);
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $err = $db->connect();
-        if (PEAR::isError($err)) {
-            $dsn = $db->getDSN('string', 'xxx');
-            $db->disconnect();
-            $err->addUserInfo($dsn);
-            return $err;
-        }
-
-        return $db;
-    }
-
-    // }}}
-    // {{{ function singleton($dsn = null, $options = false)
-
-    /**
-     * Returns a MDB2 connection with the requested DSN.
-     * A new MDB2 connection object is only created if no object with the
-     * requested DSN exists yet.
-     *
-     * @param   mixed   'data source name', see the MDB2::parseDSN
-     *                            method for a description of the dsn format.
-     *                            Can also be specified as an array of the
-     *                            format returned by MDB2::parseDSN.
-     * @param   array   An associative array of option names and
-     *                            their values.
-     *
-     * @return  mixed   a newly created MDB2 connection object, or a MDB2
-     *                  error object on error
-     *
-     * @access  public
-     * @see     MDB2::parseDSN
-     */
-    static function singleton($dsn = null, $options = false)
-    {
-        if ($dsn) {
-            $dsninfo = MDB2::parseDSN($dsn);
-            $dsninfo = array_merge($GLOBALS['_MDB2_dsninfo_default'], $dsninfo);
-            $keys = array_keys($GLOBALS['_MDB2_databases']);
-            for ($i=0, $j=count($keys); $i<$j; ++$i) {
-                if (isset($GLOBALS['_MDB2_databases'][$keys[$i]])) {
-                    $tmp_dsn = $GLOBALS['_MDB2_databases'][$keys[$i]]->getDSN('array');
-                    if (count(array_diff_assoc($tmp_dsn, $dsninfo)) == 0) {
-                        MDB2::setOptions($GLOBALS['_MDB2_databases'][$keys[$i]], $options);
-                        return $GLOBALS['_MDB2_databases'][$keys[$i]];
-                    }
-                }
-            }
-        } elseif (is_array($GLOBALS['_MDB2_databases']) && reset($GLOBALS['_MDB2_databases'])) {
-            return $GLOBALS['_MDB2_databases'][key($GLOBALS['_MDB2_databases'])];
-        }
-        $db = MDB2::factory($dsn, $options);
-        return $db;
-    }
-
-    // }}}
-    // {{{ function areEquals()
-
-    /**
-     * It looks like there's a memory leak in array_diff() in PHP 5.1.x,
-     * so use this method instead.
-     * @see http://pear.php.net/bugs/bug.php?id=11790
-     *
-     * @param array $arr1
-     * @param array $arr2
-     * @return boolean
-     */
-    static function areEquals($arr1, $arr2)
-    {
-        if (count($arr1) != count($arr2)) {
-            return false;
-        }
-        foreach (array_keys($arr1) as $k) {
-            if (!array_key_exists($k, $arr2) || $arr1[$k] != $arr2[$k]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    // }}}
-    // {{{ function loadFile($file)
-
-    /**
-     * load a file (like 'Date')
-     *
-     * @param string $file name of the file in the MDB2 directory (without '.php')
-     *
-     * @return string name of the file that was included
-     *
-     * @access  public
-     */
-    static function loadFile($file)
-    {
-        $file_name = 'MDB2'.DIRECTORY_SEPARATOR.$file.'.php';
-        if (!MDB2::fileExists($file_name)) {
-            return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'unable to find: '.$file_name);
-        }
-        if (!include_once($file_name)) {
-            return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'unable to load driver class: '.$file_name);
-        }
-        return $file_name;
-    }
-
-    // }}}
-    // {{{ function apiVersion()
-
-    /**
-     * Return the MDB2 API version
-     *
-     * @return  string  the MDB2 API version number
-     *
-     * @access  public
-     */
-    function apiVersion()
-    {
-        return '2.5.0b3';
-    }
-
-    // }}}
-    // {{{ function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
-
-    /**
-     * This method is used to communicate an error and invoke error
-     * callbacks etc.  Basically a wrapper for PEAR::raiseError
-     * without the message string.
-     *
-     * @param   mixed  int error code
-     *
-     * @param   int    error mode, see PEAR_Error docs
-     *
-     * @param   mixed  If error mode is PEAR_ERROR_TRIGGER, this is the
-     *                 error level (E_USER_NOTICE etc).  If error mode is
-     *                 PEAR_ERROR_CALLBACK, this is the callback function,
-     *                 either as a function name, or as an array of an
-     *                 object and method name.  For other error modes this
-     *                 parameter is ignored.
-     *
-     * @param   string Extra debug information.  Defaults to the last
-     *                 query and native error code.
-     *
-     * @return PEAR_Error instance of a PEAR Error object
-     *
-     * @access  private
-     * @see     PEAR_Error
-     */
-    function &raiseError($code = null,
-                         $mode = null,
-                         $options = null,
-                         $userinfo = null,
-                         $dummy1 = null,
-                         $dummy2 = null,
-                         $dummy3 = false)
-    {
-        $err =& PEAR::raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
-        return $err;
-    }
-
-    // }}}
-    // {{{ function isError($data, $code = null)
-
-    /**
-     * Tell whether a value is a MDB2 error.
-     *
-     * @param   mixed   the value to test
-     * @param   int     if is an error object, return true
-     *                        only if $code is a string and
-     *                        $db->getMessage() == $code or
-     *                        $code is an integer and $db->getCode() == $code
-     *
-     * @return  bool    true if parameter is an error
-     *
-     * @access  public
-     */
-    static function isError($data, $code = null)
-    {
-        if ($data instanceof MDB2_Error) {
-            if (null === $code) {
-                return true;
-            }
-            if (is_string($code)) {
-                return $data->getMessage() === $code;
-            }
-            return in_array($data->getCode(), (array)$code);
-        }
-        return false;
-    }
-
-    // }}}
-    // {{{ function isConnection($value)
-
-    /**
-     * Tell whether a value is a MDB2 connection
-     *
-     * @param   mixed   value to test
-     *
-     * @return  bool    whether $value is a MDB2 connection
-     * @access  public
-     */
-    function isConnection($value)
-    {
-        return ($value instanceof MDB2_Driver_Common);
-    }
-
-    // }}}
-    // {{{ function isResult($value)
-
-    /**
-     * Tell whether a value is a MDB2 result
-     *
-     * @param mixed $value value to test
-     *
-     * @return bool whether $value is a MDB2 result
-     *
-     * @access public
-     */
-    function isResult($value)
-    {
-        return ($value instanceof MDB2_Result);
-    }
-
-    // }}}
-    // {{{ function isResultCommon($value)
-
-    /**
-     * Tell whether a value is a MDB2 result implementing the common interface
-     *
-     * @param mixed $value value to test
-     *
-     * @return bool whether $value is a MDB2 result implementing the common interface
-     *
-     * @access  public
-     */
-    static function isResultCommon($value)
-    {
-        return ($value instanceof MDB2_Result_Common);
-    }
-
-    // }}}
-    // {{{ function isStatement($value)
-
-    /**
-     * Tell whether a value is a MDB2 statement interface
-     *
-     * @param   mixed   value to test
-     *
-     * @return  bool    whether $value is a MDB2 statement interface
-     *
-     * @access  public
-     */
-    function isStatement($value)
-    {
-        return ($value instanceof MDB2_Statement_Common);
-    }
-
-    // }}}
-    // {{{ function errorMessage($value = null)
-
-    /**
-     * Return a textual error message for a MDB2 error code
-     *
-     * @param   int|array   integer error code,
-                                null to get the current error code-message map,
-                                or an array with a new error code-message map
-     *
-     * @return  string  error message, or false if the error code was
-     *                  not recognized
-     *
-     * @access  public
-     */
-    function errorMessage($value = null)
-    {
-        static $errorMessages;
-
-        if (is_array($value)) {
-            $errorMessages = $value;
-            return MDB2_OK;
-        }
-
-        if (!isset($errorMessages)) {
-            $errorMessages = array(
-                MDB2_OK                       => 'no error',
-                MDB2_ERROR                    => 'unknown error',
-                MDB2_ERROR_ALREADY_EXISTS     => 'already exists',
-                MDB2_ERROR_CANNOT_CREATE      => 'can not create',
-                MDB2_ERROR_CANNOT_ALTER       => 'can not alter',
-                MDB2_ERROR_CANNOT_REPLACE     => 'can not replace',
-                MDB2_ERROR_CANNOT_DELETE      => 'can not delete',
-                MDB2_ERROR_CANNOT_DROP        => 'can not drop',
-                MDB2_ERROR_CONSTRAINT         => 'constraint violation',
-                MDB2_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint',
-                MDB2_ERROR_DIVZERO            => 'division by zero',
-                MDB2_ERROR_INVALID            => 'invalid',
-                MDB2_ERROR_INVALID_DATE       => 'invalid date or time',
-                MDB2_ERROR_INVALID_NUMBER     => 'invalid number',
-                MDB2_ERROR_MISMATCH           => 'mismatch',
-                MDB2_ERROR_NODBSELECTED       => 'no database selected',
-                MDB2_ERROR_NOSUCHFIELD        => 'no such field',
-                MDB2_ERROR_NOSUCHTABLE        => 'no such table',
-                MDB2_ERROR_NOT_CAPABLE        => 'MDB2 backend not capable',
-                MDB2_ERROR_NOT_FOUND          => 'not found',
-                MDB2_ERROR_NOT_LOCKED         => 'not locked',
-                MDB2_ERROR_SYNTAX             => 'syntax error',
-                MDB2_ERROR_UNSUPPORTED        => 'not supported',
-                MDB2_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
-                MDB2_ERROR_INVALID_DSN        => 'invalid DSN',
-                MDB2_ERROR_CONNECT_FAILED     => 'connect failed',
-                MDB2_ERROR_NEED_MORE_DATA     => 'insufficient data supplied',
-                MDB2_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
-                MDB2_ERROR_NOSUCHDB           => 'no such database',
-                MDB2_ERROR_ACCESS_VIOLATION   => 'insufficient permissions',
-                MDB2_ERROR_LOADMODULE         => 'error while including on demand module',
-                MDB2_ERROR_TRUNCATED          => 'truncated',
-                MDB2_ERROR_DEADLOCK           => 'deadlock detected',
-                MDB2_ERROR_NO_PERMISSION      => 'no permission',
-                MDB2_ERROR_DISCONNECT_FAILED  => 'disconnect failed',
-            );
-        }
-
-        if (null === $value) {
-            return $errorMessages;
-        }
-
-        if (PEAR::isError($value)) {
-            $value = $value->getCode();
-        }
-
-        return isset($errorMessages[$value]) ?
-           $errorMessages[$value] : $errorMessages[MDB2_ERROR];
-    }
-
-    // }}}
-    // {{{ function parseDSN($dsn)
-
-    /**
-     * Parse a data source name.
-     *
-     * Additional keys can be added by appending a URI query string to the
-     * end of the DSN.
-     *
-     * The format of the supplied DSN is in its fullest form:
-     * <code>
-     *  phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true
-     * </code>
-     *
-     * Most variations are allowed:
-     * <code>
-     *  phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644
-     *  phptype://username:password@hostspec/database_name
-     *  phptype://username:password@hostspec
-     *  phptype://username@hostspec
-     *  phptype://hostspec/database
-     *  phptype://hostspec
-     *  phptype(dbsyntax)
-     *  phptype
-     * </code>
-     *
-     * @param   string  Data Source Name to be parsed
-     *
-     * @return  array   an associative array with the following keys:
-     *  + phptype:  Database backend used in PHP (mysql, odbc etc.)
-     *  + dbsyntax: Database used with regards to SQL syntax etc.
-     *  + protocol: Communication protocol to use (tcp, unix etc.)
-     *  + hostspec: Host specification (hostname[:port])
-     *  + database: Database to use on the DBMS server
-     *  + username: User name for login
-     *  + password: Password for login
-     *
-     * @access  public
-     * @author  Tomas V.V.Cox <cox@idecnet.com>
-     */
-    static function parseDSN($dsn)
-    {
-        $parsed = $GLOBALS['_MDB2_dsninfo_default'];
-
-        if (is_array($dsn)) {
-            $dsn = array_merge($parsed, $dsn);
-            if (!$dsn['dbsyntax']) {
-                $dsn['dbsyntax'] = $dsn['phptype'];
-            }
-            return $dsn;
-        }
-
-        // Find phptype and dbsyntax
-        if (($pos = strpos($dsn, '://')) !== false) {
-            $str = substr($dsn, 0, $pos);
-            $dsn = substr($dsn, $pos + 3);
-        } else {
-            $str = $dsn;
-            $dsn = null;
-        }
-
-        // Get phptype and dbsyntax
-        // $str => phptype(dbsyntax)
-        if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
-            $parsed['phptype']  = $arr[1];
-            $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
-        } else {
-            $parsed['phptype']  = $str;
-            $parsed['dbsyntax'] = $str;
-        }
-
-        if (!count($dsn)) {
-            return $parsed;
-        }
-
-        // Get (if found): username and password
-        // $dsn => username:password@protocol+hostspec/database
-        if (($at = strrpos($dsn,'@')) !== false) {
-            $str = substr($dsn, 0, $at);
-            $dsn = substr($dsn, $at + 1);
-            if (($pos = strpos($str, ':')) !== false) {
-                $parsed['username'] = rawurldecode(substr($str, 0, $pos));
-                $parsed['password'] = rawurldecode(substr($str, $pos + 1));
-            } else {
-                $parsed['username'] = rawurldecode($str);
-            }
-        }
-
-        // Find protocol and hostspec
-
-        // $dsn => proto(proto_opts)/database
-        if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
-            $proto       = $match[1];
-            $proto_opts  = $match[2] ? $match[2] : false;
-            $dsn         = $match[3];
-
-        // $dsn => protocol+hostspec/database (old format)
-        } else {
-            if (strpos($dsn, '+') !== false) {
-                list($proto, $dsn) = explode('+', $dsn, 2);
-            }
-            if (   strpos($dsn, '//') === 0
-                && strpos($dsn, '/', 2) !== false
-                && $parsed['phptype'] == 'oci8'
-            ) {
-                //oracle's "Easy Connect" syntax:
-                //"username/password@[//]host[:port][/service_name]"
-                //e.g. "scott/tiger@//mymachine:1521/oracle"
-                $proto_opts = $dsn;
-                $pos = strrpos($proto_opts, '/');
-                $dsn = substr($proto_opts, $pos + 1);
-                $proto_opts = substr($proto_opts, 0, $pos);
-            } elseif (strpos($dsn, '/') !== false) {
-                list($proto_opts, $dsn) = explode('/', $dsn, 2);
-            } else {
-                $proto_opts = $dsn;
-                $dsn = null;
-            }
-        }
-
-        // process the different protocol options
-        $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';
-        $proto_opts = rawurldecode($proto_opts);
-        if (strpos($proto_opts, ':') !== false) {
-            list($proto_opts, $parsed['port']) = explode(':', $proto_opts);
-        }
-        if ($parsed['protocol'] == 'tcp') {
-            $parsed['hostspec'] = $proto_opts;
-        } elseif ($parsed['protocol'] == 'unix') {
-            $parsed['socket'] = $proto_opts;
-        }
-
-        // Get dabase if any
-        // $dsn => database
-        if ($dsn) {
-            // /database
-            if (($pos = strpos($dsn, '?')) === false) {
-                $parsed['database'] = $dsn;
-            // /database?param1=value1&param2=value2
-            } else {
-                $parsed['database'] = substr($dsn, 0, $pos);
-                $dsn = substr($dsn, $pos + 1);
-                if (strpos($dsn, '&') !== false) {
-                    $opts = explode('&', $dsn);
-                } else { // database?param1=value1
-                    $opts = array($dsn);
-                }
-                foreach ($opts as $opt) {
-                    list($key, $value) = explode('=', $opt);
-                    if (!array_key_exists($key, $parsed) || false === $parsed[$key]) {
-                        // don't allow params overwrite
-                        $parsed[$key] = rawurldecode($value);
-                    }
-                }
-            }
-        }
-
-        return $parsed;
-    }
-
-    // }}}
-    // {{{ function fileExists($file)
-
-    /**
-     * Checks if a file exists in the include path
-     *
-     * @param   string  filename
-     *
-     * @return  bool    true success and false on error
-     *
-     * @access  public
-     */
-    static function fileExists($file)
-    {
-        // safe_mode does notwork with is_readable()
-        if (!@ini_get('safe_mode')) {
-             $dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
-             foreach ($dirs as $dir) {
-                 if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
-                     return true;
-                 }
-            }
-        } else {
-            $fp = @fopen($file, 'r', true);
-            if (is_resource($fp)) {
-                @fclose($fp);
-                return true;
-            }
-        }
-        return false;
-    }
-    // }}}
-}
-
-// }}}
-// {{{ class MDB2_Error extends PEAR_Error
-
-/**
- * MDB2_Error implements a class for reporting portable database error
- * messages.
- *
- * @package     MDB2
- * @category    Database
- * @author Stig Bakken <ssb@fast.no>
- */
-class MDB2_Error extends PEAR_Error
-{
-    // {{{ constructor: function MDB2_Error($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null)
-
-    /**
-     * MDB2_Error constructor.
-     *
-     * @param   mixed   MDB2 error code, or string with error message.
-     * @param   int     what 'error mode' to operate in
-     * @param   int     what error level to use for $mode & PEAR_ERROR_TRIGGER
-     * @param   mixed   additional debug info, such as the last query
-     */
-    function __construct($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN,
-              $level = E_USER_NOTICE, $debuginfo = null, $dummy = null)
-    {
-        if (null === $code) {
-            $code = MDB2_ERROR;
-        }
-        $this->PEAR_Error('MDB2 Error: '.MDB2::errorMessage($code), $code,
-            $mode, $level, $debuginfo);
-    }
-
-    // }}}
-}
-
-// }}}
-// {{{ class MDB2_Driver_Common extends PEAR
-
-/**
- * MDB2_Driver_Common: Base class that is extended by each MDB2 driver
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Common extends PEAR
-{
-    // {{{ Variables (Properties)
-
-    /**
-     * index of the MDB2 object within the $GLOBALS['_MDB2_databases'] array
-     * @var     int
-     * @access  public
-     */
-    var $db_index = 0;
-
-    /**
-     * DSN used for the next query
-     * @var     array
-     * @access  protected
-     */
-    var $dsn = array();
-
-    /**
-     * DSN that was used to create the current connection
-     * @var     array
-     * @access  protected
-     */
-    var $connected_dsn = array();
-
-    /**
-     * connection resource
-     * @var     mixed
-     * @access  protected
-     */
-    var $connection = 0;
-
-    /**
-     * if the current opened connection is a persistent connection
-     * @var     bool
-     * @access  protected
-     */
-    var $opened_persistent;
-
-    /**
-     * the name of the database for the next query
-     * @var     string
-     * @access  protected
-     */
-    var $database_name = '';
-
-    /**
-     * the name of the database currently selected
-     * @var     string
-     * @access  protected
-     */
-    var $connected_database_name = '';
-
-    /**
-     * server version information
-     * @var     string
-     * @access  protected
-     */
-    var $connected_server_info = '';
-
-    /**
-     * list of all supported features of the given driver
-     * @var     array
-     * @access  public
-     */
-    var $supported = array(
-        'sequences' => false,
-        'indexes' => false,
-        'affected_rows' => false,
-        'summary_functions' => false,
-        'order_by_text' => false,
-        'transactions' => false,
-        'savepoints' => false,
-        'current_id' => false,
-        'limit_queries' => false,
-        'LOBs' => false,
-        'replace' => false,
-        'sub_selects' => false,
-        'triggers' => false,
-        'auto_increment' => false,
-        'primary_key' => false,
-        'result_introspection' => false,
-        'prepared_statements' => false,
-        'identifier_quoting' => false,
-        'pattern_escaping' => false,
-        'new_link' => false,
-    );
-
-    /**
-     * Array of supported options that can be passed to the MDB2 instance.
-     * 
-     * The options can be set during object creation, using
-     * MDB2::connect(), MDB2::factory() or MDB2::singleton(). The options can 
-     * also be set after the object is created, using MDB2::setOptions() or 
-     * MDB2_Driver_Common::setOption().
-     * The list of available option includes:
-     * <ul>
-     *  <li>$options['ssl'] -> boolean: determines if ssl should be used for connections</li>
-     *  <li>$options['field_case'] -> CASE_LOWER|CASE_UPPER: determines what case to force on field/table names</li>
-     *  <li>$options['disable_query'] -> boolean: determines if queries should be executed</li>
-     *  <li>$options['result_class'] -> string: class used for result sets</li>
-     *  <li>$options['buffered_result_class'] -> string: class used for buffered result sets</li>
-     *  <li>$options['result_wrap_class'] -> string: class used to wrap result sets into</li>
-     *  <li>$options['result_buffering'] -> boolean should results be buffered or not?</li>
-     *  <li>$options['fetch_class'] -> string: class to use when fetch mode object is used</li>
-     *  <li>$options['persistent'] -> boolean: persistent connection?</li>
-     *  <li>$options['debug'] -> integer: numeric debug level</li>
-     *  <li>$options['debug_handler'] -> string: function/method that captures debug messages</li>
-     *  <li>$options['debug_expanded_output'] -> bool: BC option to determine if more context information should be send to the debug handler</li>
-     *  <li>$options['default_text_field_length'] -> integer: default text field length to use</li>
-     *  <li>$options['lob_buffer_length'] -> integer: LOB buffer length</li>
-     *  <li>$options['log_line_break'] -> string: line-break format</li>
-     *  <li>$options['idxname_format'] -> string: pattern for index name</li>
-     *  <li>$options['seqname_format'] -> string: pattern for sequence name</li>
-     *  <li>$options['savepoint_format'] -> string: pattern for auto generated savepoint names</li>
-     *  <li>$options['statement_format'] -> string: pattern for prepared statement names</li>
-     *  <li>$options['seqcol_name'] -> string: sequence column name</li>
-     *  <li>$options['quote_identifier'] -> boolean: if identifier quoting should be done when check_option is used</li>
-     *  <li>$options['use_transactions'] -> boolean: if transaction use should be enabled</li>
-     *  <li>$options['decimal_places'] -> integer: number of decimal places to handle</li>
-     *  <li>$options['portability'] -> integer: portability constant</li>
-     *  <li>$options['modules'] -> array: short to long module name mapping for __call()</li>
-     *  <li>$options['emulate_prepared'] -> boolean: force prepared statements to be emulated</li>
-     *  <li>$options['datatype_map'] -> array: map user defined datatypes to other primitive datatypes</li>
-     *  <li>$options['datatype_map_callback'] -> array: callback function/method that should be called</li>
-     *  <li>$options['bindname_format'] -> string: regular expression pattern for named parameters</li>
-     *  <li>$options['multi_query'] -> boolean: determines if queries returning multiple result sets should be executed</li>
-     *  <li>$options['max_identifiers_length'] -> integer: max identifier length</li>
-     *  <li>$options['default_fk_action_onupdate'] -> string: default FOREIGN KEY ON UPDATE action ['RESTRICT'|'NO ACTION'|'SET DEFAULT'|'SET NULL'|'CASCADE']</li>
-     *  <li>$options['default_fk_action_ondelete'] -> string: default FOREIGN KEY ON DELETE action ['RESTRICT'|'NO ACTION'|'SET DEFAULT'|'SET NULL'|'CASCADE']</li>
-     * </ul>
-     *
-     * @var     array
-     * @access  public
-     * @see     MDB2::connect()
-     * @see     MDB2::factory()
-     * @see     MDB2::singleton()
-     * @see     MDB2_Driver_Common::setOption()
-     */
-    var $options = array(
-        'ssl' => false,
-        'field_case' => CASE_LOWER,
-        'disable_query' => false,
-        'result_class' => 'MDB2_Result_%s',
-        'buffered_result_class' => 'MDB2_BufferedResult_%s',
-        'result_wrap_class' => false,
-        'result_buffering' => true,
-        'fetch_class' => 'stdClass',
-        'persistent' => false,
-        'debug' => 0,
-        'debug_handler' => 'MDB2_defaultDebugOutput',
-        'debug_expanded_output' => false,
-        'default_text_field_length' => 4096,
-        'lob_buffer_length' => 8192,
-        'log_line_break' => "\n",
-        'idxname_format' => '%s_idx',
-        'seqname_format' => '%s_seq',
-        'savepoint_format' => 'MDB2_SAVEPOINT_%s',
-        'statement_format' => 'MDB2_STATEMENT_%1$s_%2$s',
-        'seqcol_name' => 'sequence',
-        'quote_identifier' => false,
-        'use_transactions' => true,
-        'decimal_places' => 2,
-        'portability' => MDB2_PORTABILITY_ALL,
-        'modules' => array(
-            'ex' => 'Extended',
-            'dt' => 'Datatype',
-            'mg' => 'Manager',
-            'rv' => 'Reverse',
-            'na' => 'Native',
-            'fc' => 'Function',
-        ),
-        'emulate_prepared' => false,
-        'datatype_map' => array(),
-        'datatype_map_callback' => array(),
-        'nativetype_map_callback' => array(),
-        'lob_allow_url_include' => false,
-        'bindname_format' => '(?:\d+)|(?:[a-zA-Z][a-zA-Z0-9_]*)',
-        'max_identifiers_length' => 30,
-        'default_fk_action_onupdate' => 'RESTRICT',
-        'default_fk_action_ondelete' => 'RESTRICT',
-    );
-
-    /**
-     * string array
-     * @var     string
-     * @access  protected
-     */
-    var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => false, 'escape_pattern' => false);
-
-    /**
-     * identifier quoting
-     * @var     array
-     * @access  protected
-     */
-    var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"');
-
-    /**
-     * sql comments
-     * @var     array
-     * @access  protected
-     */
-    var $sql_comments = array(
-        array('start' => '--', 'end' => "\n", 'escape' => false),
-        array('start' => '/*', 'end' => '*/', 'escape' => false),
-    );
-
-    /**
-     * comparision wildcards
-     * @var     array
-     * @access  protected
-     */
-    var $wildcards = array('%', '_');
-
-    /**
-     * column alias keyword
-     * @var     string
-     * @access  protected
-     */
-    var $as_keyword = ' AS ';
-
-    /**
-     * warnings
-     * @var     array
-     * @access  protected
-     */
-    var $warnings = array();
-
-    /**
-     * string with the debugging information
-     * @var     string
-     * @access  public
-     */
-    var $debug_output = '';
-
-    /**
-     * determine if there is an open transaction
-     * @var     bool
-     * @access  protected
-     */
-    var $in_transaction = false;
-
-    /**
-     * the smart transaction nesting depth
-     * @var     int
-     * @access  protected
-     */
-    var $nested_transaction_counter = null;
-
-    /**
-     * the first error that occured inside a nested transaction
-     * @var     MDB2_Error|bool
-     * @access  protected
-     */
-    var $has_transaction_error = false;
-
-    /**
-     * result offset used in the next query
-     * @var     int
-     * @access  protected
-     */
-    var $offset = 0;
-
-    /**
-     * result limit used in the next query
-     * @var     int
-     * @access  protected
-     */
-    var $limit = 0;
-
-    /**
-     * Database backend used in PHP (mysql, odbc etc.)
-     * @var     string
-     * @access  public
-     */
-    var $phptype;
-
-    /**
-     * Database used with regards to SQL syntax etc.
-     * @var     string
-     * @access  public
-     */
-    var $dbsyntax;
-
-    /**
-     * the last query sent to the driver
-     * @var     string
-     * @access  public
-     */
-    var $last_query;
-
-    /**
-     * the default fetchmode used
-     * @var     int
-     * @access  protected
-     */
-    var $fetchmode = MDB2_FETCHMODE_ORDERED;
-
-    /**
-     * array of module instances
-     * @var     array
-     * @access  protected
-     */
-    var $modules = array();
-
-    /**
-     * determines of the PHP4 destructor emulation has been enabled yet
-     * @var     array
-     * @access  protected
-     */
-    var $destructor_registered = true;
-
-    // }}}
-    // {{{ constructor: function __construct()
-
-    /**
-     * Constructor
-     */
-    function __construct()
-    {
-        end($GLOBALS['_MDB2_databases']);
-        $db_index = key($GLOBALS['_MDB2_databases']) + 1;
-        $GLOBALS['_MDB2_databases'][$db_index] = &$this;
-        $this->db_index = $db_index;
-    }
-
-    // }}}
-    // {{{ destructor: function __destruct()
-
-    /**
-     *  Destructor
-     */
-    function __destruct()
-    {
-        $this->disconnect(false);
-    }
-
-    // }}}
-    // {{{ function free()
-
-    /**
-     * Free the internal references so that the instance can be destroyed
-     *
-     * @return  bool    true on success, false if result is invalid
-     *
-     * @access  public
-     */
-    function free()
-    {
-        unset($GLOBALS['_MDB2_databases'][$this->db_index]);
-        unset($this->db_index);
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function __toString()
-
-    /**
-     * String conversation
-     *
-     * @return  string representation of the object
-     *
-     * @access  public
-     */
-    function __toString()
-    {
-        $info = get_class($this);
-        $info.= ': (phptype = '.$this->phptype.', dbsyntax = '.$this->dbsyntax.')';
-        if ($this->connection) {
-            $info.= ' [connected]';
-        }
-        return $info;
-    }
-
-    // }}}
-    // {{{ function errorInfo($error = null)
-
-    /**
-     * This method is used to collect information about an error
-     *
-     * @param   mixed   error code or resource
-     *
-     * @return  array   with MDB2 errorcode, native error code, native message
-     *
-     * @access  public
-     */
-    function errorInfo($error = null)
-    {
-        return array($error, null, null);
-    }
-
-    // }}}
-    // {{{ function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
-
-    /**
-     * This method is used to communicate an error and invoke error
-     * callbacks etc.  Basically a wrapper for PEAR::raiseError
-     * without the message string.
-     *
-     * @param mixed  $code     integer error code, or a PEAR error object (all 
-     *                         other parameters are ignored if this parameter is
-     *                         an object
-     * @param int    $mode     error mode, see PEAR_Error docs
-     * @param mixed  $options  If error mode is PEAR_ERROR_TRIGGER, this is the
-     *                         error level (E_USER_NOTICE etc). If error mode is
-     *                         PEAR_ERROR_CALLBACK, this is the callback function,
-     *                         either as a function name, or as an array of an
-     *                         object and method name. For other error modes this
-     *                         parameter is ignored.
-     * @param string $userinfo Extra debug information. Defaults to the last
-     *                         query and native error code.
-     * @param string $method   name of the method that triggered the error
-     * @param string $dummy1   not used
-     * @param bool   $dummy2   not used
-     *
-     * @return PEAR_Error instance of a PEAR Error object
-     * @access public
-     * @see    PEAR_Error
-     */
-    function &raiseError($code = null,
-                         $mode = null,
-                         $options = null,
-                         $userinfo = null,
-                         $method = null,
-                         $dummy1 = null,
-                         $dummy2 = false
-    ) {
-        $userinfo = "[Error message: $userinfo]\n";
-        // The error is yet a MDB2 error object
-        if (PEAR::isError($code)) {
-            // because we use the static PEAR::raiseError, our global
-            // handler should be used if it is set
-            if ((null === $mode) && !empty($this->_default_error_mode)) {
-                $mode    = $this->_default_error_mode;
-                $options = $this->_default_error_options;
-            }
-            if (null === $userinfo) {
-                $userinfo = $code->getUserinfo();
-            }
-            $code = $code->getCode();
-        } elseif ($code == MDB2_ERROR_NOT_FOUND) {
-            // extension not loaded: don't call $this->errorInfo() or the script
-            // will die
-        } elseif (isset($this->connection)) {
-            if (!empty($this->last_query)) {
-                $userinfo.= "[Last executed query: {$this->last_query}]\n";
-            }
-            $native_errno = $native_msg = null;
-            list($code, $native_errno, $native_msg) = $this->errorInfo($code);
-            if ((null !== $native_errno) && $native_errno !== '') {
-                $userinfo.= "[Native code: $native_errno]\n";
-            }
-            if ((null !== $native_msg) && $native_msg !== '') {
-                $userinfo.= "[Native message: ". strip_tags($native_msg) ."]\n";
-            }
-            if (null !== $method) {
-                $userinfo = $method.': '.$userinfo;
-            }
-        }
-
-        $err = PEAR::raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
-        if ($err->getMode() !== PEAR_ERROR_RETURN
-            && isset($this->nested_transaction_counter) && !$this->has_transaction_error) {
-            $this->has_transaction_error = $err;
-        }
-        return $err;
-    }
-
-    // }}}
-    // {{{ function resetWarnings()
-
-    /**
-     * reset the warning array
-     *
-     * @return void
-     *
-     * @access  public
-     */
-    function resetWarnings()
-    {
-        $this->warnings = array();
-    }
-
-    // }}}
-    // {{{ function getWarnings()
-
-    /**
-     * Get all warnings in reverse order.
-     * This means that the last warning is the first element in the array
-     *
-     * @return  array   with warnings
-     *
-     * @access  public
-     * @see     resetWarnings()
-     */
-    function getWarnings()
-    {
-        return array_reverse($this->warnings);
-    }
-
-    // }}}
-    // {{{ function setFetchMode($fetchmode, $object_class = 'stdClass')
-
-    /**
-     * Sets which fetch mode should be used by default on queries
-     * on this connection
-     *
-     * @param   int     MDB2_FETCHMODE_ORDERED, MDB2_FETCHMODE_ASSOC
-     *                               or MDB2_FETCHMODE_OBJECT
-     * @param   string  the class name of the object to be returned
-     *                               by the fetch methods when the
-     *                               MDB2_FETCHMODE_OBJECT mode is selected.
-     *                               If no class is specified by default a cast
-     *                               to object from the assoc array row will be
-     *                               done.  There is also the possibility to use
-     *                               and extend the 'MDB2_row' class.
-     *
-     * @return  mixed   MDB2_OK or MDB2 Error Object
-     *
-     * @access  public
-     * @see     MDB2_FETCHMODE_ORDERED, MDB2_FETCHMODE_ASSOC, MDB2_FETCHMODE_OBJECT
-     */
-    function setFetchMode($fetchmode, $object_class = 'stdClass')
-    {
-        switch ($fetchmode) {
-        case MDB2_FETCHMODE_OBJECT:
-            $this->options['fetch_class'] = $object_class;
-        case MDB2_FETCHMODE_ORDERED:
-        case MDB2_FETCHMODE_ASSOC:
-            $this->fetchmode = $fetchmode;
-            break;
-        default:
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'invalid fetchmode mode', __FUNCTION__);
-        }
-
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function setOption($option, $value)
-
-    /**
-     * set the option for the db class
-     *
-     * @param   string  option name
-     * @param   mixed   value for the option
-     *
-     * @return  mixed   MDB2_OK or MDB2 Error Object
-     *
-     * @access  public
-     */
-    function setOption($option, $value)
-    {
-        if (array_key_exists($option, $this->options)) {
-            $this->options[$option] = $value;
-            return MDB2_OK;
-        }
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            "unknown option $option", __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function getOption($option)
-
-    /**
-     * Returns the value of an option
-     *
-     * @param   string  option name
-     *
-     * @return  mixed   the option value or error object
-     *
-     * @access  public
-     */
-    function getOption($option)
-    {
-        if (array_key_exists($option, $this->options)) {
-            return $this->options[$option];
-        }
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            "unknown option $option", __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function debug($message, $scope = '', $is_manip = null)
-
-    /**
-     * set a debug message
-     *
-     * @param   string  message that should be appended to the debug variable
-     * @param   string  usually the method name that triggered the debug call:
-     *                  for example 'query', 'prepare', 'execute', 'parameters',
-     *                  'beginTransaction', 'commit', 'rollback'
-     * @param   array   contains context information about the debug() call
-     *                  common keys are: is_manip, time, result etc.
-     *
-     * @return void
-     *
-     * @access  public
-     */
-    function debug($message, $scope = '', $context = array())
-    {
-        if ($this->options['debug'] && $this->options['debug_handler']) {
-            if (!$this->options['debug_expanded_output']) {
-                if (!empty($context['when']) && $context['when'] !== 'pre') {
-                    return null;
-                }
-                $context = empty($context['is_manip']) ? false : $context['is_manip'];
-            }
-            return call_user_func_array($this->options['debug_handler'], array(&$this, $scope, $message, $context));
-        }
-        return null;
-    }
-
-    // }}}
-    // {{{ function getDebugOutput()
-
-    /**
-     * output debug info
-     *
-     * @return  string  content of the debug_output class variable
-     *
-     * @access  public
-     */
-    function getDebugOutput()
-    {
-        return $this->debug_output;
-    }
-
-    // }}}
-    // {{{ function escape($text)
-
-    /**
-     * Quotes a string so it can be safely used in a query. It will quote
-     * the text so it can safely be used within a query.
-     *
-     * @param   string  the input string to quote
-     * @param   bool    escape wildcards
-     *
-     * @return  string  quoted string
-     *
-     * @access  public
-     */
-    function escape($text, $escape_wildcards = false)
-    {
-        if ($escape_wildcards) {
-            $text = $this->escapePattern($text);
-        }
-
-        $text = str_replace($this->string_quoting['end'], $this->string_quoting['escape'] . $this->string_quoting['end'], $text);
-        return $text;
-    }
-
-    // }}}
-    // {{{ function escapePattern($text)
-
-    /**
-     * Quotes pattern (% and _) characters in a string)
-     *
-     * @param   string  the input string to quote
-     *
-     * @return  string  quoted string
-     *
-     * @access  public
-     */
-    function escapePattern($text)
-    {
-        if ($this->string_quoting['escape_pattern']) {
-            $text = str_replace($this->string_quoting['escape_pattern'], $this->string_quoting['escape_pattern'] . $this->string_quoting['escape_pattern'], $text);
-            foreach ($this->wildcards as $wildcard) {
-                $text = str_replace($wildcard, $this->string_quoting['escape_pattern'] . $wildcard, $text);
-            }
-        }
-        return $text;
-    }
-
-    // }}}
-    // {{{ function quoteIdentifier($str, $check_option = false)
-
-    /**
-     * Quote a string so it can be safely used as a table or column name
-     *
-     * Delimiting style depends on which database driver is being used.
-     *
-     * NOTE: just because you CAN use delimited identifiers doesn't mean
-     * you SHOULD use them.  In general, they end up causing way more
-     * problems than they solve.
-     *
-     * NOTE: if you have table names containing periods, don't use this method
-     * (@see bug #11906)
-     *
-     * Portability is broken by using the following characters inside
-     * delimited identifiers:
-     *   + backtick (<kbd>`</kbd>) -- due to MySQL
-     *   + double quote (<kbd>"</kbd>) -- due to Oracle
-     *   + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access
-     *
-     * Delimited identifiers are known to generally work correctly under
-     * the following drivers:
-     *   + mssql
-     *   + mysql
-     *   + mysqli
-     *   + oci8
-     *   + pgsql
-     *   + sqlite
-     *
-     * InterBase doesn't seem to be able to use delimited identifiers
-     * via PHP 4.  They work fine under PHP 5.
-     *
-     * @param   string  identifier name to be quoted
-     * @param   bool    check the 'quote_identifier' option
-     *
-     * @return  string  quoted identifier string
-     *
-     * @access  public
-     */
-    function quoteIdentifier($str, $check_option = false)
-    {
-        if ($check_option && !$this->options['quote_identifier']) {
-            return $str;
-        }
-        $str = str_replace($this->identifier_quoting['end'], $this->identifier_quoting['escape'] . $this->identifier_quoting['end'], $str);
-        $parts = explode('.', $str);
-        foreach (array_keys($parts) as $k) {
-            $parts[$k] = $this->identifier_quoting['start'] . $parts[$k] . $this->identifier_quoting['end'];
-        }
-        return implode('.', $parts);
-    }
-
-    // }}}
-    // {{{ function getAsKeyword()
-
-    /**
-     * Gets the string to alias column
-     *
-     * @return string to use when aliasing a column
-     */
-    function getAsKeyword()
-    {
-        return $this->as_keyword;
-    }
-
-    // }}}
-    // {{{ function getConnection()
-
-    /**
-     * Returns a native connection
-     *
-     * @return  mixed   a valid MDB2 connection object,
-     *                  or a MDB2 error object on error
-     *
-     * @access  public
-     */
-    function getConnection()
-    {
-        $result = $this->connect();
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return $this->connection;
-    }
-
-     // }}}
-    // {{{ function _fixResultArrayValues(&$row, $mode)
-
-    /**
-     * Do all necessary conversions on result arrays to fix DBMS quirks
-     *
-     * @param   array   the array to be fixed (passed by reference)
-     * @param   array   bit-wise addition of the required portability modes
-     *
-     * @return  void
-     *
-     * @access  protected
-     */
-    function _fixResultArrayValues(&$row, $mode)
-    {
-        switch ($mode) {
-        case MDB2_PORTABILITY_EMPTY_TO_NULL:
-            foreach ($row as $key => $value) {
-                if ($value === '') {
-                    $row[$key] = null;
-                }
-            }
-            break;
-        case MDB2_PORTABILITY_RTRIM:
-            foreach ($row as $key => $value) {
-                if (is_string($value)) {
-                    $row[$key] = rtrim($value);
-                }
-            }
-            break;
-        case MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES:
-            $tmp_row = array();
-            foreach ($row as $key => $value) {
-                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
-            }
-            $row = $tmp_row;
-            break;
-        case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_EMPTY_TO_NULL):
-            foreach ($row as $key => $value) {
-                if ($value === '') {
-                    $row[$key] = null;
-                } elseif (is_string($value)) {
-                    $row[$key] = rtrim($value);
-                }
-            }
-            break;
-        case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES):
-            $tmp_row = array();
-            foreach ($row as $key => $value) {
-                if (is_string($value)) {
-                    $value = rtrim($value);
-                }
-                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
-            }
-            $row = $tmp_row;
-            break;
-        case (MDB2_PORTABILITY_EMPTY_TO_NULL + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES):
-            $tmp_row = array();
-            foreach ($row as $key => $value) {
-                if ($value === '') {
-                    $value = null;
-                }
-                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
-            }
-            $row = $tmp_row;
-            break;
-        case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_EMPTY_TO_NULL + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES):
-            $tmp_row = array();
-            foreach ($row as $key => $value) {
-                if ($value === '') {
-                    $value = null;
-                } elseif (is_string($value)) {
-                    $value = rtrim($value);
-                }
-                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
-            }
-            $row = $tmp_row;
-            break;
-        }
-    }
-
-    // }}}
-    // {{{ function loadModule($module, $property = null, $phptype_specific = null)
-
-    /**
-     * loads a module
-     *
-     * @param   string  name of the module that should be loaded
-     *                  (only used for error messages)
-     * @param   string  name of the property into which the class will be loaded
-     * @param   bool    if the class to load for the module is specific to the
-     *                  phptype
-     *
-     * @return  object  on success a reference to the given module is returned
-     *                  and on failure a PEAR error
-     *
-     * @access  public
-     */
-    function loadModule($module, $property = null, $phptype_specific = null)
-    {
-        if (!$property) {
-            $property = strtolower($module);
-        }
-
-        if (!isset($this->{$property})) {
-            $version = $phptype_specific;
-            if ($phptype_specific !== false) {
-                $version = true;
-                $class_name = 'MDB2_Driver_'.$module.'_'.$this->phptype;
-                $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';
-            }
-            if ($phptype_specific === false
-                || (!MDB2::classExists($class_name) && !MDB2::fileExists($file_name))
-            ) {
-                $version = false;
-                $class_name = 'MDB2_'.$module;
-                $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';
-            }
-
-            $err = MDB2::loadClass($class_name, $this->getOption('debug'));
-            if (PEAR::isError($err)) {
-                return $err;
-            }
-
-            // load module in a specific version
-            if ($version) {
-                if (method_exists($class_name, 'getClassName')) {
-                    $class_name_new = call_user_func(array($class_name, 'getClassName'), $this->db_index);
-                    if ($class_name != $class_name_new) {
-                        $class_name = $class_name_new;
-                        $err = MDB2::loadClass($class_name, $this->getOption('debug'));
-                        if (PEAR::isError($err)) {
-                            return $err;
-                        }
-                    }
-                }
-            }
-
-            if (!MDB2::classExists($class_name)) {
-                $err = $this->raiseError(MDB2_ERROR_LOADMODULE, null, null,
-                    "unable to load module '$module' into property '$property'", __FUNCTION__);
-                return $err;
-            }
-            $this->{$property} = new $class_name($this->db_index);
-            $this->modules[$module] = $this->{$property};
-            if ($version) {
-                // this will be used in the connect method to determine if the module
-                // needs to be loaded with a different version if the server
-                // version changed in between connects
-                $this->loaded_version_modules[] = $property;
-            }
-        }
-
-        return $this->{$property};
-    }
-
-    // }}}
-    // {{{ function __call($method, $params)
-
-    /**
-     * Calls a module method using the __call magic method
-     *
-     * @param   string  Method name.
-     * @param   array   Arguments.
-     *
-     * @return  mixed   Returned value.
-     */
-    function __call($method, $params)
-    {
-        $module = null;
-        if (preg_match('/^([a-z]+)([A-Z])(.*)$/', $method, $match)
-            && isset($this->options['modules'][$match[1]])
-        ) {
-            $module = $this->options['modules'][$match[1]];
-            $method = strtolower($match[2]).$match[3];
-            if (!isset($this->modules[$module]) || !is_object($this->modules[$module])) {
-                $result = $this->loadModule($module);
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-        } else {
-            foreach ($this->modules as $key => $foo) {
-                if (is_object($this->modules[$key])
-                    && method_exists($this->modules[$key], $method)
-                ) {
-                    $module = $key;
-                    break;
-                }
-            }
-        }
-        if (null !== $module) {
-            return call_user_func_array(array(&$this->modules[$module], $method), $params);
-        }
-        trigger_error(sprintf('Call to undefined function: %s::%s().', get_class($this), $method), E_USER_ERROR);
-    }
-
-    // }}}
-    // {{{ function beginTransaction($savepoint = null)
-
-    /**
-     * Start a transaction or set a savepoint.
-     *
-     * @param   string  name of a savepoint to set
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function beginTransaction($savepoint = null)
-    {
-        $this->debug('Starting transaction', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'transactions are not supported', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function commit($savepoint = null)
-
-    /**
-     * Commit the database changes done during a transaction that is in
-     * progress or release a savepoint. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after committing the pending changes.
-     *
-     * @param   string  name of a savepoint to release
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function commit($savepoint = null)
-    {
-        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'commiting transactions is not supported', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function rollback($savepoint = null)
-
-    /**
-     * Cancel any database changes done during a transaction or since a specific
-     * savepoint that is in progress. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after canceling the pending changes.
-     *
-     * @param   string  name of a savepoint to rollback to
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function rollback($savepoint = null)
-    {
-        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'rolling back transactions is not supported', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function inTransaction($ignore_nested = false)
-
-    /**
-     * If a transaction is currently open.
-     *
-     * @param   bool    if the nested transaction count should be ignored
-     * @return  int|bool    - an integer with the nesting depth is returned if a
-     *                      nested transaction is open
-     *                      - true is returned for a normal open transaction
-     *                      - false is returned if no transaction is open
-     *
-     * @access  public
-     */
-    function inTransaction($ignore_nested = false)
-    {
-        if (!$ignore_nested && isset($this->nested_transaction_counter)) {
-            return $this->nested_transaction_counter;
-        }
-        return $this->in_transaction;
-    }
-
-    // }}}
-    // {{{ function setTransactionIsolation($isolation)
-
-    /**
-     * Set the transacton isolation level.
-     *
-     * @param   string  standard isolation level
-     *                  READ UNCOMMITTED (allows dirty reads)
-     *                  READ COMMITTED (prevents dirty reads)
-     *                  REPEATABLE READ (prevents nonrepeatable reads)
-     *                  SERIALIZABLE (prevents phantom reads)
-     * @param   array some transaction options:
-     *                  'wait' => 'WAIT' | 'NO WAIT'
-     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function setTransactionIsolation($isolation, $options = array())
-    {
-        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'isolation level setting is not supported', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function beginNestedTransaction($savepoint = false)
-
-    /**
-     * Start a nested transaction.
-     *
-     * @return  mixed   MDB2_OK on success/savepoint name, a MDB2 error on failure
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function beginNestedTransaction()
-    {
-        if ($this->in_transaction) {
-            ++$this->nested_transaction_counter;
-            $savepoint = sprintf($this->options['savepoint_format'], $this->nested_transaction_counter);
-            if ($this->supports('savepoints') && $savepoint) {
-                return $this->beginTransaction($savepoint);
-            }
-            return MDB2_OK;
-        }
-        $this->has_transaction_error = false;
-        $result = $this->beginTransaction();
-        $this->nested_transaction_counter = 1;
-        return $result;
-    }
-
-    // }}}
-    // {{{ function completeNestedTransaction($force_rollback = false, $release = false)
-
-    /**
-     * Finish a nested transaction by rolling back if an error occured or
-     * committing otherwise.
-     *
-     * @param   bool    if the transaction should be rolled back regardless
-     *                  even if no error was set within the nested transaction
-     * @return  mixed   MDB_OK on commit/counter decrementing, false on rollback
-     *                  and a MDB2 error on failure
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function completeNestedTransaction($force_rollback = false)
-    {
-        if ($this->nested_transaction_counter > 1) {
-            $savepoint = sprintf($this->options['savepoint_format'], $this->nested_transaction_counter);
-            if ($this->supports('savepoints') && $savepoint) {
-                if ($force_rollback || $this->has_transaction_error) {
-                    $result = $this->rollback($savepoint);
-                    if (!PEAR::isError($result)) {
-                        $result = false;
-                        $this->has_transaction_error = false;
-                    }
-                } else {
-                    $result = $this->commit($savepoint);
-                }
-            } else {
-                $result = MDB2_OK;
-            }
-            --$this->nested_transaction_counter;
-            return $result;
-        }
-
-        $this->nested_transaction_counter = null;
-        $result = MDB2_OK;
-
-        // transaction has not yet been rolled back
-        if ($this->in_transaction) {
-            if ($force_rollback || $this->has_transaction_error) {
-                $result = $this->rollback();
-                if (!PEAR::isError($result)) {
-                    $result = false;
-                }
-            } else {
-                $result = $this->commit();
-            }
-        }
-        $this->has_transaction_error = false;
-        return $result;
-    }
-
-    // }}}
-    // {{{ function failNestedTransaction($error = null, $immediately = false)
-
-    /**
-     * Force setting nested transaction to failed.
-     *
-     * @param   mixed   value to return in getNestededTransactionError()
-     * @param   bool    if the transaction should be rolled back immediately
-     * @return  bool    MDB2_OK
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function failNestedTransaction($error = null, $immediately = false)
-    {
-        if (null !== $error) {
-            $error = $this->has_transaction_error ? $this->has_transaction_error : true;
-        } elseif (!$error) {
-            $error = true;
-        }
-        $this->has_transaction_error = $error;
-        if (!$immediately) {
-            return MDB2_OK;
-        }
-        return $this->rollback();
-    }
-
-    // }}}
-    // {{{ function getNestedTransactionError()
-
-    /**
-     * The first error that occured since the transaction start.
-     *
-     * @return  MDB2_Error|bool     MDB2 error object if an error occured or false.
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function getNestedTransactionError()
-    {
-        return $this->has_transaction_error;
-    }
-
-    // }}}
-    // {{{ connect()
-
-    /**
-     * Connect to the database
-     *
-     * @return true on success, MDB2 Error Object on failure
-     */
-    function connect()
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ databaseExists()
-
-    /**
-     * check if given database name is exists?
-     *
-     * @param string $name    name of the database that should be checked
-     *
-     * @return mixed true/false on success, a MDB2 error on failure
-     * @access public
-     */
-    function databaseExists($name)
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ setCharset($charset, $connection = null)
-
-    /**
-     * Set the charset on the current connection
-     *
-     * @param string    charset
-     * @param resource  connection handle
-     *
-     * @return true on success, MDB2 Error Object on failure
-     */
-    function setCharset($charset, $connection = null)
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function disconnect($force = true)
-
-    /**
-     * Log out and disconnect from the database.
-     *
-     * @param boolean $force whether the disconnect should be forced even if the
-     *                       connection is opened persistently
-     *
-     * @return mixed true on success, false if not connected and error object on error
-     *
-     * @access  public
-     */
-    function disconnect($force = true)
-    {
-        $this->connection = 0;
-        $this->connected_dsn = array();
-        $this->connected_database_name = '';
-        $this->opened_persistent = null;
-        $this->connected_server_info = '';
-        $this->in_transaction = null;
-        $this->nested_transaction_counter = null;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function setDatabase($name)
-
-    /**
-     * Select a different database
-     *
-     * @param   string  name of the database that should be selected
-     *
-     * @return  string  name of the database previously connected to
-     *
-     * @access  public
-     */
-    function setDatabase($name)
-    {
-        $previous_database_name = (isset($this->database_name)) ? $this->database_name : '';
-        $this->database_name = $name;
-        if (!empty($this->connected_database_name) && ($this->connected_database_name != $this->database_name)) {
-            $this->disconnect(false);
-        }
-        return $previous_database_name;
-    }
-
-    // }}}
-    // {{{ function getDatabase()
-
-    /**
-     * Get the current database
-     *
-     * @return  string  name of the database
-     *
-     * @access  public
-     */
-    function getDatabase()
-    {
-        return $this->database_name;
-    }
-
-    // }}}
-    // {{{ function setDSN($dsn)
-
-    /**
-     * set the DSN
-     *
-     * @param   mixed   DSN string or array
-     *
-     * @return  MDB2_OK
-     *
-     * @access  public
-     */
-    function setDSN($dsn)
-    {
-        $dsn_default = $GLOBALS['_MDB2_dsninfo_default'];
-        $dsn = MDB2::parseDSN($dsn);
-        if (array_key_exists('database', $dsn)) {
-            $this->database_name = $dsn['database'];
-            unset($dsn['database']);
-        }
-        $this->dsn = array_merge($dsn_default, $dsn);
-        return $this->disconnect(false);
-    }
-
-    // }}}
-    // {{{ function getDSN($type = 'string', $hidepw = false)
-
-    /**
-     * return the DSN as a string
-     *
-     * @param   string  format to return ("array", "string")
-     * @param   string  string to hide the password with
-     *
-     * @return  mixed   DSN in the chosen type
-     *
-     * @access  public
-     */
-    function getDSN($type = 'string', $hidepw = false)
-    {
-        $dsn = array_merge($GLOBALS['_MDB2_dsninfo_default'], $this->dsn);
-        $dsn['phptype'] = $this->phptype;
-        $dsn['database'] = $this->database_name;
-        if ($hidepw) {
-            $dsn['password'] = $hidepw;
-        }
-        switch ($type) {
-        // expand to include all possible options
-        case 'string':
-           $dsn = $dsn['phptype'].
-               ($dsn['dbsyntax'] ? ('('.$dsn['dbsyntax'].')') : '').
-               '://'.$dsn['username'].':'.
-                $dsn['password'].'@'.$dsn['hostspec'].
-                ($dsn['port'] ? (':'.$dsn['port']) : '').
-                '/'.$dsn['database'];
-            break;
-        case 'array':
-        default:
-            break;
-        }
-        return $dsn;
-    }
-
-    // }}}
-    // {{{ _isNewLinkSet()
-
-    /**
-     * Check if the 'new_link' option is set
-     *
-     * @return boolean
-     *
-     * @access protected
-     */
-    function _isNewLinkSet()
-    {
-        return (isset($this->dsn['new_link'])
-            && ($this->dsn['new_link'] === true
-             || (is_string($this->dsn['new_link']) && preg_match('/^true$/i', $this->dsn['new_link']))
-             || (is_numeric($this->dsn['new_link']) && 0 != (int)$this->dsn['new_link'])
-            )
-        );
-    }
-
-    // }}}
-    // {{{ function &standaloneQuery($query, $types = null, $is_manip = false)
-
-   /**
-     * execute a query as database administrator
-     *
-     * @param   string  the SQL query
-     * @param   mixed   array that contains the types of the columns in
-     *                        the result set
-     * @param   bool    if the query is a manipulation query
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function standaloneQuery($query, $types = null, $is_manip = false)
-    {
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
-
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $result = $this->_doQuery($query, $is_manip, $connection, false);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        if ($is_manip) {
-            $affected_rows =  $this->_affectedRows($connection, $result);
-            return $affected_rows;
-        }
-        $result = $this->_wrapResult($result, $types, true, false, $limit, $offset);
-        return $result;
-    }
-
-    // }}}
-    // {{{ function _modifyQuery($query, $is_manip, $limit, $offset)
-
-    /**
-     * Changes a query string for various DBMS specific reasons
-     *
-     * @param   string  query to modify
-     * @param   bool    if it is a DML query
-     * @param   int  limit the number of rows
-     * @param   int  start reading from given offset
-     *
-     * @return  string  modified query
-     *
-     * @access  protected
-     */
-    function _modifyQuery($query, $is_manip, $limit, $offset)
-    {
-        return $query;
-    }
-
-    // }}}
-    // {{{ function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null)
-
-    /**
-     * Execute a query
-     * @param   string  query
-     * @param   bool    if the query is a manipulation query
-     * @param   resource connection handle
-     * @param   string  database name
-     *
-     * @return  result or error object
-     *
-     * @access  protected
-     */
-    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
-    {
-        $this->last_query = $query;
-        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        $err = $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-        return $err;
-    }
-
-    // }}}
-    // {{{ function _affectedRows($connection, $result = null)
-
-    /**
-     * Returns the number of rows affected
-     *
-     * @param   resource result handle
-     * @param   resource connection handle
-     *
-     * @return  mixed   MDB2 Error Object or the number of rows affected
-     *
-     * @access  private
-     */
-    function _affectedRows($connection, $result = null)
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function &exec($query)
-
-    /**
-     * Execute a manipulation query to the database and return the number of affected rows
-     *
-     * @param   string  the SQL query
-     *
-     * @return  mixed   number of affected rows on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function exec($query)
-    {
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $query = $this->_modifyQuery($query, true, $limit, $offset);
-
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $result = $this->_doQuery($query, true, $connection, $this->database_name);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        $affectedRows = $this->_affectedRows($connection, $result);
-        return $affectedRows;
-    }
-
-    // }}}
-    // {{{ function &query($query, $types = null, $result_class = true, $result_wrap_class = false)
-
-    /**
-     * Send a query to the database and return any results
-     *
-     * @param   string  the SQL query
-     * @param   mixed   array that contains the types of the columns in
-     *                        the result set
-     * @param   mixed   string which specifies which result class to use
-     * @param   mixed   string which specifies which class to wrap results in
-     *
-     * @return mixed   an MDB2_Result handle on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function query($query, $types = null, $result_class = true, $result_wrap_class = false)
-    {
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $query = $this->_modifyQuery($query, false, $limit, $offset);
-
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $result = $this->_doQuery($query, false, $connection, $this->database_name);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        $result = $this->_wrapResult($result, $types, $result_class, $result_wrap_class, $limit, $offset);
-        return $result;
-    }
-
-    // }}}
-    // {{{ function _wrapResult($result_resource, $types = array(), $result_class = true, $result_wrap_class = false, $limit = null, $offset = null)
-
-    /**
-     * wrap a result set into the correct class
-     *
-     * @param   resource result handle
-     * @param   mixed   array that contains the types of the columns in
-     *                        the result set
-     * @param   mixed   string which specifies which result class to use
-     * @param   mixed   string which specifies which class to wrap results in
-     * @param   string  number of rows to select
-     * @param   string  first row to select
-     *
-     * @return mixed   an MDB2_Result, a MDB2 error on failure
-     *
-     * @access  protected
-     */
-    function _wrapResult($result_resource, $types = array(), $result_class = true,
-        $result_wrap_class = false, $limit = null, $offset = null)
-    {
-        if ($types === true) {
-            if ($this->supports('result_introspection')) {
-                $this->loadModule('Reverse', null, true);
-                $tableInfo = $this->reverse->tableInfo($result_resource);
-                if (PEAR::isError($tableInfo)) {
-                    return $tableInfo;
-                }
-                $types = array();
-                foreach ($tableInfo as $field) {
-                    $types[] = $field['mdb2type'];
-                }
-            } else {
-                $types = null;
-            }
-        }
-
-        if ($result_class === true) {
-            $result_class = $this->options['result_buffering']
-                ? $this->options['buffered_result_class'] : $this->options['result_class'];
-        }
-
-        if ($result_class) {
-            $class_name = sprintf($result_class, $this->phptype);
-            if (!MDB2::classExists($class_name)) {
-                $err = $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                    'result class does not exist '.$class_name, __FUNCTION__);
-                return $err;
-            }
-            $result = new $class_name($this, $result_resource, $limit, $offset);
-            if (!MDB2::isResultCommon($result)) {
-                $err = $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                    'result class is not extended from MDB2_Result_Common', __FUNCTION__);
-                return $err;
-            }
-            if (!empty($types)) {
-                $err = $result->setResultTypes($types);
-                if (PEAR::isError($err)) {
-                    $result->free();
-                    return $err;
-                }
-            }
-        }
-        if ($result_wrap_class === true) {
-            $result_wrap_class = $this->options['result_wrap_class'];
-        }
-        if ($result_wrap_class) {
-            if (!MDB2::classExists($result_wrap_class)) {
-                $err = $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                    'result wrap class does not exist '.$result_wrap_class, __FUNCTION__);
-                return $err;
-            }
-            $result = new $result_wrap_class($result_resource, $this->fetchmode);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ function getServerVersion($native = false)
-
-    /**
-     * return version information about the server
-     *
-     * @param   bool    determines if the raw version string should be returned
-     *
-     * @return  mixed   array with version information or row string
-     *
-     * @access  public
-     */
-    function getServerVersion($native = false)
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function setLimit($limit, $offset = null)
-
-    /**
-     * set the range of the next query
-     *
-     * @param   string  number of rows to select
-     * @param   string  first row to select
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function setLimit($limit, $offset = null)
-    {
-        if (!$this->supports('limit_queries')) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'limit is not supported by this driver', __FUNCTION__);
-        }
-        $limit = (int)$limit;
-        if ($limit < 0) {
-            return $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                'it was not specified a valid selected range row limit', __FUNCTION__);
-        }
-        $this->limit = $limit;
-        if (null !== $offset) {
-            $offset = (int)$offset;
-            if ($offset < 0) {
-                return $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                    'it was not specified a valid first selected range row', __FUNCTION__);
-            }
-            $this->offset = $offset;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function subSelect($query, $type = false)
-
-    /**
-     * simple subselect emulation: leaves the query untouched for all RDBMS
-     * that support subselects
-     *
-     * @param   string  the SQL query for the subselect that may only
-     *                      return a column
-     * @param   string  determines type of the field
-     *
-     * @return  string  the query
-     *
-     * @access  public
-     */
-    function subSelect($query, $type = false)
-    {
-        if ($this->supports('sub_selects') === true) {
-            return $query;
-        }
-
-        if (!$this->supports('sub_selects')) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'method not implemented', __FUNCTION__);
-        }
-
-        $col = $this->queryCol($query, $type);
-        if (PEAR::isError($col)) {
-            return $col;
-        }
-        if (!is_array($col) || count($col) == 0) {
-            return 'NULL';
-        }
-        if ($type) {
-            $this->loadModule('Datatype', null, true);
-            return $this->datatype->implodeArray($col, $type);
-        }
-        return implode(', ', $col);
-    }
-
-    // }}}
-    // {{{ function replace($table, $fields)
-
-    /**
-     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
-     * query, except that if there is already a row in the table with the same
-     * key field values, the old row is deleted before the new row is inserted.
-     *
-     * The REPLACE type of query does not make part of the SQL standards. Since
-     * practically only MySQL and SQLite implement it natively, this type of
-     * query isemulated through this method for other DBMS using standard types
-     * of queries inside a transaction to assure the atomicity of the operation.
-     *
-     * @param   string  name of the table on which the REPLACE query will
-     *       be executed.
-     * @param   array   associative array   that describes the fields and the
-     *       values that will be inserted or updated in the specified table. The
-     *       indexes of the array are the names of all the fields of the table.
-     *       The values of the array are also associative arrays that describe
-     *       the values and other properties of the table fields.
-     *
-     *       Here follows a list of field properties that need to be specified:
-     *
-     *       value
-     *           Value to be assigned to the specified field. This value may be
-     *           of specified in database independent type format as this
-     *           function can perform the necessary datatype conversions.
-     *
-     *           Default: this property is required unless the Null property is
-     *           set to 1.
-     *
-     *       type
-     *           Name of the type of the field. Currently, all types MDB2
-     *           are supported except for clob and blob.
-     *
-     *           Default: no type conversion
-     *
-     *       null
-     *           bool    property that indicates that the value for this field
-     *           should be set to null.
-     *
-     *           The default value for fields missing in INSERT queries may be
-     *           specified the definition of a table. Often, the default value
-     *           is already null, but since the REPLACE may be emulated using
-     *           an UPDATE query, make sure that all fields of the table are
-     *           listed in this function argument array.
-     *
-     *           Default: 0
-     *
-     *       key
-     *           bool    property that indicates that this field should be
-     *           handled as a primary key or at least as part of the compound
-     *           unique index of the table that will determine the row that will
-     *           updated if it exists or inserted a new row otherwise.
-     *
-     *           This function will fail if no key field is specified or if the
-     *           value of a key field is set to null because fields that are
-     *           part of unique index they may not be null.
-     *
-     *           Default: 0
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function replace($table, $fields)
-    {
-        if (!$this->supports('replace')) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'replace query is not supported', __FUNCTION__);
-        }
-        $count = count($fields);
-        $condition = $values = array();
-        for ($colnum = 0, reset($fields); $colnum < $count; next($fields), $colnum++) {
-            $name = key($fields);
-            if (isset($fields[$name]['null']) && $fields[$name]['null']) {
-                $value = 'NULL';
-            } else {
-                $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null;
-                $value = $this->quote($fields[$name]['value'], $type);
-            }
-            $values[$name] = $value;
-            if (isset($fields[$name]['key']) && $fields[$name]['key']) {
-                if ($value === 'NULL') {
-                    return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
-                        'key value '.$name.' may not be NULL', __FUNCTION__);
-                }
-                $condition[] = $this->quoteIdentifier($name, true) . '=' . $value;
-            }
-        }
-        if (empty($condition)) {
-            return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
-                'not specified which fields are keys', __FUNCTION__);
-        }
-
-        $result = null;
-        $in_transaction = $this->in_transaction;
-        if (!$in_transaction && PEAR::isError($result = $this->beginTransaction())) {
-            return $result;
-        }
-
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $condition = ' WHERE '.implode(' AND ', $condition);
-        $query = 'DELETE FROM ' . $this->quoteIdentifier($table, true) . $condition;
-        $result = $this->_doQuery($query, true, $connection);
-        if (!PEAR::isError($result)) {
-            $affected_rows = $this->_affectedRows($connection, $result);
-            $insert = '';
-            foreach ($values as $key => $value) {
-                $insert .= ($insert?', ':'') . $this->quoteIdentifier($key, true);
-            }
-            $values = implode(', ', $values);
-            $query = 'INSERT INTO '. $this->quoteIdentifier($table, true) . "($insert) VALUES ($values)";
-            $result = $this->_doQuery($query, true, $connection);
-            if (!PEAR::isError($result)) {
-                $affected_rows += $this->_affectedRows($connection, $result);;
-            }
-        }
-
-        if (!$in_transaction) {
-            if (PEAR::isError($result)) {
-                $this->rollback();
-            } else {
-                $result = $this->commit();
-            }
-        }
-
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        return $affected_rows;
-    }
-
-    // }}}
-    // {{{ function &prepare($query, $types = null, $result_types = null, $lobs = array())
-
-    /**
-     * Prepares a query for multiple execution with execute().
-     * With some database backends, this is emulated.
-     * prepare() requires a generic query as string like
-     * 'INSERT INTO numbers VALUES(?,?)' or
-     * 'INSERT INTO numbers VALUES(:foo,:bar)'.
-     * The ? and :name and are placeholders which can be set using
-     * bindParam() and the query can be sent off using the execute() method.
-     * The allowed format for :name can be set with the 'bindname_format' option.
-     *
-     * @param   string  the query to prepare
-     * @param   mixed   array that contains the types of the placeholders
-     * @param   mixed   array that contains the types of the columns in
-     *                        the result set or MDB2_PREPARE_RESULT, if set to
-     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
-     * @param   mixed   key (field) value (parameter) pair for all lob placeholders
-     *
-     * @return  mixed   resource handle for the prepared query on success, 
-     *                  a MDB2 error on failure
-     *
-     * @access  public
-     * @see     bindParam, execute
-     */
-    function prepare($query, $types = null, $result_types = null, $lobs = array())
-    {
-        $is_manip = ($result_types === MDB2_PREPARE_MANIP);
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        $placeholder_type_guess = $placeholder_type = null;
-        $question  = '?';
-        $colon     = ':';
-        $positions = array();
-        $position  = 0;
-        while ($position < strlen($query)) {
-            $q_position = strpos($query, $question, $position);
-            $c_position = strpos($query, $colon, $position);
-            if ($q_position && $c_position) {
-                $p_position = min($q_position, $c_position);
-            } elseif ($q_position) {
-                $p_position = $q_position;
-            } elseif ($c_position) {
-                $p_position = $c_position;
-            } else {
-                break;
-            }
-            if (null === $placeholder_type) {
-                $placeholder_type_guess = $query[$p_position];
-            }
-
-            $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position);
-            if (PEAR::isError($new_pos)) {
-                return $new_pos;
-            }
-            if ($new_pos != $position) {
-                $position = $new_pos;
-                continue; //evaluate again starting from the new position
-            }
-
-            if ($query[$position] == $placeholder_type_guess) {
-                if (null === $placeholder_type) {
-                    $placeholder_type = $query[$p_position];
-                    $question = $colon = $placeholder_type;
-                    if (!empty($types) && is_array($types)) {
-                        if ($placeholder_type == ':') {
-                            if (is_int(key($types))) {
-                                $types_tmp = $types;
-                                $types = array();
-                                $count = -1;
-                            }
-                        } else {
-                            $types = array_values($types);
-                        }
-                    }
-                }
-                if ($placeholder_type == ':') {
-                    $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
-                    $parameter = preg_replace($regexp, '\\1', $query);
-                    if ($parameter === '') {
-                        $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                            'named parameter name must match "bindname_format" option', __FUNCTION__);
-                        return $err;
-                    }
-                    $positions[$p_position] = $parameter;
-                    $query = substr_replace($query, '?', $position, strlen($parameter)+1);
-                    // use parameter name in type array
-                    if (isset($count) && isset($types_tmp[++$count])) {
-                        $types[$parameter] = $types_tmp[$count];
-                    }
-                } else {
-                    $positions[$p_position] = count($positions);
-                }
-                $position = $p_position + 1;
-            } else {
-                $position = $p_position;
-            }
-        }
-        $class_name = 'MDB2_Statement_'.$this->phptype;
-        $statement = null;
-        $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset);
-        $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj));
-        return $obj;
-    }
-
-    // }}}
-    // {{{ function _skipDelimitedStrings($query, $position, $p_position)
-    
-    /**
-     * Utility method, used by prepare() to avoid replacing placeholders within delimited strings.
-     * Check if the placeholder is contained within a delimited string.
-     * If so, skip it and advance the position, otherwise return the current position,
-     * which is valid
-     *
-     * @param string $query
-     * @param integer $position current string cursor position
-     * @param integer $p_position placeholder position
-     *
-     * @return mixed integer $new_position on success
-     *               MDB2_Error on failure
-     *
-     * @access  protected
-     */
-    function _skipDelimitedStrings($query, $position, $p_position)
-    {
-        $ignores = array();
-        $ignores[] = $this->string_quoting;
-        $ignores[] = $this->identifier_quoting;
-        $ignores = array_merge($ignores, $this->sql_comments);
-        
-        foreach ($ignores as $ignore) {
-            if (!empty($ignore['start'])) {
-                if (is_int($start_quote = strpos($query, $ignore['start'], $position)) && $start_quote < $p_position) {
-                    $end_quote = $start_quote;
-                    do {
-                        if (!is_int($end_quote = strpos($query, $ignore['end'], $end_quote + 1))) {
-                            if ($ignore['end'] === "\n") {
-                                $end_quote = strlen($query) - 1;
-                            } else {
-                                $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                                    'query with an unterminated text string specified', __FUNCTION__);
-                                return $err;
-                            }
-                        }
-                    } while ($ignore['escape']
-                        && $end_quote-1 != $start_quote
-                        && $query[($end_quote - 1)] == $ignore['escape']
-                        && (   $ignore['escape_pattern'] !== $ignore['escape']
-                            || $query[($end_quote - 2)] != $ignore['escape'])
-                    );
-
-                    $position = $end_quote + 1;
-                    return $position;
-                }
-            }
-        }
-        return $position;
-    }
-    
-    // }}}
-    // {{{ function quote($value, $type = null, $quote = true)
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param   string  text string value that is intended to be converted.
-     * @param   string  type to which the value should be converted to
-     * @param   bool    quote
-     * @param   bool    escape wildcards
-     *
-     * @return  string  text string that represents the given argument value in
-     *       a DBMS specific format.
-     *
-     * @access  public
-     */
-    function quote($value, $type = null, $quote = true, $escape_wildcards = false)
-    {
-        $result = $this->loadModule('Datatype', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        return $this->datatype->quote($value, $type, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ function getDeclaration($type, $name, $field)
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare
-     * of the given type
-     *
-     * @param   string  type to which the value should be converted to
-     * @param   string  name the field to be declared.
-     * @param   string  definition of the field
-     *
-     * @return  string  DBMS specific SQL code portion that should be used to
-     *                 declare the specified field.
-     *
-     * @access  public
-     */
-    function getDeclaration($type, $name, $field)
-    {
-        $result = $this->loadModule('Datatype', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return $this->datatype->getDeclaration($type, $name, $field);
-    }
-
-    // }}}
-    // {{{ function compareDefinition($current, $previous)
-
-    /**
-     * Obtain an array of changes that may need to applied
-     *
-     * @param   array   new definition
-     * @param   array   old definition
-     *
-     * @return  array   containing all changes that will need to be applied
-     *
-     * @access  public
-     */
-    function compareDefinition($current, $previous)
-    {
-        $result = $this->loadModule('Datatype', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return $this->datatype->compareDefinition($current, $previous);
-    }
-
-    // }}}
-    // {{{ function supports($feature)
-
-    /**
-     * Tell whether a DB implementation or its backend extension
-     * supports a given feature.
-     *
-     * @param   string  name of the feature (see the MDB2 class doc)
-     *
-     * @return  bool|string if this DB implementation supports a given feature
-     *                      false means no, true means native,
-     *                      'emulated' means emulated
-     *
-     * @access  public
-     */
-    function supports($feature)
-    {
-        if (array_key_exists($feature, $this->supported)) {
-            return $this->supported[$feature];
-        }
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            "unknown support feature $feature", __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function getSequenceName($sqn)
-
-    /**
-     * adds sequence name formatting to a sequence name
-     *
-     * @param   string  name of the sequence
-     *
-     * @return  string  formatted sequence name
-     *
-     * @access  public
-     */
-    function getSequenceName($sqn)
-    {
-        return sprintf($this->options['seqname_format'],
-            preg_replace('/[^a-z0-9_\-\$.]/i', '_', $sqn));
-    }
-
-    // }}}
-    // {{{ function getIndexName($idx)
-
-    /**
-     * adds index name formatting to a index name
-     *
-     * @param   string  name of the index
-     *
-     * @return  string  formatted index name
-     *
-     * @access  public
-     */
-    function getIndexName($idx)
-    {
-        return sprintf($this->options['idxname_format'],
-            preg_replace('/[^a-z0-9_\-\$.]/i', '_', $idx));
-    }
-
-    // }}}
-    // {{{ function nextID($seq_name, $ondemand = true)
-
-    /**
-     * Returns the next free id of a sequence
-     *
-     * @param   string  name of the sequence
-     * @param   bool    when true missing sequences are automatic created
-     *
-     * @return  mixed   MDB2 Error Object or id
-     *
-     * @access  public
-     */
-    function nextID($seq_name, $ondemand = true)
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function lastInsertID($table = null, $field = null)
-
-    /**
-     * Returns the autoincrement ID if supported or $id or fetches the current
-     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
-     *
-     * @param   string  name of the table into which a new row was inserted
-     * @param   string  name of the field into which a new row was inserted
-     *
-     * @return  mixed   MDB2 Error Object or id
-     *
-     * @access  public
-     */
-    function lastInsertID($table = null, $field = null)
-    {
-        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function currID($seq_name)
-
-    /**
-     * Returns the current id of a sequence
-     *
-     * @param   string  name of the sequence
-     *
-     * @return  mixed   MDB2 Error Object or id
-     *
-     * @access  public
-     */
-    function currID($seq_name)
-    {
-        $this->warnings[] = 'database does not support getting current
-            sequence value, the sequence value was incremented';
-        return $this->nextID($seq_name);
-    }
-
-    // }}}
-    // {{{ function queryOne($query, $type = null, $colnum = 0)
-
-    /**
-     * Execute the specified query, fetch the value from the first column of
-     * the first row of the result set and then frees
-     * the result set.
-     *
-     * @param string $query  the SELECT query statement to be executed.
-     * @param string $type   optional argument that specifies the expected
-     *                       datatype of the result set field, so that an eventual
-     *                       conversion may be performed. The default datatype is
-     *                       text, meaning that no conversion is performed
-     * @param mixed  $colnum the column number (or name) to fetch
-     *
-     * @return  mixed   MDB2_OK or field value on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function queryOne($query, $type = null, $colnum = 0)
-    {
-        $result = $this->query($query, $type);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $one = $result->fetchOne($colnum);
-        $result->free();
-        return $one;
-    }
-
-    // }}}
-    // {{{ function queryRow($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
-
-    /**
-     * Execute the specified query, fetch the values from the first
-     * row of the result set into an array and then frees
-     * the result set.
-     *
-     * @param   string  the SELECT query statement to be executed.
-     * @param   array   optional array argument that specifies a list of
-     *       expected datatypes of the result set columns, so that the eventual
-     *       conversions may be performed. The default list of datatypes is
-     *       empty, meaning that no conversion is performed.
-     * @param   int     how the array data should be indexed
-     *
-     * @return  mixed   MDB2_OK or data array on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function queryRow($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
-    {
-        $result = $this->query($query, $types);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $row = $result->fetchRow($fetchmode);
-        $result->free();
-        return $row;
-    }
-
-    // }}}
-    // {{{ function queryCol($query, $type = null, $colnum = 0)
-
-    /**
-     * Execute the specified query, fetch the value from the first column of
-     * each row of the result set into an array and then frees the result set.
-     *
-     * @param string $query  the SELECT query statement to be executed.
-     * @param string $type   optional argument that specifies the expected
-     *                       datatype of the result set field, so that an eventual
-     *                       conversion may be performed. The default datatype is text,
-     *                       meaning that no conversion is performed
-     * @param mixed  $colnum the column number (or name) to fetch
-     *
-     * @return  mixed   MDB2_OK or data array on success, a MDB2 error on failure
-     * @access  public
-     */
-    function queryCol($query, $type = null, $colnum = 0)
-    {
-        $result = $this->query($query, $type);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $col = $result->fetchCol($colnum);
-        $result->free();
-        return $col;
-    }
-
-    // }}}
-    // {{{ function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, $force_array = false, $group = false)
-
-    /**
-     * Execute the specified query, fetch all the rows of the result set into
-     * a two dimensional array and then frees the result set.
-     *
-     * @param   string  the SELECT query statement to be executed.
-     * @param   array   optional array argument that specifies a list of
-     *       expected datatypes of the result set columns, so that the eventual
-     *       conversions may be performed. The default list of datatypes is
-     *       empty, meaning that no conversion is performed.
-     * @param   int     how the array data should be indexed
-     * @param   bool    if set to true, the $all will have the first
-     *       column as its first dimension
-     * @param   bool    used only when the query returns exactly
-     *       two columns. If true, the values of the returned array will be
-     *       one-element arrays instead of scalars.
-     * @param   bool    if true, the values of the returned array is
-     *       wrapped in another array.  If the same key value (in the first
-     *       column) repeats itself, the values will be appended to this array
-     *       instead of overwriting the existing values.
-     *
-     * @return  mixed   MDB2_OK or data array on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT,
-        $rekey = false, $force_array = false, $group = false)
-    {
-        $result = $this->query($query, $types);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $all = $result->fetchAll($fetchmode, $rekey, $force_array, $group);
-        $result->free();
-        return $all;
-    }
-
-    // }}}
-}
-
-// }}}
-// {{{ class MDB2_Result
-
-/**
- * The dummy class that all user space result classes should extend from
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Result
-{
-}
-
-// }}}
-// {{{ class MDB2_Result_Common extends MDB2_Result
-
-/**
- * The common result class for MDB2 result objects
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Result_Common extends MDB2_Result
-{
-    // {{{ Variables (Properties)
-
-    var $db;
-    var $result;
-    var $rownum = -1;
-    var $types = array();
-    var $values = array();
-    var $offset;
-    var $offset_count = 0;
-    var $limit;
-    var $column_names;
-
-    // }}}
-    // {{{ constructor: function __construct($db, &$result, $limit = 0, $offset = 0)
-
-    /**
-     * Constructor
-     */
-    function __construct($db, &$result, $limit = 0, $offset = 0)
-    {
-        $this->db = $db;
-        $this->result = $result;
-        $this->offset = $offset;
-        $this->limit = max(0, $limit - 1);
-    }
-
-    // }}}
-    // {{{ function setResultTypes($types)
-
-    /**
-     * Define the list of types to be associated with the columns of a given
-     * result set.
-     *
-     * This function may be called before invoking fetchRow(), fetchOne(),
-     * fetchCol() and fetchAll() so that the necessary data type
-     * conversions are performed on the data to be retrieved by them. If this
-     * function is not called, the type of all result set columns is assumed
-     * to be text, thus leading to not perform any conversions.
-     *
-     * @param   array   variable that lists the
-     *       data types to be expected in the result set columns. If this array
-     *       contains less types than the number of columns that are returned
-     *       in the result set, the remaining columns are assumed to be of the
-     *       type text. Currently, the types clob and blob are not fully
-     *       supported.
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function setResultTypes($types)
-    {
-        $load = $this->db->loadModule('Datatype', null, true);
-        if (PEAR::isError($load)) {
-            return $load;
-        }
-        $types = $this->db->datatype->checkResultTypes($types);
-        if (PEAR::isError($types)) {
-            return $types;
-        }
-        $this->types = $types;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function seek($rownum = 0)
-
-    /**
-     * Seek to a specific row in a result set
-     *
-     * @param   int     number of the row where the data can be found
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function seek($rownum = 0)
-    {
-        $target_rownum = $rownum - 1;
-        if ($this->rownum > $target_rownum) {
-            return $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'seeking to previous rows not implemented', __FUNCTION__);
-        }
-        while ($this->rownum < $target_rownum) {
-            $this->fetchRow();
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
-
-    /**
-     * Fetch and return a row of data
-     *
-     * @param   int     how the array data should be indexed
-     * @param   int     number of the row where the data can be found
-     *
-     * @return  int     data array on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
-    {
-        $err = $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-        return $err;
-    }
-
-    // }}}
-    // {{{ function fetchOne($colnum = 0)
-
-    /**
-     * fetch single column from the next row from a result set
-     *
-     * @param int|string the column number (or name) to fetch
-     * @param int        number of the row where the data can be found
-     *
-     * @return string data on success, a MDB2 error on failure
-     * @access  public
-     */
-    function fetchOne($colnum = 0, $rownum = null)
-    {
-        $fetchmode = is_numeric($colnum) ? MDB2_FETCHMODE_ORDERED : MDB2_FETCHMODE_ASSOC;
-        $row = $this->fetchRow($fetchmode, $rownum);
-        if (!is_array($row) || PEAR::isError($row)) {
-            return $row;
-        }
-        if (!array_key_exists($colnum, $row)) {
-            return $this->db->raiseError(MDB2_ERROR_TRUNCATED, null, null,
-                'column is not defined in the result set: '.$colnum, __FUNCTION__);
-        }
-        return $row[$colnum];
-    }
-
-    // }}}
-    // {{{ function fetchCol($colnum = 0)
-
-    /**
-     * Fetch and return a column from the current row pointer position
-     *
-     * @param int|string the column number (or name) to fetch
-     *
-     * @return  mixed data array on success, a MDB2 error on failure
-     * @access  public
-     */
-    function fetchCol($colnum = 0)
-    {
-        $column = array();
-        $fetchmode = is_numeric($colnum) ? MDB2_FETCHMODE_ORDERED : MDB2_FETCHMODE_ASSOC;
-        $row = $this->fetchRow($fetchmode);
-        if (is_array($row)) {
-            if (!array_key_exists($colnum, $row)) {
-                return $this->db->raiseError(MDB2_ERROR_TRUNCATED, null, null,
-                    'column is not defined in the result set: '.$colnum, __FUNCTION__);
-            }
-            do {
-                $column[] = $row[$colnum];
-            } while (is_array($row = $this->fetchRow($fetchmode)));
-        }
-        if (PEAR::isError($row)) {
-            return $row;
-        }
-        return $column;
-    }
-
-    // }}}
-    // {{{ function fetchAll($fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, $force_array = false, $group = false)
-
-    /**
-     * Fetch and return all rows from the current row pointer position
-     *
-     * @param   int     $fetchmode  the fetch mode to use:
-     *                            + MDB2_FETCHMODE_ORDERED
-     *                            + MDB2_FETCHMODE_ASSOC
-     *                            + MDB2_FETCHMODE_ORDERED | MDB2_FETCHMODE_FLIPPED
-     *                            + MDB2_FETCHMODE_ASSOC | MDB2_FETCHMODE_FLIPPED
-     * @param   bool    if set to true, the $all will have the first
-     *       column as its first dimension
-     * @param   bool    used only when the query returns exactly
-     *       two columns. If true, the values of the returned array will be
-     *       one-element arrays instead of scalars.
-     * @param   bool    if true, the values of the returned array is
-     *       wrapped in another array.  If the same key value (in the first
-     *       column) repeats itself, the values will be appended to this array
-     *       instead of overwriting the existing values.
-     *
-     * @return  mixed   data array on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @see     getAssoc()
-     */
-    function fetchAll($fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false,
-        $force_array = false, $group = false)
-    {
-        $all = array();
-        $row = $this->fetchRow($fetchmode);
-        if (PEAR::isError($row)) {
-            return $row;
-        } elseif (!$row) {
-            return $all;
-        }
-
-        $shift_array = $rekey ? false : null;
-        if (null !== $shift_array) {
-            if (is_object($row)) {
-                $colnum = count(get_object_vars($row));
-            } else {
-                $colnum = count($row);
-            }
-            if ($colnum < 2) {
-                return $this->db->raiseError(MDB2_ERROR_TRUNCATED, null, null,
-                    'rekey feature requires atleast 2 column', __FUNCTION__);
-            }
-            $shift_array = (!$force_array && $colnum == 2);
-        }
-
-        if ($rekey) {
-            do {
-                if (is_object($row)) {
-                    $arr = get_object_vars($row);
-                    $key = reset($arr);
-                    unset($row->{$key});
-                } else {
-                    if ($fetchmode & MDB2_FETCHMODE_ASSOC) {
-                        $key = reset($row);
-                        unset($row[key($row)]);
-                    } else {
-                        $key = array_shift($row);
-                    }
-                    if ($shift_array) {
-                        $row = array_shift($row);
-                    }
-                }
-                if ($group) {
-                    $all[$key][] = $row;
-                } else {
-                    $all[$key] = $row;
-                }
-            } while (($row = $this->fetchRow($fetchmode)));
-        } elseif ($fetchmode & MDB2_FETCHMODE_FLIPPED) {
-            do {
-                foreach ($row as $key => $val) {
-                    $all[$key][] = $val;
-                }
-            } while (($row = $this->fetchRow($fetchmode)));
-        } else {
-            do {
-                $all[] = $row;
-            } while (($row = $this->fetchRow($fetchmode)));
-        }
-
-        return $all;
-    }
-
-    // }}}
-    // {{{ function rowCount()
-    /**
-     * Returns the actual row number that was last fetched (count from 0)
-     * @return  int
-     *
-     * @access  public
-     */
-    function rowCount()
-    {
-        return $this->rownum + 1;
-    }
-
-    // }}}
-    // {{{ function numRows()
-
-    /**
-     * Returns the number of rows in a result object
-     *
-     * @return  mixed   MDB2 Error Object or the number of rows
-     *
-     * @access  public
-     */
-    function numRows()
-    {
-        return $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function nextResult()
-
-    /**
-     * Move the internal result pointer to the next available result
-     *
-     * @return  true on success, false if there is no more result set or an error object on failure
-     *
-     * @access  public
-     */
-    function nextResult()
-    {
-        return $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function getColumnNames()
-
-    /**
-     * Retrieve the names of columns returned by the DBMS in a query result or
-     * from the cache.
-     *
-     * @param   bool    If set to true the values are the column names,
-     *                  otherwise the names of the columns are the keys.
-     * @return  mixed   Array variable that holds the names of columns or an
-     *                  MDB2 error on failure.
-     *                  Some DBMS may not return any columns when the result set
-     *                  does not contain any rows.
-     *
-     * @access  public
-     */
-    function getColumnNames($flip = false)
-    {
-        if (!isset($this->column_names)) {
-            $result = $this->_getColumnNames();
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $this->column_names = $result;
-        }
-        if ($flip) {
-            return array_flip($this->column_names);
-        }
-        return $this->column_names;
-    }
-
-    // }}}
-    // {{{ function _getColumnNames()
-
-    /**
-     * Retrieve the names of columns returned by the DBMS in a query result.
-     *
-     * @return  mixed   Array variable that holds the names of columns as keys
-     *                  or an MDB2 error on failure.
-     *                  Some DBMS may not return any columns when the result set
-     *                  does not contain any rows.
-     *
-     * @access  private
-     */
-    function _getColumnNames()
-    {
-        return $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function numCols()
-
-    /**
-     * Count the number of columns returned by the DBMS in a query result.
-     *
-     * @return  mixed   integer value with the number of columns, a MDB2 error
-     *       on failure
-     *
-     * @access  public
-     */
-    function numCols()
-    {
-        return $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ function getResource()
-
-    /**
-     * return the resource associated with the result object
-     *
-     * @return  resource
-     *
-     * @access  public
-     */
-    function getResource()
-    {
-        return $this->result;
-    }
-
-    // }}}
-    // {{{ function bindColumn($column, &$value, $type = null)
-
-    /**
-     * Set bind variable to a column.
-     *
-     * @param   int     column number or name
-     * @param   mixed   variable reference
-     * @param   string  specifies the type of the field
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function bindColumn($column, &$value, $type = null)
-    {
-        if (!is_numeric($column)) {
-            $column_names = $this->getColumnNames();
-            if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($this->db->options['field_case'] == CASE_LOWER) {
-                    $column = strtolower($column);
-                } else {
-                    $column = strtoupper($column);
-                }
-            }
-            $column = $column_names[$column];
-        }
-        $this->values[$column] =& $value;
-        if (null !== $type) {
-            $this->types[$column] = $type;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function _assignBindColumns($row)
-
-    /**
-     * Bind a variable to a value in the result row.
-     *
-     * @param   array   row data
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  private
-     */
-    function _assignBindColumns($row)
-    {
-        $row = array_values($row);
-        foreach ($row as $column => $value) {
-            if (array_key_exists($column, $this->values)) {
-                $this->values[$column] = $value;
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function free()
-
-    /**
-     * Free the internal resources associated with result.
-     *
-     * @return  bool    true on success, false if result is invalid
-     *
-     * @access  public
-     */
-    function free()
-    {
-        $this->result = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-}
-
-// }}}
-// {{{ class MDB2_Row
-
-/**
- * The simple class that accepts row data as an array
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Row
-{
-    // {{{ constructor: function __construct(&$row)
-
-    /**
-     * constructor
-     *
-     * @param   resource    row data as array
-     */
-    function __construct(&$row)
-    {
-        foreach ($row as $key => $value) {
-            $this->$key = &$row[$key];
-        }
-    }
-
-    // }}}
-}
-
-// }}}
-// {{{ class MDB2_Statement_Common
-
-/**
- * The common statement class for MDB2 statement objects
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Statement_Common
-{
-    // {{{ Variables (Properties)
-
-    var $db;
-    var $statement;
-    var $query;
-    var $result_types;
-    var $types;
-    var $values = array();
-    var $limit;
-    var $offset;
-    var $is_manip;
-
-    // }}}
-    // {{{ constructor: function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null)
-
-    /**
-     * Constructor
-     */
-    function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null)
-    {
-        $this->db = $db;
-        $this->statement = $statement;
-        $this->positions = $positions;
-        $this->query = $query;
-        $this->types = (array)$types;
-        $this->result_types = (array)$result_types;
-        $this->limit = $limit;
-        $this->is_manip = $is_manip;
-        $this->offset = $offset;
-    }
-
-    // }}}
-    // {{{ function bindValue($parameter, &$value, $type = null)
-
-    /**
-     * Set the value of a parameter of a prepared query.
-     *
-     * @param   int     the order number of the parameter in the query
-     *       statement. The order number of the first parameter is 1.
-     * @param   mixed   value that is meant to be assigned to specified
-     *       parameter. The type of the value depends on the $type argument.
-     * @param   string  specifies the type of the field
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function bindValue($parameter, $value, $type = null)
-    {
-        if (!is_numeric($parameter)) {
-            $parameter = preg_replace('/^:(.*)$/', '\\1', $parameter);
-        }
-        if (!in_array($parameter, $this->positions)) {
-            return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
-        }
-        $this->values[$parameter] = $value;
-        if (null !== $type) {
-            $this->types[$parameter] = $type;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function bindValueArray($values, $types = null)
-
-    /**
-     * Set the values of multiple a parameter of a prepared query in bulk.
-     *
-     * @param   array   specifies all necessary information
-     *       for bindValue() the array elements must use keys corresponding to
-     *       the number of the position of the parameter.
-     * @param   array   specifies the types of the fields
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @see     bindParam()
-     */
-    function bindValueArray($values, $types = null)
-    {
-        $types = is_array($types) ? array_values($types) : array_fill(0, count($values), null);
-        $parameters = array_keys($values);
-        foreach ($parameters as $key => $parameter) {
-            $this->db->pushErrorHandling(PEAR_ERROR_RETURN);
-            $this->db->expectError(MDB2_ERROR_NOT_FOUND);
-            $err = $this->bindValue($parameter, $values[$parameter], $types[$key]);
-            $this->db->popExpect();
-            $this->db->popErrorHandling();
-            if (PEAR::isError($err)) {
-                if ($err->getCode() == MDB2_ERROR_NOT_FOUND) {
-                    //ignore (extra value for missing placeholder)
-                    continue;
-                }
-                return $err;
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function bindParam($parameter, &$value, $type = null)
-
-    /**
-     * Bind a variable to a parameter of a prepared query.
-     *
-     * @param   int     the order number of the parameter in the query
-     *       statement. The order number of the first parameter is 1.
-     * @param   mixed   variable that is meant to be bound to specified
-     *       parameter. The type of the value depends on the $type argument.
-     * @param   string  specifies the type of the field
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function bindParam($parameter, &$value, $type = null)
-    {
-        if (!is_numeric($parameter)) {
-            $parameter = preg_replace('/^:(.*)$/', '\\1', $parameter);
-        }
-        if (!in_array($parameter, $this->positions)) {
-            return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
-        }
-        $this->values[$parameter] =& $value;
-        if (null !== $type) {
-            $this->types[$parameter] = $type;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function bindParamArray(&$values, $types = null)
-
-    /**
-     * Bind the variables of multiple a parameter of a prepared query in bulk.
-     *
-     * @param   array   specifies all necessary information
-     *       for bindParam() the array elements must use keys corresponding to
-     *       the number of the position of the parameter.
-     * @param   array   specifies the types of the fields
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @see     bindParam()
-     */
-    function bindParamArray(&$values, $types = null)
-    {
-        $types = is_array($types) ? array_values($types) : array_fill(0, count($values), null);
-        $parameters = array_keys($values);
-        foreach ($parameters as $key => $parameter) {
-            $err = $this->bindParam($parameter, $values[$parameter], $types[$key]);
-            if (PEAR::isError($err)) {
-                return $err;
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function &execute($values = null, $result_class = true, $result_wrap_class = false)
-
-    /**
-     * Execute a prepared query statement.
-     *
-     * @param array specifies all necessary information
-     *              for bindParam() the array elements must use keys corresponding
-     *              to the number of the position of the parameter.
-     * @param mixed specifies which result class to use
-     * @param mixed specifies which class to wrap results in
-     *
-     * @return mixed MDB2_Result or integer (affected rows) on success,
-     *               a MDB2 error on failure
-     * @access public
-     */
-    function execute($values = null, $result_class = true, $result_wrap_class = false)
-    {
-        if (null === $this->positions) {
-            return $this->db->raiseError(MDB2_ERROR, null, null,
-                'Prepared statement has already been freed', __FUNCTION__);
-        }
-
-        $values = (array)$values;
-        if (!empty($values)) {
-            $err = $this->bindValueArray($values);
-            if (PEAR::isError($err)) {
-                return $this->db->raiseError(MDB2_ERROR, null, null,
-                                            'Binding Values failed with message: ' . $err->getMessage(), __FUNCTION__);
-            }
-        }
-        $result = $this->_execute($result_class, $result_wrap_class);
-        return $result;
-    }
-
-    // }}}
-    // {{{ function _execute($result_class = true, $result_wrap_class = false)
-
-    /**
-     * Execute a prepared query statement helper method.
-     *
-     * @param   mixed   specifies which result class to use
-     * @param   mixed   specifies which class to wrap results in
-     *
-     * @return mixed MDB2_Result or integer (affected rows) on success,
-     *               a MDB2 error on failure
-     * @access  private
-     */
-    function _execute($result_class = true, $result_wrap_class = false)
-    {
-        $this->last_query = $this->query;
-        $query = '';
-        $last_position = 0;
-        foreach ($this->positions as $current_position => $parameter) {
-            if (!array_key_exists($parameter, $this->values)) {
-                return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                    'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
-            }
-            $value = $this->values[$parameter];
-            $query.= substr($this->query, $last_position, $current_position - $last_position);
-            if (!isset($value)) {
-                $value_quoted = 'NULL';
-            } else {
-                $type = !empty($this->types[$parameter]) ? $this->types[$parameter] : null;
-                $value_quoted = $this->db->quote($value, $type);
-                if (PEAR::isError($value_quoted)) {
-                    return $value_quoted;
-                }
-            }
-            $query.= $value_quoted;
-            $last_position = $current_position + 1;
-        }
-        $query.= substr($this->query, $last_position);
-
-        $this->db->offset = $this->offset;
-        $this->db->limit = $this->limit;
-        if ($this->is_manip) {
-            $result = $this->db->exec($query);
-        } else {
-            $result = $this->db->query($query, $this->result_types, $result_class, $result_wrap_class);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ function free()
-
-    /**
-     * Release resources allocated for the specified prepared query.
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function free()
-    {
-        if (null === $this->positions) {
-            return $this->db->raiseError(MDB2_ERROR, null, null,
-                'Prepared statement has already been freed', __FUNCTION__);
-        }
-
-        $this->statement = null;
-        $this->positions = null;
-        $this->query = null;
-        $this->types = null;
-        $this->result_types = null;
-        $this->limit = null;
-        $this->is_manip = null;
-        $this->offset = null;
-        $this->values = null;
-
-        return MDB2_OK;
-    }
-
-    // }}}
-}
-
-// }}}
-// {{{ class MDB2_Module_Common
-
-/**
- * The common modules class for MDB2 module objects
- *
- * @package     MDB2
- * @category    Database
- * @author      Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Module_Common
-{
-    // {{{ Variables (Properties)
-
-    /**
-     * contains the key to the global MDB2 instance array of the associated
-     * MDB2 instance
-     *
-     * @var     int
-     * @access  protected
-     */
-    var $db_index;
-
-    // }}}
-    // {{{ constructor: function __construct($db_index)
-
-    /**
-     * Constructor
-     */
-    function __construct($db_index)
-    {
-        $this->db_index = $db_index;
-    }
-
-    // }}}
-    // {{{ function getDBInstance()
-
-    /**
-     * Get the instance of MDB2 associated with the module instance
-     *
-     * @return  object  MDB2 instance or a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function getDBInstance()
-    {
-        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            $result = $GLOBALS['_MDB2_databases'][$this->db_index];
-        } else {
-            $result = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'could not find MDB2 instance');
-        }
-        return $result;
-    }
-
-    // }}}
-}
-
-// }}}
-// {{{ function MDB2_closeOpenTransactions()
-
-/**
- * Close any open transactions form persistent connections
- *
- * @return  void
- *
- * @access  public
- */
-
-function MDB2_closeOpenTransactions()
-{
-    reset($GLOBALS['_MDB2_databases']);
-    while (next($GLOBALS['_MDB2_databases'])) {
-        $key = key($GLOBALS['_MDB2_databases']);
-        if ($GLOBALS['_MDB2_databases'][$key]->opened_persistent
-            && $GLOBALS['_MDB2_databases'][$key]->in_transaction
-        ) {
-            $GLOBALS['_MDB2_databases'][$key]->rollback();
-        }
-    }
-}
-
-// }}}
-// {{{ function MDB2_defaultDebugOutput(&$db, $scope, $message, $is_manip = null)
-
-/**
- * default debug output handler
- *
- * @param   object  reference to an MDB2 database object
- * @param   string  usually the method name that triggered the debug call:
- *                  for example 'query', 'prepare', 'execute', 'parameters',
- *                  'beginTransaction', 'commit', 'rollback'
- * @param   string  message that should be appended to the debug variable
- * @param   array   contains context information about the debug() call
- *                  common keys are: is_manip, time, result etc.
- *
- * @return  void|string optionally return a modified message, this allows
- *                      rewriting a query before being issued or prepared
- *
- * @access  public
- */
-function MDB2_defaultDebugOutput(&$db, $scope, $message, $context = array())
-{
-    $db->debug_output.= $scope.'('.$db->db_index.'): ';
-    $db->debug_output.= $message.$db->getOption('log_line_break');
-    return $message;
-}
-
-// }}}
-?>
\ No newline at end of file
+<?php
+// vim: set et ts=4 sw=4 fdm=marker:
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+
+require_once 'PEAR.php';
+
+// {{{ Error constants
+
+/**
+ * The method mapErrorCode in each MDB2_dbtype implementation maps
+ * native error codes to one of these.
+ *
+ * If you add an error code here, make sure you also add a textual
+ * version of it in MDB2::errorMessage().
+ */
+
+define('MDB2_OK',                      true);
+define('MDB2_ERROR',                     -1);
+define('MDB2_ERROR_SYNTAX',              -2);
+define('MDB2_ERROR_CONSTRAINT',          -3);
+define('MDB2_ERROR_NOT_FOUND',           -4);
+define('MDB2_ERROR_ALREADY_EXISTS',      -5);
+define('MDB2_ERROR_UNSUPPORTED',         -6);
+define('MDB2_ERROR_MISMATCH',            -7);
+define('MDB2_ERROR_INVALID',             -8);
+define('MDB2_ERROR_NOT_CAPABLE',         -9);
+define('MDB2_ERROR_TRUNCATED',          -10);
+define('MDB2_ERROR_INVALID_NUMBER',     -11);
+define('MDB2_ERROR_INVALID_DATE',       -12);
+define('MDB2_ERROR_DIVZERO',            -13);
+define('MDB2_ERROR_NODBSELECTED',       -14);
+define('MDB2_ERROR_CANNOT_CREATE',      -15);
+define('MDB2_ERROR_CANNOT_DELETE',      -16);
+define('MDB2_ERROR_CANNOT_DROP',        -17);
+define('MDB2_ERROR_NOSUCHTABLE',        -18);
+define('MDB2_ERROR_NOSUCHFIELD',        -19);
+define('MDB2_ERROR_NEED_MORE_DATA',     -20);
+define('MDB2_ERROR_NOT_LOCKED',         -21);
+define('MDB2_ERROR_VALUE_COUNT_ON_ROW', -22);
+define('MDB2_ERROR_INVALID_DSN',        -23);
+define('MDB2_ERROR_CONNECT_FAILED',     -24);
+define('MDB2_ERROR_EXTENSION_NOT_FOUND',-25);
+define('MDB2_ERROR_NOSUCHDB',           -26);
+define('MDB2_ERROR_ACCESS_VIOLATION',   -27);
+define('MDB2_ERROR_CANNOT_REPLACE',     -28);
+define('MDB2_ERROR_CONSTRAINT_NOT_NULL',-29);
+define('MDB2_ERROR_DEADLOCK',           -30);
+define('MDB2_ERROR_CANNOT_ALTER',       -31);
+define('MDB2_ERROR_MANAGER',            -32);
+define('MDB2_ERROR_MANAGER_PARSE',      -33);
+define('MDB2_ERROR_LOADMODULE',         -34);
+define('MDB2_ERROR_INSUFFICIENT_DATA',  -35);
+define('MDB2_ERROR_NO_PERMISSION',      -36);
+define('MDB2_ERROR_DISCONNECT_FAILED',  -37);
+
+// }}}
+// {{{ Verbose constants
+/**
+ * These are just helper constants to more verbosely express parameters to prepare()
+ */
+
+define('MDB2_PREPARE_MANIP', false);
+define('MDB2_PREPARE_RESULT', null);
+
+// }}}
+// {{{ Fetchmode constants
+
+/**
+ * This is a special constant that tells MDB2 the user hasn't specified
+ * any particular get mode, so the default should be used.
+ */
+define('MDB2_FETCHMODE_DEFAULT', 0);
+
+/**
+ * Column data indexed by numbers, ordered from 0 and up
+ */
+define('MDB2_FETCHMODE_ORDERED', 1);
+
+/**
+ * Column data indexed by column names
+ */
+define('MDB2_FETCHMODE_ASSOC', 2);
+
+/**
+ * Column data as object properties
+ */
+define('MDB2_FETCHMODE_OBJECT', 3);
+
+/**
+ * For multi-dimensional results: normally the first level of arrays
+ * is the row number, and the second level indexed by column number or name.
+ * MDB2_FETCHMODE_FLIPPED switches this order, so the first level of arrays
+ * is the column name, and the second level the row number.
+ */
+define('MDB2_FETCHMODE_FLIPPED', 4);
+
+// }}}
+// {{{ Portability mode constants
+
+/**
+ * Portability: turn off all portability features.
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_NONE', 0);
+
+/**
+ * Portability: convert names of tables and fields to case defined in the
+ * "field_case" option when using the query*(), fetch*() and tableInfo() methods.
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_FIX_CASE', 1);
+
+/**
+ * Portability: right trim the data output by query*() and fetch*().
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_RTRIM', 2);
+
+/**
+ * Portability: force reporting the number of rows deleted.
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_DELETE_COUNT', 4);
+
+/**
+ * Portability: not needed in MDB2 (just left here for compatibility to DB)
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_NUMROWS', 8);
+
+/**
+ * Portability: makes certain error messages in certain drivers compatible
+ * with those from other DBMS's.
+ *
+ * + mysql, mysqli:  change unique/primary key constraints
+ *   MDB2_ERROR_ALREADY_EXISTS -> MDB2_ERROR_CONSTRAINT
+ *
+ * + odbc(access):  MS's ODBC driver reports 'no such field' as code
+ *   07001, which means 'too few parameters.'  When this option is on
+ *   that code gets mapped to MDB2_ERROR_NOSUCHFIELD.
+ *
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_ERRORS', 16);
+
+/**
+ * Portability: convert empty values to null strings in data output by
+ * query*() and fetch*().
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_EMPTY_TO_NULL', 32);
+
+/**
+ * Portability: removes database/table qualifiers from associative indexes
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES', 64);
+
+/**
+ * Portability: turn on all portability features.
+ * @see MDB2_Driver_Common::setOption()
+ */
+define('MDB2_PORTABILITY_ALL', 127);
+
+// }}}
+// {{{ Globals for class instance tracking
+
+/**
+ * These are global variables that are used to track the various class instances
+ */
+
+$GLOBALS['_MDB2_databases'] = array();
+$GLOBALS['_MDB2_dsninfo_default'] = array(
+    'phptype'  => false,
+    'dbsyntax' => false,
+    'username' => false,
+    'password' => false,
+    'protocol' => false,
+    'hostspec' => false,
+    'port'     => false,
+    'socket'   => false,
+    'database' => false,
+    'mode'     => false,
+);
+
+// }}}
+// {{{ class MDB2
+
+/**
+ * The main 'MDB2' class is simply a container class with some static
+ * methods for creating DB objects as well as some utility functions
+ * common to all parts of DB.
+ *
+ * The object model of MDB2 is as follows (indentation means inheritance):
+ *
+ * MDB2          The main MDB2 class.  This is simply a utility class
+ *              with some 'static' methods for creating MDB2 objects as
+ *              well as common utility functions for other MDB2 classes.
+ *
+ * MDB2_Driver_Common   The base for each MDB2 implementation.  Provides default
+ * |            implementations (in OO lingo virtual methods) for
+ * |            the actual DB implementations as well as a bunch of
+ * |            query utility functions.
+ * |
+ * +-MDB2_Driver_mysql  The MDB2 implementation for MySQL. Inherits MDB2_Driver_Common.
+ *              When calling MDB2::factory or MDB2::connect for MySQL
+ *              connections, the object returned is an instance of this
+ *              class.
+ * +-MDB2_Driver_pgsql  The MDB2 implementation for PostGreSQL. Inherits MDB2_Driver_Common.
+ *              When calling MDB2::factory or MDB2::connect for PostGreSQL
+ *              connections, the object returned is an instance of this
+ *              class.
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2
+{
+    // {{{ function setOptions($db, $options)
+
+    /**
+     * set option array   in an exiting database object
+     *
+     * @param   MDB2_Driver_Common  MDB2 object
+     * @param   array   An associative array of option names and their values.
+     *
+     * @return mixed   MDB2_OK or a PEAR Error object
+     *
+     * @access  public
+     */
+    static function setOptions($db, $options)
+    {
+        if (is_array($options)) {
+            foreach ($options as $option => $value) {
+                $test = $db->setOption($option, $value);
+                if (MDB2::isError($test)) {
+                    return $test;
+                }
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function classExists($classname)
+
+    /**
+     * Checks if a class exists without triggering __autoload
+     *
+     * @param   string  classname
+     *
+     * @return  bool    true success and false on error
+     * @static
+     * @access  public
+     */
+    static function classExists($classname)
+    {
+        return class_exists($classname, false);
+    }
+
+    // }}}
+    // {{{ function loadClass($class_name, $debug)
+
+    /**
+     * Loads a PEAR class.
+     *
+     * @param   string  classname to load
+     * @param   bool    if errors should be suppressed
+     *
+     * @return  mixed   true success or PEAR_Error on failure
+     *
+     * @access  public
+     */
+    static function loadClass($class_name, $debug)
+    {
+        if (!MDB2::classExists($class_name)) {
+            $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';
+            if ($debug) {
+                $include = include_once($file_name);
+            } else {
+                $include = @include_once($file_name);
+            }
+            if (!$include) {
+                if (!MDB2::fileExists($file_name)) {
+                    $msg = "unable to find package '$class_name' file '$file_name'";
+                } else {
+                    $msg = "unable to load class '$class_name' from file '$file_name'";
+                }
+                $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg);
+                return $err;
+            }
+            if (!MDB2::classExists($class_name)) {
+                $msg = "unable to load class '$class_name' from file '$file_name'";
+                $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg);
+                return $err;
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function factory($dsn, $options = false)
+
+    /**
+     * Create a new MDB2 object for the specified database type
+     *
+     * @param   mixed   'data source name', see the MDB2::parseDSN
+     *                      method for a description of the dsn format.
+     *                      Can also be specified as an array of the
+     *                      format returned by MDB2::parseDSN.
+     * @param   array   An associative array of option names and
+     *                            their values.
+     *
+     * @return  mixed   a newly created MDB2 object, or false on error
+     *
+     * @access  public
+     */
+    static function factory($dsn, $options = false)
+    {
+        $dsninfo = MDB2::parseDSN($dsn);
+        if (empty($dsninfo['phptype'])) {
+            $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND,
+                null, null, 'no RDBMS driver specified');
+            return $err;
+        }
+        $class_name = 'MDB2_Driver_'.$dsninfo['phptype'];
+
+        $debug = (!empty($options['debug']));
+        $err = MDB2::loadClass($class_name, $debug);
+        if (MDB2::isError($err)) {
+            return $err;
+        }
+
+        $db = new $class_name();
+        $db->setDSN($dsninfo);
+        $err = MDB2::setOptions($db, $options);
+        if (MDB2::isError($err)) {
+            return $err;
+        }
+
+        return $db;
+    }
+
+    // }}}
+    // {{{ function connect($dsn, $options = false)
+
+    /**
+     * Create a new MDB2_Driver_* connection object and connect to the specified
+     * database
+     *
+     * @param mixed $dsn     'data source name', see the MDB2::parseDSN
+     *                       method for a description of the dsn format.
+     *                       Can also be specified as an array of the
+     *                       format returned by MDB2::parseDSN.
+     * @param array $options An associative array of option names and
+     *                       their values.
+     *
+     * @return mixed a newly created MDB2 connection object, or a MDB2
+     *               error object on error
+     *
+     * @access  public
+     * @see     MDB2::parseDSN
+     */
+    static function connect($dsn, $options = false)
+    {
+        $db = MDB2::factory($dsn, $options);
+        if (MDB2::isError($db)) {
+            return $db;
+        }
+
+        $err = $db->connect();
+        if (MDB2::isError($err)) {
+            $dsn = $db->getDSN('string', 'xxx');
+            $db->disconnect();
+            $err->addUserInfo($dsn);
+            return $err;
+        }
+
+        return $db;
+    }
+
+    // }}}
+    // {{{ function singleton($dsn = null, $options = false)
+
+    /**
+     * Returns a MDB2 connection with the requested DSN.
+     * A new MDB2 connection object is only created if no object with the
+     * requested DSN exists yet.
+     *
+     * @param   mixed   'data source name', see the MDB2::parseDSN
+     *                            method for a description of the dsn format.
+     *                            Can also be specified as an array of the
+     *                            format returned by MDB2::parseDSN.
+     * @param   array   An associative array of option names and
+     *                            their values.
+     *
+     * @return  mixed   a newly created MDB2 connection object, or a MDB2
+     *                  error object on error
+     *
+     * @access  public
+     * @see     MDB2::parseDSN
+     */
+    static function singleton($dsn = null, $options = false)
+    {
+        if ($dsn) {
+            $dsninfo = MDB2::parseDSN($dsn);
+            $dsninfo = array_merge($GLOBALS['_MDB2_dsninfo_default'], $dsninfo);
+            $keys = array_keys($GLOBALS['_MDB2_databases']);
+            for ($i=0, $j=count($keys); $i<$j; ++$i) {
+                if (isset($GLOBALS['_MDB2_databases'][$keys[$i]])) {
+                    $tmp_dsn = $GLOBALS['_MDB2_databases'][$keys[$i]]->getDSN('array');
+                    if (count(array_diff_assoc($tmp_dsn, $dsninfo)) == 0) {
+                        MDB2::setOptions($GLOBALS['_MDB2_databases'][$keys[$i]], $options);
+                        return $GLOBALS['_MDB2_databases'][$keys[$i]];
+                    }
+                }
+            }
+        } elseif (is_array($GLOBALS['_MDB2_databases']) && reset($GLOBALS['_MDB2_databases'])) {
+            return $GLOBALS['_MDB2_databases'][key($GLOBALS['_MDB2_databases'])];
+        }
+        $db = MDB2::factory($dsn, $options);
+        return $db;
+    }
+
+    // }}}
+    // {{{ function areEquals()
+
+    /**
+     * It looks like there's a memory leak in array_diff() in PHP 5.1.x,
+     * so use this method instead.
+     * @see http://pear.php.net/bugs/bug.php?id=11790
+     *
+     * @param array $arr1
+     * @param array $arr2
+     * @return boolean
+     */
+    static function areEquals($arr1, $arr2)
+    {
+        if (count($arr1) != count($arr2)) {
+            return false;
+        }
+        foreach (array_keys($arr1) as $k) {
+            if (!array_key_exists($k, $arr2) || $arr1[$k] != $arr2[$k]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    // }}}
+    // {{{ function loadFile($file)
+
+    /**
+     * load a file (like 'Date')
+     *
+     * @param string $file name of the file in the MDB2 directory (without '.php')
+     *
+     * @return string name of the file that was included
+     *
+     * @access  public
+     */
+    static function loadFile($file)
+    {
+        $file_name = 'MDB2'.DIRECTORY_SEPARATOR.$file.'.php';
+        if (!MDB2::fileExists($file_name)) {
+            return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'unable to find: '.$file_name);
+        }
+        if (!include_once($file_name)) {
+            return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'unable to load driver class: '.$file_name);
+        }
+        return $file_name;
+    }
+
+    // }}}
+    // {{{ function apiVersion()
+
+    /**
+     * Return the MDB2 API version
+     *
+     * @return  string  the MDB2 API version number
+     *
+     * @access  public
+     */
+    function apiVersion()
+    {
+        return '@package_version@';
+    }
+
+    // }}}
+    // {{{ function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
+
+    /**
+     * This method is used to communicate an error and invoke error
+     * callbacks etc.  Basically a wrapper for PEAR::raiseError
+     * without the message string.
+     *
+     * @param   mixed  int error code
+     *
+     * @param   int    error mode, see PEAR_Error docs
+     *
+     * @param   mixed  If error mode is PEAR_ERROR_TRIGGER, this is the
+     *                 error level (E_USER_NOTICE etc).  If error mode is
+     *                 PEAR_ERROR_CALLBACK, this is the callback function,
+     *                 either as a function name, or as an array of an
+     *                 object and method name.  For other error modes this
+     *                 parameter is ignored.
+     *
+     * @param   string Extra debug information.  Defaults to the last
+     *                 query and native error code.
+     *
+     * @return PEAR_Error instance of a PEAR Error object
+     *
+     * @access  private
+     * @see     PEAR_Error
+     */
+    public static function &raiseError($code = null,
+                         $mode = null,
+                         $options = null,
+                         $userinfo = null,
+                         $dummy1 = null,
+                         $dummy2 = null,
+                         $dummy3 = false)
+    {
+        $pear = new PEAR;
+        $err = $pear->raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
+        return $err;
+    }
+
+    // }}}
+    // {{{ function isError($data, $code = null)
+
+    /**
+     * Tell whether a value is a MDB2 error.
+     *
+     * @param   mixed   the value to test
+     * @param   int     if is an error object, return true
+     *                        only if $code is a string and
+     *                        $db->getMessage() == $code or
+     *                        $code is an integer and $db->getCode() == $code
+     *
+     * @return  bool    true if parameter is an error
+     *
+     * @access  public
+     */
+    static function isError($data, $code = null)
+    {
+        if ($data instanceof MDB2_Error) {
+            if (null === $code) {
+                return true;
+            }
+            if (is_string($code)) {
+                return $data->getMessage() === $code;
+            }
+            return in_array($data->getCode(), (array)$code);
+        }
+        return false;
+    }
+
+    // }}}
+    // {{{ function isConnection($value)
+
+    /**
+     * Tell whether a value is a MDB2 connection
+     *
+     * @param   mixed   value to test
+     *
+     * @return  bool    whether $value is a MDB2 connection
+     * @access  public
+     */
+    static function isConnection($value)
+    {
+        return ($value instanceof MDB2_Driver_Common);
+    }
+
+    // }}}
+    // {{{ function isResult($value)
+
+    /**
+     * Tell whether a value is a MDB2 result
+     *
+     * @param mixed $value value to test
+     *
+     * @return bool whether $value is a MDB2 result
+     *
+     * @access public
+     */
+    function isResult($value)
+    {
+        return ($value instanceof MDB2_Result);
+    }
+
+    // }}}
+    // {{{ function isResultCommon($value)
+
+    /**
+     * Tell whether a value is a MDB2 result implementing the common interface
+     *
+     * @param mixed $value value to test
+     *
+     * @return bool whether $value is a MDB2 result implementing the common interface
+     *
+     * @access  public
+     */
+    static function isResultCommon($value)
+    {
+        return ($value instanceof MDB2_Result_Common);
+    }
+
+    // }}}
+    // {{{ function isStatement($value)
+
+    /**
+     * Tell whether a value is a MDB2 statement interface
+     *
+     * @param   mixed   value to test
+     *
+     * @return  bool    whether $value is a MDB2 statement interface
+     *
+     * @access  public
+     */
+    function isStatement($value)
+    {
+        return ($value instanceof MDB2_Statement_Common);
+    }
+
+    // }}}
+    // {{{ function errorMessage($value = null)
+
+    /**
+     * Return a textual error message for a MDB2 error code
+     *
+     * @param   int|array   integer error code,
+                                null to get the current error code-message map,
+                                or an array with a new error code-message map
+     *
+     * @return  string  error message, or false if the error code was
+     *                  not recognized
+     *
+     * @access  public
+     */
+    static function errorMessage($value = null)
+    {
+        static $errorMessages;
+
+        if (is_array($value)) {
+            $errorMessages = $value;
+            return MDB2_OK;
+        }
+
+        if (!isset($errorMessages)) {
+            $errorMessages = array(
+                MDB2_OK                       => 'no error',
+                MDB2_ERROR                    => 'unknown error',
+                MDB2_ERROR_ALREADY_EXISTS     => 'already exists',
+                MDB2_ERROR_CANNOT_CREATE      => 'can not create',
+                MDB2_ERROR_CANNOT_ALTER       => 'can not alter',
+                MDB2_ERROR_CANNOT_REPLACE     => 'can not replace',
+                MDB2_ERROR_CANNOT_DELETE      => 'can not delete',
+                MDB2_ERROR_CANNOT_DROP        => 'can not drop',
+                MDB2_ERROR_CONSTRAINT         => 'constraint violation',
+                MDB2_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint',
+                MDB2_ERROR_DIVZERO            => 'division by zero',
+                MDB2_ERROR_INVALID            => 'invalid',
+                MDB2_ERROR_INVALID_DATE       => 'invalid date or time',
+                MDB2_ERROR_INVALID_NUMBER     => 'invalid number',
+                MDB2_ERROR_MISMATCH           => 'mismatch',
+                MDB2_ERROR_NODBSELECTED       => 'no database selected',
+                MDB2_ERROR_NOSUCHFIELD        => 'no such field',
+                MDB2_ERROR_NOSUCHTABLE        => 'no such table',
+                MDB2_ERROR_NOT_CAPABLE        => 'MDB2 backend not capable',
+                MDB2_ERROR_NOT_FOUND          => 'not found',
+                MDB2_ERROR_NOT_LOCKED         => 'not locked',
+                MDB2_ERROR_SYNTAX             => 'syntax error',
+                MDB2_ERROR_UNSUPPORTED        => 'not supported',
+                MDB2_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
+                MDB2_ERROR_INVALID_DSN        => 'invalid DSN',
+                MDB2_ERROR_CONNECT_FAILED     => 'connect failed',
+                MDB2_ERROR_NEED_MORE_DATA     => 'insufficient data supplied',
+                MDB2_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
+                MDB2_ERROR_NOSUCHDB           => 'no such database',
+                MDB2_ERROR_ACCESS_VIOLATION   => 'insufficient permissions',
+                MDB2_ERROR_LOADMODULE         => 'error while including on demand module',
+                MDB2_ERROR_TRUNCATED          => 'truncated',
+                MDB2_ERROR_DEADLOCK           => 'deadlock detected',
+                MDB2_ERROR_NO_PERMISSION      => 'no permission',
+                MDB2_ERROR_DISCONNECT_FAILED  => 'disconnect failed',
+            );
+        }
+
+        if (null === $value) {
+            return $errorMessages;
+        }
+
+        if (MDB2::isError($value)) {
+            $value = $value->getCode();
+        }
+
+        return isset($errorMessages[$value]) ?
+           $errorMessages[$value] : $errorMessages[MDB2_ERROR];
+    }
+
+    // }}}
+    // {{{ function parseDSN($dsn)
+
+    /**
+     * Parse a data source name.
+     *
+     * Additional keys can be added by appending a URI query string to the
+     * end of the DSN.
+     *
+     * The format of the supplied DSN is in its fullest form:
+     * <code>
+     *  phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true
+     * </code>
+     *
+     * Most variations are allowed:
+     * <code>
+     *  phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644
+     *  phptype://username:password@hostspec/database_name
+     *  phptype://username:password@hostspec
+     *  phptype://username@hostspec
+     *  phptype://hostspec/database
+     *  phptype://hostspec
+     *  phptype(dbsyntax)
+     *  phptype
+     * </code>
+     *
+     * @param   string  Data Source Name to be parsed
+     *
+     * @return  array   an associative array with the following keys:
+     *  + phptype:  Database backend used in PHP (mysql, odbc etc.)
+     *  + dbsyntax: Database used with regards to SQL syntax etc.
+     *  + protocol: Communication protocol to use (tcp, unix etc.)
+     *  + hostspec: Host specification (hostname[:port])
+     *  + database: Database to use on the DBMS server
+     *  + username: User name for login
+     *  + password: Password for login
+     *
+     * @access  public
+     * @author  Tomas V.V.Cox <cox@idecnet.com>
+     */
+    static function parseDSN($dsn)
+    {
+        $parsed = $GLOBALS['_MDB2_dsninfo_default'];
+
+        if (is_array($dsn)) {
+            $dsn = array_merge($parsed, $dsn);
+            if (!$dsn['dbsyntax']) {
+                $dsn['dbsyntax'] = $dsn['phptype'];
+            }
+            return $dsn;
+        }
+
+        // Find phptype and dbsyntax
+        if (($pos = strpos($dsn, '://')) !== false) {
+            $str = substr($dsn, 0, $pos);
+            $dsn = substr($dsn, $pos + 3);
+        } else {
+            $str = $dsn;
+            $dsn = null;
+        }
+
+        // Get phptype and dbsyntax
+        // $str => phptype(dbsyntax)
+        if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
+            $parsed['phptype']  = $arr[1];
+            $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
+        } else {
+            $parsed['phptype']  = $str;
+            $parsed['dbsyntax'] = $str;
+        }
+
+        if (!count($dsn)) {
+            return $parsed;
+        }
+
+        // Get (if found): username and password
+        // $dsn => username:password@protocol+hostspec/database
+        if (($at = strrpos($dsn,'@')) !== false) {
+            $str = substr($dsn, 0, $at);
+            $dsn = substr($dsn, $at + 1);
+            if (($pos = strpos($str, ':')) !== false) {
+                $parsed['username'] = rawurldecode(substr($str, 0, $pos));
+                $parsed['password'] = rawurldecode(substr($str, $pos + 1));
+            } else {
+                $parsed['username'] = rawurldecode($str);
+            }
+        }
+
+        // Find protocol and hostspec
+
+        // $dsn => proto(proto_opts)/database
+        if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
+            $proto       = $match[1];
+            $proto_opts  = $match[2] ? $match[2] : false;
+            $dsn         = $match[3];
+
+        // $dsn => protocol+hostspec/database (old format)
+        } else {
+            if (strpos($dsn, '+') !== false) {
+                list($proto, $dsn) = explode('+', $dsn, 2);
+            }
+            if (   strpos($dsn, '//') === 0
+                && strpos($dsn, '/', 2) !== false
+                && $parsed['phptype'] == 'oci8'
+            ) {
+                //oracle's "Easy Connect" syntax:
+                //"username/password@[//]host[:port][/service_name]"
+                //e.g. "scott/tiger@//mymachine:1521/oracle"
+                $proto_opts = $dsn;
+                $pos = strrpos($proto_opts, '/');
+                $dsn = substr($proto_opts, $pos + 1);
+                $proto_opts = substr($proto_opts, 0, $pos);
+            } elseif (strpos($dsn, '/') !== false) {
+                list($proto_opts, $dsn) = explode('/', $dsn, 2);
+            } else {
+                $proto_opts = $dsn;
+                $dsn = null;
+            }
+        }
+
+        // process the different protocol options
+        $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';
+        $proto_opts = rawurldecode($proto_opts);
+        if (strpos($proto_opts, ':') !== false) {
+            list($proto_opts, $parsed['port']) = explode(':', $proto_opts);
+        }
+        if ($parsed['protocol'] == 'tcp') {
+            $parsed['hostspec'] = $proto_opts;
+        } elseif ($parsed['protocol'] == 'unix') {
+            $parsed['socket'] = $proto_opts;
+        }
+
+        // Get dabase if any
+        // $dsn => database
+        if ($dsn) {
+            // /database
+            if (($pos = strpos($dsn, '?')) === false) {
+                $parsed['database'] = rawurldecode($dsn);
+            // /database?param1=value1&param2=value2
+            } else {
+                $parsed['database'] = rawurldecode(substr($dsn, 0, $pos));
+                $dsn = substr($dsn, $pos + 1);
+                if (strpos($dsn, '&') !== false) {
+                    $opts = explode('&', $dsn);
+                } else { // database?param1=value1
+                    $opts = array($dsn);
+                }
+                foreach ($opts as $opt) {
+                    list($key, $value) = explode('=', $opt);
+                    if (!array_key_exists($key, $parsed) || false === $parsed[$key]) {
+                        // don't allow params overwrite
+                        $parsed[$key] = rawurldecode($value);
+                    }
+                }
+            }
+        }
+
+        return $parsed;
+    }
+
+    // }}}
+    // {{{ function fileExists($file)
+
+    /**
+     * Checks if a file exists in the include path
+     *
+     * @param   string  filename
+     *
+     * @return  bool    true success and false on error
+     *
+     * @access  public
+     */
+    static function fileExists($file)
+    {
+        // safe_mode does notwork with is_readable()
+        if (!@ini_get('safe_mode')) {
+             $dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
+             foreach ($dirs as $dir) {
+                 if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
+                     return true;
+                 }
+            }
+        } else {
+            $fp = @fopen($file, 'r', true);
+            if (is_resource($fp)) {
+                @fclose($fp);
+                return true;
+            }
+        }
+        return false;
+    }
+    // }}}
+}
+
+// }}}
+// {{{ class MDB2_Error extends PEAR_Error
+
+/**
+ * MDB2_Error implements a class for reporting portable database error
+ * messages.
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author Stig Bakken <ssb@fast.no>
+ */
+class MDB2_Error extends PEAR_Error
+{
+    // {{{ constructor: function MDB2_Error($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null)
+
+    /**
+     * MDB2_Error constructor.
+     *
+     * @param   mixed   MDB2 error code, or string with error message.
+     * @param   int     what 'error mode' to operate in
+     * @param   int     what error level to use for $mode & PEAR_ERROR_TRIGGER
+     * @param   mixed   additional debug info, such as the last query
+     */
+    function __construct($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN,
+              $level = E_USER_NOTICE, $debuginfo = null, $dummy = null)
+    {
+        if (null === $code) {
+            $code = MDB2_ERROR;
+        }
+        $this->PEAR_Error('MDB2 Error: '.MDB2::errorMessage($code), $code,
+            $mode, $level, $debuginfo);
+    }
+
+    // }}}
+}
+
+// }}}
+// {{{ class MDB2_Driver_Common extends PEAR
+
+/**
+ * MDB2_Driver_Common: Base class that is extended by each MDB2 driver
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Common
+{
+    // {{{ Variables (Properties)
+
+    /**
+     * @var MDB2_Driver_Datatype_Common
+     */
+    public $datatype;
+
+    /**
+     * @var MDB2_Extended
+     */
+    public $extended;
+
+    /**
+     * @var MDB2_Driver_Function_Common
+     */
+    public $function;
+
+    /**
+     * @var MDB2_Driver_Manager_Common
+     */
+    public $manager;
+
+    /**
+     * @var MDB2_Driver_Native_Commonn
+     */
+    public $native;
+
+    /**
+     * @var MDB2_Driver_Reverse_Common
+     */
+    public $reverse;
+
+    /**
+     * index of the MDB2 object within the $GLOBALS['_MDB2_databases'] array
+     * @var     int
+     * @access  public
+     */
+    public $db_index = 0;
+
+    /**
+     * DSN used for the next query
+     * @var     array
+     * @access  protected
+     */
+    public $dsn = array();
+
+    /**
+     * DSN that was used to create the current connection
+     * @var     array
+     * @access  protected
+     */
+    public $connected_dsn = array();
+
+    /**
+     * connection resource
+     * @var     mixed
+     * @access  protected
+     */
+    public $connection = 0;
+
+    /**
+     * if the current opened connection is a persistent connection
+     * @var     bool
+     * @access  protected
+     */
+    public $opened_persistent;
+
+    /**
+     * the name of the database for the next query
+     * @var     string
+     * @access  public
+     */
+    public $database_name = '';
+
+    /**
+     * the name of the database currently selected
+     * @var     string
+     * @access  protected
+     */
+    public $connected_database_name = '';
+
+    /**
+     * server version information
+     * @var     string
+     * @access  protected
+     */
+    public $connected_server_info = '';
+
+    /**
+     * list of all supported features of the given driver
+     * @var     array
+     * @access  public
+     */
+    public $supported = array(
+        'sequences' => false,
+        'indexes' => false,
+        'affected_rows' => false,
+        'summary_functions' => false,
+        'order_by_text' => false,
+        'transactions' => false,
+        'savepoints' => false,
+        'current_id' => false,
+        'limit_queries' => false,
+        'LOBs' => false,
+        'replace' => false,
+        'sub_selects' => false,
+        'triggers' => false,
+        'auto_increment' => false,
+        'primary_key' => false,
+        'result_introspection' => false,
+        'prepared_statements' => false,
+        'identifier_quoting' => false,
+        'pattern_escaping' => false,
+        'new_link' => false,
+    );
+
+    /**
+     * Array of supported options that can be passed to the MDB2 instance.
+     *
+     * The options can be set during object creation, using
+     * MDB2::connect(), MDB2::factory() or MDB2::singleton(). The options can
+     * also be set after the object is created, using MDB2::setOptions() or
+     * MDB2_Driver_Common::setOption().
+     * The list of available option includes:
+     * <ul>
+     *  <li>$options['ssl'] -> boolean: determines if ssl should be used for connections</li>
+     *  <li>$options['field_case'] -> CASE_LOWER|CASE_UPPER: determines what case to force on field/table names</li>
+     *  <li>$options['disable_query'] -> boolean: determines if queries should be executed</li>
+     *  <li>$options['result_class'] -> string: class used for result sets</li>
+     *  <li>$options['buffered_result_class'] -> string: class used for buffered result sets</li>
+     *  <li>$options['result_wrap_class'] -> string: class used to wrap result sets into</li>
+     *  <li>$options['result_buffering'] -> boolean should results be buffered or not?</li>
+     *  <li>$options['fetch_class'] -> string: class to use when fetch mode object is used</li>
+     *  <li>$options['persistent'] -> boolean: persistent connection?</li>
+     *  <li>$options['debug'] -> integer: numeric debug level</li>
+     *  <li>$options['debug_handler'] -> string: function/method that captures debug messages</li>
+     *  <li>$options['debug_expanded_output'] -> bool: BC option to determine if more context information should be send to the debug handler</li>
+     *  <li>$options['default_text_field_length'] -> integer: default text field length to use</li>
+     *  <li>$options['lob_buffer_length'] -> integer: LOB buffer length</li>
+     *  <li>$options['log_line_break'] -> string: line-break format</li>
+     *  <li>$options['idxname_format'] -> string: pattern for index name</li>
+     *  <li>$options['seqname_format'] -> string: pattern for sequence name</li>
+     *  <li>$options['savepoint_format'] -> string: pattern for auto generated savepoint names</li>
+     *  <li>$options['statement_format'] -> string: pattern for prepared statement names</li>
+     *  <li>$options['seqcol_name'] -> string: sequence column name</li>
+     *  <li>$options['quote_identifier'] -> boolean: if identifier quoting should be done when check_option is used</li>
+     *  <li>$options['use_transactions'] -> boolean: if transaction use should be enabled</li>
+     *  <li>$options['decimal_places'] -> integer: number of decimal places to handle</li>
+     *  <li>$options['portability'] -> integer: portability constant</li>
+     *  <li>$options['modules'] -> array: short to long module name mapping for __call()</li>
+     *  <li>$options['emulate_prepared'] -> boolean: force prepared statements to be emulated</li>
+     *  <li>$options['datatype_map'] -> array: map user defined datatypes to other primitive datatypes</li>
+     *  <li>$options['datatype_map_callback'] -> array: callback function/method that should be called</li>
+     *  <li>$options['bindname_format'] -> string: regular expression pattern for named parameters</li>
+     *  <li>$options['multi_query'] -> boolean: determines if queries returning multiple result sets should be executed</li>
+     *  <li>$options['max_identifiers_length'] -> integer: max identifier length</li>
+     *  <li>$options['default_fk_action_onupdate'] -> string: default FOREIGN KEY ON UPDATE action ['RESTRICT'|'NO ACTION'|'SET DEFAULT'|'SET NULL'|'CASCADE']</li>
+     *  <li>$options['default_fk_action_ondelete'] -> string: default FOREIGN KEY ON DELETE action ['RESTRICT'|'NO ACTION'|'SET DEFAULT'|'SET NULL'|'CASCADE']</li>
+     * </ul>
+     *
+     * @var     array
+     * @access  public
+     * @see     MDB2::connect()
+     * @see     MDB2::factory()
+     * @see     MDB2::singleton()
+     * @see     MDB2_Driver_Common::setOption()
+     */
+    public $options = array(
+        'ssl' => false,
+        'field_case' => CASE_LOWER,
+        'disable_query' => false,
+        'result_class' => 'MDB2_Result_%s',
+        'buffered_result_class' => 'MDB2_BufferedResult_%s',
+        'result_wrap_class' => false,
+        'result_buffering' => true,
+        'fetch_class' => 'stdClass',
+        'persistent' => false,
+        'debug' => 0,
+        'debug_handler' => 'MDB2_defaultDebugOutput',
+        'debug_expanded_output' => false,
+        'default_text_field_length' => 4096,
+        'lob_buffer_length' => 8192,
+        'log_line_break' => "\n",
+        'idxname_format' => '%s_idx',
+        'seqname_format' => '%s_seq',
+        'savepoint_format' => 'MDB2_SAVEPOINT_%s',
+        'statement_format' => 'MDB2_STATEMENT_%1$s_%2$s',
+        'seqcol_name' => 'sequence',
+        'quote_identifier' => false,
+        'use_transactions' => true,
+        'decimal_places' => 2,
+        'portability' => MDB2_PORTABILITY_ALL,
+        'modules' => array(
+            'ex' => 'Extended',
+            'dt' => 'Datatype',
+            'mg' => 'Manager',
+            'rv' => 'Reverse',
+            'na' => 'Native',
+            'fc' => 'Function',
+        ),
+        'emulate_prepared' => false,
+        'datatype_map' => array(),
+        'datatype_map_callback' => array(),
+        'nativetype_map_callback' => array(),
+        'lob_allow_url_include' => false,
+        'bindname_format' => '(?:\d+)|(?:[a-zA-Z][a-zA-Z0-9_]*)',
+        'max_identifiers_length' => 30,
+        'default_fk_action_onupdate' => 'RESTRICT',
+        'default_fk_action_ondelete' => 'RESTRICT',
+    );
+
+    /**
+     * string array
+     * @var     string
+     * @access  public
+     */
+    public $string_quoting = array(
+        'start'  => "'",
+        'end'    => "'",
+        'escape' => false,
+        'escape_pattern' => false,
+    );
+
+    /**
+     * identifier quoting
+     * @var     array
+     * @access  public
+     */
+    public $identifier_quoting = array(
+        'start'  => '"',
+        'end'    => '"',
+        'escape' => '"',
+    );
+
+    /**
+     * sql comments
+     * @var     array
+     * @access  protected
+     */
+    public $sql_comments = array(
+        array('start' => '--', 'end' => "\n", 'escape' => false),
+        array('start' => '/*', 'end' => '*/', 'escape' => false),
+    );
+
+    /**
+     * comparision wildcards
+     * @var     array
+     * @access  protected
+     */
+    protected $wildcards = array('%', '_');
+
+    /**
+     * column alias keyword
+     * @var     string
+     * @access  protected
+     */
+    public $as_keyword = ' AS ';
+
+    /**
+     * warnings
+     * @var     array
+     * @access  protected
+     */
+    public $warnings = array();
+
+    /**
+     * string with the debugging information
+     * @var     string
+     * @access  public
+     */
+    public $debug_output = '';
+
+    /**
+     * determine if there is an open transaction
+     * @var     bool
+     * @access  protected
+     */
+    public $in_transaction = false;
+
+    /**
+     * the smart transaction nesting depth
+     * @var     int
+     * @access  protected
+     */
+    public $nested_transaction_counter = null;
+
+    /**
+     * the first error that occured inside a nested transaction
+     * @var     MDB2_Error|bool
+     * @access  protected
+     */
+    protected $has_transaction_error = false;
+
+    /**
+     * result offset used in the next query
+     * @var     int
+     * @access  public
+     */
+    public $offset = 0;
+
+    /**
+     * result limit used in the next query
+     * @var     int
+     * @access  public
+     */
+    public $limit = 0;
+
+    /**
+     * Database backend used in PHP (mysql, odbc etc.)
+     * @var     string
+     * @access  public
+     */
+    public $phptype;
+
+    /**
+     * Database used with regards to SQL syntax etc.
+     * @var     string
+     * @access  public
+     */
+    public $dbsyntax;
+
+    /**
+     * the last query sent to the driver
+     * @var     string
+     * @access  public
+     */
+    public $last_query;
+
+    /**
+     * the default fetchmode used
+     * @var     int
+     * @access  public
+     */
+    public $fetchmode = MDB2_FETCHMODE_ORDERED;
+
+    /**
+     * array of module instances
+     * @var     array
+     * @access  protected
+     */
+    protected $modules = array();
+
+    /**
+     * determines of the PHP4 destructor emulation has been enabled yet
+     * @var     array
+     * @access  protected
+     */
+    protected $destructor_registered = true;
+
+    /**
+     * @var PEAR 
+     */
+    protected $pear;
+
+    // }}}
+    // {{{ constructor: function __construct()
+
+    /**
+     * Constructor
+     */
+    function __construct()
+    {
+        end($GLOBALS['_MDB2_databases']);
+        $db_index = key($GLOBALS['_MDB2_databases']) + 1;
+        $GLOBALS['_MDB2_databases'][$db_index] = &$this;
+        $this->db_index = $db_index;
+        $this->pear = new PEAR;
+    }
+
+    // }}}
+    // {{{ destructor: function __destruct()
+
+    /**
+     *  Destructor
+     */
+    function __destruct()
+    {
+        $this->disconnect(false);
+    }
+
+    // }}}
+    // {{{ function free()
+
+    /**
+     * Free the internal references so that the instance can be destroyed
+     *
+     * @return  bool    true on success, false if result is invalid
+     *
+     * @access  public
+     */
+    function free()
+    {
+        unset($GLOBALS['_MDB2_databases'][$this->db_index]);
+        unset($this->db_index);
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function __toString()
+
+    /**
+     * String conversation
+     *
+     * @return  string representation of the object
+     *
+     * @access  public
+     */
+    function __toString()
+    {
+        $info = get_class($this);
+        $info.= ': (phptype = '.$this->phptype.', dbsyntax = '.$this->dbsyntax.')';
+        if ($this->connection) {
+            $info.= ' [connected]';
+        }
+        return $info;
+    }
+
+    // }}}
+    // {{{ function errorInfo($error = null)
+
+    /**
+     * This method is used to collect information about an error
+     *
+     * @param   mixed   error code or resource
+     *
+     * @return  array   with MDB2 errorcode, native error code, native message
+     *
+     * @access  public
+     */
+    function errorInfo($error = null)
+    {
+        return array($error, null, null);
+    }
+
+    // }}}
+    // {{{ function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
+
+    /**
+     * This method is used to communicate an error and invoke error
+     * callbacks etc.  Basically a wrapper for PEAR::raiseError
+     * without the message string.
+     *
+     * @param mixed  $code     integer error code, or a PEAR error object (all
+     *                         other parameters are ignored if this parameter is
+     *                         an object
+     * @param int    $mode     error mode, see PEAR_Error docs
+     * @param mixed  $options  If error mode is PEAR_ERROR_TRIGGER, this is the
+     *                         error level (E_USER_NOTICE etc). If error mode is
+     *                         PEAR_ERROR_CALLBACK, this is the callback function,
+     *                         either as a function name, or as an array of an
+     *                         object and method name. For other error modes this
+     *                         parameter is ignored.
+     * @param string $userinfo Extra debug information. Defaults to the last
+     *                         query and native error code.
+     * @param string $method   name of the method that triggered the error
+     * @param string $dummy1   not used
+     * @param bool   $dummy2   not used
+     *
+     * @return PEAR_Error instance of a PEAR Error object
+     * @access public
+     * @see    PEAR_Error
+     */
+    function &raiseError($code = null,
+                         $mode = null,
+                         $options = null,
+                         $userinfo = null,
+                         $method = null,
+                         $dummy1 = null,
+                         $dummy2 = false
+    ) {
+        $userinfo = "[Error message: $userinfo]\n";
+        // The error is yet a MDB2 error object
+        if (MDB2::isError($code)) {
+            // because we use the static PEAR::raiseError, our global
+            // handler should be used if it is set
+            if ((null === $mode) && !empty($this->_default_error_mode)) {
+                $mode    = $this->_default_error_mode;
+                $options = $this->_default_error_options;
+            }
+            if (null === $userinfo) {
+                $userinfo = $code->getUserinfo();
+            }
+            $code = $code->getCode();
+        } elseif ($code == MDB2_ERROR_NOT_FOUND) {
+            // extension not loaded: don't call $this->errorInfo() or the script
+            // will die
+        } elseif (isset($this->connection)) {
+            if (!empty($this->last_query)) {
+                $userinfo.= "[Last executed query: {$this->last_query}]\n";
+            }
+            $native_errno = $native_msg = null;
+            list($code, $native_errno, $native_msg) = $this->errorInfo($code);
+            if ((null !== $native_errno) && $native_errno !== '') {
+                $userinfo.= "[Native code: $native_errno]\n";
+            }
+            if ((null !== $native_msg) && $native_msg !== '') {
+                $userinfo.= "[Native message: ". strip_tags($native_msg) ."]\n";
+            }
+            if (null !== $method) {
+                $userinfo = $method.': '.$userinfo;
+            }
+        }
+
+        $err = $this->pear->raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
+        if ($err->getMode() !== PEAR_ERROR_RETURN
+            && isset($this->nested_transaction_counter) && !$this->has_transaction_error) {
+            $this->has_transaction_error = $err;
+        }
+        return $err;
+    }
+
+    // }}}
+    // {{{ function resetWarnings()
+
+    /**
+     * reset the warning array
+     *
+     * @return void
+     *
+     * @access  public
+     */
+    function resetWarnings()
+    {
+        $this->warnings = array();
+    }
+
+    // }}}
+    // {{{ function getWarnings()
+
+    /**
+     * Get all warnings in reverse order.
+     * This means that the last warning is the first element in the array
+     *
+     * @return  array   with warnings
+     *
+     * @access  public
+     * @see     resetWarnings()
+     */
+    function getWarnings()
+    {
+        return array_reverse($this->warnings);
+    }
+
+    // }}}
+    // {{{ function setFetchMode($fetchmode, $object_class = 'stdClass')
+
+    /**
+     * Sets which fetch mode should be used by default on queries
+     * on this connection
+     *
+     * @param   int     MDB2_FETCHMODE_ORDERED, MDB2_FETCHMODE_ASSOC
+     *                               or MDB2_FETCHMODE_OBJECT
+     * @param   string  the class name of the object to be returned
+     *                               by the fetch methods when the
+     *                               MDB2_FETCHMODE_OBJECT mode is selected.
+     *                               If no class is specified by default a cast
+     *                               to object from the assoc array row will be
+     *                               done.  There is also the possibility to use
+     *                               and extend the 'MDB2_row' class.
+     *
+     * @return  mixed   MDB2_OK or MDB2 Error Object
+     *
+     * @access  public
+     * @see     MDB2_FETCHMODE_ORDERED, MDB2_FETCHMODE_ASSOC, MDB2_FETCHMODE_OBJECT
+     */
+    function setFetchMode($fetchmode, $object_class = 'stdClass')
+    {
+        switch ($fetchmode) {
+        case MDB2_FETCHMODE_OBJECT:
+            $this->options['fetch_class'] = $object_class;
+        case MDB2_FETCHMODE_ORDERED:
+        case MDB2_FETCHMODE_ASSOC:
+            $this->fetchmode = $fetchmode;
+            break;
+        default:
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'invalid fetchmode mode', __FUNCTION__);
+        }
+
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function setOption($option, $value)
+
+    /**
+     * set the option for the db class
+     *
+     * @param   string  option name
+     * @param   mixed   value for the option
+     *
+     * @return  mixed   MDB2_OK or MDB2 Error Object
+     *
+     * @access  public
+     */
+    function setOption($option, $value)
+    {
+        if (array_key_exists($option, $this->options)) {
+            $this->options[$option] = $value;
+            return MDB2_OK;
+        }
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            "unknown option $option", __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function getOption($option)
+
+    /**
+     * Returns the value of an option
+     *
+     * @param   string  option name
+     *
+     * @return  mixed   the option value or error object
+     *
+     * @access  public
+     */
+    function getOption($option)
+    {
+        if (array_key_exists($option, $this->options)) {
+            return $this->options[$option];
+        }
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            "unknown option $option", __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function debug($message, $scope = '', $is_manip = null)
+
+    /**
+     * set a debug message
+     *
+     * @param   string  message that should be appended to the debug variable
+     * @param   string  usually the method name that triggered the debug call:
+     *                  for example 'query', 'prepare', 'execute', 'parameters',
+     *                  'beginTransaction', 'commit', 'rollback'
+     * @param   array   contains context information about the debug() call
+     *                  common keys are: is_manip, time, result etc.
+     *
+     * @return void
+     *
+     * @access  public
+     */
+    function debug($message, $scope = '', $context = array())
+    {
+        if ($this->options['debug'] && $this->options['debug_handler']) {
+            if (!$this->options['debug_expanded_output']) {
+                if (!empty($context['when']) && $context['when'] !== 'pre') {
+                    return null;
+                }
+                $context = empty($context['is_manip']) ? false : $context['is_manip'];
+            }
+            return call_user_func_array($this->options['debug_handler'], array(&$this, $scope, $message, $context));
+        }
+        return null;
+    }
+
+    // }}}
+    // {{{ function getDebugOutput()
+
+    /**
+     * output debug info
+     *
+     * @return  string  content of the debug_output class variable
+     *
+     * @access  public
+     */
+    function getDebugOutput()
+    {
+        return $this->debug_output;
+    }
+
+    // }}}
+    // {{{ function escape($text)
+
+    /**
+     * Quotes a string so it can be safely used in a query. It will quote
+     * the text so it can safely be used within a query.
+     *
+     * @param   string  the input string to quote
+     * @param   bool    escape wildcards
+     *
+     * @return  string  quoted string
+     *
+     * @access  public
+     */
+    function escape($text, $escape_wildcards = false)
+    {
+        if ($escape_wildcards) {
+            $text = $this->escapePattern($text);
+        }
+
+        $text = str_replace($this->string_quoting['end'], $this->string_quoting['escape'] . $this->string_quoting['end'], $text);
+        return $text;
+    }
+
+    // }}}
+    // {{{ function escapePattern($text)
+
+    /**
+     * Quotes pattern (% and _) characters in a string)
+     *
+     * @param   string  the input string to quote
+     *
+     * @return  string  quoted string
+     *
+     * @access  public
+     */
+    function escapePattern($text)
+    {
+        if ($this->string_quoting['escape_pattern']) {
+            $text = str_replace($this->string_quoting['escape_pattern'], $this->string_quoting['escape_pattern'] . $this->string_quoting['escape_pattern'], $text);
+            foreach ($this->wildcards as $wildcard) {
+                $text = str_replace($wildcard, $this->string_quoting['escape_pattern'] . $wildcard, $text);
+            }
+        }
+        return $text;
+    }
+
+    // }}}
+    // {{{ function quoteIdentifier($str, $check_option = false)
+
+    /**
+     * Quote a string so it can be safely used as a table or column name
+     *
+     * Delimiting style depends on which database driver is being used.
+     *
+     * NOTE: just because you CAN use delimited identifiers doesn't mean
+     * you SHOULD use them.  In general, they end up causing way more
+     * problems than they solve.
+     *
+     * NOTE: if you have table names containing periods, don't use this method
+     * (@see bug #11906)
+     *
+     * Portability is broken by using the following characters inside
+     * delimited identifiers:
+     *   + backtick (<kbd>`</kbd>) -- due to MySQL
+     *   + double quote (<kbd>"</kbd>) -- due to Oracle
+     *   + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access
+     *
+     * Delimited identifiers are known to generally work correctly under
+     * the following drivers:
+     *   + mssql
+     *   + mysql
+     *   + mysqli
+     *   + oci8
+     *   + pgsql
+     *   + sqlite
+     *
+     * InterBase doesn't seem to be able to use delimited identifiers
+     * via PHP 4.  They work fine under PHP 5.
+     *
+     * @param   string  identifier name to be quoted
+     * @param   bool    check the 'quote_identifier' option
+     *
+     * @return  string  quoted identifier string
+     *
+     * @access  public
+     */
+    function quoteIdentifier($str, $check_option = false)
+    {
+        if ($check_option && !$this->options['quote_identifier']) {
+            return $str;
+        }
+        $str = str_replace($this->identifier_quoting['end'], $this->identifier_quoting['escape'] . $this->identifier_quoting['end'], $str);
+        $parts = explode('.', $str);
+        foreach (array_keys($parts) as $k) {
+            $parts[$k] = $this->identifier_quoting['start'] . $parts[$k] . $this->identifier_quoting['end'];
+        }
+        return implode('.', $parts);
+    }
+
+    // }}}
+    // {{{ function getAsKeyword()
+
+    /**
+     * Gets the string to alias column
+     *
+     * @return string to use when aliasing a column
+     */
+    function getAsKeyword()
+    {
+        return $this->as_keyword;
+    }
+
+    // }}}
+    // {{{ function getConnection()
+
+    /**
+     * Returns a native connection
+     *
+     * @return  mixed   a valid MDB2 connection object,
+     *                  or a MDB2 error object on error
+     *
+     * @access  public
+     */
+    function getConnection()
+    {
+        $result = $this->connect();
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return $this->connection;
+    }
+
+     // }}}
+    // {{{ function _fixResultArrayValues(&$row, $mode)
+
+    /**
+     * Do all necessary conversions on result arrays to fix DBMS quirks
+     *
+     * @param   array   the array to be fixed (passed by reference)
+     * @param   array   bit-wise addition of the required portability modes
+     *
+     * @return  void
+     *
+     * @access  protected
+     */
+    function _fixResultArrayValues(&$row, $mode)
+    {
+        switch ($mode) {
+        case MDB2_PORTABILITY_EMPTY_TO_NULL:
+            foreach ($row as $key => $value) {
+                if ($value === '') {
+                    $row[$key] = null;
+                }
+            }
+            break;
+        case MDB2_PORTABILITY_RTRIM:
+            foreach ($row as $key => $value) {
+                if (is_string($value)) {
+                    $row[$key] = rtrim($value);
+                }
+            }
+            break;
+        case MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES:
+            $tmp_row = array();
+            foreach ($row as $key => $value) {
+                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
+            }
+            $row = $tmp_row;
+            break;
+        case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_EMPTY_TO_NULL):
+            foreach ($row as $key => $value) {
+                if ($value === '') {
+                    $row[$key] = null;
+                } elseif (is_string($value)) {
+                    $row[$key] = rtrim($value);
+                }
+            }
+            break;
+        case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES):
+            $tmp_row = array();
+            foreach ($row as $key => $value) {
+                if (is_string($value)) {
+                    $value = rtrim($value);
+                }
+                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
+            }
+            $row = $tmp_row;
+            break;
+        case (MDB2_PORTABILITY_EMPTY_TO_NULL + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES):
+            $tmp_row = array();
+            foreach ($row as $key => $value) {
+                if ($value === '') {
+                    $value = null;
+                }
+                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
+            }
+            $row = $tmp_row;
+            break;
+        case (MDB2_PORTABILITY_RTRIM + MDB2_PORTABILITY_EMPTY_TO_NULL + MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES):
+            $tmp_row = array();
+            foreach ($row as $key => $value) {
+                if ($value === '') {
+                    $value = null;
+                } elseif (is_string($value)) {
+                    $value = rtrim($value);
+                }
+                $tmp_row[preg_replace('/^(?:.*\.)?([^.]+)$/', '\\1', $key)] = $value;
+            }
+            $row = $tmp_row;
+            break;
+        }
+    }
+
+    // }}}
+    // {{{ function loadModule($module, $property = null, $phptype_specific = null)
+
+    /**
+     * loads a module
+     *
+     * @param   string  name of the module that should be loaded
+     *                  (only used for error messages)
+     * @param   string  name of the property into which the class will be loaded
+     * @param   bool    if the class to load for the module is specific to the
+     *                  phptype
+     *
+     * @return  object  on success a reference to the given module is returned
+     *                  and on failure a PEAR error
+     *
+     * @access  public
+     */
+    function loadModule($module, $property = null, $phptype_specific = null)
+    {
+        if (!$property) {
+            $property = strtolower($module);
+        }
+
+        if (!isset($this->{$property})) {
+            $version = $phptype_specific;
+            if ($phptype_specific !== false) {
+                $version = true;
+                $class_name = 'MDB2_Driver_'.$module.'_'.$this->phptype;
+                $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';
+            }
+            if ($phptype_specific === false
+                || (!MDB2::classExists($class_name) && !MDB2::fileExists($file_name))
+            ) {
+                $version = false;
+                $class_name = 'MDB2_'.$module;
+                $file_name = str_replace('_', DIRECTORY_SEPARATOR, $class_name).'.php';
+            }
+
+            $err = MDB2::loadClass($class_name, $this->getOption('debug'));
+            if (MDB2::isError($err)) {
+                return $err;
+            }
+
+            // load module in a specific version
+            if ($version) {
+                if (method_exists($class_name, 'getClassName')) {
+                    $class_name_new = call_user_func(array($class_name, 'getClassName'), $this->db_index);
+                    if ($class_name != $class_name_new) {
+                        $class_name = $class_name_new;
+                        $err = MDB2::loadClass($class_name, $this->getOption('debug'));
+                        if (MDB2::isError($err)) {
+                            return $err;
+                        }
+                    }
+                }
+            }
+
+            if (!MDB2::classExists($class_name)) {
+                $err = $this->raiseError(MDB2_ERROR_LOADMODULE, null, null,
+                    "unable to load module '$module' into property '$property'", __FUNCTION__);
+                return $err;
+            }
+            $this->{$property} = new $class_name($this->db_index);
+            $this->modules[$module] = $this->{$property};
+            if ($version) {
+                // this will be used in the connect method to determine if the module
+                // needs to be loaded with a different version if the server
+                // version changed in between connects
+                $this->loaded_version_modules[] = $property;
+            }
+        }
+
+        return $this->{$property};
+    }
+
+    // }}}
+    // {{{ function __call($method, $params)
+
+    /**
+     * Calls a module method using the __call magic method
+     *
+     * @param   string  Method name.
+     * @param   array   Arguments.
+     *
+     * @return  mixed   Returned value.
+     */
+    function __call($method, $params)
+    {
+        $module = null;
+        if (preg_match('/^([a-z]+)([A-Z])(.*)$/', $method, $match)
+            && isset($this->options['modules'][$match[1]])
+        ) {
+            $module = $this->options['modules'][$match[1]];
+            $method = strtolower($match[2]).$match[3];
+            if (!isset($this->modules[$module]) || !is_object($this->modules[$module])) {
+                $result = $this->loadModule($module);
+                if (MDB2::isError($result)) {
+                    return $result;
+                }
+            }
+        } else {
+            foreach ($this->modules as $key => $foo) {
+                if (is_object($this->modules[$key])
+                    && method_exists($this->modules[$key], $method)
+                ) {
+                    $module = $key;
+                    break;
+                }
+            }
+        }
+        if (null !== $module) {
+            return call_user_func_array(array(&$this->modules[$module], $method), $params);
+        }
+        trigger_error(sprintf('Call to undefined function: %s::%s().', get_class($this), $method), E_USER_ERROR);
+    }
+
+    // }}}
+    // {{{ function beginTransaction($savepoint = null)
+
+    /**
+     * Start a transaction or set a savepoint.
+     *
+     * @param   string  name of a savepoint to set
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function beginTransaction($savepoint = null)
+    {
+        $this->debug('Starting transaction', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'transactions are not supported', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function commit($savepoint = null)
+
+    /**
+     * Commit the database changes done during a transaction that is in
+     * progress or release a savepoint. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after committing the pending changes.
+     *
+     * @param   string  name of a savepoint to release
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function commit($savepoint = null)
+    {
+        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'commiting transactions is not supported', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function rollback($savepoint = null)
+
+    /**
+     * Cancel any database changes done during a transaction or since a specific
+     * savepoint that is in progress. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after canceling the pending changes.
+     *
+     * @param   string  name of a savepoint to rollback to
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function rollback($savepoint = null)
+    {
+        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'rolling back transactions is not supported', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function inTransaction($ignore_nested = false)
+
+    /**
+     * If a transaction is currently open.
+     *
+     * @param   bool    if the nested transaction count should be ignored
+     * @return  int|bool    - an integer with the nesting depth is returned if a
+     *                      nested transaction is open
+     *                      - true is returned for a normal open transaction
+     *                      - false is returned if no transaction is open
+     *
+     * @access  public
+     */
+    function inTransaction($ignore_nested = false)
+    {
+        if (!$ignore_nested && isset($this->nested_transaction_counter)) {
+            return $this->nested_transaction_counter;
+        }
+        return $this->in_transaction;
+    }
+
+    // }}}
+    // {{{ function setTransactionIsolation($isolation)
+
+    /**
+     * Set the transacton isolation level.
+     *
+     * @param   string  standard isolation level
+     *                  READ UNCOMMITTED (allows dirty reads)
+     *                  READ COMMITTED (prevents dirty reads)
+     *                  REPEATABLE READ (prevents nonrepeatable reads)
+     *                  SERIALIZABLE (prevents phantom reads)
+     * @param   array some transaction options:
+     *                  'wait' => 'WAIT' | 'NO WAIT'
+     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function setTransactionIsolation($isolation, $options = array())
+    {
+        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'isolation level setting is not supported', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function beginNestedTransaction($savepoint = false)
+
+    /**
+     * Start a nested transaction.
+     *
+     * @return  mixed   MDB2_OK on success/savepoint name, a MDB2 error on failure
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function beginNestedTransaction()
+    {
+        if ($this->in_transaction) {
+            ++$this->nested_transaction_counter;
+            $savepoint = sprintf($this->options['savepoint_format'], $this->nested_transaction_counter);
+            if ($this->supports('savepoints') && $savepoint) {
+                return $this->beginTransaction($savepoint);
+            }
+            return MDB2_OK;
+        }
+        $this->has_transaction_error = false;
+        $result = $this->beginTransaction();
+        $this->nested_transaction_counter = 1;
+        return $result;
+    }
+
+    // }}}
+    // {{{ function completeNestedTransaction($force_rollback = false, $release = false)
+
+    /**
+     * Finish a nested transaction by rolling back if an error occured or
+     * committing otherwise.
+     *
+     * @param   bool    if the transaction should be rolled back regardless
+     *                  even if no error was set within the nested transaction
+     * @return  mixed   MDB_OK on commit/counter decrementing, false on rollback
+     *                  and a MDB2 error on failure
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function completeNestedTransaction($force_rollback = false)
+    {
+        if ($this->nested_transaction_counter > 1) {
+            $savepoint = sprintf($this->options['savepoint_format'], $this->nested_transaction_counter);
+            if ($this->supports('savepoints') && $savepoint) {
+                if ($force_rollback || $this->has_transaction_error) {
+                    $result = $this->rollback($savepoint);
+                    if (!MDB2::isError($result)) {
+                        $result = false;
+                        $this->has_transaction_error = false;
+                    }
+                } else {
+                    $result = $this->commit($savepoint);
+                }
+            } else {
+                $result = MDB2_OK;
+            }
+            --$this->nested_transaction_counter;
+            return $result;
+        }
+
+        $this->nested_transaction_counter = null;
+        $result = MDB2_OK;
+
+        // transaction has not yet been rolled back
+        if ($this->in_transaction) {
+            if ($force_rollback || $this->has_transaction_error) {
+                $result = $this->rollback();
+                if (!MDB2::isError($result)) {
+                    $result = false;
+                }
+            } else {
+                $result = $this->commit();
+            }
+        }
+        $this->has_transaction_error = false;
+        return $result;
+    }
+
+    // }}}
+    // {{{ function failNestedTransaction($error = null, $immediately = false)
+
+    /**
+     * Force setting nested transaction to failed.
+     *
+     * @param   mixed   value to return in getNestededTransactionError()
+     * @param   bool    if the transaction should be rolled back immediately
+     * @return  bool    MDB2_OK
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function failNestedTransaction($error = null, $immediately = false)
+    {
+        if (null !== $error) {
+            $error = $this->has_transaction_error ? $this->has_transaction_error : true;
+        } elseif (!$error) {
+            $error = true;
+        }
+        $this->has_transaction_error = $error;
+        if (!$immediately) {
+            return MDB2_OK;
+        }
+        return $this->rollback();
+    }
+
+    // }}}
+    // {{{ function getNestedTransactionError()
+
+    /**
+     * The first error that occured since the transaction start.
+     *
+     * @return  MDB2_Error|bool     MDB2 error object if an error occured or false.
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function getNestedTransactionError()
+    {
+        return $this->has_transaction_error;
+    }
+
+    // }}}
+    // {{{ connect()
+
+    /**
+     * Connect to the database
+     *
+     * @return true on success, MDB2 Error Object on failure
+     */
+    function connect()
+    {
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ databaseExists()
+
+    /**
+     * check if given database name is exists?
+     *
+     * @param string $name    name of the database that should be checked
+     *
+     * @return mixed true/false on success, a MDB2 error on failure
+     * @access public
+     */
+    function databaseExists($name)
+    {
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ setCharset($charset, $connection = null)
+
+    /**
+     * Set the charset on the current connection
+     *
+     * @param string    charset
+     * @param resource  connection handle
+     *
+     * @return true on success, MDB2 Error Object on failure
+     */
+    function setCharset($charset, $connection = null)
+    {
+        return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function disconnect($force = true)
+
+    /**
+     * Log out and disconnect from the database.
+     *
+     * @param boolean $force whether the disconnect should be forced even if the
+     *                       connection is opened persistently
+     *
+     * @return mixed true on success, false if not connected and error object on error
+     *
+     * @access  public
+     */
+    function disconnect($force = true)
+    {
+        $this->connection = 0;
+        $this->connected_dsn = array();
+        $this->connected_database_name = '';
+        $this->opened_persistent = null;
+        $this->connected_server_info = '';
+        $this->in_transaction = null;
+        $this->nested_transaction_counter = null;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function setDatabase($name)
+
+    /**
+     * Select a different database
+     *
+     * @param   string  name of the database that should be selected
+     *
+     * @return  string  name of the database previously connected to
+     *
+     * @access  public
+     */
+    function setDatabase($name)
+    {
+        $previous_database_name = (isset($this->database_name)) ? $this->database_name : '';
+        $this->database_name = $name;
+        if (!empty($this->connected_database_name) && ($this->connected_database_name != $this->database_name)) {
+            $this->disconnect(false);
+        }
+        return $previous_database_name;
+    }
+
+    // }}}
+    // {{{ function getDatabase()
+
+    /**
+     * Get the current database
+     *
+     * @return  string  name of the database
+     *
+     * @access  public
+     */
+    function getDatabase()
+    {
+        return $this->database_name;
+    }
+
+    // }}}
+    // {{{ function setDSN($dsn)
+
+    /**
+     * set the DSN
+     *
+     * @param   mixed   DSN string or array
+     *
+     * @return  MDB2_OK
+     *
+     * @access  public
+     */
+    function setDSN($dsn)
+    {
+        $dsn_default = $GLOBALS['_MDB2_dsninfo_default'];
+        $dsn = MDB2::parseDSN($dsn);
+        if (array_key_exists('database', $dsn)) {
+            $this->database_name = $dsn['database'];
+            unset($dsn['database']);
+        }
+        $this->dsn = array_merge($dsn_default, $dsn);
+        return $this->disconnect(false);
+    }
+
+    // }}}
+    // {{{ function getDSN($type = 'string', $hidepw = false)
+
+    /**
+     * return the DSN as a string
+     *
+     * @param   string  format to return ("array", "string")
+     * @param   string  string to hide the password with
+     *
+     * @return  mixed   DSN in the chosen type
+     *
+     * @access  public
+     */
+    function getDSN($type = 'string', $hidepw = false)
+    {
+        $dsn = array_merge($GLOBALS['_MDB2_dsninfo_default'], $this->dsn);
+        $dsn['phptype'] = $this->phptype;
+        $dsn['database'] = $this->database_name;
+        if ($hidepw) {
+            $dsn['password'] = $hidepw;
+        }
+        switch ($type) {
+        // expand to include all possible options
+        case 'string':
+           $dsn = $dsn['phptype'].
+               ($dsn['dbsyntax'] ? ('('.$dsn['dbsyntax'].')') : '').
+               '://'.$dsn['username'].':'.
+                $dsn['password'].'@'.$dsn['hostspec'].
+                ($dsn['port'] ? (':'.$dsn['port']) : '').
+                '/'.$dsn['database'];
+            break;
+        case 'array':
+        default:
+            break;
+        }
+        return $dsn;
+    }
+
+    // }}}
+    // {{{ _isNewLinkSet()
+
+    /**
+     * Check if the 'new_link' option is set
+     *
+     * @return boolean
+     *
+     * @access protected
+     */
+    function _isNewLinkSet()
+    {
+        return (isset($this->dsn['new_link'])
+            && ($this->dsn['new_link'] === true
+             || (is_string($this->dsn['new_link']) && preg_match('/^true$/i', $this->dsn['new_link']))
+             || (is_numeric($this->dsn['new_link']) && 0 != (int)$this->dsn['new_link'])
+            )
+        );
+    }
+
+    // }}}
+    // {{{ function &standaloneQuery($query, $types = null, $is_manip = false)
+
+   /**
+     * execute a query as database administrator
+     *
+     * @param   string  the SQL query
+     * @param   mixed   array that contains the types of the columns in
+     *                        the result set
+     * @param   bool    if the query is a manipulation query
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function standaloneQuery($query, $types = null, $is_manip = false)
+    {
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
+
+        $connection = $this->getConnection();
+        if (MDB2::isError($connection)) {
+            return $connection;
+        }
+
+        $result = $this->_doQuery($query, $is_manip, $connection, false);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+
+        if ($is_manip) {
+            $affected_rows =  $this->_affectedRows($connection, $result);
+            return $affected_rows;
+        }
+        $result = $this->_wrapResult($result, $types, true, true, $limit, $offset);
+        return $result;
+    }
+
+    // }}}
+    // {{{ function _modifyQuery($query, $is_manip, $limit, $offset)
+
+    /**
+     * Changes a query string for various DBMS specific reasons
+     *
+     * @param   string  query to modify
+     * @param   bool    if it is a DML query
+     * @param   int  limit the number of rows
+     * @param   int  start reading from given offset
+     *
+     * @return  string  modified query
+     *
+     * @access  protected
+     */
+    function _modifyQuery($query, $is_manip, $limit, $offset)
+    {
+        return $query;
+    }
+
+    // }}}
+    // {{{ function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null)
+
+    /**
+     * Execute a query
+     * @param   string  query
+     * @param   bool    if the query is a manipulation query
+     * @param   resource connection handle
+     * @param   string  database name
+     *
+     * @return  result or error object
+     *
+     * @access  protected
+     */
+    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
+    {
+        $this->last_query = $query;
+        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+        return $err;
+    }
+
+    // }}}
+    // {{{ function _affectedRows($connection, $result = null)
+
+    /**
+     * Returns the number of rows affected
+     *
+     * @param   resource result handle
+     * @param   resource connection handle
+     *
+     * @return  mixed   MDB2 Error Object or the number of rows affected
+     *
+     * @access  private
+     */
+    function _affectedRows($connection, $result = null)
+    {
+        return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function &exec($query)
+
+    /**
+     * Execute a manipulation query to the database and return the number of affected rows
+     *
+     * @param   string  the SQL query
+     *
+     * @return  mixed   number of affected rows on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function exec($query)
+    {
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $query = $this->_modifyQuery($query, true, $limit, $offset);
+
+        $connection = $this->getConnection();
+        if (MDB2::isError($connection)) {
+            return $connection;
+        }
+
+        $result = $this->_doQuery($query, true, $connection, $this->database_name);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+
+        $affectedRows = $this->_affectedRows($connection, $result);
+        return $affectedRows;
+    }
+
+    // }}}
+    // {{{ function &query($query, $types = null, $result_class = true, $result_wrap_class = false)
+
+    /**
+     * Send a query to the database and return any results
+     *
+     * @param   string  the SQL query
+     * @param   mixed   array that contains the types of the columns in
+     *                        the result set
+     * @param   mixed   string which specifies which result class to use
+     * @param   mixed   string which specifies which class to wrap results in
+     *
+     * @return mixed   an MDB2_Result handle on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function query($query, $types = null, $result_class = true, $result_wrap_class = true)
+    {
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $query = $this->_modifyQuery($query, false, $limit, $offset);
+
+        $connection = $this->getConnection();
+        if (MDB2::isError($connection)) {
+            return $connection;
+        }
+
+        $result = $this->_doQuery($query, false, $connection, $this->database_name);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+
+        $result = $this->_wrapResult($result, $types, $result_class, $result_wrap_class, $limit, $offset);
+        return $result;
+    }
+
+    // }}}
+    // {{{ function _wrapResult($result_resource, $types = array(), $result_class = true, $result_wrap_class = false, $limit = null, $offset = null)
+
+    /**
+     * wrap a result set into the correct class
+     *
+     * @param   resource result handle
+     * @param   mixed   array that contains the types of the columns in
+     *                        the result set
+     * @param   mixed   string which specifies which result class to use
+     * @param   mixed   string which specifies which class to wrap results in
+     * @param   string  number of rows to select
+     * @param   string  first row to select
+     *
+     * @return mixed   an MDB2_Result, a MDB2 error on failure
+     *
+     * @access  protected
+     */
+    function _wrapResult($result_resource, $types = array(), $result_class = true,
+        $result_wrap_class = true, $limit = null, $offset = null)
+    {
+        if ($types === true) {
+            if ($this->supports('result_introspection')) {
+                $this->loadModule('Reverse', null, true);
+                $tableInfo = $this->reverse->tableInfo($result_resource);
+                if (MDB2::isError($tableInfo)) {
+                    return $tableInfo;
+                }
+                $types = array();
+                $types_assoc = array();
+                foreach ($tableInfo as $field) {
+                    $types[] = $field['mdb2type'];
+                    $types_assoc[$field['name']] = $field['mdb2type'];
+                }
+            } else {
+                $types = null;
+            }
+        }
+
+        if ($result_class === true) {
+            $result_class = $this->options['result_buffering']
+                ? $this->options['buffered_result_class'] : $this->options['result_class'];
+        }
+
+        if ($result_class) {
+            $class_name = sprintf($result_class, $this->phptype);
+            if (!MDB2::classExists($class_name)) {
+                $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                    'result class does not exist '.$class_name, __FUNCTION__);
+                return $err;
+            }
+            $result = new $class_name($this, $result_resource, $limit, $offset);
+            if (!MDB2::isResultCommon($result)) {
+                $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                    'result class is not extended from MDB2_Result_Common', __FUNCTION__);
+                return $err;
+            }
+
+            if (!empty($types)) {
+                $err = $result->setResultTypes($types);
+                if (MDB2::isError($err)) {
+                    $result->free();
+                    return $err;
+                }
+            }
+            if (!empty($types_assoc)) {
+                $err = $result->setResultTypes($types_assoc);
+                if (MDB2::isError($err)) {
+                    $result->free();
+                    return $err;
+                }
+            }
+
+            if ($result_wrap_class === true) {
+                $result_wrap_class = $this->options['result_wrap_class'];
+            }
+            if ($result_wrap_class) {
+                if (!MDB2::classExists($result_wrap_class)) {
+                    $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        'result wrap class does not exist '.$result_wrap_class, __FUNCTION__);
+                    return $err;
+                }
+                $result = new $result_wrap_class($result, $this->fetchmode);
+            }
+
+            return $result;
+        }
+
+        return $result_resource;
+    }
+
+    // }}}
+    // {{{ function getServerVersion($native = false)
+
+    /**
+     * return version information about the server
+     *
+     * @param   bool    determines if the raw version string should be returned
+     *
+     * @return  mixed   array with version information or row string
+     *
+     * @access  public
+     */
+    function getServerVersion($native = false)
+    {
+        return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function setLimit($limit, $offset = null)
+
+    /**
+     * set the range of the next query
+     *
+     * @param   string  number of rows to select
+     * @param   string  first row to select
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function setLimit($limit, $offset = null)
+    {
+        if (!$this->supports('limit_queries')) {
+            return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'limit is not supported by this driver', __FUNCTION__);
+        }
+        $limit = (int)$limit;
+        if ($limit < 0) {
+            return MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null,
+                'it was not specified a valid selected range row limit', __FUNCTION__);
+        }
+        $this->limit = $limit;
+        if (null !== $offset) {
+            $offset = (int)$offset;
+            if ($offset < 0) {
+                return MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null,
+                    'it was not specified a valid first selected range row', __FUNCTION__);
+            }
+            $this->offset = $offset;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function subSelect($query, $type = false)
+
+    /**
+     * simple subselect emulation: leaves the query untouched for all RDBMS
+     * that support subselects
+     *
+     * @param   string  the SQL query for the subselect that may only
+     *                      return a column
+     * @param   string  determines type of the field
+     *
+     * @return  string  the query
+     *
+     * @access  public
+     */
+    function subSelect($query, $type = false)
+    {
+        if ($this->supports('sub_selects') === true) {
+            return $query;
+        }
+
+        if (!$this->supports('sub_selects')) {
+            return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'method not implemented', __FUNCTION__);
+        }
+
+        $col = $this->queryCol($query, $type);
+        if (MDB2::isError($col)) {
+            return $col;
+        }
+        if (!is_array($col) || count($col) == 0) {
+            return 'NULL';
+        }
+        if ($type) {
+            $this->loadModule('Datatype', null, true);
+            return $this->datatype->implodeArray($col, $type);
+        }
+        return implode(', ', $col);
+    }
+
+    // }}}
+    // {{{ function replace($table, $fields)
+
+    /**
+     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
+     * query, except that if there is already a row in the table with the same
+     * key field values, the old row is deleted before the new row is inserted.
+     *
+     * The REPLACE type of query does not make part of the SQL standards. Since
+     * practically only MySQL and SQLite implement it natively, this type of
+     * query isemulated through this method for other DBMS using standard types
+     * of queries inside a transaction to assure the atomicity of the operation.
+     *
+     * @param   string  name of the table on which the REPLACE query will
+     *       be executed.
+     * @param   array   associative array   that describes the fields and the
+     *       values that will be inserted or updated in the specified table. The
+     *       indexes of the array are the names of all the fields of the table.
+     *       The values of the array are also associative arrays that describe
+     *       the values and other properties of the table fields.
+     *
+     *       Here follows a list of field properties that need to be specified:
+     *
+     *       value
+     *           Value to be assigned to the specified field. This value may be
+     *           of specified in database independent type format as this
+     *           function can perform the necessary datatype conversions.
+     *
+     *           Default: this property is required unless the Null property is
+     *           set to 1.
+     *
+     *       type
+     *           Name of the type of the field. Currently, all types MDB2
+     *           are supported except for clob and blob.
+     *
+     *           Default: no type conversion
+     *
+     *       null
+     *           bool    property that indicates that the value for this field
+     *           should be set to null.
+     *
+     *           The default value for fields missing in INSERT queries may be
+     *           specified the definition of a table. Often, the default value
+     *           is already null, but since the REPLACE may be emulated using
+     *           an UPDATE query, make sure that all fields of the table are
+     *           listed in this function argument array.
+     *
+     *           Default: 0
+     *
+     *       key
+     *           bool    property that indicates that this field should be
+     *           handled as a primary key or at least as part of the compound
+     *           unique index of the table that will determine the row that will
+     *           updated if it exists or inserted a new row otherwise.
+     *
+     *           This function will fail if no key field is specified or if the
+     *           value of a key field is set to null because fields that are
+     *           part of unique index they may not be null.
+     *
+     *           Default: 0
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function replace($table, $fields)
+    {
+        if (!$this->supports('replace')) {
+            return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'replace query is not supported', __FUNCTION__);
+        }
+        $count = count($fields);
+        $condition = $values = array();
+        for ($colnum = 0, reset($fields); $colnum < $count; next($fields), $colnum++) {
+            $name = key($fields);
+            if (isset($fields[$name]['null']) && $fields[$name]['null']) {
+                $value = 'NULL';
+            } else {
+                $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null;
+                $value = $this->quote($fields[$name]['value'], $type);
+            }
+            $values[$name] = $value;
+            if (isset($fields[$name]['key']) && $fields[$name]['key']) {
+                if ($value === 'NULL') {
+                    return MDB2_Driver_Common::raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
+                        'key value '.$name.' may not be NULL', __FUNCTION__);
+                }
+                $condition[] = $this->quoteIdentifier($name, true) . '=' . $value;
+            }
+        }
+        if (empty($condition)) {
+            return MDB2_Driver_Common::raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
+                'not specified which fields are keys', __FUNCTION__);
+        }
+
+        $result = null;
+        $in_transaction = $this->in_transaction;
+        if (!$in_transaction && MDB2::isError($result = $this->beginTransaction())) {
+            return $result;
+        }
+
+        $connection = $this->getConnection();
+        if (MDB2::isError($connection)) {
+            return $connection;
+        }
+
+        $condition = ' WHERE '.implode(' AND ', $condition);
+        $query = 'DELETE FROM ' . $this->quoteIdentifier($table, true) . $condition;
+        $result = $this->_doQuery($query, true, $connection);
+        if (!MDB2::isError($result)) {
+            $affected_rows = $this->_affectedRows($connection, $result);
+            $insert = '';
+            foreach ($values as $key => $value) {
+                $insert .= ($insert?', ':'') . $this->quoteIdentifier($key, true);
+            }
+            $values = implode(', ', $values);
+            $query = 'INSERT INTO '. $this->quoteIdentifier($table, true) . "($insert) VALUES ($values)";
+            $result = $this->_doQuery($query, true, $connection);
+            if (!MDB2::isError($result)) {
+                $affected_rows += $this->_affectedRows($connection, $result);;
+            }
+        }
+
+        if (!$in_transaction) {
+            if (MDB2::isError($result)) {
+                $this->rollback();
+            } else {
+                $result = $this->commit();
+            }
+        }
+
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+
+        return $affected_rows;
+    }
+
+    // }}}
+    // {{{ function &prepare($query, $types = null, $result_types = null, $lobs = array())
+
+    /**
+     * Prepares a query for multiple execution with execute().
+     * With some database backends, this is emulated.
+     * prepare() requires a generic query as string like
+     * 'INSERT INTO numbers VALUES(?,?)' or
+     * 'INSERT INTO numbers VALUES(:foo,:bar)'.
+     * The ? and :name and are placeholders which can be set using
+     * bindParam() and the query can be sent off using the execute() method.
+     * The allowed format for :name can be set with the 'bindname_format' option.
+     *
+     * @param   string  the query to prepare
+     * @param   mixed   array that contains the types of the placeholders
+     * @param   mixed   array that contains the types of the columns in
+     *                        the result set or MDB2_PREPARE_RESULT, if set to
+     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
+     * @param   mixed   key (field) value (parameter) pair for all lob placeholders
+     *
+     * @return  mixed   resource handle for the prepared query on success,
+     *                  a MDB2 error on failure
+     *
+     * @access  public
+     * @see     bindParam, execute
+     */
+    function prepare($query, $types = null, $result_types = null, $lobs = array())
+    {
+        $is_manip = ($result_types === MDB2_PREPARE_MANIP);
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        $placeholder_type_guess = $placeholder_type = null;
+        $question  = '?';
+        $colon     = ':';
+        $positions = array();
+        $position  = 0;
+        while ($position < strlen($query)) {
+            $q_position = strpos($query, $question, $position);
+            $c_position = strpos($query, $colon, $position);
+            if ($q_position && $c_position) {
+                $p_position = min($q_position, $c_position);
+            } elseif ($q_position) {
+                $p_position = $q_position;
+            } elseif ($c_position) {
+                $p_position = $c_position;
+            } else {
+                break;
+            }
+            if (null === $placeholder_type) {
+                $placeholder_type_guess = $query[$p_position];
+            }
+
+            $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position);
+            if (MDB2::isError($new_pos)) {
+                return $new_pos;
+            }
+            if ($new_pos != $position) {
+                $position = $new_pos;
+                continue; //evaluate again starting from the new position
+            }
+
+            if ($query[$position] == $placeholder_type_guess) {
+                if (null === $placeholder_type) {
+                    $placeholder_type = $query[$p_position];
+                    $question = $colon = $placeholder_type;
+                    if (!empty($types) && is_array($types)) {
+                        if ($placeholder_type == ':') {
+                            if (is_int(key($types))) {
+                                $types_tmp = $types;
+                                $types = array();
+                                $count = -1;
+                            }
+                        } else {
+                            $types = array_values($types);
+                        }
+                    }
+                }
+                if ($placeholder_type == ':') {
+                    $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
+                    $parameter = preg_replace($regexp, '\\1', $query);
+                    if ($parameter === '') {
+                        $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null,
+                            'named parameter name must match "bindname_format" option', __FUNCTION__);
+                        return $err;
+                    }
+                    $positions[$p_position] = $parameter;
+                    $query = substr_replace($query, '?', $position, strlen($parameter)+1);
+                    // use parameter name in type array
+                    if (isset($count) && isset($types_tmp[++$count])) {
+                        $types[$parameter] = $types_tmp[$count];
+                    }
+                } else {
+                    $positions[$p_position] = count($positions);
+                }
+                $position = $p_position + 1;
+            } else {
+                $position = $p_position;
+            }
+        }
+        $class_name = 'MDB2_Statement_'.$this->phptype;
+        $statement = null;
+        $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset);
+        $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj));
+        return $obj;
+    }
+
+    // }}}
+    // {{{ function _skipDelimitedStrings($query, $position, $p_position)
+
+    /**
+     * Utility method, used by prepare() to avoid replacing placeholders within delimited strings.
+     * Check if the placeholder is contained within a delimited string.
+     * If so, skip it and advance the position, otherwise return the current position,
+     * which is valid
+     *
+     * @param string $query
+     * @param integer $position current string cursor position
+     * @param integer $p_position placeholder position
+     *
+     * @return mixed integer $new_position on success
+     *               MDB2_Error on failure
+     *
+     * @access  protected
+     */
+    function _skipDelimitedStrings($query, $position, $p_position)
+    {
+        $ignores = array();
+        $ignores[] = $this->string_quoting;
+        $ignores[] = $this->identifier_quoting;
+        $ignores = array_merge($ignores, $this->sql_comments);
+
+        foreach ($ignores as $ignore) {
+            if (!empty($ignore['start'])) {
+                if (is_int($start_quote = strpos($query, $ignore['start'], $position)) && $start_quote < $p_position) {
+                    $end_quote = $start_quote;
+                    do {
+                        if (!is_int($end_quote = strpos($query, $ignore['end'], $end_quote + 1))) {
+                            if ($ignore['end'] === "\n") {
+                                $end_quote = strlen($query) - 1;
+                            } else {
+                                $err = MDB2_Driver_Common::raiseError(MDB2_ERROR_SYNTAX, null, null,
+                                    'query with an unterminated text string specified', __FUNCTION__);
+                                return $err;
+                            }
+                        }
+                    } while ($ignore['escape']
+                        && $end_quote-1 != $start_quote
+                        && $query[($end_quote - 1)] == $ignore['escape']
+                        && (   $ignore['escape_pattern'] !== $ignore['escape']
+                            || $query[($end_quote - 2)] != $ignore['escape'])
+                    );
+
+                    $position = $end_quote + 1;
+                    return $position;
+                }
+            }
+        }
+        return $position;
+    }
+
+    // }}}
+    // {{{ function quote($value, $type = null, $quote = true)
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param   string  text string value that is intended to be converted.
+     * @param   string  type to which the value should be converted to
+     * @param   bool    quote
+     * @param   bool    escape wildcards
+     *
+     * @return  string  text string that represents the given argument value in
+     *       a DBMS specific format.
+     *
+     * @access  public
+     */
+    function quote($value, $type = null, $quote = true, $escape_wildcards = false)
+    {
+        $result = $this->loadModule('Datatype', null, true);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+
+        return $this->datatype->quote($value, $type, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ function getDeclaration($type, $name, $field)
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare
+     * of the given type
+     *
+     * @param   string  type to which the value should be converted to
+     * @param   string  name the field to be declared.
+     * @param   string  definition of the field
+     *
+     * @return  string  DBMS specific SQL code portion that should be used to
+     *                 declare the specified field.
+     *
+     * @access  public
+     */
+    function getDeclaration($type, $name, $field)
+    {
+        $result = $this->loadModule('Datatype', null, true);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return $this->datatype->getDeclaration($type, $name, $field);
+    }
+
+    // }}}
+    // {{{ function compareDefinition($current, $previous)
+
+    /**
+     * Obtain an array of changes that may need to applied
+     *
+     * @param   array   new definition
+     * @param   array   old definition
+     *
+     * @return  array   containing all changes that will need to be applied
+     *
+     * @access  public
+     */
+    function compareDefinition($current, $previous)
+    {
+        $result = $this->loadModule('Datatype', null, true);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return $this->datatype->compareDefinition($current, $previous);
+    }
+
+    // }}}
+    // {{{ function supports($feature)
+
+    /**
+     * Tell whether a DB implementation or its backend extension
+     * supports a given feature.
+     *
+     * @param   string  name of the feature (see the MDB2 class doc)
+     *
+     * @return  bool|string if this DB implementation supports a given feature
+     *                      false means no, true means native,
+     *                      'emulated' means emulated
+     *
+     * @access  public
+     */
+    function supports($feature)
+    {
+        if (array_key_exists($feature, $this->supported)) {
+            return $this->supported[$feature];
+        }
+        return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            "unknown support feature $feature", __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function getSequenceName($sqn)
+
+    /**
+     * adds sequence name formatting to a sequence name
+     *
+     * @param   string  name of the sequence
+     *
+     * @return  string  formatted sequence name
+     *
+     * @access  public
+     */
+    function getSequenceName($sqn)
+    {
+        return sprintf($this->options['seqname_format'],
+            preg_replace('/[^a-z0-9_\-\$.]/i', '_', $sqn));
+    }
+
+    // }}}
+    // {{{ function getIndexName($idx)
+
+    /**
+     * adds index name formatting to a index name
+     *
+     * @param   string  name of the index
+     *
+     * @return  string  formatted index name
+     *
+     * @access  public
+     */
+    function getIndexName($idx)
+    {
+        return sprintf($this->options['idxname_format'],
+            preg_replace('/[^a-z0-9_\-\$.]/i', '_', $idx));
+    }
+
+    // }}}
+    // {{{ function nextID($seq_name, $ondemand = true)
+
+    /**
+     * Returns the next free id of a sequence
+     *
+     * @param   string  name of the sequence
+     * @param   bool    when true missing sequences are automatic created
+     *
+     * @return  mixed   MDB2 Error Object or id
+     *
+     * @access  public
+     */
+    function nextID($seq_name, $ondemand = true)
+    {
+        return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function lastInsertID($table = null, $field = null)
+
+    /**
+     * Returns the autoincrement ID if supported or $id or fetches the current
+     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
+     *
+     * @param   string  name of the table into which a new row was inserted
+     * @param   string  name of the field into which a new row was inserted
+     *
+     * @return  mixed   MDB2 Error Object or id
+     *
+     * @access  public
+     */
+    function lastInsertID($table = null, $field = null)
+    {
+        return MDB2_Driver_Common::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function currID($seq_name)
+
+    /**
+     * Returns the current id of a sequence
+     *
+     * @param   string  name of the sequence
+     *
+     * @return  mixed   MDB2 Error Object or id
+     *
+     * @access  public
+     */
+    function currID($seq_name)
+    {
+        $this->warnings[] = 'database does not support getting current
+            sequence value, the sequence value was incremented';
+        return $this->nextID($seq_name);
+    }
+
+    // }}}
+    // {{{ function queryOne($query, $type = null, $colnum = 0)
+
+    /**
+     * Execute the specified query, fetch the value from the first column of
+     * the first row of the result set and then frees
+     * the result set.
+     *
+     * @param string $query  the SELECT query statement to be executed.
+     * @param string $type   optional argument that specifies the expected
+     *                       datatype of the result set field, so that an eventual
+     *                       conversion may be performed. The default datatype is
+     *                       text, meaning that no conversion is performed
+     * @param mixed  $colnum the column number (or name) to fetch
+     *
+     * @return  mixed   MDB2_OK or field value on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function queryOne($query, $type = null, $colnum = 0)
+    {
+        $result = $this->query($query, $type);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $one = $result->fetchOne($colnum);
+        $result->free();
+        return $one;
+    }
+
+    // }}}
+    // {{{ function queryRow($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
+
+    /**
+     * Execute the specified query, fetch the values from the first
+     * row of the result set into an array and then frees
+     * the result set.
+     *
+     * @param   string  the SELECT query statement to be executed.
+     * @param   array   optional array argument that specifies a list of
+     *       expected datatypes of the result set columns, so that the eventual
+     *       conversions may be performed. The default list of datatypes is
+     *       empty, meaning that no conversion is performed.
+     * @param   int     how the array data should be indexed
+     *
+     * @return  mixed   MDB2_OK or data array on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function queryRow($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
+    {
+        $result = $this->query($query, $types);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $row = $result->fetchRow($fetchmode);
+        $result->free();
+        return $row;
+    }
+
+    // }}}
+    // {{{ function queryCol($query, $type = null, $colnum = 0)
+
+    /**
+     * Execute the specified query, fetch the value from the first column of
+     * each row of the result set into an array and then frees the result set.
+     *
+     * @param string $query  the SELECT query statement to be executed.
+     * @param string $type   optional argument that specifies the expected
+     *                       datatype of the result set field, so that an eventual
+     *                       conversion may be performed. The default datatype is text,
+     *                       meaning that no conversion is performed
+     * @param mixed  $colnum the column number (or name) to fetch
+     *
+     * @return  mixed   MDB2_OK or data array on success, a MDB2 error on failure
+     * @access  public
+     */
+    function queryCol($query, $type = null, $colnum = 0)
+    {
+        $result = $this->query($query, $type);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $col = $result->fetchCol($colnum);
+        $result->free();
+        return $col;
+    }
+
+    // }}}
+    // {{{ function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, $force_array = false, $group = false)
+
+    /**
+     * Execute the specified query, fetch all the rows of the result set into
+     * a two dimensional array and then frees the result set.
+     *
+     * @param   string  the SELECT query statement to be executed.
+     * @param   array   optional array argument that specifies a list of
+     *       expected datatypes of the result set columns, so that the eventual
+     *       conversions may be performed. The default list of datatypes is
+     *       empty, meaning that no conversion is performed.
+     * @param   int     how the array data should be indexed
+     * @param   bool    if set to true, the $all will have the first
+     *       column as its first dimension
+     * @param   bool    used only when the query returns exactly
+     *       two columns. If true, the values of the returned array will be
+     *       one-element arrays instead of scalars.
+     * @param   bool    if true, the values of the returned array is
+     *       wrapped in another array.  If the same key value (in the first
+     *       column) repeats itself, the values will be appended to this array
+     *       instead of overwriting the existing values.
+     *
+     * @return  mixed   MDB2_OK or data array on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT,
+        $rekey = false, $force_array = false, $group = false)
+    {
+        $result = $this->query($query, $types);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $all = $result->fetchAll($fetchmode, $rekey, $force_array, $group);
+        $result->free();
+        return $all;
+    }
+
+    // }}}
+    // {{{ function delExpect($error_code)
+
+    /**
+     * This method deletes all occurences of the specified element from
+     * the expected error codes stack.
+     *
+     * @param  mixed $error_code error code that should be deleted
+     * @return mixed list of error codes that were deleted or error
+     *
+     * @uses PEAR::delExpect()
+     */
+    public function delExpect($error_code)
+    {
+        return $this->pear->delExpect($error_code);
+    }
+
+    // }}}
+    // {{{ function expectError($code)
+
+    /**
+     * This method is used to tell which errors you expect to get.
+     * Expected errors are always returned with error mode
+     * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack,
+     * and this method pushes a new element onto it.  The list of
+     * expected errors are in effect until they are popped off the
+     * stack with the popExpect() method.
+     *
+     * Note that this method can not be called statically
+     *
+     * @param mixed $code a single error code or an array of error codes to expect
+     *
+     * @return int     the new depth of the "expected errors" stack
+     *
+     * @uses PEAR::expectError()
+     */
+    public function expectError($code = '*')
+    {
+        return $this->pear->expectError($code);
+    }
+
+    // }}}
+    // {{{ function getStaticProperty($class, $var)
+
+    /**
+     * If you have a class that's mostly/entirely static, and you need static
+     * properties, you can use this method to simulate them. Eg. in your method(s)
+     * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
+     * You MUST use a reference, or they will not persist!
+     *
+     * @param  string $class  The calling classname, to prevent clashes
+     * @param  string $var    The variable to retrieve.
+     * @return mixed   A reference to the variable. If not set it will be
+     *                 auto initialised to NULL.
+     *
+     * @uses PEAR::getStaticProperty()
+     */
+    public function &getStaticProperty($class, $var)
+    {
+        $tmp = $this->pear->getStaticProperty($class, $var);
+        return $tmp;
+    }
+
+    // }}}
+    // {{{ function loadExtension($ext)
+
+    /**
+     * OS independant PHP extension load. Remember to take care
+     * on the correct extension name for case sensitive OSes.
+     *
+     * @param string $ext The extension name
+     * @return bool Success or not on the dl() call
+     *
+     * @uses PEAR::loadExtension()
+     */
+    public function loadExtension($ext)
+    {
+        return $this->pear->loadExtension($ext);
+    }
+
+    // }}}
+    // {{{ function popErrorHandling()
+
+    /**
+     * Pop the last error handler used
+     *
+     * @return bool Always true
+     *
+     * @see PEAR::pushErrorHandling
+     * @uses PEAR::popErrorHandling()
+     */
+    public function popErrorHandling()
+    {
+        return $this->pear->popErrorHandling();
+    }
+
+    // }}}
+    // {{{ function popExpect()
+
+    /**
+     * This method pops one element off the expected error codes
+     * stack.
+     *
+     * @return array   the list of error codes that were popped
+     *
+     * @uses PEAR::popExpect()
+     */
+    public function popExpect()
+    {
+        return $this->pear->popExpect();
+    }
+
+    // }}}
+    // {{{ function pushErrorHandling($mode, $options = null)
+
+    /**
+     * Push a new error handler on top of the error handler options stack. With this
+     * you can easily override the actual error handler for some code and restore
+     * it later with popErrorHandling.
+     *
+     * @param mixed $mode (same as setErrorHandling)
+     * @param mixed $options (same as setErrorHandling)
+     *
+     * @return bool Always true
+     *
+     * @see PEAR::setErrorHandling
+     * @uses PEAR::pushErrorHandling()
+     */
+    public function pushErrorHandling($mode, $options = null)
+    {
+        return $this->pear->pushErrorHandling($mode, $options);
+    }
+
+    // }}}
+    // {{{ function registerShutdownFunc($func, $args = array())
+
+    /**
+     * Use this function to register a shutdown method for static
+     * classes.
+     *
+     * @param  mixed $func  The function name (or array of class/method) to call
+     * @param  mixed $args  The arguments to pass to the function
+     * @return void
+     *
+     * @uses PEAR::registerShutdownFunc()
+     */
+    public function registerShutdownFunc($func, $args = array())
+    {
+        return $this->pear->registerShutdownFunc($func, $args);
+    }
+
+    // }}}
+    // {{{ function setErrorHandling($mode = null, $options = null)
+
+    /**
+     * Sets how errors generated by this object should be handled.
+     * Can be invoked both in objects and statically.  If called
+     * statically, setErrorHandling sets the default behaviour for all
+     * PEAR objects.  If called in an object, setErrorHandling sets
+     * the default behaviour for that object.
+     *
+     * @param int $mode
+     *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+     *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+     *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
+     *
+     * @param mixed $options
+     *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
+     *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+     *
+     *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
+     *        to be the callback function or method.  A callback
+     *        function is a string with the name of the function, a
+     *        callback method is an array of two elements: the element
+     *        at index 0 is the object, and the element at index 1 is
+     *        the name of the method to call in the object.
+     *
+     *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
+     *        a printf format string used when printing the error
+     *        message.
+     *
+     * @access public
+     * @return void
+     * @see PEAR_ERROR_RETURN
+     * @see PEAR_ERROR_PRINT
+     * @see PEAR_ERROR_TRIGGER
+     * @see PEAR_ERROR_DIE
+     * @see PEAR_ERROR_CALLBACK
+     * @see PEAR_ERROR_EXCEPTION
+     *
+     * @since PHP 4.0.5
+     * @uses PEAR::setErrorHandling($mode, $options)
+     */
+    public function setErrorHandling($mode = null, $options = null)
+    {
+        return $this->pear->setErrorHandling($mode, $options);
+    }
+
+    /**
+     * @uses PEAR::staticPopErrorHandling() 
+     */
+    public function staticPopErrorHandling()
+    {
+        return $this->pear->staticPopErrorHandling();
+    }
+
+    // }}}
+    // {{{ function staticPushErrorHandling($mode, $options = null)
+
+    /**
+     * @uses PEAR::staticPushErrorHandling($mode, $options)
+     */
+    public function staticPushErrorHandling($mode, $options = null)
+    {
+        return $this->pear->staticPushErrorHandling($mode, $options);
+    }
+
+    // }}}
+    // {{{ function &throwError($message = null, $code = null, $userinfo = null)
+
+    /**
+     * Simpler form of raiseError with fewer options.  In most cases
+     * message, code and userinfo are enough.
+     *
+     * @param mixed $message a text error message or a PEAR error object
+     *
+     * @param int $code      a numeric error code (it is up to your class
+     *                  to define these if you want to use codes)
+     *
+     * @param string $userinfo If you need to pass along for example debug
+     *                  information, this parameter is meant for that.
+     *
+     * @return object   a PEAR error object
+     * @see PEAR::raiseError
+     * @uses PEAR::&throwError()
+     */
+    public function &throwError($message = null, $code = null, $userinfo = null)
+    {
+        $tmp = $this->pear->throwError($message, $code, $userinfo);
+        return $tmp;
+    }
+
+    // }}}
+}
+
+// }}}
+// {{{ class MDB2_Result
+
+/**
+ * The dummy class that all user space result classes should extend from
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Result
+{
+}
+
+// }}}
+// {{{ class MDB2_Result_Common extends MDB2_Result
+
+/**
+ * The common result class for MDB2 result objects
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Result_Common extends MDB2_Result
+{
+    // {{{ Variables (Properties)
+
+    public $db;
+    public $result;
+    public $rownum = -1;
+    public $types = array();
+    public $types_assoc = array();
+    public $values = array();
+    public $offset;
+    public $offset_count = 0;
+    public $limit;
+    public $column_names;
+
+    // }}}
+    // {{{ constructor: function __construct($db, &$result, $limit = 0, $offset = 0)
+
+    /**
+     * Constructor
+     */
+    function __construct($db, &$result, $limit = 0, $offset = 0)
+    {
+        $this->db = $db;
+        $this->result = $result;
+        $this->offset = $offset;
+        $this->limit = max(0, $limit - 1);
+    }
+
+    // }}}
+    // {{{ function setResultTypes($types)
+
+    /**
+     * Define the list of types to be associated with the columns of a given
+     * result set.
+     *
+     * This function may be called before invoking fetchRow(), fetchOne(),
+     * fetchCol() and fetchAll() so that the necessary data type
+     * conversions are performed on the data to be retrieved by them. If this
+     * function is not called, the type of all result set columns is assumed
+     * to be text, thus leading to not perform any conversions.
+     *
+     * @param   array   variable that lists the
+     *       data types to be expected in the result set columns. If this array
+     *       contains less types than the number of columns that are returned
+     *       in the result set, the remaining columns are assumed to be of the
+     *       type text. Currently, the types clob and blob are not fully
+     *       supported.
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function setResultTypes($types)
+    {
+        $load = $this->db->loadModule('Datatype', null, true);
+        if (MDB2::isError($load)) {
+            return $load;
+        }
+        $types = $this->db->datatype->checkResultTypes($types);
+        if (MDB2::isError($types)) {
+            return $types;
+        }
+        foreach ($types as $key => $value) {
+            if (is_numeric($key)) {
+                $this->types[$key] = $value;
+            } else {
+                $this->types_assoc[$key] = $value;
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function seek($rownum = 0)
+
+    /**
+     * Seek to a specific row in a result set
+     *
+     * @param   int     number of the row where the data can be found
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function seek($rownum = 0)
+    {
+        $target_rownum = $rownum - 1;
+        if ($this->rownum > $target_rownum) {
+            return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'seeking to previous rows not implemented', __FUNCTION__);
+        }
+        while ($this->rownum < $target_rownum) {
+            $this->fetchRow();
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
+
+    /**
+     * Fetch and return a row of data
+     *
+     * @param   int     how the array data should be indexed
+     * @param   int     number of the row where the data can be found
+     *
+     * @return  int     data array on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
+    {
+        $err = MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+        return $err;
+    }
+
+    // }}}
+    // {{{ function fetchOne($colnum = 0)
+
+    /**
+     * fetch single column from the next row from a result set
+     *
+     * @param int|string the column number (or name) to fetch
+     * @param int        number of the row where the data can be found
+     *
+     * @return string data on success, a MDB2 error on failure
+     * @access  public
+     */
+    function fetchOne($colnum = 0, $rownum = null)
+    {
+        $fetchmode = is_numeric($colnum) ? MDB2_FETCHMODE_ORDERED : MDB2_FETCHMODE_ASSOC;
+        $row = $this->fetchRow($fetchmode, $rownum);
+        if (!is_array($row) || MDB2::isError($row)) {
+            return $row;
+        }
+        if (!array_key_exists($colnum, $row)) {
+            return MDB2::raiseError(MDB2_ERROR_TRUNCATED, null, null,
+                'column is not defined in the result set: '.$colnum, __FUNCTION__);
+        }
+        return $row[$colnum];
+    }
+
+    // }}}
+    // {{{ function fetchCol($colnum = 0)
+
+    /**
+     * Fetch and return a column from the current row pointer position
+     *
+     * @param int|string the column number (or name) to fetch
+     *
+     * @return  mixed data array on success, a MDB2 error on failure
+     * @access  public
+     */
+    function fetchCol($colnum = 0)
+    {
+        $column = array();
+        $fetchmode = is_numeric($colnum) ? MDB2_FETCHMODE_ORDERED : MDB2_FETCHMODE_ASSOC;
+        $row = $this->fetchRow($fetchmode);
+        if (is_array($row)) {
+            if (!array_key_exists($colnum, $row)) {
+                return MDB2::raiseError(MDB2_ERROR_TRUNCATED, null, null,
+                    'column is not defined in the result set: '.$colnum, __FUNCTION__);
+            }
+            do {
+                $column[] = $row[$colnum];
+            } while (is_array($row = $this->fetchRow($fetchmode)));
+        }
+        if (MDB2::isError($row)) {
+            return $row;
+        }
+        return $column;
+    }
+
+    // }}}
+    // {{{ function fetchAll($fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false, $force_array = false, $group = false)
+
+    /**
+     * Fetch and return all rows from the current row pointer position
+     *
+     * @param   int     $fetchmode  the fetch mode to use:
+     *                            + MDB2_FETCHMODE_ORDERED
+     *                            + MDB2_FETCHMODE_ASSOC
+     *                            + MDB2_FETCHMODE_ORDERED | MDB2_FETCHMODE_FLIPPED
+     *                            + MDB2_FETCHMODE_ASSOC | MDB2_FETCHMODE_FLIPPED
+     * @param   bool    if set to true, the $all will have the first
+     *       column as its first dimension
+     * @param   bool    used only when the query returns exactly
+     *       two columns. If true, the values of the returned array will be
+     *       one-element arrays instead of scalars.
+     * @param   bool    if true, the values of the returned array is
+     *       wrapped in another array.  If the same key value (in the first
+     *       column) repeats itself, the values will be appended to this array
+     *       instead of overwriting the existing values.
+     *
+     * @return  mixed   data array on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @see     getAssoc()
+     */
+    function fetchAll($fetchmode = MDB2_FETCHMODE_DEFAULT, $rekey = false,
+        $force_array = false, $group = false)
+    {
+        $all = array();
+        $row = $this->fetchRow($fetchmode);
+        if (MDB2::isError($row)) {
+            return $row;
+        } elseif (!$row) {
+            return $all;
+        }
+
+        $shift_array = $rekey ? false : null;
+        if (null !== $shift_array) {
+            if (is_object($row)) {
+                $colnum = count(get_object_vars($row));
+            } else {
+                $colnum = count($row);
+            }
+            if ($colnum < 2) {
+                return MDB2::raiseError(MDB2_ERROR_TRUNCATED, null, null,
+                    'rekey feature requires atleast 2 column', __FUNCTION__);
+            }
+            $shift_array = (!$force_array && $colnum == 2);
+        }
+
+        if ($rekey) {
+            do {
+                if (is_object($row)) {
+                    $arr = get_object_vars($row);
+                    $key = reset($arr);
+                    unset($row->{$key});
+                } else {
+                    if (   $fetchmode == MDB2_FETCHMODE_ASSOC
+                        || $fetchmode == MDB2_FETCHMODE_OBJECT
+                    ) {
+                        $key = reset($row);
+                        unset($row[key($row)]);
+                    } else {
+                        $key = array_shift($row);
+                    }
+                    if ($shift_array) {
+                        $row = array_shift($row);
+                    }
+                }
+                if ($group) {
+                    $all[$key][] = $row;
+                } else {
+                    $all[$key] = $row;
+                }
+            } while (($row = $this->fetchRow($fetchmode)));
+        } elseif ($fetchmode == MDB2_FETCHMODE_FLIPPED) {
+            do {
+                foreach ($row as $key => $val) {
+                    $all[$key][] = $val;
+                }
+            } while (($row = $this->fetchRow($fetchmode)));
+        } else {
+            do {
+                $all[] = $row;
+            } while (($row = $this->fetchRow($fetchmode)));
+        }
+
+        return $all;
+    }
+
+    // }}}
+    // {{{ function rowCount()
+    /**
+     * Returns the actual row number that was last fetched (count from 0)
+     * @return  int
+     *
+     * @access  public
+     */
+    function rowCount()
+    {
+        return $this->rownum + 1;
+    }
+
+    // }}}
+    // {{{ function numRows()
+
+    /**
+     * Returns the number of rows in a result object
+     *
+     * @return  mixed   MDB2 Error Object or the number of rows
+     *
+     * @access  public
+     */
+    function numRows()
+    {
+        return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function nextResult()
+
+    /**
+     * Move the internal result pointer to the next available result
+     *
+     * @return  true on success, false if there is no more result set or an error object on failure
+     *
+     * @access  public
+     */
+    function nextResult()
+    {
+        return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function getColumnNames()
+
+    /**
+     * Retrieve the names of columns returned by the DBMS in a query result or
+     * from the cache.
+     *
+     * @param   bool    If set to true the values are the column names,
+     *                  otherwise the names of the columns are the keys.
+     * @return  mixed   Array variable that holds the names of columns or an
+     *                  MDB2 error on failure.
+     *                  Some DBMS may not return any columns when the result set
+     *                  does not contain any rows.
+     *
+     * @access  public
+     */
+    function getColumnNames($flip = false)
+    {
+        if (!isset($this->column_names)) {
+            $result = $this->_getColumnNames();
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            $this->column_names = $result;
+        }
+        if ($flip) {
+            return array_flip($this->column_names);
+        }
+        return $this->column_names;
+    }
+
+    // }}}
+    // {{{ function _getColumnNames()
+
+    /**
+     * Retrieve the names of columns returned by the DBMS in a query result.
+     *
+     * @return  mixed   Array variable that holds the names of columns as keys
+     *                  or an MDB2 error on failure.
+     *                  Some DBMS may not return any columns when the result set
+     *                  does not contain any rows.
+     *
+     * @access  private
+     */
+    function _getColumnNames()
+    {
+        return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function numCols()
+
+    /**
+     * Count the number of columns returned by the DBMS in a query result.
+     *
+     * @return  mixed   integer value with the number of columns, a MDB2 error
+     *       on failure
+     *
+     * @access  public
+     */
+    function numCols()
+    {
+        return MDB2::raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ function getResource()
+
+    /**
+     * return the resource associated with the result object
+     *
+     * @return  resource
+     *
+     * @access  public
+     */
+    function getResource()
+    {
+        return $this->result;
+    }
+
+    // }}}
+    // {{{ function bindColumn($column, &$value, $type = null)
+
+    /**
+     * Set bind variable to a column.
+     *
+     * @param   int     column number or name
+     * @param   mixed   variable reference
+     * @param   string  specifies the type of the field
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function bindColumn($column, &$value, $type = null)
+    {
+        if (!is_numeric($column)) {
+            $column_names = $this->getColumnNames();
+            if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($this->db->options['field_case'] == CASE_LOWER) {
+                    $column = strtolower($column);
+                } else {
+                    $column = strtoupper($column);
+                }
+            }
+            $column = $column_names[$column];
+        }
+        $this->values[$column] =& $value;
+        if (null !== $type) {
+            $this->types[$column] = $type;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function _assignBindColumns($row)
+
+    /**
+     * Bind a variable to a value in the result row.
+     *
+     * @param   array   row data
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  private
+     */
+    function _assignBindColumns($row)
+    {
+        $row = array_values($row);
+        foreach ($row as $column => $value) {
+            if (array_key_exists($column, $this->values)) {
+                $this->values[$column] = $value;
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function free()
+
+    /**
+     * Free the internal resources associated with result.
+     *
+     * @return  bool    true on success, false if result is invalid
+     *
+     * @access  public
+     */
+    function free()
+    {
+        $this->result = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+}
+
+// }}}
+// {{{ class MDB2_Row
+
+/**
+ * The simple class that accepts row data as an array
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Row
+{
+    // {{{ constructor: function __construct(&$row)
+
+    /**
+     * constructor
+     *
+     * @param   resource    row data as array
+     */
+    function __construct(&$row)
+    {
+        foreach ($row as $key => $value) {
+            $this->$key = &$row[$key];
+        }
+    }
+
+    // }}}
+}
+
+// }}}
+// {{{ class MDB2_Statement_Common
+
+/**
+ * The common statement class for MDB2 statement objects
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Statement_Common
+{
+    // {{{ Variables (Properties)
+
+    var $db;
+    var $statement;
+    var $query;
+    var $result_types;
+    var $types;
+    var $values = array();
+    var $limit;
+    var $offset;
+    var $is_manip;
+
+    // }}}
+    // {{{ constructor: function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null)
+
+    /**
+     * Constructor
+     */
+    function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null)
+    {
+        $this->db = $db;
+        $this->statement = $statement;
+        $this->positions = $positions;
+        $this->query = $query;
+        $this->types = (array)$types;
+        $this->result_types = (array)$result_types;
+        $this->limit = $limit;
+        $this->is_manip = $is_manip;
+        $this->offset = $offset;
+    }
+
+    // }}}
+    // {{{ function bindValue($parameter, &$value, $type = null)
+
+    /**
+     * Set the value of a parameter of a prepared query.
+     *
+     * @param   int     the order number of the parameter in the query
+     *       statement. The order number of the first parameter is 1.
+     * @param   mixed   value that is meant to be assigned to specified
+     *       parameter. The type of the value depends on the $type argument.
+     * @param   string  specifies the type of the field
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function bindValue($parameter, $value, $type = null)
+    {
+        if (!is_numeric($parameter)) {
+            if (strpos($parameter, ':') === 0) {
+                $parameter = substr($parameter, 1);
+            }
+        }
+        if (!in_array($parameter, $this->positions)) {
+            return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
+        }
+        $this->values[$parameter] = $value;
+        if (null !== $type) {
+            $this->types[$parameter] = $type;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function bindValueArray($values, $types = null)
+
+    /**
+     * Set the values of multiple a parameter of a prepared query in bulk.
+     *
+     * @param   array   specifies all necessary information
+     *       for bindValue() the array elements must use keys corresponding to
+     *       the number of the position of the parameter.
+     * @param   array   specifies the types of the fields
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @see     bindParam()
+     */
+    function bindValueArray($values, $types = null)
+    {
+        $types = is_array($types) ? array_values($types) : array_fill(0, count($values), null);
+        $parameters = array_keys($values);
+        $this->db->pushErrorHandling(PEAR_ERROR_RETURN);
+        $this->db->expectError(MDB2_ERROR_NOT_FOUND);
+        foreach ($parameters as $key => $parameter) {
+            $err = $this->bindValue($parameter, $values[$parameter], $types[$key]);
+            if (MDB2::isError($err)) {
+                if ($err->getCode() == MDB2_ERROR_NOT_FOUND) {
+                    //ignore (extra value for missing placeholder)
+                    continue;
+                }
+                $this->db->popExpect();
+                $this->db->popErrorHandling();
+                return $err;
+            }
+        }
+        $this->db->popExpect();
+        $this->db->popErrorHandling();
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function bindParam($parameter, &$value, $type = null)
+
+    /**
+     * Bind a variable to a parameter of a prepared query.
+     *
+     * @param   int     the order number of the parameter in the query
+     *       statement. The order number of the first parameter is 1.
+     * @param   mixed   variable that is meant to be bound to specified
+     *       parameter. The type of the value depends on the $type argument.
+     * @param   string  specifies the type of the field
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function bindParam($parameter, &$value, $type = null)
+    {
+        if (!is_numeric($parameter)) {
+            if (strpos($parameter, ':') === 0) {
+                $parameter = substr($parameter, 1);
+            }
+        }
+        if (!in_array($parameter, $this->positions)) {
+            return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
+        }
+        $this->values[$parameter] =& $value;
+        if (null !== $type) {
+            $this->types[$parameter] = $type;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function bindParamArray(&$values, $types = null)
+
+    /**
+     * Bind the variables of multiple a parameter of a prepared query in bulk.
+     *
+     * @param   array   specifies all necessary information
+     *       for bindParam() the array elements must use keys corresponding to
+     *       the number of the position of the parameter.
+     * @param   array   specifies the types of the fields
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @see     bindParam()
+     */
+    function bindParamArray(&$values, $types = null)
+    {
+        $types = is_array($types) ? array_values($types) : array_fill(0, count($values), null);
+        $parameters = array_keys($values);
+        foreach ($parameters as $key => $parameter) {
+            $err = $this->bindParam($parameter, $values[$parameter], $types[$key]);
+            if (MDB2::isError($err)) {
+                return $err;
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function &execute($values = null, $result_class = true, $result_wrap_class = false)
+
+    /**
+     * Execute a prepared query statement.
+     *
+     * @param array specifies all necessary information
+     *              for bindParam() the array elements must use keys corresponding
+     *              to the number of the position of the parameter.
+     * @param mixed specifies which result class to use
+     * @param mixed specifies which class to wrap results in
+     *
+     * @return mixed MDB2_Result or integer (affected rows) on success,
+     *               a MDB2 error on failure
+     * @access public
+     */
+    function execute($values = null, $result_class = true, $result_wrap_class = false)
+    {
+        if (null === $this->positions) {
+            return MDB2::raiseError(MDB2_ERROR, null, null,
+                'Prepared statement has already been freed', __FUNCTION__);
+        }
+
+        $values = (array)$values;
+        if (!empty($values)) {
+            $err = $this->bindValueArray($values);
+            if (MDB2::isError($err)) {
+                return MDB2::raiseError(MDB2_ERROR, null, null,
+                                            'Binding Values failed with message: ' . $err->getMessage(), __FUNCTION__);
+            }
+        }
+        $result = $this->_execute($result_class, $result_wrap_class);
+        return $result;
+    }
+
+    // }}}
+    // {{{ function _execute($result_class = true, $result_wrap_class = false)
+
+    /**
+     * Execute a prepared query statement helper method.
+     *
+     * @param   mixed   specifies which result class to use
+     * @param   mixed   specifies which class to wrap results in
+     *
+     * @return mixed MDB2_Result or integer (affected rows) on success,
+     *               a MDB2 error on failure
+     * @access  private
+     */
+    function _execute($result_class = true, $result_wrap_class = false)
+    {
+        $this->last_query = $this->query;
+        $query = '';
+        $last_position = 0;
+        foreach ($this->positions as $current_position => $parameter) {
+            if (!array_key_exists($parameter, $this->values)) {
+                return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                    'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
+            }
+            $value = $this->values[$parameter];
+            $query.= substr($this->query, $last_position, $current_position - $last_position);
+            if (!isset($value)) {
+                $value_quoted = 'NULL';
+            } else {
+                $type = !empty($this->types[$parameter]) ? $this->types[$parameter] : null;
+                $value_quoted = $this->db->quote($value, $type);
+                if (MDB2::isError($value_quoted)) {
+                    return $value_quoted;
+                }
+            }
+            $query.= $value_quoted;
+            $last_position = $current_position + 1;
+        }
+        $query.= substr($this->query, $last_position);
+
+        $this->db->offset = $this->offset;
+        $this->db->limit = $this->limit;
+        if ($this->is_manip) {
+            $result = $this->db->exec($query);
+        } else {
+            $result = $this->db->query($query, $this->result_types, $result_class, $result_wrap_class);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ function free()
+
+    /**
+     * Release resources allocated for the specified prepared query.
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function free()
+    {
+        if (null === $this->positions) {
+            return MDB2::raiseError(MDB2_ERROR, null, null,
+                'Prepared statement has already been freed', __FUNCTION__);
+        }
+
+        $this->statement = null;
+        $this->positions = null;
+        $this->query = null;
+        $this->types = null;
+        $this->result_types = null;
+        $this->limit = null;
+        $this->is_manip = null;
+        $this->offset = null;
+        $this->values = null;
+
+        return MDB2_OK;
+    }
+
+    // }}}
+}
+
+// }}}
+// {{{ class MDB2_Module_Common
+
+/**
+ * The common modules class for MDB2 module objects
+ *
+ * @package     MDB2
+ * @category    Database
+ * @author      Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Module_Common
+{
+    // {{{ Variables (Properties)
+
+    /**
+     * contains the key to the global MDB2 instance array of the associated
+     * MDB2 instance
+     *
+     * @var     int
+     * @access  protected
+     */
+    protected $db_index;
+
+    // }}}
+    // {{{ constructor: function __construct($db_index)
+
+    /**
+     * Constructor
+     */
+    function __construct($db_index)
+    {
+        $this->db_index = $db_index;
+    }
+
+    // }}}
+    // {{{ function getDBInstance()
+
+    /**
+     * Get the instance of MDB2 associated with the module instance
+     *
+     * @return  object  MDB2 instance or a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function getDBInstance()
+    {
+        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            $result = $GLOBALS['_MDB2_databases'][$this->db_index];
+        } else {
+            $result = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'could not find MDB2 instance');
+        }
+        return $result;
+    }
+
+    // }}}
+}
+
+// }}}
+// {{{ function MDB2_closeOpenTransactions()
+
+/**
+ * Close any open transactions form persistent connections
+ *
+ * @return  void
+ *
+ * @access  public
+ */
+
+function MDB2_closeOpenTransactions()
+{
+    reset($GLOBALS['_MDB2_databases']);
+    while (next($GLOBALS['_MDB2_databases'])) {
+        $key = key($GLOBALS['_MDB2_databases']);
+        if ($GLOBALS['_MDB2_databases'][$key]->opened_persistent
+            && $GLOBALS['_MDB2_databases'][$key]->in_transaction
+        ) {
+            $GLOBALS['_MDB2_databases'][$key]->rollback();
+        }
+    }
+}
+
+// }}}
+// {{{ function MDB2_defaultDebugOutput(&$db, $scope, $message, $is_manip = null)
+
+/**
+ * default debug output handler
+ *
+ * @param   object  reference to an MDB2 database object
+ * @param   string  usually the method name that triggered the debug call:
+ *                  for example 'query', 'prepare', 'execute', 'parameters',
+ *                  'beginTransaction', 'commit', 'rollback'
+ * @param   string  message that should be appended to the debug variable
+ * @param   array   contains context information about the debug() call
+ *                  common keys are: is_manip, time, result etc.
+ *
+ * @return  void|string optionally return a modified message, this allows
+ *                      rewriting a query before being issued or prepared
+ *
+ * @access  public
+ */
+function MDB2_defaultDebugOutput(&$db, $scope, $message, $context = array())
+{
+    $db->debug_output.= $scope.'('.$db->db_index.'): ';
+    $db->debug_output.= $message.$db->getOption('log_line_break');
+    return $message;
+}
+
+// }}}
+?>
diff --git a/3rdparty/MDB2/Date.php b/3rdparty/MDB2/Date.php
index d874531150f75a43c3763d380b74ae670a53ea48..ca88eaa347e6cc06a55f9d0fe56a76cc66d6373c 100644
--- a/3rdparty/MDB2/Date.php
+++ b/3rdparty/MDB2/Date.php
@@ -1,183 +1,183 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Date.php 208329 2006-03-01 12:15:38Z lsmith $
-//
-
-/**
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-
-/**
- * Several methods to convert the MDB2 native timestamp format (ISO based)
- * to and from data structures that are convenient to worth with in side of php.
- * For more complex date arithmetic please take a look at the Date package in PEAR
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Date
-{
-    // {{{ mdbNow()
-
-    /**
-     * return the current datetime
-     *
-     * @return string current datetime in the MDB2 format
-     * @access public
-     */
-    function mdbNow()
-    {
-        return date('Y-m-d H:i:s');
-    }
-    // }}}
-
-    // {{{ mdbToday()
-
-    /**
-     * return the current date
-     *
-     * @return string current date in the MDB2 format
-     * @access public
-     */
-    function mdbToday()
-    {
-        return date('Y-m-d');
-    }
-    // }}}
-
-    // {{{ mdbTime()
-
-    /**
-     * return the current time
-     *
-     * @return string current time in the MDB2 format
-     * @access public
-     */
-    function mdbTime()
-    {
-        return date('H:i:s');
-    }
-    // }}}
-
-    // {{{ date2Mdbstamp()
-
-    /**
-     * convert a date into a MDB2 timestamp
-     *
-     * @param int hour of the date
-     * @param int minute of the date
-     * @param int second of the date
-     * @param int month of the date
-     * @param int day of the date
-     * @param int year of the date
-     *
-     * @return string a valid MDB2 timestamp
-     * @access public
-     */
-    function date2Mdbstamp($hour = null, $minute = null, $second = null,
-        $month = null, $day = null, $year = null)
-    {
-        return MDB2_Date::unix2Mdbstamp(mktime($hour, $minute, $second, $month, $day, $year, -1));
-    }
-    // }}}
-
-    // {{{ unix2Mdbstamp()
-
-    /**
-     * convert a unix timestamp into a MDB2 timestamp
-     *
-     * @param int a valid unix timestamp
-     *
-     * @return string a valid MDB2 timestamp
-     * @access public
-     */
-    function unix2Mdbstamp($unix_timestamp)
-    {
-        return date('Y-m-d H:i:s', $unix_timestamp);
-    }
-    // }}}
-
-    // {{{ mdbstamp2Unix()
-
-    /**
-     * convert a MDB2 timestamp into a unix timestamp
-     *
-     * @param int a valid MDB2 timestamp
-     * @return string unix timestamp with the time stored in the MDB2 format
-     *
-     * @access public
-     */
-    function mdbstamp2Unix($mdb_timestamp)
-    {
-        $arr = MDB2_Date::mdbstamp2Date($mdb_timestamp);
-
-        return mktime($arr['hour'], $arr['minute'], $arr['second'], $arr['month'], $arr['day'], $arr['year'], -1);
-    }
-    // }}}
-
-    // {{{ mdbstamp2Date()
-
-    /**
-     * convert a MDB2 timestamp into an array containing all
-     * values necessary to pass to php's date() function
-     *
-     * @param int a valid MDB2 timestamp
-     *
-     * @return array with the time split
-     * @access public
-     */
-    function mdbstamp2Date($mdb_timestamp)
-    {
-        list($arr['year'], $arr['month'], $arr['day'], $arr['hour'], $arr['minute'], $arr['second']) =
-            sscanf($mdb_timestamp, "%04u-%02u-%02u %02u:%02u:%02u");
-        return $arr;
-    }
-    // }}}
-}
-
-?>
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+
+/**
+ * Several methods to convert the MDB2 native timestamp format (ISO based)
+ * to and from data structures that are convenient to worth with in side of php.
+ * For more complex date arithmetic please take a look at the Date package in PEAR
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Date
+{
+    // {{{ mdbNow()
+
+    /**
+     * return the current datetime
+     *
+     * @return string current datetime in the MDB2 format
+     * @access public
+     */
+    function mdbNow()
+    {
+        return date('Y-m-d H:i:s');
+    }
+    // }}}
+
+    // {{{ mdbToday()
+
+    /**
+     * return the current date
+     *
+     * @return string current date in the MDB2 format
+     * @access public
+     */
+    function mdbToday()
+    {
+        return date('Y-m-d');
+    }
+    // }}}
+
+    // {{{ mdbTime()
+
+    /**
+     * return the current time
+     *
+     * @return string current time in the MDB2 format
+     * @access public
+     */
+    function mdbTime()
+    {
+        return date('H:i:s');
+    }
+    // }}}
+
+    // {{{ date2Mdbstamp()
+
+    /**
+     * convert a date into a MDB2 timestamp
+     *
+     * @param int hour of the date
+     * @param int minute of the date
+     * @param int second of the date
+     * @param int month of the date
+     * @param int day of the date
+     * @param int year of the date
+     *
+     * @return string a valid MDB2 timestamp
+     * @access public
+     */
+    function date2Mdbstamp($hour = null, $minute = null, $second = null,
+        $month = null, $day = null, $year = null)
+    {
+        return MDB2_Date::unix2Mdbstamp(mktime($hour, $minute, $second, $month, $day, $year, -1));
+    }
+    // }}}
+
+    // {{{ unix2Mdbstamp()
+
+    /**
+     * convert a unix timestamp into a MDB2 timestamp
+     *
+     * @param int a valid unix timestamp
+     *
+     * @return string a valid MDB2 timestamp
+     * @access public
+     */
+    function unix2Mdbstamp($unix_timestamp)
+    {
+        return date('Y-m-d H:i:s', $unix_timestamp);
+    }
+    // }}}
+
+    // {{{ mdbstamp2Unix()
+
+    /**
+     * convert a MDB2 timestamp into a unix timestamp
+     *
+     * @param int a valid MDB2 timestamp
+     * @return string unix timestamp with the time stored in the MDB2 format
+     *
+     * @access public
+     */
+    function mdbstamp2Unix($mdb_timestamp)
+    {
+        $arr = MDB2_Date::mdbstamp2Date($mdb_timestamp);
+
+        return mktime($arr['hour'], $arr['minute'], $arr['second'], $arr['month'], $arr['day'], $arr['year'], -1);
+    }
+    // }}}
+
+    // {{{ mdbstamp2Date()
+
+    /**
+     * convert a MDB2 timestamp into an array containing all
+     * values necessary to pass to php's date() function
+     *
+     * @param int a valid MDB2 timestamp
+     *
+     * @return array with the time split
+     * @access public
+     */
+    function mdbstamp2Date($mdb_timestamp)
+    {
+        list($arr['year'], $arr['month'], $arr['day'], $arr['hour'], $arr['minute'], $arr['second']) =
+            sscanf($mdb_timestamp, "%04u-%02u-%02u %02u:%02u:%02u");
+        return $arr;
+    }
+    // }}}
+}
+
+?>
diff --git a/3rdparty/MDB2/Driver/Datatype/Common.php b/3rdparty/MDB2/Driver/Datatype/Common.php
index db0cb45dd892c023b452c2e4088faf4c394ce8d4..3b02c86acdaeb9e0aaacd352a20b76bbb7df6541 100644
--- a/3rdparty/MDB2/Driver/Datatype/Common.php
+++ b/3rdparty/MDB2/Driver/Datatype/Common.php
@@ -1,1841 +1,1842 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Common.php 300551 2010-06-17 21:54:16Z quipo $
-
-require_once 'MDB2/LOB.php';
-
-/**
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-
-/**
- * MDB2_Driver_Common: Base class that is extended by each MDB2 driver
- *
- * To load this module in the MDB2 object:
- * $mdb->loadModule('Datatype');
- *
- * @package MDB2
- * @category Database
- * @author Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
-{
-    var $valid_default_values = array(
-        'text'      => '',
-        'boolean'   => true,
-        'integer'   => 0,
-        'decimal'   => 0.0,
-        'float'     => 0.0,
-        'timestamp' => '1970-01-01 00:00:00',
-        'time'      => '00:00:00',
-        'date'      => '1970-01-01',
-        'clob'      => '',
-        'blob'      => '',
-    );
-
-    /**
-     * contains all LOB objects created with this MDB2 instance
-     * @var array
-     * @access protected
-     */
-    var $lobs = array();
-
-    // }}}
-    // {{{ getValidTypes()
-
-    /**
-     * Get the list of valid types
-     *
-     * This function returns an array of valid types as keys with the values
-     * being possible default values for all native datatypes and mapped types
-     * for custom datatypes.
-     *
-     * @return mixed array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getValidTypes()
-    {
-        $types = $this->valid_default_values;
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        if (!empty($db->options['datatype_map'])) {
-            foreach ($db->options['datatype_map'] as $type => $mapped_type) {
-                if (array_key_exists($mapped_type, $types)) {
-                    $types[$type] = $types[$mapped_type];
-                } elseif (!empty($db->options['datatype_map_callback'][$type])) {
-                    $parameter = array('type' => $type, 'mapped_type' => $mapped_type);
-                    $default =  call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-                    $types[$type] = $default;
-                }
-            }
-        }
-        return $types;
-    }
-
-    // }}}
-    // {{{ checkResultTypes()
-
-    /**
-     * Define the list of types to be associated with the columns of a given
-     * result set.
-     *
-     * This function may be called before invoking fetchRow(), fetchOne()
-     * fetchCole() and fetchAll() so that the necessary data type
-     * conversions are performed on the data to be retrieved by them. If this
-     * function is not called, the type of all result set columns is assumed
-     * to be text, thus leading to not perform any conversions.
-     *
-     * @param array $types array variable that lists the
-     *       data types to be expected in the result set columns. If this array
-     *       contains less types than the number of columns that are returned
-     *       in the result set, the remaining columns are assumed to be of the
-     *       type text. Currently, the types clob and blob are not fully
-     *       supported.
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function checkResultTypes($types)
-    {
-        $types = is_array($types) ? $types : array($types);
-        foreach ($types as $key => $type) {
-            if (!isset($this->valid_default_values[$type])) {
-                $db = $this->getDBInstance();
-                if (PEAR::isError($db)) {
-                    return $db;
-                }
-                if (empty($db->options['datatype_map'][$type])) {
-                    return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                        $type.' for '.$key.' is not a supported column type', __FUNCTION__);
-                }
-            }
-        }
-        return $types;
-    }
-
-    // }}}
-    // {{{ _baseConvertResult()
-
-    /**
-     * General type conversion method
-     *
-     * @param mixed   $value reference to a value to be converted
-     * @param string  $type  specifies which type to convert to
-     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
-     * @return object an MDB2 error on failure
-     * @access protected
-     */
-    function _baseConvertResult($value, $type, $rtrim = true)
-    {
-        switch ($type) {
-        case 'text':
-            if ($rtrim) {
-                $value = rtrim($value);
-            }
-            return $value;
-        case 'integer':
-            return intval($value);
-        case 'boolean':
-            return !empty($value);
-        case 'decimal':
-            return $value;
-        case 'float':
-            return doubleval($value);
-        case 'date':
-            return $value;
-        case 'time':
-            return $value;
-        case 'timestamp':
-            return $value;
-        case 'clob':
-        case 'blob':
-            $this->lobs[] = array(
-                'buffer' => null,
-                'position' => 0,
-                'lob_index' => null,
-                'endOfLOB' => false,
-                'resource' => $value,
-                'value' => null,
-                'loaded' => false,
-            );
-            end($this->lobs);
-            $lob_index = key($this->lobs);
-            $this->lobs[$lob_index]['lob_index'] = $lob_index;
-            return fopen('MDB2LOB://'.$lob_index.'@'.$this->db_index, 'r+');
-        }
-
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_INVALID, null, null,
-            'attempt to convert result value to an unknown type :' . $type, __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ convertResult()
-
-    /**
-     * Convert a value to a RDBMS indipendent MDB2 type
-     *
-     * @param mixed   $value value to be converted
-     * @param string  $type  specifies which type to convert to
-     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
-     * @return mixed converted value
-     * @access public
-     */
-    function convertResult($value, $type, $rtrim = true)
-    {
-        if (null === $value) {
-            return null;
-        }
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        if (!empty($db->options['datatype_map'][$type])) {
-            $type = $db->options['datatype_map'][$type];
-            if (!empty($db->options['datatype_map_callback'][$type])) {
-                $parameter = array('type' => $type, 'value' => $value, 'rtrim' => $rtrim);
-                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-            }
-        }
-        return $this->_baseConvertResult($value, $type, $rtrim);
-    }
-
-    // }}}
-    // {{{ convertResultRow()
-
-    /**
-     * Convert a result row
-     *
-     * @param array   $types
-     * @param array   $row   specifies the types to convert to
-     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
-     * @return mixed MDB2_OK on success, an MDB2 error on failure
-     * @access public
-     */
-    function convertResultRow($types, $row, $rtrim = true)
-    {
-        $types = $this->_sortResultFieldTypes(array_keys($row), $types);
-        foreach ($row as $key => $value) {
-            if (empty($types[$key])) {
-                continue;
-            }
-            $value = $this->convertResult($row[$key], $types[$key], $rtrim);
-            if (PEAR::isError($value)) {
-                return $value;
-            }
-            $row[$key] = $value;
-        }
-        return $row;
-    }
-
-    // }}}
-    // {{{ _sortResultFieldTypes()
-
-    /**
-     * convert a result row
-     *
-     * @param array $types
-     * @param array $row specifies the types to convert to
-     * @param bool   $rtrim   if to rtrim text values or not
-     * @return mixed MDB2_OK on success,  a MDB2 error on failure
-     * @access public
-     */
-    function _sortResultFieldTypes($columns, $types)
-    {
-        $n_cols = count($columns);
-        $n_types = count($types);
-        if ($n_cols > $n_types) {
-            for ($i= $n_cols - $n_types; $i >= 0; $i--) {
-                $types[] = null;
-            }
-        }
-        $sorted_types = array();
-        foreach ($columns as $col) {
-            $sorted_types[$col] = null;
-        }
-        foreach ($types as $name => $type) {
-            if (array_key_exists($name, $sorted_types)) {
-                $sorted_types[$name] = $type;
-                unset($types[$name]);
-            }
-        }
-        // if there are left types in the array, fill the null values of the
-        // sorted array with them, in order.
-        if (count($types)) {
-            reset($types);
-            foreach (array_keys($sorted_types) as $k) {
-                if (null === $sorted_types[$k]) {
-                    $sorted_types[$k] = current($types);
-                    next($types);
-                }
-            }
-        }
-        return $sorted_types;
-    }
-
-    // }}}
-    // {{{ getDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare
-     * of the given type
-     *
-     * @param string $type type to which the value should be converted to
-     * @param string  $name   name the field to be declared.
-     * @param string  $field  definition of the field
-     * @return string  DBMS specific SQL code portion that should be used to
-     *                 declare the specified field.
-     * @access public
-     */
-    function getDeclaration($type, $name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!empty($db->options['datatype_map'][$type])) {
-            $type = $db->options['datatype_map'][$type];
-            if (!empty($db->options['datatype_map_callback'][$type])) {
-                $parameter = array('type' => $type, 'name' => $name, 'field' => $field);
-                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-            }
-            $field['type'] = $type;
-        }
-
-        if (!method_exists($this, "_get{$type}Declaration")) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'type not defined: '.$type, __FUNCTION__);
-        }
-        return $this->{"_get{$type}Declaration"}($name, $field);
-    }
-
-    // }}}
-    // {{{ getTypeDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an text type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param array $field  associative array with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      length
-     *          Integer value that determines the maximum length of the text
-     *          field. If this argument is missing the field should be
-     *          declared to have the longest length allowed by the DBMS.
-     *
-     *      default
-     *          Text value to be used as default for this field.
-     *
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *      declare the specified field.
-     * @access public
-     */
-    function getTypeDeclaration($field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        switch ($field['type']) {
-        case 'text':
-            $length = !empty($field['length']) ? $field['length'] : $db->options['default_text_field_length'];
-            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
-            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')')
-                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
-        case 'clob':
-            return 'TEXT';
-        case 'blob':
-            return 'TEXT';
-        case 'integer':
-            return 'INT';
-        case 'boolean':
-            return 'INT';
-        case 'date':
-            return 'CHAR ('.strlen('YYYY-MM-DD').')';
-        case 'time':
-            return 'CHAR ('.strlen('HH:MM:SS').')';
-        case 'timestamp':
-            return 'CHAR ('.strlen('YYYY-MM-DD HH:MM:SS').')';
-        case 'float':
-            return 'TEXT';
-        case 'decimal':
-            return 'TEXT';
-        }
-        return '';
-    }
-
-    // }}}
-    // {{{ _getDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a generic type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name   name the field to be declared.
-     * @param array  $field  associative array with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      length
-     *          Integer value that determines the maximum length of the text
-     *          field. If this argument is missing the field should be
-     *          declared to have the longest length allowed by the DBMS.
-     *
-     *      default
-     *          Text value to be used as default for this field.
-     *
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     *      charset
-     *          Text value with the default CHARACTER SET for this field.
-     *      collation
-     *          Text value with the default COLLATION for this field.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *      declare the specified field, or a MDB2_Error on failure
-     * @access protected
-     */
-    function _getDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        $declaration_options = $db->datatype->_getDeclarationOptions($field);
-        if (PEAR::isError($declaration_options)) {
-            return $declaration_options;
-        }
-        return $name.' '.$this->getTypeDeclaration($field).$declaration_options;
-    }
-
-    // }}}
-    // {{{ _getDeclarationOptions()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a generic type
-     * field to be used in statement like CREATE TABLE, without the field name
-     * and type values (ie. just the character set, default value, if the
-     * field is permitted to be NULL or not, and the collation options).
-     *
-     * @param array  $field  associative array with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      default
-     *          Text value to be used as default for this field.
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     *      charset
-     *          Text value with the default CHARACTER SET for this field.
-     *      collation
-     *          Text value with the default COLLATION for this field.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *      declare the specified field's options.
-     * @access protected
-     */
-    function _getDeclarationOptions($field)
-    {
-        $charset = empty($field['charset']) ? '' :
-            ' '.$this->_getCharsetFieldDeclaration($field['charset']);
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        $default = '';
-        if (array_key_exists('default', $field)) {
-            if ($field['default'] === '') {
-                $db = $this->getDBInstance();
-                if (PEAR::isError($db)) {
-                    return $db;
-                }
-                $valid_default_values = $this->getValidTypes();
-                $field['default'] = $valid_default_values[$field['type']];
-                if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) {
-                    $field['default'] = ' ';
-                }
-            }
-            if (null !== $field['default']) {
-                $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']);
-            }
-        }
-        if (empty($default) && empty($notnull)) {
-            $default = ' DEFAULT NULL';
-        }
-
-        $collation = empty($field['collation']) ? '' :
-            ' '.$this->_getCollationFieldDeclaration($field['collation']);
-
-        return $charset.$default.$notnull.$collation;
-    }
-
-    // }}}
-    // {{{ _getCharsetFieldDeclaration()
-    
-    /**
-     * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
-     * of a field declaration to be used in statements like CREATE TABLE.
-     *
-     * @param string $charset   name of the charset
-     * @return string  DBMS specific SQL code portion needed to set the CHARACTER SET
-     *                 of a field declaration.
-     */
-    function _getCharsetFieldDeclaration($charset)
-    {
-        return '';
-    }
-
-    // }}}
-    // {{{ _getCollationFieldDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to set the COLLATION
-     * of a field declaration to be used in statements like CREATE TABLE.
-     *
-     * @param string $collation   name of the collation
-     * @return string  DBMS specific SQL code portion needed to set the COLLATION
-     *                 of a field declaration.
-     */
-    function _getCollationFieldDeclaration($collation)
-    {
-        return '';
-    }
-
-    // }}}
-    // {{{ _getIntegerDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an integer type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       unsigned
-     *           Boolean flag that indicates whether the field should be
-     *           declared as unsigned integer if possible.
-     *
-     *       default
-     *           Integer value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getIntegerDeclaration($name, $field)
-    {
-        if (!empty($field['unsigned'])) {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-
-            $db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer";
-        }
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getTextDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an text type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       length
-     *           Integer value that determines the maximum length of the text
-     *           field. If this argument is missing the field should be
-     *           declared to have the longest length allowed by the DBMS.
-     *
-     *       default
-     *           Text value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getTextDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getCLOBDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an character
-     * large object type field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *        of the field being declared as array indexes. Currently, the types
-     *        of supported field properties are as follows:
-     *
-     *        length
-     *            Integer value that determines the maximum length of the large
-     *            object field. If this argument is missing the field should be
-     *            declared to have the longest length allowed by the DBMS.
-     *
-     *        notnull
-     *            Boolean flag that indicates whether this field is constrained
-     *            to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *        declare the specified field.
-     * @access public
-     */
-    function _getCLOBDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        $name = $db->quoteIdentifier($name, true);
-        return $name.' '.$this->getTypeDeclaration($field).$notnull;
-    }
-
-    // }}}
-    // {{{ _getBLOBDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an binary large
-     * object type field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *        of the field being declared as array indexes. Currently, the types
-     *        of supported field properties are as follows:
-     *
-     *        length
-     *            Integer value that determines the maximum length of the large
-     *            object field. If this argument is missing the field should be
-     *            declared to have the longest length allowed by the DBMS.
-     *
-     *        notnull
-     *            Boolean flag that indicates whether this field is constrained
-     *            to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *        declare the specified field.
-     * @access protected
-     */
-    function _getBLOBDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        $name = $db->quoteIdentifier($name, true);
-        return $name.' '.$this->getTypeDeclaration($field).$notnull;
-    }
-
-    // }}}
-    // {{{ _getBooleanDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a boolean type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       default
-     *           Boolean value to be used as default for this field.
-     *
-     *       notnullL
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getBooleanDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getDateDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a date type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       default
-     *           Date value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getDateDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getTimestampDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a timestamp
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       default
-     *           Timestamp value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getTimestampDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getTimeDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a time
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       default
-     *           Time value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getTimeDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getFloatDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a float type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       default
-     *           Float value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getFloatDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getDecimalDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare a decimal type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       default
-     *           Decimal value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getDecimalDeclaration($name, $field)
-    {
-        return $this->_getDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ compareDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access public
-     */
-    function compareDefinition($current, $previous)
-    {
-        $type = !empty($current['type']) ? $current['type'] : null;
-
-        if (!method_exists($this, "_compare{$type}Definition")) {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            if (!empty($db->options['datatype_map_callback'][$type])) {
-                $parameter = array('current' => $current, 'previous' => $previous);
-                $change =  call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-                return $change;
-            }
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'type "'.$current['type'].'" is not yet supported', __FUNCTION__);
-        }
-
-        if (empty($previous['type']) || $previous['type'] != $type) {
-            return $current;
-        }
-
-        $change = $this->{"_compare{$type}Definition"}($current, $previous);
-
-        if ($previous['type'] != $type) {
-            $change['type'] = true;
-        }
-
-        $previous_notnull = !empty($previous['notnull']) ? $previous['notnull'] : false;
-        $notnull = !empty($current['notnull']) ? $current['notnull'] : false;
-        if ($previous_notnull != $notnull) {
-            $change['notnull'] = true;
-        }
-
-        $previous_default = array_key_exists('default', $previous) ? $previous['default'] :
-            ($previous_notnull ? '' : null);
-        $default = array_key_exists('default', $current) ? $current['default'] :
-            ($notnull ? '' : null);
-        if ($previous_default !== $default) {
-            $change['default'] = true;
-        }
-
-        return $change;
-    }
-
-    // }}}
-    // {{{ _compareIntegerDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an integer field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareIntegerDefinition($current, $previous)
-    {
-        $change = array();
-        $previous_unsigned = !empty($previous['unsigned']) ? $previous['unsigned'] : false;
-        $unsigned = !empty($current['unsigned']) ? $current['unsigned'] : false;
-        if ($previous_unsigned != $unsigned) {
-            $change['unsigned'] = true;
-        }
-        $previous_autoincrement = !empty($previous['autoincrement']) ? $previous['autoincrement'] : false;
-        $autoincrement = !empty($current['autoincrement']) ? $current['autoincrement'] : false;
-        if ($previous_autoincrement != $autoincrement) {
-            $change['autoincrement'] = true;
-        }
-        return $change;
-    }
-
-    // }}}
-    // {{{ _compareTextDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an text field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareTextDefinition($current, $previous)
-    {
-        $change = array();
-        $previous_length = !empty($previous['length']) ? $previous['length'] : 0;
-        $length = !empty($current['length']) ? $current['length'] : 0;
-        if ($previous_length != $length) {
-            $change['length'] = true;
-        }
-        $previous_fixed = !empty($previous['fixed']) ? $previous['fixed'] : 0;
-        $fixed = !empty($current['fixed']) ? $current['fixed'] : 0;
-        if ($previous_fixed != $fixed) {
-            $change['fixed'] = true;
-        }
-        return $change;
-    }
-
-    // }}}
-    // {{{ _compareCLOBDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an CLOB field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareCLOBDefinition($current, $previous)
-    {
-        return $this->_compareTextDefinition($current, $previous);
-    }
-
-    // }}}
-    // {{{ _compareBLOBDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an BLOB field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareBLOBDefinition($current, $previous)
-    {
-        return $this->_compareTextDefinition($current, $previous);
-    }
-
-    // }}}
-    // {{{ _compareDateDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an date field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareDateDefinition($current, $previous)
-    {
-        return array();
-    }
-
-    // }}}
-    // {{{ _compareTimeDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an time field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareTimeDefinition($current, $previous)
-    {
-        return array();
-    }
-
-    // }}}
-    // {{{ _compareTimestampDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an timestamp field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareTimestampDefinition($current, $previous)
-    {
-        return array();
-    }
-
-    // }}}
-    // {{{ _compareBooleanDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an boolean field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareBooleanDefinition($current, $previous)
-    {
-        return array();
-    }
-
-    // }}}
-    // {{{ _compareFloatDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an float field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareFloatDefinition($current, $previous)
-    {
-        return array();
-    }
-
-    // }}}
-    // {{{ _compareDecimalDefinition()
-
-    /**
-     * Obtain an array of changes that may need to applied to an decimal field
-     *
-     * @param array $current new definition
-     * @param array  $previous old definition
-     * @return array  containing all changes that will need to be applied
-     * @access protected
-     */
-    function _compareDecimalDefinition($current, $previous)
-    {
-        return array();
-    }
-
-    // }}}
-    // {{{ quote()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param string $type type to which the value should be converted to
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access public
-     */
-    function quote($value, $type = null, $quote = true, $escape_wildcards = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if ((null === $value)
-            || ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)
-        ) {
-            if (!$quote) {
-                return null;
-            }
-            return 'NULL';
-        }
-
-        if (null === $type) {
-            switch (gettype($value)) {
-            case 'integer':
-                $type = 'integer';
-                break;
-            case 'double':
-                // todo: default to decimal as float is quite unusual
-                // $type = 'float';
-                $type = 'decimal';
-                break;
-            case 'boolean':
-                $type = 'boolean';
-                break;
-            case 'array':
-                 $value = serialize($value);
-            case 'object':
-                 $type = 'text';
-                break;
-            default:
-                if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $value)) {
-                    $type = 'timestamp';
-                } elseif (preg_match('/^\d{2}:\d{2}$/', $value)) {
-                    $type = 'time';
-                } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) {
-                    $type = 'date';
-                } else {
-                    $type = 'text';
-                }
-                break;
-            }
-        } elseif (!empty($db->options['datatype_map'][$type])) {
-            $type = $db->options['datatype_map'][$type];
-            if (!empty($db->options['datatype_map_callback'][$type])) {
-                $parameter = array('type' => $type, 'value' => $value, 'quote' => $quote, 'escape_wildcards' => $escape_wildcards);
-                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-            }
-        }
-
-        if (!method_exists($this, "_quote{$type}")) {
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'type not defined: '.$type, __FUNCTION__);
-        }
-        $value = $this->{"_quote{$type}"}($value, $quote, $escape_wildcards);
-        if ($quote && $escape_wildcards && $db->string_quoting['escape_pattern']
-            && $db->string_quoting['escape'] !== $db->string_quoting['escape_pattern']
-        ) {
-            $value.= $this->patternEscapeString();
-        }
-        return $value;
-    }
-
-    // }}}
-    // {{{ _quoteInteger()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteInteger($value, $quote, $escape_wildcards)
-    {
-        return (int)$value;
-    }
-
-    // }}}
-    // {{{ _quoteText()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that already contains any DBMS specific
-     *       escaped character sequences.
-     * @access protected
-     */
-    function _quoteText($value, $quote, $escape_wildcards)
-    {
-        if (!$quote) {
-            return $value;
-        }
-
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $value = $db->escape($value, $escape_wildcards);
-        if (PEAR::isError($value)) {
-            return $value;
-        }
-        return "'".$value."'";
-    }
-
-    // }}}
-    // {{{ _readFile()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _readFile($value)
-    {
-        $close = false;
-        if (preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
-            $close = true;
-            if (strtolower($match[1]) == 'file://') {
-                $value = $match[2];
-            }
-            $value = @fopen($value, 'r');
-        }
-
-        if (is_resource($value)) {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-
-            $fp = $value;
-            $value = '';
-            while (!@feof($fp)) {
-                $value.= @fread($fp, $db->options['lob_buffer_length']);
-            }
-            if ($close) {
-                @fclose($fp);
-            }
-        }
-
-        return $value;
-    }
-
-    // }}}
-    // {{{ _quoteLOB()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteLOB($value, $quote, $escape_wildcards)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        if ($db->options['lob_allow_url_include']) {
-            $value = $this->_readFile($value);
-            if (PEAR::isError($value)) {
-                return $value;
-            }
-        }
-        return $this->_quoteText($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteCLOB()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteCLOB($value, $quote, $escape_wildcards)
-    {
-        return $this->_quoteLOB($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteBLOB()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteBLOB($value, $quote, $escape_wildcards)
-    {
-        return $this->_quoteLOB($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteBoolean()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteBoolean($value, $quote, $escape_wildcards)
-    {
-        return ($value ? 1 : 0);
-    }
-
-    // }}}
-    // {{{ _quoteDate()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteDate($value, $quote, $escape_wildcards)
-    {
-        if ($value === 'CURRENT_DATE') {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            if (isset($db->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) {
-                return $db->function->now('date');
-            }
-            return 'CURRENT_DATE';
-        }
-        return $this->_quoteText($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteTimestamp()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteTimestamp($value, $quote, $escape_wildcards)
-    {
-        if ($value === 'CURRENT_TIMESTAMP') {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            if (isset($db->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) {
-                return $db->function->now('timestamp');
-            }
-            return 'CURRENT_TIMESTAMP';
-        }
-        return $this->_quoteText($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteTime()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     *       compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteTime($value, $quote, $escape_wildcards)
-    {
-        if ($value === 'CURRENT_TIME') {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            if (isset($db->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) {
-                return $db->function->now('time');
-            }
-            return 'CURRENT_TIME';
-        }
-        return $this->_quoteText($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteFloat()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteFloat($value, $quote, $escape_wildcards)
-    {
-        if (preg_match('/^(.*)e([-+])(\d+)$/i', $value, $matches)) {
-            $decimal = $this->_quoteDecimal($matches[1], $quote, $escape_wildcards);
-            $sign = $matches[2];
-            $exponent = str_pad($matches[3], 2, '0', STR_PAD_LEFT);
-            $value = $decimal.'E'.$sign.$exponent;
-        } else {
-            $value = $this->_quoteDecimal($value, $quote, $escape_wildcards);
-        }
-        return $value;
-    }
-
-    // }}}
-    // {{{ _quoteDecimal()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteDecimal($value, $quote, $escape_wildcards)
-    {
-        $value = (string)$value;
-        $value = preg_replace('/[^\d\.,\-+eE]/', '', $value);
-        if (preg_match('/[^\.\d]/', $value)) {
-            if (strpos($value, ',')) {
-                // 1000,00
-                if (!strpos($value, '.')) {
-                    // convert the last "," to a "."
-                    $value = strrev(str_replace(',', '.', strrev($value)));
-                // 1.000,00
-                } elseif (strpos($value, '.') && strpos($value, '.') < strpos($value, ',')) {
-                    $value = str_replace('.', '', $value);
-                    // convert the last "," to a "."
-                    $value = strrev(str_replace(',', '.', strrev($value)));
-                // 1,000.00
-                } else {
-                    $value = str_replace(',', '', $value);
-                }
-            }
-        }
-        return $value;
-    }
-
-    // }}}
-    // {{{ writeLOBToFile()
-
-    /**
-     * retrieve LOB from the database
-     *
-     * @param resource $lob stream handle
-     * @param string $file name of the file into which the LOb should be fetched
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access protected
-     */
-    function writeLOBToFile($lob, $file)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) {
-            if ($match[1] == 'file://') {
-                $file = $match[2];
-            }
-        }
-
-        $fp = @fopen($file, 'wb');
-        while (!@feof($lob)) {
-            $result = @fread($lob, $db->options['lob_buffer_length']);
-            $read = strlen($result);
-            if (@fwrite($fp, $result, $read) != $read) {
-                @fclose($fp);
-                return $db->raiseError(MDB2_ERROR, null, null,
-                    'could not write to the output file', __FUNCTION__);
-            }
-        }
-        @fclose($fp);
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ _retrieveLOB()
-
-    /**
-     * retrieve LOB from the database
-     *
-     * @param array $lob array
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access protected
-     */
-    function _retrieveLOB(&$lob)
-    {
-        if (null === $lob['value']) {
-            $lob['value'] = $lob['resource'];
-        }
-        $lob['loaded'] = true;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ readLOB()
-
-    /**
-     * Read data from large object input stream.
-     *
-     * @param resource $lob stream handle
-     * @param string $data reference to a variable that will hold data
-     *                          to be read from the large object input stream
-     * @param integer $length    value that indicates the largest ammount ofdata
-     *                          to be read from the large object input stream.
-     * @return mixed the effective number of bytes read from the large object
-     *                      input stream on sucess or an MDB2 error object.
-     * @access public
-     * @see endOfLOB()
-     */
-    function _readLOB($lob, $length)
-    {
-        return substr($lob['value'], $lob['position'], $length);
-    }
-
-    // }}}
-    // {{{ _endOfLOB()
-
-    /**
-     * Determine whether it was reached the end of the large object and
-     * therefore there is no more data to be read for the its input stream.
-     *
-     * @param array $lob array
-     * @return mixed true or false on success, a MDB2 error on failure
-     * @access protected
-     */
-    function _endOfLOB($lob)
-    {
-        return $lob['endOfLOB'];
-    }
-
-    // }}}
-    // {{{ destroyLOB()
-
-    /**
-     * Free any resources allocated during the lifetime of the large object
-     * handler object.
-     *
-     * @param resource $lob stream handle
-     * @access public
-     */
-    function destroyLOB($lob)
-    {
-        $lob_data = stream_get_meta_data($lob);
-        $lob_index = $lob_data['wrapper_data']->lob_index;
-        fclose($lob);
-        if (isset($this->lobs[$lob_index])) {
-            $this->_destroyLOB($this->lobs[$lob_index]);
-            unset($this->lobs[$lob_index]);
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ _destroyLOB()
-
-    /**
-     * Free any resources allocated during the lifetime of the large object
-     * handler object.
-     *
-     * @param array $lob array
-     * @access private
-     */
-    function _destroyLOB(&$lob)
-    {
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ implodeArray()
-
-    /**
-     * apply a type to all values of an array and return as a comma seperated string
-     * useful for generating IN statements
-     *
-     * @access public
-     *
-     * @param array $array data array
-     * @param string $type determines type of the field
-     *
-     * @return string comma seperated values
-     */
-    function implodeArray($array, $type = false)
-    {
-        if (!is_array($array) || empty($array)) {
-            return 'NULL';
-        }
-        if ($type) {
-            foreach ($array as $value) {
-                $return[] = $this->quote($value, $type);
-            }
-        } else {
-            $return = $array;
-        }
-        return implode(', ', $return);
-    }
-
-    // }}}
-    // {{{ matchPattern()
-
-    /**
-     * build a pattern matching string
-     *
-     * @access public
-     *
-     * @param array $pattern even keys are strings, odd are patterns (% and _)
-     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
-     * @param string $field optional field name that is being matched against
-     *                  (might be required when emulating ILIKE)
-     *
-     * @return string SQL pattern
-     */
-    function matchPattern($pattern, $operator = null, $field = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $match = '';
-        if (null !== $operator) {
-            $operator = strtoupper($operator);
-            switch ($operator) {
-            // case insensitive
-            case 'ILIKE':
-                if (null === $field) {
-                    return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                        'case insensitive LIKE matching requires passing the field name', __FUNCTION__);
-                }
-                $db->loadModule('Function', null, true);
-                $match = $db->function->lower($field).' LIKE ';
-                break;
-            case 'NOT ILIKE':
-                if (null === $field) {
-                    return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                        'case insensitive NOT ILIKE matching requires passing the field name', __FUNCTION__);
-                }
-                $db->loadModule('Function', null, true);
-                $match = $db->function->lower($field).' NOT LIKE ';
-                break;
-            // case sensitive
-            case 'LIKE':
-                $match = (null === $field) ? 'LIKE ' : ($field.' LIKE ');
-                break;
-            case 'NOT LIKE':
-                $match = (null === $field) ? 'NOT LIKE ' : ($field.' NOT LIKE ');
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'not a supported operator type:'. $operator, __FUNCTION__);
-            }
-        }
-        $match.= "'";
-        foreach ($pattern as $key => $value) {
-            if ($key % 2) {
-                $match.= $value;
-            } else {
-                $escaped = $db->escape($value);
-                if (PEAR::isError($escaped)) {
-                    return $escaped;
-                }
-                $match.= $db->escapePattern($escaped);
-            }
-        }
-        $match.= "'";
-        $match.= $this->patternEscapeString();
-        return $match;
-    }
-
-    // }}}
-    // {{{ patternEscapeString()
-
-    /**
-     * build string to define pattern escape character
-     *
-     * @access public
-     *
-     * @return string define pattern escape character
-     */
-    function patternEscapeString()
-    {
-        return '';
-    }
-
-    // }}}
-    // {{{ mapNativeDatatype()
-
-    /**
-     * Maps a native array description of a field to a MDB2 datatype and length
-     *
-     * @param array  $field native field description
-     * @return array containing the various possible types, length, sign, fixed
-     * @access public
-     */
-    function mapNativeDatatype($field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        // If the user has specified an option to map the native field
-        // type to a custom MDB2 datatype...
-        $db_type = strtok($field['type'], '(), ');
-        if (!empty($db->options['nativetype_map_callback'][$db_type])) {
-            return call_user_func_array($db->options['nativetype_map_callback'][$db_type], array($db, $field));
-        }
-
-        // Otherwise perform the built-in (i.e. normal) MDB2 native type to
-        // MDB2 datatype conversion
-        return $this->_mapNativeDatatype($field);
-    }
-
-    // }}}
-    // {{{ _mapNativeDatatype()
-
-    /**
-     * Maps a native array description of a field to a MDB2 datatype and length
-     *
-     * @param array  $field native field description
-     * @return array containing the various possible types, length, sign, fixed
-     * @access public
-     */
-    function _mapNativeDatatype($field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ mapPrepareDatatype()
-
-    /**
-     * Maps an mdb2 datatype to mysqli prepare type
-     *
-     * @param string $type
-     * @return string
-     * @access public
-     */
-    function mapPrepareDatatype($type)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!empty($db->options['datatype_map'][$type])) {
-            $type = $db->options['datatype_map'][$type];
-            if (!empty($db->options['datatype_map_callback'][$type])) {
-                $parameter = array('type' => $type);
-                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-            }
-        }
-
-        return $type;
-    }
-}
-?>
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+require_once 'MDB2/LOB.php';
+
+/**
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+
+/**
+ * MDB2_Driver_Common: Base class that is extended by each MDB2 driver
+ *
+ * To load this module in the MDB2 object:
+ * $mdb->loadModule('Datatype');
+ *
+ * @package MDB2
+ * @category Database
+ * @author Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
+{
+    var $valid_default_values = array(
+        'text'      => '',
+        'boolean'   => true,
+        'integer'   => 0,
+        'decimal'   => 0.0,
+        'float'     => 0.0,
+        'timestamp' => '1970-01-01 00:00:00',
+        'time'      => '00:00:00',
+        'date'      => '1970-01-01',
+        'clob'      => '',
+        'blob'      => '',
+    );
+
+    /**
+     * contains all LOB objects created with this MDB2 instance
+     * @var array
+     * @access protected
+     */
+    var $lobs = array();
+
+    // }}}
+    // {{{ getValidTypes()
+
+    /**
+     * Get the list of valid types
+     *
+     * This function returns an array of valid types as keys with the values
+     * being possible default values for all native datatypes and mapped types
+     * for custom datatypes.
+     *
+     * @return mixed array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getValidTypes()
+    {
+        $types = $this->valid_default_values;
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        if (!empty($db->options['datatype_map'])) {
+            foreach ($db->options['datatype_map'] as $type => $mapped_type) {
+                if (array_key_exists($mapped_type, $types)) {
+                    $types[$type] = $types[$mapped_type];
+                } elseif (!empty($db->options['datatype_map_callback'][$type])) {
+                    $parameter = array('type' => $type, 'mapped_type' => $mapped_type);
+                    $default =  call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+                    $types[$type] = $default;
+                }
+            }
+        }
+        return $types;
+    }
+
+    // }}}
+    // {{{ checkResultTypes()
+
+    /**
+     * Define the list of types to be associated with the columns of a given
+     * result set.
+     *
+     * This function may be called before invoking fetchRow(), fetchOne()
+     * fetchCole() and fetchAll() so that the necessary data type
+     * conversions are performed on the data to be retrieved by them. If this
+     * function is not called, the type of all result set columns is assumed
+     * to be text, thus leading to not perform any conversions.
+     *
+     * @param array $types array variable that lists the
+     *       data types to be expected in the result set columns. If this array
+     *       contains less types than the number of columns that are returned
+     *       in the result set, the remaining columns are assumed to be of the
+     *       type text. Currently, the types clob and blob are not fully
+     *       supported.
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function checkResultTypes($types)
+    {
+        $types = is_array($types) ? $types : array($types);
+        foreach ($types as $key => $type) {
+            if (!isset($this->valid_default_values[$type])) {
+                $db = $this->getDBInstance();
+                if (PEAR::isError($db)) {
+                    return $db;
+                }
+                if (empty($db->options['datatype_map'][$type])) {
+                    return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                        $type.' for '.$key.' is not a supported column type', __FUNCTION__);
+                }
+            }
+        }
+        return $types;
+    }
+
+    // }}}
+    // {{{ _baseConvertResult()
+
+    /**
+     * General type conversion method
+     *
+     * @param mixed   $value reference to a value to be converted
+     * @param string  $type  specifies which type to convert to
+     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
+     * @return object an MDB2 error on failure
+     * @access protected
+     */
+    function _baseConvertResult($value, $type, $rtrim = true)
+    {
+        switch ($type) {
+        case 'text':
+            if ($rtrim) {
+                $value = rtrim($value);
+            }
+            return $value;
+        case 'integer':
+            return intval($value);
+        case 'boolean':
+            return !empty($value);
+        case 'decimal':
+            return $value;
+        case 'float':
+            return doubleval($value);
+        case 'date':
+            return $value;
+        case 'time':
+            return $value;
+        case 'timestamp':
+            return $value;
+        case 'clob':
+        case 'blob':
+            $this->lobs[] = array(
+                'buffer' => null,
+                'position' => 0,
+                'lob_index' => null,
+                'endOfLOB' => false,
+                'resource' => $value,
+                'value' => null,
+                'loaded' => false,
+            );
+            end($this->lobs);
+            $lob_index = key($this->lobs);
+            $this->lobs[$lob_index]['lob_index'] = $lob_index;
+            return fopen('MDB2LOB://'.$lob_index.'@'.$this->db_index, 'r+');
+        }
+
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_INVALID, null, null,
+            'attempt to convert result value to an unknown type :' . $type, __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ convertResult()
+
+    /**
+     * Convert a value to a RDBMS indipendent MDB2 type
+     *
+     * @param mixed   $value value to be converted
+     * @param string  $type  specifies which type to convert to
+     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
+     * @return mixed converted value
+     * @access public
+     */
+    function convertResult($value, $type, $rtrim = true)
+    {
+        if (null === $value) {
+            return null;
+        }
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        if (!empty($db->options['datatype_map'][$type])) {
+            $type = $db->options['datatype_map'][$type];
+            if (!empty($db->options['datatype_map_callback'][$type])) {
+                $parameter = array('type' => $type, 'value' => $value, 'rtrim' => $rtrim);
+                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+            }
+        }
+        return $this->_baseConvertResult($value, $type, $rtrim);
+    }
+
+    // }}}
+    // {{{ convertResultRow()
+
+    /**
+     * Convert a result row
+     *
+     * @param array   $types
+     * @param array   $row   specifies the types to convert to
+     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
+     * @return mixed MDB2_OK on success, an MDB2 error on failure
+     * @access public
+     */
+    function convertResultRow($types, $row, $rtrim = true)
+    {
+        //$types = $this->_sortResultFieldTypes(array_keys($row), $types);
+        $keys = array_keys($row);
+        if (is_int($keys[0])) {
+            $types = $this->_sortResultFieldTypes($keys, $types);
+        }
+        foreach ($row as $key => $value) {
+            if (empty($types[$key])) {
+                continue;
+            }
+            $value = $this->convertResult($row[$key], $types[$key], $rtrim);
+            if (PEAR::isError($value)) {
+                return $value;
+            }
+            $row[$key] = $value;
+        }
+        return $row;
+    }
+
+    // }}}
+    // {{{ _sortResultFieldTypes()
+
+    /**
+     * convert a result row
+     *
+     * @param array $types
+     * @param array $row specifies the types to convert to
+     * @param bool   $rtrim   if to rtrim text values or not
+     * @return mixed MDB2_OK on success,  a MDB2 error on failure
+     * @access public
+     */
+    function _sortResultFieldTypes($columns, $types)
+    {
+        $n_cols = count($columns);
+        $n_types = count($types);
+        if ($n_cols > $n_types) {
+            for ($i= $n_cols - $n_types; $i >= 0; $i--) {
+                $types[] = null;
+            }
+        }
+        $sorted_types = array();
+        foreach ($columns as $col) {
+            $sorted_types[$col] = null;
+        }
+        foreach ($types as $name => $type) {
+            if (array_key_exists($name, $sorted_types)) {
+                $sorted_types[$name] = $type;
+                unset($types[$name]);
+            }
+        }
+        // if there are left types in the array, fill the null values of the
+        // sorted array with them, in order.
+        if (count($types)) {
+            reset($types);
+            foreach (array_keys($sorted_types) as $k) {
+                if (null === $sorted_types[$k]) {
+                    $sorted_types[$k] = current($types);
+                    next($types);
+                }
+            }
+        }
+        return $sorted_types;
+    }
+
+    // }}}
+    // {{{ getDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare
+     * of the given type
+     *
+     * @param string $type type to which the value should be converted to
+     * @param string  $name   name the field to be declared.
+     * @param string  $field  definition of the field
+     * @return string  DBMS specific SQL code portion that should be used to
+     *                 declare the specified field.
+     * @access public
+     */
+    function getDeclaration($type, $name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!empty($db->options['datatype_map'][$type])) {
+            $type = $db->options['datatype_map'][$type];
+            if (!empty($db->options['datatype_map_callback'][$type])) {
+                $parameter = array('type' => $type, 'name' => $name, 'field' => $field);
+                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+            }
+            $field['type'] = $type;
+        }
+
+        if (!method_exists($this, "_get{$type}Declaration")) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'type not defined: '.$type, __FUNCTION__);
+        }
+        return $this->{"_get{$type}Declaration"}($name, $field);
+    }
+
+    // }}}
+    // {{{ getTypeDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an text type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param array $field  associative array with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      length
+     *          Integer value that determines the maximum length of the text
+     *          field. If this argument is missing the field should be
+     *          declared to have the longest length allowed by the DBMS.
+     *
+     *      default
+     *          Text value to be used as default for this field.
+     *
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *      declare the specified field.
+     * @access public
+     */
+    function getTypeDeclaration($field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        switch ($field['type']) {
+        case 'text':
+            $length = !empty($field['length']) ? $field['length'] : $db->options['default_text_field_length'];
+            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
+            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')')
+                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
+        case 'clob':
+            return 'TEXT';
+        case 'blob':
+            return 'TEXT';
+        case 'integer':
+            return 'INT';
+        case 'boolean':
+            return 'INT';
+        case 'date':
+            return 'CHAR ('.strlen('YYYY-MM-DD').')';
+        case 'time':
+            return 'CHAR ('.strlen('HH:MM:SS').')';
+        case 'timestamp':
+            return 'CHAR ('.strlen('YYYY-MM-DD HH:MM:SS').')';
+        case 'float':
+            return 'TEXT';
+        case 'decimal':
+            return 'TEXT';
+        }
+        return '';
+    }
+
+    // }}}
+    // {{{ _getDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a generic type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name   name the field to be declared.
+     * @param array  $field  associative array with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      length
+     *          Integer value that determines the maximum length of the text
+     *          field. If this argument is missing the field should be
+     *          declared to have the longest length allowed by the DBMS.
+     *
+     *      default
+     *          Text value to be used as default for this field.
+     *
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     *      charset
+     *          Text value with the default CHARACTER SET for this field.
+     *      collation
+     *          Text value with the default COLLATION for this field.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *      declare the specified field, or a MDB2_Error on failure
+     * @access protected
+     */
+    function _getDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $declaration_options = $db->datatype->_getDeclarationOptions($field);
+        if (PEAR::isError($declaration_options)) {
+            return $declaration_options;
+        }
+        return $name.' '.$this->getTypeDeclaration($field).$declaration_options;
+    }
+
+    // }}}
+    // {{{ _getDeclarationOptions()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a generic type
+     * field to be used in statement like CREATE TABLE, without the field name
+     * and type values (ie. just the character set, default value, if the
+     * field is permitted to be NULL or not, and the collation options).
+     *
+     * @param array  $field  associative array with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      default
+     *          Text value to be used as default for this field.
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     *      charset
+     *          Text value with the default CHARACTER SET for this field.
+     *      collation
+     *          Text value with the default COLLATION for this field.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *      declare the specified field's options.
+     * @access protected
+     */
+    function _getDeclarationOptions($field)
+    {
+        $charset = empty($field['charset']) ? '' :
+            ' '.$this->_getCharsetFieldDeclaration($field['charset']);
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        $default = '';
+        if (array_key_exists('default', $field)) {
+            if ($field['default'] === '') {
+                $db = $this->getDBInstance();
+                if (PEAR::isError($db)) {
+                    return $db;
+                }
+                $valid_default_values = $this->getValidTypes();
+                $field['default'] = $valid_default_values[$field['type']];
+                if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) {
+                    $field['default'] = ' ';
+                }
+            }
+            if (null !== $field['default']) {
+                $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']);
+            }
+        }
+
+        $collation = empty($field['collation']) ? '' :
+            ' '.$this->_getCollationFieldDeclaration($field['collation']);
+
+        return $charset.$default.$notnull.$collation;
+    }
+
+    // }}}
+    // {{{ _getCharsetFieldDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
+     * of a field declaration to be used in statements like CREATE TABLE.
+     *
+     * @param string $charset   name of the charset
+     * @return string  DBMS specific SQL code portion needed to set the CHARACTER SET
+     *                 of a field declaration.
+     */
+    function _getCharsetFieldDeclaration($charset)
+    {
+        return '';
+    }
+
+    // }}}
+    // {{{ _getCollationFieldDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to set the COLLATION
+     * of a field declaration to be used in statements like CREATE TABLE.
+     *
+     * @param string $collation   name of the collation
+     * @return string  DBMS specific SQL code portion needed to set the COLLATION
+     *                 of a field declaration.
+     */
+    function _getCollationFieldDeclaration($collation)
+    {
+        return '';
+    }
+
+    // }}}
+    // {{{ _getIntegerDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an integer type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       unsigned
+     *           Boolean flag that indicates whether the field should be
+     *           declared as unsigned integer if possible.
+     *
+     *       default
+     *           Integer value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getIntegerDeclaration($name, $field)
+    {
+        if (!empty($field['unsigned'])) {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+
+            $db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer";
+        }
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getTextDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an text type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       length
+     *           Integer value that determines the maximum length of the text
+     *           field. If this argument is missing the field should be
+     *           declared to have the longest length allowed by the DBMS.
+     *
+     *       default
+     *           Text value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getTextDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getCLOBDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an character
+     * large object type field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *        of the field being declared as array indexes. Currently, the types
+     *        of supported field properties are as follows:
+     *
+     *        length
+     *            Integer value that determines the maximum length of the large
+     *            object field. If this argument is missing the field should be
+     *            declared to have the longest length allowed by the DBMS.
+     *
+     *        notnull
+     *            Boolean flag that indicates whether this field is constrained
+     *            to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *        declare the specified field.
+     * @access public
+     */
+    function _getCLOBDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        $name = $db->quoteIdentifier($name, true);
+        return $name.' '.$this->getTypeDeclaration($field).$notnull;
+    }
+
+    // }}}
+    // {{{ _getBLOBDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an binary large
+     * object type field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *        of the field being declared as array indexes. Currently, the types
+     *        of supported field properties are as follows:
+     *
+     *        length
+     *            Integer value that determines the maximum length of the large
+     *            object field. If this argument is missing the field should be
+     *            declared to have the longest length allowed by the DBMS.
+     *
+     *        notnull
+     *            Boolean flag that indicates whether this field is constrained
+     *            to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *        declare the specified field.
+     * @access protected
+     */
+    function _getBLOBDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        $name = $db->quoteIdentifier($name, true);
+        return $name.' '.$this->getTypeDeclaration($field).$notnull;
+    }
+
+    // }}}
+    // {{{ _getBooleanDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a boolean type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       default
+     *           Boolean value to be used as default for this field.
+     *
+     *       notnullL
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getBooleanDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getDateDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a date type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       default
+     *           Date value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getDateDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getTimestampDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a timestamp
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       default
+     *           Timestamp value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getTimestampDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getTimeDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a time
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       default
+     *           Time value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getTimeDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getFloatDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a float type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       default
+     *           Float value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getFloatDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getDecimalDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare a decimal type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       default
+     *           Decimal value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getDecimalDeclaration($name, $field)
+    {
+        return $this->_getDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ compareDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access public
+     */
+    function compareDefinition($current, $previous)
+    {
+        $type = !empty($current['type']) ? $current['type'] : null;
+
+        if (!method_exists($this, "_compare{$type}Definition")) {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            if (!empty($db->options['datatype_map_callback'][$type])) {
+                $parameter = array('current' => $current, 'previous' => $previous);
+                $change =  call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+                return $change;
+            }
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'type "'.$current['type'].'" is not yet supported', __FUNCTION__);
+        }
+
+        if (empty($previous['type']) || $previous['type'] != $type) {
+            return $current;
+        }
+
+        $change = $this->{"_compare{$type}Definition"}($current, $previous);
+
+        if ($previous['type'] != $type) {
+            $change['type'] = true;
+        }
+
+        $previous_notnull = !empty($previous['notnull']) ? $previous['notnull'] : false;
+        $notnull = !empty($current['notnull']) ? $current['notnull'] : false;
+        if ($previous_notnull != $notnull) {
+            $change['notnull'] = true;
+        }
+
+        $previous_default = array_key_exists('default', $previous) ? $previous['default'] :
+            ($previous_notnull ? '' : null);
+        $default = array_key_exists('default', $current) ? $current['default'] :
+            ($notnull ? '' : null);
+        if ($previous_default !== $default) {
+            $change['default'] = true;
+        }
+
+        return $change;
+    }
+
+    // }}}
+    // {{{ _compareIntegerDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an integer field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareIntegerDefinition($current, $previous)
+    {
+        $change = array();
+        $previous_unsigned = !empty($previous['unsigned']) ? $previous['unsigned'] : false;
+        $unsigned = !empty($current['unsigned']) ? $current['unsigned'] : false;
+        if ($previous_unsigned != $unsigned) {
+            $change['unsigned'] = true;
+        }
+        $previous_autoincrement = !empty($previous['autoincrement']) ? $previous['autoincrement'] : false;
+        $autoincrement = !empty($current['autoincrement']) ? $current['autoincrement'] : false;
+        if ($previous_autoincrement != $autoincrement) {
+            $change['autoincrement'] = true;
+        }
+        return $change;
+    }
+
+    // }}}
+    // {{{ _compareTextDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an text field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareTextDefinition($current, $previous)
+    {
+        $change = array();
+        $previous_length = !empty($previous['length']) ? $previous['length'] : 0;
+        $length = !empty($current['length']) ? $current['length'] : 0;
+        if ($previous_length != $length) {
+            $change['length'] = true;
+        }
+        $previous_fixed = !empty($previous['fixed']) ? $previous['fixed'] : 0;
+        $fixed = !empty($current['fixed']) ? $current['fixed'] : 0;
+        if ($previous_fixed != $fixed) {
+            $change['fixed'] = true;
+        }
+        return $change;
+    }
+
+    // }}}
+    // {{{ _compareCLOBDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an CLOB field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareCLOBDefinition($current, $previous)
+    {
+        return $this->_compareTextDefinition($current, $previous);
+    }
+
+    // }}}
+    // {{{ _compareBLOBDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an BLOB field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareBLOBDefinition($current, $previous)
+    {
+        return $this->_compareTextDefinition($current, $previous);
+    }
+
+    // }}}
+    // {{{ _compareDateDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an date field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareDateDefinition($current, $previous)
+    {
+        return array();
+    }
+
+    // }}}
+    // {{{ _compareTimeDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an time field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareTimeDefinition($current, $previous)
+    {
+        return array();
+    }
+
+    // }}}
+    // {{{ _compareTimestampDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an timestamp field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareTimestampDefinition($current, $previous)
+    {
+        return array();
+    }
+
+    // }}}
+    // {{{ _compareBooleanDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an boolean field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareBooleanDefinition($current, $previous)
+    {
+        return array();
+    }
+
+    // }}}
+    // {{{ _compareFloatDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an float field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareFloatDefinition($current, $previous)
+    {
+        return array();
+    }
+
+    // }}}
+    // {{{ _compareDecimalDefinition()
+
+    /**
+     * Obtain an array of changes that may need to applied to an decimal field
+     *
+     * @param array $current new definition
+     * @param array  $previous old definition
+     * @return array  containing all changes that will need to be applied
+     * @access protected
+     */
+    function _compareDecimalDefinition($current, $previous)
+    {
+        return array();
+    }
+
+    // }}}
+    // {{{ quote()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param string $type type to which the value should be converted to
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access public
+     */
+    function quote($value, $type = null, $quote = true, $escape_wildcards = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if ((null === $value)
+            || ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)
+        ) {
+            if (!$quote) {
+                return null;
+            }
+            return 'NULL';
+        }
+
+        if (null === $type) {
+            switch (gettype($value)) {
+            case 'integer':
+                $type = 'integer';
+                break;
+            case 'double':
+                // todo: default to decimal as float is quite unusual
+                // $type = 'float';
+                $type = 'decimal';
+                break;
+            case 'boolean':
+                $type = 'boolean';
+                break;
+            case 'array':
+                 $value = serialize($value);
+            case 'object':
+                 $type = 'text';
+                break;
+            default:
+                if (preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}$/', $value)) {
+                    $type = 'timestamp';
+                } elseif (preg_match('/^\d{2}:\d{2}$/', $value)) {
+                    $type = 'time';
+                } elseif (preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) {
+                    $type = 'date';
+                } else {
+                    $type = 'text';
+                }
+                break;
+            }
+        } elseif (!empty($db->options['datatype_map'][$type])) {
+            $type = $db->options['datatype_map'][$type];
+            if (!empty($db->options['datatype_map_callback'][$type])) {
+                $parameter = array('type' => $type, 'value' => $value, 'quote' => $quote, 'escape_wildcards' => $escape_wildcards);
+                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+            }
+        }
+
+        if (!method_exists($this, "_quote{$type}")) {
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'type not defined: '.$type, __FUNCTION__);
+        }
+        $value = $this->{"_quote{$type}"}($value, $quote, $escape_wildcards);
+        if ($quote && $escape_wildcards && $db->string_quoting['escape_pattern']
+            && $db->string_quoting['escape'] !== $db->string_quoting['escape_pattern']
+        ) {
+            $value.= $this->patternEscapeString();
+        }
+        return $value;
+    }
+
+    // }}}
+    // {{{ _quoteInteger()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteInteger($value, $quote, $escape_wildcards)
+    {
+        return (int)$value;
+    }
+
+    // }}}
+    // {{{ _quoteText()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that already contains any DBMS specific
+     *       escaped character sequences.
+     * @access protected
+     */
+    function _quoteText($value, $quote, $escape_wildcards)
+    {
+        if (!$quote) {
+            return $value;
+        }
+
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $value = $db->escape($value, $escape_wildcards);
+        if (PEAR::isError($value)) {
+            return $value;
+        }
+        return "'".$value."'";
+    }
+
+    // }}}
+    // {{{ _readFile()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _readFile($value)
+    {
+        $close = false;
+        if (preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
+            $close = true;
+            if (strtolower($match[1]) == 'file://') {
+                $value = $match[2];
+            }
+            $value = @fopen($value, 'r');
+        }
+
+        if (is_resource($value)) {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+
+            $fp = $value;
+            $value = '';
+            while (!@feof($fp)) {
+                $value.= @fread($fp, $db->options['lob_buffer_length']);
+            }
+            if ($close) {
+                @fclose($fp);
+            }
+        }
+
+        return $value;
+    }
+
+    // }}}
+    // {{{ _quoteLOB()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteLOB($value, $quote, $escape_wildcards)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        if ($db->options['lob_allow_url_include']) {
+            $value = $this->_readFile($value);
+            if (PEAR::isError($value)) {
+                return $value;
+            }
+        }
+        return $this->_quoteText($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteCLOB()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteCLOB($value, $quote, $escape_wildcards)
+    {
+        return $this->_quoteLOB($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteBLOB()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteBLOB($value, $quote, $escape_wildcards)
+    {
+        return $this->_quoteLOB($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteBoolean()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteBoolean($value, $quote, $escape_wildcards)
+    {
+        return ($value ? 1 : 0);
+    }
+
+    // }}}
+    // {{{ _quoteDate()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteDate($value, $quote, $escape_wildcards)
+    {
+        if ($value === 'CURRENT_DATE') {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) {
+                return $db->function->now('date');
+            }
+            return 'CURRENT_DATE';
+        }
+        return $this->_quoteText($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteTimestamp()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteTimestamp($value, $quote, $escape_wildcards)
+    {
+        if ($value === 'CURRENT_TIMESTAMP') {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) {
+                return $db->function->now('timestamp');
+            }
+            return 'CURRENT_TIMESTAMP';
+        }
+        return $this->_quoteText($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteTime()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     *       compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteTime($value, $quote, $escape_wildcards)
+    {
+        if ($value === 'CURRENT_TIME') {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) {
+                return $db->function->now('time');
+            }
+            return 'CURRENT_TIME';
+        }
+        return $this->_quoteText($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteFloat()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteFloat($value, $quote, $escape_wildcards)
+    {
+        if (preg_match('/^(.*)e([-+])(\d+)$/i', $value, $matches)) {
+            $decimal = $this->_quoteDecimal($matches[1], $quote, $escape_wildcards);
+            $sign = $matches[2];
+            $exponent = str_pad($matches[3], 2, '0', STR_PAD_LEFT);
+            $value = $decimal.'E'.$sign.$exponent;
+        } else {
+            $value = $this->_quoteDecimal($value, $quote, $escape_wildcards);
+        }
+        return $value;
+    }
+
+    // }}}
+    // {{{ _quoteDecimal()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteDecimal($value, $quote, $escape_wildcards)
+    {
+        $value = (string)$value;
+        $value = preg_replace('/[^\d\.,\-+eE]/', '', $value);
+        if (preg_match('/[^\.\d]/', $value)) {
+            if (strpos($value, ',')) {
+                // 1000,00
+                if (!strpos($value, '.')) {
+                    // convert the last "," to a "."
+                    $value = strrev(str_replace(',', '.', strrev($value)));
+                // 1.000,00
+                } elseif (strpos($value, '.') && strpos($value, '.') < strpos($value, ',')) {
+                    $value = str_replace('.', '', $value);
+                    // convert the last "," to a "."
+                    $value = strrev(str_replace(',', '.', strrev($value)));
+                // 1,000.00
+                } else {
+                    $value = str_replace(',', '', $value);
+                }
+            }
+        }
+        return $value;
+    }
+
+    // }}}
+    // {{{ writeLOBToFile()
+
+    /**
+     * retrieve LOB from the database
+     *
+     * @param resource $lob stream handle
+     * @param string $file name of the file into which the LOb should be fetched
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access protected
+     */
+    function writeLOBToFile($lob, $file)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) {
+            if ($match[1] == 'file://') {
+                $file = $match[2];
+            }
+        }
+
+        $fp = @fopen($file, 'wb');
+        while (!@feof($lob)) {
+            $result = @fread($lob, $db->options['lob_buffer_length']);
+            $read = strlen($result);
+            if (@fwrite($fp, $result, $read) != $read) {
+                @fclose($fp);
+                return $db->raiseError(MDB2_ERROR, null, null,
+                    'could not write to the output file', __FUNCTION__);
+            }
+        }
+        @fclose($fp);
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ _retrieveLOB()
+
+    /**
+     * retrieve LOB from the database
+     *
+     * @param array $lob array
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access protected
+     */
+    function _retrieveLOB(&$lob)
+    {
+        if (null === $lob['value']) {
+            $lob['value'] = $lob['resource'];
+        }
+        $lob['loaded'] = true;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ readLOB()
+
+    /**
+     * Read data from large object input stream.
+     *
+     * @param resource $lob stream handle
+     * @param string $data reference to a variable that will hold data
+     *                          to be read from the large object input stream
+     * @param integer $length    value that indicates the largest ammount ofdata
+     *                          to be read from the large object input stream.
+     * @return mixed the effective number of bytes read from the large object
+     *                      input stream on sucess or an MDB2 error object.
+     * @access public
+     * @see endOfLOB()
+     */
+    function _readLOB($lob, $length)
+    {
+        return substr($lob['value'], $lob['position'], $length);
+    }
+
+    // }}}
+    // {{{ _endOfLOB()
+
+    /**
+     * Determine whether it was reached the end of the large object and
+     * therefore there is no more data to be read for the its input stream.
+     *
+     * @param array $lob array
+     * @return mixed true or false on success, a MDB2 error on failure
+     * @access protected
+     */
+    function _endOfLOB($lob)
+    {
+        return $lob['endOfLOB'];
+    }
+
+    // }}}
+    // {{{ destroyLOB()
+
+    /**
+     * Free any resources allocated during the lifetime of the large object
+     * handler object.
+     *
+     * @param resource $lob stream handle
+     * @access public
+     */
+    function destroyLOB($lob)
+    {
+        $lob_data = stream_get_meta_data($lob);
+        $lob_index = $lob_data['wrapper_data']->lob_index;
+        fclose($lob);
+        if (isset($this->lobs[$lob_index])) {
+            $this->_destroyLOB($this->lobs[$lob_index]);
+            unset($this->lobs[$lob_index]);
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ _destroyLOB()
+
+    /**
+     * Free any resources allocated during the lifetime of the large object
+     * handler object.
+     *
+     * @param array $lob array
+     * @access private
+     */
+    function _destroyLOB(&$lob)
+    {
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ implodeArray()
+
+    /**
+     * apply a type to all values of an array and return as a comma seperated string
+     * useful for generating IN statements
+     *
+     * @access public
+     *
+     * @param array $array data array
+     * @param string $type determines type of the field
+     *
+     * @return string comma seperated values
+     */
+    function implodeArray($array, $type = false)
+    {
+        if (!is_array($array) || empty($array)) {
+            return 'NULL';
+        }
+        if ($type) {
+            foreach ($array as $value) {
+                $return[] = $this->quote($value, $type);
+            }
+        } else {
+            $return = $array;
+        }
+        return implode(', ', $return);
+    }
+
+    // }}}
+    // {{{ matchPattern()
+
+    /**
+     * build a pattern matching string
+     *
+     * @access public
+     *
+     * @param array $pattern even keys are strings, odd are patterns (% and _)
+     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
+     * @param string $field optional field name that is being matched against
+     *                  (might be required when emulating ILIKE)
+     *
+     * @return string SQL pattern
+     */
+    function matchPattern($pattern, $operator = null, $field = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $match = '';
+        if (null !== $operator) {
+            $operator = strtoupper($operator);
+            switch ($operator) {
+            // case insensitive
+            case 'ILIKE':
+                if (null === $field) {
+                    return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                        'case insensitive LIKE matching requires passing the field name', __FUNCTION__);
+                }
+                $db->loadModule('Function', null, true);
+                $match = $db->function->lower($field).' LIKE ';
+                break;
+            case 'NOT ILIKE':
+                if (null === $field) {
+                    return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                        'case insensitive NOT ILIKE matching requires passing the field name', __FUNCTION__);
+                }
+                $db->loadModule('Function', null, true);
+                $match = $db->function->lower($field).' NOT LIKE ';
+                break;
+            // case sensitive
+            case 'LIKE':
+                $match = (null === $field) ? 'LIKE ' : ($field.' LIKE ');
+                break;
+            case 'NOT LIKE':
+                $match = (null === $field) ? 'NOT LIKE ' : ($field.' NOT LIKE ');
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'not a supported operator type:'. $operator, __FUNCTION__);
+            }
+        }
+        $match.= "'";
+        foreach ($pattern as $key => $value) {
+            if ($key % 2) {
+                $match.= $value;
+            } else {
+                $escaped = $db->escape($value);
+                if (PEAR::isError($escaped)) {
+                    return $escaped;
+                }
+                $match.= $db->escapePattern($escaped);
+            }
+        }
+        $match.= "'";
+        $match.= $this->patternEscapeString();
+        return $match;
+    }
+
+    // }}}
+    // {{{ patternEscapeString()
+
+    /**
+     * build string to define pattern escape character
+     *
+     * @access public
+     *
+     * @return string define pattern escape character
+     */
+    function patternEscapeString()
+    {
+        return '';
+    }
+
+    // }}}
+    // {{{ mapNativeDatatype()
+
+    /**
+     * Maps a native array description of a field to a MDB2 datatype and length
+     *
+     * @param array  $field native field description
+     * @return array containing the various possible types, length, sign, fixed
+     * @access public
+     */
+    function mapNativeDatatype($field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        // If the user has specified an option to map the native field
+        // type to a custom MDB2 datatype...
+        $db_type = strtok($field['type'], '(), ');
+        if (!empty($db->options['nativetype_map_callback'][$db_type])) {
+            return call_user_func_array($db->options['nativetype_map_callback'][$db_type], array($db, $field));
+        }
+
+        // Otherwise perform the built-in (i.e. normal) MDB2 native type to
+        // MDB2 datatype conversion
+        return $this->_mapNativeDatatype($field);
+    }
+
+    // }}}
+    // {{{ _mapNativeDatatype()
+
+    /**
+     * Maps a native array description of a field to a MDB2 datatype and length
+     *
+     * @param array  $field native field description
+     * @return array containing the various possible types, length, sign, fixed
+     * @access public
+     */
+    function _mapNativeDatatype($field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ mapPrepareDatatype()
+
+    /**
+     * Maps an mdb2 datatype to mysqli prepare type
+     *
+     * @param string $type
+     * @return string
+     * @access public
+     */
+    function mapPrepareDatatype($type)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!empty($db->options['datatype_map'][$type])) {
+            $type = $db->options['datatype_map'][$type];
+            if (!empty($db->options['datatype_map_callback'][$type])) {
+                $parameter = array('type' => $type);
+                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+            }
+        }
+
+        return $type;
+    }
+}
+?>
diff --git a/3rdparty/MDB2/Driver/Datatype/mysql.php b/3rdparty/MDB2/Driver/Datatype/mysql.php
index 299901ae6e713b043c121dfccdb650361a3f7700..d23eed23ff7c5f4aada016fbdd72b814c6df2d49 100644
--- a/3rdparty/MDB2/Driver/Datatype/mysql.php
+++ b/3rdparty/MDB2/Driver/Datatype/mysql.php
@@ -1,562 +1,602 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Datatype/Common.php';
-
-/**
- * MDB2 MySQL driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
-{
-    // {{{ _getCharsetFieldDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
-     * of a field declaration to be used in statements like CREATE TABLE.
-     *
-     * @param string $charset   name of the charset
-     * @return string  DBMS specific SQL code portion needed to set the CHARACTER SET
-     *                 of a field declaration.
-     */
-    function _getCharsetFieldDeclaration($charset)
-    {
-        return 'CHARACTER SET '.$charset;
-    }
-
-    // }}}
-    // {{{ _getCollationFieldDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to set the COLLATION
-     * of a field declaration to be used in statements like CREATE TABLE.
-     *
-     * @param string $collation   name of the collation
-     * @return string  DBMS specific SQL code portion needed to set the COLLATION
-     *                 of a field declaration.
-     */
-    function _getCollationFieldDeclaration($collation)
-    {
-        return 'COLLATE '.$collation;
-    }
-
-    // }}}
-    // {{{ getTypeDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an text type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param array $field  associative array with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      length
-     *          Integer value that determines the maximum length of the text
-     *          field. If this argument is missing the field should be
-     *          declared to have the longest length allowed by the DBMS.
-     *
-     *      default
-     *          Text value to be used as default for this field.
-     *
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *      declare the specified field.
-     * @access public
-     */
-    function getTypeDeclaration($field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        switch ($field['type']) {
-        case 'text':
-            if (empty($field['length']) && array_key_exists('default', $field)) {
-                $field['length'] = $db->varchar_max_length;
-            }
-            $length = !empty($field['length']) ? $field['length'] : false;
-            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
-            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR(255)')
-                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
-        case 'clob':
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 255) {
-                    return 'TINYTEXT';
-                } elseif ($length <= 65532) {
-                    return 'TEXT';
-                } elseif ($length <= 16777215) {
-                    return 'MEDIUMTEXT';
-                }
-            }
-            return 'LONGTEXT';
-        case 'blob':
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 255) {
-                    return 'TINYBLOB';
-                } elseif ($length <= 65532) {
-                    return 'BLOB';
-                } elseif ($length <= 16777215) {
-                    return 'MEDIUMBLOB';
-                }
-            }
-            return 'LONGBLOB';
-        case 'integer':
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 1) {
-                    return 'TINYINT';
-                } elseif ($length == 2) {
-                    return 'SMALLINT';
-                } elseif ($length == 3) {
-                    return 'MEDIUMINT';
-                } elseif ($length == 4) {
-                    return 'INT';
-                } elseif ($length > 4) {
-                    return 'BIGINT';
-                }
-            }
-            return 'INT';
-        case 'boolean':
-            return 'TINYINT(1)';
-        case 'date':
-            return 'DATE';
-        case 'time':
-            return 'TIME';
-        case 'timestamp':
-            return 'DATETIME';
-        case 'float':
-            return 'DOUBLE';
-        case 'decimal':
-            $length = !empty($field['length']) ? $field['length'] : 18;
-            $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places'];
-            return 'DECIMAL('.$length.','.$scale.')';
-        }
-        return '';
-    }
-
-    // }}}
-    // {{{ _getIntegerDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an integer type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string  $name   name the field to be declared.
-     * @param string  $field  associative array with the name of the properties
-     *                        of the field being declared as array indexes.
-     *                        Currently, the types of supported field
-     *                        properties are as follows:
-     *
-     *                       unsigned
-     *                        Boolean flag that indicates whether the field
-     *                        should be declared as unsigned integer if
-     *                        possible.
-     *
-     *                       default
-     *                        Integer value to be used as default for this
-     *                        field.
-     *
-     *                       notnull
-     *                        Boolean flag that indicates whether this field is
-     *                        constrained to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *                 declare the specified field.
-     * @access protected
-     */
-    function _getIntegerDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $default = $autoinc = '';
-        if (!empty($field['autoincrement'])) {
-            $autoinc = ' AUTO_INCREMENT PRIMARY KEY';
-        } elseif (array_key_exists('default', $field)) {
-            if ($field['default'] === '') {
-                $field['default'] = empty($field['notnull']) ? null : 0;
-            }
-            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
-        }
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
-        if (empty($default) && empty($notnull)) {
-            $default = ' DEFAULT NULL';
-        }
-        $name = $db->quoteIdentifier($name, true);
-        return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc;
-    }
-
-    // }}}
-    // {{{ _getFloatDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an float type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string  $name   name the field to be declared.
-     * @param string  $field  associative array with the name of the properties
-     *                        of the field being declared as array indexes.
-     *                        Currently, the types of supported field
-     *                        properties are as follows:
-     *
-     *                       unsigned
-     *                        Boolean flag that indicates whether the field
-     *                        should be declared as unsigned float if
-     *                        possible.
-     *
-     *                       default
-     *                        float value to be used as default for this
-     *                        field.
-     *
-     *                       notnull
-     *                        Boolean flag that indicates whether this field is
-     *                        constrained to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *                 declare the specified field.
-     * @access protected
-     */
-    function _getFloatDeclaration($name, $field)
-    {
-        // Since AUTO_INCREMENT can be used for integer or floating-point types,
-        // reuse the INTEGER declaration
-        // @see http://bugs.mysql.com/bug.php?id=31032
-        return $this->_getIntegerDeclaration($name, $field);
-    }
-
-    // }}}
-    // {{{ _getDecimalDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an decimal type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string  $name   name the field to be declared.
-     * @param string  $field  associative array with the name of the properties
-     *                        of the field being declared as array indexes.
-     *                        Currently, the types of supported field
-     *                        properties are as follows:
-     *
-     *                       unsigned
-     *                        Boolean flag that indicates whether the field
-     *                        should be declared as unsigned integer if
-     *                        possible.
-     *
-     *                       default
-     *                        Decimal value to be used as default for this
-     *                        field.
-     *
-     *                       notnull
-     *                        Boolean flag that indicates whether this field is
-     *                        constrained to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *                 declare the specified field.
-     * @access protected
-     */
-    function _getDecimalDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $default = '';
-        if (array_key_exists('default', $field)) {
-            if ($field['default'] === '') {
-                $field['default'] = empty($field['notnull']) ? null : 0;
-            }
-            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
-        } elseif (empty($field['notnull'])) {
-            $default = ' DEFAULT NULL';
-        }
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
-        $name = $db->quoteIdentifier($name, true);
-        return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull;
-    }
-
-    // }}}
-    // {{{ matchPattern()
-
-    /**
-     * build a pattern matching string
-     *
-     * @access public
-     *
-     * @param array $pattern even keys are strings, odd are patterns (% and _)
-     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
-     * @param string $field optional field name that is being matched against
-     *                  (might be required when emulating ILIKE)
-     *
-     * @return string SQL pattern
-     */
-    function matchPattern($pattern, $operator = null, $field = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $match = '';
-        if (null !== $operator) {
-            $field = (null === $field) ? '' : $field.' ';
-            $operator = strtoupper($operator);
-            switch ($operator) {
-            // case insensitive
-            case 'ILIKE':
-                $match = $field.'LIKE ';
-                break;
-            case 'NOT ILIKE':
-                $match = $field.'NOT LIKE ';
-                break;
-            // case sensitive
-            case 'LIKE':
-                $match = $field.'LIKE BINARY ';
-                break;
-            case 'NOT LIKE':
-                $match = $field.'NOT LIKE BINARY ';
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'not a supported operator type:'. $operator, __FUNCTION__);
-            }
-        }
-        $match.= "'";
-        foreach ($pattern as $key => $value) {
-            if ($key % 2) {
-                $match.= $value;
-            } else {
-                $match.= $db->escapePattern($db->escape($value));
-            }
-        }
-        $match.= "'";
-        $match.= $this->patternEscapeString();
-        return $match;
-    }
-
-    // }}}
-    // {{{ _mapNativeDatatype()
-
-    /**
-     * Maps a native array description of a field to a MDB2 datatype and length
-     *
-     * @param array  $field native field description
-     * @return array containing the various possible types, length, sign, fixed
-     * @access public
-     */
-    function _mapNativeDatatype($field)
-    {
-        $db_type = strtolower($field['type']);
-        $db_type = strtok($db_type, '(), ');
-        if ($db_type == 'national') {
-            $db_type = strtok('(), ');
-        }
-        if (!empty($field['length'])) {
-            $length = strtok($field['length'], ', ');
-            $decimal = strtok(', ');
-        } else {
-            $length = strtok('(), ');
-            $decimal = strtok('(), ');
-        }
-        $type = array();
-        $unsigned = $fixed = null;
-        switch ($db_type) {
-        case 'tinyint':
-            $type[] = 'integer';
-            $type[] = 'boolean';
-            if (preg_match('/^(is|has)/', $field['name'])) {
-                $type = array_reverse($type);
-            }
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 1;
-            break;
-        case 'smallint':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 2;
-            break;
-        case 'mediumint':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 3;
-            break;
-        case 'int':
-        case 'integer':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 4;
-            break;
-        case 'bigint':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 8;
-            break;
-        case 'tinytext':
-        case 'mediumtext':
-        case 'longtext':
-        case 'text':
-        case 'varchar':
-            $fixed = false;
-        case 'string':
-        case 'char':
-            $type[] = 'text';
-            if ($length == '1') {
-                $type[] = 'boolean';
-                if (preg_match('/^(is|has)/', $field['name'])) {
-                    $type = array_reverse($type);
-                }
-            } elseif (strstr($db_type, 'text')) {
-                $type[] = 'clob';
-                if ($decimal == 'binary') {
-                    $type[] = 'blob';
-                }
-                $type = array_reverse($type);
-            }
-            if ($fixed !== false) {
-                $fixed = true;
-            }
-            break;
-        case 'enum':
-            $type[] = 'text';
-            preg_match_all('/\'.+\'/U', $field['type'], $matches);
-            $length = 0;
-            $fixed = false;
-            if (is_array($matches)) {
-                foreach ($matches[0] as $value) {
-                    $length = max($length, strlen($value)-2);
-                }
-                if ($length == '1' && count($matches[0]) == 2) {
-                    $type[] = 'boolean';
-                    if (preg_match('/^(is|has)/', $field['name'])) {
-                        $type = array_reverse($type);
-                    }
-                }
-            }
-            $type[] = 'integer';
-        case 'set':
-            $fixed = false;
-            $type[] = 'text';
-            $type[] = 'integer';
-            break;
-        case 'date':
-            $type[] = 'date';
-            $length = null;
-            break;
-        case 'datetime':
-        case 'timestamp':
-            $type[] = 'timestamp';
-            $length = null;
-            break;
-        case 'time':
-            $type[] = 'time';
-            $length = null;
-            break;
-        case 'float':
-        case 'double':
-        case 'real':
-            $type[] = 'float';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            break;
-        case 'unknown':
-        case 'decimal':
-        case 'numeric':
-            $type[] = 'decimal';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            if ($decimal !== false) {
-                $length = $length.','.$decimal;
-            }
-            break;
-        case 'tinyblob':
-        case 'mediumblob':
-        case 'longblob':
-        case 'blob':
-            $type[] = 'blob';
-            $length = null;
-            break;
-        case 'binary':
-        case 'varbinary':
-            $type[] = 'blob';
-            break;
-        case 'year':
-            $type[] = 'integer';
-            $type[] = 'date';
-            $length = null;
-            break;
-        default:
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'unknown database attribute type: '.$db_type, __FUNCTION__);
-        }
-
-        if ((int)$length <= 0) {
-            $length = null;
-        }
-
-        return array($type, $length, $unsigned, $fixed);
-    }
-
-    // }}}
-}
-
+<?php
+// vim: set et ts=4 sw=4 fdm=marker:
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Datatype/Common.php';
+
+/**
+ * MDB2 MySQL driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
+{
+    // {{{ _getCharsetFieldDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to set the CHARACTER SET
+     * of a field declaration to be used in statements like CREATE TABLE.
+     *
+     * @param string $charset   name of the charset
+     * @return string  DBMS specific SQL code portion needed to set the CHARACTER SET
+     *                 of a field declaration.
+     */
+    function _getCharsetFieldDeclaration($charset)
+    {
+        return 'CHARACTER SET '.$charset;
+    }
+
+    // }}}
+    // {{{ _getCollationFieldDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to set the COLLATION
+     * of a field declaration to be used in statements like CREATE TABLE.
+     *
+     * @param string $collation   name of the collation
+     * @return string  DBMS specific SQL code portion needed to set the COLLATION
+     *                 of a field declaration.
+     */
+    function _getCollationFieldDeclaration($collation)
+    {
+        return 'COLLATE '.$collation;
+    }
+
+    // }}}
+    // {{{ getDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare
+     * of the given type
+     *
+     * @param string $type  type to which the value should be converted to
+     * @param string $name  name the field to be declared.
+     * @param string $field definition of the field
+     *
+     * @return string DBMS-specific SQL code portion that should be used to
+     *                declare the specified field.
+     * @access public
+     */
+    function getDeclaration($type, $name, $field)
+    {
+        // MySQL DDL syntax forbids combining NOT NULL with DEFAULT NULL.
+        // To get a default of NULL for NOT NULL columns, omit it.
+        if (   isset($field['notnull'])
+            && !empty($field['notnull'])
+            && array_key_exists('default', $field) // do not use isset() here!
+            && null === $field['default']
+        ) {
+            unset($field['default']);
+        }
+        return parent::getDeclaration($type, $name, $field);
+    }
+
+    // }}}
+    // {{{ getTypeDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an text type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param array $field  associative array with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      length
+     *          Integer value that determines the maximum length of the text
+     *          field. If this argument is missing the field should be
+     *          declared to have the longest length allowed by the DBMS.
+     *
+     *      default
+     *          Text value to be used as default for this field.
+     *
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *      declare the specified field.
+     * @access public
+     */
+    function getTypeDeclaration($field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        switch ($field['type']) {
+        case 'text':
+            if (empty($field['length']) && array_key_exists('default', $field)) {
+                $field['length'] = $db->varchar_max_length;
+            }
+            $length = !empty($field['length']) ? $field['length'] : false;
+            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
+            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR(255)')
+                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
+        case 'clob':
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 255) {
+                    return 'TINYTEXT';
+                } elseif ($length <= 65532) {
+                    return 'TEXT';
+                } elseif ($length <= 16777215) {
+                    return 'MEDIUMTEXT';
+                }
+            }
+            return 'LONGTEXT';
+        case 'blob':
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 255) {
+                    return 'TINYBLOB';
+                } elseif ($length <= 65532) {
+                    return 'BLOB';
+                } elseif ($length <= 16777215) {
+                    return 'MEDIUMBLOB';
+                }
+            }
+            return 'LONGBLOB';
+        case 'integer':
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 1) {
+                    return 'TINYINT';
+                } elseif ($length == 2) {
+                    return 'SMALLINT';
+                } elseif ($length == 3) {
+                    return 'MEDIUMINT';
+                } elseif ($length == 4) {
+                    return 'INT';
+                } elseif ($length > 4) {
+                    return 'BIGINT';
+                }
+            }
+            return 'INT';
+        case 'boolean':
+            return 'TINYINT(1)';
+        case 'date':
+            return 'DATE';
+        case 'time':
+            return 'TIME';
+        case 'timestamp':
+            return 'DATETIME';
+        case 'float':
+            $l = '';
+            if (!empty($field['length'])) {
+                $l = '(' . $field['length'];
+                if (!empty($field['scale'])) {
+                    $l .= ',' . $field['scale'];
+                }
+                $l .= ')';
+            }
+            return 'DOUBLE' . $l;
+        case 'decimal':
+            $length = !empty($field['length']) ? $field['length'] : 18;
+            $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places'];
+            return 'DECIMAL('.$length.','.$scale.')';
+        }
+        return '';
+    }
+
+    // }}}
+    // {{{ _getIntegerDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an integer type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string  $name   name the field to be declared.
+     * @param string  $field  associative array with the name of the properties
+     *                        of the field being declared as array indexes.
+     *                        Currently, the types of supported field
+     *                        properties are as follows:
+     *
+     *                       unsigned
+     *                        Boolean flag that indicates whether the field
+     *                        should be declared as unsigned integer if
+     *                        possible.
+     *
+     *                       default
+     *                        Integer value to be used as default for this
+     *                        field.
+     *
+     *                       notnull
+     *                        Boolean flag that indicates whether this field is
+     *                        constrained to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *                 declare the specified field.
+     * @access protected
+     */
+    function _getIntegerDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $default = $autoinc = '';
+        if (!empty($field['autoincrement'])) {
+            $autoinc = ' AUTO_INCREMENT PRIMARY KEY';
+        } elseif (array_key_exists('default', $field)) {
+            if ($field['default'] === '') {
+                $field['default'] = empty($field['notnull']) ? null : 0;
+            }
+            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
+        }
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
+        if (empty($default) && empty($notnull)) {
+            $default = ' DEFAULT NULL';
+        }
+        $name = $db->quoteIdentifier($name, true);
+        return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc;
+    }
+
+    // }}}
+    // {{{ _getFloatDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an float type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string  $name   name the field to be declared.
+     * @param string  $field  associative array with the name of the properties
+     *                        of the field being declared as array indexes.
+     *                        Currently, the types of supported field
+     *                        properties are as follows:
+     *
+     *                       unsigned
+     *                        Boolean flag that indicates whether the field
+     *                        should be declared as unsigned float if
+     *                        possible.
+     *
+     *                       default
+     *                        float value to be used as default for this
+     *                        field.
+     *
+     *                       notnull
+     *                        Boolean flag that indicates whether this field is
+     *                        constrained to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *                 declare the specified field.
+     * @access protected
+     */
+    function _getFloatDeclaration($name, $field)
+    {
+        // Since AUTO_INCREMENT can be used for integer or floating-point types,
+        // reuse the INTEGER declaration
+        // @see http://bugs.mysql.com/bug.php?id=31032
+        return $this->_getIntegerDeclaration($name, $field);
+    }
+
+    // }}}
+    // {{{ _getDecimalDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an decimal type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string  $name   name the field to be declared.
+     * @param string  $field  associative array with the name of the properties
+     *                        of the field being declared as array indexes.
+     *                        Currently, the types of supported field
+     *                        properties are as follows:
+     *
+     *                       unsigned
+     *                        Boolean flag that indicates whether the field
+     *                        should be declared as unsigned integer if
+     *                        possible.
+     *
+     *                       default
+     *                        Decimal value to be used as default for this
+     *                        field.
+     *
+     *                       notnull
+     *                        Boolean flag that indicates whether this field is
+     *                        constrained to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *                 declare the specified field.
+     * @access protected
+     */
+    function _getDecimalDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $default = '';
+        if (array_key_exists('default', $field)) {
+            if ($field['default'] === '') {
+                $field['default'] = empty($field['notnull']) ? null : 0;
+            }
+            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
+        } elseif (empty($field['notnull'])) {
+            $default = ' DEFAULT NULL';
+        }
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
+        $name = $db->quoteIdentifier($name, true);
+        return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull;
+    }
+
+    // }}}
+    // {{{ matchPattern()
+
+    /**
+     * build a pattern matching string
+     *
+     * @access public
+     *
+     * @param array $pattern even keys are strings, odd are patterns (% and _)
+     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
+     * @param string $field optional field name that is being matched against
+     *                  (might be required when emulating ILIKE)
+     *
+     * @return string SQL pattern
+     */
+    function matchPattern($pattern, $operator = null, $field = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $match = '';
+        if (null !== $operator) {
+            $field = (null === $field) ? '' : $field.' ';
+            $operator = strtoupper($operator);
+            switch ($operator) {
+            // case insensitive
+            case 'ILIKE':
+                $match = $field.'LIKE ';
+                break;
+            case 'NOT ILIKE':
+                $match = $field.'NOT LIKE ';
+                break;
+            // case sensitive
+            case 'LIKE':
+                $match = $field.'LIKE BINARY ';
+                break;
+            case 'NOT LIKE':
+                $match = $field.'NOT LIKE BINARY ';
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'not a supported operator type:'. $operator, __FUNCTION__);
+            }
+        }
+        $match.= "'";
+        foreach ($pattern as $key => $value) {
+            if ($key % 2) {
+                $match.= $value;
+            } else {
+                $match.= $db->escapePattern($db->escape($value));
+            }
+        }
+        $match.= "'";
+        $match.= $this->patternEscapeString();
+        return $match;
+    }
+
+    // }}}
+    // {{{ _mapNativeDatatype()
+
+    /**
+     * Maps a native array description of a field to a MDB2 datatype and length
+     *
+     * @param array  $field native field description
+     * @return array containing the various possible types, length, sign, fixed
+     * @access public
+     */
+    function _mapNativeDatatype($field)
+    {
+        $db_type = strtolower($field['type']);
+        $db_type = strtok($db_type, '(), ');
+        if ($db_type == 'national') {
+            $db_type = strtok('(), ');
+        }
+        if (!empty($field['length'])) {
+            $length = strtok($field['length'], ', ');
+            $decimal = strtok(', ');
+        } else {
+            $length = strtok('(), ');
+            $decimal = strtok('(), ');
+        }
+        $type = array();
+        $unsigned = $fixed = null;
+        switch ($db_type) {
+        case 'tinyint':
+            $type[] = 'integer';
+            $type[] = 'boolean';
+            if (preg_match('/^(is|has)/', $field['name'])) {
+                $type = array_reverse($type);
+            }
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 1;
+            break;
+        case 'smallint':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 2;
+            break;
+        case 'mediumint':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 3;
+            break;
+        case 'int':
+        case 'integer':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 4;
+            break;
+        case 'bigint':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 8;
+            break;
+        case 'tinytext':
+        case 'mediumtext':
+        case 'longtext':
+        case 'text':
+        case 'varchar':
+            $fixed = false;
+        case 'string':
+        case 'char':
+            $type[] = 'text';
+            if ($length == '1') {
+                $type[] = 'boolean';
+                if (preg_match('/^(is|has)/', $field['name'])) {
+                    $type = array_reverse($type);
+                }
+            } elseif (strstr($db_type, 'text')) {
+                $type[] = 'clob';
+                if ($decimal == 'binary') {
+                    $type[] = 'blob';
+                }
+                $type = array_reverse($type);
+            }
+            if ($fixed !== false) {
+                $fixed = true;
+            }
+            break;
+        case 'enum':
+            $type[] = 'text';
+            preg_match_all('/\'.+\'/U', $field['type'], $matches);
+            $length = 0;
+            $fixed = false;
+            if (is_array($matches)) {
+                foreach ($matches[0] as $value) {
+                    $length = max($length, strlen($value)-2);
+                }
+                if ($length == '1' && count($matches[0]) == 2) {
+                    $type[] = 'boolean';
+                    if (preg_match('/^(is|has)/', $field['name'])) {
+                        $type = array_reverse($type);
+                    }
+                }
+            }
+            $type[] = 'integer';
+        case 'set':
+            $fixed = false;
+            $type[] = 'text';
+            $type[] = 'integer';
+            break;
+        case 'date':
+            $type[] = 'date';
+            $length = null;
+            break;
+        case 'datetime':
+        case 'timestamp':
+            $type[] = 'timestamp';
+            $length = null;
+            break;
+        case 'time':
+            $type[] = 'time';
+            $length = null;
+            break;
+        case 'float':
+        case 'double':
+        case 'real':
+            $type[] = 'float';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            if ($decimal !== false) {
+                $length = $length.','.$decimal;
+            }
+            break;
+        case 'unknown':
+        case 'decimal':
+        case 'numeric':
+            $type[] = 'decimal';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            if ($decimal !== false) {
+                $length = $length.','.$decimal;
+            }
+            break;
+        case 'tinyblob':
+        case 'mediumblob':
+        case 'longblob':
+        case 'blob':
+            $type[] = 'blob';
+            $length = null;
+            break;
+        case 'binary':
+        case 'varbinary':
+            $type[] = 'blob';
+            break;
+        case 'year':
+            $type[] = 'integer';
+            $type[] = 'date';
+            $length = null;
+            break;
+        default:
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'unknown database attribute type: '.$db_type, __FUNCTION__);
+        }
+
+        if ((int)$length <= 0) {
+            $length = null;
+        }
+
+        return array($type, $length, $unsigned, $fixed);
+    }
+
+    // }}}
+}
+
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Datatype/pgsql.php b/3rdparty/MDB2/Driver/Datatype/pgsql.php
index fec2c9799f507e13e4afef546d9c181028e0d785..db2fa279024bcae8be1700edb36cb7fea624164a 100644
--- a/3rdparty/MDB2/Driver/Datatype/pgsql.php
+++ b/3rdparty/MDB2/Driver/Datatype/pgsql.php
@@ -1,575 +1,579 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Paul Cooper <pgc@ucecom.com>                                 |
-// +----------------------------------------------------------------------+
-//
-// $Id: pgsql.php 298763 2010-04-29 08:49:41Z afz $
-
-require_once 'MDB2/Driver/Datatype/Common.php';
-
-/**
- * MDB2 PostGreSQL driver
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
-{
-    // {{{ _baseConvertResult()
-
-    /**
-     * General type conversion method
-     *
-     * @param mixed   $value refernce to a value to be converted
-     * @param string  $type  specifies which type to convert to
-     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
-     * @return object a MDB2 error on failure
-     * @access protected
-     */
-    function _baseConvertResult($value, $type, $rtrim = true)
-    {
-        if (null === $value) {
-            return null;
-        }
-        switch ($type) {
-        case 'boolean':
-            return $value == 't';
-        case 'float':
-            return doubleval($value);
-        case 'date':
-            return $value;
-        case 'time':
-            return substr($value, 0, strlen('HH:MM:SS'));
-        case 'timestamp':
-            return substr($value, 0, strlen('YYYY-MM-DD HH:MM:SS'));
-        case 'blob':
-            $value = pg_unescape_bytea($value);
-            return parent::_baseConvertResult($value, $type, $rtrim);
-        }
-        return parent::_baseConvertResult($value, $type, $rtrim);
-    }
-
-    // }}}
-    // {{{ getTypeDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an text type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param array $field  associative array with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      length
-     *          Integer value that determines the maximum length of the text
-     *          field. If this argument is missing the field should be
-     *          declared to have the longest length allowed by the DBMS.
-     *
-     *      default
-     *          Text value to be used as default for this field.
-     *
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *      declare the specified field.
-     * @access public
-     */
-    function getTypeDeclaration($field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        switch ($field['type']) {
-        case 'text':
-            $length = !empty($field['length']) ? $field['length'] : false;
-            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
-            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')')
-                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
-        case 'clob':
-            return 'TEXT';
-        case 'blob':
-            return 'BYTEA';
-        case 'integer':
-            if (!empty($field['autoincrement'])) {
-                if (!empty($field['length'])) {
-                    $length = $field['length'];
-                    if ($length > 4) {
-                        return 'BIGSERIAL PRIMARY KEY';
-                    }
-                }
-                return 'SERIAL PRIMARY KEY';
-            }
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 2) {
-                    return 'SMALLINT';
-                } elseif ($length == 3 || $length == 4) {
-                    return 'INT';
-                } elseif ($length > 4) {
-                    return 'BIGINT';
-                }
-            }
-            return 'INT';
-        case 'boolean':
-            return 'BOOLEAN';
-        case 'date':
-            return 'DATE';
-        case 'time':
-            return 'TIME without time zone';
-        case 'timestamp':
-            return 'TIMESTAMP without time zone';
-        case 'float':
-            return 'FLOAT8';
-        case 'decimal':
-            $length = !empty($field['length']) ? $field['length'] : 18;
-            $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places'];
-            return 'NUMERIC('.$length.','.$scale.')';
-        }
-    }
-
-    // }}}
-    // {{{ _getIntegerDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an integer type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string $name name the field to be declared.
-     * @param array $field associative array with the name of the properties
-     *       of the field being declared as array indexes. Currently, the types
-     *       of supported field properties are as follows:
-     *
-     *       unsigned
-     *           Boolean flag that indicates whether the field should be
-     *           declared as unsigned integer if possible.
-     *
-     *       default
-     *           Integer value to be used as default for this field.
-     *
-     *       notnull
-     *           Boolean flag that indicates whether this field is constrained
-     *           to not be set to null.
-     * @return string DBMS specific SQL code portion that should be used to
-     *       declare the specified field.
-     * @access protected
-     */
-    function _getIntegerDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!empty($field['unsigned'])) {
-            $db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer";
-        }
-        if (!empty($field['autoincrement'])) {
-            $name = $db->quoteIdentifier($name, true);
-            return $name.' '.$this->getTypeDeclaration($field);
-        }
-        $default = '';
-        if (array_key_exists('default', $field)) {
-            if ($field['default'] === '') {
-                $field['default'] = empty($field['notnull']) ? null : 0;
-            }
-            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
-        }
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        if (empty($default) && empty($notnull)) {
-            $default = ' DEFAULT NULL';
-        }
-        $name = $db->quoteIdentifier($name, true);
-        return $name.' '.$this->getTypeDeclaration($field).$default.$notnull;
-    }
-
-    // }}}
-    // {{{ _quoteCLOB()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *      a DBMS specific format.
-     * @access protected
-     */
-    function _quoteCLOB($value, $quote, $escape_wildcards)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $value = $this->_readFile($value, $db->options['lob_allow_url_include']);
-        if (PEAR::isError($value)) {
-            return $value;
-        }
-        return $this->_quoteText($value, $quote, $escape_wildcards);
-    }
-
-    // }}}
-    // {{{ _quoteBLOB()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *      a DBMS specific format.
-     * @access protected
-     */
-    function _quoteBLOB($value, $quote, $escape_wildcards)
-    {
-        if (!$quote) {
-            return $value;
-        }
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $value = $this->_readFile($value, $db->options['lob_allow_url_include']);
-        if (PEAR::isError($value)) {
-            return $value;
-        }
-        if (version_compare(PHP_VERSION, '5.2.0RC6', '>=')) {
-            $connection = $db->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-            $value = @pg_escape_bytea($connection, $value);
-        } else {
-            $value = @pg_escape_bytea($value);
-        }
-        return "'".$value."'";
-    }
-
-    // }}}
-    // {{{ _quoteBoolean()
-
-    /**
-     * Convert a text value into a DBMS specific format that is suitable to
-     * compose query statements.
-     *
-     * @param string $value text string value that is intended to be converted.
-     * @param bool $quote determines if the value should be quoted and escaped
-     * @param bool $escape_wildcards if to escape escape wildcards
-     * @return string text string that represents the given argument value in
-     *       a DBMS specific format.
-     * @access protected
-     */
-    function _quoteBoolean($value, $quote, $escape_wildcards)
-    {
-        $value = $value ? 't' : 'f';
-        if (!$quote) {
-            return $value;
-        }
-        return "'".$value."'";
-    }
-
-    // }}}
-    // {{{ matchPattern()
-
-    /**
-     * build a pattern matching string
-     *
-     * @access public
-     *
-     * @param array $pattern even keys are strings, odd are patterns (% and _)
-     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
-     * @param string $field optional field name that is being matched against
-     *                  (might be required when emulating ILIKE)
-     *
-     * @return string SQL pattern
-     */
-    function matchPattern($pattern, $operator = null, $field = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $match = '';
-        if (null !== $operator) {
-            $field = (null === $field) ? '' : $field.' ';
-            $operator = strtoupper($operator);
-            switch ($operator) {
-            // case insensitive
-            case 'ILIKE':
-                $match = $field.'ILIKE ';
-                break;
-            case 'NOT ILIKE':
-                $match = $field.'NOT ILIKE ';
-                break;
-            // case sensitive
-            case 'LIKE':
-                $match = $field.'LIKE ';
-                break;
-            case 'NOT LIKE':
-                $match = $field.'NOT LIKE ';
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'not a supported operator type:'. $operator, __FUNCTION__);
-            }
-        }
-        $match.= "'";
-        foreach ($pattern as $key => $value) {
-            if ($key % 2) {
-                $match.= $value;
-            } else {
-                $match.= $db->escapePattern($db->escape($value));
-            }
-        }
-        $match.= "'";
-        $match.= $this->patternEscapeString();
-        return $match;
-    }
-
-    // }}}
-    // {{{ patternEscapeString()
-
-    /**
-     * build string to define escape pattern string
-     *
-     * @access public
-     *
-     *
-     * @return string define escape pattern
-     */
-    function patternEscapeString()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        return ' ESCAPE '.$this->quote($db->string_quoting['escape_pattern']);
-    }
-
-    // }}}
-    // {{{ _mapNativeDatatype()
-
-    /**
-     * Maps a native array description of a field to a MDB2 datatype and length
-     *
-     * @param array  $field native field description
-     * @return array containing the various possible types, length, sign, fixed
-     * @access public
-     */
-    function _mapNativeDatatype($field)
-    {
-        $db_type = strtolower($field['type']);
-        $length = $field['length'];
-        $type = array();
-        $unsigned = $fixed = null;
-        switch ($db_type) {
-        case 'smallint':
-        case 'int2':
-            $type[] = 'integer';
-            $unsigned = false;
-            $length = 2;
-            if ($length == '2') {
-                $type[] = 'boolean';
-                if (preg_match('/^(is|has)/', $field['name'])) {
-                    $type = array_reverse($type);
-                }
-            }
-            break;
-        case 'int':
-        case 'int4':
-        case 'integer':
-        case 'serial':
-        case 'serial4':
-            $type[] = 'integer';
-            $unsigned = false;
-            $length = 4;
-            break;
-        case 'bigint':
-        case 'int8':
-        case 'bigserial':
-        case 'serial8':
-            $type[] = 'integer';
-            $unsigned = false;
-            $length = 8;
-            break;
-        case 'bool':
-        case 'boolean':
-            $type[] = 'boolean';
-            $length = null;
-            break;
-        case 'text':
-        case 'varchar':
-            $fixed = false;
-        case 'unknown':
-        case 'char':
-        case 'bpchar':
-            $type[] = 'text';
-            if ($length == '1') {
-                $type[] = 'boolean';
-                if (preg_match('/^(is|has)/', $field['name'])) {
-                    $type = array_reverse($type);
-                }
-            } elseif (strstr($db_type, 'text')) {
-                $type[] = 'clob';
-                $type = array_reverse($type);
-            }
-            if ($fixed !== false) {
-                $fixed = true;
-            }
-            break;
-        case 'date':
-            $type[] = 'date';
-            $length = null;
-            break;
-        case 'datetime':
-        case 'timestamp':
-        case 'timestamptz':
-            $type[] = 'timestamp';
-            $length = null;
-            break;
-        case 'time':
-            $type[] = 'time';
-            $length = null;
-            break;
-        case 'float':
-        case 'float4':
-        case 'float8':
-        case 'double':
-        case 'real':
-            $type[] = 'float';
-            break;
-        case 'decimal':
-        case 'money':
-        case 'numeric':
-            $type[] = 'decimal';
-            if (isset($field['scale'])) {
-                $length = $length.','.$field['scale'];
-            }
-            break;
-        case 'tinyblob':
-        case 'mediumblob':
-        case 'longblob':
-        case 'blob':
-        case 'bytea':
-            $type[] = 'blob';
-            $length = null;
-            break;
-        case 'oid':
-            $type[] = 'blob';
-            $type[] = 'clob';
-            $length = null;
-            break;
-        case 'year':
-            $type[] = 'integer';
-            $type[] = 'date';
-            $length = null;
-            break;
-        default:
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'unknown database attribute type: '.$db_type, __FUNCTION__);
-        }
-
-        if ((int)$length <= 0) {
-            $length = null;
-        }
-
-        return array($type, $length, $unsigned, $fixed);
-    }
-
-    // }}}
-    // {{{ mapPrepareDatatype()
-
-    /**
-     * Maps an mdb2 datatype to native prepare type
-     *
-     * @param string $type
-     * @return string
-     * @access public
-     */
-    function mapPrepareDatatype($type)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!empty($db->options['datatype_map'][$type])) {
-            $type = $db->options['datatype_map'][$type];
-            if (!empty($db->options['datatype_map_callback'][$type])) {
-                $parameter = array('type' => $type);
-                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
-            }
-        }
-
-        switch ($type) {
-            case 'integer':
-                return 'int';
-            case 'boolean':
-                return 'bool';
-            case 'decimal':
-            case 'float':
-                return 'numeric';
-            case 'clob':
-                return 'text';
-            case 'blob':
-                return 'bytea';
-            default:
-                break;
-        }
-        return $type;
-    }
-    // }}}
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Paul Cooper <pgc@ucecom.com>                                 |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+require_once 'MDB2/Driver/Datatype/Common.php';
+
+/**
+ * MDB2 PostGreSQL driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
+{
+    // {{{ _baseConvertResult()
+
+    /**
+     * General type conversion method
+     *
+     * @param mixed   $value refernce to a value to be converted
+     * @param string  $type  specifies which type to convert to
+     * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text
+     * @return object a MDB2 error on failure
+     * @access protected
+     */
+    function _baseConvertResult($value, $type, $rtrim = true)
+    {
+        if (null === $value) {
+            return null;
+        }
+        switch ($type) {
+        case 'boolean':
+            return $value == 't';
+        case 'float':
+            return doubleval($value);
+        case 'date':
+            return $value;
+        case 'time':
+            return substr($value, 0, strlen('HH:MM:SS'));
+        case 'timestamp':
+            return substr($value, 0, strlen('YYYY-MM-DD HH:MM:SS'));
+        case 'blob':
+            $value = pg_unescape_bytea($value);
+            return parent::_baseConvertResult($value, $type, $rtrim);
+        }
+        return parent::_baseConvertResult($value, $type, $rtrim);
+    }
+
+    // }}}
+    // {{{ getTypeDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an text type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param array $field  associative array with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      length
+     *          Integer value that determines the maximum length of the text
+     *          field. If this argument is missing the field should be
+     *          declared to have the longest length allowed by the DBMS.
+     *
+     *      default
+     *          Text value to be used as default for this field.
+     *
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *      declare the specified field.
+     * @access public
+     */
+    function getTypeDeclaration($field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        switch ($field['type']) {
+        case 'text':
+            $length = !empty($field['length']) ? $field['length'] : false;
+            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
+            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')')
+                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
+        case 'clob':
+            return 'TEXT';
+        case 'blob':
+            return 'BYTEA';
+        case 'integer':
+            if (!empty($field['autoincrement'])) {
+                if (!empty($field['length'])) {
+                    $length = $field['length'];
+                    if ($length > 4) {
+                        return 'BIGSERIAL PRIMARY KEY';
+                    }
+                }
+                return 'SERIAL PRIMARY KEY';
+            }
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 2) {
+                    return 'SMALLINT';
+                } elseif ($length == 3 || $length == 4) {
+                    return 'INT';
+                } elseif ($length > 4) {
+                    return 'BIGINT';
+                }
+            }
+            return 'INT';
+        case 'boolean':
+            return 'BOOLEAN';
+        case 'date':
+            return 'DATE';
+        case 'time':
+            return 'TIME without time zone';
+        case 'timestamp':
+            return 'TIMESTAMP without time zone';
+        case 'float':
+            return 'FLOAT8';
+        case 'decimal':
+            $length = !empty($field['length']) ? $field['length'] : 18;
+            $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places'];
+            return 'NUMERIC('.$length.','.$scale.')';
+        }
+    }
+
+    // }}}
+    // {{{ _getIntegerDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an integer type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string $name name the field to be declared.
+     * @param array $field associative array with the name of the properties
+     *       of the field being declared as array indexes. Currently, the types
+     *       of supported field properties are as follows:
+     *
+     *       unsigned
+     *           Boolean flag that indicates whether the field should be
+     *           declared as unsigned integer if possible.
+     *
+     *       default
+     *           Integer value to be used as default for this field.
+     *
+     *       notnull
+     *           Boolean flag that indicates whether this field is constrained
+     *           to not be set to null.
+     * @return string DBMS specific SQL code portion that should be used to
+     *       declare the specified field.
+     * @access protected
+     */
+    function _getIntegerDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!empty($field['unsigned'])) {
+            $db->warnings[] = "unsigned integer field \"$name\" is being declared as signed integer";
+        }
+        if (!empty($field['autoincrement'])) {
+            $name = $db->quoteIdentifier($name, true);
+            return $name.' '.$this->getTypeDeclaration($field);
+        }
+        $default = '';
+        if (array_key_exists('default', $field)) {
+            if ($field['default'] === '') {
+                $field['default'] = empty($field['notnull']) ? null : 0;
+            }
+            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
+        }
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        if (empty($default) && empty($notnull)) {
+            $default = ' DEFAULT NULL';
+        }
+        $name = $db->quoteIdentifier($name, true);
+        return $name.' '.$this->getTypeDeclaration($field).$default.$notnull;
+    }
+
+    // }}}
+    // {{{ _quoteCLOB()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *      a DBMS specific format.
+     * @access protected
+     */
+    function _quoteCLOB($value, $quote, $escape_wildcards)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        if ($db->options['lob_allow_url_include']) {
+            $value = $this->_readFile($value);
+            if (PEAR::isError($value)) {
+                return $value;
+            }
+        }
+        return $this->_quoteText($value, $quote, $escape_wildcards);
+    }
+
+    // }}}
+    // {{{ _quoteBLOB()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *      a DBMS specific format.
+     * @access protected
+     */
+    function _quoteBLOB($value, $quote, $escape_wildcards)
+    {
+        if (!$quote) {
+            return $value;
+        }
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        if ($db->options['lob_allow_url_include']) {
+            $value = $this->_readFile($value);
+            if (PEAR::isError($value)) {
+                return $value;
+            }
+        }
+        if (version_compare(PHP_VERSION, '5.2.0RC6', '>=')) {
+            $connection = $db->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+            $value = @pg_escape_bytea($connection, $value);
+        } else {
+            $value = @pg_escape_bytea($value);
+        }
+        return "'".$value."'";
+    }
+
+    // }}}
+    // {{{ _quoteBoolean()
+
+    /**
+     * Convert a text value into a DBMS specific format that is suitable to
+     * compose query statements.
+     *
+     * @param string $value text string value that is intended to be converted.
+     * @param bool $quote determines if the value should be quoted and escaped
+     * @param bool $escape_wildcards if to escape escape wildcards
+     * @return string text string that represents the given argument value in
+     *       a DBMS specific format.
+     * @access protected
+     */
+    function _quoteBoolean($value, $quote, $escape_wildcards)
+    {
+        $value = $value ? 't' : 'f';
+        if (!$quote) {
+            return $value;
+        }
+        return "'".$value."'";
+    }
+
+    // }}}
+    // {{{ matchPattern()
+
+    /**
+     * build a pattern matching string
+     *
+     * @access public
+     *
+     * @param array $pattern even keys are strings, odd are patterns (% and _)
+     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
+     * @param string $field optional field name that is being matched against
+     *                  (might be required when emulating ILIKE)
+     *
+     * @return string SQL pattern
+     */
+    function matchPattern($pattern, $operator = null, $field = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $match = '';
+        if (null !== $operator) {
+            $field = (null === $field) ? '' : $field.' ';
+            $operator = strtoupper($operator);
+            switch ($operator) {
+            // case insensitive
+            case 'ILIKE':
+                $match = $field.'ILIKE ';
+                break;
+            case 'NOT ILIKE':
+                $match = $field.'NOT ILIKE ';
+                break;
+            // case sensitive
+            case 'LIKE':
+                $match = $field.'LIKE ';
+                break;
+            case 'NOT LIKE':
+                $match = $field.'NOT LIKE ';
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'not a supported operator type:'. $operator, __FUNCTION__);
+            }
+        }
+        $match.= "'";
+        foreach ($pattern as $key => $value) {
+            if ($key % 2) {
+                $match.= $value;
+            } else {
+                $match.= $db->escapePattern($db->escape($value));
+            }
+        }
+        $match.= "'";
+        $match.= $this->patternEscapeString();
+        return $match;
+    }
+
+    // }}}
+    // {{{ patternEscapeString()
+
+    /**
+     * build string to define escape pattern string
+     *
+     * @access public
+     *
+     *
+     * @return string define escape pattern
+     */
+    function patternEscapeString()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        return ' ESCAPE '.$this->quote($db->string_quoting['escape_pattern']);
+    }
+
+    // }}}
+    // {{{ _mapNativeDatatype()
+
+    /**
+     * Maps a native array description of a field to a MDB2 datatype and length
+     *
+     * @param array  $field native field description
+     * @return array containing the various possible types, length, sign, fixed
+     * @access public
+     */
+    function _mapNativeDatatype($field)
+    {
+        $db_type = strtolower($field['type']);
+        $length = $field['length'];
+        $type = array();
+        $unsigned = $fixed = null;
+        switch ($db_type) {
+        case 'smallint':
+        case 'int2':
+            $type[] = 'integer';
+            $unsigned = false;
+            $length = 2;
+            if ($length == '2') {
+                $type[] = 'boolean';
+                if (preg_match('/^(is|has)/', $field['name'])) {
+                    $type = array_reverse($type);
+                }
+            }
+            break;
+        case 'int':
+        case 'int4':
+        case 'integer':
+        case 'serial':
+        case 'serial4':
+            $type[] = 'integer';
+            $unsigned = false;
+            $length = 4;
+            break;
+        case 'bigint':
+        case 'int8':
+        case 'bigserial':
+        case 'serial8':
+            $type[] = 'integer';
+            $unsigned = false;
+            $length = 8;
+            break;
+        case 'bool':
+        case 'boolean':
+            $type[] = 'boolean';
+            $length = null;
+            break;
+        case 'text':
+        case 'varchar':
+            $fixed = false;
+        case 'unknown':
+        case 'char':
+        case 'bpchar':
+            $type[] = 'text';
+            if ($length == '1') {
+                $type[] = 'boolean';
+                if (preg_match('/^(is|has)/', $field['name'])) {
+                    $type = array_reverse($type);
+                }
+            } elseif (strstr($db_type, 'text')) {
+                $type[] = 'clob';
+                $type = array_reverse($type);
+            }
+            if ($fixed !== false) {
+                $fixed = true;
+            }
+            break;
+        case 'date':
+            $type[] = 'date';
+            $length = null;
+            break;
+        case 'datetime':
+        case 'timestamp':
+        case 'timestamptz':
+            $type[] = 'timestamp';
+            $length = null;
+            break;
+        case 'time':
+            $type[] = 'time';
+            $length = null;
+            break;
+        case 'float':
+        case 'float4':
+        case 'float8':
+        case 'double':
+        case 'real':
+            $type[] = 'float';
+            break;
+        case 'decimal':
+        case 'money':
+        case 'numeric':
+            $type[] = 'decimal';
+            if (isset($field['scale'])) {
+                $length = $length.','.$field['scale'];
+            }
+            break;
+        case 'tinyblob':
+        case 'mediumblob':
+        case 'longblob':
+        case 'blob':
+        case 'bytea':
+            $type[] = 'blob';
+            $length = null;
+            break;
+        case 'oid':
+            $type[] = 'blob';
+            $type[] = 'clob';
+            $length = null;
+            break;
+        case 'year':
+            $type[] = 'integer';
+            $type[] = 'date';
+            $length = null;
+            break;
+        default:
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'unknown database attribute type: '.$db_type, __FUNCTION__);
+        }
+
+        if ((int)$length <= 0) {
+            $length = null;
+        }
+
+        return array($type, $length, $unsigned, $fixed);
+    }
+
+    // }}}
+    // {{{ mapPrepareDatatype()
+
+    /**
+     * Maps an mdb2 datatype to native prepare type
+     *
+     * @param string $type
+     * @return string
+     * @access public
+     */
+    function mapPrepareDatatype($type)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!empty($db->options['datatype_map'][$type])) {
+            $type = $db->options['datatype_map'][$type];
+            if (!empty($db->options['datatype_map_callback'][$type])) {
+                $parameter = array('type' => $type);
+                return call_user_func_array($db->options['datatype_map_callback'][$type], array(&$db, __FUNCTION__, $parameter));
+            }
+        }
+
+        switch ($type) {
+            case 'integer':
+                return 'int';
+            case 'boolean':
+                return 'bool';
+            case 'decimal':
+            case 'float':
+                return 'numeric';
+            case 'clob':
+                return 'text';
+            case 'blob':
+                return 'bytea';
+            default:
+                break;
+        }
+        return $type;
+    }
+    // }}}
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Datatype/sqlite.php b/3rdparty/MDB2/Driver/Datatype/sqlite.php
index e4711e46b32d4214de0301de80bcc8e71519d3b9..50475a36282e97db22b3cb21f39ad18bde901fde 100644
--- a/3rdparty/MDB2/Driver/Datatype/sqlite.php
+++ b/3rdparty/MDB2/Driver/Datatype/sqlite.php
@@ -1,418 +1,418 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Datatype/Common.php';
-
-/**
- * MDB2 SQLite driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
-{
-    // {{{ _getCollationFieldDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to set the COLLATION
-     * of a field declaration to be used in statements like CREATE TABLE.
-     *
-     * @param string $collation name of the collation
-     *
-     * @return string DBMS specific SQL code portion needed to set the COLLATION
-     *                of a field declaration.
-     */
-    function _getCollationFieldDeclaration($collation)
-    {
-        return 'COLLATE '.$collation;
-    }
-
-    // }}}
-    // {{{ getTypeDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an text type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param array $field  associative array with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      length
-     *          Integer value that determines the maximum length of the text
-     *          field. If this argument is missing the field should be
-     *          declared to have the longest length allowed by the DBMS.
-     *
-     *      default
-     *          Text value to be used as default for this field.
-     *
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *      declare the specified field.
-     * @access public
-     */
-    function getTypeDeclaration($field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        switch ($field['type']) {
-        case 'text':
-            $length = !empty($field['length'])
-                ? $field['length'] : false;
-            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
-            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')')
-                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
-        case 'clob':
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 255) {
-                    return 'TINYTEXT';
-                } elseif ($length <= 65532) {
-                    return 'TEXT';
-                } elseif ($length <= 16777215) {
-                    return 'MEDIUMTEXT';
-                }
-            }
-            return 'LONGTEXT';
-        case 'blob':
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 255) {
-                    return 'TINYBLOB';
-                } elseif ($length <= 65532) {
-                    return 'BLOB';
-                } elseif ($length <= 16777215) {
-                    return 'MEDIUMBLOB';
-                }
-            }
-            return 'LONGBLOB';
-        case 'integer':
-            if (!empty($field['length'])) {
-                $length = $field['length'];
-                if ($length <= 2) {
-                    return 'SMALLINT';
-                } elseif ($length == 3 || $length == 4) {
-                    return 'INTEGER';
-                } elseif ($length > 4) {
-                    return 'BIGINT';
-                }
-            }
-            return 'INTEGER';
-        case 'boolean':
-            return 'BOOLEAN';
-        case 'date':
-            return 'DATE';
-        case 'time':
-            return 'TIME';
-        case 'timestamp':
-            return 'DATETIME';
-        case 'float':
-            return 'DOUBLE'.($db->options['fixed_float'] ? '('.
-                ($db->options['fixed_float']+2).','.$db->options['fixed_float'].')' : '');
-        case 'decimal':
-            $length = !empty($field['length']) ? $field['length'] : 18;
-            $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places'];
-            return 'DECIMAL('.$length.','.$scale.')';
-        }
-        return '';
-    }
-
-    // }}}
-    // {{{ _getIntegerDeclaration()
-
-    /**
-     * Obtain DBMS specific SQL code portion needed to declare an integer type
-     * field to be used in statements like CREATE TABLE.
-     *
-     * @param string  $name   name the field to be declared.
-     * @param string  $field  associative array with the name of the properties
-     *                        of the field being declared as array indexes.
-     *                        Currently, the types of supported field
-     *                        properties are as follows:
-     *
-     *                       unsigned
-     *                        Boolean flag that indicates whether the field
-     *                        should be declared as unsigned integer if
-     *                        possible.
-     *
-     *                       default
-     *                        Integer value to be used as default for this
-     *                        field.
-     *
-     *                       notnull
-     *                        Boolean flag that indicates whether this field is
-     *                        constrained to not be set to null.
-     * @return string  DBMS specific SQL code portion that should be used to
-     *                 declare the specified field.
-     * @access protected
-     */
-    function _getIntegerDeclaration($name, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $default = $autoinc = '';
-        if (!empty($field['autoincrement'])) {
-            $autoinc = ' PRIMARY KEY';
-        } elseif (array_key_exists('default', $field)) {
-            if ($field['default'] === '') {
-                $field['default'] = empty($field['notnull']) ? null : 0;
-            }
-            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
-        }
-
-        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
-        $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
-        if (empty($default) && empty($notnull)) {
-            $default = ' DEFAULT NULL';
-        }
-        $name = $db->quoteIdentifier($name, true);
-        return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc;
-    }
-
-    // }}}
-    // {{{ matchPattern()
-
-    /**
-     * build a pattern matching string
-     *
-     * @access public
-     *
-     * @param array $pattern even keys are strings, odd are patterns (% and _)
-     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
-     * @param string $field optional field name that is being matched against
-     *                  (might be required when emulating ILIKE)
-     *
-     * @return string SQL pattern
-     */
-    function matchPattern($pattern, $operator = null, $field = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $match = '';
-        if (null !== $operator) {
-            $field = (null === $field) ? '' : $field.' ';
-            $operator = strtoupper($operator);
-            switch ($operator) {
-            // case insensitive
-            case 'ILIKE':
-                $match = $field.'LIKE ';
-                break;
-            case 'NOT ILIKE':
-                $match = $field.'NOT LIKE ';
-                break;
-            // case sensitive
-            case 'LIKE':
-                $match = $field.'LIKE ';
-                break;
-            case 'NOT LIKE':
-                $match = $field.'NOT LIKE ';
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'not a supported operator type:'. $operator, __FUNCTION__);
-            }
-        }
-        $match.= "'";
-        foreach ($pattern as $key => $value) {
-            if ($key % 2) {
-                $match.= $value;
-            } else {
-                $match.= $db->escapePattern($db->escape($value));
-            }
-        }
-        $match.= "'";
-        $match.= $this->patternEscapeString();
-        return $match;
-    }
-
-    // }}}
-    // {{{ _mapNativeDatatype()
-
-    /**
-     * Maps a native array description of a field to a MDB2 datatype and length
-     *
-     * @param array  $field native field description
-     * @return array containing the various possible types, length, sign, fixed
-     * @access public
-     */
-    function _mapNativeDatatype($field)
-    {
-        $db_type = strtolower($field['type']);
-        $length = !empty($field['length']) ? $field['length'] : null;
-        $unsigned = !empty($field['unsigned']) ? $field['unsigned'] : null;
-        $fixed = null;
-        $type = array();
-        switch ($db_type) {
-        case 'boolean':
-            $type[] = 'boolean';
-            break;
-        case 'tinyint':
-            $type[] = 'integer';
-            $type[] = 'boolean';
-            if (preg_match('/^(is|has)/', $field['name'])) {
-                $type = array_reverse($type);
-            }
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 1;
-            break;
-        case 'smallint':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 2;
-            break;
-        case 'mediumint':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 3;
-            break;
-        case 'int':
-        case 'integer':
-        case 'serial':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 4;
-            break;
-        case 'bigint':
-        case 'bigserial':
-            $type[] = 'integer';
-            $unsigned = preg_match('/ unsigned/i', $field['type']);
-            $length = 8;
-            break;
-        case 'clob':
-            $type[] = 'clob';
-            $fixed  = false;
-            break;
-        case 'tinytext':
-        case 'mediumtext':
-        case 'longtext':
-        case 'text':
-        case 'varchar':
-        case 'varchar2':
-            $fixed = false;
-        case 'char':
-            $type[] = 'text';
-            if ($length == '1') {
-                $type[] = 'boolean';
-                if (preg_match('/^(is|has)/', $field['name'])) {
-                    $type = array_reverse($type);
-                }
-            } elseif (strstr($db_type, 'text')) {
-                $type[] = 'clob';
-                $type = array_reverse($type);
-            }
-            if ($fixed !== false) {
-                $fixed = true;
-            }
-            break;
-        case 'date':
-            $type[] = 'date';
-            $length = null;
-            break;
-        case 'datetime':
-        case 'timestamp':
-            $type[] = 'timestamp';
-            $length = null;
-            break;
-        case 'time':
-            $type[] = 'time';
-            $length = null;
-            break;
-        case 'float':
-        case 'double':
-        case 'real':
-            $type[] = 'float';
-            break;
-        case 'decimal':
-        case 'numeric':
-            $type[] = 'decimal';
-            $length = $length.','.$field['decimal'];
-            break;
-        case 'tinyblob':
-        case 'mediumblob':
-        case 'longblob':
-        case 'blob':
-            $type[] = 'blob';
-            $length = null;
-            break;
-        case 'year':
-            $type[] = 'integer';
-            $type[] = 'date';
-            $length = null;
-            break;
-        default:
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'unknown database attribute type: '.$db_type, __FUNCTION__);
-        }
-
-        if ((int)$length <= 0) {
-            $length = null;
-        }
-
-        return array($type, $length, $unsigned, $fixed);
-    }
-
-    // }}}
-}
-
+<?php
+// vim: set et ts=4 sw=4 fdm=marker:
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Datatype/Common.php';
+
+/**
+ * MDB2 SQLite driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
+{
+    // {{{ _getCollationFieldDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to set the COLLATION
+     * of a field declaration to be used in statements like CREATE TABLE.
+     *
+     * @param string $collation name of the collation
+     *
+     * @return string DBMS specific SQL code portion needed to set the COLLATION
+     *                of a field declaration.
+     */
+    function _getCollationFieldDeclaration($collation)
+    {
+        return 'COLLATE '.$collation;
+    }
+
+    // }}}
+    // {{{ getTypeDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an text type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param array $field  associative array with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      length
+     *          Integer value that determines the maximum length of the text
+     *          field. If this argument is missing the field should be
+     *          declared to have the longest length allowed by the DBMS.
+     *
+     *      default
+     *          Text value to be used as default for this field.
+     *
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *      declare the specified field.
+     * @access public
+     */
+    function getTypeDeclaration($field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        switch ($field['type']) {
+        case 'text':
+            $length = !empty($field['length'])
+                ? $field['length'] : false;
+            $fixed = !empty($field['fixed']) ? $field['fixed'] : false;
+            return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR('.$db->options['default_text_field_length'].')')
+                : ($length ? 'VARCHAR('.$length.')' : 'TEXT');
+        case 'clob':
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 255) {
+                    return 'TINYTEXT';
+                } elseif ($length <= 65532) {
+                    return 'TEXT';
+                } elseif ($length <= 16777215) {
+                    return 'MEDIUMTEXT';
+                }
+            }
+            return 'LONGTEXT';
+        case 'blob':
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 255) {
+                    return 'TINYBLOB';
+                } elseif ($length <= 65532) {
+                    return 'BLOB';
+                } elseif ($length <= 16777215) {
+                    return 'MEDIUMBLOB';
+                }
+            }
+            return 'LONGBLOB';
+        case 'integer':
+            if (!empty($field['length'])) {
+                $length = $field['length'];
+                if ($length <= 2) {
+                    return 'SMALLINT';
+                } elseif ($length == 3 || $length == 4) {
+                    return 'INTEGER';
+                } elseif ($length > 4) {
+                    return 'BIGINT';
+                }
+            }
+            return 'INTEGER';
+        case 'boolean':
+            return 'BOOLEAN';
+        case 'date':
+            return 'DATE';
+        case 'time':
+            return 'TIME';
+        case 'timestamp':
+            return 'DATETIME';
+        case 'float':
+            return 'DOUBLE'.($db->options['fixed_float'] ? '('.
+                ($db->options['fixed_float']+2).','.$db->options['fixed_float'].')' : '');
+        case 'decimal':
+            $length = !empty($field['length']) ? $field['length'] : 18;
+            $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places'];
+            return 'DECIMAL('.$length.','.$scale.')';
+        }
+        return '';
+    }
+
+    // }}}
+    // {{{ _getIntegerDeclaration()
+
+    /**
+     * Obtain DBMS specific SQL code portion needed to declare an integer type
+     * field to be used in statements like CREATE TABLE.
+     *
+     * @param string  $name   name the field to be declared.
+     * @param string  $field  associative array with the name of the properties
+     *                        of the field being declared as array indexes.
+     *                        Currently, the types of supported field
+     *                        properties are as follows:
+     *
+     *                       unsigned
+     *                        Boolean flag that indicates whether the field
+     *                        should be declared as unsigned integer if
+     *                        possible.
+     *
+     *                       default
+     *                        Integer value to be used as default for this
+     *                        field.
+     *
+     *                       notnull
+     *                        Boolean flag that indicates whether this field is
+     *                        constrained to not be set to null.
+     * @return string  DBMS specific SQL code portion that should be used to
+     *                 declare the specified field.
+     * @access protected
+     */
+    function _getIntegerDeclaration($name, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $default = $autoinc = '';
+        if (!empty($field['autoincrement'])) {
+            $autoinc = ' PRIMARY KEY';
+        } elseif (array_key_exists('default', $field)) {
+            if ($field['default'] === '') {
+                $field['default'] = empty($field['notnull']) ? null : 0;
+            }
+            $default = ' DEFAULT '.$this->quote($field['default'], 'integer');
+        }
+
+        $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
+        $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
+        if (empty($default) && empty($notnull)) {
+            $default = ' DEFAULT NULL';
+        }
+        $name = $db->quoteIdentifier($name, true);
+        return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc;
+    }
+
+    // }}}
+    // {{{ matchPattern()
+
+    /**
+     * build a pattern matching string
+     *
+     * @access public
+     *
+     * @param array $pattern even keys are strings, odd are patterns (% and _)
+     * @param string $operator optional pattern operator (LIKE, ILIKE and maybe others in the future)
+     * @param string $field optional field name that is being matched against
+     *                  (might be required when emulating ILIKE)
+     *
+     * @return string SQL pattern
+     */
+    function matchPattern($pattern, $operator = null, $field = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $match = '';
+        if (null !== $operator) {
+            $field = (null === $field) ? '' : $field.' ';
+            $operator = strtoupper($operator);
+            switch ($operator) {
+            // case insensitive
+            case 'ILIKE':
+                $match = $field.'LIKE ';
+                break;
+            case 'NOT ILIKE':
+                $match = $field.'NOT LIKE ';
+                break;
+            // case sensitive
+            case 'LIKE':
+                $match = $field.'LIKE ';
+                break;
+            case 'NOT LIKE':
+                $match = $field.'NOT LIKE ';
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'not a supported operator type:'. $operator, __FUNCTION__);
+            }
+        }
+        $match.= "'";
+        foreach ($pattern as $key => $value) {
+            if ($key % 2) {
+                $match.= $value;
+            } else {
+                $match.= $db->escapePattern($db->escape($value));
+            }
+        }
+        $match.= "'";
+        $match.= $this->patternEscapeString();
+        return $match;
+    }
+
+    // }}}
+    // {{{ _mapNativeDatatype()
+
+    /**
+     * Maps a native array description of a field to a MDB2 datatype and length
+     *
+     * @param array  $field native field description
+     * @return array containing the various possible types, length, sign, fixed
+     * @access public
+     */
+    function _mapNativeDatatype($field)
+    {
+        $db_type = strtolower($field['type']);
+        $length = !empty($field['length']) ? $field['length'] : null;
+        $unsigned = !empty($field['unsigned']) ? $field['unsigned'] : null;
+        $fixed = null;
+        $type = array();
+        switch ($db_type) {
+        case 'boolean':
+            $type[] = 'boolean';
+            break;
+        case 'tinyint':
+            $type[] = 'integer';
+            $type[] = 'boolean';
+            if (preg_match('/^(is|has)/', $field['name'])) {
+                $type = array_reverse($type);
+            }
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 1;
+            break;
+        case 'smallint':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 2;
+            break;
+        case 'mediumint':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 3;
+            break;
+        case 'int':
+        case 'integer':
+        case 'serial':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 4;
+            break;
+        case 'bigint':
+        case 'bigserial':
+            $type[] = 'integer';
+            $unsigned = preg_match('/ unsigned/i', $field['type']);
+            $length = 8;
+            break;
+        case 'clob':
+            $type[] = 'clob';
+            $fixed  = false;
+            break;
+        case 'tinytext':
+        case 'mediumtext':
+        case 'longtext':
+        case 'text':
+        case 'varchar':
+        case 'varchar2':
+            $fixed = false;
+        case 'char':
+            $type[] = 'text';
+            if ($length == '1') {
+                $type[] = 'boolean';
+                if (preg_match('/^(is|has)/', $field['name'])) {
+                    $type = array_reverse($type);
+                }
+            } elseif (strstr($db_type, 'text')) {
+                $type[] = 'clob';
+                $type = array_reverse($type);
+            }
+            if ($fixed !== false) {
+                $fixed = true;
+            }
+            break;
+        case 'date':
+            $type[] = 'date';
+            $length = null;
+            break;
+        case 'datetime':
+        case 'timestamp':
+            $type[] = 'timestamp';
+            $length = null;
+            break;
+        case 'time':
+            $type[] = 'time';
+            $length = null;
+            break;
+        case 'float':
+        case 'double':
+        case 'real':
+            $type[] = 'float';
+            break;
+        case 'decimal':
+        case 'numeric':
+            $type[] = 'decimal';
+            $length = $length.','.$field['decimal'];
+            break;
+        case 'tinyblob':
+        case 'mediumblob':
+        case 'longblob':
+        case 'blob':
+            $type[] = 'blob';
+            $length = null;
+            break;
+        case 'year':
+            $type[] = 'integer';
+            $type[] = 'date';
+            $length = null;
+            break;
+        default:
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'unknown database attribute type: '.$db_type, __FUNCTION__);
+        }
+
+        if ((int)$length <= 0) {
+            $length = null;
+        }
+
+        return array($type, $length, $unsigned, $fixed);
+    }
+
+    // }}}
+}
+
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Function/Common.php b/3rdparty/MDB2/Driver/Function/Common.php
index 5d247bec3599ea09e9095c5c38e7b1e4f194f38f..5a780fd48e851d5027b55217a696661e0e33dce6 100644
--- a/3rdparty/MDB2/Driver/Function/Common.php
+++ b/3rdparty/MDB2/Driver/Function/Common.php
@@ -1,293 +1,293 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Common.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-/**
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-
-/**
- * Base class for the function modules that is extended by each MDB2 driver
- *
- * To load this module in the MDB2 object:
- * $mdb->loadModule('Function');
- *
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Function_Common extends MDB2_Module_Common
-{
-    // {{{ executeStoredProc()
-
-    /**
-     * Execute a stored procedure and return any results
-     *
-     * @param string $name string that identifies the function to execute
-     * @param mixed  $params  array that contains the paramaters to pass the stored proc
-     * @param mixed   $types  array that contains the types of the columns in
-     *                        the result set
-     * @param mixed $result_class string which specifies which result class to use
-     * @param mixed $result_wrap_class string which specifies which class to wrap results in
-     *
-     * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-        return $error;
-    }
-
-    // }}}
-    // {{{ functionTable()
-
-    /**
-     * return string for internal table used when calling only a function
-     *
-     * @return string for internal table used when calling only a function
-     * @access public
-     */
-    function functionTable()
-    {
-        return '';
-    }
-
-    // }}}
-    // {{{ now()
-
-    /**
-     * Return string to call a variable with the current timestamp inside an SQL statement
-     * There are three special variables for current date and time:
-     * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type)
-     * - CURRENT_DATE (date, DATE type)
-     * - CURRENT_TIME (time, TIME type)
-     *
-     * @param string $type 'timestamp' | 'time' | 'date'
-     *
-     * @return string to call a variable with the current timestamp
-     * @access public
-     */
-    function now($type = 'timestamp')
-    {
-        switch ($type) {
-        case 'time':
-            return 'CURRENT_TIME';
-        case 'date':
-            return 'CURRENT_DATE';
-        case 'timestamp':
-        default:
-            return 'CURRENT_TIMESTAMP';
-        }
-    }
-
-    // }}}
-    // {{{ unixtimestamp()
-
-    /**
-     * return string to call a function to get the unix timestamp from a iso timestamp
-     *
-     * @param string $expression
-     *
-     * @return string to call a variable with the timestamp
-     * @access public
-     */
-    function unixtimestamp($expression)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-        return $error;
-    }
-
-    // }}}
-    // {{{ substring()
-
-    /**
-     * return string to call a function to get a substring inside an SQL statement
-     *
-     * @return string to call a function to get a substring
-     * @access public
-     */
-    function substring($value, $position = 1, $length = null)
-    {
-        if (null !== $length) {
-            return "SUBSTRING($value FROM $position FOR $length)";
-        }
-        return "SUBSTRING($value FROM $position)";
-    }
-
-    // }}}
-    // {{{ replace()
-
-    /**
-     * return string to call a function to get replace inside an SQL statement.
-     *
-     * @return string to call a function to get a replace
-     * @access public
-     */
-    function replace($str, $from_str, $to_str)
-    {
-        return "REPLACE($str, $from_str , $to_str)";
-    }
-
-    // }}}
-    // {{{ concat()
-
-    /**
-     * Returns string to concatenate two or more string parameters
-     *
-     * @param string $value1
-     * @param string $value2
-     * @param string $values...
-     *
-     * @return string to concatenate two strings
-     * @access public
-     */
-    function concat($value1, $value2)
-    {
-        $args = func_get_args();
-        return "(".implode(' || ', $args).")";
-    }
-
-    // }}}
-    // {{{ random()
-
-    /**
-     * return string to call a function to get random value inside an SQL statement
-     *
-     * @return return string to generate float between 0 and 1
-     * @access public
-     */
-    function random()
-    {
-        return 'RAND()';
-    }
-
-    // }}}
-    // {{{ lower()
-
-    /**
-     * return string to call a function to lower the case of an expression
-     *
-     * @param string $expression
-     *
-     * @return return string to lower case of an expression
-     * @access public
-     */
-    function lower($expression)
-    {
-        return "LOWER($expression)";
-    }
-
-    // }}}
-    // {{{ upper()
-
-    /**
-     * return string to call a function to upper the case of an expression
-     *
-     * @param string $expression
-     *
-     * @return return string to upper case of an expression
-     * @access public
-     */
-    function upper($expression)
-    {
-        return "UPPER($expression)";
-    }
-
-    // }}}
-    // {{{ length()
-
-    /**
-     * return string to call a function to get the length of a string expression
-     *
-     * @param string $expression
-     *
-     * @return return string to get the string expression length
-     * @access public
-     */
-    function length($expression)
-    {
-        return "LENGTH($expression)";
-    }
-
-    // }}}
-    // {{{ guid()
-
-    /**
-     * Returns global unique identifier
-     *
-     * @return string to get global unique identifier
-     * @access public
-     */
-    function guid()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-        return $error;
-    }
-
-    // }}}
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+
+/**
+ * Base class for the function modules that is extended by each MDB2 driver
+ *
+ * To load this module in the MDB2 object:
+ * $mdb->loadModule('Function');
+ *
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Function_Common extends MDB2_Module_Common
+{
+    // {{{ executeStoredProc()
+
+    /**
+     * Execute a stored procedure and return any results
+     *
+     * @param string $name string that identifies the function to execute
+     * @param mixed  $params  array that contains the paramaters to pass the stored proc
+     * @param mixed   $types  array that contains the types of the columns in
+     *                        the result set
+     * @param mixed $result_class string which specifies which result class to use
+     * @param mixed $result_wrap_class string which specifies which class to wrap results in
+     *
+     * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+        return $error;
+    }
+
+    // }}}
+    // {{{ functionTable()
+
+    /**
+     * return string for internal table used when calling only a function
+     *
+     * @return string for internal table used when calling only a function
+     * @access public
+     */
+    function functionTable()
+    {
+        return '';
+    }
+
+    // }}}
+    // {{{ now()
+
+    /**
+     * Return string to call a variable with the current timestamp inside an SQL statement
+     * There are three special variables for current date and time:
+     * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type)
+     * - CURRENT_DATE (date, DATE type)
+     * - CURRENT_TIME (time, TIME type)
+     *
+     * @param string $type 'timestamp' | 'time' | 'date'
+     *
+     * @return string to call a variable with the current timestamp
+     * @access public
+     */
+    function now($type = 'timestamp')
+    {
+        switch ($type) {
+        case 'time':
+            return 'CURRENT_TIME';
+        case 'date':
+            return 'CURRENT_DATE';
+        case 'timestamp':
+        default:
+            return 'CURRENT_TIMESTAMP';
+        }
+    }
+
+    // }}}
+    // {{{ unixtimestamp()
+
+    /**
+     * return string to call a function to get the unix timestamp from a iso timestamp
+     *
+     * @param string $expression
+     *
+     * @return string to call a variable with the timestamp
+     * @access public
+     */
+    function unixtimestamp($expression)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+        return $error;
+    }
+
+    // }}}
+    // {{{ substring()
+
+    /**
+     * return string to call a function to get a substring inside an SQL statement
+     *
+     * @return string to call a function to get a substring
+     * @access public
+     */
+    function substring($value, $position = 1, $length = null)
+    {
+        if (null !== $length) {
+            return "SUBSTRING($value FROM $position FOR $length)";
+        }
+        return "SUBSTRING($value FROM $position)";
+    }
+
+    // }}}
+    // {{{ replace()
+
+    /**
+     * return string to call a function to get replace inside an SQL statement.
+     *
+     * @return string to call a function to get a replace
+     * @access public
+     */
+    function replace($str, $from_str, $to_str)
+    {
+        return "REPLACE($str, $from_str , $to_str)";
+    }
+
+    // }}}
+    // {{{ concat()
+
+    /**
+     * Returns string to concatenate two or more string parameters
+     *
+     * @param string $value1
+     * @param string $value2
+     * @param string $values...
+     *
+     * @return string to concatenate two strings
+     * @access public
+     */
+    function concat($value1, $value2)
+    {
+        $args = func_get_args();
+        return "(".implode(' || ', $args).")";
+    }
+
+    // }}}
+    // {{{ random()
+
+    /**
+     * return string to call a function to get random value inside an SQL statement
+     *
+     * @return return string to generate float between 0 and 1
+     * @access public
+     */
+    function random()
+    {
+        return 'RAND()';
+    }
+
+    // }}}
+    // {{{ lower()
+
+    /**
+     * return string to call a function to lower the case of an expression
+     *
+     * @param string $expression
+     *
+     * @return return string to lower case of an expression
+     * @access public
+     */
+    function lower($expression)
+    {
+        return "LOWER($expression)";
+    }
+
+    // }}}
+    // {{{ upper()
+
+    /**
+     * return string to call a function to upper the case of an expression
+     *
+     * @param string $expression
+     *
+     * @return return string to upper case of an expression
+     * @access public
+     */
+    function upper($expression)
+    {
+        return "UPPER($expression)";
+    }
+
+    // }}}
+    // {{{ length()
+
+    /**
+     * return string to call a function to get the length of a string expression
+     *
+     * @param string $expression
+     *
+     * @return return string to get the string expression length
+     * @access public
+     */
+    function length($expression)
+    {
+        return "LENGTH($expression)";
+    }
+
+    // }}}
+    // {{{ guid()
+
+    /**
+     * Returns global unique identifier
+     *
+     * @return string to get global unique identifier
+     * @access public
+     */
+    function guid()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+        return $error;
+    }
+
+    // }}}
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Function/mysql.php b/3rdparty/MDB2/Driver/Function/mysql.php
index bf91536e1f39a1289b739d56c23bc26cbc4be4de..90fdafc973c1e869137d6c5f9a7d7e3175e4b501 100644
--- a/3rdparty/MDB2/Driver/Function/mysql.php
+++ b/3rdparty/MDB2/Driver/Function/mysql.php
@@ -1,136 +1,136 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Function/Common.php';
-
-/**
- * MDB2 MySQL driver for the function modules
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Function_mysql extends MDB2_Driver_Function_Common
-{
-     // }}}
-    // {{{ executeStoredProc()
-
-    /**
-     * Execute a stored procedure and return any results
-     *
-     * @param string $name string that identifies the function to execute
-     * @param mixed  $params  array that contains the paramaters to pass the stored proc
-     * @param mixed   $types  array that contains the types of the columns in
-     *                        the result set
-     * @param mixed $result_class string which specifies which result class to use
-     * @param mixed $result_wrap_class string which specifies which class to wrap results in
-     * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'CALL '.$name;
-        $query .= $params ? '('.implode(', ', $params).')' : '()';
-        return $db->query($query, $types, $result_class, $result_wrap_class);
-    }
-
-    // }}}
-    // {{{ unixtimestamp()
-
-    /**
-     * return string to call a function to get the unix timestamp from a iso timestamp
-     *
-     * @param string $expression
-     *
-     * @return string to call a variable with the timestamp
-     * @access public
-     */
-    function unixtimestamp($expression)
-    {
-        return 'UNIX_TIMESTAMP('. $expression.')';
-    }
-
-    // }}}
-    // {{{ concat()
-
-    /**
-     * Returns string to concatenate two or more string parameters
-     *
-     * @param string $value1
-     * @param string $value2
-     * @param string $values...
-     * @return string to concatenate two strings
-     * @access public
-     **/
-    function concat($value1, $value2)
-    {
-        $args = func_get_args();
-        return "CONCAT(".implode(', ', $args).")";
-    }
-
-    // }}}
-    // {{{ guid()
-
-    /**
-     * Returns global unique identifier
-     *
-     * @return string to get global unique identifier
-     * @access public
-     */
-    function guid()
-    {
-        return 'UUID()';
-    }
-
-    // }}}
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Function/Common.php';
+
+/**
+ * MDB2 MySQL driver for the function modules
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Function_mysql extends MDB2_Driver_Function_Common
+{
+     // }}}
+    // {{{ executeStoredProc()
+
+    /**
+     * Execute a stored procedure and return any results
+     *
+     * @param string $name string that identifies the function to execute
+     * @param mixed  $params  array that contains the paramaters to pass the stored proc
+     * @param mixed   $types  array that contains the types of the columns in
+     *                        the result set
+     * @param mixed $result_class string which specifies which result class to use
+     * @param mixed $result_wrap_class string which specifies which class to wrap results in
+     * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'CALL '.$name;
+        $query .= $params ? '('.implode(', ', $params).')' : '()';
+        return $db->query($query, $types, $result_class, $result_wrap_class);
+    }
+
+    // }}}
+    // {{{ unixtimestamp()
+
+    /**
+     * return string to call a function to get the unix timestamp from a iso timestamp
+     *
+     * @param string $expression
+     *
+     * @return string to call a variable with the timestamp
+     * @access public
+     */
+    function unixtimestamp($expression)
+    {
+        return 'UNIX_TIMESTAMP('. $expression.')';
+    }
+
+    // }}}
+    // {{{ concat()
+
+    /**
+     * Returns string to concatenate two or more string parameters
+     *
+     * @param string $value1
+     * @param string $value2
+     * @param string $values...
+     * @return string to concatenate two strings
+     * @access public
+     **/
+    function concat($value1, $value2)
+    {
+        $args = func_get_args();
+        return "CONCAT(".implode(', ', $args).")";
+    }
+
+    // }}}
+    // {{{ guid()
+
+    /**
+     * Returns global unique identifier
+     *
+     * @return string to get global unique identifier
+     * @access public
+     */
+    function guid()
+    {
+        return 'UUID()';
+    }
+
+    // }}}
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Function/pgsql.php b/3rdparty/MDB2/Driver/Function/pgsql.php
index e232e4feec15108e9f45187f2299b77c2223573c..7cc34a2d7042d52c51bed166e799d53d647fdffe 100644
--- a/3rdparty/MDB2/Driver/Function/pgsql.php
+++ b/3rdparty/MDB2/Driver/Function/pgsql.php
@@ -1,132 +1,132 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Paul Cooper <pgc@ucecom.com>                                 |
-// +----------------------------------------------------------------------+
-//
-// $Id: pgsql.php 296139 2010-03-13 04:15:22Z afz $
-
-require_once 'MDB2/Driver/Function/Common.php';
-
-/**
- * MDB2 MySQL driver for the function modules
- *
- * @package MDB2
- * @category Database
- * @author Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Function_pgsql extends MDB2_Driver_Function_Common
-{
-    // {{{ executeStoredProc()
-
-    /**
-     * Execute a stored procedure and return any results
-     *
-     * @param string $name string that identifies the function to execute
-     * @param mixed  $params  array that contains the paramaters to pass the stored proc
-     * @param mixed   $types  array that contains the types of the columns in
-     *                        the result set
-     * @param mixed $result_class string which specifies which result class to use
-     * @param mixed $result_wrap_class string which specifies which class to wrap results in
-     * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SELECT * FROM '.$name;
-        $query .= $params ? '('.implode(', ', $params).')' : '()';
-        return $db->query($query, $types, $result_class, $result_wrap_class);
-    }
-    // }}}
-    // {{{ unixtimestamp()
-
-    /**
-     * return string to call a function to get the unix timestamp from a iso timestamp
-     *
-     * @param string $expression
-     *
-     * @return string to call a variable with the timestamp
-     * @access public
-     */
-    function unixtimestamp($expression)
-    {
-        return 'EXTRACT(EPOCH FROM DATE_TRUNC(\'seconds\', CAST ((' . $expression . ') AS TIMESTAMP)))';
-    }
-
-    // }}}
-    // {{{ substring()
-
-    /**
-     * return string to call a function to get a substring inside an SQL statement
-     *
-     * @return string to call a function to get a substring
-     * @access public
-     */
-    function substring($value, $position = 1, $length = null)
-    {
-        if (null !== $length) {
-            return "SUBSTRING(CAST($value AS VARCHAR) FROM $position FOR $length)";
-        }
-        return "SUBSTRING(CAST($value AS VARCHAR) FROM $position)";
-    }
-
-    // }}}
-    // {{{ random()
-
-    /**
-     * return string to call a function to get random value inside an SQL statement
-     *
-     * @return return string to generate float between 0 and 1
-     * @access public
-     */
-    function random()
-    {
-        return 'RANDOM()';
-    }
-
-    // }}}
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Paul Cooper <pgc@ucecom.com>                                 |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+require_once 'MDB2/Driver/Function/Common.php';
+
+/**
+ * MDB2 MySQL driver for the function modules
+ *
+ * @package MDB2
+ * @category Database
+ * @author Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Function_pgsql extends MDB2_Driver_Function_Common
+{
+    // {{{ executeStoredProc()
+
+    /**
+     * Execute a stored procedure and return any results
+     *
+     * @param string $name string that identifies the function to execute
+     * @param mixed  $params  array that contains the paramaters to pass the stored proc
+     * @param mixed   $types  array that contains the types of the columns in
+     *                        the result set
+     * @param mixed $result_class string which specifies which result class to use
+     * @param mixed $result_wrap_class string which specifies which class to wrap results in
+     * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SELECT * FROM '.$name;
+        $query .= $params ? '('.implode(', ', $params).')' : '()';
+        return $db->query($query, $types, $result_class, $result_wrap_class);
+    }
+    // }}}
+    // {{{ unixtimestamp()
+
+    /**
+     * return string to call a function to get the unix timestamp from a iso timestamp
+     *
+     * @param string $expression
+     *
+     * @return string to call a variable with the timestamp
+     * @access public
+     */
+    function unixtimestamp($expression)
+    {
+        return 'EXTRACT(EPOCH FROM DATE_TRUNC(\'seconds\', CAST ((' . $expression . ') AS TIMESTAMP)))';
+    }
+
+    // }}}
+    // {{{ substring()
+
+    /**
+     * return string to call a function to get a substring inside an SQL statement
+     *
+     * @return string to call a function to get a substring
+     * @access public
+     */
+    function substring($value, $position = 1, $length = null)
+    {
+        if (null !== $length) {
+            return "SUBSTRING(CAST($value AS VARCHAR) FROM $position FOR $length)";
+        }
+        return "SUBSTRING(CAST($value AS VARCHAR) FROM $position)";
+    }
+
+    // }}}
+    // {{{ random()
+
+    /**
+     * return string to call a function to get random value inside an SQL statement
+     *
+     * @return return string to generate float between 0 and 1
+     * @access public
+     */
+    function random()
+    {
+        return 'RANDOM()';
+    }
+
+    // }}}
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Function/sqlite.php b/3rdparty/MDB2/Driver/Function/sqlite.php
index 0a46a4f06a5233228c8a9c3d7de957952c2c476f..65ade4fec07f999bcd69661719845a89041e0797 100644
--- a/3rdparty/MDB2/Driver/Function/sqlite.php
+++ b/3rdparty/MDB2/Driver/Function/sqlite.php
@@ -1,162 +1,162 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Function/Common.php';
-
-/**
- * MDB2 SQLite driver for the function modules
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Function_sqlite extends MDB2_Driver_Function_Common
-{
-    // {{{ constructor
-
-    /**
-     * Constructor
-     */
-    function __construct($db_index)
-    {
-        parent::__construct($db_index);
-        // create all sorts of UDFs
-    }
-
-    // {{{ now()
-
-    /**
-     * Return string to call a variable with the current timestamp inside an SQL statement
-     * There are three special variables for current date and time.
-     *
-     * @return string to call a variable with the current timestamp
-     * @access public
-     */
-    function now($type = 'timestamp')
-    {
-        switch ($type) {
-        case 'time':
-            return 'time(\'now\')';
-        case 'date':
-            return 'date(\'now\')';
-        case 'timestamp':
-        default:
-            return 'datetime(\'now\')';
-        }
-    }
-
-    // }}}
-    // {{{ unixtimestamp()
-
-    /**
-     * return string to call a function to get the unix timestamp from a iso timestamp
-     *
-     * @param string $expression
-     *
-     * @return string to call a variable with the timestamp
-     * @access public
-     */
-    function unixtimestamp($expression)
-    {
-        return 'strftime("%s",'. $expression.', "utc")';
-    }
-
-    // }}}
-    // {{{ substring()
-
-    /**
-     * return string to call a function to get a substring inside an SQL statement
-     *
-     * @return string to call a function to get a substring
-     * @access public
-     */
-    function substring($value, $position = 1, $length = null)
-    {
-        if (null !== $length) {
-            return "substr($value, $position, $length)";
-        }
-        return "substr($value, $position, length($value))";
-    }
-
-    // }}}
-    // {{{ random()
-
-    /**
-     * return string to call a function to get random value inside an SQL statement
-     *
-     * @return return string to generate float between 0 and 1
-     * @access public
-     */
-    function random()
-    {
-        return '((RANDOM()+2147483648)/4294967296)';
-    }
-
-    // }}}
-    // {{{ replace()
-
-    /**
-     * return string to call a function to get a replacement inside an SQL statement.
-     *
-     * @return string to call a function to get a replace
-     * @access public
-     */
-    function replace($str, $from_str, $to_str)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-        return $error;
-    }
-
-    // }}}
-}
-?>
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Function/Common.php';
+
+/**
+ * MDB2 SQLite driver for the function modules
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Function_sqlite extends MDB2_Driver_Function_Common
+{
+    // {{{ constructor
+
+    /**
+     * Constructor
+     */
+    function __construct($db_index)
+    {
+        parent::__construct($db_index);
+        // create all sorts of UDFs
+    }
+
+    // {{{ now()
+
+    /**
+     * Return string to call a variable with the current timestamp inside an SQL statement
+     * There are three special variables for current date and time.
+     *
+     * @return string to call a variable with the current timestamp
+     * @access public
+     */
+    function now($type = 'timestamp')
+    {
+        switch ($type) {
+        case 'time':
+            return 'time(\'now\')';
+        case 'date':
+            return 'date(\'now\')';
+        case 'timestamp':
+        default:
+            return 'datetime(\'now\')';
+        }
+    }
+
+    // }}}
+    // {{{ unixtimestamp()
+
+    /**
+     * return string to call a function to get the unix timestamp from a iso timestamp
+     *
+     * @param string $expression
+     *
+     * @return string to call a variable with the timestamp
+     * @access public
+     */
+    function unixtimestamp($expression)
+    {
+        return 'strftime("%s",'. $expression.', "utc")';
+    }
+
+    // }}}
+    // {{{ substring()
+
+    /**
+     * return string to call a function to get a substring inside an SQL statement
+     *
+     * @return string to call a function to get a substring
+     * @access public
+     */
+    function substring($value, $position = 1, $length = null)
+    {
+        if (null !== $length) {
+            return "substr($value, $position, $length)";
+        }
+        return "substr($value, $position, length($value))";
+    }
+
+    // }}}
+    // {{{ random()
+
+    /**
+     * return string to call a function to get random value inside an SQL statement
+     *
+     * @return return string to generate float between 0 and 1
+     * @access public
+     */
+    function random()
+    {
+        return '((RANDOM()+2147483648)/4294967296)';
+    }
+
+    // }}}
+    // {{{ replace()
+
+    /**
+     * return string to call a function to get a replacement inside an SQL statement.
+     *
+     * @return string to call a function to get a replace
+     * @access public
+     */
+    function replace($str, $from_str, $to_str)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+        return $error;
+    }
+
+    // }}}
+}
+?>
diff --git a/3rdparty/MDB2/Driver/Manager/Common.php b/3rdparty/MDB2/Driver/Manager/Common.php
index fadd72934d626a170704645b0c50e4182614cedf..2e99c332a231432930f98b00bceea71c84ac6661 100644
--- a/3rdparty/MDB2/Driver/Manager/Common.php
+++ b/3rdparty/MDB2/Driver/Manager/Common.php
@@ -1,1014 +1,1038 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Authors: Lukas Smith <smith@pooteeweet.org>                          |
-// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
-// +----------------------------------------------------------------------+
-//
-// $Id: Common.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-/**
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- * @author   Lorenzo Alberton <l.alberton@quipo.it>
- */
-
-/**
- * Base class for the management modules that is extended by each MDB2 driver
- *
- * To load this module in the MDB2 object:
- * $mdb->loadModule('Manager');
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Manager_Common extends MDB2_Module_Common
-{
-    // {{{ splitTableSchema()
-
-    /**
-     * Split the "[owner|schema].table" notation into an array
-     *
-     * @param string $table [schema and] table name
-     *
-     * @return array array(schema, table)
-     * @access private
-     */
-    function splitTableSchema($table)
-    {
-        $ret = array();
-        if (strpos($table, '.') !== false) {
-            return explode('.', $table);
-        }
-        return array(null, $table);
-    }
-
-    // }}}
-    // {{{ getFieldDeclarationList()
-
-    /**
-     * Get declaration of a number of field in bulk
-     *
-     * @param array $fields  a multidimensional associative array.
-     *      The first dimension determines the field name, while the second
-     *      dimension is keyed with the name of the properties
-     *      of the field being declared as array indexes. Currently, the types
-     *      of supported field properties are as follows:
-     *
-     *      default
-     *          Boolean value to be used as default for this field.
-     *
-     *      notnull
-     *          Boolean flag that indicates whether this field is constrained
-     *          to not be set to null.
-     *
-     * @return mixed string on success, a MDB2 error on failure
-     * @access public
-     */
-    function getFieldDeclarationList($fields)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!is_array($fields) || empty($fields)) {
-            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                'missing any fields', __FUNCTION__);
-        }
-        foreach ($fields as $field_name => $field) {
-            $query = $db->getDeclaration($field['type'], $field_name, $field);
-            if (PEAR::isError($query)) {
-                return $query;
-            }
-            $query_fields[] = $query;
-        }
-        return implode(', ', $query_fields);
-    }
-
-    // }}}
-    // {{{ _fixSequenceName()
-
-    /**
-     * Removes any formatting in an sequence name using the 'seqname_format' option
-     *
-     * @param string $sqn string that containts name of a potential sequence
-     * @param bool $check if only formatted sequences should be returned
-     * @return string name of the sequence with possible formatting removed
-     * @access protected
-     */
-    function _fixSequenceName($sqn, $check = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $seq_pattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $db->options['seqname_format']).'$/i';
-        $seq_name = preg_replace($seq_pattern, '\\1', $sqn);
-        if ($seq_name && !strcasecmp($sqn, $db->getSequenceName($seq_name))) {
-            return $seq_name;
-        }
-        if ($check) {
-            return false;
-        }
-        return $sqn;
-    }
-
-    // }}}
-    // {{{ _fixIndexName()
-
-    /**
-     * Removes any formatting in an index name using the 'idxname_format' option
-     *
-     * @param string $idx string that containts name of anl index
-     * @return string name of the index with eventual formatting removed
-     * @access protected
-     */
-    function _fixIndexName($idx)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $idx_pattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $db->options['idxname_format']).'$/i';
-        $idx_name = preg_replace($idx_pattern, '\\1', $idx);
-        if ($idx_name && !strcasecmp($idx, $db->getIndexName($idx_name))) {
-            return $idx_name;
-        }
-        return $idx;
-    }
-
-    // }}}
-    // {{{ createDatabase()
-
-    /**
-     * create a new database
-     *
-     * @param string $name    name of the database that should be created
-     * @param array  $options array with charset, collation info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createDatabase($database, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ alterDatabase()
-
-    /**
-     * alter an existing database
-     *
-     * @param string $name    name of the database that should be created
-     * @param array  $options array with charset, collation info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function alterDatabase($database, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ dropDatabase()
-
-    /**
-     * drop an existing database
-     *
-     * @param string $name name of the database that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropDatabase($database)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ _getCreateTableQuery()
-
-    /**
-     * Create a basic SQL query for a new table creation
-     *
-     * @param string $name    Name of the database that should be created
-     * @param array  $fields  Associative array that contains the definition of each field of the new table
-     * @param array  $options An associative array of table options
-     *
-     * @return mixed string (the SQL query) on success, a MDB2 error on failure
-     * @see createTable()
-     */
-    function _getCreateTableQuery($name, $fields, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!$name) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
-                'no valid table name specified', __FUNCTION__);
-        }
-        if (empty($fields)) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
-                'no fields specified for table "'.$name.'"', __FUNCTION__);
-        }
-        $query_fields = $this->getFieldDeclarationList($fields);
-        if (PEAR::isError($query_fields)) {
-            return $query_fields;
-        }
-        if (!empty($options['primary'])) {
-            $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')';
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        $result = 'CREATE ';
-        if (!empty($options['temporary'])) {
-            $result .= $this->_getTemporaryTableQuery();
-        }
-        $result .= " TABLE $name ($query_fields)";
-        return $result;
-    }
-
-    // }}}
-    // {{{ _getTemporaryTableQuery()
-
-    /**
-     * A method to return the required SQL string that fits between CREATE ... TABLE
-     * to create the table as a temporary table.
-     *
-     * Should be overridden in driver classes to return the correct string for the
-     * specific database type.
-     *
-     * The default is to return the string "TEMPORARY" - this will result in a
-     * SQL error for any database that does not support temporary tables, or that
-     * requires a different SQL command from "CREATE TEMPORARY TABLE".
-     *
-     * @return string The string required to be placed between "CREATE" and "TABLE"
-     *                to generate a temporary table, if possible.
-     */
-    function _getTemporaryTableQuery()
-    {
-        return 'TEMPORARY';
-    }
-
-    // }}}
-    // {{{ createTable()
-
-    /**
-     * create a new table
-     *
-     * @param string $name   Name of the database that should be created
-     * @param array $fields  Associative array that contains the definition of each field of the new table
-     *                       The indexes of the array entries are the names of the fields of the table an
-     *                       the array entry values are associative arrays like those that are meant to be
-     *                       passed with the field definitions to get[Type]Declaration() functions.
-     *                          array(
-     *                              'id' => array(
-     *                                  'type' => 'integer',
-     *                                  'unsigned' => 1
-     *                                  'notnull' => 1
-     *                                  'default' => 0
-     *                              ),
-     *                              'name' => array(
-     *                                  'type' => 'text',
-     *                                  'length' => 12
-     *                              ),
-     *                              'password' => array(
-     *                                  'type' => 'text',
-     *                                  'length' => 12
-     *                              )
-     *                          );
-     * @param array $options  An associative array of table options:
-     *                          array(
-     *                              'comment' => 'Foo',
-     *                              'temporary' => true|false,
-     *                          );
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createTable($name, $fields, $options = array())
-    {
-        $query = $this->_getCreateTableQuery($name, $fields, $options);
-        if (PEAR::isError($query)) {
-            return $query;
-        }
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $result = $db->exec($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ dropTable()
-
-    /**
-     * drop an existing table
-     *
-     * @param string $name name of the table that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropTable($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        return $db->exec("DROP TABLE $name");
-    }
-
-    // }}}
-    // {{{ truncateTable()
-
-    /**
-     * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported,
-     * it falls back to a DELETE FROM TABLE query)
-     *
-     * @param string $name name of the table that should be truncated
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function truncateTable($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        return $db->exec("DELETE FROM $name");
-    }
-
-    // }}}
-    // {{{ vacuum()
-
-    /**
-     * Optimize (vacuum) all the tables in the db (or only the specified table)
-     * and optionally run ANALYZE.
-     *
-     * @param string $table table name (all the tables if empty)
-     * @param array  $options an array with driver-specific options:
-     *               - timeout [int] (in seconds) [mssql-only]
-     *               - analyze [boolean] [pgsql and mysql]
-     *               - full [boolean] [pgsql-only]
-     *               - freeze [boolean] [pgsql-only]
-     *
-     * @return mixed MDB2_OK success, a MDB2 error on failure
-     * @access public
-     */
-    function vacuum($table = null, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ alterTable()
-
-    /**
-     * alter an existing table
-     *
-     * @param string $name         name of the table that is intended to be changed.
-     * @param array $changes     associative array that contains the details of each type
-     *                             of change that is intended to be performed. The types of
-     *                             changes that are currently supported are defined as follows:
-     *
-     *                             name
-     *
-     *                                New name for the table.
-     *
-     *                            add
-     *
-     *                                Associative array with the names of fields to be added as
-     *                                 indexes of the array. The value of each entry of the array
-     *                                 should be set to another associative array with the properties
-     *                                 of the fields to be added. The properties of the fields should
-     *                                 be the same as defined by the MDB2 parser.
-     *
-     *
-     *                            remove
-     *
-     *                                Associative array with the names of fields to be removed as indexes
-     *                                 of the array. Currently the values assigned to each entry are ignored.
-     *                                 An empty array should be used for future compatibility.
-     *
-     *                            rename
-     *
-     *                                Associative array with the names of fields to be renamed as indexes
-     *                                 of the array. The value of each entry of the array should be set to
-     *                                 another associative array with the entry named name with the new
-     *                                 field name and the entry named Declaration that is expected to contain
-     *                                 the portion of the field declaration already in DBMS specific SQL code
-     *                                 as it is used in the CREATE TABLE statement.
-     *
-     *                            change
-     *
-     *                                Associative array with the names of the fields to be changed as indexes
-     *                                 of the array. Keep in mind that if it is intended to change either the
-     *                                 name of a field and any other properties, the change array entries
-     *                                 should have the new names of the fields as array indexes.
-     *
-     *                                The value of each entry of the array should be set to another associative
-     *                                 array with the properties of the fields to that are meant to be changed as
-     *                                 array entries. These entries should be assigned to the new values of the
-     *                                 respective properties. The properties of the fields should be the same
-     *                                 as defined by the MDB2 parser.
-     *
-     *                            Example
-     *                                array(
-     *                                    'name' => 'userlist',
-     *                                    'add' => array(
-     *                                        'quota' => array(
-     *                                            'type' => 'integer',
-     *                                            'unsigned' => 1
-     *                                        )
-     *                                    ),
-     *                                    'remove' => array(
-     *                                        'file_limit' => array(),
-     *                                        'time_limit' => array()
-     *                                    ),
-     *                                    'change' => array(
-     *                                        'name' => array(
-     *                                            'length' => '20',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 20,
-     *                                            ),
-     *                                        )
-     *                                    ),
-     *                                    'rename' => array(
-     *                                        'sex' => array(
-     *                                            'name' => 'gender',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 1,
-     *                                                'default' => 'M',
-     *                                            ),
-     *                                        )
-     *                                    )
-     *                                )
-     *
-     * @param boolean $check     indicates whether the function should just check if the DBMS driver
-     *                             can perform the requested table alterations if the value is true or
-     *                             actually perform them otherwise.
-     * @access public
-     *
-      * @return mixed MDB2_OK on success, a MDB2 error on failure
-     */
-    function alterTable($name, $changes, $check)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listDatabases()
-
-    /**
-     * list all databases
-     *
-     * @return mixed array of database names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listDatabases()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implementedd', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listUsers()
-
-    /**
-     * list all users
-     *
-     * @return mixed array of user names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listUsers()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listViews()
-
-    /**
-     * list all views in the current database
-     *
-     * @param string database, the current is default
-     *               NB: not all the drivers can get the view names from
-     *               a database other than the current one
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listViews($database = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listTableViews()
-
-    /**
-     * list the views in the database that reference a given table
-     *
-     * @param string table for which all referenced views should be found
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableViews($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listTableTriggers()
-
-    /**
-     * list all triggers in the database that reference a given table
-     *
-     * @param string table for which all referenced triggers should be found
-     * @return mixed array of trigger names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableTriggers($table = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listFunctions()
-
-    /**
-     * list all functions in the current database
-     *
-     * @return mixed array of function names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listFunctions()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listTables()
-
-    /**
-     * list all tables in the current database
-     *
-     * @param string database, the current is default.
-     *               NB: not all the drivers can get the table names from
-     *               a database other than the current one
-     * @return mixed array of table names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTables($database = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listTableFields()
-
-    /**
-     * list all fields in a table in the current database
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of field names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableFields($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ createIndex()
-
-    /**
-     * Get the stucture of a field into an array
-     *
-     * @param string    $table         name of the table on which the index is to be created
-     * @param string    $name         name of the index to be created
-     * @param array     $definition        associative array that defines properties of the index to be created.
-     *                                 Currently, only one property named FIELDS is supported. This property
-     *                                 is also an associative with the names of the index fields as array
-     *                                 indexes. Each entry of this array is set to another type of associative
-     *                                 array that specifies properties of the index that are specific to
-     *                                 each field.
-     *
-     *                                Currently, only the sorting property is supported. It should be used
-     *                                 to define the sorting direction of the index. It may be set to either
-     *                                 ascending or descending.
-     *
-     *                                Not all DBMS support index sorting direction configuration. The DBMS
-     *                                 drivers of those that do not support it ignore this property. Use the
-     *                                 function supports() to determine whether the DBMS driver can manage indexes.
-     *
-     *                                 Example
-     *                                    array(
-     *                                        'fields' => array(
-     *                                            'user_name' => array(
-     *                                                'sorting' => 'ascending'
-     *                                            ),
-     *                                            'last_login' => array()
-     *                                        )
-     *                                    )
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createIndex($table, $name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        $query = "CREATE INDEX $name ON $table";
-        $fields = array();
-        foreach (array_keys($definition['fields']) as $field) {
-            $fields[] = $db->quoteIdentifier($field, true);
-        }
-        $query .= ' ('. implode(', ', $fields) . ')';
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ dropIndex()
-
-    /**
-     * drop existing index
-     *
-     * @param string    $table         name of table that should be used in method
-     * @param string    $name         name of the index to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropIndex($table, $name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        return $db->exec("DROP INDEX $name");
-    }
-
-    // }}}
-    // {{{ listTableIndexes()
-
-    /**
-     * list all indexes in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of index names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableIndexes($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ _getAdvancedFKOptions()
-
-    /**
-     * Return the FOREIGN KEY query section dealing with non-standard options
-     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
-     *
-     * @param array $definition
-     * @return string
-     * @access protected
-     */
-    function _getAdvancedFKOptions($definition)
-    {
-        return '';
-    }
-
-    // }}}
-    // {{{ createConstraint()
-
-    /**
-     * create a constraint on a table
-     *
-     * @param string    $table       name of the table on which the constraint is to be created
-     * @param string    $name        name of the constraint to be created
-     * @param array     $definition  associative array that defines properties of the constraint to be created.
-     *                               The full structure of the array looks like this:
-     *          <pre>
-     *          array (
-     *              [primary] => 0
-     *              [unique]  => 0
-     *              [foreign] => 1
-     *              [check]   => 0
-     *              [fields] => array (
-     *                  [field1name] => array() // one entry per each field covered
-     *                  [field2name] => array() // by the index
-     *                  [field3name] => array(
-     *                      [sorting]  => ascending
-     *                      [position] => 3
-     *                  )
-     *              )
-     *              [references] => array(
-     *                  [table] => name
-     *                  [fields] => array(
-     *                      [field1name] => array(  //one entry per each referenced field
-     *                           [position] => 1
-     *                      )
-     *                  )
-     *              )
-     *              [deferrable] => 0
-     *              [initiallydeferred] => 0
-     *              [onupdate] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
-     *              [ondelete] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
-     *              [match] => SIMPLE|PARTIAL|FULL
-     *          );
-     *          </pre>
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createConstraint($table, $name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $table = $db->quoteIdentifier($table, true);
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        $query = "ALTER TABLE $table ADD CONSTRAINT $name";
-        if (!empty($definition['primary'])) {
-            $query.= ' PRIMARY KEY';
-        } elseif (!empty($definition['unique'])) {
-            $query.= ' UNIQUE';
-        } elseif (!empty($definition['foreign'])) {
-            $query.= ' FOREIGN KEY';
-        }
-        $fields = array();
-        foreach (array_keys($definition['fields']) as $field) {
-            $fields[] = $db->quoteIdentifier($field, true);
-        }
-        $query .= ' ('. implode(', ', $fields) . ')';
-        if (!empty($definition['foreign'])) {
-            $query.= ' REFERENCES ' . $db->quoteIdentifier($definition['references']['table'], true);
-            $referenced_fields = array();
-            foreach (array_keys($definition['references']['fields']) as $field) {
-                $referenced_fields[] = $db->quoteIdentifier($field, true);
-            }
-            $query .= ' ('. implode(', ', $referenced_fields) . ')';
-            $query .= $this->_getAdvancedFKOptions($definition);
-        }
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ dropConstraint()
-
-    /**
-     * drop existing constraint
-     *
-     * @param string    $table        name of table that should be used in method
-     * @param string    $name         name of the constraint to be dropped
-     * @param string    $primary      hint if the constraint is primary
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropConstraint($table, $name, $primary = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        return $db->exec("ALTER TABLE $table DROP CONSTRAINT $name");
-    }
-
-    // }}}
-    // {{{ listTableConstraints()
-
-    /**
-     * list all constraints in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of constraint names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableConstraints($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ createSequence()
-
-    /**
-     * create sequence
-     *
-     * @param string    $seq_name     name of the sequence to be created
-     * @param string    $start         start value of the sequence; default is 1
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createSequence($seq_name, $start = 1)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ dropSequence()
-
-    /**
-     * drop existing sequence
-     *
-     * @param string    $seq_name     name of the sequence to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropSequence($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listSequences()
-
-    /**
-     * list all sequences in the current database
-     *
-     * @param string database, the current is default
-     *               NB: not all the drivers can get the sequence names from
-     *               a database other than the current one
-     * @return mixed array of sequence names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listSequences($database = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-}
-?>
\ No newline at end of file
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Authors: Lukas Smith <smith@pooteeweet.org>                          |
+// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ * @author   Lorenzo Alberton <l.alberton@quipo.it>
+ */
+
+/**
+ * Base class for the management modules that is extended by each MDB2 driver
+ *
+ * To load this module in the MDB2 object:
+ * $mdb->loadModule('Manager');
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Manager_Common extends MDB2_Module_Common
+{
+    // {{{ splitTableSchema()
+
+    /**
+     * Split the "[owner|schema].table" notation into an array
+     *
+     * @param string $table [schema and] table name
+     *
+     * @return array array(schema, table)
+     * @access private
+     */
+    function splitTableSchema($table)
+    {
+        $ret = array();
+        if (strpos($table, '.') !== false) {
+            return explode('.', $table);
+        }
+        return array(null, $table);
+    }
+
+    // }}}
+    // {{{ getFieldDeclarationList()
+
+    /**
+     * Get declaration of a number of field in bulk
+     *
+     * @param array $fields  a multidimensional associative array.
+     *      The first dimension determines the field name, while the second
+     *      dimension is keyed with the name of the properties
+     *      of the field being declared as array indexes. Currently, the types
+     *      of supported field properties are as follows:
+     *
+     *      default
+     *          Boolean value to be used as default for this field.
+     *
+     *      notnull
+     *          Boolean flag that indicates whether this field is constrained
+     *          to not be set to null.
+     *
+     * @return mixed string on success, a MDB2 error on failure
+     * @access public
+     */
+    function getFieldDeclarationList($fields)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!is_array($fields) || empty($fields)) {
+            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                'missing any fields', __FUNCTION__);
+        }
+        foreach ($fields as $field_name => $field) {
+            $query = $db->getDeclaration($field['type'], $field_name, $field);
+            if (PEAR::isError($query)) {
+                return $query;
+            }
+            $query_fields[] = $query;
+        }
+        return implode(', ', $query_fields);
+    }
+
+    // }}}
+    // {{{ _fixSequenceName()
+
+    /**
+     * Removes any formatting in an sequence name using the 'seqname_format' option
+     *
+     * @param string $sqn string that containts name of a potential sequence
+     * @param bool $check if only formatted sequences should be returned
+     * @return string name of the sequence with possible formatting removed
+     * @access protected
+     */
+    function _fixSequenceName($sqn, $check = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $seq_pattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $db->options['seqname_format']).'$/i';
+        $seq_name = preg_replace($seq_pattern, '\\1', $sqn);
+        if ($seq_name && !strcasecmp($sqn, $db->getSequenceName($seq_name))) {
+            return $seq_name;
+        }
+        if ($check) {
+            return false;
+        }
+        return $sqn;
+    }
+
+    // }}}
+    // {{{ _fixIndexName()
+
+    /**
+     * Removes any formatting in an index name using the 'idxname_format' option
+     *
+     * @param string $idx string that containts name of anl index
+     * @return string name of the index with eventual formatting removed
+     * @access protected
+     */
+    function _fixIndexName($idx)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $idx_pattern = '/^'.preg_replace('/%s/', '([a-z0-9_]+)', $db->options['idxname_format']).'$/i';
+        $idx_name = preg_replace($idx_pattern, '\\1', $idx);
+        if ($idx_name && !strcasecmp($idx, $db->getIndexName($idx_name))) {
+            return $idx_name;
+        }
+        return $idx;
+    }
+
+    // }}}
+    // {{{ createDatabase()
+
+    /**
+     * create a new database
+     *
+     * @param string $name    name of the database that should be created
+     * @param array  $options array with charset, collation info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createDatabase($database, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ alterDatabase()
+
+    /**
+     * alter an existing database
+     *
+     * @param string $name    name of the database that should be created
+     * @param array  $options array with charset, collation info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function alterDatabase($database, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ dropDatabase()
+
+    /**
+     * drop an existing database
+     *
+     * @param string $name name of the database that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropDatabase($database)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ _getCreateTableQuery()
+
+    /**
+     * Create a basic SQL query for a new table creation
+     *
+     * @param string $name    Name of the database that should be created
+     * @param array  $fields  Associative array that contains the definition of each field of the new table
+     * @param array  $options An associative array of table options
+     *
+     * @return mixed string (the SQL query) on success, a MDB2 error on failure
+     * @see createTable()
+     */
+    function _getCreateTableQuery($name, $fields, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!$name) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
+                'no valid table name specified', __FUNCTION__);
+        }
+        if (empty($fields)) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
+                'no fields specified for table "'.$name.'"', __FUNCTION__);
+        }
+        $query_fields = $this->getFieldDeclarationList($fields);
+        if (PEAR::isError($query_fields)) {
+            return $query_fields;
+        }
+        if (!empty($options['primary'])) {
+            $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')';
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = 'CREATE ';
+        if (!empty($options['temporary'])) {
+            $result .= $this->_getTemporaryTableQuery();
+        }
+        $result .= " TABLE $name ($query_fields)";
+        return $result;
+    }
+
+    // }}}
+    // {{{ _getTemporaryTableQuery()
+
+    /**
+     * A method to return the required SQL string that fits between CREATE ... TABLE
+     * to create the table as a temporary table.
+     *
+     * Should be overridden in driver classes to return the correct string for the
+     * specific database type.
+     *
+     * The default is to return the string "TEMPORARY" - this will result in a
+     * SQL error for any database that does not support temporary tables, or that
+     * requires a different SQL command from "CREATE TEMPORARY TABLE".
+     *
+     * @return string The string required to be placed between "CREATE" and "TABLE"
+     *                to generate a temporary table, if possible.
+     */
+    function _getTemporaryTableQuery()
+    {
+        return 'TEMPORARY';
+    }
+
+    // }}}
+    // {{{ createTable()
+
+    /**
+     * create a new table
+     *
+     * @param string $name   Name of the database that should be created
+     * @param array $fields  Associative array that contains the definition of each field of the new table
+     *                       The indexes of the array entries are the names of the fields of the table an
+     *                       the array entry values are associative arrays like those that are meant to be
+     *                       passed with the field definitions to get[Type]Declaration() functions.
+     *                          array(
+     *                              'id' => array(
+     *                                  'type' => 'integer',
+     *                                  'unsigned' => 1
+     *                                  'notnull' => 1
+     *                                  'default' => 0
+     *                              ),
+     *                              'name' => array(
+     *                                  'type' => 'text',
+     *                                  'length' => 12
+     *                              ),
+     *                              'password' => array(
+     *                                  'type' => 'text',
+     *                                  'length' => 12
+     *                              )
+     *                          );
+     * @param array $options  An associative array of table options:
+     *                          array(
+     *                              'comment' => 'Foo',
+     *                              'temporary' => true|false,
+     *                          );
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createTable($name, $fields, $options = array())
+    {
+        $query = $this->_getCreateTableQuery($name, $fields, $options);
+        if (PEAR::isError($query)) {
+            return $query;
+        }
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        $result = $db->exec($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropTable()
+
+    /**
+     * drop an existing table
+     *
+     * @param string $name name of the table that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("DROP TABLE $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ truncateTable()
+
+    /**
+     * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported,
+     * it falls back to a DELETE FROM TABLE query)
+     *
+     * @param string $name name of the table that should be truncated
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function truncateTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("DELETE FROM $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ vacuum()
+
+    /**
+     * Optimize (vacuum) all the tables in the db (or only the specified table)
+     * and optionally run ANALYZE.
+     *
+     * @param string $table table name (all the tables if empty)
+     * @param array  $options an array with driver-specific options:
+     *               - timeout [int] (in seconds) [mssql-only]
+     *               - analyze [boolean] [pgsql and mysql]
+     *               - full [boolean] [pgsql-only]
+     *               - freeze [boolean] [pgsql-only]
+     *
+     * @return mixed MDB2_OK success, a MDB2 error on failure
+     * @access public
+     */
+    function vacuum($table = null, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ alterTable()
+
+    /**
+     * alter an existing table
+     *
+     * @param string $name         name of the table that is intended to be changed.
+     * @param array $changes     associative array that contains the details of each type
+     *                             of change that is intended to be performed. The types of
+     *                             changes that are currently supported are defined as follows:
+     *
+     *                             name
+     *
+     *                                New name for the table.
+     *
+     *                            add
+     *
+     *                                Associative array with the names of fields to be added as
+     *                                 indexes of the array. The value of each entry of the array
+     *                                 should be set to another associative array with the properties
+     *                                 of the fields to be added. The properties of the fields should
+     *                                 be the same as defined by the MDB2 parser.
+     *
+     *
+     *                            remove
+     *
+     *                                Associative array with the names of fields to be removed as indexes
+     *                                 of the array. Currently the values assigned to each entry are ignored.
+     *                                 An empty array should be used for future compatibility.
+     *
+     *                            rename
+     *
+     *                                Associative array with the names of fields to be renamed as indexes
+     *                                 of the array. The value of each entry of the array should be set to
+     *                                 another associative array with the entry named name with the new
+     *                                 field name and the entry named Declaration that is expected to contain
+     *                                 the portion of the field declaration already in DBMS specific SQL code
+     *                                 as it is used in the CREATE TABLE statement.
+     *
+     *                            change
+     *
+     *                                Associative array with the names of the fields to be changed as indexes
+     *                                 of the array. Keep in mind that if it is intended to change either the
+     *                                 name of a field and any other properties, the change array entries
+     *                                 should have the new names of the fields as array indexes.
+     *
+     *                                The value of each entry of the array should be set to another associative
+     *                                 array with the properties of the fields to that are meant to be changed as
+     *                                 array entries. These entries should be assigned to the new values of the
+     *                                 respective properties. The properties of the fields should be the same
+     *                                 as defined by the MDB2 parser.
+     *
+     *                            Example
+     *                                array(
+     *                                    'name' => 'userlist',
+     *                                    'add' => array(
+     *                                        'quota' => array(
+     *                                            'type' => 'integer',
+     *                                            'unsigned' => 1
+     *                                        )
+     *                                    ),
+     *                                    'remove' => array(
+     *                                        'file_limit' => array(),
+     *                                        'time_limit' => array()
+     *                                    ),
+     *                                    'change' => array(
+     *                                        'name' => array(
+     *                                            'length' => '20',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 20,
+     *                                            ),
+     *                                        )
+     *                                    ),
+     *                                    'rename' => array(
+     *                                        'sex' => array(
+     *                                            'name' => 'gender',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 1,
+     *                                                'default' => 'M',
+     *                                            ),
+     *                                        )
+     *                                    )
+     *                                )
+     *
+     * @param boolean $check     indicates whether the function should just check if the DBMS driver
+     *                             can perform the requested table alterations if the value is true or
+     *                             actually perform them otherwise.
+     * @access public
+     *
+      * @return mixed MDB2_OK on success, a MDB2 error on failure
+     */
+    function alterTable($name, $changes, $check)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listDatabases()
+
+    /**
+     * list all databases
+     *
+     * @return mixed array of database names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listDatabases()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implementedd', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listUsers()
+
+    /**
+     * list all users
+     *
+     * @return mixed array of user names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listUsers()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listViews()
+
+    /**
+     * list all views in the current database
+     *
+     * @param string database, the current is default
+     *               NB: not all the drivers can get the view names from
+     *               a database other than the current one
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listViews($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listTableViews()
+
+    /**
+     * list the views in the database that reference a given table
+     *
+     * @param string table for which all referenced views should be found
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableViews($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listTableTriggers()
+
+    /**
+     * list all triggers in the database that reference a given table
+     *
+     * @param string table for which all referenced triggers should be found
+     * @return mixed array of trigger names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableTriggers($table = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listFunctions()
+
+    /**
+     * list all functions in the current database
+     *
+     * @return mixed array of function names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listFunctions()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listTables()
+
+    /**
+     * list all tables in the current database
+     *
+     * @param string database, the current is default.
+     *               NB: not all the drivers can get the table names from
+     *               a database other than the current one
+     * @return mixed array of table names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTables($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listTableFields()
+
+    /**
+     * list all fields in a table in the current database
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of field names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableFields($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ createIndex()
+
+    /**
+     * Get the stucture of a field into an array
+     *
+     * @param string    $table         name of the table on which the index is to be created
+     * @param string    $name         name of the index to be created
+     * @param array     $definition        associative array that defines properties of the index to be created.
+     *                                 Currently, only one property named FIELDS is supported. This property
+     *                                 is also an associative with the names of the index fields as array
+     *                                 indexes. Each entry of this array is set to another type of associative
+     *                                 array that specifies properties of the index that are specific to
+     *                                 each field.
+     *
+     *                                Currently, only the sorting property is supported. It should be used
+     *                                 to define the sorting direction of the index. It may be set to either
+     *                                 ascending or descending.
+     *
+     *                                Not all DBMS support index sorting direction configuration. The DBMS
+     *                                 drivers of those that do not support it ignore this property. Use the
+     *                                 function supports() to determine whether the DBMS driver can manage indexes.
+     *
+     *                                 Example
+     *                                    array(
+     *                                        'fields' => array(
+     *                                            'user_name' => array(
+     *                                                'sorting' => 'ascending'
+     *                                            ),
+     *                                            'last_login' => array()
+     *                                        )
+     *                                    )
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createIndex($table, $name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $query = "CREATE INDEX $name ON $table";
+        $fields = array();
+        foreach (array_keys($definition['fields']) as $field) {
+            $fields[] = $db->quoteIdentifier($field, true);
+        }
+        $query .= ' ('. implode(', ', $fields) . ')';
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropIndex()
+
+    /**
+     * drop existing index
+     *
+     * @param string    $table         name of table that should be used in method
+     * @param string    $name         name of the index to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropIndex($table, $name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $result = $db->exec("DROP INDEX $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listTableIndexes()
+
+    /**
+     * list all indexes in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of index names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableIndexes($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ _getAdvancedFKOptions()
+
+    /**
+     * Return the FOREIGN KEY query section dealing with non-standard options
+     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
+     *
+     * @param array $definition
+     * @return string
+     * @access protected
+     */
+    function _getAdvancedFKOptions($definition)
+    {
+        return '';
+    }
+
+    // }}}
+    // {{{ createConstraint()
+
+    /**
+     * create a constraint on a table
+     *
+     * @param string    $table       name of the table on which the constraint is to be created
+     * @param string    $name        name of the constraint to be created
+     * @param array     $definition  associative array that defines properties of the constraint to be created.
+     *                               The full structure of the array looks like this:
+     *          <pre>
+     *          array (
+     *              [primary] => 0
+     *              [unique]  => 0
+     *              [foreign] => 1
+     *              [check]   => 0
+     *              [fields] => array (
+     *                  [field1name] => array() // one entry per each field covered
+     *                  [field2name] => array() // by the index
+     *                  [field3name] => array(
+     *                      [sorting]  => ascending
+     *                      [position] => 3
+     *                  )
+     *              )
+     *              [references] => array(
+     *                  [table] => name
+     *                  [fields] => array(
+     *                      [field1name] => array(  //one entry per each referenced field
+     *                           [position] => 1
+     *                      )
+     *                  )
+     *              )
+     *              [deferrable] => 0
+     *              [initiallydeferred] => 0
+     *              [onupdate] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
+     *              [ondelete] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
+     *              [match] => SIMPLE|PARTIAL|FULL
+     *          );
+     *          </pre>
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createConstraint($table, $name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        $table = $db->quoteIdentifier($table, true);
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $query = "ALTER TABLE $table ADD CONSTRAINT $name";
+        if (!empty($definition['primary'])) {
+            $query.= ' PRIMARY KEY';
+        } elseif (!empty($definition['unique'])) {
+            $query.= ' UNIQUE';
+        } elseif (!empty($definition['foreign'])) {
+            $query.= ' FOREIGN KEY';
+        }
+        $fields = array();
+        foreach (array_keys($definition['fields']) as $field) {
+            $fields[] = $db->quoteIdentifier($field, true);
+        }
+        $query .= ' ('. implode(', ', $fields) . ')';
+        if (!empty($definition['foreign'])) {
+            $query.= ' REFERENCES ' . $db->quoteIdentifier($definition['references']['table'], true);
+            $referenced_fields = array();
+            foreach (array_keys($definition['references']['fields']) as $field) {
+                $referenced_fields[] = $db->quoteIdentifier($field, true);
+            }
+            $query .= ' ('. implode(', ', $referenced_fields) . ')';
+            $query .= $this->_getAdvancedFKOptions($definition);
+        }
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropConstraint()
+
+    /**
+     * drop existing constraint
+     *
+     * @param string    $table        name of table that should be used in method
+     * @param string    $name         name of the constraint to be dropped
+     * @param string    $primary      hint if the constraint is primary
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropConstraint($table, $name, $primary = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $result = $db->exec("ALTER TABLE $table DROP CONSTRAINT $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listTableConstraints()
+
+    /**
+     * list all constraints in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of constraint names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableConstraints($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ createSequence()
+
+    /**
+     * create sequence
+     *
+     * @param string    $seq_name     name of the sequence to be created
+     * @param string    $start         start value of the sequence; default is 1
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createSequence($seq_name, $start = 1)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ dropSequence()
+
+    /**
+     * drop existing sequence
+     *
+     * @param string    $seq_name     name of the sequence to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropSequence($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listSequences()
+
+    /**
+     * list all sequences in the current database
+     *
+     * @param string database, the current is default
+     *               NB: not all the drivers can get the sequence names from
+     *               a database other than the current one
+     * @return mixed array of sequence names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listSequences($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+}
+?>
diff --git a/3rdparty/MDB2/Driver/Manager/mysql.php b/3rdparty/MDB2/Driver/Manager/mysql.php
index 8bcb338360499cf9e2671b4ffc1e0a6a72411c7d..c663c0c5d2bf19601f06e752a5734d893a613106 100644
--- a/3rdparty/MDB2/Driver/Manager/mysql.php
+++ b/3rdparty/MDB2/Driver/Manager/mysql.php
@@ -1,1436 +1,1471 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php 302865 2010-08-29 10:30:55Z quipo $
-//
-
-require_once 'MDB2/Driver/Manager/Common.php';
-
-/**
- * MDB2 MySQL driver for the management modules
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
-{
-
-    // }}}
-    // {{{ createDatabase()
-
-    /**
-     * create a new database
-     *
-     * @param string $name    name of the database that should be created
-     * @param array  $options array with charset, collation info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createDatabase($name, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name  = $db->quoteIdentifier($name, true);
-        $query = 'CREATE DATABASE ' . $name;
-        if (!empty($options['charset'])) {
-            $query .= ' DEFAULT CHARACTER SET ' . $db->quote($options['charset'], 'text');
-        }
-        if (!empty($options['collation'])) {
-            $query .= ' COLLATE ' . $db->quote($options['collation'], 'text');
-        }
-        return $db->standaloneQuery($query, null, true);
-    }
-
-    // }}}
-    // {{{ alterDatabase()
-
-    /**
-     * alter an existing database
-     *
-     * @param string $name    name of the database that is intended to be changed
-     * @param array  $options array with charset, collation info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function alterDatabase($name, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true);
-        if (!empty($options['charset'])) {
-            $query .= ' DEFAULT CHARACTER SET ' . $db->quote($options['charset'], 'text');
-        }
-        if (!empty($options['collation'])) {
-            $query .= ' COLLATE ' . $db->quote($options['collation'], 'text');
-        }
-        return $db->standaloneQuery($query, null, true);
-    }
-
-    // }}}
-    // {{{ dropDatabase()
-
-    /**
-     * drop an existing database
-     *
-     * @param string $name name of the database that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropDatabase($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        $query = "DROP DATABASE $name";
-        return $db->standaloneQuery($query, null, true);
-    }
-
-    // }}}
-    // {{{ _getAdvancedFKOptions()
-
-    /**
-     * Return the FOREIGN KEY query section dealing with non-standard options
-     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
-     *
-     * @param array $definition
-     * @return string
-     * @access protected
-     */
-    function _getAdvancedFKOptions($definition)
-    {
-        $query = '';
-        if (!empty($definition['match'])) {
-            $query .= ' MATCH '.$definition['match'];
-        }
-        if (!empty($definition['onupdate'])) {
-            $query .= ' ON UPDATE '.$definition['onupdate'];
-        }
-        if (!empty($definition['ondelete'])) {
-            $query .= ' ON DELETE '.$definition['ondelete'];
-        }
-        return $query;
-    }
-
-    // }}}
-    // {{{ createTable()
-
-    /**
-     * create a new table
-     *
-     * @param string $name   Name of the database that should be created
-     * @param array $fields  Associative array that contains the definition of each field of the new table
-     *                       The indexes of the array entries are the names of the fields of the table an
-     *                       the array entry values are associative arrays like those that are meant to be
-     *                       passed with the field definitions to get[Type]Declaration() functions.
-     *                          array(
-     *                              'id' => array(
-     *                                  'type' => 'integer',
-     *                                  'unsigned' => 1
-     *                                  'notnull' => 1
-     *                                  'default' => 0
-     *                              ),
-     *                              'name' => array(
-     *                                  'type' => 'text',
-     *                                  'length' => 12
-     *                              ),
-     *                              'password' => array(
-     *                                  'type' => 'text',
-     *                                  'length' => 12
-     *                              )
-     *                          );
-     * @param array $options  An associative array of table options:
-     *                          array(
-     *                              'comment' => 'Foo',
-     *                              'charset' => 'utf8',
-     *                              'collate' => 'utf8_unicode_ci',
-     *                              'type'    => 'innodb',
-     *                          );
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createTable($name, $fields, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        // if we have an AUTO_INCREMENT column and a PK on more than one field,
-        // we have to handle it differently...
-        $autoincrement = null;
-        if (empty($options['primary'])) {
-            $pk_fields = array();
-            foreach ($fields as $fieldname => $def) {
-                if (!empty($def['primary'])) {
-                    $pk_fields[$fieldname] = true;
-                }
-                if (!empty($def['autoincrement'])) {
-                    $autoincrement = $fieldname;
-                }
-            }
-            if ((null !== $autoincrement) && count($pk_fields) > 1) {
-                $options['primary'] = $pk_fields;
-            } else {
-                // the PK constraint is on max one field => OK
-                $autoincrement = null;
-            }
-        }
-
-        $query = $this->_getCreateTableQuery($name, $fields, $options);
-        if (PEAR::isError($query)) {
-            return $query;
-        }
-
-        if (null !== $autoincrement) {
-            // we have to remove the PK clause added by _getIntegerDeclaration()
-            $query = str_replace('AUTO_INCREMENT PRIMARY KEY', 'AUTO_INCREMENT', $query);
-        }
-
-        $options_strings = array();
-
-        if (!empty($options['comment'])) {
-            $options_strings['comment'] = 'COMMENT = '.$db->quote($options['comment'], 'text');
-        }
-
-        if (!empty($options['charset'])) {
-            $options_strings['charset'] = 'DEFAULT CHARACTER SET '.$options['charset'];
-            if (!empty($options['collate'])) {
-                $options_strings['charset'].= ' COLLATE '.$options['collate'];
-            }
-        }
-
-        $type = false;
-        if (!empty($options['type'])) {
-            $type = $options['type'];
-        } elseif ($db->options['default_table_type']) {
-            $type = $db->options['default_table_type'];
-        }
-        if ($type) {
-            $options_strings[] = "ENGINE = $type";
-        }
-
-        if (!empty($options_strings)) {
-            $query .= ' '.implode(' ', $options_strings);
-        }
-        $result = $db->exec($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ dropTable()
-
-    /**
-     * drop an existing table
-     *
-     * @param string $name name of the table that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropTable($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        //delete the triggers associated to existing FK constraints
-        $constraints = $this->listTableConstraints($name);
-        if (!PEAR::isError($constraints) && !empty($constraints)) {
-            $db->loadModule('Reverse', null, true);
-            foreach ($constraints as $constraint) {
-                $definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
-                if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
-                    $result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']);
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-            }
-        }
-
-        return parent::dropTable($name);
-    }
-
-    // }}}
-    // {{{ truncateTable()
-
-    /**
-     * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported,
-     * it falls back to a DELETE FROM TABLE query)
-     *
-     * @param string $name name of the table that should be truncated
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function truncateTable($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        return $db->exec("TRUNCATE TABLE $name");
-    }
-
-    // }}}
-    // {{{ vacuum()
-
-    /**
-     * Optimize (vacuum) all the tables in the db (or only the specified table)
-     * and optionally run ANALYZE.
-     *
-     * @param string $table table name (all the tables if empty)
-     * @param array  $options an array with driver-specific options:
-     *               - timeout [int] (in seconds) [mssql-only]
-     *               - analyze [boolean] [pgsql and mysql]
-     *               - full [boolean] [pgsql-only]
-     *               - freeze [boolean] [pgsql-only]
-     *
-     * @return mixed MDB2_OK success, a MDB2 error on failure
-     * @access public
-     */
-    function vacuum($table = null, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (empty($table)) {
-            $table = $this->listTables();
-            if (PEAR::isError($table)) {
-                return $table;
-            }
-        }
-        if (is_array($table)) {
-            foreach (array_keys($table) as $k) {
-            	$table[$k] = $db->quoteIdentifier($table[$k], true);
-            }
-            $table = implode(', ', $table);
-        } else {
-            $table = $db->quoteIdentifier($table, true);
-        }
-        
-        $result = $db->exec('OPTIMIZE TABLE '.$table);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if (!empty($options['analyze'])) {
-            return $db->exec('ANALYZE TABLE '.$table);
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ alterTable()
-
-    /**
-     * alter an existing table
-     *
-     * @param string $name         name of the table that is intended to be changed.
-     * @param array $changes     associative array that contains the details of each type
-     *                             of change that is intended to be performed. The types of
-     *                             changes that are currently supported are defined as follows:
-     *
-     *                             name
-     *
-     *                                New name for the table.
-     *
-     *                            add
-     *
-     *                                Associative array with the names of fields to be added as
-     *                                 indexes of the array. The value of each entry of the array
-     *                                 should be set to another associative array with the properties
-     *                                 of the fields to be added. The properties of the fields should
-     *                                 be the same as defined by the MDB2 parser.
-     *
-     *
-     *                            remove
-     *
-     *                                Associative array with the names of fields to be removed as indexes
-     *                                 of the array. Currently the values assigned to each entry are ignored.
-     *                                 An empty array should be used for future compatibility.
-     *
-     *                            rename
-     *
-     *                                Associative array with the names of fields to be renamed as indexes
-     *                                 of the array. The value of each entry of the array should be set to
-     *                                 another associative array with the entry named name with the new
-     *                                 field name and the entry named Declaration that is expected to contain
-     *                                 the portion of the field declaration already in DBMS specific SQL code
-     *                                 as it is used in the CREATE TABLE statement.
-     *
-     *                            change
-     *
-     *                                Associative array with the names of the fields to be changed as indexes
-     *                                 of the array. Keep in mind that if it is intended to change either the
-     *                                 name of a field and any other properties, the change array entries
-     *                                 should have the new names of the fields as array indexes.
-     *
-     *                                The value of each entry of the array should be set to another associative
-     *                                 array with the properties of the fields to that are meant to be changed as
-     *                                 array entries. These entries should be assigned to the new values of the
-     *                                 respective properties. The properties of the fields should be the same
-     *                                 as defined by the MDB2 parser.
-     *
-     *                            Example
-     *                                array(
-     *                                    'name' => 'userlist',
-     *                                    'add' => array(
-     *                                        'quota' => array(
-     *                                            'type' => 'integer',
-     *                                            'unsigned' => 1
-     *                                        )
-     *                                    ),
-     *                                    'remove' => array(
-     *                                        'file_limit' => array(),
-     *                                        'time_limit' => array()
-     *                                    ),
-     *                                    'change' => array(
-     *                                        'name' => array(
-     *                                            'length' => '20',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 20,
-     *                                            ),
-     *                                        )
-     *                                    ),
-     *                                    'rename' => array(
-     *                                        'sex' => array(
-     *                                            'name' => 'gender',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 1,
-     *                                                'default' => 'M',
-     *                                            ),
-     *                                        )
-     *                                    )
-     *                                )
-     *
-     * @param boolean $check     indicates whether the function should just check if the DBMS driver
-     *                             can perform the requested table alterations if the value is true or
-     *                             actually perform them otherwise.
-     * @access public
-     *
-      * @return mixed MDB2_OK on success, a MDB2 error on failure
-     */
-    function alterTable($name, $changes, $check)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        foreach ($changes as $change_name => $change) {
-            switch ($change_name) {
-            case 'add':
-            case 'remove':
-            case 'change':
-            case 'rename':
-            case 'name':
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
-                    'change type "'.$change_name.'" not yet supported', __FUNCTION__);
-            }
-        }
-
-        if ($check) {
-            return MDB2_OK;
-        }
-
-        $query = '';
-        if (!empty($changes['name'])) {
-            $change_name = $db->quoteIdentifier($changes['name'], true);
-            $query .= 'RENAME TO ' . $change_name;
-        }
-
-        if (!empty($changes['add']) && is_array($changes['add'])) {
-            foreach ($changes['add'] as $field_name => $field) {
-                if ($query) {
-                    $query.= ', ';
-                }
-                $query.= 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field);
-            }
-        }
-
-        if (!empty($changes['remove']) && is_array($changes['remove'])) {
-            foreach ($changes['remove'] as $field_name => $field) {
-                if ($query) {
-                    $query.= ', ';
-                }
-                $field_name = $db->quoteIdentifier($field_name, true);
-                $query.= 'DROP ' . $field_name;
-            }
-        }
-
-        $rename = array();
-        if (!empty($changes['rename']) && is_array($changes['rename'])) {
-            foreach ($changes['rename'] as $field_name => $field) {
-                $rename[$field['name']] = $field_name;
-            }
-        }
-
-        if (!empty($changes['change']) && is_array($changes['change'])) {
-            foreach ($changes['change'] as $field_name => $field) {
-                if ($query) {
-                    $query.= ', ';
-                }
-                if (isset($rename[$field_name])) {
-                    $old_field_name = $rename[$field_name];
-                    unset($rename[$field_name]);
-                } else {
-                    $old_field_name = $field_name;
-                }
-                $old_field_name = $db->quoteIdentifier($old_field_name, true);
-                $query.= "CHANGE $old_field_name " . $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']);
-            }
-        }
-
-        if (!empty($rename) && is_array($rename)) {
-            foreach ($rename as $rename_name => $renamed_field) {
-                if ($query) {
-                    $query.= ', ';
-                }
-                $field = $changes['rename'][$renamed_field];
-                $renamed_field = $db->quoteIdentifier($renamed_field, true);
-                $query.= 'CHANGE ' . $renamed_field . ' ' . $db->getDeclaration($field['definition']['type'], $field['name'], $field['definition']);
-            }
-        }
-
-        if (!$query) {
-            return MDB2_OK;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        return $db->exec("ALTER TABLE $name $query");
-    }
-
-    // }}}
-    // {{{ listDatabases()
-
-    /**
-     * list all databases
-     *
-     * @return mixed array of database names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listDatabases()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $result = $db->queryCol('SHOW DATABASES');
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listUsers()
-
-    /**
-     * list all users
-     *
-     * @return mixed array of user names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listUsers()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->queryCol('SELECT DISTINCT USER FROM mysql.USER');
-    }
-
-    // }}}
-    // {{{ listFunctions()
-
-    /**
-     * list all functions in the current database
-     *
-     * @return mixed array of function names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listFunctions()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name FROM mysql.proc";
-        /*
-        SELECT ROUTINE_NAME
-          FROM INFORMATION_SCHEMA.ROUTINES
-         WHERE ROUTINE_TYPE = 'FUNCTION'
-        */
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableTriggers()
-
-    /**
-     * list all triggers in the database that reference a given table
-     *
-     * @param string table for which all referenced triggers should be found
-     * @return mixed array of trigger names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableTriggers($table = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SHOW TRIGGERS';
-        if (null !== $table) {
-            $table = $db->quote($table, 'text');
-            $query .= " LIKE $table";
-        }
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTables()
-
-    /**
-     * list all tables in the current database
-     *
-     * @param string database, the current is default
-     * @return mixed array of table names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTables($database = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SHOW /*!50002 FULL*/ TABLES";
-        if (null !== $database) {
-            $query .= " FROM $database";
-        }
-        $query.= "/*!50002  WHERE Table_type = 'BASE TABLE'*/";
-
-        $table_names = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED);
-        if (PEAR::isError($table_names)) {
-            return $table_names;
-        }
-
-        $result = array();
-        foreach ($table_names as $table) {
-            if (!$this->_fixSequenceName($table[0], true)) {
-                $result[] = $table[0];
-            }
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listViews()
-
-    /**
-     * list all views in the current database
-     *
-     * @param string database, the current is default
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listViews($database = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SHOW FULL TABLES';
-        if (null !== $database) {
-            $query.= " FROM $database";
-        }
-        $query.= " WHERE Table_type = 'VIEW'";
-
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableFields()
-
-    /**
-     * list all fields in a table in the current database
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of field names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableFields($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $result = $db->queryCol("SHOW COLUMNS FROM $table");
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ createIndex()
-
-    /**
-     * Get the stucture of a field into an array
-     *
-     * @author Leoncx
-     * @param string $table      name of the table on which the index is to be created
-     * @param string $name       name of the index to be created
-     * @param array  $definition associative array that defines properties of the index to be created.
-     *                           Currently, only one property named FIELDS is supported. This property
-     *                           is also an associative with the names of the index fields as array
-     *                           indexes. Each entry of this array is set to another type of associative
-     *                           array that specifies properties of the index that are specific to
-     *                           each field.
-     *
-     *                           Currently, only the sorting property is supported. It should be used
-     *                           to define the sorting direction of the index. It may be set to either
-     *                           ascending or descending.
-     *
-     *                           Not all DBMS support index sorting direction configuration. The DBMS
-     *                           drivers of those that do not support it ignore this property. Use the
-     *                           function supports() to determine whether the DBMS driver can manage indexes.
-     *
-     *                           Example
-     *                               array(
-     *                                   'fields' => array(
-     *                                       'user_name' => array(
-     *                                           'sorting' => 'ascending'
-     *                                           'length' => 10
-     *                                       ),
-     *                                       'last_login' => array()
-     *                                    )
-     *                                )
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createIndex($table, $name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        $query = "CREATE INDEX $name ON $table";
-        $fields = array();
-        foreach ($definition['fields'] as $field => $fieldinfo) {
-            if (!empty($fieldinfo['length'])) {
-                $fields[] = $db->quoteIdentifier($field, true) . '(' . $fieldinfo['length'] . ')';
-            } else {
-                $fields[] = $db->quoteIdentifier($field, true);
-            }
-        }
-        $query .= ' ('. implode(', ', $fields) . ')';
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ dropIndex()
-
-    /**
-     * drop existing index
-     *
-     * @param string    $table         name of table that should be used in method
-     * @param string    $name         name of the index to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropIndex($table, $name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        return $db->exec("DROP INDEX $name ON $table");
-    }
-
-    // }}}
-    // {{{ listTableIndexes()
-
-    /**
-     * list all indexes in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of index names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableIndexes($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $key_name = 'Key_name';
-        $non_unique = 'Non_unique';
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            if ($db->options['field_case'] == CASE_LOWER) {
-                $key_name = strtolower($key_name);
-                $non_unique = strtolower($non_unique);
-            } else {
-                $key_name = strtoupper($key_name);
-                $non_unique = strtoupper($non_unique);
-            }
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $query = "SHOW INDEX FROM $table";
-        $indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($indexes)) {
-            return $indexes;
-        }
-
-        $result = array();
-        foreach ($indexes as $index_data) {
-            if ($index_data[$non_unique] && ($index = $this->_fixIndexName($index_data[$key_name]))) {
-                $result[$index] = true;
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ createConstraint()
-
-    /**
-     * create a constraint on a table
-     *
-     * @param string    $table        name of the table on which the constraint is to be created
-     * @param string    $name         name of the constraint to be created
-     * @param array     $definition   associative array that defines properties of the constraint to be created.
-     *                                Currently, only one property named FIELDS is supported. This property
-     *                                is also an associative with the names of the constraint fields as array
-     *                                constraints. Each entry of this array is set to another type of associative
-     *                                array that specifies properties of the constraint that are specific to
-     *                                each field.
-     *
-     *                                Example
-     *                                   array(
-     *                                       'fields' => array(
-     *                                           'user_name' => array(),
-     *                                           'last_login' => array()
-     *                                       )
-     *                                   )
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createConstraint($table, $name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $type = '';
-        $idx_name = $db->quoteIdentifier($db->getIndexName($name), true);
-        if (!empty($definition['primary'])) {
-            $type = 'PRIMARY';
-            $idx_name = 'KEY';
-        } elseif (!empty($definition['unique'])) {
-            $type = 'UNIQUE';
-        } elseif (!empty($definition['foreign'])) {
-            $type = 'CONSTRAINT';
-        }
-        if (empty($type)) {
-            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                'invalid definition, could not create constraint', __FUNCTION__);
-        }
-
-        $table_quoted = $db->quoteIdentifier($table, true);
-        $query = "ALTER TABLE $table_quoted ADD $type $idx_name";
-        if (!empty($definition['foreign'])) {
-            $query .= ' FOREIGN KEY';
-        }
-        $fields = array();
-        foreach ($definition['fields'] as $field => $fieldinfo) {
-            $quoted = $db->quoteIdentifier($field, true);
-            if (!empty($fieldinfo['length'])) {
-                $quoted .= '(' . $fieldinfo['length'] . ')';
-            }
-            $fields[] = $quoted;
-        }
-        $query .= ' ('. implode(', ', $fields) . ')';
-        if (!empty($definition['foreign'])) {
-            $query.= ' REFERENCES ' . $db->quoteIdentifier($definition['references']['table'], true);
-            $referenced_fields = array();
-            foreach (array_keys($definition['references']['fields']) as $field) {
-                $referenced_fields[] = $db->quoteIdentifier($field, true);
-            }
-            $query .= ' ('. implode(', ', $referenced_fields) . ')';
-            $query .= $this->_getAdvancedFKOptions($definition);
-
-            // add index on FK column(s) or we can't add a FK constraint
-            // @see http://forums.mysql.com/read.php?22,19755,226009
-            $result = $this->createIndex($table, $name.'_fkidx', $definition);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-        $res = $db->exec($query);
-        if (PEAR::isError($res)) {
-            return $res;
-        }
-        if (!empty($definition['foreign'])) {
-            return $this->_createFKTriggers($table, array($name => $definition));
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ dropConstraint()
-
-    /**
-     * drop existing constraint
-     *
-     * @param string    $table        name of table that should be used in method
-     * @param string    $name         name of the constraint to be dropped
-     * @param string    $primary      hint if the constraint is primary
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropConstraint($table, $name, $primary = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if ($primary || strtolower($name) == 'primary') {
-            $query = 'ALTER TABLE '. $db->quoteIdentifier($table, true) .' DROP PRIMARY KEY';
-            return $db->exec($query);
-        }
-
-        //is it a FK constraint? If so, also delete the associated triggers
-        $db->loadModule('Reverse', null, true);
-        $definition = $db->reverse->getTableConstraintDefinition($table, $name);
-        if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
-            //first drop the FK enforcing triggers
-            $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            //then drop the constraint itself
-            $table = $db->quoteIdentifier($table, true);
-            $name = $db->quoteIdentifier($db->getIndexName($name), true);
-            $query = "ALTER TABLE $table DROP FOREIGN KEY $name";
-            return $db->exec($query);
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name = $db->quoteIdentifier($db->getIndexName($name), true);
-        $query = "ALTER TABLE $table DROP INDEX $name";
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ _createFKTriggers()
-
-    /**
-     * Create triggers to enforce the FOREIGN KEY constraint on the table
-     *
-     * NB: since there's no RAISE_APPLICATION_ERROR facility in mysql,
-     * we call a non-existent procedure to raise the FK violation message.
-     * @see http://forums.mysql.com/read.php?99,55108,71877#msg-71877
-     *
-     * @param string $table        table name
-     * @param array  $foreign_keys FOREIGN KEY definitions
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access private
-     */
-    function _createFKTriggers($table, $foreign_keys)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        // create triggers to enforce FOREIGN KEY constraints
-        if ($db->supports('triggers') && !empty($foreign_keys)) {
-            $table_quoted = $db->quoteIdentifier($table, true);
-            foreach ($foreign_keys as $fkname => $fkdef) {
-                if (empty($fkdef)) {
-                    continue;
-                }
-                //set actions to default if not set
-                $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']);
-                $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']);
-
-                $trigger_names = array(
-                    'insert'    => $fkname.'_insert_trg',
-                    'update'    => $fkname.'_update_trg',
-                    'pk_update' => $fkname.'_pk_update_trg',
-                    'pk_delete' => $fkname.'_pk_delete_trg',
-                );
-                $table_fields = array_keys($fkdef['fields']);
-                $referenced_fields = array_keys($fkdef['references']['fields']);
-
-                //create the ON [UPDATE|DELETE] triggers on the primary table
-                $restrict_action = ' IF (SELECT ';
-                $aliased_fields = array();
-                foreach ($table_fields as $field) {
-                    $aliased_fields[] = $table_quoted .'.'.$field .' AS '.$field;
-                }
-                $restrict_action .= implode(',', $aliased_fields)
-                       .' FROM '.$table_quoted
-                       .' WHERE ';
-                $conditions  = array();
-                $new_values  = array();
-                $null_values = array();
-                for ($i=0; $i<count($table_fields); $i++) {
-                    $conditions[]  = $table_fields[$i] .' = OLD.'.$referenced_fields[$i];
-                    $new_values[]  = $table_fields[$i] .' = NEW.'.$referenced_fields[$i];
-                    $null_values[] = $table_fields[$i] .' = NULL';
-                }
-                $conditions2 = array();
-                for ($i=0; $i<count($referenced_fields); $i++) {
-                    $conditions2[]  = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i];
-                }
-
-                $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL';
-                $restrict_action2 = empty($conditions2) ? '' : ' AND (' .implode(' OR ', $conditions2) .')';
-                $restrict_action3 = ' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();'
-                                   .' END IF;';
-
-                $restrict_action_update = $restrict_action . $restrict_action2 . $restrict_action3;
-                $restrict_action_delete = $restrict_action . $restrict_action3; // There is no NEW row in on DELETE trigger
-
-                $cascade_action_update = 'UPDATE '.$table_quoted.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';';
-                $cascade_action_delete = 'DELETE FROM '.$table_quoted.' WHERE '.implode(' AND ', $conditions). ';';
-                $setnull_action        = 'UPDATE '.$table_quoted.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions). ';';
-
-                if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) {
-                    $db->loadModule('Reverse', null, true);
-                    $default_values = array();
-                    foreach ($table_fields as $table_field) {
-                        $field_definition = $db->reverse->getTableFieldDefinition($table, $field);
-                        if (PEAR::isError($field_definition)) {
-                            return $field_definition;
-                        }
-                        $default_values[] = $table_field .' = '. $field_definition[0]['default'];
-                    }
-                    $setdefault_action = 'UPDATE '.$table_quoted.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';';
-                }
-
-                $query = 'CREATE TRIGGER %s'
-                        .' %s ON '.$fkdef['references']['table']
-                        .' FOR EACH ROW BEGIN '
-                        .' SET FOREIGN_KEY_CHECKS = 0; ';  //only really needed for ON UPDATE CASCADE
-
-                if ('CASCADE' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE',  'update') . $cascade_action_update;
-                } elseif ('SET NULL' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setnull_action;
-                } elseif ('SET DEFAULT' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action;
-                } elseif ('NO ACTION' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'AFTER UPDATE', 'update');
-                } elseif ('RESTRICT' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update');
-                }
-                if ('CASCADE' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE',  'delete') . $cascade_action_delete;
-                } elseif ('SET NULL' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action;
-                } elseif ('SET DEFAULT' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action;
-                } elseif ('NO ACTION' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete');
-                } elseif ('RESTRICT' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete');
-                }
-                $sql_update .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
-                $sql_delete .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
-
-                $db->pushErrorHandling(PEAR_ERROR_RETURN);
-                $db->expectError(MDB2_ERROR_CANNOT_CREATE);
-                $result = $db->exec($sql_delete);
-                $expected_errmsg = 'This MySQL version doesn\'t support multiple triggers with the same action time and event for one table';
-                $db->popExpect();
-                $db->popErrorHandling();
-                if (PEAR::isError($result)) {
-                    if ($result->getCode() != MDB2_ERROR_CANNOT_CREATE) {
-                        return $result;
-                    }
-                    $db->warnings[] = $expected_errmsg;
-                }
-                $db->pushErrorHandling(PEAR_ERROR_RETURN);
-                $db->expectError(MDB2_ERROR_CANNOT_CREATE);
-                $result = $db->exec($sql_update);
-                $db->popExpect();
-                $db->popErrorHandling();
-                if (PEAR::isError($result) && $result->getCode() != MDB2_ERROR_CANNOT_CREATE) {
-                    if ($result->getCode() != MDB2_ERROR_CANNOT_CREATE) {
-                        return $result;
-                    }
-                    $db->warnings[] = $expected_errmsg;
-                }
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ _dropFKTriggers()
-
-    /**
-     * Drop the triggers created to enforce the FOREIGN KEY constraint on the table
-     *
-     * @param string $table            table name
-     * @param string $fkname           FOREIGN KEY constraint name
-     * @param string $referenced_table referenced table name
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access private
-     */
-    function _dropFKTriggers($table, $fkname, $referenced_table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $triggers  = $this->listTableTriggers($table);
-        $triggers2 = $this->listTableTriggers($referenced_table);
-        if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) {
-            $triggers = array_merge($triggers, $triggers2);
-            $pattern = '/^'.$fkname.'(_pk)?_(insert|update|delete)_trg$/i';
-            foreach ($triggers as $trigger) {
-                if (preg_match($pattern, $trigger)) {
-                    $result = $db->exec('DROP TRIGGER '.$trigger);
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ listTableConstraints()
-
-    /**
-     * list all constraints in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of constraint names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableConstraints($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $key_name = 'Key_name';
-        $non_unique = 'Non_unique';
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            if ($db->options['field_case'] == CASE_LOWER) {
-                $key_name = strtolower($key_name);
-                $non_unique = strtolower($non_unique);
-            } else {
-                $key_name = strtoupper($key_name);
-                $non_unique = strtoupper($non_unique);
-            }
-        }
-
-        $query = 'SHOW INDEX FROM ' . $db->quoteIdentifier($table, true);
-        $indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($indexes)) {
-            return $indexes;
-        }
-
-        $result = array();
-        foreach ($indexes as $index_data) {
-            if (!$index_data[$non_unique]) {
-                if ($index_data[$key_name] !== 'PRIMARY') {
-                    $index = $this->_fixIndexName($index_data[$key_name]);
-                } else {
-                    $index = 'PRIMARY';
-                }
-                if (!empty($index)) {
-                    $result[$index] = true;
-                }
-            }
-        }
-        
-        //list FOREIGN KEY constraints...
-        $query = 'SHOW CREATE TABLE '. $db->escape($table);
-        $definition = $db->queryOne($query, 'text', 1);
-        if (!PEAR::isError($definition) && !empty($definition)) {
-            $pattern = '/\bCONSTRAINT\b\s+([^\s]+)\s+\bFOREIGN KEY\b/Uims';
-            if (preg_match_all($pattern, str_replace('`', '', $definition), $matches) > 0) {
-                foreach ($matches[1] as $constraint) {
-                    $result[$constraint] = true;
-                }
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ createSequence()
-
-    /**
-     * create sequence
-     *
-     * @param string    $seq_name name of the sequence to be created
-     * @param string    $start    start value of the sequence; default is 1
-     * @param array     $options  An associative array of table options:
-     *                          array(
-     *                              'comment' => 'Foo',
-     *                              'charset' => 'utf8',
-     *                              'collate' => 'utf8_unicode_ci',
-     *                              'type'    => 'innodb',
-     *                          );
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createSequence($seq_name, $start = 1, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
-        $seqcol_name = $db->quoteIdentifier($db->options['seqcol_name'], true);
-        
-        $options_strings = array();
-
-        if (!empty($options['comment'])) {
-            $options_strings['comment'] = 'COMMENT = '.$db->quote($options['comment'], 'text');
-        }
-
-        if (!empty($options['charset'])) {
-            $options_strings['charset'] = 'DEFAULT CHARACTER SET '.$options['charset'];
-            if (!empty($options['collate'])) {
-                $options_strings['charset'].= ' COLLATE '.$options['collate'];
-            }
-        }
-
-        $type = false;
-        if (!empty($options['type'])) {
-            $type = $options['type'];
-        } elseif ($db->options['default_table_type']) {
-            $type = $db->options['default_table_type'];
-        }
-        if ($type) {
-            $options_strings[] = "ENGINE = $type";
-        }
-
-        $query = "CREATE TABLE $sequence_name ($seqcol_name INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ($seqcol_name))";
-        if (!empty($options_strings)) {
-            $query .= ' '.implode(' ', $options_strings);
-        }
-        $res = $db->exec($query);
-        if (PEAR::isError($res)) {
-            return $res;
-        }
-
-        if ($start == 1) {
-            return MDB2_OK;
-        }
-
-        $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (".($start-1).')';
-        $res = $db->exec($query);
-        if (!PEAR::isError($res)) {
-            return MDB2_OK;
-        }
-
-        // Handle error
-        $result = $db->exec("DROP TABLE $sequence_name");
-        if (PEAR::isError($result)) {
-            return $db->raiseError($result, null, null,
-                'could not drop inconsistent sequence table', __FUNCTION__);
-        }
-
-        return $db->raiseError($res, null, null,
-            'could not create sequence table', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ dropSequence()
-
-    /**
-     * drop existing sequence
-     *
-     * @param string    $seq_name     name of the sequence to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropSequence($seq_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
-        return $db->exec("DROP TABLE $sequence_name");
-    }
-
-    // }}}
-    // {{{ listSequences()
-
-    /**
-     * list all sequences in the current database
-     *
-     * @param string database, the current is default
-     * @return mixed array of sequence names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listSequences($database = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SHOW TABLES";
-        if (null !== $database) {
-            $query .= " FROM $database";
-        }
-        $table_names = $db->queryCol($query);
-        if (PEAR::isError($table_names)) {
-            return $table_names;
-        }
-
-        $result = array();
-        foreach ($table_names as $table_name) {
-            if ($sqn = $this->_fixSequenceName($table_name, true)) {
-                $result[] = $sqn;
-            }
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-}
-?>
\ No newline at end of file
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Manager/Common.php';
+
+/**
+ * MDB2 MySQL driver for the management modules
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
+{
+
+    // }}}
+    // {{{ createDatabase()
+
+    /**
+     * create a new database
+     *
+     * @param string $name    name of the database that should be created
+     * @param array  $options array with charset, collation info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createDatabase($name, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name  = $db->quoteIdentifier($name, true);
+        $query = 'CREATE DATABASE ' . $name;
+        if (!empty($options['charset'])) {
+            $query .= ' DEFAULT CHARACTER SET ' . $db->quote($options['charset'], 'text');
+        }
+        if (!empty($options['collation'])) {
+            $query .= ' COLLATE ' . $db->quote($options['collation'], 'text');
+        }
+        return $db->standaloneQuery($query, null, true);
+    }
+
+    // }}}
+    // {{{ alterDatabase()
+
+    /**
+     * alter an existing database
+     *
+     * @param string $name    name of the database that is intended to be changed
+     * @param array  $options array with charset, collation info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function alterDatabase($name, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true);
+        if (!empty($options['charset'])) {
+            $query .= ' DEFAULT CHARACTER SET ' . $db->quote($options['charset'], 'text');
+        }
+        if (!empty($options['collation'])) {
+            $query .= ' COLLATE ' . $db->quote($options['collation'], 'text');
+        }
+        return $db->standaloneQuery($query, null, true);
+    }
+
+    // }}}
+    // {{{ dropDatabase()
+
+    /**
+     * drop an existing database
+     *
+     * @param string $name name of the database that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropDatabase($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $query = "DROP DATABASE $name";
+        return $db->standaloneQuery($query, null, true);
+    }
+
+    // }}}
+    // {{{ _getAdvancedFKOptions()
+
+    /**
+     * Return the FOREIGN KEY query section dealing with non-standard options
+     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
+     *
+     * @param array $definition
+     * @return string
+     * @access protected
+     */
+    function _getAdvancedFKOptions($definition)
+    {
+        $query = '';
+        if (!empty($definition['match'])) {
+            $query .= ' MATCH '.$definition['match'];
+        }
+        if (!empty($definition['onupdate'])) {
+            $query .= ' ON UPDATE '.$definition['onupdate'];
+        }
+        if (!empty($definition['ondelete'])) {
+            $query .= ' ON DELETE '.$definition['ondelete'];
+        }
+        return $query;
+    }
+
+    // }}}
+    // {{{ createTable()
+
+    /**
+     * create a new table
+     *
+     * @param string $name   Name of the database that should be created
+     * @param array $fields  Associative array that contains the definition of each field of the new table
+     *                       The indexes of the array entries are the names of the fields of the table an
+     *                       the array entry values are associative arrays like those that are meant to be
+     *                       passed with the field definitions to get[Type]Declaration() functions.
+     *                          array(
+     *                              'id' => array(
+     *                                  'type' => 'integer',
+     *                                  'unsigned' => 1
+     *                                  'notnull' => 1
+     *                                  'default' => 0
+     *                              ),
+     *                              'name' => array(
+     *                                  'type' => 'text',
+     *                                  'length' => 12
+     *                              ),
+     *                              'password' => array(
+     *                                  'type' => 'text',
+     *                                  'length' => 12
+     *                              )
+     *                          );
+     * @param array $options  An associative array of table options:
+     *                          array(
+     *                              'comment' => 'Foo',
+     *                              'charset' => 'utf8',
+     *                              'collate' => 'utf8_unicode_ci',
+     *                              'type'    => 'innodb',
+     *                          );
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createTable($name, $fields, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        // if we have an AUTO_INCREMENT column and a PK on more than one field,
+        // we have to handle it differently...
+        $autoincrement = null;
+        if (empty($options['primary'])) {
+            $pk_fields = array();
+            foreach ($fields as $fieldname => $def) {
+                if (!empty($def['primary'])) {
+                    $pk_fields[$fieldname] = true;
+                }
+                if (!empty($def['autoincrement'])) {
+                    $autoincrement = $fieldname;
+                }
+            }
+            if ((null !== $autoincrement) && count($pk_fields) > 1) {
+                $options['primary'] = $pk_fields;
+            } else {
+                // the PK constraint is on max one field => OK
+                $autoincrement = null;
+            }
+        }
+
+        $query = $this->_getCreateTableQuery($name, $fields, $options);
+        if (PEAR::isError($query)) {
+            return $query;
+        }
+
+        if (null !== $autoincrement) {
+            // we have to remove the PK clause added by _getIntegerDeclaration()
+            $query = str_replace('AUTO_INCREMENT PRIMARY KEY', 'AUTO_INCREMENT', $query);
+        }
+
+        $options_strings = array();
+
+        if (!empty($options['comment'])) {
+            $options_strings['comment'] = 'COMMENT = '.$db->quote($options['comment'], 'text');
+        }
+
+        if (!empty($options['charset'])) {
+            $options_strings['charset'] = 'DEFAULT CHARACTER SET '.$options['charset'];
+            if (!empty($options['collate'])) {
+                $options_strings['charset'].= ' COLLATE '.$options['collate'];
+            }
+        }
+
+        $type = false;
+        if (!empty($options['type'])) {
+            $type = $options['type'];
+        } elseif ($db->options['default_table_type']) {
+            $type = $db->options['default_table_type'];
+        }
+        if ($type) {
+            $options_strings[] = "ENGINE = $type";
+        }
+
+        if (!empty($options_strings)) {
+            $query .= ' '.implode(' ', $options_strings);
+        }
+        $result = $db->exec($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropTable()
+
+    /**
+     * drop an existing table
+     *
+     * @param string $name name of the table that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        //delete the triggers associated to existing FK constraints
+        $constraints = $this->listTableConstraints($name);
+        if (!PEAR::isError($constraints) && !empty($constraints)) {
+            $db->loadModule('Reverse', null, true);
+            foreach ($constraints as $constraint) {
+                $definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
+                if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
+                    $result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']);
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+            }
+        }
+
+        return parent::dropTable($name);
+    }
+
+    // }}}
+    // {{{ truncateTable()
+
+    /**
+     * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported,
+     * it falls back to a DELETE FROM TABLE query)
+     *
+     * @param string $name name of the table that should be truncated
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function truncateTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("TRUNCATE TABLE $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ vacuum()
+
+    /**
+     * Optimize (vacuum) all the tables in the db (or only the specified table)
+     * and optionally run ANALYZE.
+     *
+     * @param string $table table name (all the tables if empty)
+     * @param array  $options an array with driver-specific options:
+     *               - timeout [int] (in seconds) [mssql-only]
+     *               - analyze [boolean] [pgsql and mysql]
+     *               - full [boolean] [pgsql-only]
+     *               - freeze [boolean] [pgsql-only]
+     *
+     * @return mixed MDB2_OK success, a MDB2 error on failure
+     * @access public
+     */
+    function vacuum($table = null, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (empty($table)) {
+            $table = $this->listTables();
+            if (PEAR::isError($table)) {
+                return $table;
+            }
+        }
+        if (is_array($table)) {
+            foreach (array_keys($table) as $k) {
+            	$table[$k] = $db->quoteIdentifier($table[$k], true);
+            }
+            $table = implode(', ', $table);
+        } else {
+            $table = $db->quoteIdentifier($table, true);
+        }
+        
+        $result = $db->exec('OPTIMIZE TABLE '.$table);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if (!empty($options['analyze'])) {
+            $result = $db->exec('ANALYZE TABLE '.$table);
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ alterTable()
+
+    /**
+     * alter an existing table
+     *
+     * @param string $name         name of the table that is intended to be changed.
+     * @param array $changes     associative array that contains the details of each type
+     *                             of change that is intended to be performed. The types of
+     *                             changes that are currently supported are defined as follows:
+     *
+     *                             name
+     *
+     *                                New name for the table.
+     *
+     *                            add
+     *
+     *                                Associative array with the names of fields to be added as
+     *                                 indexes of the array. The value of each entry of the array
+     *                                 should be set to another associative array with the properties
+     *                                 of the fields to be added. The properties of the fields should
+     *                                 be the same as defined by the MDB2 parser.
+     *
+     *
+     *                            remove
+     *
+     *                                Associative array with the names of fields to be removed as indexes
+     *                                 of the array. Currently the values assigned to each entry are ignored.
+     *                                 An empty array should be used for future compatibility.
+     *
+     *                            rename
+     *
+     *                                Associative array with the names of fields to be renamed as indexes
+     *                                 of the array. The value of each entry of the array should be set to
+     *                                 another associative array with the entry named name with the new
+     *                                 field name and the entry named Declaration that is expected to contain
+     *                                 the portion of the field declaration already in DBMS specific SQL code
+     *                                 as it is used in the CREATE TABLE statement.
+     *
+     *                            change
+     *
+     *                                Associative array with the names of the fields to be changed as indexes
+     *                                 of the array. Keep in mind that if it is intended to change either the
+     *                                 name of a field and any other properties, the change array entries
+     *                                 should have the new names of the fields as array indexes.
+     *
+     *                                The value of each entry of the array should be set to another associative
+     *                                 array with the properties of the fields to that are meant to be changed as
+     *                                 array entries. These entries should be assigned to the new values of the
+     *                                 respective properties. The properties of the fields should be the same
+     *                                 as defined by the MDB2 parser.
+     *
+     *                            Example
+     *                                array(
+     *                                    'name' => 'userlist',
+     *                                    'add' => array(
+     *                                        'quota' => array(
+     *                                            'type' => 'integer',
+     *                                            'unsigned' => 1
+     *                                        )
+     *                                    ),
+     *                                    'remove' => array(
+     *                                        'file_limit' => array(),
+     *                                        'time_limit' => array()
+     *                                    ),
+     *                                    'change' => array(
+     *                                        'name' => array(
+     *                                            'length' => '20',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 20,
+     *                                            ),
+     *                                        )
+     *                                    ),
+     *                                    'rename' => array(
+     *                                        'sex' => array(
+     *                                            'name' => 'gender',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 1,
+     *                                                'default' => 'M',
+     *                                            ),
+     *                                        )
+     *                                    )
+     *                                )
+     *
+     * @param boolean $check     indicates whether the function should just check if the DBMS driver
+     *                             can perform the requested table alterations if the value is true or
+     *                             actually perform them otherwise.
+     * @access public
+     *
+      * @return mixed MDB2_OK on success, a MDB2 error on failure
+     */
+    function alterTable($name, $changes, $check)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        foreach ($changes as $change_name => $change) {
+            switch ($change_name) {
+            case 'add':
+            case 'remove':
+            case 'change':
+            case 'rename':
+            case 'name':
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
+                    'change type "'.$change_name.'" not yet supported', __FUNCTION__);
+            }
+        }
+
+        if ($check) {
+            return MDB2_OK;
+        }
+
+        $query = '';
+        if (!empty($changes['name'])) {
+            $change_name = $db->quoteIdentifier($changes['name'], true);
+            $query .= 'RENAME TO ' . $change_name;
+        }
+
+        if (!empty($changes['add']) && is_array($changes['add'])) {
+            foreach ($changes['add'] as $field_name => $field) {
+                if ($query) {
+                    $query.= ', ';
+                }
+                $query.= 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field);
+            }
+        }
+
+        if (!empty($changes['remove']) && is_array($changes['remove'])) {
+            foreach ($changes['remove'] as $field_name => $field) {
+                if ($query) {
+                    $query.= ', ';
+                }
+                $field_name = $db->quoteIdentifier($field_name, true);
+                $query.= 'DROP ' . $field_name;
+            }
+        }
+
+        $rename = array();
+        if (!empty($changes['rename']) && is_array($changes['rename'])) {
+            foreach ($changes['rename'] as $field_name => $field) {
+                $rename[$field['name']] = $field_name;
+            }
+        }
+
+        if (!empty($changes['change']) && is_array($changes['change'])) {
+            foreach ($changes['change'] as $field_name => $field) {
+                if ($query) {
+                    $query.= ', ';
+                }
+                if (isset($rename[$field_name])) {
+                    $old_field_name = $rename[$field_name];
+                    unset($rename[$field_name]);
+                } else {
+                    $old_field_name = $field_name;
+                }
+                $old_field_name = $db->quoteIdentifier($old_field_name, true);
+                $query.= "CHANGE $old_field_name " . $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']);
+            }
+        }
+
+        if (!empty($rename) && is_array($rename)) {
+            foreach ($rename as $rename_name => $renamed_field) {
+                if ($query) {
+                    $query.= ', ';
+                }
+                $field = $changes['rename'][$renamed_field];
+                $renamed_field = $db->quoteIdentifier($renamed_field, true);
+                $query.= 'CHANGE ' . $renamed_field . ' ' . $db->getDeclaration($field['definition']['type'], $field['name'], $field['definition']);
+            }
+        }
+
+        if (!$query) {
+            return MDB2_OK;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("ALTER TABLE $name $query");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listDatabases()
+
+    /**
+     * list all databases
+     *
+     * @return mixed array of database names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listDatabases()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $result = $db->queryCol('SHOW DATABASES');
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listUsers()
+
+    /**
+     * list all users
+     *
+     * @return mixed array of user names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listUsers()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->queryCol('SELECT DISTINCT USER FROM mysql.USER');
+    }
+
+    // }}}
+    // {{{ listFunctions()
+
+    /**
+     * list all functions in the current database
+     *
+     * @return mixed array of function names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listFunctions()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name FROM mysql.proc";
+        /*
+        SELECT ROUTINE_NAME
+          FROM INFORMATION_SCHEMA.ROUTINES
+         WHERE ROUTINE_TYPE = 'FUNCTION'
+        */
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableTriggers()
+
+    /**
+     * list all triggers in the database that reference a given table
+     *
+     * @param string table for which all referenced triggers should be found
+     * @return mixed array of trigger names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableTriggers($table = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SHOW TRIGGERS';
+        if (null !== $table) {
+            $table = $db->quote($table, 'text');
+            $query .= " LIKE $table";
+        }
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTables()
+
+    /**
+     * list all tables in the current database
+     *
+     * @param string database, the current is default
+     * @return mixed array of table names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTables($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SHOW /*!50002 FULL*/ TABLES";
+        if (null !== $database) {
+            $query .= " FROM $database";
+        }
+        $query.= "/*!50002  WHERE Table_type = 'BASE TABLE'*/";
+
+        $table_names = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED);
+        if (PEAR::isError($table_names)) {
+            return $table_names;
+        }
+
+        $result = array();
+        foreach ($table_names as $table) {
+            if (!$this->_fixSequenceName($table[0], true)) {
+                $result[] = $table[0];
+            }
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listViews()
+
+    /**
+     * list all views in the current database
+     *
+     * @param string database, the current is default
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listViews($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SHOW FULL TABLES';
+        if (null !== $database) {
+            $query.= " FROM $database";
+        }
+        $query.= " WHERE Table_type = 'VIEW'";
+
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableFields()
+
+    /**
+     * list all fields in a table in the current database
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of field names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableFields($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $result = $db->queryCol("SHOW COLUMNS FROM $table");
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ createIndex()
+
+    /**
+     * Get the stucture of a field into an array
+     *
+     * @author Leoncx
+     * @param string $table      name of the table on which the index is to be created
+     * @param string $name       name of the index to be created
+     * @param array  $definition associative array that defines properties of the index to be created.
+     *                           Currently, only one property named FIELDS is supported. This property
+     *                           is also an associative with the names of the index fields as array
+     *                           indexes. Each entry of this array is set to another type of associative
+     *                           array that specifies properties of the index that are specific to
+     *                           each field.
+     *
+     *                           Currently, only the sorting property is supported. It should be used
+     *                           to define the sorting direction of the index. It may be set to either
+     *                           ascending or descending.
+     *
+     *                           Not all DBMS support index sorting direction configuration. The DBMS
+     *                           drivers of those that do not support it ignore this property. Use the
+     *                           function supports() to determine whether the DBMS driver can manage indexes.
+     *
+     *                           Example
+     *                               array(
+     *                                   'fields' => array(
+     *                                       'user_name' => array(
+     *                                           'sorting' => 'ascending'
+     *                                           'length' => 10
+     *                                       ),
+     *                                       'last_login' => array()
+     *                                    )
+     *                                )
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createIndex($table, $name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $query = "CREATE INDEX $name ON $table";
+        $fields = array();
+        foreach ($definition['fields'] as $field => $fieldinfo) {
+            if (!empty($fieldinfo['length'])) {
+                $fields[] = $db->quoteIdentifier($field, true) . '(' . $fieldinfo['length'] . ')';
+            } else {
+                $fields[] = $db->quoteIdentifier($field, true);
+            }
+        }
+        $query .= ' ('. implode(', ', $fields) . ')';
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropIndex()
+
+    /**
+     * drop existing index
+     *
+     * @param string    $table         name of table that should be used in method
+     * @param string    $name         name of the index to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropIndex($table, $name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $result = $db->exec("DROP INDEX $name ON $table");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listTableIndexes()
+
+    /**
+     * list all indexes in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of index names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableIndexes($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $key_name = 'Key_name';
+        $non_unique = 'Non_unique';
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            if ($db->options['field_case'] == CASE_LOWER) {
+                $key_name = strtolower($key_name);
+                $non_unique = strtolower($non_unique);
+            } else {
+                $key_name = strtoupper($key_name);
+                $non_unique = strtoupper($non_unique);
+            }
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $query = "SHOW INDEX FROM $table";
+        $indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($indexes)) {
+            return $indexes;
+        }
+
+        $result = array();
+        foreach ($indexes as $index_data) {
+            if ($index_data[$non_unique] && ($index = $this->_fixIndexName($index_data[$key_name]))) {
+                $result[$index] = true;
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ createConstraint()
+
+    /**
+     * create a constraint on a table
+     *
+     * @param string    $table        name of the table on which the constraint is to be created
+     * @param string    $name         name of the constraint to be created
+     * @param array     $definition   associative array that defines properties of the constraint to be created.
+     *                                Currently, only one property named FIELDS is supported. This property
+     *                                is also an associative with the names of the constraint fields as array
+     *                                constraints. Each entry of this array is set to another type of associative
+     *                                array that specifies properties of the constraint that are specific to
+     *                                each field.
+     *
+     *                                Example
+     *                                   array(
+     *                                       'fields' => array(
+     *                                           'user_name' => array(),
+     *                                           'last_login' => array()
+     *                                       )
+     *                                   )
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createConstraint($table, $name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $type = '';
+        $idx_name = $db->quoteIdentifier($db->getIndexName($name), true);
+        if (!empty($definition['primary'])) {
+            $type = 'PRIMARY';
+            $idx_name = 'KEY';
+        } elseif (!empty($definition['unique'])) {
+            $type = 'UNIQUE';
+        } elseif (!empty($definition['foreign'])) {
+            $type = 'CONSTRAINT';
+        }
+        if (empty($type)) {
+            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                'invalid definition, could not create constraint', __FUNCTION__);
+        }
+
+        $table_quoted = $db->quoteIdentifier($table, true);
+        $query = "ALTER TABLE $table_quoted ADD $type $idx_name";
+        if (!empty($definition['foreign'])) {
+            $query .= ' FOREIGN KEY';
+        }
+        $fields = array();
+        foreach ($definition['fields'] as $field => $fieldinfo) {
+            $quoted = $db->quoteIdentifier($field, true);
+            if (!empty($fieldinfo['length'])) {
+                $quoted .= '(' . $fieldinfo['length'] . ')';
+            }
+            $fields[] = $quoted;
+        }
+        $query .= ' ('. implode(', ', $fields) . ')';
+        if (!empty($definition['foreign'])) {
+            $query.= ' REFERENCES ' . $db->quoteIdentifier($definition['references']['table'], true);
+            $referenced_fields = array();
+            foreach (array_keys($definition['references']['fields']) as $field) {
+                $referenced_fields[] = $db->quoteIdentifier($field, true);
+            }
+            $query .= ' ('. implode(', ', $referenced_fields) . ')';
+            $query .= $this->_getAdvancedFKOptions($definition);
+
+            // add index on FK column(s) or we can't add a FK constraint
+            // @see http://forums.mysql.com/read.php?22,19755,226009
+            $result = $this->createIndex($table, $name.'_fkidx', $definition);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+        $res = $db->exec($query);
+        if (PEAR::isError($res)) {
+            return $res;
+        }
+        if (!empty($definition['foreign'])) {
+            return $this->_createFKTriggers($table, array($name => $definition));
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropConstraint()
+
+    /**
+     * drop existing constraint
+     *
+     * @param string    $table        name of table that should be used in method
+     * @param string    $name         name of the constraint to be dropped
+     * @param string    $primary      hint if the constraint is primary
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropConstraint($table, $name, $primary = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if ($primary || strtolower($name) == 'primary') {
+            $query = 'ALTER TABLE '. $db->quoteIdentifier($table, true) .' DROP PRIMARY KEY';
+            $result = $db->exec($query);
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            return MDB2_OK;
+        }
+
+        //is it a FK constraint? If so, also delete the associated triggers
+        $db->loadModule('Reverse', null, true);
+        $definition = $db->reverse->getTableConstraintDefinition($table, $name);
+        if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
+            //first drop the FK enforcing triggers
+            $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            //then drop the constraint itself
+            $table = $db->quoteIdentifier($table, true);
+            $name = $db->quoteIdentifier($db->getIndexName($name), true);
+            $query = "ALTER TABLE $table DROP FOREIGN KEY $name";
+            $result = $db->exec($query);
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            return MDB2_OK;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name = $db->quoteIdentifier($db->getIndexName($name), true);
+        $query = "ALTER TABLE $table DROP INDEX $name";
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ _createFKTriggers()
+
+    /**
+     * Create triggers to enforce the FOREIGN KEY constraint on the table
+     *
+     * NB: since there's no RAISE_APPLICATION_ERROR facility in mysql,
+     * we call a non-existent procedure to raise the FK violation message.
+     * @see http://forums.mysql.com/read.php?99,55108,71877#msg-71877
+     *
+     * @param string $table        table name
+     * @param array  $foreign_keys FOREIGN KEY definitions
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access private
+     */
+    function _createFKTriggers($table, $foreign_keys)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        // create triggers to enforce FOREIGN KEY constraints
+        if ($db->supports('triggers') && !empty($foreign_keys)) {
+            $table_quoted = $db->quoteIdentifier($table, true);
+            foreach ($foreign_keys as $fkname => $fkdef) {
+                if (empty($fkdef)) {
+                    continue;
+                }
+                //set actions to default if not set
+                $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']);
+                $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']);
+
+                $trigger_names = array(
+                    'insert'    => $fkname.'_insert_trg',
+                    'update'    => $fkname.'_update_trg',
+                    'pk_update' => $fkname.'_pk_update_trg',
+                    'pk_delete' => $fkname.'_pk_delete_trg',
+                );
+                $table_fields = array_keys($fkdef['fields']);
+                $referenced_fields = array_keys($fkdef['references']['fields']);
+
+                //create the ON [UPDATE|DELETE] triggers on the primary table
+                $restrict_action = ' IF (SELECT ';
+                $aliased_fields = array();
+                foreach ($table_fields as $field) {
+                    $aliased_fields[] = $table_quoted .'.'.$field .' AS '.$field;
+                }
+                $restrict_action .= implode(',', $aliased_fields)
+                       .' FROM '.$table_quoted
+                       .' WHERE ';
+                $conditions  = array();
+                $new_values  = array();
+                $null_values = array();
+                for ($i=0; $i<count($table_fields); $i++) {
+                    $conditions[]  = $table_fields[$i] .' = OLD.'.$referenced_fields[$i];
+                    $new_values[]  = $table_fields[$i] .' = NEW.'.$referenced_fields[$i];
+                    $null_values[] = $table_fields[$i] .' = NULL';
+                }
+                $conditions2 = array();
+                for ($i=0; $i<count($referenced_fields); $i++) {
+                    $conditions2[]  = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i];
+                }
+
+                $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL';
+                $restrict_action2 = empty($conditions2) ? '' : ' AND (' .implode(' OR ', $conditions2) .')';
+                $restrict_action3 = ' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();'
+                                   .' END IF;';
+
+                $restrict_action_update = $restrict_action . $restrict_action2 . $restrict_action3;
+                $restrict_action_delete = $restrict_action . $restrict_action3; // There is no NEW row in on DELETE trigger
+
+                $cascade_action_update = 'UPDATE '.$table_quoted.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';';
+                $cascade_action_delete = 'DELETE FROM '.$table_quoted.' WHERE '.implode(' AND ', $conditions). ';';
+                $setnull_action        = 'UPDATE '.$table_quoted.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions). ';';
+
+                if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) {
+                    $db->loadModule('Reverse', null, true);
+                    $default_values = array();
+                    foreach ($table_fields as $table_field) {
+                        $field_definition = $db->reverse->getTableFieldDefinition($table, $field);
+                        if (PEAR::isError($field_definition)) {
+                            return $field_definition;
+                        }
+                        $default_values[] = $table_field .' = '. $field_definition[0]['default'];
+                    }
+                    $setdefault_action = 'UPDATE '.$table_quoted.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';';
+                }
+
+                $query = 'CREATE TRIGGER %s'
+                        .' %s ON '.$fkdef['references']['table']
+                        .' FOR EACH ROW BEGIN '
+                        .' SET FOREIGN_KEY_CHECKS = 0; ';  //only really needed for ON UPDATE CASCADE
+
+                if ('CASCADE' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE',  'update') . $cascade_action_update;
+                } elseif ('SET NULL' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setnull_action;
+                } elseif ('SET DEFAULT' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action;
+                } elseif ('NO ACTION' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'AFTER UPDATE', 'update');
+                } elseif ('RESTRICT' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update');
+                }
+                if ('CASCADE' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE',  'delete') . $cascade_action_delete;
+                } elseif ('SET NULL' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action;
+                } elseif ('SET DEFAULT' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action;
+                } elseif ('NO ACTION' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete');
+                } elseif ('RESTRICT' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete');
+                }
+                $sql_update .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
+                $sql_delete .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
+
+                $db->pushErrorHandling(PEAR_ERROR_RETURN);
+                $db->expectError(MDB2_ERROR_CANNOT_CREATE);
+                $result = $db->exec($sql_delete);
+                $expected_errmsg = 'This MySQL version doesn\'t support multiple triggers with the same action time and event for one table';
+                $db->popExpect();
+                $db->popErrorHandling();
+                if (PEAR::isError($result)) {
+                    if ($result->getCode() != MDB2_ERROR_CANNOT_CREATE) {
+                        return $result;
+                    }
+                    $db->warnings[] = $expected_errmsg;
+                }
+                $db->pushErrorHandling(PEAR_ERROR_RETURN);
+                $db->expectError(MDB2_ERROR_CANNOT_CREATE);
+                $result = $db->exec($sql_update);
+                $db->popExpect();
+                $db->popErrorHandling();
+                if (PEAR::isError($result) && $result->getCode() != MDB2_ERROR_CANNOT_CREATE) {
+                    if ($result->getCode() != MDB2_ERROR_CANNOT_CREATE) {
+                        return $result;
+                    }
+                    $db->warnings[] = $expected_errmsg;
+                }
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ _dropFKTriggers()
+
+    /**
+     * Drop the triggers created to enforce the FOREIGN KEY constraint on the table
+     *
+     * @param string $table            table name
+     * @param string $fkname           FOREIGN KEY constraint name
+     * @param string $referenced_table referenced table name
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access private
+     */
+    function _dropFKTriggers($table, $fkname, $referenced_table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $triggers  = $this->listTableTriggers($table);
+        $triggers2 = $this->listTableTriggers($referenced_table);
+        if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) {
+            $triggers = array_merge($triggers, $triggers2);
+            $pattern = '/^'.$fkname.'(_pk)?_(insert|update|delete)_trg$/i';
+            foreach ($triggers as $trigger) {
+                if (preg_match($pattern, $trigger)) {
+                    $result = $db->exec('DROP TRIGGER '.$trigger);
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listTableConstraints()
+
+    /**
+     * list all constraints in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of constraint names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableConstraints($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $key_name = 'Key_name';
+        $non_unique = 'Non_unique';
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            if ($db->options['field_case'] == CASE_LOWER) {
+                $key_name = strtolower($key_name);
+                $non_unique = strtolower($non_unique);
+            } else {
+                $key_name = strtoupper($key_name);
+                $non_unique = strtoupper($non_unique);
+            }
+        }
+
+        $query = 'SHOW INDEX FROM ' . $db->quoteIdentifier($table, true);
+        $indexes = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($indexes)) {
+            return $indexes;
+        }
+
+        $result = array();
+        foreach ($indexes as $index_data) {
+            if (!$index_data[$non_unique]) {
+                if ($index_data[$key_name] !== 'PRIMARY') {
+                    $index = $this->_fixIndexName($index_data[$key_name]);
+                } else {
+                    $index = 'PRIMARY';
+                }
+                if (!empty($index)) {
+                    $result[$index] = true;
+                }
+            }
+        }
+        
+        //list FOREIGN KEY constraints...
+        $query = 'SHOW CREATE TABLE '. $db->escape($table);
+        $definition = $db->queryOne($query, 'text', 1);
+        if (!PEAR::isError($definition) && !empty($definition)) {
+            $pattern = '/\bCONSTRAINT\b\s+([^\s]+)\s+\bFOREIGN KEY\b/Uims';
+            if (preg_match_all($pattern, str_replace('`', '', $definition), $matches) > 0) {
+                foreach ($matches[1] as $constraint) {
+                    $result[$constraint] = true;
+                }
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ createSequence()
+
+    /**
+     * create sequence
+     *
+     * @param string    $seq_name name of the sequence to be created
+     * @param string    $start    start value of the sequence; default is 1
+     * @param array     $options  An associative array of table options:
+     *                          array(
+     *                              'comment' => 'Foo',
+     *                              'charset' => 'utf8',
+     *                              'collate' => 'utf8_unicode_ci',
+     *                              'type'    => 'innodb',
+     *                          );
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createSequence($seq_name, $start = 1, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
+        $seqcol_name = $db->quoteIdentifier($db->options['seqcol_name'], true);
+        
+        $options_strings = array();
+
+        if (!empty($options['comment'])) {
+            $options_strings['comment'] = 'COMMENT = '.$db->quote($options['comment'], 'text');
+        }
+
+        if (!empty($options['charset'])) {
+            $options_strings['charset'] = 'DEFAULT CHARACTER SET '.$options['charset'];
+            if (!empty($options['collate'])) {
+                $options_strings['charset'].= ' COLLATE '.$options['collate'];
+            }
+        }
+
+        $type = false;
+        if (!empty($options['type'])) {
+            $type = $options['type'];
+        } elseif ($db->options['default_table_type']) {
+            $type = $db->options['default_table_type'];
+        }
+        if ($type) {
+            $options_strings[] = "ENGINE = $type";
+        }
+
+        $query = "CREATE TABLE $sequence_name ($seqcol_name INT NOT NULL AUTO_INCREMENT, PRIMARY KEY ($seqcol_name))";
+        if (!empty($options_strings)) {
+            $query .= ' '.implode(' ', $options_strings);
+        }
+        $res = $db->exec($query);
+        if (PEAR::isError($res)) {
+            return $res;
+        }
+
+        if ($start == 1) {
+            return MDB2_OK;
+        }
+
+        $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (".($start-1).')';
+        $res = $db->exec($query);
+        if (!PEAR::isError($res)) {
+            return MDB2_OK;
+        }
+
+        // Handle error
+        $result = $db->exec("DROP TABLE $sequence_name");
+        if (PEAR::isError($result)) {
+            return $db->raiseError($result, null, null,
+                'could not drop inconsistent sequence table', __FUNCTION__);
+        }
+
+        return $db->raiseError($res, null, null,
+            'could not create sequence table', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ dropSequence()
+
+    /**
+     * drop existing sequence
+     *
+     * @param string    $seq_name     name of the sequence to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropSequence($seq_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
+        $result = $db->exec("DROP TABLE $sequence_name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listSequences()
+
+    /**
+     * list all sequences in the current database
+     *
+     * @param string database, the current is default
+     * @return mixed array of sequence names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listSequences($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SHOW TABLES";
+        if (null !== $database) {
+            $query .= " FROM $database";
+        }
+        $table_names = $db->queryCol($query);
+        if (PEAR::isError($table_names)) {
+            return $table_names;
+        }
+
+        $result = array();
+        foreach ($table_names as $table_name) {
+            if ($sqn = $this->_fixSequenceName($table_name, true)) {
+                $result[] = $sqn;
+            }
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+}
+?>
diff --git a/3rdparty/MDB2/Driver/Manager/pgsql.php b/3rdparty/MDB2/Driver/Manager/pgsql.php
index ec1b08975f0e3d4b769048866fdd92875d60355f..a7b776cc1b70c755300fad2b7c802d0eb4d04677 100644
--- a/3rdparty/MDB2/Driver/Manager/pgsql.php
+++ b/3rdparty/MDB2/Driver/Manager/pgsql.php
@@ -1,954 +1,978 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Paul Cooper <pgc@ucecom.com>                                 |
-// +----------------------------------------------------------------------+
-//
-// $Id: pgsql.php 299393 2010-05-14 17:49:49Z afz $
-
-require_once 'MDB2/Driver/Manager/Common.php';
-
-/**
- * MDB2 MySQL driver for the management modules
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
-{
-    // {{{ createDatabase()
-
-    /**
-     * create a new database
-     *
-     * @param string $name    name of the database that should be created
-     * @param array  $options array with charset info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createDatabase($name, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name  = $db->quoteIdentifier($name, true);
-        $query = 'CREATE DATABASE ' . $name;
-        if (!empty($options['charset'])) {
-            $query .= ' WITH ENCODING ' . $db->quote($options['charset'], 'text');
-        }
-        return $db->standaloneQuery($query, null, true);
-    }
-
-    // }}}
-    // {{{ alterDatabase()
-
-    /**
-     * alter an existing database
-     *
-     * @param string $name    name of the database that is intended to be changed
-     * @param array  $options array with name, owner info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function alterDatabase($name, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = '';
-        if (!empty($options['name'])) {
-            $query .= ' RENAME TO ' . $options['name'];
-        }
-        if (!empty($options['owner'])) {
-            $query .= ' OWNER TO ' . $options['owner'];
-        }
-
-        if (empty($query)) {
-            return MDB2_OK;
-        }
-
-        $query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true) . $query;
-        return $db->standaloneQuery($query, null, true);
-    }
-
-    // }}}
-    // {{{ dropDatabase()
-
-    /**
-     * drop an existing database
-     *
-     * @param string $name name of the database that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropDatabase($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        $query = "DROP DATABASE $name";
-        return $db->standaloneQuery($query, null, true);
-    }
-
-    // }}}
-    // {{{ _getAdvancedFKOptions()
-
-    /**
-     * Return the FOREIGN KEY query section dealing with non-standard options
-     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
-     *
-     * @param array $definition
-     * @return string
-     * @access protected
-     */
-    function _getAdvancedFKOptions($definition)
-    {
-        $query = '';
-        if (!empty($definition['match'])) {
-            $query .= ' MATCH '.$definition['match'];
-        }
-        if (!empty($definition['onupdate'])) {
-            $query .= ' ON UPDATE '.$definition['onupdate'];
-        }
-        if (!empty($definition['ondelete'])) {
-            $query .= ' ON DELETE '.$definition['ondelete'];
-        }
-        if (!empty($definition['deferrable'])) {
-            $query .= ' DEFERRABLE';
-        } else {
-            $query .= ' NOT DEFERRABLE';
-        }
-        if (!empty($definition['initiallydeferred'])) {
-            $query .= ' INITIALLY DEFERRED';
-        } else {
-            $query .= ' INITIALLY IMMEDIATE';
-        }
-        return $query;
-    }
-
-    // }}}
-    // {{{ truncateTable()
-
-    /**
-     * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported,
-     * it falls back to a DELETE FROM TABLE query)
-     *
-     * @param string $name name of the table that should be truncated
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function truncateTable($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        return $db->exec("TRUNCATE TABLE $name");
-    }
-
-    // }}}
-    // {{{ vacuum()
-
-    /**
-     * Optimize (vacuum) all the tables in the db (or only the specified table)
-     * and optionally run ANALYZE.
-     *
-     * @param string $table table name (all the tables if empty)
-     * @param array  $options an array with driver-specific options:
-     *               - timeout [int] (in seconds) [mssql-only]
-     *               - analyze [boolean] [pgsql and mysql]
-     *               - full [boolean] [pgsql-only]
-     *               - freeze [boolean] [pgsql-only]
-     *
-     * @return mixed MDB2_OK success, a MDB2 error on failure
-     * @access public
-     */
-    function vacuum($table = null, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $query = 'VACUUM';
-
-        if (!empty($options['full'])) {
-            $query .= ' FULL';
-        }
-        if (!empty($options['freeze'])) {
-            $query .= ' FREEZE';
-        }
-        if (!empty($options['analyze'])) {
-            $query .= ' ANALYZE';
-        }
-
-        if (!empty($table)) {
-            $query .= ' '.$db->quoteIdentifier($table, true);
-        }
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ alterTable()
-
-    /**
-     * alter an existing table
-     *
-     * @param string $name         name of the table that is intended to be changed.
-     * @param array $changes     associative array that contains the details of each type
-     *                             of change that is intended to be performed. The types of
-     *                             changes that are currently supported are defined as follows:
-     *
-     *                             name
-     *
-     *                                New name for the table.
-     *
-     *                            add
-     *
-     *                                Associative array with the names of fields to be added as
-     *                                 indexes of the array. The value of each entry of the array
-     *                                 should be set to another associative array with the properties
-     *                                 of the fields to be added. The properties of the fields should
-     *                                 be the same as defined by the MDB2 parser.
-     *
-     *
-     *                            remove
-     *
-     *                                Associative array with the names of fields to be removed as indexes
-     *                                 of the array. Currently the values assigned to each entry are ignored.
-     *                                 An empty array should be used for future compatibility.
-     *
-     *                            rename
-     *
-     *                                Associative array with the names of fields to be renamed as indexes
-     *                                 of the array. The value of each entry of the array should be set to
-     *                                 another associative array with the entry named name with the new
-     *                                 field name and the entry named Declaration that is expected to contain
-     *                                 the portion of the field declaration already in DBMS specific SQL code
-     *                                 as it is used in the CREATE TABLE statement.
-     *
-     *                            change
-     *
-     *                                Associative array with the names of the fields to be changed as indexes
-     *                                 of the array. Keep in mind that if it is intended to change either the
-     *                                 name of a field and any other properties, the change array entries
-     *                                 should have the new names of the fields as array indexes.
-     *
-     *                                The value of each entry of the array should be set to another associative
-     *                                 array with the properties of the fields to that are meant to be changed as
-     *                                 array entries. These entries should be assigned to the new values of the
-     *                                 respective properties. The properties of the fields should be the same
-     *                                 as defined by the MDB2 parser.
-     *
-     *                            Example
-     *                                array(
-     *                                    'name' => 'userlist',
-     *                                    'add' => array(
-     *                                        'quota' => array(
-     *                                            'type' => 'integer',
-     *                                            'unsigned' => 1
-     *                                        )
-     *                                    ),
-     *                                    'remove' => array(
-     *                                        'file_limit' => array(),
-     *                                        'time_limit' => array()
-     *                                    ),
-     *                                    'change' => array(
-     *                                        'name' => array(
-     *                                            'length' => '20',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 20,
-     *                                            ),
-     *                                        )
-     *                                    ),
-     *                                    'rename' => array(
-     *                                        'sex' => array(
-     *                                            'name' => 'gender',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 1,
-     *                                                'default' => 'M',
-     *                                            ),
-     *                                        )
-     *                                    )
-     *                                )
-     *
-     * @param boolean $check     indicates whether the function should just check if the DBMS driver
-     *                             can perform the requested table alterations if the value is true or
-     *                             actually perform them otherwise.
-     * @access public
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     */
-    function alterTable($name, $changes, $check)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        foreach ($changes as $change_name => $change) {
-            switch ($change_name) {
-            case 'add':
-            case 'remove':
-            case 'change':
-            case 'name':
-            case 'rename':
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
-                    'change type "'.$change_name.'\" not yet supported', __FUNCTION__);
-            }
-        }
-
-        if ($check) {
-            return MDB2_OK;
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-
-        if (!empty($changes['remove']) && is_array($changes['remove'])) {
-            foreach ($changes['remove'] as $field_name => $field) {
-                $field_name = $db->quoteIdentifier($field_name, true);
-                $query = 'DROP ' . $field_name;
-                $result = $db->exec("ALTER TABLE $name $query");
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-        }
-
-        if (!empty($changes['rename']) && is_array($changes['rename'])) {
-            foreach ($changes['rename'] as $field_name => $field) {
-                $field_name = $db->quoteIdentifier($field_name, true);
-                $result = $db->exec("ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name'], true));
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-        }
-
-        if (!empty($changes['add']) && is_array($changes['add'])) {
-            foreach ($changes['add'] as $field_name => $field) {
-                $query = 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field);
-                $result = $db->exec("ALTER TABLE $name $query");
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-        }
-
-        if (!empty($changes['change']) && is_array($changes['change'])) {
-            foreach ($changes['change'] as $field_name => $field) {
-                $field_name = $db->quoteIdentifier($field_name, true);
-                if (!empty($field['definition']['type'])) {
-                    $server_info = $db->getServerVersion();
-                    if (PEAR::isError($server_info)) {
-                        return $server_info;
-                    }
-                    if (is_array($server_info) && $server_info['major'] < 8) {
-                        return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
-                            'changing column type for "'.$change_name.'\" requires PostgreSQL 8.0 or above', __FUNCTION__);
-                    }
-                    $db->loadModule('Datatype', null, true);
-                    $type = $db->datatype->getTypeDeclaration($field['definition']);
-                    $query = "ALTER $field_name TYPE $type USING CAST($field_name AS $type)";
-                    $result = $db->exec("ALTER TABLE $name $query");
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-                if (array_key_exists('default', $field['definition'])) {
-                    $query = "ALTER $field_name SET DEFAULT ".$db->quote($field['definition']['default'], $field['definition']['type']);
-                    $result = $db->exec("ALTER TABLE $name $query");
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-                if (array_key_exists('notnull', $field['definition'])) {
-                    $query = "ALTER $field_name ".($field['definition']['notnull'] ? 'SET' : 'DROP').' NOT NULL';
-                    $result = $db->exec("ALTER TABLE $name $query");
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-            }
-        }
-
-        if (!empty($changes['name'])) {
-            $change_name = $db->quoteIdentifier($changes['name'], true);
-            $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ listDatabases()
-
-    /**
-     * list all databases
-     *
-     * @return mixed array of database names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listDatabases()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SELECT datname FROM pg_database';
-        $result2 = $db->standaloneQuery($query, array('text'), false);
-        if (!MDB2::isResultCommon($result2)) {
-            return $result2;
-        }
-
-        $result = $result2->fetchCol();
-        $result2->free();
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listUsers()
-
-    /**
-     * list all users
-     *
-     * @return mixed array of user names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listUsers()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SELECT usename FROM pg_user';
-        $result2 = $db->standaloneQuery($query, array('text'), false);
-        if (!MDB2::isResultCommon($result2)) {
-            return $result2;
-        }
-
-        $result = $result2->fetchCol();
-        $result2->free();
-        return $result;
-    }
-
-    // }}}
-    // {{{ listViews()
-
-    /**
-     * list all views in the current database
-     *
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listViews()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT viewname
-                    FROM pg_views
-                   WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
-                     AND viewname !~ '^pg_'";
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableViews()
-
-    /**
-     * list the views in the database that reference a given table
-     *
-     * @param string table for which all referenced views should be found
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableViews($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SELECT viewname FROM pg_views NATURAL JOIN pg_tables';
-        $query.= ' WHERE tablename ='.$db->quote($table, 'text');
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listFunctions()
-
-    /**
-     * list all functions in the current database
-     *
-     * @return mixed array of function names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listFunctions()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "
-            SELECT
-                proname
-            FROM
-                pg_proc pr,
-                pg_type tp
-            WHERE
-                tp.oid = pr.prorettype
-                AND pr.proisagg = FALSE
-                AND tp.typname <> 'trigger'
-                AND pr.pronamespace IN
-                    (SELECT oid FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')";
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableTriggers()
-
-    /**
-     * list all triggers in the database that reference a given table
-     *
-     * @param string table for which all referenced triggers should be found
-     * @return mixed array of trigger names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableTriggers($table = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SELECT trg.tgname AS trigger_name
-                    FROM pg_trigger trg,
-                         pg_class tbl
-                   WHERE trg.tgrelid = tbl.oid';
-        if (null !== $table) {
-            $table = $db->quote(strtoupper($table), 'text');
-            $query .= " AND UPPER(tbl.relname) = $table";
-        }
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTables()
-
-    /**
-     * list all tables in the current database
-     *
-     * @return mixed array of table names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTables()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        // gratuitously stolen from PEAR DB _getSpecialQuery in pgsql.php
-        $query = 'SELECT c.relname AS "Name"'
-            . ' FROM pg_class c, pg_user u'
-            . ' WHERE c.relowner = u.usesysid'
-            . " AND c.relkind = 'r'"
-            . ' AND NOT EXISTS'
-            . ' (SELECT 1 FROM pg_views'
-            . '  WHERE viewname = c.relname)'
-            . " AND c.relname !~ '^(pg_|sql_)'"
-            . ' UNION'
-            . ' SELECT c.relname AS "Name"'
-            . ' FROM pg_class c'
-            . " WHERE c.relkind = 'r'"
-            . ' AND NOT EXISTS'
-            . ' (SELECT 1 FROM pg_views'
-            . '  WHERE viewname = c.relname)'
-            . ' AND NOT EXISTS'
-            . ' (SELECT 1 FROM pg_user'
-            . '  WHERE usesysid = c.relowner)'
-            . " AND c.relname !~ '^pg_'";
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableFields()
-
-    /**
-     * list all fields in a table in the current database
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of field names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableFields($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table);
-
-        $table = $db->quoteIdentifier($table, true);
-        if (!empty($schema)) {
-            $table = $db->quoteIdentifier($schema, true) . '.' .$table;
-        }
-        $db->setLimit(1);
-        $result2 = $db->query("SELECT * FROM $table");
-        if (PEAR::isError($result2)) {
-            return $result2;
-        }
-        $result = $result2->getColumnNames();
-        $result2->free();
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return array_flip($result);
-    }
-
-    // }}}
-    // {{{ listTableIndexes()
-
-    /**
-     * list all indexes in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of index names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableIndexes($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table);
-
-        $table = $db->quote($table, 'text');
-        $subquery = "SELECT indexrelid
-                       FROM pg_index
-                  LEFT JOIN pg_class ON pg_class.oid = pg_index.indrelid
-                  LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
-                      WHERE pg_class.relname = $table
-                        AND indisunique != 't'
-                        AND indisprimary != 't'";
-        if (!empty($schema)) {
-            $subquery .= ' AND pg_namespace.nspname = '.$db->quote($schema, 'text');
-        }
-        $query = "SELECT relname FROM pg_class WHERE oid IN ($subquery)";
-        $indexes = $db->queryCol($query, 'text');
-        if (PEAR::isError($indexes)) {
-            return $indexes;
-        }
-
-        $result = array();
-        foreach ($indexes as $index) {
-            $index = $this->_fixIndexName($index);
-            if (!empty($index)) {
-                $result[$index] = true;
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ dropConstraint()
-
-    /**
-     * drop existing constraint
-     *
-     * @param string $table   name of table that should be used in method
-     * @param string $name    name of the constraint to be dropped
-     * @param string $primary hint if the constraint is primary
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropConstraint($table, $name, $primary = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        // is it an UNIQUE index?
-        $query = 'SELECT relname
-                    FROM pg_class
-                   WHERE oid IN (
-                         SELECT indexrelid
-                           FROM pg_index, pg_class
-                          WHERE pg_class.relname = '.$db->quote($table, 'text').'
-                            AND pg_class.oid = pg_index.indrelid
-                            AND indisunique = \'t\')
-                  EXCEPT
-                  SELECT conname
-                   FROM pg_constraint, pg_class
-                  WHERE pg_constraint.conrelid = pg_class.oid
-                    AND relname = '. $db->quote($table, 'text');
-        $unique = $db->queryCol($query, 'text');
-        if (PEAR::isError($unique) || empty($unique)) {
-            // not an UNIQUE index, maybe a CONSTRAINT
-            return parent::dropConstraint($table, $name, $primary);
-        }
-
-        if (in_array($name, $unique)) {
-            return $db->exec('DROP INDEX '.$db->quoteIdentifier($name, true));
-        }
-        $idxname = $db->getIndexName($name);
-        if (in_array($idxname, $unique)) {
-            return $db->exec('DROP INDEX '.$db->quoteIdentifier($idxname, true));
-        }
-        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-            $name . ' is not an existing constraint for table ' . $table, __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listTableConstraints()
-
-    /**
-     * list all constraints in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of constraint names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableConstraints($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table);
-
-        $table = $db->quote($table, 'text');
-        $query = 'SELECT conname
-                    FROM pg_constraint
-               LEFT JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
-               LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
-                   WHERE relname = ' .$table;
-        if (!empty($schema)) {
-            $query .= ' AND pg_namespace.nspname = ' . $db->quote($schema, 'text');
-        }
-        $query .= '
-                   UNION DISTINCT
-                  SELECT relname
-                    FROM pg_class
-                   WHERE oid IN (
-                         SELECT indexrelid
-                           FROM pg_index
-                      LEFT JOIN pg_class ON pg_class.oid = pg_index.indrelid
-                      LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
-                          WHERE pg_class.relname = '.$table.'
-                            AND indisunique = \'t\'';
-        if (!empty($schema)) {
-            $query .= ' AND pg_namespace.nspname = ' . $db->quote($schema, 'text');
-        }
-        $query .= ')';
-        $constraints = $db->queryCol($query);
-        if (PEAR::isError($constraints)) {
-            return $constraints;
-        }
-
-        $result = array();
-        foreach ($constraints as $constraint) {
-            $constraint = $this->_fixIndexName($constraint);
-            if (!empty($constraint)) {
-                $result[$constraint] = true;
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
-            && $db->options['field_case'] == CASE_LOWER
-        ) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ createSequence()
-
-    /**
-     * create sequence
-     *
-     * @param string $seq_name name of the sequence to be created
-     * @param string $start start value of the sequence; default is 1
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createSequence($seq_name, $start = 1)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
-        return $db->exec("CREATE SEQUENCE $sequence_name INCREMENT 1".
-            ($start < 1 ? " MINVALUE $start" : '')." START $start");
-    }
-
-    // }}}
-    // {{{ dropSequence()
-
-    /**
-     * drop existing sequence
-     *
-     * @param string $seq_name name of the sequence to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropSequence($seq_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
-        return $db->exec("DROP SEQUENCE $sequence_name");
-    }
-
-    // }}}
-    // {{{ listSequences()
-
-    /**
-     * list all sequences in the current database
-     *
-     * @return mixed array of sequence names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listSequences()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT relname FROM pg_class WHERE relkind = 'S' AND relnamespace IN";
-        $query.= "(SELECT oid FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')";
-        $table_names = $db->queryCol($query);
-        if (PEAR::isError($table_names)) {
-            return $table_names;
-        }
-        $result = array();
-        foreach ($table_names as $table_name) {
-            $result[] = $this->_fixSequenceName($table_name);
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-}
-?>
\ No newline at end of file
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Paul Cooper <pgc@ucecom.com>                                 |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+require_once 'MDB2/Driver/Manager/Common.php';
+
+/**
+ * MDB2 MySQL driver for the management modules
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
+{
+    // {{{ createDatabase()
+
+    /**
+     * create a new database
+     *
+     * @param string $name    name of the database that should be created
+     * @param array  $options array with charset info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createDatabase($name, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name  = $db->quoteIdentifier($name, true);
+        $query = 'CREATE DATABASE ' . $name;
+        if (!empty($options['charset'])) {
+            $query .= ' WITH ENCODING ' . $db->quote($options['charset'], 'text');
+        }
+        return $db->standaloneQuery($query, null, true);
+    }
+
+    // }}}
+    // {{{ alterDatabase()
+
+    /**
+     * alter an existing database
+     *
+     * @param string $name    name of the database that is intended to be changed
+     * @param array  $options array with name, owner info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function alterDatabase($name, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = '';
+        if (!empty($options['name'])) {
+            $query .= ' RENAME TO ' . $options['name'];
+        }
+        if (!empty($options['owner'])) {
+            $query .= ' OWNER TO ' . $options['owner'];
+        }
+
+        if (empty($query)) {
+            return MDB2_OK;
+        }
+
+        $query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true) . $query;
+        return $db->standaloneQuery($query, null, true);
+    }
+
+    // }}}
+    // {{{ dropDatabase()
+
+    /**
+     * drop an existing database
+     *
+     * @param string $name name of the database that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropDatabase($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $query = "DROP DATABASE $name";
+        return $db->standaloneQuery($query, null, true);
+    }
+
+    // }}}
+    // {{{ _getAdvancedFKOptions()
+
+    /**
+     * Return the FOREIGN KEY query section dealing with non-standard options
+     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
+     *
+     * @param array $definition
+     * @return string
+     * @access protected
+     */
+    function _getAdvancedFKOptions($definition)
+    {
+        $query = '';
+        if (!empty($definition['match'])) {
+            $query .= ' MATCH '.$definition['match'];
+        }
+        if (!empty($definition['onupdate'])) {
+            $query .= ' ON UPDATE '.$definition['onupdate'];
+        }
+        if (!empty($definition['ondelete'])) {
+            $query .= ' ON DELETE '.$definition['ondelete'];
+        }
+        if (!empty($definition['deferrable'])) {
+            $query .= ' DEFERRABLE';
+        } else {
+            $query .= ' NOT DEFERRABLE';
+        }
+        if (!empty($definition['initiallydeferred'])) {
+            $query .= ' INITIALLY DEFERRED';
+        } else {
+            $query .= ' INITIALLY IMMEDIATE';
+        }
+        return $query;
+    }
+
+    // }}}
+    // {{{ truncateTable()
+
+    /**
+     * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported,
+     * it falls back to a DELETE FROM TABLE query)
+     *
+     * @param string $name name of the table that should be truncated
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function truncateTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("TRUNCATE TABLE $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ vacuum()
+
+    /**
+     * Optimize (vacuum) all the tables in the db (or only the specified table)
+     * and optionally run ANALYZE.
+     *
+     * @param string $table table name (all the tables if empty)
+     * @param array  $options an array with driver-specific options:
+     *               - timeout [int] (in seconds) [mssql-only]
+     *               - analyze [boolean] [pgsql and mysql]
+     *               - full [boolean] [pgsql-only]
+     *               - freeze [boolean] [pgsql-only]
+     *
+     * @return mixed MDB2_OK success, a MDB2 error on failure
+     * @access public
+     */
+    function vacuum($table = null, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        $query = 'VACUUM';
+
+        if (!empty($options['full'])) {
+            $query .= ' FULL';
+        }
+        if (!empty($options['freeze'])) {
+            $query .= ' FREEZE';
+        }
+        if (!empty($options['analyze'])) {
+            $query .= ' ANALYZE';
+        }
+
+        if (!empty($table)) {
+            $query .= ' '.$db->quoteIdentifier($table, true);
+        }
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ alterTable()
+
+    /**
+     * alter an existing table
+     *
+     * @param string $name         name of the table that is intended to be changed.
+     * @param array $changes     associative array that contains the details of each type
+     *                             of change that is intended to be performed. The types of
+     *                             changes that are currently supported are defined as follows:
+     *
+     *                             name
+     *
+     *                                New name for the table.
+     *
+     *                            add
+     *
+     *                                Associative array with the names of fields to be added as
+     *                                 indexes of the array. The value of each entry of the array
+     *                                 should be set to another associative array with the properties
+     *                                 of the fields to be added. The properties of the fields should
+     *                                 be the same as defined by the MDB2 parser.
+     *
+     *
+     *                            remove
+     *
+     *                                Associative array with the names of fields to be removed as indexes
+     *                                 of the array. Currently the values assigned to each entry are ignored.
+     *                                 An empty array should be used for future compatibility.
+     *
+     *                            rename
+     *
+     *                                Associative array with the names of fields to be renamed as indexes
+     *                                 of the array. The value of each entry of the array should be set to
+     *                                 another associative array with the entry named name with the new
+     *                                 field name and the entry named Declaration that is expected to contain
+     *                                 the portion of the field declaration already in DBMS specific SQL code
+     *                                 as it is used in the CREATE TABLE statement.
+     *
+     *                            change
+     *
+     *                                Associative array with the names of the fields to be changed as indexes
+     *                                 of the array. Keep in mind that if it is intended to change either the
+     *                                 name of a field and any other properties, the change array entries
+     *                                 should have the new names of the fields as array indexes.
+     *
+     *                                The value of each entry of the array should be set to another associative
+     *                                 array with the properties of the fields to that are meant to be changed as
+     *                                 array entries. These entries should be assigned to the new values of the
+     *                                 respective properties. The properties of the fields should be the same
+     *                                 as defined by the MDB2 parser.
+     *
+     *                            Example
+     *                                array(
+     *                                    'name' => 'userlist',
+     *                                    'add' => array(
+     *                                        'quota' => array(
+     *                                            'type' => 'integer',
+     *                                            'unsigned' => 1
+     *                                        )
+     *                                    ),
+     *                                    'remove' => array(
+     *                                        'file_limit' => array(),
+     *                                        'time_limit' => array()
+     *                                    ),
+     *                                    'change' => array(
+     *                                        'name' => array(
+     *                                            'length' => '20',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 20,
+     *                                            ),
+     *                                        )
+     *                                    ),
+     *                                    'rename' => array(
+     *                                        'sex' => array(
+     *                                            'name' => 'gender',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 1,
+     *                                                'default' => 'M',
+     *                                            ),
+     *                                        )
+     *                                    )
+     *                                )
+     *
+     * @param boolean $check     indicates whether the function should just check if the DBMS driver
+     *                             can perform the requested table alterations if the value is true or
+     *                             actually perform them otherwise.
+     * @access public
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     */
+    function alterTable($name, $changes, $check)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        foreach ($changes as $change_name => $change) {
+            switch ($change_name) {
+            case 'add':
+            case 'remove':
+            case 'change':
+            case 'name':
+            case 'rename':
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
+                    'change type "'.$change_name.'\" not yet supported', __FUNCTION__);
+            }
+        }
+
+        if ($check) {
+            return MDB2_OK;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+
+        if (!empty($changes['remove']) && is_array($changes['remove'])) {
+            foreach ($changes['remove'] as $field_name => $field) {
+                $field_name = $db->quoteIdentifier($field_name, true);
+                $query = 'DROP ' . $field_name;
+                $result = $db->exec("ALTER TABLE $name $query");
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+            }
+        }
+
+        if (!empty($changes['rename']) && is_array($changes['rename'])) {
+            foreach ($changes['rename'] as $field_name => $field) {
+                $field_name = $db->quoteIdentifier($field_name, true);
+                $result = $db->exec("ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name'], true));
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+            }
+        }
+
+        if (!empty($changes['add']) && is_array($changes['add'])) {
+            foreach ($changes['add'] as $field_name => $field) {
+                $query = 'ADD ' . $db->getDeclaration($field['type'], $field_name, $field);
+                $result = $db->exec("ALTER TABLE $name $query");
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+            }
+        }
+
+        if (!empty($changes['change']) && is_array($changes['change'])) {
+            foreach ($changes['change'] as $field_name => $field) {
+                $field_name = $db->quoteIdentifier($field_name, true);
+                if (!empty($field['definition']['type'])) {
+                    $server_info = $db->getServerVersion();
+                    if (PEAR::isError($server_info)) {
+                        return $server_info;
+                    }
+                    if (is_array($server_info) && $server_info['major'] < 8) {
+                        return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
+                            'changing column type for "'.$change_name.'\" requires PostgreSQL 8.0 or above', __FUNCTION__);
+                    }
+                    $db->loadModule('Datatype', null, true);
+                    $type = $db->datatype->getTypeDeclaration($field['definition']);
+                    $query = "ALTER $field_name TYPE $type USING CAST($field_name AS $type)";
+                    $result = $db->exec("ALTER TABLE $name $query");
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+                if (array_key_exists('default', $field['definition'])) {
+                    $query = "ALTER $field_name SET DEFAULT ".$db->quote($field['definition']['default'], $field['definition']['type']);
+                    $result = $db->exec("ALTER TABLE $name $query");
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+                if (array_key_exists('notnull', $field['definition'])) {
+                    $query = "ALTER $field_name ".($field['definition']['notnull'] ? 'SET' : 'DROP').' NOT NULL';
+                    $result = $db->exec("ALTER TABLE $name $query");
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+            }
+        }
+
+        if (!empty($changes['name'])) {
+            $change_name = $db->quoteIdentifier($changes['name'], true);
+            $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listDatabases()
+
+    /**
+     * list all databases
+     *
+     * @return mixed array of database names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listDatabases()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SELECT datname FROM pg_database';
+        $result2 = $db->standaloneQuery($query, array('text'), false);
+        if (!MDB2::isResultCommon($result2)) {
+            return $result2;
+        }
+
+        $result = $result2->fetchCol();
+        $result2->free();
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listUsers()
+
+    /**
+     * list all users
+     *
+     * @return mixed array of user names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listUsers()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SELECT usename FROM pg_user';
+        $result2 = $db->standaloneQuery($query, array('text'), false);
+        if (!MDB2::isResultCommon($result2)) {
+            return $result2;
+        }
+
+        $result = $result2->fetchCol();
+        $result2->free();
+        return $result;
+    }
+
+    // }}}
+    // {{{ listViews()
+
+    /**
+     * list all views in the current database
+     *
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listViews($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT viewname
+                    FROM pg_views
+                   WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
+                     AND viewname !~ '^pg_'";
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableViews()
+
+    /**
+     * list the views in the database that reference a given table
+     *
+     * @param string table for which all referenced views should be found
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableViews($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SELECT viewname FROM pg_views NATURAL JOIN pg_tables';
+        $query.= ' WHERE tablename ='.$db->quote($table, 'text');
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listFunctions()
+
+    /**
+     * list all functions in the current database
+     *
+     * @return mixed array of function names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listFunctions()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "
+            SELECT
+                proname
+            FROM
+                pg_proc pr,
+                pg_type tp
+            WHERE
+                tp.oid = pr.prorettype
+                AND pr.proisagg = FALSE
+                AND tp.typname <> 'trigger'
+                AND pr.pronamespace IN
+                    (SELECT oid FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')";
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableTriggers()
+
+    /**
+     * list all triggers in the database that reference a given table
+     *
+     * @param string table for which all referenced triggers should be found
+     * @return mixed array of trigger names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableTriggers($table = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SELECT trg.tgname AS trigger_name
+                    FROM pg_trigger trg,
+                         pg_class tbl
+                   WHERE trg.tgrelid = tbl.oid';
+        if (null !== $table) {
+            $table = $db->quote(strtoupper($table), 'text');
+            $query .= " AND UPPER(tbl.relname) = $table";
+        }
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTables()
+
+    /**
+     * list all tables in the current database
+     *
+     * @return mixed array of table names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTables($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        // gratuitously stolen from PEAR DB _getSpecialQuery in pgsql.php
+        $query = 'SELECT c.relname AS "Name"'
+            . ' FROM pg_class c, pg_user u'
+            . ' WHERE c.relowner = u.usesysid'
+            . " AND c.relkind = 'r'"
+            . ' AND NOT EXISTS'
+            . ' (SELECT 1 FROM pg_views'
+            . '  WHERE viewname = c.relname)'
+            . " AND c.relname !~ '^(pg_|sql_)'"
+            . ' UNION'
+            . ' SELECT c.relname AS "Name"'
+            . ' FROM pg_class c'
+            . " WHERE c.relkind = 'r'"
+            . ' AND NOT EXISTS'
+            . ' (SELECT 1 FROM pg_views'
+            . '  WHERE viewname = c.relname)'
+            . ' AND NOT EXISTS'
+            . ' (SELECT 1 FROM pg_user'
+            . '  WHERE usesysid = c.relowner)'
+            . " AND c.relname !~ '^pg_'";
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableFields()
+
+    /**
+     * list all fields in a table in the current database
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of field names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableFields($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table);
+
+        $table = $db->quoteIdentifier($table, true);
+        if (!empty($schema)) {
+            $table = $db->quoteIdentifier($schema, true) . '.' .$table;
+        }
+        $db->setLimit(1);
+        $result2 = $db->query("SELECT * FROM $table");
+        if (PEAR::isError($result2)) {
+            return $result2;
+        }
+        $result = $result2->getColumnNames();
+        $result2->free();
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return array_flip($result);
+    }
+
+    // }}}
+    // {{{ listTableIndexes()
+
+    /**
+     * list all indexes in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of index names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableIndexes($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table);
+
+        $table = $db->quote($table, 'text');
+        $subquery = "SELECT indexrelid
+                       FROM pg_index
+                  LEFT JOIN pg_class ON pg_class.oid = pg_index.indrelid
+                  LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
+                      WHERE pg_class.relname = $table
+                        AND indisunique != 't'
+                        AND indisprimary != 't'";
+        if (!empty($schema)) {
+            $subquery .= ' AND pg_namespace.nspname = '.$db->quote($schema, 'text');
+        }
+        $query = "SELECT relname FROM pg_class WHERE oid IN ($subquery)";
+        $indexes = $db->queryCol($query, 'text');
+        if (PEAR::isError($indexes)) {
+            return $indexes;
+        }
+
+        $result = array();
+        foreach ($indexes as $index) {
+            $index = $this->_fixIndexName($index);
+            if (!empty($index)) {
+                $result[$index] = true;
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ dropConstraint()
+
+    /**
+     * drop existing constraint
+     *
+     * @param string $table   name of table that should be used in method
+     * @param string $name    name of the constraint to be dropped
+     * @param string $primary hint if the constraint is primary
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropConstraint($table, $name, $primary = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        // is it an UNIQUE index?
+        $query = 'SELECT relname
+                    FROM pg_class
+                   WHERE oid IN (
+                         SELECT indexrelid
+                           FROM pg_index, pg_class
+                          WHERE pg_class.relname = '.$db->quote($table, 'text').'
+                            AND pg_class.oid = pg_index.indrelid
+                            AND indisunique = \'t\')
+                  EXCEPT
+                  SELECT conname
+                   FROM pg_constraint, pg_class
+                  WHERE pg_constraint.conrelid = pg_class.oid
+                    AND relname = '. $db->quote($table, 'text');
+        $unique = $db->queryCol($query, 'text');
+        if (PEAR::isError($unique) || empty($unique)) {
+            // not an UNIQUE index, maybe a CONSTRAINT
+            return parent::dropConstraint($table, $name, $primary);
+        }
+
+        if (in_array($name, $unique)) {
+            $result = $db->exec('DROP INDEX '.$db->quoteIdentifier($name, true));
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            return MDB2_OK;
+        }
+        $idxname = $db->getIndexName($name);
+        if (in_array($idxname, $unique)) {
+            $result = $db->exec('DROP INDEX '.$db->quoteIdentifier($idxname, true));
+            if (MDB2::isError($result)) {
+                return $result;
+            }
+            return MDB2_OK;
+        }
+        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+            $name . ' is not an existing constraint for table ' . $table, __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listTableConstraints()
+
+    /**
+     * list all constraints in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of constraint names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableConstraints($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table);
+
+        $table = $db->quote($table, 'text');
+        $query = 'SELECT conname
+                    FROM pg_constraint
+               LEFT JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
+               LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
+                   WHERE relname = ' .$table;
+        if (!empty($schema)) {
+            $query .= ' AND pg_namespace.nspname = ' . $db->quote($schema, 'text');
+        }
+        $query .= '
+                   UNION DISTINCT
+                  SELECT relname
+                    FROM pg_class
+                   WHERE oid IN (
+                         SELECT indexrelid
+                           FROM pg_index
+                      LEFT JOIN pg_class ON pg_class.oid = pg_index.indrelid
+                      LEFT JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
+                          WHERE pg_class.relname = '.$table.'
+                            AND indisunique = \'t\'';
+        if (!empty($schema)) {
+            $query .= ' AND pg_namespace.nspname = ' . $db->quote($schema, 'text');
+        }
+        $query .= ')';
+        $constraints = $db->queryCol($query);
+        if (PEAR::isError($constraints)) {
+            return $constraints;
+        }
+
+        $result = array();
+        foreach ($constraints as $constraint) {
+            $constraint = $this->_fixIndexName($constraint);
+            if (!empty($constraint)) {
+                $result[$constraint] = true;
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
+            && $db->options['field_case'] == CASE_LOWER
+        ) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ createSequence()
+
+    /**
+     * create sequence
+     *
+     * @param string $seq_name name of the sequence to be created
+     * @param string $start start value of the sequence; default is 1
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createSequence($seq_name, $start = 1)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
+        $result = $db->exec("CREATE SEQUENCE $sequence_name INCREMENT 1".
+            ($start < 1 ? " MINVALUE $start" : '')." START $start");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropSequence()
+
+    /**
+     * drop existing sequence
+     *
+     * @param string $seq_name name of the sequence to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropSequence($seq_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
+        $result = $db->exec("DROP SEQUENCE $sequence_name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listSequences()
+
+    /**
+     * list all sequences in the current database
+     *
+     * @return mixed array of sequence names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listSequences($database = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT relname FROM pg_class WHERE relkind = 'S' AND relnamespace IN";
+        $query.= "(SELECT oid FROM pg_namespace WHERE nspname NOT LIKE 'pg_%' AND nspname != 'information_schema')";
+        $table_names = $db->queryCol($query);
+        if (PEAR::isError($table_names)) {
+            return $table_names;
+        }
+        $result = array();
+        foreach ($table_names as $table_name) {
+            $result[] = $this->_fixSequenceName($table_name);
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+}
+?>
diff --git a/3rdparty/MDB2/Driver/Manager/sqlite.php b/3rdparty/MDB2/Driver/Manager/sqlite.php
index c4c30c9ddad3b4a0d5b07e4d1440825eaf435088..1e7efe3e743dc7cbced870312b04ebf35d9a91df 100644
--- a/3rdparty/MDB2/Driver/Manager/sqlite.php
+++ b/3rdparty/MDB2/Driver/Manager/sqlite.php
@@ -1,1362 +1,1390 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith, Lorenzo Alberton                       |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Authors: Lukas Smith <smith@pooteeweet.org>                          |
-// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
-// +----------------------------------------------------------------------+
-//
-// $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Manager/Common.php';
-
-/**
- * MDB2 SQLite driver for the management modules
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- * @author  Lorenzo Alberton <l.alberton@quipo.it>
- */
-class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
-{
-    // {{{ createDatabase()
-
-    /**
-     * create a new database
-     *
-     * @param string $name    name of the database that should be created
-     * @param array  $options array with charset info
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createDatabase($name, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $database_file = $db->_getDatabaseFile($name);
-        if (file_exists($database_file)) {
-            return $db->raiseError(MDB2_ERROR_ALREADY_EXISTS, null, null,
-                'database already exists', __FUNCTION__);
-        }
-        $php_errormsg = '';
-        $handle = @sqlite_open($database_file, $db->dsn['mode'], $php_errormsg);
-        if (!$handle) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
-                (isset($php_errormsg) ? $php_errormsg : 'could not create the database file'), __FUNCTION__);
-        }
-        if (!empty($options['charset'])) {
-            $query = 'PRAGMA encoding = ' . $db->quote($options['charset'], 'text');
-            @sqlite_query($query, $handle);
-        }
-        @sqlite_close($handle);
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ dropDatabase()
-
-    /**
-     * drop an existing database
-     *
-     * @param string $name name of the database that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropDatabase($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $database_file = $db->_getDatabaseFile($name);
-        if (!@file_exists($database_file)) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_DROP, null, null,
-                'database does not exist', __FUNCTION__);
-        }
-        $result = @unlink($database_file);
-        if (!$result) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_DROP, null, null,
-                (isset($php_errormsg) ? $php_errormsg : 'could not remove the database file'), __FUNCTION__);
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ _getAdvancedFKOptions()
-
-    /**
-     * Return the FOREIGN KEY query section dealing with non-standard options
-     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
-     *
-     * @param array $definition
-     * @return string
-     * @access protected
-     */
-    function _getAdvancedFKOptions($definition)
-    {
-        $query = '';
-        if (!empty($definition['match'])) {
-            $query .= ' MATCH '.$definition['match'];
-        }
-        if (!empty($definition['onupdate']) && (strtoupper($definition['onupdate']) != 'NO ACTION')) {
-            $query .= ' ON UPDATE '.$definition['onupdate'];
-        }
-        if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) {
-            $query .= ' ON DELETE '.$definition['ondelete'];
-        }
-        if (!empty($definition['deferrable'])) {
-            $query .= ' DEFERRABLE';
-        } else {
-            $query .= ' NOT DEFERRABLE';
-        }
-        if (!empty($definition['initiallydeferred'])) {
-            $query .= ' INITIALLY DEFERRED';
-        } else {
-            $query .= ' INITIALLY IMMEDIATE';
-        }
-        return $query;
-    }
-
-    // }}}
-    // {{{ _getCreateTableQuery()
-
-    /**
-     * Create a basic SQL query for a new table creation
-     * @param string $name   Name of the database that should be created
-     * @param array $fields  Associative array that contains the definition of each field of the new table
-     * @param array $options  An associative array of table options
-     * @return mixed string (the SQL query) on success, a MDB2 error on failure
-     * @see createTable()
-     */
-    function _getCreateTableQuery($name, $fields, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!$name) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
-                'no valid table name specified', __FUNCTION__);
-        }
-        if (empty($fields)) {
-            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
-                'no fields specified for table "'.$name.'"', __FUNCTION__);
-        }
-        $query_fields = $this->getFieldDeclarationList($fields);
-        if (PEAR::isError($query_fields)) {
-            return $query_fields;
-        }
-        if (!empty($options['primary'])) {
-            $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')';
-        }
-        if (!empty($options['foreign_keys'])) {
-            foreach ($options['foreign_keys'] as $fkname => $fkdef) {
-                if (empty($fkdef)) {
-                    continue;
-                }
-                $query_fields.= ', CONSTRAINT '.$fkname.' FOREIGN KEY ('.implode(', ', array_keys($fkdef['fields'])).')';
-                $query_fields.= ' REFERENCES '.$fkdef['references']['table'].' ('.implode(', ', array_keys($fkdef['references']['fields'])).')';
-                $query_fields.= $this->_getAdvancedFKOptions($fkdef);
-            }
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        $result = 'CREATE ';
-        if (!empty($options['temporary'])) {
-            $result .= $this->_getTemporaryTableQuery();
-        }
-        $result .= " TABLE $name ($query_fields)";
-        return $result;
-    }
-
-    // }}}
-    // {{{ createTable()
-
-    /**
-     * create a new table
-     *
-     * @param string $name    Name of the database that should be created
-     * @param array  $fields  Associative array that contains the definition
-     *                        of each field of the new table
-     * @param array  $options An associative array of table options
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createTable($name, $fields, $options = array())
-    {
-        $result = parent::createTable($name, $fields, $options);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        // create triggers to enforce FOREIGN KEY constraints
-        if (!empty($options['foreign_keys'])) {
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            foreach ($options['foreign_keys'] as $fkname => $fkdef) {
-                if (empty($fkdef)) {
-                    continue;
-                }
-                //set actions to default if not set
-                $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']);
-                $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']);
-
-                $trigger_names = array(
-                    'insert'    => $fkname.'_insert_trg',
-                    'update'    => $fkname.'_update_trg',
-                    'pk_update' => $fkname.'_pk_update_trg',
-                    'pk_delete' => $fkname.'_pk_delete_trg',
-                );
-                
-                //create the [insert|update] triggers on the FK table
-                $table_fields = array_keys($fkdef['fields']);
-                $referenced_fields = array_keys($fkdef['references']['fields']);
-                $query = 'CREATE TRIGGER %s BEFORE %s ON '.$name
-                        .' FOR EACH ROW BEGIN'
-                        .' SELECT RAISE(ROLLBACK, \'%s on table "'.$name.'" violates FOREIGN KEY constraint "'.$fkname.'"\')'
-                        .' WHERE  (SELECT ';
-                $aliased_fields = array();
-                foreach ($referenced_fields as $field) {
-                    $aliased_fields[] = $fkdef['references']['table'] .'.'.$field .' AS '.$field;
-                }
-                $query .= implode(',', $aliased_fields)
-                       .' FROM '.$fkdef['references']['table']
-                       .' WHERE ';
-                $conditions = array();
-                for ($i=0; $i<count($table_fields); $i++) {
-                    $conditions[] = $referenced_fields[$i] .' = NEW.'.$table_fields[$i];
-                }
-                $query .= implode(' AND ', $conditions).') IS NULL; END;';
-                $result = $db->exec(sprintf($query, $trigger_names['insert'], 'INSERT', 'insert'));
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-
-                $result = $db->exec(sprintf($query, $trigger_names['update'], 'UPDATE', 'update'));
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-                
-                //create the ON [UPDATE|DELETE] triggers on the primary table
-                $restrict_action = 'SELECT RAISE(ROLLBACK, \'%s on table "'.$name.'" violates FOREIGN KEY constraint "'.$fkname.'"\')'
-                                  .' WHERE  (SELECT ';
-                $aliased_fields = array();
-                foreach ($table_fields as $field) {
-                    $aliased_fields[] = $name .'.'.$field .' AS '.$field;
-                }
-                $restrict_action .= implode(',', $aliased_fields)
-                       .' FROM '.$name
-                       .' WHERE ';
-                $conditions  = array();
-                $new_values  = array();
-                $null_values = array();
-                for ($i=0; $i<count($table_fields); $i++) {
-                    $conditions[]  = $table_fields[$i] .' = OLD.'.$referenced_fields[$i];
-                    $new_values[]  = $table_fields[$i] .' = NEW.'.$referenced_fields[$i];
-                    $null_values[] = $table_fields[$i] .' = NULL';
-                }
-                $conditions2 = array();
-                for ($i=0; $i<count($referenced_fields); $i++) {
-                    $conditions2[]  = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i];
-                }
-                $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL'
-                                 .' AND (' .implode(' OR ', $conditions2) .')';
-
-                $cascade_action_update = 'UPDATE '.$name.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions);
-                $cascade_action_delete = 'DELETE FROM '.$name.' WHERE '.implode(' AND ', $conditions);
-                $setnull_action        = 'UPDATE '.$name.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions);
-
-                if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) {
-                    $db->loadModule('Reverse', null, true);
-                    $default_values = array();
-                    foreach ($table_fields as $table_field) {
-                        $field_definition = $db->reverse->getTableFieldDefinition($name, $field);
-                        if (PEAR::isError($field_definition)) {
-                            return $field_definition;
-                        }
-                        $default_values[] = $table_field .' = '. $field_definition[0]['default'];
-                    }
-                    $setdefault_action = 'UPDATE '.$name.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions);
-                }
-
-                $query = 'CREATE TRIGGER %s'
-                        .' %s ON '.$fkdef['references']['table']
-                        .' FOR EACH ROW BEGIN ';
-
-                if ('CASCADE' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'AFTER UPDATE',  'update') . $cascade_action_update. '; END;';
-                } elseif ('SET NULL' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setnull_action. '; END;';
-                } elseif ('SET DEFAULT' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action. '; END;';
-                } elseif ('NO ACTION' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'AFTER UPDATE', 'update') . '; END;';
-                } elseif ('RESTRICT' == $fkdef['onupdate']) {
-                    $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . '; END;';
-                }
-                if ('CASCADE' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'AFTER DELETE',  'delete') . $cascade_action_delete. '; END;';
-                } elseif ('SET NULL' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action. '; END;';
-                } elseif ('SET DEFAULT' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action. '; END;';
-                } elseif ('NO ACTION' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete')  . '; END;';
-                } elseif ('RESTRICT' == $fkdef['ondelete']) {
-                    $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . '; END;';
-                }
-
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-                $result = $db->exec($sql_delete);
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-                $result = $db->exec($sql_update);
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-        }
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ dropTable()
-
-    /**
-     * drop an existing table
-     *
-     * @param string $name name of the table that should be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropTable($name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        
-        //delete the triggers associated to existing FK constraints
-        $constraints = $this->listTableConstraints($name);
-        if (!PEAR::isError($constraints) && !empty($constraints)) {
-            $db->loadModule('Reverse', null, true);
-            foreach ($constraints as $constraint) {
-                $definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
-                if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
-                    $result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']);
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-            }
-        }
-
-        $name = $db->quoteIdentifier($name, true);
-        return $db->exec("DROP TABLE $name");
-    }
-
-    // }}}
-    // {{{ vacuum()
-
-    /**
-     * Optimize (vacuum) all the tables in the db (or only the specified table)
-     * and optionally run ANALYZE.
-     *
-     * @param string $table table name (all the tables if empty)
-     * @param array  $options an array with driver-specific options:
-     *               - timeout [int] (in seconds) [mssql-only]
-     *               - analyze [boolean] [pgsql and mysql]
-     *               - full [boolean] [pgsql-only]
-     *               - freeze [boolean] [pgsql-only]
-     *
-     * @return mixed MDB2_OK success, a MDB2 error on failure
-     * @access public
-     */
-    function vacuum($table = null, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'VACUUM';
-        if (!empty($table)) {
-            $query .= ' '.$db->quoteIdentifier($table, true);
-        }
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ alterTable()
-
-    /**
-     * alter an existing table
-     *
-     * @param string $name         name of the table that is intended to be changed.
-     * @param array $changes     associative array that contains the details of each type
-     *                             of change that is intended to be performed. The types of
-     *                             changes that are currently supported are defined as follows:
-     *
-     *                             name
-     *
-     *                                New name for the table.
-     *
-     *                            add
-     *
-     *                                Associative array with the names of fields to be added as
-     *                                 indexes of the array. The value of each entry of the array
-     *                                 should be set to another associative array with the properties
-     *                                 of the fields to be added. The properties of the fields should
-     *                                 be the same as defined by the MDB2 parser.
-     *
-     *
-     *                            remove
-     *
-     *                                Associative array with the names of fields to be removed as indexes
-     *                                 of the array. Currently the values assigned to each entry are ignored.
-     *                                 An empty array should be used for future compatibility.
-     *
-     *                            rename
-     *
-     *                                Associative array with the names of fields to be renamed as indexes
-     *                                 of the array. The value of each entry of the array should be set to
-     *                                 another associative array with the entry named name with the new
-     *                                 field name and the entry named Declaration that is expected to contain
-     *                                 the portion of the field declaration already in DBMS specific SQL code
-     *                                 as it is used in the CREATE TABLE statement.
-     *
-     *                            change
-     *
-     *                                Associative array with the names of the fields to be changed as indexes
-     *                                 of the array. Keep in mind that if it is intended to change either the
-     *                                 name of a field and any other properties, the change array entries
-     *                                 should have the new names of the fields as array indexes.
-     *
-     *                                The value of each entry of the array should be set to another associative
-     *                                 array with the properties of the fields to that are meant to be changed as
-     *                                 array entries. These entries should be assigned to the new values of the
-     *                                 respective properties. The properties of the fields should be the same
-     *                                 as defined by the MDB2 parser.
-     *
-     *                            Example
-     *                                array(
-     *                                    'name' => 'userlist',
-     *                                    'add' => array(
-     *                                        'quota' => array(
-     *                                            'type' => 'integer',
-     *                                            'unsigned' => 1
-     *                                        )
-     *                                    ),
-     *                                    'remove' => array(
-     *                                        'file_limit' => array(),
-     *                                        'time_limit' => array()
-     *                                    ),
-     *                                    'change' => array(
-     *                                        'name' => array(
-     *                                            'length' => '20',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 20,
-     *                                            ),
-     *                                        )
-     *                                    ),
-     *                                    'rename' => array(
-     *                                        'sex' => array(
-     *                                            'name' => 'gender',
-     *                                            'definition' => array(
-     *                                                'type' => 'text',
-     *                                                'length' => 1,
-     *                                                'default' => 'M',
-     *                                            ),
-     *                                        )
-     *                                    )
-     *                                )
-     *
-     * @param boolean $check     indicates whether the function should just check if the DBMS driver
-     *                             can perform the requested table alterations if the value is true or
-     *                             actually perform them otherwise.
-     * @access public
-     *
-      * @return mixed MDB2_OK on success, a MDB2 error on failure
-     */
-    function alterTable($name, $changes, $check, $options = array())
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        foreach ($changes as $change_name => $change) {
-            switch ($change_name) {
-            case 'add':
-            case 'remove':
-            case 'change':
-            case 'name':
-            case 'rename':
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
-                    'change type "'.$change_name.'" not yet supported', __FUNCTION__);
-            }
-        }
-
-        if ($check) {
-            return MDB2_OK;
-        }
-
-        $db->loadModule('Reverse', null, true);
-
-        // actually sqlite 2.x supports no ALTER TABLE at all .. so we emulate it
-        $fields = $db->manager->listTableFields($name);
-        if (PEAR::isError($fields)) {
-            return $fields;
-        }
-
-        $fields = array_flip($fields);
-        foreach ($fields as $field => $value) {
-            $definition = $db->reverse->getTableFieldDefinition($name, $field);
-            if (PEAR::isError($definition)) {
-                return $definition;
-            }
-            $fields[$field] = $definition[0];
-        }
-
-        $indexes = $db->manager->listTableIndexes($name);
-        if (PEAR::isError($indexes)) {
-            return $indexes;
-        }
-
-        $indexes = array_flip($indexes);
-        foreach ($indexes as $index => $value) {
-            $definition = $db->reverse->getTableIndexDefinition($name, $index);
-            if (PEAR::isError($definition)) {
-                return $definition;
-            }
-            $indexes[$index] = $definition;
-        }
-
-        $constraints = $db->manager->listTableConstraints($name);
-        if (PEAR::isError($constraints)) {
-            return $constraints;
-        }
-
-        if (!array_key_exists('foreign_keys', $options)) {
-            $options['foreign_keys'] = array();
-        }
-        $constraints = array_flip($constraints);
-        foreach ($constraints as $constraint => $value) {
-            if (!empty($definition['primary'])) {
-                if (!array_key_exists('primary', $options)) {
-                    $options['primary'] = $definition['fields'];
-                    //remove from the $constraint array, it's already handled by createTable()
-                    unset($constraints[$constraint]);
-                }
-            } else {
-                $c_definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
-                if (PEAR::isError($c_definition)) {
-                    return $c_definition;
-                }
-                if (!empty($c_definition['foreign'])) {
-                    if (!array_key_exists($constraint, $options['foreign_keys'])) {
-                        $options['foreign_keys'][$constraint] = $c_definition;
-                    }
-                    //remove from the $constraint array, it's already handled by createTable()
-                    unset($constraints[$constraint]);
-                } else {
-                    $constraints[$constraint] = $c_definition;
-                }
-            }
-        }
-
-        $name_new = $name;
-        $create_order = $select_fields = array_keys($fields);
-        foreach ($changes as $change_name => $change) {
-            switch ($change_name) {
-            case 'add':
-                foreach ($change as $field_name => $field) {
-                    $fields[$field_name] = $field;
-                    $create_order[] = $field_name;
-                }
-                break;
-            case 'remove':
-                foreach ($change as $field_name => $field) {
-                    unset($fields[$field_name]);
-                    $select_fields = array_diff($select_fields, array($field_name));
-                    $create_order = array_diff($create_order, array($field_name));
-                }
-                break;
-            case 'change':
-                foreach ($change as $field_name => $field) {
-                    $fields[$field_name] = $field['definition'];
-                }
-                break;
-            case 'name':
-                $name_new = $change;
-                break;
-            case 'rename':
-                foreach ($change as $field_name => $field) {
-                    unset($fields[$field_name]);
-                    $fields[$field['name']] = $field['definition'];
-                    $create_order[array_search($field_name, $create_order)] = $field['name'];
-                }
-                break;
-            default:
-                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
-                    'change type "'.$change_name.'" not yet supported', __FUNCTION__);
-            }
-        }
-
-        $data = null;
-        if (!empty($select_fields)) {
-            $query = 'SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier($name, true);
-            $data = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED);
-        }
-
-        $result = $this->dropTable($name);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        $result = $this->createTable($name_new, $fields, $options);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        foreach ($indexes as $index => $definition) {
-            $this->createIndex($name_new, $index, $definition);
-        }
-
-        foreach ($constraints as $constraint => $definition) {
-            $this->createConstraint($name_new, $constraint, $definition);
-        }
-
-        if (!empty($select_fields) && !empty($data)) {
-            $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true);
-            $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')';
-            $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')';
-            $stmt = $db->prepare($query, null, MDB2_PREPARE_MANIP);
-            if (PEAR::isError($stmt)) {
-                return $stmt;
-            }
-            foreach ($data as $row) {
-                $result = $stmt->execute($row);
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ listDatabases()
-
-    /**
-     * list all databases
-     *
-     * @return mixed array of database names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listDatabases()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'list databases is not supported', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listUsers()
-
-    /**
-     * list all users
-     *
-     * @return mixed array of user names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listUsers()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'list databases is not supported', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ listViews()
-
-    /**
-     * list all views in the current database
-     *
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listViews()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name FROM sqlite_master WHERE type='view' AND sql NOT NULL";
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableViews()
-
-    /**
-     * list the views in the database that reference a given table
-     *
-     * @param string table for which all referenced views should be found
-     * @return mixed array of view names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableViews($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name, sql FROM sqlite_master WHERE type='view' AND sql NOT NULL";
-        $views = $db->queryAll($query, array('text', 'text'), MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($views)) {
-            return $views;
-        }
-        $result = array();
-        foreach ($views as $row) {
-            if (preg_match("/^create view .* \bfrom\b\s+\b{$table}\b /i", $row['sql'])) {
-                if (!empty($row['name'])) {
-                    $result[$row['name']] = true;
-                }
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ listTables()
-
-    /**
-     * list all tables in the current database
-     *
-     * @return mixed array of table names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTables()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name";
-        $table_names = $db->queryCol($query);
-        if (PEAR::isError($table_names)) {
-            return $table_names;
-        }
-        $result = array();
-        foreach ($table_names as $table_name) {
-            if (!$this->_fixSequenceName($table_name, true)) {
-                $result[] = $table_name;
-            }
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ listTableFields()
-
-    /**
-     * list all fields in a table in the current database
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of field names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableFields($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $result = $db->loadModule('Reverse', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text');
-        } else {
-            $query.= 'name='.$db->quote($table, 'text');
-        }
-        $sql = $db->queryOne($query);
-        if (PEAR::isError($sql)) {
-            return $sql;
-        }
-        $columns = $db->reverse->_getTableColumns($sql);
-        $fields = array();
-        foreach ($columns as $column) {
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($db->options['field_case'] == CASE_LOWER) {
-                    $column['name'] = strtolower($column['name']);
-                } else {
-                    $column['name'] = strtoupper($column['name']);
-                }
-            } else {
-                $column = array_change_key_case($column, $db->options['field_case']);
-            }
-            $fields[] = $column['name'];
-        }
-        return $fields;
-    }
-
-    // }}}
-    // {{{ listTableTriggers()
-
-    /**
-     * list all triggers in the database that reference a given table
-     *
-     * @param string table for which all referenced triggers should be found
-     * @return mixed array of trigger names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableTriggers($table = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name FROM sqlite_master WHERE type='trigger' AND sql NOT NULL";
-        if (null !== $table) {
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                $query.= ' AND LOWER(tbl_name)='.$db->quote(strtolower($table), 'text');
-            } else {
-                $query.= ' AND tbl_name='.$db->quote($table, 'text');
-            }
-        }
-        $result = $db->queryCol($query);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ createIndex()
-
-    /**
-     * Get the stucture of a field into an array
-     *
-     * @param string    $table         name of the table on which the index is to be created
-     * @param string    $name         name of the index to be created
-     * @param array     $definition        associative array that defines properties of the index to be created.
-     *                                 Currently, only one property named FIELDS is supported. This property
-     *                                 is also an associative with the names of the index fields as array
-     *                                 indexes. Each entry of this array is set to another type of associative
-     *                                 array that specifies properties of the index that are specific to
-     *                                 each field.
-     *
-     *                                Currently, only the sorting property is supported. It should be used
-     *                                 to define the sorting direction of the index. It may be set to either
-     *                                 ascending or descending.
-     *
-     *                                Not all DBMS support index sorting direction configuration. The DBMS
-     *                                 drivers of those that do not support it ignore this property. Use the
-     *                                 function support() to determine whether the DBMS driver can manage indexes.
-
-     *                                 Example
-     *                                    array(
-     *                                        'fields' => array(
-     *                                            'user_name' => array(
-     *                                                'sorting' => 'ascending'
-     *                                            ),
-     *                                            'last_login' => array()
-     *                                        )
-     *                                    )
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createIndex($table, $name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name  = $db->getIndexName($name);
-        $query = "CREATE INDEX $name ON $table";
-        $fields = array();
-        foreach ($definition['fields'] as $field_name => $field) {
-            $field_string = $field_name;
-            if (!empty($field['sorting'])) {
-                switch ($field['sorting']) {
-                case 'ascending':
-                    $field_string.= ' ASC';
-                    break;
-                case 'descending':
-                    $field_string.= ' DESC';
-                    break;
-                }
-            }
-            $fields[] = $field_string;
-        }
-        $query .= ' ('.implode(', ', $fields) . ')';
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ dropIndex()
-
-    /**
-     * drop existing index
-     *
-     * @param string    $table         name of table that should be used in method
-     * @param string    $name         name of the index to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropIndex($table, $name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $name = $db->getIndexName($name);
-        return $db->exec("DROP INDEX $name");
-    }
-
-    // }}}
-    // {{{ listTableIndexes()
-
-    /**
-     * list all indexes in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of index names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableIndexes($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quote($table, 'text');
-        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(tbl_name)='.strtolower($table);
-        } else {
-            $query.= "tbl_name=$table";
-        }
-        $query.= " AND sql NOT NULL ORDER BY name";
-        $indexes = $db->queryCol($query, 'text');
-        if (PEAR::isError($indexes)) {
-            return $indexes;
-        }
-
-        $result = array();
-        foreach ($indexes as $sql) {
-            if (preg_match("/^create index ([^ ]+) on /i", $sql, $tmp)) {
-                $index = $this->_fixIndexName($tmp[1]);
-                if (!empty($index)) {
-                    $result[$index] = true;
-                }
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ createConstraint()
-
-    /**
-     * create a constraint on a table
-     *
-     * @param string $table      name of the table on which the constraint is to be created
-     * @param string $name       name of the constraint to be created
-     * @param array  $definition associative array that defines properties of the constraint to be created.
-     *                           Currently, only one property named FIELDS is supported. This property
-     *                           is also an associative with the names of the constraint fields as array
-     *                           constraints. Each entry of this array is set to another type of associative
-     *                           array that specifies properties of the constraint that are specific to
-     *                           each field.
-     *
-     *                           Example
-     *                              array(
-     *                                  'fields' => array(
-     *                                      'user_name' => array(),
-     *                                      'last_login' => array()
-     *                                  )
-     *                              )
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createConstraint($table, $name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!empty($definition['primary'])) {
-            return $db->manager->alterTable($table, array(), false, array('primary' => $definition['fields']));
-        }
-        
-        if (!empty($definition['foreign'])) {
-            return $db->manager->alterTable($table, array(), false, array('foreign_keys' => array($name => $definition)));
-        }
-
-        $table = $db->quoteIdentifier($table, true);
-        $name  = $db->getIndexName($name);
-        $query = "CREATE UNIQUE INDEX $name ON $table";
-        $fields = array();
-        foreach ($definition['fields'] as $field_name => $field) {
-            $field_string = $field_name;
-            if (!empty($field['sorting'])) {
-                switch ($field['sorting']) {
-                case 'ascending':
-                    $field_string.= ' ASC';
-                    break;
-                case 'descending':
-                    $field_string.= ' DESC';
-                    break;
-                }
-            }
-            $fields[] = $field_string;
-        }
-        $query .= ' ('.implode(', ', $fields) . ')';
-        return $db->exec($query);
-    }
-
-    // }}}
-    // {{{ dropConstraint()
-
-    /**
-     * drop existing constraint
-     *
-     * @param string    $table        name of table that should be used in method
-     * @param string    $name         name of the constraint to be dropped
-     * @param string    $primary      hint if the constraint is primary
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropConstraint($table, $name, $primary = false)
-    {
-        if ($primary || $name == 'PRIMARY') {
-            return $this->alterTable($table, array(), false, array('primary' => null));
-        }
-
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        //is it a FK constraint? If so, also delete the associated triggers
-        $db->loadModule('Reverse', null, true);
-        $definition = $db->reverse->getTableConstraintDefinition($table, $name);
-        if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
-            //first drop the FK enforcing triggers
-            $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            //then drop the constraint itself
-            return $this->alterTable($table, array(), false, array('foreign_keys' => array($name => null)));
-        }
-
-        $name = $db->getIndexName($name);
-        return $db->exec("DROP INDEX $name");
-    }
-
-    // }}}
-    // {{{ _dropFKTriggers()
-    
-    /**
-     * Drop the triggers created to enforce the FOREIGN KEY constraint on the table
-     *
-     * @param string $table  table name
-     * @param string $fkname FOREIGN KEY constraint name
-     * @param string $referenced_table  referenced table name
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access private
-     */
-    function _dropFKTriggers($table, $fkname, $referenced_table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $triggers  = $this->listTableTriggers($table);
-        $triggers2 = $this->listTableTriggers($referenced_table);
-        if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) {
-            $triggers = array_merge($triggers, $triggers2);
-            $pattern = '/^'.$fkname.'(_pk)?_(insert|update|delete)_trg$/i';
-            foreach ($triggers as $trigger) {
-                if (preg_match($pattern, $trigger)) {
-                    $result = $db->exec('DROP TRIGGER '.$trigger);
-                    if (PEAR::isError($result)) {
-                        return $result;
-                    }
-                }
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ listTableConstraints()
-
-    /**
-     * list all constraints in a table
-     *
-     * @param string $table name of table that should be used in method
-     * @return mixed array of constraint names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listTableConstraints($table)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $table = $db->quote($table, 'text');
-        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(tbl_name)='.strtolower($table);
-        } else {
-            $query.= "tbl_name=$table";
-        }
-        $query.= " AND sql NOT NULL ORDER BY name";
-        $indexes = $db->queryCol($query, 'text');
-        if (PEAR::isError($indexes)) {
-            return $indexes;
-        }
-
-        $result = array();
-        foreach ($indexes as $sql) {
-            if (preg_match("/^create unique index ([^ ]+) on /i", $sql, $tmp)) {
-                $index = $this->_fixIndexName($tmp[1]);
-                if (!empty($index)) {
-                    $result[$index] = true;
-                }
-            }
-        }
-        
-        // also search in table definition for PRIMARY KEYs...
-        $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(name)='.strtolower($table);
-        } else {
-            $query.= "name=$table";
-        }
-        $query.= " AND sql NOT NULL ORDER BY name";
-        $table_def = $db->queryOne($query, 'text');
-        if (PEAR::isError($table_def)) {
-            return $table_def;
-        }
-        if (preg_match("/\bPRIMARY\s+KEY\b/i", $table_def, $tmp)) {
-            $result['primary'] = true;
-        }
-
-        // ...and for FOREIGN KEYs
-        if (preg_match_all("/\bCONSTRAINT\b\s+([^\s]+)\s+\bFOREIGN\s+KEY/imsx", $table_def, $tmp)) {
-            foreach ($tmp[1] as $fk) {
-                $result[$fk] = true;
-            }
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_change_key_case($result, $db->options['field_case']);
-        }
-        return array_keys($result);
-    }
-
-    // }}}
-    // {{{ createSequence()
-
-    /**
-     * create sequence
-     *
-     * @param string    $seq_name     name of the sequence to be created
-     * @param string    $start         start value of the sequence; default is 1
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function createSequence($seq_name, $start = 1)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
-        $seqcol_name = $db->quoteIdentifier($db->options['seqcol_name'], true);
-        $query = "CREATE TABLE $sequence_name ($seqcol_name INTEGER PRIMARY KEY DEFAULT 0 NOT NULL)";
-        $res = $db->exec($query);
-        if (PEAR::isError($res)) {
-            return $res;
-        }
-        if ($start == 1) {
-            return MDB2_OK;
-        }
-        $res = $db->exec("INSERT INTO $sequence_name ($seqcol_name) VALUES (".($start-1).')');
-        if (!PEAR::isError($res)) {
-            return MDB2_OK;
-        }
-        // Handle error
-        $result = $db->exec("DROP TABLE $sequence_name");
-        if (PEAR::isError($result)) {
-            return $db->raiseError($result, null, null,
-                'could not drop inconsistent sequence table', __FUNCTION__);
-        }
-        return $db->raiseError($res, null, null,
-            'could not create sequence table', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ dropSequence()
-
-    /**
-     * drop existing sequence
-     *
-     * @param string    $seq_name     name of the sequence to be dropped
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function dropSequence($seq_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
-        return $db->exec("DROP TABLE $sequence_name");
-    }
-
-    // }}}
-    // {{{ listSequences()
-
-    /**
-     * list all sequences in the current database
-     *
-     * @return mixed array of sequence names on success, a MDB2 error on failure
-     * @access public
-     */
-    function listSequences()
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name";
-        $table_names = $db->queryCol($query);
-        if (PEAR::isError($table_names)) {
-            return $table_names;
-        }
-        $result = array();
-        foreach ($table_names as $table_name) {
-            if ($sqn = $this->_fixSequenceName($table_name, true)) {
-                $result[] = $sqn;
-            }
-        }
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
-        }
-        return $result;
-    }
-
-    // }}}
-}
-?>
\ No newline at end of file
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith, Lorenzo Alberton                       |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Authors: Lukas Smith <smith@pooteeweet.org>                          |
+// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Manager/Common.php';
+
+/**
+ * MDB2 SQLite driver for the management modules
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ * @author  Lorenzo Alberton <l.alberton@quipo.it>
+ */
+class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
+{
+    // {{{ createDatabase()
+
+    /**
+     * create a new database
+     *
+     * @param string $name    name of the database that should be created
+     * @param array  $options array with charset info
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createDatabase($name, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $database_file = $db->_getDatabaseFile($name);
+        if (file_exists($database_file)) {
+            return $db->raiseError(MDB2_ERROR_ALREADY_EXISTS, null, null,
+                'database already exists', __FUNCTION__);
+        }
+        $php_errormsg = '';
+        $handle = @sqlite_open($database_file, $db->dsn['mode'], $php_errormsg);
+        if (!$handle) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
+                (isset($php_errormsg) ? $php_errormsg : 'could not create the database file'), __FUNCTION__);
+        }
+        if (!empty($options['charset'])) {
+            $query = 'PRAGMA encoding = ' . $db->quote($options['charset'], 'text');
+            @sqlite_query($query, $handle);
+        }
+        @sqlite_close($handle);
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropDatabase()
+
+    /**
+     * drop an existing database
+     *
+     * @param string $name name of the database that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropDatabase($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $database_file = $db->_getDatabaseFile($name);
+        if (!@file_exists($database_file)) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_DROP, null, null,
+                'database does not exist', __FUNCTION__);
+        }
+        $result = @unlink($database_file);
+        if (!$result) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_DROP, null, null,
+                (isset($php_errormsg) ? $php_errormsg : 'could not remove the database file'), __FUNCTION__);
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ _getAdvancedFKOptions()
+
+    /**
+     * Return the FOREIGN KEY query section dealing with non-standard options
+     * as MATCH, INITIALLY DEFERRED, ON UPDATE, ...
+     *
+     * @param array $definition
+     * @return string
+     * @access protected
+     */
+    function _getAdvancedFKOptions($definition)
+    {
+        $query = '';
+        if (!empty($definition['match'])) {
+            $query .= ' MATCH '.$definition['match'];
+        }
+        if (!empty($definition['onupdate']) && (strtoupper($definition['onupdate']) != 'NO ACTION')) {
+            $query .= ' ON UPDATE '.$definition['onupdate'];
+        }
+        if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) {
+            $query .= ' ON DELETE '.$definition['ondelete'];
+        }
+        if (!empty($definition['deferrable'])) {
+            $query .= ' DEFERRABLE';
+        } else {
+            $query .= ' NOT DEFERRABLE';
+        }
+        if (!empty($definition['initiallydeferred'])) {
+            $query .= ' INITIALLY DEFERRED';
+        } else {
+            $query .= ' INITIALLY IMMEDIATE';
+        }
+        return $query;
+    }
+
+    // }}}
+    // {{{ _getCreateTableQuery()
+
+    /**
+     * Create a basic SQL query for a new table creation
+     * @param string $name   Name of the database that should be created
+     * @param array $fields  Associative array that contains the definition of each field of the new table
+     * @param array $options  An associative array of table options
+     * @return mixed string (the SQL query) on success, a MDB2 error on failure
+     * @see createTable()
+     */
+    function _getCreateTableQuery($name, $fields, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!$name) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
+                'no valid table name specified', __FUNCTION__);
+        }
+        if (empty($fields)) {
+            return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
+                'no fields specified for table "'.$name.'"', __FUNCTION__);
+        }
+        $query_fields = $this->getFieldDeclarationList($fields);
+        if (PEAR::isError($query_fields)) {
+            return $query_fields;
+        }
+        if (!empty($options['primary'])) {
+            $query_fields.= ', PRIMARY KEY ('.implode(', ', array_keys($options['primary'])).')';
+        }
+        if (!empty($options['foreign_keys'])) {
+            foreach ($options['foreign_keys'] as $fkname => $fkdef) {
+                if (empty($fkdef)) {
+                    continue;
+                }
+                $query_fields.= ', CONSTRAINT '.$fkname.' FOREIGN KEY ('.implode(', ', array_keys($fkdef['fields'])).')';
+                $query_fields.= ' REFERENCES '.$fkdef['references']['table'].' ('.implode(', ', array_keys($fkdef['references']['fields'])).')';
+                $query_fields.= $this->_getAdvancedFKOptions($fkdef);
+            }
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = 'CREATE ';
+        if (!empty($options['temporary'])) {
+            $result .= $this->_getTemporaryTableQuery();
+        }
+        $result .= " TABLE $name ($query_fields)";
+        return $result;
+    }
+
+    // }}}
+    // {{{ createTable()
+
+    /**
+     * create a new table
+     *
+     * @param string $name    Name of the database that should be created
+     * @param array  $fields  Associative array that contains the definition
+     *                        of each field of the new table
+     * @param array  $options An associative array of table options
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createTable($name, $fields, $options = array())
+    {
+        $result = parent::createTable($name, $fields, $options);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        // create triggers to enforce FOREIGN KEY constraints
+        if (!empty($options['foreign_keys'])) {
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            foreach ($options['foreign_keys'] as $fkname => $fkdef) {
+                if (empty($fkdef)) {
+                    continue;
+                }
+                //set actions to default if not set
+                $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']);
+                $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']);
+
+                $trigger_names = array(
+                    'insert'    => $fkname.'_insert_trg',
+                    'update'    => $fkname.'_update_trg',
+                    'pk_update' => $fkname.'_pk_update_trg',
+                    'pk_delete' => $fkname.'_pk_delete_trg',
+                );
+                
+                //create the [insert|update] triggers on the FK table
+                $table_fields = array_keys($fkdef['fields']);
+                $referenced_fields = array_keys($fkdef['references']['fields']);
+                $query = 'CREATE TRIGGER %s BEFORE %s ON '.$name
+                        .' FOR EACH ROW BEGIN'
+                        .' SELECT RAISE(ROLLBACK, \'%s on table "'.$name.'" violates FOREIGN KEY constraint "'.$fkname.'"\')'
+                        .' WHERE  (SELECT ';
+                $aliased_fields = array();
+                foreach ($referenced_fields as $field) {
+                    $aliased_fields[] = $fkdef['references']['table'] .'.'.$field .' AS '.$field;
+                }
+                $query .= implode(',', $aliased_fields)
+                       .' FROM '.$fkdef['references']['table']
+                       .' WHERE ';
+                $conditions = array();
+                for ($i=0; $i<count($table_fields); $i++) {
+                    $conditions[] = $referenced_fields[$i] .' = NEW.'.$table_fields[$i];
+                }
+                $query .= implode(' AND ', $conditions).') IS NULL; END;';
+                $result = $db->exec(sprintf($query, $trigger_names['insert'], 'INSERT', 'insert'));
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+
+                $result = $db->exec(sprintf($query, $trigger_names['update'], 'UPDATE', 'update'));
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+                
+                //create the ON [UPDATE|DELETE] triggers on the primary table
+                $restrict_action = 'SELECT RAISE(ROLLBACK, \'%s on table "'.$name.'" violates FOREIGN KEY constraint "'.$fkname.'"\')'
+                                  .' WHERE  (SELECT ';
+                $aliased_fields = array();
+                foreach ($table_fields as $field) {
+                    $aliased_fields[] = $name .'.'.$field .' AS '.$field;
+                }
+                $restrict_action .= implode(',', $aliased_fields)
+                       .' FROM '.$name
+                       .' WHERE ';
+                $conditions  = array();
+                $new_values  = array();
+                $null_values = array();
+                for ($i=0; $i<count($table_fields); $i++) {
+                    $conditions[]  = $table_fields[$i] .' = OLD.'.$referenced_fields[$i];
+                    $new_values[]  = $table_fields[$i] .' = NEW.'.$referenced_fields[$i];
+                    $null_values[] = $table_fields[$i] .' = NULL';
+                }
+                $conditions2 = array();
+                for ($i=0; $i<count($referenced_fields); $i++) {
+                    $conditions2[]  = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i];
+                }
+                $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL'
+                                 .' AND (' .implode(' OR ', $conditions2) .')';
+
+                $cascade_action_update = 'UPDATE '.$name.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions);
+                $cascade_action_delete = 'DELETE FROM '.$name.' WHERE '.implode(' AND ', $conditions);
+                $setnull_action        = 'UPDATE '.$name.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions);
+
+                if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) {
+                    $db->loadModule('Reverse', null, true);
+                    $default_values = array();
+                    foreach ($table_fields as $table_field) {
+                        $field_definition = $db->reverse->getTableFieldDefinition($name, $field);
+                        if (PEAR::isError($field_definition)) {
+                            return $field_definition;
+                        }
+                        $default_values[] = $table_field .' = '. $field_definition[0]['default'];
+                    }
+                    $setdefault_action = 'UPDATE '.$name.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions);
+                }
+
+                $query = 'CREATE TRIGGER %s'
+                        .' %s ON '.$fkdef['references']['table']
+                        .' FOR EACH ROW BEGIN ';
+
+                if ('CASCADE' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'AFTER UPDATE',  'update') . $cascade_action_update. '; END;';
+                } elseif ('SET NULL' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setnull_action. '; END;';
+                } elseif ('SET DEFAULT' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action. '; END;';
+                } elseif ('NO ACTION' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'AFTER UPDATE', 'update') . '; END;';
+                } elseif ('RESTRICT' == $fkdef['onupdate']) {
+                    $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . '; END;';
+                }
+                if ('CASCADE' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'AFTER DELETE',  'delete') . $cascade_action_delete. '; END;';
+                } elseif ('SET NULL' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setnull_action. '; END;';
+                } elseif ('SET DEFAULT' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action. '; END;';
+                } elseif ('NO ACTION' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete')  . '; END;';
+                } elseif ('RESTRICT' == $fkdef['ondelete']) {
+                    $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . '; END;';
+                }
+
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+                $result = $db->exec($sql_delete);
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+                $result = $db->exec($sql_update);
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+            }
+        }
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropTable()
+
+    /**
+     * drop an existing table
+     *
+     * @param string $name name of the table that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        
+        //delete the triggers associated to existing FK constraints
+        $constraints = $this->listTableConstraints($name);
+        if (!PEAR::isError($constraints) && !empty($constraints)) {
+            $db->loadModule('Reverse', null, true);
+            foreach ($constraints as $constraint) {
+                $definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
+                if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
+                    $result = $this->_dropFKTriggers($name, $constraint, $definition['references']['table']);
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+            }
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("DROP TABLE $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ vacuum()
+
+    /**
+     * Optimize (vacuum) all the tables in the db (or only the specified table)
+     * and optionally run ANALYZE.
+     *
+     * @param string $table table name (all the tables if empty)
+     * @param array  $options an array with driver-specific options:
+     *               - timeout [int] (in seconds) [mssql-only]
+     *               - analyze [boolean] [pgsql and mysql]
+     *               - full [boolean] [pgsql-only]
+     *               - freeze [boolean] [pgsql-only]
+     *
+     * @return mixed MDB2_OK success, a MDB2 error on failure
+     * @access public
+     */
+    function vacuum($table = null, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'VACUUM';
+        if (!empty($table)) {
+            $query .= ' '.$db->quoteIdentifier($table, true);
+        }
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ alterTable()
+
+    /**
+     * alter an existing table
+     *
+     * @param string $name         name of the table that is intended to be changed.
+     * @param array $changes     associative array that contains the details of each type
+     *                             of change that is intended to be performed. The types of
+     *                             changes that are currently supported are defined as follows:
+     *
+     *                             name
+     *
+     *                                New name for the table.
+     *
+     *                            add
+     *
+     *                                Associative array with the names of fields to be added as
+     *                                 indexes of the array. The value of each entry of the array
+     *                                 should be set to another associative array with the properties
+     *                                 of the fields to be added. The properties of the fields should
+     *                                 be the same as defined by the MDB2 parser.
+     *
+     *
+     *                            remove
+     *
+     *                                Associative array with the names of fields to be removed as indexes
+     *                                 of the array. Currently the values assigned to each entry are ignored.
+     *                                 An empty array should be used for future compatibility.
+     *
+     *                            rename
+     *
+     *                                Associative array with the names of fields to be renamed as indexes
+     *                                 of the array. The value of each entry of the array should be set to
+     *                                 another associative array with the entry named name with the new
+     *                                 field name and the entry named Declaration that is expected to contain
+     *                                 the portion of the field declaration already in DBMS specific SQL code
+     *                                 as it is used in the CREATE TABLE statement.
+     *
+     *                            change
+     *
+     *                                Associative array with the names of the fields to be changed as indexes
+     *                                 of the array. Keep in mind that if it is intended to change either the
+     *                                 name of a field and any other properties, the change array entries
+     *                                 should have the new names of the fields as array indexes.
+     *
+     *                                The value of each entry of the array should be set to another associative
+     *                                 array with the properties of the fields to that are meant to be changed as
+     *                                 array entries. These entries should be assigned to the new values of the
+     *                                 respective properties. The properties of the fields should be the same
+     *                                 as defined by the MDB2 parser.
+     *
+     *                            Example
+     *                                array(
+     *                                    'name' => 'userlist',
+     *                                    'add' => array(
+     *                                        'quota' => array(
+     *                                            'type' => 'integer',
+     *                                            'unsigned' => 1
+     *                                        )
+     *                                    ),
+     *                                    'remove' => array(
+     *                                        'file_limit' => array(),
+     *                                        'time_limit' => array()
+     *                                    ),
+     *                                    'change' => array(
+     *                                        'name' => array(
+     *                                            'length' => '20',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 20,
+     *                                            ),
+     *                                        )
+     *                                    ),
+     *                                    'rename' => array(
+     *                                        'sex' => array(
+     *                                            'name' => 'gender',
+     *                                            'definition' => array(
+     *                                                'type' => 'text',
+     *                                                'length' => 1,
+     *                                                'default' => 'M',
+     *                                            ),
+     *                                        )
+     *                                    )
+     *                                )
+     *
+     * @param boolean $check     indicates whether the function should just check if the DBMS driver
+     *                             can perform the requested table alterations if the value is true or
+     *                             actually perform them otherwise.
+     * @access public
+     *
+      * @return mixed MDB2_OK on success, a MDB2 error on failure
+     */
+    function alterTable($name, $changes, $check, $options = array())
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        foreach ($changes as $change_name => $change) {
+            switch ($change_name) {
+            case 'add':
+            case 'remove':
+            case 'change':
+            case 'name':
+            case 'rename':
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
+                    'change type "'.$change_name.'" not yet supported', __FUNCTION__);
+            }
+        }
+
+        if ($check) {
+            return MDB2_OK;
+        }
+
+        $db->loadModule('Reverse', null, true);
+
+        // actually sqlite 2.x supports no ALTER TABLE at all .. so we emulate it
+        $fields = $db->manager->listTableFields($name);
+        if (PEAR::isError($fields)) {
+            return $fields;
+        }
+
+        $fields = array_flip($fields);
+        foreach ($fields as $field => $value) {
+            $definition = $db->reverse->getTableFieldDefinition($name, $field);
+            if (PEAR::isError($definition)) {
+                return $definition;
+            }
+            $fields[$field] = $definition[0];
+        }
+
+        $indexes = $db->manager->listTableIndexes($name);
+        if (PEAR::isError($indexes)) {
+            return $indexes;
+        }
+
+        $indexes = array_flip($indexes);
+        foreach ($indexes as $index => $value) {
+            $definition = $db->reverse->getTableIndexDefinition($name, $index);
+            if (PEAR::isError($definition)) {
+                return $definition;
+            }
+            $indexes[$index] = $definition;
+        }
+
+        $constraints = $db->manager->listTableConstraints($name);
+        if (PEAR::isError($constraints)) {
+            return $constraints;
+        }
+
+        if (!array_key_exists('foreign_keys', $options)) {
+            $options['foreign_keys'] = array();
+        }
+        $constraints = array_flip($constraints);
+        foreach ($constraints as $constraint => $value) {
+            if (!empty($definition['primary'])) {
+                if (!array_key_exists('primary', $options)) {
+                    $options['primary'] = $definition['fields'];
+                    //remove from the $constraint array, it's already handled by createTable()
+                    unset($constraints[$constraint]);
+                }
+            } else {
+                $c_definition = $db->reverse->getTableConstraintDefinition($name, $constraint);
+                if (PEAR::isError($c_definition)) {
+                    return $c_definition;
+                }
+                if (!empty($c_definition['foreign'])) {
+                    if (!array_key_exists($constraint, $options['foreign_keys'])) {
+                        $options['foreign_keys'][$constraint] = $c_definition;
+                    }
+                    //remove from the $constraint array, it's already handled by createTable()
+                    unset($constraints[$constraint]);
+                } else {
+                    $constraints[$constraint] = $c_definition;
+                }
+            }
+        }
+
+        $name_new = $name;
+        $create_order = $select_fields = array_keys($fields);
+        foreach ($changes as $change_name => $change) {
+            switch ($change_name) {
+            case 'add':
+                foreach ($change as $field_name => $field) {
+                    $fields[$field_name] = $field;
+                    $create_order[] = $field_name;
+                }
+                break;
+            case 'remove':
+                foreach ($change as $field_name => $field) {
+                    unset($fields[$field_name]);
+                    $select_fields = array_diff($select_fields, array($field_name));
+                    $create_order = array_diff($create_order, array($field_name));
+                }
+                break;
+            case 'change':
+                foreach ($change as $field_name => $field) {
+                    $fields[$field_name] = $field['definition'];
+                }
+                break;
+            case 'name':
+                $name_new = $change;
+                break;
+            case 'rename':
+                foreach ($change as $field_name => $field) {
+                    unset($fields[$field_name]);
+                    $fields[$field['name']] = $field['definition'];
+                    $create_order[array_search($field_name, $create_order)] = $field['name'];
+                }
+                break;
+            default:
+                return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
+                    'change type "'.$change_name.'" not yet supported', __FUNCTION__);
+            }
+        }
+
+        $data = null;
+        if (!empty($select_fields)) {
+            $query = 'SELECT '.implode(', ', $select_fields).' FROM '.$db->quoteIdentifier($name, true);
+            $data = $db->queryAll($query, null, MDB2_FETCHMODE_ORDERED);
+        }
+
+        $result = $this->dropTable($name);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        $result = $this->createTable($name_new, $fields, $options);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        foreach ($indexes as $index => $definition) {
+            $this->createIndex($name_new, $index, $definition);
+        }
+
+        foreach ($constraints as $constraint => $definition) {
+            $this->createConstraint($name_new, $constraint, $definition);
+        }
+
+        if (!empty($select_fields) && !empty($data)) {
+            $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true);
+            $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')';
+            $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')';
+            $stmt = $db->prepare($query, null, MDB2_PREPARE_MANIP);
+            if (PEAR::isError($stmt)) {
+                return $stmt;
+            }
+            foreach ($data as $row) {
+                $result = $stmt->execute($row);
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listDatabases()
+
+    /**
+     * list all databases
+     *
+     * @return mixed array of database names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listDatabases()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'list databases is not supported', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listUsers()
+
+    /**
+     * list all users
+     *
+     * @return mixed array of user names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listUsers()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'list databases is not supported', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ listViews()
+
+    /**
+     * list all views in the current database
+     *
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listViews()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name FROM sqlite_master WHERE type='view' AND sql NOT NULL";
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableViews()
+
+    /**
+     * list the views in the database that reference a given table
+     *
+     * @param string table for which all referenced views should be found
+     * @return mixed array of view names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableViews($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name, sql FROM sqlite_master WHERE type='view' AND sql NOT NULL";
+        $views = $db->queryAll($query, array('text', 'text'), MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($views)) {
+            return $views;
+        }
+        $result = array();
+        foreach ($views as $row) {
+            if (preg_match("/^create view .* \bfrom\b\s+\b{$table}\b /i", $row['sql'])) {
+                if (!empty($row['name'])) {
+                    $result[$row['name']] = true;
+                }
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ listTables()
+
+    /**
+     * list all tables in the current database
+     *
+     * @return mixed array of table names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTables()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name";
+        $table_names = $db->queryCol($query);
+        if (PEAR::isError($table_names)) {
+            return $table_names;
+        }
+        $result = array();
+        foreach ($table_names as $table_name) {
+            if (!$this->_fixSequenceName($table_name, true)) {
+                $result[] = $table_name;
+            }
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ listTableFields()
+
+    /**
+     * list all fields in a table in the current database
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of field names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableFields($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $result = $db->loadModule('Reverse', null, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text');
+        } else {
+            $query.= 'name='.$db->quote($table, 'text');
+        }
+        $sql = $db->queryOne($query);
+        if (PEAR::isError($sql)) {
+            return $sql;
+        }
+        $columns = $db->reverse->_getTableColumns($sql);
+        $fields = array();
+        foreach ($columns as $column) {
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($db->options['field_case'] == CASE_LOWER) {
+                    $column['name'] = strtolower($column['name']);
+                } else {
+                    $column['name'] = strtoupper($column['name']);
+                }
+            } else {
+                $column = array_change_key_case($column, $db->options['field_case']);
+            }
+            $fields[] = $column['name'];
+        }
+        return $fields;
+    }
+
+    // }}}
+    // {{{ listTableTriggers()
+
+    /**
+     * list all triggers in the database that reference a given table
+     *
+     * @param string table for which all referenced triggers should be found
+     * @return mixed array of trigger names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableTriggers($table = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name FROM sqlite_master WHERE type='trigger' AND sql NOT NULL";
+        if (null !== $table) {
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                $query.= ' AND LOWER(tbl_name)='.$db->quote(strtolower($table), 'text');
+            } else {
+                $query.= ' AND tbl_name='.$db->quote($table, 'text');
+            }
+        }
+        $result = $db->queryCol($query);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ createIndex()
+
+    /**
+     * Get the stucture of a field into an array
+     *
+     * @param string    $table         name of the table on which the index is to be created
+     * @param string    $name         name of the index to be created
+     * @param array     $definition        associative array that defines properties of the index to be created.
+     *                                 Currently, only one property named FIELDS is supported. This property
+     *                                 is also an associative with the names of the index fields as array
+     *                                 indexes. Each entry of this array is set to another type of associative
+     *                                 array that specifies properties of the index that are specific to
+     *                                 each field.
+     *
+     *                                Currently, only the sorting property is supported. It should be used
+     *                                 to define the sorting direction of the index. It may be set to either
+     *                                 ascending or descending.
+     *
+     *                                Not all DBMS support index sorting direction configuration. The DBMS
+     *                                 drivers of those that do not support it ignore this property. Use the
+     *                                 function support() to determine whether the DBMS driver can manage indexes.
+
+     *                                 Example
+     *                                    array(
+     *                                        'fields' => array(
+     *                                            'user_name' => array(
+     *                                                'sorting' => 'ascending'
+     *                                            ),
+     *                                            'last_login' => array()
+     *                                        )
+     *                                    )
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createIndex($table, $name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name  = $db->quoteIdentifier($db->getIndexName($name), true);
+        $query = "CREATE INDEX $name ON $table";
+        $fields = array();
+        foreach ($definition['fields'] as $field_name => $field) {
+            $field_string = $db->quoteIdentifier($field_name, true);
+            if (!empty($field['sorting'])) {
+                switch ($field['sorting']) {
+                case 'ascending':
+                    $field_string.= ' ASC';
+                    break;
+                case 'descending':
+                    $field_string.= ' DESC';
+                    break;
+                }
+            }
+            $fields[] = $field_string;
+        }
+        $query .= ' ('.implode(', ', $fields) . ')';
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropIndex()
+
+    /**
+     * drop existing index
+     *
+     * @param string    $table         name of table that should be used in method
+     * @param string    $name         name of the index to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropIndex($table, $name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->getIndexName($name);
+        $result = $db->exec("DROP INDEX $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listTableIndexes()
+
+    /**
+     * list all indexes in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of index names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableIndexes($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quote($table, 'text');
+        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(tbl_name)='.strtolower($table);
+        } else {
+            $query.= "tbl_name=$table";
+        }
+        $query.= " AND sql NOT NULL ORDER BY name";
+        $indexes = $db->queryCol($query, 'text');
+        if (PEAR::isError($indexes)) {
+            return $indexes;
+        }
+
+        $result = array();
+        foreach ($indexes as $sql) {
+            if (preg_match("/^create index ([^ ]+) on /i", $sql, $tmp)) {
+                $index = $this->_fixIndexName($tmp[1]);
+                if (!empty($index)) {
+                    $result[$index] = true;
+                }
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ createConstraint()
+
+    /**
+     * create a constraint on a table
+     *
+     * @param string $table      name of the table on which the constraint is to be created
+     * @param string $name       name of the constraint to be created
+     * @param array  $definition associative array that defines properties of the constraint to be created.
+     *                           Currently, only one property named FIELDS is supported. This property
+     *                           is also an associative with the names of the constraint fields as array
+     *                           constraints. Each entry of this array is set to another type of associative
+     *                           array that specifies properties of the constraint that are specific to
+     *                           each field.
+     *
+     *                           Example
+     *                              array(
+     *                                  'fields' => array(
+     *                                      'user_name' => array(),
+     *                                      'last_login' => array()
+     *                                  )
+     *                              )
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createConstraint($table, $name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!empty($definition['primary'])) {
+            return $db->manager->alterTable($table, array(), false, array('primary' => $definition['fields']));
+        }
+        
+        if (!empty($definition['foreign'])) {
+            return $db->manager->alterTable($table, array(), false, array('foreign_keys' => array($name => $definition)));
+        }
+
+        $table = $db->quoteIdentifier($table, true);
+        $name  = $db->getIndexName($name);
+        $query = "CREATE UNIQUE INDEX $name ON $table";
+        $fields = array();
+        foreach ($definition['fields'] as $field_name => $field) {
+            $field_string = $field_name;
+            if (!empty($field['sorting'])) {
+                switch ($field['sorting']) {
+                case 'ascending':
+                    $field_string.= ' ASC';
+                    break;
+                case 'descending':
+                    $field_string.= ' DESC';
+                    break;
+                }
+            }
+            $fields[] = $field_string;
+        }
+        $query .= ' ('.implode(', ', $fields) . ')';
+        $result = $db->exec($query);
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ dropConstraint()
+
+    /**
+     * drop existing constraint
+     *
+     * @param string    $table        name of table that should be used in method
+     * @param string    $name         name of the constraint to be dropped
+     * @param string    $primary      hint if the constraint is primary
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropConstraint($table, $name, $primary = false)
+    {
+        if ($primary || $name == 'PRIMARY') {
+            return $this->alterTable($table, array(), false, array('primary' => null));
+        }
+
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        //is it a FK constraint? If so, also delete the associated triggers
+        $db->loadModule('Reverse', null, true);
+        $definition = $db->reverse->getTableConstraintDefinition($table, $name);
+        if (!PEAR::isError($definition) && !empty($definition['foreign'])) {
+            //first drop the FK enforcing triggers
+            $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            //then drop the constraint itself
+            return $this->alterTable($table, array(), false, array('foreign_keys' => array($name => null)));
+        }
+
+        $name = $db->getIndexName($name);
+        $result = $db->exec("DROP INDEX $name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ _dropFKTriggers()
+    
+    /**
+     * Drop the triggers created to enforce the FOREIGN KEY constraint on the table
+     *
+     * @param string $table  table name
+     * @param string $fkname FOREIGN KEY constraint name
+     * @param string $referenced_table  referenced table name
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access private
+     */
+    function _dropFKTriggers($table, $fkname, $referenced_table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $triggers  = $this->listTableTriggers($table);
+        $triggers2 = $this->listTableTriggers($referenced_table);
+        if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) {
+            $triggers = array_merge($triggers, $triggers2);
+            $pattern = '/^'.$fkname.'(_pk)?_(insert|update|delete)_trg$/i';
+            foreach ($triggers as $trigger) {
+                if (preg_match($pattern, $trigger)) {
+                    $result = $db->exec('DROP TRIGGER '.$trigger);
+                    if (PEAR::isError($result)) {
+                        return $result;
+                    }
+                }
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listTableConstraints()
+
+    /**
+     * list all constraints in a table
+     *
+     * @param string $table name of table that should be used in method
+     * @return mixed array of constraint names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listTableConstraints($table)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $table = $db->quote($table, 'text');
+        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(tbl_name)='.strtolower($table);
+        } else {
+            $query.= "tbl_name=$table";
+        }
+        $query.= " AND sql NOT NULL ORDER BY name";
+        $indexes = $db->queryCol($query, 'text');
+        if (PEAR::isError($indexes)) {
+            return $indexes;
+        }
+
+        $result = array();
+        foreach ($indexes as $sql) {
+            if (preg_match("/^create unique index ([^ ]+) on /i", $sql, $tmp)) {
+                $index = $this->_fixIndexName($tmp[1]);
+                if (!empty($index)) {
+                    $result[$index] = true;
+                }
+            }
+        }
+        
+        // also search in table definition for PRIMARY KEYs...
+        $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(name)='.strtolower($table);
+        } else {
+            $query.= "name=$table";
+        }
+        $query.= " AND sql NOT NULL ORDER BY name";
+        $table_def = $db->queryOne($query, 'text');
+        if (PEAR::isError($table_def)) {
+            return $table_def;
+        }
+        if (preg_match("/\bPRIMARY\s+KEY\b/i", $table_def, $tmp)) {
+            $result['primary'] = true;
+        }
+
+        // ...and for FOREIGN KEYs
+        if (preg_match_all("/\bCONSTRAINT\b\s+([^\s]+)\s+\bFOREIGN\s+KEY/imsx", $table_def, $tmp)) {
+            foreach ($tmp[1] as $fk) {
+                $result[$fk] = true;
+            }
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_change_key_case($result, $db->options['field_case']);
+        }
+        return array_keys($result);
+    }
+
+    // }}}
+    // {{{ createSequence()
+
+    /**
+     * create sequence
+     *
+     * @param string    $seq_name     name of the sequence to be created
+     * @param string    $start         start value of the sequence; default is 1
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function createSequence($seq_name, $start = 1)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
+        $seqcol_name = $db->quoteIdentifier($db->options['seqcol_name'], true);
+        $query = "CREATE TABLE $sequence_name ($seqcol_name INTEGER PRIMARY KEY DEFAULT 0 NOT NULL)";
+        $res = $db->exec($query);
+        if (PEAR::isError($res)) {
+            return $res;
+        }
+        if ($start == 1) {
+            return MDB2_OK;
+        }
+        $res = $db->exec("INSERT INTO $sequence_name ($seqcol_name) VALUES (".($start-1).')');
+        if (!PEAR::isError($res)) {
+            return MDB2_OK;
+        }
+        // Handle error
+        $result = $db->exec("DROP TABLE $sequence_name");
+        if (PEAR::isError($result)) {
+            return $db->raiseError($result, null, null,
+                'could not drop inconsistent sequence table', __FUNCTION__);
+        }
+        return $db->raiseError($res, null, null,
+            'could not create sequence table', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ dropSequence()
+
+    /**
+     * drop existing sequence
+     *
+     * @param string    $seq_name     name of the sequence to be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropSequence($seq_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true);
+        $result = $db->exec("DROP TABLE $sequence_name");
+        if (MDB2::isError($result)) {
+            return $result;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ listSequences()
+
+    /**
+     * list all sequences in the current database
+     *
+     * @return mixed array of sequence names on success, a MDB2 error on failure
+     * @access public
+     */
+    function listSequences()
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name FROM sqlite_master WHERE type='table' AND sql NOT NULL ORDER BY name";
+        $table_names = $db->queryCol($query);
+        if (PEAR::isError($table_names)) {
+            return $table_names;
+        }
+        $result = array();
+        foreach ($table_names as $table_name) {
+            if ($sqn = $this->_fixSequenceName($table_name, true)) {
+                $result[] = $sqn;
+            }
+        }
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $result = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $result);
+        }
+        return $result;
+    }
+
+    // }}}
+}
+?>
diff --git a/3rdparty/MDB2/Driver/Native/Common.php b/3rdparty/MDB2/Driver/Native/Common.php
index 7cd536ee566d47353903487a0844cfcc941e298d..67dc1bddd031224821ce724a831211550a8ea349 100644
--- a/3rdparty/MDB2/Driver/Native/Common.php
+++ b/3rdparty/MDB2/Driver/Native/Common.php
@@ -1,61 +1,61 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Common.php 242348 2007-09-09 13:47:36Z quipo $
-//
-
-/**
- * Base class for the natuve modules that is extended by each MDB2 driver
- *
- * To load this module in the MDB2 object:
- * $mdb->loadModule('Native');
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Native_Common extends MDB2_Module_Common
-{
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * Base class for the natuve modules that is extended by each MDB2 driver
+ *
+ * To load this module in the MDB2 object:
+ * $mdb->loadModule('Native');
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Native_Common extends MDB2_Module_Common
+{
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Native/mysql.php b/3rdparty/MDB2/Driver/Native/mysql.php
index f32e3ec3374f789879a4150e66338c782f6e3e93..48e65a05fd25f76539499d08807b0e246015edb5 100644
--- a/3rdparty/MDB2/Driver/Native/mysql.php
+++ b/3rdparty/MDB2/Driver/Native/mysql.php
@@ -1,60 +1,60 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php 215004 2006-06-18 21:59:05Z lsmith $
-//
-
-require_once 'MDB2/Driver/Native/Common.php';
-
-/**
- * MDB2 MySQL driver for the native module
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Native_mysql extends MDB2_Driver_Native_Common
-{
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Native/Common.php';
+
+/**
+ * MDB2 MySQL driver for the native module
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Native_mysql extends MDB2_Driver_Native_Common
+{
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Native/pgsql.php b/3rdparty/MDB2/Driver/Native/pgsql.php
index 7977b38d3b4d067ced68580a01dd05e9a74d3905..f4db5eae5298b540abbcdd6c8b6d688f9c26c15d 100644
--- a/3rdparty/MDB2/Driver/Native/pgsql.php
+++ b/3rdparty/MDB2/Driver/Native/pgsql.php
@@ -1,88 +1,88 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Paul Cooper <pgc@ucecom.com>                                 |
-// +----------------------------------------------------------------------+
-//
-// $Id: pgsql.php 295587 2010-02-28 17:16:38Z quipo $
-
-require_once 'MDB2/Driver/Native/Common.php';
-
-/**
- * MDB2 PostGreSQL driver for the native module
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_Driver_Native_pgsql extends MDB2_Driver_Native_Common
-{
-    // }}}
-    // {{{ deleteOID()
-
-    /**
-     * delete an OID
-     *
-     * @param integer    $OID
-     * @return mixed MDB2_OK on success or MDB2 Error Object on failure
-     * @access public
-     */
-    function deleteOID($OID)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $connection = $db->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        if (!@pg_lo_unlink($connection, $OID)) {
-            return $db->raiseError(null, null, null,
-                'Unable to unlink OID: '.$OID, __FUNCTION__);
-        }
-        return MDB2_OK;
-    }
-
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Paul Cooper <pgc@ucecom.com>                                 |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+require_once 'MDB2/Driver/Native/Common.php';
+
+/**
+ * MDB2 PostGreSQL driver for the native module
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_Driver_Native_pgsql extends MDB2_Driver_Native_Common
+{
+    // }}}
+    // {{{ deleteOID()
+
+    /**
+     * delete an OID
+     *
+     * @param integer    $OID
+     * @return mixed MDB2_OK on success or MDB2 Error Object on failure
+     * @access public
+     */
+    function deleteOID($OID)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $connection = $db->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        if (!@pg_lo_unlink($connection, $OID)) {
+            return $db->raiseError(null, null, null,
+                'Unable to unlink OID: '.$OID, __FUNCTION__);
+        }
+        return MDB2_OK;
+    }
+
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Native/sqlite.php b/3rdparty/MDB2/Driver/Native/sqlite.php
index b4da1ce83a3f6d6fe38f131317fa86ca76fe4eb8..4eb796dce7aebdbffdaebeca36ab1873273dc586 100644
--- a/3rdparty/MDB2/Driver/Native/sqlite.php
+++ b/3rdparty/MDB2/Driver/Native/sqlite.php
@@ -1,60 +1,60 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: sqlite.php 215004 2006-06-18 21:59:05Z lsmith $
-//
-
-require_once 'MDB2/Driver/Native/Common.php';
-
-/**
- * MDB2 SQLite driver for the native module
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Native_sqlite extends MDB2_Driver_Native_Common
-{
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Native/Common.php';
+
+/**
+ * MDB2 SQLite driver for the native module
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Native_sqlite extends MDB2_Driver_Native_Common
+{
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Reverse/Common.php b/3rdparty/MDB2/Driver/Reverse/Common.php
index 153516d80d8afe9cf7cc9e4fdfd0d509457f57d1..2260520835ed9c0e3e447bfce512e6de7ad59b20 100644
--- a/3rdparty/MDB2/Driver/Reverse/Common.php
+++ b/3rdparty/MDB2/Driver/Reverse/Common.php
@@ -1,517 +1,517 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Common.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-/**
- * @package MDB2
- * @category Database
- */
-
-/**
- * These are constants for the tableInfo-function
- * they are bitwised or'ed. so if there are more constants to be defined
- * in the future, adjust MDB2_TABLEINFO_FULL accordingly
- */
-
-define('MDB2_TABLEINFO_ORDER',      1);
-define('MDB2_TABLEINFO_ORDERTABLE', 2);
-define('MDB2_TABLEINFO_FULL',       3);
-
-/**
- * Base class for the schema reverse engineering module that is extended by each MDB2 driver
- *
- * To load this module in the MDB2 object:
- * $mdb->loadModule('Reverse');
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
-{
-    // {{{ splitTableSchema()
-
-    /**
-     * Split the "[owner|schema].table" notation into an array
-     *
-     * @param string $table [schema and] table name
-     *
-     * @return array array(schema, table)
-     * @access private
-     */
-    function splitTableSchema($table)
-    {
-        $ret = array();
-        if (strpos($table, '.') !== false) {
-            return explode('.', $table);
-        }
-        return array(null, $table);
-    }
-
-    // }}}
-    // {{{ getTableFieldDefinition()
-
-    /**
-     * Get the structure of a field into an array
-     *
-     * @param string    $table     name of table that should be used in method
-     * @param string    $field     name of field that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure.
-     *          The returned array contains an array for each field definition,
-     *          with all or some of these indices, depending on the field data type:
-     *          [notnull] [nativetype] [length] [fixed] [default] [type] [mdb2type]
-     * @access public
-     */
-    function getTableFieldDefinition($table, $field)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ getTableIndexDefinition()
-
-    /**
-     * Get the structure of an index into an array
-     *
-     * @param string    $table      name of table that should be used in method
-     * @param string    $index      name of index that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     *          The returned array has this structure:
-     *          </pre>
-     *          array (
-     *              [fields] => array (
-     *                  [field1name] => array() // one entry per each field covered
-     *                  [field2name] => array() // by the index
-     *                  [field3name] => array(
-     *                      [sorting] => ascending
-     *                  )
-     *              )
-     *          );
-     *          </pre>
-     * @access public
-     */
-    function getTableIndexDefinition($table, $index)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ getTableConstraintDefinition()
-
-    /**
-     * Get the structure of an constraints into an array
-     *
-     * @param string    $table      name of table that should be used in method
-     * @param string    $index      name of index that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     *          The returned array has this structure:
-     *          <pre>
-     *          array (
-     *              [primary] => 0
-     *              [unique]  => 0
-     *              [foreign] => 1
-     *              [check]   => 0
-     *              [fields] => array (
-     *                  [field1name] => array() // one entry per each field covered
-     *                  [field2name] => array() // by the index
-     *                  [field3name] => array(
-     *                      [sorting]  => ascending
-     *                      [position] => 3
-     *                  )
-     *              )
-     *              [references] => array(
-     *                  [table] => name
-     *                  [fields] => array(
-     *                      [field1name] => array(  //one entry per each referenced field
-     *                           [position] => 1
-     *                      )
-     *                  )
-     *              )
-     *              [deferrable] => 0
-     *              [initiallydeferred] => 0
-     *              [onupdate] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
-     *              [ondelete] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
-     *              [match] => SIMPLE|PARTIAL|FULL
-     *          );
-     *          </pre>
-     * @access public
-     */
-    function getTableConstraintDefinition($table, $index)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ getSequenceDefinition()
-
-    /**
-     * Get the structure of a sequence into an array
-     *
-     * @param string    $sequence   name of sequence that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     *          The returned array has this structure:
-     *          <pre>
-     *          array (
-     *              [start] => n
-     *          );
-     *          </pre>
-     * @access public
-     */
-    function getSequenceDefinition($sequence)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $start = $db->currId($sequence);
-        if (PEAR::isError($start)) {
-            return $start;
-        }
-        if ($db->supports('current_id')) {
-            $start++;
-        } else {
-            $db->warnings[] = 'database does not support getting current
-                sequence value, the sequence value was incremented';
-        }
-        $definition = array();
-        if ($start != 1) {
-            $definition = array('start' => $start);
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTriggerDefinition()
-
-    /**
-     * Get the structure of a trigger into an array
-     *
-     * EXPERIMENTAL
-     *
-     * WARNING: this function is experimental and may change the returned value 
-     * at any time until labelled as non-experimental
-     *
-     * @param string    $trigger    name of trigger that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     *          The returned array has this structure:
-     *          <pre>
-     *          array (
-     *              [trigger_name]    => 'trigger name',
-     *              [table_name]      => 'table name',
-     *              [trigger_body]    => 'trigger body definition',
-     *              [trigger_type]    => 'BEFORE' | 'AFTER',
-     *              [trigger_event]   => 'INSERT' | 'UPDATE' | 'DELETE'
-     *                  //or comma separated list of multiple events, when supported
-     *              [trigger_enabled] => true|false
-     *              [trigger_comment] => 'trigger comment',
-     *          );
-     *          </pre>
-     *          The oci8 driver also returns a [when_clause] index.
-     * @access public
-     */
-    function getTriggerDefinition($trigger)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-            'method not implemented', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ tableInfo()
-
-    /**
-     * Returns information about a table or a result set
-     *
-     * The format of the resulting array depends on which <var>$mode</var>
-     * you select.  The sample output below is based on this query:
-     * <pre>
-     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
-     *    FROM tblFoo
-     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId
-     * </pre>
-     *
-     * <ul>
-     * <li>
-     *
-     * <kbd>null</kbd> (default)
-     *   <pre>
-     *   [0] => Array (
-     *       [table] => tblFoo
-     *       [name] => fldId
-     *       [type] => int
-     *       [len] => 11
-     *       [flags] => primary_key not_null
-     *   )
-     *   [1] => Array (
-     *       [table] => tblFoo
-     *       [name] => fldPhone
-     *       [type] => string
-     *       [len] => 20
-     *       [flags] =>
-     *   )
-     *   [2] => Array (
-     *       [table] => tblBar
-     *       [name] => fldId
-     *       [type] => int
-     *       [len] => 11
-     *       [flags] => primary_key not_null
-     *   )
-     *   </pre>
-     *
-     * </li><li>
-     *
-     * <kbd>MDB2_TABLEINFO_ORDER</kbd>
-     *
-     *   <p>In addition to the information found in the default output,
-     *   a notation of the number of columns is provided by the
-     *   <samp>num_fields</samp> element while the <samp>order</samp>
-     *   element provides an array with the column names as the keys and
-     *   their location index number (corresponding to the keys in the
-     *   the default output) as the values.</p>
-     *
-     *   <p>If a result set has identical field names, the last one is
-     *   used.</p>
-     *
-     *   <pre>
-     *   [num_fields] => 3
-     *   [order] => Array (
-     *       [fldId] => 2
-     *       [fldTrans] => 1
-     *   )
-     *   </pre>
-     *
-     * </li><li>
-     *
-     * <kbd>MDB2_TABLEINFO_ORDERTABLE</kbd>
-     *
-     *   <p>Similar to <kbd>MDB2_TABLEINFO_ORDER</kbd> but adds more
-     *   dimensions to the array in which the table names are keys and
-     *   the field names are sub-keys.  This is helpful for queries that
-     *   join tables which have identical field names.</p>
-     *
-     *   <pre>
-     *   [num_fields] => 3
-     *   [ordertable] => Array (
-     *       [tblFoo] => Array (
-     *           [fldId] => 0
-     *           [fldPhone] => 1
-     *       )
-     *       [tblBar] => Array (
-     *           [fldId] => 2
-     *       )
-     *   )
-     *   </pre>
-     *
-     * </li>
-     * </ul>
-     *
-     * The <samp>flags</samp> element contains a space separated list
-     * of extra information about the field.  This data is inconsistent
-     * between DBMS's due to the way each DBMS works.
-     *   + <samp>primary_key</samp>
-     *   + <samp>unique_key</samp>
-     *   + <samp>multiple_key</samp>
-     *   + <samp>not_null</samp>
-     *
-     * Most DBMS's only provide the <samp>table</samp> and <samp>flags</samp>
-     * elements if <var>$result</var> is a table name.  The following DBMS's
-     * provide full information from queries:
-     *   + fbsql
-     *   + mysql
-     *
-     * If the 'portability' option has <samp>MDB2_PORTABILITY_FIX_CASE</samp>
-     * turned on, the names of tables and fields will be lower or upper cased.
-     *
-     * @param object|string  $result  MDB2_result object from a query or a
-     *                                string containing the name of a table.
-     *                                While this also accepts a query result
-     *                                resource identifier, this behavior is
-     *                                deprecated.
-     * @param int  $mode   either unused or one of the tableInfo modes:
-     *                     <kbd>MDB2_TABLEINFO_ORDERTABLE</kbd>,
-     *                     <kbd>MDB2_TABLEINFO_ORDER</kbd> or
-     *                     <kbd>MDB2_TABLEINFO_FULL</kbd> (which does both).
-     *                     These are bitwise, so the first two can be
-     *                     combined using <kbd>|</kbd>.
-     *
-     * @return array  an associative array with the information requested.
-     *                 A MDB2_Error object on failure.
-     *
-     * @see MDB2_Driver_Common::setOption()
-     */
-    function tableInfo($result, $mode = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if (!is_string($result)) {
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'method not implemented', __FUNCTION__);
-        }
-
-        $db->loadModule('Manager', null, true);
-        $fields = $db->manager->listTableFields($result);
-        if (PEAR::isError($fields)) {
-            return $fields;
-        }
-
-        $flags = array();
-
-        $idxname_format = $db->getOption('idxname_format');
-        $db->setOption('idxname_format', '%s');
-
-        $indexes = $db->manager->listTableIndexes($result);
-        if (PEAR::isError($indexes)) {
-            $db->setOption('idxname_format', $idxname_format);
-            return $indexes;
-        }
-
-        foreach ($indexes as $index) {
-            $definition = $this->getTableIndexDefinition($result, $index);
-            if (PEAR::isError($definition)) {
-                $db->setOption('idxname_format', $idxname_format);
-                return $definition;
-            }
-            if (count($definition['fields']) > 1) {
-                foreach ($definition['fields'] as $field => $sort) {
-                    $flags[$field] = 'multiple_key';
-                }
-            }
-        }
-
-        $constraints = $db->manager->listTableConstraints($result);
-        if (PEAR::isError($constraints)) {
-            return $constraints;
-        }
-
-        foreach ($constraints as $constraint) {
-            $definition = $this->getTableConstraintDefinition($result, $constraint);
-            if (PEAR::isError($definition)) {
-                $db->setOption('idxname_format', $idxname_format);
-                return $definition;
-            }
-            $flag = !empty($definition['primary'])
-                ? 'primary_key' : (!empty($definition['unique'])
-                    ? 'unique_key' : false);
-            if ($flag) {
-                foreach ($definition['fields'] as $field => $sort) {
-                    if (empty($flags[$field]) || $flags[$field] != 'primary_key') {
-                        $flags[$field] = $flag;
-                    }
-                }
-            }
-        }
-
-        $res = array();
-
-        if ($mode) {
-            $res['num_fields'] = count($fields);
-        }
-
-        foreach ($fields as $i => $field) {
-            $definition = $this->getTableFieldDefinition($result, $field);
-            if (PEAR::isError($definition)) {
-                $db->setOption('idxname_format', $idxname_format);
-                return $definition;
-            }
-            $res[$i] = $definition[0];
-            $res[$i]['name'] = $field;
-            $res[$i]['table'] = $result;
-            $res[$i]['type'] = preg_replace('/^([a-z]+).*$/i', '\\1', trim($definition[0]['nativetype']));
-            // 'primary_key', 'unique_key', 'multiple_key'
-            $res[$i]['flags'] = empty($flags[$field]) ? '' : $flags[$field];
-            // not_null', 'unsigned', 'auto_increment', 'default_[rawencodedvalue]'
-            if (!empty($res[$i]['notnull'])) {
-                $res[$i]['flags'].= ' not_null';
-            }
-            if (!empty($res[$i]['unsigned'])) {
-                $res[$i]['flags'].= ' unsigned';
-            }
-            if (!empty($res[$i]['auto_increment'])) {
-                $res[$i]['flags'].= ' autoincrement';
-            }
-            if (!empty($res[$i]['default'])) {
-                $res[$i]['flags'].= ' default_'.rawurlencode($res[$i]['default']);
-            }
-
-            if ($mode & MDB2_TABLEINFO_ORDER) {
-                $res['order'][$res[$i]['name']] = $i;
-            }
-            if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
-                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
-            }
-        }
-
-        $db->setOption('idxname_format', $idxname_format);
-        return $res;
-    }
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * @package MDB2
+ * @category Database
+ */
+
+/**
+ * These are constants for the tableInfo-function
+ * they are bitwised or'ed. so if there are more constants to be defined
+ * in the future, adjust MDB2_TABLEINFO_FULL accordingly
+ */
+
+define('MDB2_TABLEINFO_ORDER',      1);
+define('MDB2_TABLEINFO_ORDERTABLE', 2);
+define('MDB2_TABLEINFO_FULL',       3);
+
+/**
+ * Base class for the schema reverse engineering module that is extended by each MDB2 driver
+ *
+ * To load this module in the MDB2 object:
+ * $mdb->loadModule('Reverse');
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
+{
+    // {{{ splitTableSchema()
+
+    /**
+     * Split the "[owner|schema].table" notation into an array
+     *
+     * @param string $table [schema and] table name
+     *
+     * @return array array(schema, table)
+     * @access private
+     */
+    function splitTableSchema($table)
+    {
+        $ret = array();
+        if (strpos($table, '.') !== false) {
+            return explode('.', $table);
+        }
+        return array(null, $table);
+    }
+
+    // }}}
+    // {{{ getTableFieldDefinition()
+
+    /**
+     * Get the structure of a field into an array
+     *
+     * @param string    $table     name of table that should be used in method
+     * @param string    $field     name of field that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure.
+     *          The returned array contains an array for each field definition,
+     *          with all or some of these indices, depending on the field data type:
+     *          [notnull] [nativetype] [length] [fixed] [default] [type] [mdb2type]
+     * @access public
+     */
+    function getTableFieldDefinition($table, $field)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ getTableIndexDefinition()
+
+    /**
+     * Get the structure of an index into an array
+     *
+     * @param string    $table      name of table that should be used in method
+     * @param string    $index      name of index that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     *          The returned array has this structure:
+     *          </pre>
+     *          array (
+     *              [fields] => array (
+     *                  [field1name] => array() // one entry per each field covered
+     *                  [field2name] => array() // by the index
+     *                  [field3name] => array(
+     *                      [sorting] => ascending
+     *                  )
+     *              )
+     *          );
+     *          </pre>
+     * @access public
+     */
+    function getTableIndexDefinition($table, $index)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ getTableConstraintDefinition()
+
+    /**
+     * Get the structure of an constraints into an array
+     *
+     * @param string    $table      name of table that should be used in method
+     * @param string    $index      name of index that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     *          The returned array has this structure:
+     *          <pre>
+     *          array (
+     *              [primary] => 0
+     *              [unique]  => 0
+     *              [foreign] => 1
+     *              [check]   => 0
+     *              [fields] => array (
+     *                  [field1name] => array() // one entry per each field covered
+     *                  [field2name] => array() // by the index
+     *                  [field3name] => array(
+     *                      [sorting]  => ascending
+     *                      [position] => 3
+     *                  )
+     *              )
+     *              [references] => array(
+     *                  [table] => name
+     *                  [fields] => array(
+     *                      [field1name] => array(  //one entry per each referenced field
+     *                           [position] => 1
+     *                      )
+     *                  )
+     *              )
+     *              [deferrable] => 0
+     *              [initiallydeferred] => 0
+     *              [onupdate] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
+     *              [ondelete] => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION
+     *              [match] => SIMPLE|PARTIAL|FULL
+     *          );
+     *          </pre>
+     * @access public
+     */
+    function getTableConstraintDefinition($table, $index)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ getSequenceDefinition()
+
+    /**
+     * Get the structure of a sequence into an array
+     *
+     * @param string    $sequence   name of sequence that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     *          The returned array has this structure:
+     *          <pre>
+     *          array (
+     *              [start] => n
+     *          );
+     *          </pre>
+     * @access public
+     */
+    function getSequenceDefinition($sequence)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $start = $db->currId($sequence);
+        if (PEAR::isError($start)) {
+            return $start;
+        }
+        if ($db->supports('current_id')) {
+            $start++;
+        } else {
+            $db->warnings[] = 'database does not support getting current
+                sequence value, the sequence value was incremented';
+        }
+        $definition = array();
+        if ($start != 1) {
+            $definition = array('start' => $start);
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTriggerDefinition()
+
+    /**
+     * Get the structure of a trigger into an array
+     *
+     * EXPERIMENTAL
+     *
+     * WARNING: this function is experimental and may change the returned value 
+     * at any time until labelled as non-experimental
+     *
+     * @param string    $trigger    name of trigger that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     *          The returned array has this structure:
+     *          <pre>
+     *          array (
+     *              [trigger_name]    => 'trigger name',
+     *              [table_name]      => 'table name',
+     *              [trigger_body]    => 'trigger body definition',
+     *              [trigger_type]    => 'BEFORE' | 'AFTER',
+     *              [trigger_event]   => 'INSERT' | 'UPDATE' | 'DELETE'
+     *                  //or comma separated list of multiple events, when supported
+     *              [trigger_enabled] => true|false
+     *              [trigger_comment] => 'trigger comment',
+     *          );
+     *          </pre>
+     *          The oci8 driver also returns a [when_clause] index.
+     * @access public
+     */
+    function getTriggerDefinition($trigger)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+            'method not implemented', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ tableInfo()
+
+    /**
+     * Returns information about a table or a result set
+     *
+     * The format of the resulting array depends on which <var>$mode</var>
+     * you select.  The sample output below is based on this query:
+     * <pre>
+     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
+     *    FROM tblFoo
+     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId
+     * </pre>
+     *
+     * <ul>
+     * <li>
+     *
+     * <kbd>null</kbd> (default)
+     *   <pre>
+     *   [0] => Array (
+     *       [table] => tblFoo
+     *       [name] => fldId
+     *       [type] => int
+     *       [len] => 11
+     *       [flags] => primary_key not_null
+     *   )
+     *   [1] => Array (
+     *       [table] => tblFoo
+     *       [name] => fldPhone
+     *       [type] => string
+     *       [len] => 20
+     *       [flags] =>
+     *   )
+     *   [2] => Array (
+     *       [table] => tblBar
+     *       [name] => fldId
+     *       [type] => int
+     *       [len] => 11
+     *       [flags] => primary_key not_null
+     *   )
+     *   </pre>
+     *
+     * </li><li>
+     *
+     * <kbd>MDB2_TABLEINFO_ORDER</kbd>
+     *
+     *   <p>In addition to the information found in the default output,
+     *   a notation of the number of columns is provided by the
+     *   <samp>num_fields</samp> element while the <samp>order</samp>
+     *   element provides an array with the column names as the keys and
+     *   their location index number (corresponding to the keys in the
+     *   the default output) as the values.</p>
+     *
+     *   <p>If a result set has identical field names, the last one is
+     *   used.</p>
+     *
+     *   <pre>
+     *   [num_fields] => 3
+     *   [order] => Array (
+     *       [fldId] => 2
+     *       [fldTrans] => 1
+     *   )
+     *   </pre>
+     *
+     * </li><li>
+     *
+     * <kbd>MDB2_TABLEINFO_ORDERTABLE</kbd>
+     *
+     *   <p>Similar to <kbd>MDB2_TABLEINFO_ORDER</kbd> but adds more
+     *   dimensions to the array in which the table names are keys and
+     *   the field names are sub-keys.  This is helpful for queries that
+     *   join tables which have identical field names.</p>
+     *
+     *   <pre>
+     *   [num_fields] => 3
+     *   [ordertable] => Array (
+     *       [tblFoo] => Array (
+     *           [fldId] => 0
+     *           [fldPhone] => 1
+     *       )
+     *       [tblBar] => Array (
+     *           [fldId] => 2
+     *       )
+     *   )
+     *   </pre>
+     *
+     * </li>
+     * </ul>
+     *
+     * The <samp>flags</samp> element contains a space separated list
+     * of extra information about the field.  This data is inconsistent
+     * between DBMS's due to the way each DBMS works.
+     *   + <samp>primary_key</samp>
+     *   + <samp>unique_key</samp>
+     *   + <samp>multiple_key</samp>
+     *   + <samp>not_null</samp>
+     *
+     * Most DBMS's only provide the <samp>table</samp> and <samp>flags</samp>
+     * elements if <var>$result</var> is a table name.  The following DBMS's
+     * provide full information from queries:
+     *   + fbsql
+     *   + mysql
+     *
+     * If the 'portability' option has <samp>MDB2_PORTABILITY_FIX_CASE</samp>
+     * turned on, the names of tables and fields will be lower or upper cased.
+     *
+     * @param object|string  $result  MDB2_result object from a query or a
+     *                                string containing the name of a table.
+     *                                While this also accepts a query result
+     *                                resource identifier, this behavior is
+     *                                deprecated.
+     * @param int  $mode   either unused or one of the tableInfo modes:
+     *                     <kbd>MDB2_TABLEINFO_ORDERTABLE</kbd>,
+     *                     <kbd>MDB2_TABLEINFO_ORDER</kbd> or
+     *                     <kbd>MDB2_TABLEINFO_FULL</kbd> (which does both).
+     *                     These are bitwise, so the first two can be
+     *                     combined using <kbd>|</kbd>.
+     *
+     * @return array  an associative array with the information requested.
+     *                 A MDB2_Error object on failure.
+     *
+     * @see MDB2_Driver_Common::setOption()
+     */
+    function tableInfo($result, $mode = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if (!is_string($result)) {
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'method not implemented', __FUNCTION__);
+        }
+
+        $db->loadModule('Manager', null, true);
+        $fields = $db->manager->listTableFields($result);
+        if (PEAR::isError($fields)) {
+            return $fields;
+        }
+
+        $flags = array();
+
+        $idxname_format = $db->getOption('idxname_format');
+        $db->setOption('idxname_format', '%s');
+
+        $indexes = $db->manager->listTableIndexes($result);
+        if (PEAR::isError($indexes)) {
+            $db->setOption('idxname_format', $idxname_format);
+            return $indexes;
+        }
+
+        foreach ($indexes as $index) {
+            $definition = $this->getTableIndexDefinition($result, $index);
+            if (PEAR::isError($definition)) {
+                $db->setOption('idxname_format', $idxname_format);
+                return $definition;
+            }
+            if (count($definition['fields']) > 1) {
+                foreach ($definition['fields'] as $field => $sort) {
+                    $flags[$field] = 'multiple_key';
+                }
+            }
+        }
+
+        $constraints = $db->manager->listTableConstraints($result);
+        if (PEAR::isError($constraints)) {
+            return $constraints;
+        }
+
+        foreach ($constraints as $constraint) {
+            $definition = $this->getTableConstraintDefinition($result, $constraint);
+            if (PEAR::isError($definition)) {
+                $db->setOption('idxname_format', $idxname_format);
+                return $definition;
+            }
+            $flag = !empty($definition['primary'])
+                ? 'primary_key' : (!empty($definition['unique'])
+                    ? 'unique_key' : false);
+            if ($flag) {
+                foreach ($definition['fields'] as $field => $sort) {
+                    if (empty($flags[$field]) || $flags[$field] != 'primary_key') {
+                        $flags[$field] = $flag;
+                    }
+                }
+            }
+        }
+
+        $res = array();
+
+        if ($mode) {
+            $res['num_fields'] = count($fields);
+        }
+
+        foreach ($fields as $i => $field) {
+            $definition = $this->getTableFieldDefinition($result, $field);
+            if (PEAR::isError($definition)) {
+                $db->setOption('idxname_format', $idxname_format);
+                return $definition;
+            }
+            $res[$i] = $definition[0];
+            $res[$i]['name'] = $field;
+            $res[$i]['table'] = $result;
+            $res[$i]['type'] = preg_replace('/^([a-z]+).*$/i', '\\1', trim($definition[0]['nativetype']));
+            // 'primary_key', 'unique_key', 'multiple_key'
+            $res[$i]['flags'] = empty($flags[$field]) ? '' : $flags[$field];
+            // not_null', 'unsigned', 'auto_increment', 'default_[rawencodedvalue]'
+            if (!empty($res[$i]['notnull'])) {
+                $res[$i]['flags'].= ' not_null';
+            }
+            if (!empty($res[$i]['unsigned'])) {
+                $res[$i]['flags'].= ' unsigned';
+            }
+            if (!empty($res[$i]['auto_increment'])) {
+                $res[$i]['flags'].= ' autoincrement';
+            }
+            if (!empty($res[$i]['default'])) {
+                $res[$i]['flags'].= ' default_'.rawurlencode($res[$i]['default']);
+            }
+
+            if ($mode & MDB2_TABLEINFO_ORDER) {
+                $res['order'][$res[$i]['name']] = $i;
+            }
+            if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
+                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
+            }
+        }
+
+        $db->setOption('idxname_format', $idxname_format);
+        return $res;
+    }
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Reverse/mysql.php b/3rdparty/MDB2/Driver/Reverse/mysql.php
index 7b9b4e0019cc44a34b6e2cd34e826186f10144ab..8ebdc9979bcf9efa824e451967741ff986cd8dc4 100644
--- a/3rdparty/MDB2/Driver/Reverse/mysql.php
+++ b/3rdparty/MDB2/Driver/Reverse/mysql.php
@@ -1,546 +1,546 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Reverse/Common.php';
-
-/**
- * MDB2 MySQL driver for the schema reverse engineering module
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- * @author  Lorenzo Alberton <l.alberton@quipo.it>
- */
-class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
-{
-    // {{{ getTableFieldDefinition()
-
-    /**
-     * Get the structure of a field into an array
-     *
-     * @param string $table_name name of table that should be used in method
-     * @param string $field_name name of field that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableFieldDefinition($table_name, $field_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $result = $db->loadModule('Datatype', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $table = $db->quoteIdentifier($table, true);
-        $query = "SHOW FULL COLUMNS FROM $table LIKE ".$db->quote($field_name);
-        $columns = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($columns)) {
-            return $columns;
-        }
-        foreach ($columns as $column) {
-            $column = array_change_key_case($column, CASE_LOWER);
-            $column['name'] = $column['field'];
-            unset($column['field']);
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($db->options['field_case'] == CASE_LOWER) {
-                    $column['name'] = strtolower($column['name']);
-                } else {
-                    $column['name'] = strtoupper($column['name']);
-                }
-            } else {
-                $column = array_change_key_case($column, $db->options['field_case']);
-            }
-            if ($field_name == $column['name']) {
-                $mapped_datatype = $db->datatype->mapNativeDatatype($column);
-                if (PEAR::isError($mapped_datatype)) {
-                    return $mapped_datatype;
-                }
-                list($types, $length, $unsigned, $fixed) = $mapped_datatype;
-                $notnull = false;
-                if (empty($column['null']) || $column['null'] !== 'YES') {
-                    $notnull = true;
-                }
-                $default = false;
-                if (array_key_exists('default', $column)) {
-                    $default = $column['default'];
-                    if ((null === $default) && $notnull) {
-                        $default = '';
-                    }
-                }
-                $definition[0] = array(
-                    'notnull' => $notnull,
-                    'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
-                );
-                $autoincrement = false;
-                if (!empty($column['extra'])) {
-                    if ($column['extra'] == 'auto_increment') {
-                        $autoincrement = true;
-                    } else {
-                        $definition[0]['extra'] = $column['extra'];
-                    }
-                }
-                $collate = null;
-                if (!empty($column['collation'])) {
-                    $collate = $column['collation'];
-                    $charset = preg_replace('/(.+?)(_.+)?/', '$1', $collate);
-                }
-
-                if (null !== $length) {
-                    $definition[0]['length'] = $length;
-                }
-                if (null !== $unsigned) {
-                    $definition[0]['unsigned'] = $unsigned;
-                }
-                if (null !== $fixed) {
-                    $definition[0]['fixed'] = $fixed;
-                }
-                if ($default !== false) {
-                    $definition[0]['default'] = $default;
-                }
-                if ($autoincrement !== false) {
-                    $definition[0]['autoincrement'] = $autoincrement;
-                }
-                if (null !== $collate) {
-                    $definition[0]['collate'] = $collate;
-                    $definition[0]['charset'] = $charset;
-                }
-                foreach ($types as $key => $type) {
-                    $definition[$key] = $definition[0];
-                    if ($type == 'clob' || $type == 'blob') {
-                        unset($definition[$key]['default']);
-                    } elseif ($type == 'timestamp' && $notnull && empty($definition[$key]['default'])) {
-                        $definition[$key]['default'] = '0000-00-00 00:00:00';
-                    }
-                    $definition[$key]['type'] = $type;
-                    $definition[$key]['mdb2type'] = $type;
-                }
-                return $definition;
-            }
-        }
-
-        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-            'it was not specified an existing table column', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ getTableIndexDefinition()
-
-    /**
-     * Get the structure of an index into an array
-     *
-     * @param string $table_name name of table that should be used in method
-     * @param string $index_name name of index that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableIndexDefinition($table_name, $index_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $table = $db->quoteIdentifier($table, true);
-        $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */";
-        $index_name_mdb2 = $db->getIndexName($index_name);
-        $result = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2)));
-        if (!PEAR::isError($result) && (null !== $result)) {
-            // apply 'idxname_format' only if the query succeeded, otherwise
-            // fallback to the given $index_name, without transformation
-            $index_name = $index_name_mdb2;
-        }
-        $result = $db->query(sprintf($query, $db->quote($index_name)));
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $colpos = 1;
-        $definition = array();
-        while (is_array($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC))) {
-            $row = array_change_key_case($row, CASE_LOWER);
-            $key_name = $row['key_name'];
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($db->options['field_case'] == CASE_LOWER) {
-                    $key_name = strtolower($key_name);
-                } else {
-                    $key_name = strtoupper($key_name);
-                }
-            }
-            if ($index_name == $key_name) {
-                if (!$row['non_unique']) {
-                    return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                        $index_name . ' is not an existing table index', __FUNCTION__);
-                }
-                $column_name = $row['column_name'];
-                if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                    if ($db->options['field_case'] == CASE_LOWER) {
-                        $column_name = strtolower($column_name);
-                    } else {
-                        $column_name = strtoupper($column_name);
-                    }
-                }
-                $definition['fields'][$column_name] = array(
-                    'position' => $colpos++
-                );
-                if (!empty($row['collation'])) {
-                    $definition['fields'][$column_name]['sorting'] = ($row['collation'] == 'A'
-                        ? 'ascending' : 'descending');
-                }
-            }
-        }
-        $result->free();
-        if (empty($definition['fields'])) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                $index_name . ' is not an existing table index', __FUNCTION__);
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTableConstraintDefinition()
-
-    /**
-     * Get the structure of a constraint into an array
-     *
-     * @param string $table_name      name of table that should be used in method
-     * @param string $constraint_name name of constraint that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableConstraintDefinition($table_name, $constraint_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table_name);
-        $constraint_name_original = $constraint_name;
-
-        $table = $db->quoteIdentifier($table, true);
-        $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */";
-        if (strtolower($constraint_name) != 'primary') {
-            $constraint_name_mdb2 = $db->getIndexName($constraint_name);
-            $result = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2)));
-            if (!PEAR::isError($result) && (null !== $result)) {
-                // apply 'idxname_format' only if the query succeeded, otherwise
-                // fallback to the given $index_name, without transformation
-                $constraint_name = $constraint_name_mdb2;
-            }
-        }
-        $result = $db->query(sprintf($query, $db->quote($constraint_name)));
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $colpos = 1;
-        //default values, eventually overridden
-        $definition = array(
-            'primary' => false,
-            'unique'  => false,
-            'foreign' => false,
-            'check'   => false,
-            'fields'  => array(),
-            'references' => array(
-                'table'  => '',
-                'fields' => array(),
-            ),
-            'onupdate'  => '',
-            'ondelete'  => '',
-            'match'     => '',
-            'deferrable'        => false,
-            'initiallydeferred' => false,
-        );
-        while (is_array($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC))) {
-            $row = array_change_key_case($row, CASE_LOWER);
-            $key_name = $row['key_name'];
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($db->options['field_case'] == CASE_LOWER) {
-                    $key_name = strtolower($key_name);
-                } else {
-                    $key_name = strtoupper($key_name);
-                }
-            }
-            if ($constraint_name == $key_name) {
-                if ($row['non_unique']) {
-                    //FOREIGN KEY?
-                    return $this->_getTableFKConstraintDefinition($table, $constraint_name_original, $definition);
-                }
-                if ($row['key_name'] == 'PRIMARY') {
-                    $definition['primary'] = true;
-                } elseif (!$row['non_unique']) {
-                    $definition['unique'] = true;
-                }
-                $column_name = $row['column_name'];
-                if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                    if ($db->options['field_case'] == CASE_LOWER) {
-                        $column_name = strtolower($column_name);
-                    } else {
-                        $column_name = strtoupper($column_name);
-                    }
-                }
-                $definition['fields'][$column_name] = array(
-                    'position' => $colpos++
-                );
-                if (!empty($row['collation'])) {
-                    $definition['fields'][$column_name]['sorting'] = ($row['collation'] == 'A'
-                        ? 'ascending' : 'descending');
-                }
-            }
-        }
-        $result->free();
-        if (empty($definition['fields'])) {
-            return $this->_getTableFKConstraintDefinition($table, $constraint_name_original, $definition);
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ _getTableFKConstraintDefinition()
-    
-    /**
-     * Get the FK definition from the CREATE TABLE statement
-     *
-     * @param string $table           table name
-     * @param string $constraint_name constraint name
-     * @param array  $definition      default values for constraint definition
-     *
-     * @return array|PEAR_Error
-     * @access private
-     */
-    function _getTableFKConstraintDefinition($table, $constraint_name, $definition)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        //Use INFORMATION_SCHEMA instead?
-        //SELECT *
-        //  FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
-        // WHERE CONSTRAINT_SCHEMA = '$dbname'
-        //   AND TABLE_NAME = '$table'
-        //   AND CONSTRAINT_NAME = '$constraint_name';
-        $query = 'SHOW CREATE TABLE '. $db->escape($table);
-        $constraint = $db->queryOne($query, 'text', 1);
-        if (!PEAR::isError($constraint) && !empty($constraint)) {
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($db->options['field_case'] == CASE_LOWER) {
-                    $constraint = strtolower($constraint);
-                } else {
-                    $constraint = strtoupper($constraint);
-                }
-            }
-            $constraint_name_original = $constraint_name;
-            $constraint_name = $db->getIndexName($constraint_name);
-            $pattern = '/\bCONSTRAINT\s+'.$constraint_name.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i';
-            if (!preg_match($pattern, str_replace('`', '', $constraint), $matches)) {
-                //fallback to original constraint name
-                $pattern = '/\bCONSTRAINT\s+'.$constraint_name_original.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i';
-            }
-            if (preg_match($pattern, str_replace('`', '', $constraint), $matches)) {
-                $definition['foreign'] = true;
-                $column_names = explode(',', $matches[1]);
-                $referenced_cols = explode(',', $matches[3]);
-                $definition['references'] = array(
-                    'table'  => $matches[2],
-                    'fields' => array(),
-                );
-                $colpos = 1;
-                foreach ($column_names as $column_name) {
-                    $definition['fields'][trim($column_name)] = array(
-                        'position' => $colpos++
-                    );
-                }
-                $colpos = 1;
-                foreach ($referenced_cols as $column_name) {
-                    $definition['references']['fields'][trim($column_name)] = array(
-                        'position' => $colpos++
-                    );
-                }
-                $definition['ondelete'] = empty($matches[4]) ? 'RESTRICT' : strtoupper($matches[4]);
-                $definition['onupdate'] = empty($matches[5]) ? 'RESTRICT' : strtoupper($matches[5]);
-                $definition['match']    = 'SIMPLE';
-                return $definition;
-            }
-        }
-        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ getTriggerDefinition()
-
-    /**
-     * Get the structure of a trigger into an array
-     *
-     * EXPERIMENTAL
-     *
-     * WARNING: this function is experimental and may change the returned value
-     * at any time until labelled as non-experimental
-     *
-     * @param string    $trigger    name of trigger that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTriggerDefinition($trigger)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = 'SELECT trigger_name,
-                         event_object_table AS table_name,
-                         action_statement AS trigger_body,
-                         action_timing AS trigger_type,
-                         event_manipulation AS trigger_event
-                    FROM information_schema.triggers
-                   WHERE trigger_name = '. $db->quote($trigger, 'text');
-        $types = array(
-            'trigger_name'    => 'text',
-            'table_name'      => 'text',
-            'trigger_body'    => 'text',
-            'trigger_type'    => 'text',
-            'trigger_event'   => 'text',
-        );
-        $def = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($def)) {
-            return $def;
-        }
-        $def['trigger_comment'] = '';
-        $def['trigger_enabled'] = true;
-        return $def;
-    }
-
-    // }}}
-    // {{{ tableInfo()
-
-    /**
-     * Returns information about a table or a result set
-     *
-     * @param object|string  $result  MDB2_result object from a query or a
-     *                                 string containing the name of a table.
-     *                                 While this also accepts a query result
-     *                                 resource identifier, this behavior is
-     *                                 deprecated.
-     * @param int            $mode    a valid tableInfo mode
-     *
-     * @return array  an associative array with the information requested.
-     *                 A MDB2_Error object on failure.
-     *
-     * @see MDB2_Driver_Common::setOption()
-     */
-    function tableInfo($result, $mode = null)
-    {
-        if (is_string($result)) {
-           return parent::tableInfo($result, $mode);
-        }
-
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result;
-        if (!is_resource($resource)) {
-            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                'Could not generate result resource', __FUNCTION__);
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            if ($db->options['field_case'] == CASE_LOWER) {
-                $case_func = 'strtolower';
-            } else {
-                $case_func = 'strtoupper';
-            }
-        } else {
-            $case_func = 'strval';
-        }
-
-        $count = @mysql_num_fields($resource);
-        $res   = array();
-        if ($mode) {
-            $res['num_fields'] = $count;
-        }
-
-        $db->loadModule('Datatype', null, true);
-        for ($i = 0; $i < $count; $i++) {
-            $res[$i] = array(
-                'table'  => $case_func(@mysql_field_table($resource, $i)),
-                'name'   => $case_func(@mysql_field_name($resource, $i)),
-                'type'   => @mysql_field_type($resource, $i),
-                'length' => @mysql_field_len($resource, $i),
-                'flags'  => @mysql_field_flags($resource, $i),
-            );
-            if ($res[$i]['type'] == 'string') {
-                $res[$i]['type'] = 'char';
-            } elseif ($res[$i]['type'] == 'unknown') {
-                $res[$i]['type'] = 'decimal';
-            }
-            $mdb2type_info = $db->datatype->mapNativeDatatype($res[$i]);
-            if (PEAR::isError($mdb2type_info)) {
-               return $mdb2type_info;
-            }
-            $res[$i]['mdb2type'] = $mdb2type_info[0][0];
-            if ($mode & MDB2_TABLEINFO_ORDER) {
-                $res['order'][$res[$i]['name']] = $i;
-            }
-            if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
-                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
-            }
-        }
-
-        return $res;
-    }
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Reverse/Common.php';
+
+/**
+ * MDB2 MySQL driver for the schema reverse engineering module
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ * @author  Lorenzo Alberton <l.alberton@quipo.it>
+ */
+class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
+{
+    // {{{ getTableFieldDefinition()
+
+    /**
+     * Get the structure of a field into an array
+     *
+     * @param string $table_name name of table that should be used in method
+     * @param string $field_name name of field that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableFieldDefinition($table_name, $field_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $result = $db->loadModule('Datatype', null, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $table = $db->quoteIdentifier($table, true);
+        $query = "SHOW FULL COLUMNS FROM $table LIKE ".$db->quote($field_name);
+        $columns = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($columns)) {
+            return $columns;
+        }
+        foreach ($columns as $column) {
+            $column = array_change_key_case($column, CASE_LOWER);
+            $column['name'] = $column['field'];
+            unset($column['field']);
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($db->options['field_case'] == CASE_LOWER) {
+                    $column['name'] = strtolower($column['name']);
+                } else {
+                    $column['name'] = strtoupper($column['name']);
+                }
+            } else {
+                $column = array_change_key_case($column, $db->options['field_case']);
+            }
+            if ($field_name == $column['name']) {
+                $mapped_datatype = $db->datatype->mapNativeDatatype($column);
+                if (PEAR::isError($mapped_datatype)) {
+                    return $mapped_datatype;
+                }
+                list($types, $length, $unsigned, $fixed) = $mapped_datatype;
+                $notnull = false;
+                if (empty($column['null']) || $column['null'] !== 'YES') {
+                    $notnull = true;
+                }
+                $default = false;
+                if (array_key_exists('default', $column)) {
+                    $default = $column['default'];
+                    if ((null === $default) && $notnull) {
+                        $default = '';
+                    }
+                }
+                $definition[0] = array(
+                    'notnull' => $notnull,
+                    'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
+                );
+                $autoincrement = false;
+                if (!empty($column['extra'])) {
+                    if ($column['extra'] == 'auto_increment') {
+                        $autoincrement = true;
+                    } else {
+                        $definition[0]['extra'] = $column['extra'];
+                    }
+                }
+                $collate = null;
+                if (!empty($column['collation'])) {
+                    $collate = $column['collation'];
+                    $charset = preg_replace('/(.+?)(_.+)?/', '$1', $collate);
+                }
+
+                if (null !== $length) {
+                    $definition[0]['length'] = $length;
+                }
+                if (null !== $unsigned) {
+                    $definition[0]['unsigned'] = $unsigned;
+                }
+                if (null !== $fixed) {
+                    $definition[0]['fixed'] = $fixed;
+                }
+                if ($default !== false) {
+                    $definition[0]['default'] = $default;
+                }
+                if ($autoincrement !== false) {
+                    $definition[0]['autoincrement'] = $autoincrement;
+                }
+                if (null !== $collate) {
+                    $definition[0]['collate'] = $collate;
+                    $definition[0]['charset'] = $charset;
+                }
+                foreach ($types as $key => $type) {
+                    $definition[$key] = $definition[0];
+                    if ($type == 'clob' || $type == 'blob') {
+                        unset($definition[$key]['default']);
+                    } elseif ($type == 'timestamp' && $notnull && empty($definition[$key]['default'])) {
+                        $definition[$key]['default'] = '0000-00-00 00:00:00';
+                    }
+                    $definition[$key]['type'] = $type;
+                    $definition[$key]['mdb2type'] = $type;
+                }
+                return $definition;
+            }
+        }
+
+        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+            'it was not specified an existing table column', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ getTableIndexDefinition()
+
+    /**
+     * Get the structure of an index into an array
+     *
+     * @param string $table_name name of table that should be used in method
+     * @param string $index_name name of index that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableIndexDefinition($table_name, $index_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $table = $db->quoteIdentifier($table, true);
+        $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */";
+        $index_name_mdb2 = $db->getIndexName($index_name);
+        $result = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2)));
+        if (!PEAR::isError($result) && (null !== $result)) {
+            // apply 'idxname_format' only if the query succeeded, otherwise
+            // fallback to the given $index_name, without transformation
+            $index_name = $index_name_mdb2;
+        }
+        $result = $db->query(sprintf($query, $db->quote($index_name)));
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $colpos = 1;
+        $definition = array();
+        while (is_array($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC))) {
+            $row = array_change_key_case($row, CASE_LOWER);
+            $key_name = $row['key_name'];
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($db->options['field_case'] == CASE_LOWER) {
+                    $key_name = strtolower($key_name);
+                } else {
+                    $key_name = strtoupper($key_name);
+                }
+            }
+            if ($index_name == $key_name) {
+                if (!$row['non_unique']) {
+                    return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        $index_name . ' is not an existing table index', __FUNCTION__);
+                }
+                $column_name = $row['column_name'];
+                if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                    if ($db->options['field_case'] == CASE_LOWER) {
+                        $column_name = strtolower($column_name);
+                    } else {
+                        $column_name = strtoupper($column_name);
+                    }
+                }
+                $definition['fields'][$column_name] = array(
+                    'position' => $colpos++
+                );
+                if (!empty($row['collation'])) {
+                    $definition['fields'][$column_name]['sorting'] = ($row['collation'] == 'A'
+                        ? 'ascending' : 'descending');
+                }
+            }
+        }
+        $result->free();
+        if (empty($definition['fields'])) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                $index_name . ' is not an existing table index', __FUNCTION__);
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTableConstraintDefinition()
+
+    /**
+     * Get the structure of a constraint into an array
+     *
+     * @param string $table_name      name of table that should be used in method
+     * @param string $constraint_name name of constraint that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableConstraintDefinition($table_name, $constraint_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+        $constraint_name_original = $constraint_name;
+
+        $table = $db->quoteIdentifier($table, true);
+        $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */";
+        if (strtolower($constraint_name) != 'primary') {
+            $constraint_name_mdb2 = $db->getIndexName($constraint_name);
+            $result = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2)));
+            if (!PEAR::isError($result) && (null !== $result)) {
+                // apply 'idxname_format' only if the query succeeded, otherwise
+                // fallback to the given $index_name, without transformation
+                $constraint_name = $constraint_name_mdb2;
+            }
+        }
+        $result = $db->query(sprintf($query, $db->quote($constraint_name)));
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $colpos = 1;
+        //default values, eventually overridden
+        $definition = array(
+            'primary' => false,
+            'unique'  => false,
+            'foreign' => false,
+            'check'   => false,
+            'fields'  => array(),
+            'references' => array(
+                'table'  => '',
+                'fields' => array(),
+            ),
+            'onupdate'  => '',
+            'ondelete'  => '',
+            'match'     => '',
+            'deferrable'        => false,
+            'initiallydeferred' => false,
+        );
+        while (is_array($row = $result->fetchRow(MDB2_FETCHMODE_ASSOC))) {
+            $row = array_change_key_case($row, CASE_LOWER);
+            $key_name = $row['key_name'];
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($db->options['field_case'] == CASE_LOWER) {
+                    $key_name = strtolower($key_name);
+                } else {
+                    $key_name = strtoupper($key_name);
+                }
+            }
+            if ($constraint_name == $key_name) {
+                if ($row['non_unique']) {
+                    //FOREIGN KEY?
+                    return $this->_getTableFKConstraintDefinition($table, $constraint_name_original, $definition);
+                }
+                if ($row['key_name'] == 'PRIMARY') {
+                    $definition['primary'] = true;
+                } elseif (!$row['non_unique']) {
+                    $definition['unique'] = true;
+                }
+                $column_name = $row['column_name'];
+                if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                    if ($db->options['field_case'] == CASE_LOWER) {
+                        $column_name = strtolower($column_name);
+                    } else {
+                        $column_name = strtoupper($column_name);
+                    }
+                }
+                $definition['fields'][$column_name] = array(
+                    'position' => $colpos++
+                );
+                if (!empty($row['collation'])) {
+                    $definition['fields'][$column_name]['sorting'] = ($row['collation'] == 'A'
+                        ? 'ascending' : 'descending');
+                }
+            }
+        }
+        $result->free();
+        if (empty($definition['fields'])) {
+            return $this->_getTableFKConstraintDefinition($table, $constraint_name_original, $definition);
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ _getTableFKConstraintDefinition()
+    
+    /**
+     * Get the FK definition from the CREATE TABLE statement
+     *
+     * @param string $table           table name
+     * @param string $constraint_name constraint name
+     * @param array  $definition      default values for constraint definition
+     *
+     * @return array|PEAR_Error
+     * @access private
+     */
+    function _getTableFKConstraintDefinition($table, $constraint_name, $definition)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        //Use INFORMATION_SCHEMA instead?
+        //SELECT *
+        //  FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
+        // WHERE CONSTRAINT_SCHEMA = '$dbname'
+        //   AND TABLE_NAME = '$table'
+        //   AND CONSTRAINT_NAME = '$constraint_name';
+        $query = 'SHOW CREATE TABLE '. $db->escape($table);
+        $constraint = $db->queryOne($query, 'text', 1);
+        if (!PEAR::isError($constraint) && !empty($constraint)) {
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($db->options['field_case'] == CASE_LOWER) {
+                    $constraint = strtolower($constraint);
+                } else {
+                    $constraint = strtoupper($constraint);
+                }
+            }
+            $constraint_name_original = $constraint_name;
+            $constraint_name = $db->getIndexName($constraint_name);
+            $pattern = '/\bCONSTRAINT\s+'.$constraint_name.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i';
+            if (!preg_match($pattern, str_replace('`', '', $constraint), $matches)) {
+                //fallback to original constraint name
+                $pattern = '/\bCONSTRAINT\s+'.$constraint_name_original.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i';
+            }
+            if (preg_match($pattern, str_replace('`', '', $constraint), $matches)) {
+                $definition['foreign'] = true;
+                $column_names = explode(',', $matches[1]);
+                $referenced_cols = explode(',', $matches[3]);
+                $definition['references'] = array(
+                    'table'  => $matches[2],
+                    'fields' => array(),
+                );
+                $colpos = 1;
+                foreach ($column_names as $column_name) {
+                    $definition['fields'][trim($column_name)] = array(
+                        'position' => $colpos++
+                    );
+                }
+                $colpos = 1;
+                foreach ($referenced_cols as $column_name) {
+                    $definition['references']['fields'][trim($column_name)] = array(
+                        'position' => $colpos++
+                    );
+                }
+                $definition['ondelete'] = empty($matches[4]) ? 'RESTRICT' : strtoupper($matches[4]);
+                $definition['onupdate'] = empty($matches[5]) ? 'RESTRICT' : strtoupper($matches[5]);
+                $definition['match']    = 'SIMPLE';
+                return $definition;
+            }
+        }
+        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ getTriggerDefinition()
+
+    /**
+     * Get the structure of a trigger into an array
+     *
+     * EXPERIMENTAL
+     *
+     * WARNING: this function is experimental and may change the returned value
+     * at any time until labelled as non-experimental
+     *
+     * @param string    $trigger    name of trigger that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTriggerDefinition($trigger)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = 'SELECT trigger_name,
+                         event_object_table AS table_name,
+                         action_statement AS trigger_body,
+                         action_timing AS trigger_type,
+                         event_manipulation AS trigger_event
+                    FROM information_schema.triggers
+                   WHERE trigger_name = '. $db->quote($trigger, 'text');
+        $types = array(
+            'trigger_name'    => 'text',
+            'table_name'      => 'text',
+            'trigger_body'    => 'text',
+            'trigger_type'    => 'text',
+            'trigger_event'   => 'text',
+        );
+        $def = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($def)) {
+            return $def;
+        }
+        $def['trigger_comment'] = '';
+        $def['trigger_enabled'] = true;
+        return $def;
+    }
+
+    // }}}
+    // {{{ tableInfo()
+
+    /**
+     * Returns information about a table or a result set
+     *
+     * @param object|string  $result  MDB2_result object from a query or a
+     *                                 string containing the name of a table.
+     *                                 While this also accepts a query result
+     *                                 resource identifier, this behavior is
+     *                                 deprecated.
+     * @param int            $mode    a valid tableInfo mode
+     *
+     * @return array  an associative array with the information requested.
+     *                 A MDB2_Error object on failure.
+     *
+     * @see MDB2_Driver_Common::setOption()
+     */
+    function tableInfo($result, $mode = null)
+    {
+        if (is_string($result)) {
+           return parent::tableInfo($result, $mode);
+        }
+
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result;
+        if (!is_resource($resource)) {
+            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                'Could not generate result resource', __FUNCTION__);
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            if ($db->options['field_case'] == CASE_LOWER) {
+                $case_func = 'strtolower';
+            } else {
+                $case_func = 'strtoupper';
+            }
+        } else {
+            $case_func = 'strval';
+        }
+
+        $count = @mysql_num_fields($resource);
+        $res   = array();
+        if ($mode) {
+            $res['num_fields'] = $count;
+        }
+
+        $db->loadModule('Datatype', null, true);
+        for ($i = 0; $i < $count; $i++) {
+            $res[$i] = array(
+                'table'  => $case_func(@mysql_field_table($resource, $i)),
+                'name'   => $case_func(@mysql_field_name($resource, $i)),
+                'type'   => @mysql_field_type($resource, $i),
+                'length' => @mysql_field_len($resource, $i),
+                'flags'  => @mysql_field_flags($resource, $i),
+            );
+            if ($res[$i]['type'] == 'string') {
+                $res[$i]['type'] = 'char';
+            } elseif ($res[$i]['type'] == 'unknown') {
+                $res[$i]['type'] = 'decimal';
+            }
+            $mdb2type_info = $db->datatype->mapNativeDatatype($res[$i]);
+            if (PEAR::isError($mdb2type_info)) {
+               return $mdb2type_info;
+            }
+            $res[$i]['mdb2type'] = $mdb2type_info[0][0];
+            if ($mode & MDB2_TABLEINFO_ORDER) {
+                $res['order'][$res[$i]['name']] = $i;
+            }
+            if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
+                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
+            }
+        }
+
+        return $res;
+    }
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Reverse/pgsql.php b/3rdparty/MDB2/Driver/Reverse/pgsql.php
index 45aa5a1503bc99ce9f6c96f948bc08589679ef0a..eab02f9b9988dc8b9885d6d1fb5aab0ec94586f1 100644
--- a/3rdparty/MDB2/Driver/Reverse/pgsql.php
+++ b/3rdparty/MDB2/Driver/Reverse/pgsql.php
@@ -1,574 +1,574 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Authors: Paul Cooper <pgc@ucecom.com>                                |
-// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
-// +----------------------------------------------------------------------+
-//
-// $Id: pgsql.php 295587 2010-02-28 17:16:38Z quipo $
-
-require_once 'MDB2/Driver/Reverse/Common.php';
-
-/**
- * MDB2 PostGreSQL driver for the schema reverse engineering module
- *
- * @package  MDB2
- * @category Database
- * @author   Paul Cooper <pgc@ucecom.com>
- * @author   Lorenzo Alberton <l.alberton@quipo.it>
- */
-class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
-{
-    // {{{ getTableFieldDefinition()
-
-    /**
-     * Get the structure of a field into an array
-     *
-     * @param string $table_name name of table that should be used in method
-     * @param string $field_name name of field that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableFieldDefinition($table_name, $field_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $result = $db->loadModule('Datatype', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $query = "SELECT a.attname AS name,
-                         t.typname AS type,
-                         CASE a.attlen
-                           WHEN -1 THEN
-	                         CASE t.typname
-	                           WHEN 'numeric' THEN (a.atttypmod / 65536)
-	                           WHEN 'decimal' THEN (a.atttypmod / 65536)
-	                           WHEN 'money'   THEN (a.atttypmod / 65536)
-	                           ELSE CASE a.atttypmod
-                                 WHEN -1 THEN NULL
-	                             ELSE a.atttypmod - 4
-	                           END
-                             END
-	                       ELSE a.attlen
-                         END AS length,
-	                     CASE t.typname
-	                       WHEN 'numeric' THEN (a.atttypmod % 65536) - 4
-	                       WHEN 'decimal' THEN (a.atttypmod % 65536) - 4
-	                       WHEN 'money'   THEN (a.atttypmod % 65536) - 4
-	                       ELSE 0
-                         END AS scale,
-                         a.attnotnull,
-                         a.atttypmod,
-                         a.atthasdef,
-                         (SELECT substring(pg_get_expr(d.adbin, d.adrelid) for 128)
-                            FROM pg_attrdef d
-                           WHERE d.adrelid = a.attrelid
-                             AND d.adnum = a.attnum
-                             AND a.atthasdef
-                         ) as default
-                    FROM pg_attribute a,
-                         pg_class c,
-                         pg_type t
-                   WHERE c.relname = ".$db->quote($table, 'text')."
-                     AND a.atttypid = t.oid
-                     AND c.oid = a.attrelid
-                     AND NOT a.attisdropped
-                     AND a.attnum > 0
-                     AND a.attname = ".$db->quote($field_name, 'text')."
-                ORDER BY a.attnum";
-        $column = $db->queryRow($query, null, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($column)) {
-            return $column;
-        }
-
-        if (empty($column)) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'it was not specified an existing table column', __FUNCTION__);
-        }
-
-        $column = array_change_key_case($column, CASE_LOWER);
-        $mapped_datatype = $db->datatype->mapNativeDatatype($column);
-        if (PEAR::isError($mapped_datatype)) {
-            return $mapped_datatype;
-        }
-        list($types, $length, $unsigned, $fixed) = $mapped_datatype;
-        $notnull = false;
-        if (!empty($column['attnotnull']) && $column['attnotnull'] == 't') {
-            $notnull = true;
-        }
-        $default = null;
-        if ($column['atthasdef'] === 't'
-            && strpos($column['default'], 'NULL') !== 0
-            && !preg_match("/nextval\('([^']+)'/", $column['default'])
-        ) {
-            $pattern = '/^\'(.*)\'::[\w ]+$/i';
-            $default = $column['default'];#substr($column['adsrc'], 1, -1);
-            if ((null === $default) && $notnull) {
-                $default = '';
-            } elseif (!empty($default) && preg_match($pattern, $default)) {
-                //remove data type cast
-                $default = preg_replace ($pattern, '\\1', $default);
-            }
-        }
-        $autoincrement = false;
-        if (preg_match("/nextval\('([^']+)'/", $column['default'], $nextvals)) {
-            $autoincrement = true;
-        }
-        $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']);
-        if (null !== $length) {
-            $definition[0]['length'] = $length;
-        }
-        if (null !== $unsigned) {
-            $definition[0]['unsigned'] = $unsigned;
-        }
-        if (null !== $fixed) {
-            $definition[0]['fixed'] = $fixed;
-        }
-        if ($default !== false) {
-            $definition[0]['default'] = $default;
-        }
-        if ($autoincrement !== false) {
-            $definition[0]['autoincrement'] = $autoincrement;
-        }
-        foreach ($types as $key => $type) {
-            $definition[$key] = $definition[0];
-            if ($type == 'clob' || $type == 'blob') {
-                unset($definition[$key]['default']);
-            }
-            $definition[$key]['type'] = $type;
-            $definition[$key]['mdb2type'] = $type;
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTableIndexDefinition()
-
-    /**
-     * Get the structure of an index into an array
-     *
-     * @param string $table_name name of table that should be used in method
-     * @param string $index_name name of index that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableIndexDefinition($table_name, $index_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $query = 'SELECT relname, indkey FROM pg_index, pg_class';
-        $query.= ' WHERE pg_class.oid = pg_index.indexrelid';
-        $query.= " AND indisunique != 't' AND indisprimary != 't'";
-        $query.= ' AND pg_class.relname = %s';
-        $index_name_mdb2 = $db->getIndexName($index_name);
-        $row = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($row) || empty($row)) {
-            // fallback to the given $index_name, without transformation
-            $row = $db->queryRow(sprintf($query, $db->quote($index_name, 'text')), null, MDB2_FETCHMODE_ASSOC);
-        }
-        if (PEAR::isError($row)) {
-            return $row;
-        }
-
-        if (empty($row)) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'it was not specified an existing table index', __FUNCTION__);
-        }
-
-        $row = array_change_key_case($row, CASE_LOWER);
-
-        $db->loadModule('Manager', null, true);
-        $columns = $db->manager->listTableFields($table_name);
-
-        $definition = array();
-
-        $index_column_numbers = explode(' ', $row['indkey']);
-
-        $colpos = 1;
-        foreach ($index_column_numbers as $number) {
-            $definition['fields'][$columns[($number - 1)]] = array(
-                'position' => $colpos++,
-                'sorting' => 'ascending',
-            );
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTableConstraintDefinition()
-
-    /**
-     * Get the structure of a constraint into an array
-     *
-     * @param string $table_name      name of table that should be used in method
-     * @param string $constraint_name name of constraint that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableConstraintDefinition($table_name, $constraint_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $query = "SELECT c.oid,
-                         c.conname AS constraint_name,
-                         CASE WHEN c.contype = 'c' THEN 1 ELSE 0 END AS \"check\",
-                         CASE WHEN c.contype = 'f' THEN 1 ELSE 0 END AS \"foreign\",
-                         CASE WHEN c.contype = 'p' THEN 1 ELSE 0 END AS \"primary\",
-                         CASE WHEN c.contype = 'u' THEN 1 ELSE 0 END AS \"unique\",
-                         CASE WHEN c.condeferrable = 'f' THEN 0 ELSE 1 END AS deferrable,
-                         CASE WHEN c.condeferred = 'f' THEN 0 ELSE 1 END AS initiallydeferred,
-                         --array_to_string(c.conkey, ' ') AS constraint_key,
-                         t.relname AS table_name,
-                         t2.relname AS references_table,
-                         CASE confupdtype
-                           WHEN 'a' THEN 'NO ACTION'
-                           WHEN 'r' THEN 'RESTRICT'
-                           WHEN 'c' THEN 'CASCADE'
-                           WHEN 'n' THEN 'SET NULL'
-                           WHEN 'd' THEN 'SET DEFAULT'
-                         END AS onupdate,
-                         CASE confdeltype
-                           WHEN 'a' THEN 'NO ACTION'
-                           WHEN 'r' THEN 'RESTRICT'
-                           WHEN 'c' THEN 'CASCADE'
-                           WHEN 'n' THEN 'SET NULL'
-                           WHEN 'd' THEN 'SET DEFAULT'
-                         END AS ondelete,
-                         CASE confmatchtype
-                           WHEN 'u' THEN 'UNSPECIFIED'
-                           WHEN 'f' THEN 'FULL'
-                           WHEN 'p' THEN 'PARTIAL'
-                         END AS match,
-                         --array_to_string(c.confkey, ' ') AS fk_constraint_key,
-                         consrc
-                    FROM pg_constraint c
-               LEFT JOIN pg_class t  ON c.conrelid  = t.oid
-               LEFT JOIN pg_class t2 ON c.confrelid = t2.oid
-                   WHERE c.conname = %s
-                     AND t.relname = " . $db->quote($table, 'text');
-        $constraint_name_mdb2 = $db->getIndexName($constraint_name);
-        $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($row) || empty($row)) {
-            // fallback to the given $index_name, without transformation
-            $constraint_name_mdb2 = $constraint_name;
-            $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
-        }
-        if (PEAR::isError($row)) {
-            return $row;
-        }
-        $uniqueIndex = false;
-        if (empty($row)) {
-            // We might be looking for a UNIQUE index that was not created
-            // as a constraint but should be treated as such.
-            $query = 'SELECT relname AS constraint_name,
-                             indkey,
-                             0 AS "check",
-                             0 AS "foreign",
-                             0 AS "primary",
-                             1 AS "unique",
-                             0 AS deferrable,
-                             0 AS initiallydeferred,
-                             NULL AS references_table,
-                             NULL AS onupdate,
-                             NULL AS ondelete,
-                             NULL AS match
-                        FROM pg_index, pg_class
-                       WHERE pg_class.oid = pg_index.indexrelid
-                         AND indisunique = \'t\'
-                         AND pg_class.relname = %s';
-            $constraint_name_mdb2 = $db->getIndexName($constraint_name);
-            $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
-            if (PEAR::isError($row) || empty($row)) {
-                // fallback to the given $index_name, without transformation
-                $constraint_name_mdb2 = $constraint_name;
-                $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
-            }
-            if (PEAR::isError($row)) {
-                return $row;
-            }
-            if (empty($row)) {
-                return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                    $constraint_name . ' is not an existing table constraint', __FUNCTION__);
-            }
-            $uniqueIndex = true;
-        }
-
-        $row = array_change_key_case($row, CASE_LOWER);
-
-        $definition = array(
-            'primary' => (boolean)$row['primary'],
-            'unique'  => (boolean)$row['unique'],
-            'foreign' => (boolean)$row['foreign'],
-            'check'   => (boolean)$row['check'],
-            'fields'  => array(),
-            'references' => array(
-                'table'  => $row['references_table'],
-                'fields' => array(),
-            ),
-            'deferrable' => (boolean)$row['deferrable'],
-            'initiallydeferred' => (boolean)$row['initiallydeferred'],
-            'onupdate' => $row['onupdate'],
-            'ondelete' => $row['ondelete'],
-            'match'    => $row['match'],
-        );
-
-        if ($uniqueIndex) {
-            $db->loadModule('Manager', null, true);
-            $columns = $db->manager->listTableFields($table_name);
-            $index_column_numbers = explode(' ', $row['indkey']);
-            $colpos = 1;
-            foreach ($index_column_numbers as $number) {
-                $definition['fields'][$columns[($number - 1)]] = array(
-                    'position' => $colpos++,
-                    'sorting'  => 'ascending',
-                );
-            }
-            return $definition;
-        }
-
-        $query = 'SELECT a.attname
-                    FROM pg_constraint c
-               LEFT JOIN pg_class t  ON c.conrelid  = t.oid
-               LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
-                   WHERE c.conname = %s
-                     AND t.relname = ' . $db->quote($table, 'text');
-        $fields = $db->queryCol(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null);
-        if (PEAR::isError($fields)) {
-            return $fields;
-        }
-        $colpos = 1;
-        foreach ($fields as $field) {
-            $definition['fields'][$field] = array(
-                'position' => $colpos++,
-                'sorting' => 'ascending',
-            );
-        }
-        
-        if ($definition['foreign']) {
-            $query = 'SELECT a.attname
-                        FROM pg_constraint c
-                   LEFT JOIN pg_class t  ON c.confrelid  = t.oid
-                   LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.confkey)
-                       WHERE c.conname = %s
-                         AND t.relname = ' . $db->quote($definition['references']['table'], 'text');
-            $foreign_fields = $db->queryCol(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null);
-            if (PEAR::isError($foreign_fields)) {
-                return $foreign_fields;
-            }
-            $colpos = 1;
-            foreach ($foreign_fields as $foreign_field) {
-                $definition['references']['fields'][$foreign_field] = array(
-                    'position' => $colpos++,
-                );
-            }
-        }
-        
-        if ($definition['check']) {
-            $check_def = $db->queryOne("SELECT pg_get_constraintdef(" . $row['oid'] . ", 't')");
-            // ...
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTriggerDefinition()
-
-    /**
-     * Get the structure of a trigger into an array
-     *
-     * EXPERIMENTAL
-     *
-     * WARNING: this function is experimental and may change the returned value
-     * at any time until labelled as non-experimental
-     *
-     * @param string $trigger name of trigger that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     *
-     * @TODO: add support for plsql functions and functions with args
-     */
-    function getTriggerDefinition($trigger)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT trg.tgname AS trigger_name,
-                         tbl.relname AS table_name,
-                         CASE
-                            WHEN p.proname IS NOT NULL THEN 'EXECUTE PROCEDURE ' || p.proname || '();'
-                            ELSE ''
-                         END AS trigger_body,
-                         CASE trg.tgtype & cast(2 as int2)
-                            WHEN 0 THEN 'AFTER'
-                            ELSE 'BEFORE'
-                         END AS trigger_type,
-                         CASE trg.tgtype & cast(28 as int2)
-                            WHEN 16 THEN 'UPDATE'
-                            WHEN 8 THEN 'DELETE'
-                            WHEN 4 THEN 'INSERT'
-                            WHEN 20 THEN 'INSERT, UPDATE'
-                            WHEN 28 THEN 'INSERT, UPDATE, DELETE'
-                            WHEN 24 THEN 'UPDATE, DELETE'
-                            WHEN 12 THEN 'INSERT, DELETE'
-                         END AS trigger_event,
-                         CASE trg.tgenabled
-                            WHEN 'O' THEN 't'
-                            ELSE trg.tgenabled
-                         END AS trigger_enabled,
-                         obj_description(trg.oid, 'pg_trigger') AS trigger_comment
-                    FROM pg_trigger trg,
-                         pg_class tbl,
-                         pg_proc p
-                   WHERE trg.tgrelid = tbl.oid
-                     AND trg.tgfoid = p.oid
-                     AND trg.tgname = ". $db->quote($trigger, 'text');
-        $types = array(
-            'trigger_name'    => 'text',
-            'table_name'      => 'text',
-            'trigger_body'    => 'text',
-            'trigger_type'    => 'text',
-            'trigger_event'   => 'text',
-            'trigger_comment' => 'text',
-            'trigger_enabled' => 'boolean',
-        );
-        return $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC);
-    }
-    
-    // }}}
-    // {{{ tableInfo()
-
-    /**
-     * Returns information about a table or a result set
-     *
-     * NOTE: only supports 'table' and 'flags' if <var>$result</var>
-     * is a table name.
-     *
-     * @param object|string  $result  MDB2_result object from a query or a
-     *                                 string containing the name of a table.
-     *                                 While this also accepts a query result
-     *                                 resource identifier, this behavior is
-     *                                 deprecated.
-     * @param int            $mode    a valid tableInfo mode
-     *
-     * @return array  an associative array with the information requested.
-     *                 A MDB2_Error object on failure.
-     *
-     * @see MDB2_Driver_Common::tableInfo()
-     */
-    function tableInfo($result, $mode = null)
-    {
-        if (is_string($result)) {
-           return parent::tableInfo($result, $mode);
-        }
-
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result;
-        if (!is_resource($resource)) {
-            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                'Could not generate result resource', __FUNCTION__);
-        }
-
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            if ($db->options['field_case'] == CASE_LOWER) {
-                $case_func = 'strtolower';
-            } else {
-                $case_func = 'strtoupper';
-            }
-        } else {
-            $case_func = 'strval';
-        }
-
-        $count = @pg_num_fields($resource);
-        $res   = array();
-
-        if ($mode) {
-            $res['num_fields'] = $count;
-        }
-
-        $db->loadModule('Datatype', null, true);
-        for ($i = 0; $i < $count; $i++) {
-            $res[$i] = array(
-                'table' => function_exists('pg_field_table') ? @pg_field_table($resource, $i) : '',
-                'name'  => $case_func(@pg_field_name($resource, $i)),
-                'type'  => @pg_field_type($resource, $i),
-                'length' => @pg_field_size($resource, $i),
-                'flags' => '',
-            );
-            $mdb2type_info = $db->datatype->mapNativeDatatype($res[$i]);
-            if (PEAR::isError($mdb2type_info)) {
-               return $mdb2type_info;
-            }
-            $res[$i]['mdb2type'] = $mdb2type_info[0][0];
-            if ($mode & MDB2_TABLEINFO_ORDER) {
-                $res['order'][$res[$i]['name']] = $i;
-            }
-            if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
-                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
-            }
-        }
-
-        return $res;
-    }
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Authors: Paul Cooper <pgc@ucecom.com>                                |
+// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+require_once 'MDB2/Driver/Reverse/Common.php';
+
+/**
+ * MDB2 PostGreSQL driver for the schema reverse engineering module
+ *
+ * @package  MDB2
+ * @category Database
+ * @author   Paul Cooper <pgc@ucecom.com>
+ * @author   Lorenzo Alberton <l.alberton@quipo.it>
+ */
+class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
+{
+    // {{{ getTableFieldDefinition()
+
+    /**
+     * Get the structure of a field into an array
+     *
+     * @param string $table_name name of table that should be used in method
+     * @param string $field_name name of field that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableFieldDefinition($table_name, $field_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $result = $db->loadModule('Datatype', null, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $query = "SELECT a.attname AS name,
+                         t.typname AS type,
+                         CASE a.attlen
+                           WHEN -1 THEN
+	                         CASE t.typname
+	                           WHEN 'numeric' THEN (a.atttypmod / 65536)
+	                           WHEN 'decimal' THEN (a.atttypmod / 65536)
+	                           WHEN 'money'   THEN (a.atttypmod / 65536)
+	                           ELSE CASE a.atttypmod
+                                 WHEN -1 THEN NULL
+	                             ELSE a.atttypmod - 4
+	                           END
+                             END
+	                       ELSE a.attlen
+                         END AS length,
+	                     CASE t.typname
+	                       WHEN 'numeric' THEN (a.atttypmod % 65536) - 4
+	                       WHEN 'decimal' THEN (a.atttypmod % 65536) - 4
+	                       WHEN 'money'   THEN (a.atttypmod % 65536) - 4
+	                       ELSE 0
+                         END AS scale,
+                         a.attnotnull,
+                         a.atttypmod,
+                         a.atthasdef,
+                         (SELECT substring(pg_get_expr(d.adbin, d.adrelid) for 128)
+                            FROM pg_attrdef d
+                           WHERE d.adrelid = a.attrelid
+                             AND d.adnum = a.attnum
+                             AND a.atthasdef
+                         ) as default
+                    FROM pg_attribute a,
+                         pg_class c,
+                         pg_type t
+                   WHERE c.relname = ".$db->quote($table, 'text')."
+                     AND a.atttypid = t.oid
+                     AND c.oid = a.attrelid
+                     AND NOT a.attisdropped
+                     AND a.attnum > 0
+                     AND a.attname = ".$db->quote($field_name, 'text')."
+                ORDER BY a.attnum";
+        $column = $db->queryRow($query, null, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($column)) {
+            return $column;
+        }
+
+        if (empty($column)) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'it was not specified an existing table column', __FUNCTION__);
+        }
+
+        $column = array_change_key_case($column, CASE_LOWER);
+        $mapped_datatype = $db->datatype->mapNativeDatatype($column);
+        if (PEAR::isError($mapped_datatype)) {
+            return $mapped_datatype;
+        }
+        list($types, $length, $unsigned, $fixed) = $mapped_datatype;
+        $notnull = false;
+        if (!empty($column['attnotnull']) && $column['attnotnull'] == 't') {
+            $notnull = true;
+        }
+        $default = null;
+        if ($column['atthasdef'] === 't'
+            && strpos($column['default'], 'NULL') !== 0
+            && !preg_match("/nextval\('([^']+)'/", $column['default'])
+        ) {
+            $pattern = '/^\'(.*)\'::[\w ]+$/i';
+            $default = $column['default'];#substr($column['adsrc'], 1, -1);
+            if ((null === $default) && $notnull) {
+                $default = '';
+            } elseif (!empty($default) && preg_match($pattern, $default)) {
+                //remove data type cast
+                $default = preg_replace ($pattern, '\\1', $default);
+            }
+        }
+        $autoincrement = false;
+        if (preg_match("/nextval\('([^']+)'/", $column['default'], $nextvals)) {
+            $autoincrement = true;
+        }
+        $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']);
+        if (null !== $length) {
+            $definition[0]['length'] = $length;
+        }
+        if (null !== $unsigned) {
+            $definition[0]['unsigned'] = $unsigned;
+        }
+        if (null !== $fixed) {
+            $definition[0]['fixed'] = $fixed;
+        }
+        if ($default !== false) {
+            $definition[0]['default'] = $default;
+        }
+        if ($autoincrement !== false) {
+            $definition[0]['autoincrement'] = $autoincrement;
+        }
+        foreach ($types as $key => $type) {
+            $definition[$key] = $definition[0];
+            if ($type == 'clob' || $type == 'blob') {
+                unset($definition[$key]['default']);
+            }
+            $definition[$key]['type'] = $type;
+            $definition[$key]['mdb2type'] = $type;
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTableIndexDefinition()
+
+    /**
+     * Get the structure of an index into an array
+     *
+     * @param string $table_name name of table that should be used in method
+     * @param string $index_name name of index that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableIndexDefinition($table_name, $index_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $query = 'SELECT relname, indkey FROM pg_index, pg_class';
+        $query.= ' WHERE pg_class.oid = pg_index.indexrelid';
+        $query.= " AND indisunique != 't' AND indisprimary != 't'";
+        $query.= ' AND pg_class.relname = %s';
+        $index_name_mdb2 = $db->getIndexName($index_name);
+        $row = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($row) || empty($row)) {
+            // fallback to the given $index_name, without transformation
+            $row = $db->queryRow(sprintf($query, $db->quote($index_name, 'text')), null, MDB2_FETCHMODE_ASSOC);
+        }
+        if (PEAR::isError($row)) {
+            return $row;
+        }
+
+        if (empty($row)) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'it was not specified an existing table index', __FUNCTION__);
+        }
+
+        $row = array_change_key_case($row, CASE_LOWER);
+
+        $db->loadModule('Manager', null, true);
+        $columns = $db->manager->listTableFields($table_name);
+
+        $definition = array();
+
+        $index_column_numbers = explode(' ', $row['indkey']);
+
+        $colpos = 1;
+        foreach ($index_column_numbers as $number) {
+            $definition['fields'][$columns[($number - 1)]] = array(
+                'position' => $colpos++,
+                'sorting' => 'ascending',
+            );
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTableConstraintDefinition()
+
+    /**
+     * Get the structure of a constraint into an array
+     *
+     * @param string $table_name      name of table that should be used in method
+     * @param string $constraint_name name of constraint that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableConstraintDefinition($table_name, $constraint_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $query = "SELECT c.oid,
+                         c.conname AS constraint_name,
+                         CASE WHEN c.contype = 'c' THEN 1 ELSE 0 END AS \"check\",
+                         CASE WHEN c.contype = 'f' THEN 1 ELSE 0 END AS \"foreign\",
+                         CASE WHEN c.contype = 'p' THEN 1 ELSE 0 END AS \"primary\",
+                         CASE WHEN c.contype = 'u' THEN 1 ELSE 0 END AS \"unique\",
+                         CASE WHEN c.condeferrable = 'f' THEN 0 ELSE 1 END AS deferrable,
+                         CASE WHEN c.condeferred = 'f' THEN 0 ELSE 1 END AS initiallydeferred,
+                         --array_to_string(c.conkey, ' ') AS constraint_key,
+                         t.relname AS table_name,
+                         t2.relname AS references_table,
+                         CASE confupdtype
+                           WHEN 'a' THEN 'NO ACTION'
+                           WHEN 'r' THEN 'RESTRICT'
+                           WHEN 'c' THEN 'CASCADE'
+                           WHEN 'n' THEN 'SET NULL'
+                           WHEN 'd' THEN 'SET DEFAULT'
+                         END AS onupdate,
+                         CASE confdeltype
+                           WHEN 'a' THEN 'NO ACTION'
+                           WHEN 'r' THEN 'RESTRICT'
+                           WHEN 'c' THEN 'CASCADE'
+                           WHEN 'n' THEN 'SET NULL'
+                           WHEN 'd' THEN 'SET DEFAULT'
+                         END AS ondelete,
+                         CASE confmatchtype
+                           WHEN 'u' THEN 'UNSPECIFIED'
+                           WHEN 'f' THEN 'FULL'
+                           WHEN 'p' THEN 'PARTIAL'
+                         END AS match,
+                         --array_to_string(c.confkey, ' ') AS fk_constraint_key,
+                         consrc
+                    FROM pg_constraint c
+               LEFT JOIN pg_class t  ON c.conrelid  = t.oid
+               LEFT JOIN pg_class t2 ON c.confrelid = t2.oid
+                   WHERE c.conname = %s
+                     AND t.relname = " . $db->quote($table, 'text');
+        $constraint_name_mdb2 = $db->getIndexName($constraint_name);
+        $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($row) || empty($row)) {
+            // fallback to the given $index_name, without transformation
+            $constraint_name_mdb2 = $constraint_name;
+            $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
+        }
+        if (PEAR::isError($row)) {
+            return $row;
+        }
+        $uniqueIndex = false;
+        if (empty($row)) {
+            // We might be looking for a UNIQUE index that was not created
+            // as a constraint but should be treated as such.
+            $query = 'SELECT relname AS constraint_name,
+                             indkey,
+                             0 AS "check",
+                             0 AS "foreign",
+                             0 AS "primary",
+                             1 AS "unique",
+                             0 AS deferrable,
+                             0 AS initiallydeferred,
+                             NULL AS references_table,
+                             NULL AS onupdate,
+                             NULL AS ondelete,
+                             NULL AS match
+                        FROM pg_index, pg_class
+                       WHERE pg_class.oid = pg_index.indexrelid
+                         AND indisunique = \'t\'
+                         AND pg_class.relname = %s';
+            $constraint_name_mdb2 = $db->getIndexName($constraint_name);
+            $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
+            if (PEAR::isError($row) || empty($row)) {
+                // fallback to the given $index_name, without transformation
+                $constraint_name_mdb2 = $constraint_name;
+                $row = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null, MDB2_FETCHMODE_ASSOC);
+            }
+            if (PEAR::isError($row)) {
+                return $row;
+            }
+            if (empty($row)) {
+                return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                    $constraint_name . ' is not an existing table constraint', __FUNCTION__);
+            }
+            $uniqueIndex = true;
+        }
+
+        $row = array_change_key_case($row, CASE_LOWER);
+
+        $definition = array(
+            'primary' => (boolean)$row['primary'],
+            'unique'  => (boolean)$row['unique'],
+            'foreign' => (boolean)$row['foreign'],
+            'check'   => (boolean)$row['check'],
+            'fields'  => array(),
+            'references' => array(
+                'table'  => $row['references_table'],
+                'fields' => array(),
+            ),
+            'deferrable' => (boolean)$row['deferrable'],
+            'initiallydeferred' => (boolean)$row['initiallydeferred'],
+            'onupdate' => $row['onupdate'],
+            'ondelete' => $row['ondelete'],
+            'match'    => $row['match'],
+        );
+
+        if ($uniqueIndex) {
+            $db->loadModule('Manager', null, true);
+            $columns = $db->manager->listTableFields($table_name);
+            $index_column_numbers = explode(' ', $row['indkey']);
+            $colpos = 1;
+            foreach ($index_column_numbers as $number) {
+                $definition['fields'][$columns[($number - 1)]] = array(
+                    'position' => $colpos++,
+                    'sorting'  => 'ascending',
+                );
+            }
+            return $definition;
+        }
+
+        $query = 'SELECT a.attname
+                    FROM pg_constraint c
+               LEFT JOIN pg_class t  ON c.conrelid  = t.oid
+               LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
+                   WHERE c.conname = %s
+                     AND t.relname = ' . $db->quote($table, 'text');
+        $fields = $db->queryCol(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null);
+        if (PEAR::isError($fields)) {
+            return $fields;
+        }
+        $colpos = 1;
+        foreach ($fields as $field) {
+            $definition['fields'][$field] = array(
+                'position' => $colpos++,
+                'sorting' => 'ascending',
+            );
+        }
+        
+        if ($definition['foreign']) {
+            $query = 'SELECT a.attname
+                        FROM pg_constraint c
+                   LEFT JOIN pg_class t  ON c.confrelid  = t.oid
+                   LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.confkey)
+                       WHERE c.conname = %s
+                         AND t.relname = ' . $db->quote($definition['references']['table'], 'text');
+            $foreign_fields = $db->queryCol(sprintf($query, $db->quote($constraint_name_mdb2, 'text')), null);
+            if (PEAR::isError($foreign_fields)) {
+                return $foreign_fields;
+            }
+            $colpos = 1;
+            foreach ($foreign_fields as $foreign_field) {
+                $definition['references']['fields'][$foreign_field] = array(
+                    'position' => $colpos++,
+                );
+            }
+        }
+        
+        if ($definition['check']) {
+            $check_def = $db->queryOne("SELECT pg_get_constraintdef(" . $row['oid'] . ", 't')");
+            // ...
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTriggerDefinition()
+
+    /**
+     * Get the structure of a trigger into an array
+     *
+     * EXPERIMENTAL
+     *
+     * WARNING: this function is experimental and may change the returned value
+     * at any time until labelled as non-experimental
+     *
+     * @param string $trigger name of trigger that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     *
+     * @TODO: add support for plsql functions and functions with args
+     */
+    function getTriggerDefinition($trigger)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT trg.tgname AS trigger_name,
+                         tbl.relname AS table_name,
+                         CASE
+                            WHEN p.proname IS NOT NULL THEN 'EXECUTE PROCEDURE ' || p.proname || '();'
+                            ELSE ''
+                         END AS trigger_body,
+                         CASE trg.tgtype & cast(2 as int2)
+                            WHEN 0 THEN 'AFTER'
+                            ELSE 'BEFORE'
+                         END AS trigger_type,
+                         CASE trg.tgtype & cast(28 as int2)
+                            WHEN 16 THEN 'UPDATE'
+                            WHEN 8 THEN 'DELETE'
+                            WHEN 4 THEN 'INSERT'
+                            WHEN 20 THEN 'INSERT, UPDATE'
+                            WHEN 28 THEN 'INSERT, UPDATE, DELETE'
+                            WHEN 24 THEN 'UPDATE, DELETE'
+                            WHEN 12 THEN 'INSERT, DELETE'
+                         END AS trigger_event,
+                         CASE trg.tgenabled
+                            WHEN 'O' THEN 't'
+                            ELSE trg.tgenabled
+                         END AS trigger_enabled,
+                         obj_description(trg.oid, 'pg_trigger') AS trigger_comment
+                    FROM pg_trigger trg,
+                         pg_class tbl,
+                         pg_proc p
+                   WHERE trg.tgrelid = tbl.oid
+                     AND trg.tgfoid = p.oid
+                     AND trg.tgname = ". $db->quote($trigger, 'text');
+        $types = array(
+            'trigger_name'    => 'text',
+            'table_name'      => 'text',
+            'trigger_body'    => 'text',
+            'trigger_type'    => 'text',
+            'trigger_event'   => 'text',
+            'trigger_comment' => 'text',
+            'trigger_enabled' => 'boolean',
+        );
+        return $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC);
+    }
+    
+    // }}}
+    // {{{ tableInfo()
+
+    /**
+     * Returns information about a table or a result set
+     *
+     * NOTE: only supports 'table' and 'flags' if <var>$result</var>
+     * is a table name.
+     *
+     * @param object|string  $result  MDB2_result object from a query or a
+     *                                 string containing the name of a table.
+     *                                 While this also accepts a query result
+     *                                 resource identifier, this behavior is
+     *                                 deprecated.
+     * @param int            $mode    a valid tableInfo mode
+     *
+     * @return array  an associative array with the information requested.
+     *                 A MDB2_Error object on failure.
+     *
+     * @see MDB2_Driver_Common::tableInfo()
+     */
+    function tableInfo($result, $mode = null)
+    {
+        if (is_string($result)) {
+           return parent::tableInfo($result, $mode);
+        }
+
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result;
+        if (!is_resource($resource)) {
+            return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                'Could not generate result resource', __FUNCTION__);
+        }
+
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            if ($db->options['field_case'] == CASE_LOWER) {
+                $case_func = 'strtolower';
+            } else {
+                $case_func = 'strtoupper';
+            }
+        } else {
+            $case_func = 'strval';
+        }
+
+        $count = @pg_num_fields($resource);
+        $res   = array();
+
+        if ($mode) {
+            $res['num_fields'] = $count;
+        }
+
+        $db->loadModule('Datatype', null, true);
+        for ($i = 0; $i < $count; $i++) {
+            $res[$i] = array(
+                'table' => function_exists('pg_field_table') ? @pg_field_table($resource, $i) : '',
+                'name'  => $case_func(@pg_field_name($resource, $i)),
+                'type'  => @pg_field_type($resource, $i),
+                'length' => @pg_field_size($resource, $i),
+                'flags' => '',
+            );
+            $mdb2type_info = $db->datatype->mapNativeDatatype($res[$i]);
+            if (PEAR::isError($mdb2type_info)) {
+               return $mdb2type_info;
+            }
+            $res[$i]['mdb2type'] = $mdb2type_info[0][0];
+            if ($mode & MDB2_TABLEINFO_ORDER) {
+                $res['order'][$res[$i]['name']] = $i;
+            }
+            if ($mode & MDB2_TABLEINFO_ORDERTABLE) {
+                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
+            }
+        }
+
+        return $res;
+    }
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/Reverse/sqlite.php b/3rdparty/MDB2/Driver/Reverse/sqlite.php
index b98ccdb62cd60cb083f10e11cf20e9becb472685..811400480fef23e3bd6dbee94b0599d478e2854c 100644
--- a/3rdparty/MDB2/Driver/Reverse/sqlite.php
+++ b/3rdparty/MDB2/Driver/Reverse/sqlite.php
@@ -1,609 +1,611 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith, Lorenzo Alberton                       |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Authors: Lukas Smith <smith@pooteeweet.org>                          |
-// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
-// +----------------------------------------------------------------------+
-//
-// $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-require_once 'MDB2/Driver/Reverse/Common.php';
-
-/**
- * MDB2 SQlite driver for the schema reverse engineering module
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
-{
-    /**
-     * Remove SQL comments from the field definition
-     *
-     * @access private
-     */
-    function _removeComments($sql) {
-        $lines = explode("\n", $sql);
-        foreach ($lines as $k => $line) {
-            $pieces = explode('--', $line);
-            if (count($pieces) > 1 && (substr_count($pieces[0], '\'') % 2) == 0) {
-                $lines[$k] = substr($line, 0, strpos($line, '--'));
-            }
-        }
-        return implode("\n", $lines);
-    }
-
-    /**
-     *
-     */
-    function _getTableColumns($sql)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $start_pos  = strpos($sql, '(');
-        $end_pos    = strrpos($sql, ')');
-        $column_def = substr($sql, $start_pos+1, $end_pos-$start_pos-1);
-        // replace the decimal length-places-separator with a colon
-        $column_def = preg_replace('/(\d),(\d)/', '\1:\2', $column_def);
-        $column_def = $this->_removeComments($column_def);
-        $column_sql = explode(',', $column_def);
-        $columns    = array();
-        $count      = count($column_sql);
-        if ($count == 0) {
-            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'unexpected empty table column definition list', __FUNCTION__);
-        }
-        $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i';
-        $regexp2 = '/^\s*([^ ]+) +(PRIMARY|UNIQUE|CHECK)$/i';
-        for ($i=0, $j=0; $i<$count; ++$i) {
-            if (!preg_match($regexp, trim($column_sql[$i]), $matches)) {
-                if (!preg_match($regexp2, trim($column_sql[$i]))) {
-                    continue;
-                }
-                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'unexpected table column SQL definition: "'.$column_sql[$i].'"', __FUNCTION__);
-            }
-            $columns[$j]['name'] = trim($matches[1], implode('', $db->identifier_quoting));
-            $columns[$j]['type'] = strtolower($matches[2]);
-            if (isset($matches[4]) && strlen($matches[4])) {
-                $columns[$j]['length'] = $matches[4];
-            }
-            if (isset($matches[6]) && strlen($matches[6])) {
-                $columns[$j]['decimal'] = $matches[6];
-            }
-            if (isset($matches[8]) && strlen($matches[8])) {
-                $columns[$j]['unsigned'] = true;
-            }
-            if (isset($matches[9]) && strlen($matches[9])) {
-                $columns[$j]['autoincrement'] = true;
-            }
-            if (isset($matches[12]) && strlen($matches[12])) {
-                $default = $matches[12];
-                if (strlen($default) && $default[0]=="'") {
-                    $default = str_replace("''", "'", substr($default, 1, strlen($default)-2));
-                }
-                if ($default === 'NULL') {
-                    $default = null;
-                }
-                $columns[$j]['default'] = $default;
-            }
-            if (isset($matches[7]) && strlen($matches[7])) {
-                $columns[$j]['notnull'] = ($matches[7] === ' NOT NULL');
-            } else if (isset($matches[9]) && strlen($matches[9])) {
-                $columns[$j]['notnull'] = ($matches[9] === ' NOT NULL');
-            } else if (isset($matches[13]) && strlen($matches[13])) {
-                $columns[$j]['notnull'] = ($matches[13] === ' NOT NULL');
-            }
-            ++$j;
-        }
-        return $columns;
-    }
-
-    // {{{ getTableFieldDefinition()
-
-    /**
-     * Get the stucture of a field into an array
-     *
-     * @param string $table_name name of table that should be used in method
-     * @param string $field_name name of field that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure.
-     *          The returned array contains an array for each field definition,
-     *          with (some of) these indices:
-     *          [notnull] [nativetype] [length] [fixed] [default] [type] [mdb2type]
-     * @access public
-     */
-    function getTableFieldDefinition($table_name, $field_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $result = $db->loadModule('Datatype', null, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text');
-        } else {
-            $query.= 'name='.$db->quote($table, 'text');
-        }
-        $sql = $db->queryOne($query);
-        if (PEAR::isError($sql)) {
-            return $sql;
-        }
-        $columns = $this->_getTableColumns($sql);
-        foreach ($columns as $column) {
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                if ($db->options['field_case'] == CASE_LOWER) {
-                    $column['name'] = strtolower($column['name']);
-                } else {
-                    $column['name'] = strtoupper($column['name']);
-                }
-            } else {
-                $column = array_change_key_case($column, $db->options['field_case']);
-            }
-            if ($field_name == $column['name']) {
-                $mapped_datatype = $db->datatype->mapNativeDatatype($column);
-                if (PEAR::isError($mapped_datatype)) {
-                    return $mapped_datatype;
-                }
-                list($types, $length, $unsigned, $fixed) = $mapped_datatype;
-                $notnull = false;
-                if (!empty($column['notnull'])) {
-                    $notnull = $column['notnull'];
-                }
-                $default = false;
-                if (array_key_exists('default', $column)) {
-                    $default = $column['default'];
-                    if ((null === $default) && $notnull) {
-                        $default = '';
-                    }
-                }
-                $autoincrement = false;
-                if (!empty($column['autoincrement'])) {
-                    $autoincrement = true;
-                }
-
-                $definition[0] = array(
-                    'notnull' => $notnull,
-                    'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
-                );
-                if (null !== $length) {
-                    $definition[0]['length'] = $length;
-                }
-                if (null !== $unsigned) {
-                    $definition[0]['unsigned'] = $unsigned;
-                }
-                if (null !== $fixed) {
-                    $definition[0]['fixed'] = $fixed;
-                }
-                if ($default !== false) {
-                    $definition[0]['default'] = $default;
-                }
-                if ($autoincrement !== false) {
-                    $definition[0]['autoincrement'] = $autoincrement;
-                }
-                foreach ($types as $key => $type) {
-                    $definition[$key] = $definition[0];
-                    if ($type == 'clob' || $type == 'blob') {
-                        unset($definition[$key]['default']);
-                    }
-                    $definition[$key]['type'] = $type;
-                    $definition[$key]['mdb2type'] = $type;
-                }
-                return $definition;
-            }
-        }
-
-        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-            'it was not specified an existing table column', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ getTableIndexDefinition()
-
-    /**
-     * Get the stucture of an index into an array
-     *
-     * @param string $table_name name of table that should be used in method
-     * @param string $index_name name of index that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableIndexDefinition($table_name, $index_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(name)=%s AND LOWER(tbl_name)=' . $db->quote(strtolower($table), 'text');
-        } else {
-            $query.= 'name=%s AND tbl_name=' . $db->quote($table, 'text');
-        }
-        $query.= ' AND sql NOT NULL ORDER BY name';
-        $index_name_mdb2 = $db->getIndexName($index_name);
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $qry = sprintf($query, $db->quote(strtolower($index_name_mdb2), 'text'));
-        } else {
-            $qry = sprintf($query, $db->quote($index_name_mdb2, 'text'));
-        }
-        $sql = $db->queryOne($qry, 'text');
-        if (PEAR::isError($sql) || empty($sql)) {
-            // fallback to the given $index_name, without transformation
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                $qry = sprintf($query, $db->quote(strtolower($index_name), 'text'));
-            } else {
-                $qry = sprintf($query, $db->quote($index_name, 'text'));
-            }
-            $sql = $db->queryOne($qry, 'text');
-        }
-        if (PEAR::isError($sql)) {
-            return $sql;
-        }
-        if (!$sql) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'it was not specified an existing table index', __FUNCTION__);
-        }
-
-        $sql = strtolower($sql);
-        $start_pos = strpos($sql, '(');
-        $end_pos = strrpos($sql, ')');
-        $column_names = substr($sql, $start_pos+1, $end_pos-$start_pos-1);
-        $column_names = explode(',', $column_names);
-
-        if (preg_match("/^create unique/", $sql)) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'it was not specified an existing table index', __FUNCTION__);
-        }
-
-        $definition = array();
-        $count = count($column_names);
-        for ($i=0; $i<$count; ++$i) {
-            $column_name = strtok($column_names[$i], ' ');
-            $collation = strtok(' ');
-            $definition['fields'][$column_name] = array(
-                'position' => $i+1
-            );
-            if (!empty($collation)) {
-                $definition['fields'][$column_name]['sorting'] =
-                    ($collation=='ASC' ? 'ascending' : 'descending');
-            }
-        }
-
-        if (empty($definition['fields'])) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'it was not specified an existing table index', __FUNCTION__);
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTableConstraintDefinition()
-
-    /**
-     * Get the stucture of a constraint into an array
-     *
-     * @param string $table_name      name of table that should be used in method
-     * @param string $constraint_name name of constraint that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTableConstraintDefinition($table_name, $constraint_name)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        
-        list($schema, $table) = $this->splitTableSchema($table_name);
-
-        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= 'LOWER(name)=%s AND LOWER(tbl_name)=' . $db->quote(strtolower($table), 'text');
-        } else {
-            $query.= 'name=%s AND tbl_name=' . $db->quote($table, 'text');
-        }
-        $query.= ' AND sql NOT NULL ORDER BY name';
-        $constraint_name_mdb2 = $db->getIndexName($constraint_name);
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $qry = sprintf($query, $db->quote(strtolower($constraint_name_mdb2), 'text'));
-        } else {
-            $qry = sprintf($query, $db->quote($constraint_name_mdb2, 'text'));
-        }
-        $sql = $db->queryOne($qry, 'text');
-        if (PEAR::isError($sql) || empty($sql)) {
-            // fallback to the given $index_name, without transformation
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                $qry = sprintf($query, $db->quote(strtolower($constraint_name), 'text'));
-            } else {
-                $qry = sprintf($query, $db->quote($constraint_name, 'text'));
-            }
-            $sql = $db->queryOne($qry, 'text');
-        }
-        if (PEAR::isError($sql)) {
-            return $sql;
-        }
-        //default values, eventually overridden
-        $definition = array(
-            'primary' => false,
-            'unique'  => false,
-            'foreign' => false,
-            'check'   => false,
-            'fields'  => array(),
-            'references' => array(
-                'table'  => '',
-                'fields' => array(),
-            ),
-            'onupdate'  => '',
-            'ondelete'  => '',
-            'match'     => '',
-            'deferrable'        => false,
-            'initiallydeferred' => false,
-        );
-        if (!$sql) {
-            $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
-            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-                $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text');
-            } else {
-                $query.= 'name='.$db->quote($table, 'text');
-            }
-            $query.= " AND sql NOT NULL ORDER BY name";
-            $sql = $db->queryOne($query, 'text');
-            if (PEAR::isError($sql)) {
-                return $sql;
-            }
-            if ($constraint_name == 'primary') {
-                // search in table definition for PRIMARY KEYs
-                if (preg_match("/\bPRIMARY\s+KEY\b\s*\(([^)]+)/i", $sql, $tmp)) {
-                    $definition['primary'] = true;
-                    $definition['fields'] = array();
-                    $column_names = explode(',', $tmp[1]);
-                    $colpos = 1;
-                    foreach ($column_names as $column_name) {
-                        $definition['fields'][trim($column_name)] = array(
-                            'position' => $colpos++
-                        );
-                    }
-                    return $definition;
-                }
-                if (preg_match("/\"([^\"]+)\"[^\,\"]+\bPRIMARY\s+KEY\b[^\,\)]*/i", $sql, $tmp)) {
-                    $definition['primary'] = true;
-                    $definition['fields'] = array();
-                    $column_names = explode(',', $tmp[1]);
-                    $colpos = 1;
-                    foreach ($column_names as $column_name) {
-                        $definition['fields'][trim($column_name)] = array(
-                            'position' => $colpos++
-                        );
-                    }
-                    return $definition;
-                }
-            } else {
-                // search in table definition for FOREIGN KEYs
-                $pattern = "/\bCONSTRAINT\b\s+%s\s+
-                    \bFOREIGN\s+KEY\b\s*\(([^\)]+)\)\s*
-                    \bREFERENCES\b\s+([^\s]+)\s*\(([^\)]+)\)\s*
-                    (?:\bMATCH\s*([^\s]+))?\s*
-                    (?:\bON\s+UPDATE\s+([^\s,\)]+))?\s*
-                    (?:\bON\s+DELETE\s+([^\s,\)]+))?\s*
-                    /imsx";
-                $found_fk = false;
-                if (preg_match(sprintf($pattern, $constraint_name_mdb2), $sql, $tmp)) {
-                    $found_fk = true;
-                } elseif (preg_match(sprintf($pattern, $constraint_name), $sql, $tmp)) {
-                    $found_fk = true;
-                }
-                if ($found_fk) {
-                    $definition['foreign'] = true;
-                    $definition['match'] = 'SIMPLE';
-                    $definition['onupdate'] = 'NO ACTION';
-                    $definition['ondelete'] = 'NO ACTION';
-                    $definition['references']['table'] = $tmp[2];
-                    $column_names = explode(',', $tmp[1]);
-                    $colpos = 1;
-                    foreach ($column_names as $column_name) {
-                        $definition['fields'][trim($column_name)] = array(
-                            'position' => $colpos++
-                        );
-                    }
-                    $referenced_cols = explode(',', $tmp[3]);
-                    $colpos = 1;
-                    foreach ($referenced_cols as $column_name) {
-                        $definition['references']['fields'][trim($column_name)] = array(
-                            'position' => $colpos++
-                        );
-                    }
-                    if (isset($tmp[4])) {
-                        $definition['match']    = $tmp[4];
-                    }
-                    if (isset($tmp[5])) {
-                        $definition['onupdate'] = $tmp[5];
-                    }
-                    if (isset($tmp[6])) {
-                        $definition['ondelete'] = $tmp[6];
-                    }
-                    return $definition;
-                }
-            }
-            $sql = false;
-        }
-        if (!$sql) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
-        }
-
-        $sql = strtolower($sql);
-        $start_pos = strpos($sql, '(');
-        $end_pos   = strrpos($sql, ')');
-        $column_names = substr($sql, $start_pos+1, $end_pos-$start_pos-1);
-        $column_names = explode(',', $column_names);
-
-        if (!preg_match("/^create unique/", $sql)) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
-        }
-
-        $definition['unique'] = true;
-        $count = count($column_names);
-        for ($i=0; $i<$count; ++$i) {
-            $column_name = strtok($column_names[$i]," ");
-            $collation = strtok(" ");
-            $definition['fields'][$column_name] = array(
-                'position' => $i+1
-            );
-            if (!empty($collation)) {
-                $definition['fields'][$column_name]['sorting'] =
-                    ($collation=='ASC' ? 'ascending' : 'descending');
-            }
-        }
-
-        if (empty($definition['fields'])) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
-        }
-        return $definition;
-    }
-
-    // }}}
-    // {{{ getTriggerDefinition()
-
-    /**
-     * Get the structure of a trigger into an array
-     *
-     * EXPERIMENTAL
-     *
-     * WARNING: this function is experimental and may change the returned value
-     * at any time until labelled as non-experimental
-     *
-     * @param string    $trigger    name of trigger that should be used in method
-     * @return mixed data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function getTriggerDefinition($trigger)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $query = "SELECT name as trigger_name,
-                         tbl_name AS table_name,
-                         sql AS trigger_body,
-                         NULL AS trigger_type,
-                         NULL AS trigger_event,
-                         NULL AS trigger_comment,
-                         1 AS trigger_enabled
-                    FROM sqlite_master
-                   WHERE type='trigger'";
-        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $query.= ' AND LOWER(name)='.$db->quote(strtolower($trigger), 'text');
-        } else {
-            $query.= ' AND name='.$db->quote($trigger, 'text');
-        }
-        $types = array(
-            'trigger_name'    => 'text',
-            'table_name'      => 'text',
-            'trigger_body'    => 'text',
-            'trigger_type'    => 'text',
-            'trigger_event'   => 'text',
-            'trigger_comment' => 'text',
-            'trigger_enabled' => 'boolean',
-        );
-        $def = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC);
-        if (PEAR::isError($def)) {
-            return $def;
-        }
-        if (empty($def)) {
-            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'it was not specified an existing trigger', __FUNCTION__);
-        }
-        if (preg_match("/^create\s+(?:temp|temporary)?trigger\s+(?:if\s+not\s+exists\s+)?.*(before|after)?\s+(insert|update|delete)/Uims", $def['trigger_body'], $tmp)) {
-            $def['trigger_type'] = strtoupper($tmp[1]);
-            $def['trigger_event'] = strtoupper($tmp[2]);
-        }
-        return $def;
-    }
-
-    // }}}
-    // {{{ tableInfo()
-
-    /**
-     * Returns information about a table
-     *
-     * @param string         $result  a string containing the name of a table
-     * @param int            $mode    a valid tableInfo mode
-     *
-     * @return array  an associative array with the information requested.
-     *                 A MDB2_Error object on failure.
-     *
-     * @see MDB2_Driver_Common::tableInfo()
-     * @since Method available since Release 1.7.0
-     */
-    function tableInfo($result, $mode = null)
-    {
-        if (is_string($result)) {
-           return parent::tableInfo($result, $mode);
-        }
-
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        return $db->raiseError(MDB2_ERROR_NOT_CAPABLE, null, null,
-           'This DBMS can not obtain tableInfo from result sets', __FUNCTION__);
-    }
-}
-
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2007 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith, Lorenzo Alberton                       |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Authors: Lukas Smith <smith@pooteeweet.org>                          |
+// |          Lorenzo Alberton <l.alberton@quipo.it>                      |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+require_once 'MDB2/Driver/Reverse/Common.php';
+
+/**
+ * MDB2 SQlite driver for the schema reverse engineering module
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
+{
+    /**
+     * Remove SQL comments from the field definition
+     *
+     * @access private
+     */
+    function _removeComments($sql) {
+        $lines = explode("\n", $sql);
+        foreach ($lines as $k => $line) {
+            $pieces = explode('--', $line);
+            if (count($pieces) > 1 && (substr_count($pieces[0], '\'') % 2) == 0) {
+                $lines[$k] = substr($line, 0, strpos($line, '--'));
+            }
+        }
+        return implode("\n", $lines);
+    }
+
+    /**
+     *
+     */
+    function _getTableColumns($sql)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        $start_pos  = strpos($sql, '(');
+        $end_pos    = strrpos($sql, ')');
+        $column_def = substr($sql, $start_pos+1, $end_pos-$start_pos-1);
+        // replace the decimal length-places-separator with a colon
+        $column_def = preg_replace('/(\d),(\d)/', '\1:\2', $column_def);
+        $column_def = $this->_removeComments($column_def);
+        $column_sql = explode(',', $column_def);
+        $columns    = array();
+        $count      = count($column_sql);
+        if ($count == 0) {
+            return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'unexpected empty table column definition list', __FUNCTION__);
+        }
+        $regexp = '/^\s*([^\s]+) +(CHAR|VARCHAR|VARCHAR2|TEXT|BOOLEAN|SMALLINT|INT|INTEGER|DECIMAL|TINYINT|BIGINT|DOUBLE|FLOAT|DATETIME|DATE|TIME|LONGTEXT|LONGBLOB)( ?\(([1-9][0-9]*)(:([1-9][0-9]*))?\))?( NULL| NOT NULL)?( UNSIGNED)?( NULL| NOT NULL)?( PRIMARY KEY)?( DEFAULT (\'[^\']*\'|[^ ]+))?( NULL| NOT NULL)?( PRIMARY KEY)?(\s*\-\-.*)?$/i';
+        $regexp2 = '/^\s*([^ ]+) +(PRIMARY|UNIQUE|CHECK)$/i';
+        for ($i=0, $j=0; $i<$count; ++$i) {
+            if (!preg_match($regexp, trim($column_sql[$i]), $matches)) {
+                if (!preg_match($regexp2, trim($column_sql[$i]))) {
+                    continue;
+                }
+                return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'unexpected table column SQL definition: "'.$column_sql[$i].'"', __FUNCTION__);
+            }
+            $columns[$j]['name'] = trim($matches[1], implode('', $db->identifier_quoting));
+            $columns[$j]['type'] = strtolower($matches[2]);
+            if (isset($matches[4]) && strlen($matches[4])) {
+                $columns[$j]['length'] = $matches[4];
+            }
+            if (isset($matches[6]) && strlen($matches[6])) {
+                $columns[$j]['decimal'] = $matches[6];
+            }
+            if (isset($matches[8]) && strlen($matches[8])) {
+                $columns[$j]['unsigned'] = true;
+            }
+            if (isset($matches[9]) && strlen($matches[9])) {
+                $columns[$j]['autoincrement'] = true;
+            }
+            if (isset($matches[12]) && strlen($matches[12])) {
+                $default = $matches[12];
+                if (strlen($default) && $default[0]=="'") {
+                    $default = str_replace("''", "'", substr($default, 1, strlen($default)-2));
+                }
+                if ($default === 'NULL') {
+                    $default = null;
+                }
+                $columns[$j]['default'] = $default;
+            } else {
+                $columns[$j]['default'] = null;
+            }
+            if (isset($matches[7]) && strlen($matches[7])) {
+                $columns[$j]['notnull'] = ($matches[7] === ' NOT NULL');
+            } else if (isset($matches[9]) && strlen($matches[9])) {
+                $columns[$j]['notnull'] = ($matches[9] === ' NOT NULL');
+            } else if (isset($matches[13]) && strlen($matches[13])) {
+                $columns[$j]['notnull'] = ($matches[13] === ' NOT NULL');
+            }
+            ++$j;
+        }
+        return $columns;
+    }
+
+    // {{{ getTableFieldDefinition()
+
+    /**
+     * Get the stucture of a field into an array
+     *
+     * @param string $table_name name of table that should be used in method
+     * @param string $field_name name of field that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure.
+     *          The returned array contains an array for each field definition,
+     *          with (some of) these indices:
+     *          [notnull] [nativetype] [length] [fixed] [default] [type] [mdb2type]
+     * @access public
+     */
+    function getTableFieldDefinition($table_name, $field_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $result = $db->loadModule('Datatype', null, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text');
+        } else {
+            $query.= 'name='.$db->quote($table, 'text');
+        }
+        $sql = $db->queryOne($query);
+        if (PEAR::isError($sql)) {
+            return $sql;
+        }
+        $columns = $this->_getTableColumns($sql);
+        foreach ($columns as $column) {
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                if ($db->options['field_case'] == CASE_LOWER) {
+                    $column['name'] = strtolower($column['name']);
+                } else {
+                    $column['name'] = strtoupper($column['name']);
+                }
+            } else {
+                $column = array_change_key_case($column, $db->options['field_case']);
+            }
+            if ($field_name == $column['name']) {
+                $mapped_datatype = $db->datatype->mapNativeDatatype($column);
+                if (PEAR::isError($mapped_datatype)) {
+                    return $mapped_datatype;
+                }
+                list($types, $length, $unsigned, $fixed) = $mapped_datatype;
+                $notnull = false;
+                if (!empty($column['notnull'])) {
+                    $notnull = $column['notnull'];
+                }
+                $default = false;
+                if (array_key_exists('default', $column)) {
+                    $default = $column['default'];
+                    if ((null === $default) && $notnull) {
+                        $default = '';
+                    }
+                }
+                $autoincrement = false;
+                if (!empty($column['autoincrement'])) {
+                    $autoincrement = true;
+                }
+
+                $definition[0] = array(
+                    'notnull' => $notnull,
+                    'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
+                );
+                if (null !== $length) {
+                    $definition[0]['length'] = $length;
+                }
+                if (null !== $unsigned) {
+                    $definition[0]['unsigned'] = $unsigned;
+                }
+                if (null !== $fixed) {
+                    $definition[0]['fixed'] = $fixed;
+                }
+                if ($default !== false) {
+                    $definition[0]['default'] = $default;
+                }
+                if ($autoincrement !== false) {
+                    $definition[0]['autoincrement'] = $autoincrement;
+                }
+                foreach ($types as $key => $type) {
+                    $definition[$key] = $definition[0];
+                    if ($type == 'clob' || $type == 'blob') {
+                        unset($definition[$key]['default']);
+                    }
+                    $definition[$key]['type'] = $type;
+                    $definition[$key]['mdb2type'] = $type;
+                }
+                return $definition;
+            }
+        }
+
+        return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+            'it was not specified an existing table column', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ getTableIndexDefinition()
+
+    /**
+     * Get the stucture of an index into an array
+     *
+     * @param string $table_name name of table that should be used in method
+     * @param string $index_name name of index that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableIndexDefinition($table_name, $index_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(name)=%s AND LOWER(tbl_name)=' . $db->quote(strtolower($table), 'text');
+        } else {
+            $query.= 'name=%s AND tbl_name=' . $db->quote($table, 'text');
+        }
+        $query.= ' AND sql NOT NULL ORDER BY name';
+        $index_name_mdb2 = $db->getIndexName($index_name);
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $qry = sprintf($query, $db->quote(strtolower($index_name_mdb2), 'text'));
+        } else {
+            $qry = sprintf($query, $db->quote($index_name_mdb2, 'text'));
+        }
+        $sql = $db->queryOne($qry, 'text');
+        if (PEAR::isError($sql) || empty($sql)) {
+            // fallback to the given $index_name, without transformation
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                $qry = sprintf($query, $db->quote(strtolower($index_name), 'text'));
+            } else {
+                $qry = sprintf($query, $db->quote($index_name, 'text'));
+            }
+            $sql = $db->queryOne($qry, 'text');
+        }
+        if (PEAR::isError($sql)) {
+            return $sql;
+        }
+        if (!$sql) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'it was not specified an existing table index', __FUNCTION__);
+        }
+
+        $sql = strtolower($sql);
+        $start_pos = strpos($sql, '(');
+        $end_pos = strrpos($sql, ')');
+        $column_names = substr($sql, $start_pos+1, $end_pos-$start_pos-1);
+        $column_names = explode(',', $column_names);
+
+        if (preg_match("/^create unique/", $sql)) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'it was not specified an existing table index', __FUNCTION__);
+        }
+
+        $definition = array();
+        $count = count($column_names);
+        for ($i=0; $i<$count; ++$i) {
+            $column_name = strtok($column_names[$i], ' ');
+            $collation = strtok(' ');
+            $definition['fields'][$column_name] = array(
+                'position' => $i+1
+            );
+            if (!empty($collation)) {
+                $definition['fields'][$column_name]['sorting'] =
+                    ($collation=='ASC' ? 'ascending' : 'descending');
+            }
+        }
+
+        if (empty($definition['fields'])) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'it was not specified an existing table index', __FUNCTION__);
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTableConstraintDefinition()
+
+    /**
+     * Get the stucture of a constraint into an array
+     *
+     * @param string $table_name      name of table that should be used in method
+     * @param string $constraint_name name of constraint that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTableConstraintDefinition($table_name, $constraint_name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        list($schema, $table) = $this->splitTableSchema($table_name);
+
+        $query = "SELECT sql FROM sqlite_master WHERE type='index' AND ";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= 'LOWER(name)=%s AND LOWER(tbl_name)=' . $db->quote(strtolower($table), 'text');
+        } else {
+            $query.= 'name=%s AND tbl_name=' . $db->quote($table, 'text');
+        }
+        $query.= ' AND sql NOT NULL ORDER BY name';
+        $constraint_name_mdb2 = $db->getIndexName($constraint_name);
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $qry = sprintf($query, $db->quote(strtolower($constraint_name_mdb2), 'text'));
+        } else {
+            $qry = sprintf($query, $db->quote($constraint_name_mdb2, 'text'));
+        }
+        $sql = $db->queryOne($qry, 'text');
+        if (PEAR::isError($sql) || empty($sql)) {
+            // fallback to the given $index_name, without transformation
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                $qry = sprintf($query, $db->quote(strtolower($constraint_name), 'text'));
+            } else {
+                $qry = sprintf($query, $db->quote($constraint_name, 'text'));
+            }
+            $sql = $db->queryOne($qry, 'text');
+        }
+        if (PEAR::isError($sql)) {
+            return $sql;
+        }
+        //default values, eventually overridden
+        $definition = array(
+            'primary' => false,
+            'unique'  => false,
+            'foreign' => false,
+            'check'   => false,
+            'fields'  => array(),
+            'references' => array(
+                'table'  => '',
+                'fields' => array(),
+            ),
+            'onupdate'  => '',
+            'ondelete'  => '',
+            'match'     => '',
+            'deferrable'        => false,
+            'initiallydeferred' => false,
+        );
+        if (!$sql) {
+            $query = "SELECT sql FROM sqlite_master WHERE type='table' AND ";
+            if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+                $query.= 'LOWER(name)='.$db->quote(strtolower($table), 'text');
+            } else {
+                $query.= 'name='.$db->quote($table, 'text');
+            }
+            $query.= " AND sql NOT NULL ORDER BY name";
+            $sql = $db->queryOne($query, 'text');
+            if (PEAR::isError($sql)) {
+                return $sql;
+            }
+            if ($constraint_name == 'primary') {
+                // search in table definition for PRIMARY KEYs
+                if (preg_match("/\bPRIMARY\s+KEY\b\s*\(([^)]+)/i", $sql, $tmp)) {
+                    $definition['primary'] = true;
+                    $definition['fields'] = array();
+                    $column_names = explode(',', $tmp[1]);
+                    $colpos = 1;
+                    foreach ($column_names as $column_name) {
+                        $definition['fields'][trim($column_name)] = array(
+                            'position' => $colpos++
+                        );
+                    }
+                    return $definition;
+                }
+                if (preg_match("/\"([^\"]+)\"[^\,\"]+\bPRIMARY\s+KEY\b[^\,\)]*/i", $sql, $tmp)) {
+                    $definition['primary'] = true;
+                    $definition['fields'] = array();
+                    $column_names = explode(',', $tmp[1]);
+                    $colpos = 1;
+                    foreach ($column_names as $column_name) {
+                        $definition['fields'][trim($column_name)] = array(
+                            'position' => $colpos++
+                        );
+                    }
+                    return $definition;
+                }
+            } else {
+                // search in table definition for FOREIGN KEYs
+                $pattern = "/\bCONSTRAINT\b\s+%s\s+
+                    \bFOREIGN\s+KEY\b\s*\(([^\)]+)\)\s*
+                    \bREFERENCES\b\s+([^\s]+)\s*\(([^\)]+)\)\s*
+                    (?:\bMATCH\s*([^\s]+))?\s*
+                    (?:\bON\s+UPDATE\s+([^\s,\)]+))?\s*
+                    (?:\bON\s+DELETE\s+([^\s,\)]+))?\s*
+                    /imsx";
+                $found_fk = false;
+                if (preg_match(sprintf($pattern, $constraint_name_mdb2), $sql, $tmp)) {
+                    $found_fk = true;
+                } elseif (preg_match(sprintf($pattern, $constraint_name), $sql, $tmp)) {
+                    $found_fk = true;
+                }
+                if ($found_fk) {
+                    $definition['foreign'] = true;
+                    $definition['match'] = 'SIMPLE';
+                    $definition['onupdate'] = 'NO ACTION';
+                    $definition['ondelete'] = 'NO ACTION';
+                    $definition['references']['table'] = $tmp[2];
+                    $column_names = explode(',', $tmp[1]);
+                    $colpos = 1;
+                    foreach ($column_names as $column_name) {
+                        $definition['fields'][trim($column_name)] = array(
+                            'position' => $colpos++
+                        );
+                    }
+                    $referenced_cols = explode(',', $tmp[3]);
+                    $colpos = 1;
+                    foreach ($referenced_cols as $column_name) {
+                        $definition['references']['fields'][trim($column_name)] = array(
+                            'position' => $colpos++
+                        );
+                    }
+                    if (isset($tmp[4])) {
+                        $definition['match']    = $tmp[4];
+                    }
+                    if (isset($tmp[5])) {
+                        $definition['onupdate'] = $tmp[5];
+                    }
+                    if (isset($tmp[6])) {
+                        $definition['ondelete'] = $tmp[6];
+                    }
+                    return $definition;
+                }
+            }
+            $sql = false;
+        }
+        if (!$sql) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
+        }
+
+        $sql = strtolower($sql);
+        $start_pos = strpos($sql, '(');
+        $end_pos   = strrpos($sql, ')');
+        $column_names = substr($sql, $start_pos+1, $end_pos-$start_pos-1);
+        $column_names = explode(',', $column_names);
+
+        if (!preg_match("/^create unique/", $sql)) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
+        }
+
+        $definition['unique'] = true;
+        $count = count($column_names);
+        for ($i=0; $i<$count; ++$i) {
+            $column_name = strtok($column_names[$i]," ");
+            $collation = strtok(" ");
+            $definition['fields'][$column_name] = array(
+                'position' => $i+1
+            );
+            if (!empty($collation)) {
+                $definition['fields'][$column_name]['sorting'] =
+                    ($collation=='ASC' ? 'ascending' : 'descending');
+            }
+        }
+
+        if (empty($definition['fields'])) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                $constraint_name . ' is not an existing table constraint', __FUNCTION__);
+        }
+        return $definition;
+    }
+
+    // }}}
+    // {{{ getTriggerDefinition()
+
+    /**
+     * Get the structure of a trigger into an array
+     *
+     * EXPERIMENTAL
+     *
+     * WARNING: this function is experimental and may change the returned value
+     * at any time until labelled as non-experimental
+     *
+     * @param string    $trigger    name of trigger that should be used in method
+     * @return mixed data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function getTriggerDefinition($trigger)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $query = "SELECT name as trigger_name,
+                         tbl_name AS table_name,
+                         sql AS trigger_body,
+                         NULL AS trigger_type,
+                         NULL AS trigger_event,
+                         NULL AS trigger_comment,
+                         1 AS trigger_enabled
+                    FROM sqlite_master
+                   WHERE type='trigger'";
+        if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $query.= ' AND LOWER(name)='.$db->quote(strtolower($trigger), 'text');
+        } else {
+            $query.= ' AND name='.$db->quote($trigger, 'text');
+        }
+        $types = array(
+            'trigger_name'    => 'text',
+            'table_name'      => 'text',
+            'trigger_body'    => 'text',
+            'trigger_type'    => 'text',
+            'trigger_event'   => 'text',
+            'trigger_comment' => 'text',
+            'trigger_enabled' => 'boolean',
+        );
+        $def = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC);
+        if (PEAR::isError($def)) {
+            return $def;
+        }
+        if (empty($def)) {
+            return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'it was not specified an existing trigger', __FUNCTION__);
+        }
+        if (preg_match("/^create\s+(?:temp|temporary)?trigger\s+(?:if\s+not\s+exists\s+)?.*(before|after)?\s+(insert|update|delete)/Uims", $def['trigger_body'], $tmp)) {
+            $def['trigger_type'] = strtoupper($tmp[1]);
+            $def['trigger_event'] = strtoupper($tmp[2]);
+        }
+        return $def;
+    }
+
+    // }}}
+    // {{{ tableInfo()
+
+    /**
+     * Returns information about a table
+     *
+     * @param string         $result  a string containing the name of a table
+     * @param int            $mode    a valid tableInfo mode
+     *
+     * @return array  an associative array with the information requested.
+     *                 A MDB2_Error object on failure.
+     *
+     * @see MDB2_Driver_Common::tableInfo()
+     * @since Method available since Release 1.7.0
+     */
+    function tableInfo($result, $mode = null)
+    {
+        if (is_string($result)) {
+           return parent::tableInfo($result, $mode);
+        }
+
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        return $db->raiseError(MDB2_ERROR_NOT_CAPABLE, null, null,
+           'This DBMS can not obtain tableInfo from result sets', __FUNCTION__);
+    }
+}
+
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Driver/mysql.php b/3rdparty/MDB2/Driver/mysql.php
index eda3310deeb0b0ce24db76ba61b7e29bdb7b3517..3008bd04f0939a049ac1076db4cbc7641160311a 100644
--- a/3rdparty/MDB2/Driver/mysql.php
+++ b/3rdparty/MDB2/Driver/mysql.php
@@ -1,1710 +1,1729 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php 302867 2010-08-29 11:22:07Z quipo $
-//
-
-/**
- * MDB2 MySQL driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_mysql extends MDB2_Driver_Common
-{
-    // {{{ properties
-
-    var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => '\\', 'escape_pattern' => '\\');
-
-    var $identifier_quoting = array('start' => '`', 'end' => '`', 'escape' => '`');
-
-    var $sql_comments = array(
-        array('start' => '-- ', 'end' => "\n", 'escape' => false),
-        array('start' => '#', 'end' => "\n", 'escape' => false),
-        array('start' => '/*', 'end' => '*/', 'escape' => false),
-    );
-
-    var $server_capabilities_checked = false;
-
-    var $start_transaction = false;
-
-    var $varchar_max_length = 255;
-
-    // }}}
-    // {{{ constructor
-
-    /**
-     * Constructor
-     */
-    function __construct()
-    {
-        parent::__construct();
-
-        $this->phptype = 'mysql';
-        $this->dbsyntax = 'mysql';
-
-        $this->supported['sequences'] = 'emulated';
-        $this->supported['indexes'] = true;
-        $this->supported['affected_rows'] = true;
-        $this->supported['transactions'] = false;
-        $this->supported['savepoints'] = false;
-        $this->supported['summary_functions'] = true;
-        $this->supported['order_by_text'] = true;
-        $this->supported['current_id'] = 'emulated';
-        $this->supported['limit_queries'] = true;
-        $this->supported['LOBs'] = true;
-        $this->supported['replace'] = true;
-        $this->supported['sub_selects'] = 'emulated';
-        $this->supported['triggers'] = false;
-        $this->supported['auto_increment'] = true;
-        $this->supported['primary_key'] = true;
-        $this->supported['result_introspection'] = true;
-        $this->supported['prepared_statements'] = 'emulated';
-        $this->supported['identifier_quoting'] = true;
-        $this->supported['pattern_escaping'] = true;
-        $this->supported['new_link'] = true;
-
-        $this->options['DBA_username'] = false;
-        $this->options['DBA_password'] = false;
-        $this->options['default_table_type'] = '';
-        $this->options['max_identifiers_length'] = 64;
-
-        $this->_reCheckSupportedOptions();
-    }
-
-    // }}}
-    // {{{ _reCheckSupportedOptions()
-    
-    /**
-     * If the user changes certain options, other capabilities may depend
-     * on the new settings, so we need to check them (again).
-     *
-     * @access private
-     */
-    function _reCheckSupportedOptions()
-    {
-        $this->supported['transactions'] = $this->options['use_transactions'];
-        $this->supported['savepoints']   = $this->options['use_transactions'];
-        if ($this->options['default_table_type']) {
-            switch (strtoupper($this->options['default_table_type'])) {
-            case 'BLACKHOLE':
-            case 'MEMORY':
-            case 'ARCHIVE':
-            case 'CSV':
-            case 'HEAP':
-            case 'ISAM':
-            case 'MERGE':
-            case 'MRG_ISAM':
-            case 'ISAM':
-            case 'MRG_MYISAM':
-            case 'MYISAM':
-                $this->supported['savepoints']   = false;
-                $this->supported['transactions'] = false;
-                $this->warnings[] = $this->options['default_table_type'] .
-                    ' is not a supported default table type';
-                break;
-            }
-        }
-    }
-
-    // }}}
-    // {{{ function setOption($option, $value)
-
-    /**
-     * set the option for the db class
-     *
-     * @param   string  option name
-     * @param   mixed   value for the option
-     *
-     * @return  mixed   MDB2_OK or MDB2 Error Object
-     *
-     * @access  public
-     */
-    function setOption($option, $value)
-    {
-        $res = parent::setOption($option, $value);
-        $this->_reCheckSupportedOptions();
-    }
-
-    // }}}
-    // {{{ errorInfo()
-
-    /**
-     * This method is used to collect information about an error
-     *
-     * @param integer $error
-     * @return array
-     * @access public
-     */
-    function errorInfo($error = null)
-    {
-        if ($this->connection) {
-            $native_code = @mysql_errno($this->connection);
-            $native_msg  = @mysql_error($this->connection);
-        } else {
-            $native_code = @mysql_errno();
-            $native_msg  = @mysql_error();
-        }
-        if (is_null($error)) {
-            static $ecode_map;
-            if (empty($ecode_map)) {
-                $ecode_map = array(
-                    1000 => MDB2_ERROR_INVALID, //hashchk
-                    1001 => MDB2_ERROR_INVALID, //isamchk
-                    1004 => MDB2_ERROR_CANNOT_CREATE,
-                    1005 => MDB2_ERROR_CANNOT_CREATE,
-                    1006 => MDB2_ERROR_CANNOT_CREATE,
-                    1007 => MDB2_ERROR_ALREADY_EXISTS,
-                    1008 => MDB2_ERROR_CANNOT_DROP,
-                    1009 => MDB2_ERROR_CANNOT_DROP,
-                    1010 => MDB2_ERROR_CANNOT_DROP,
-                    1011 => MDB2_ERROR_CANNOT_DELETE,
-                    1022 => MDB2_ERROR_ALREADY_EXISTS,
-                    1029 => MDB2_ERROR_NOT_FOUND,
-                    1032 => MDB2_ERROR_NOT_FOUND,
-                    1044 => MDB2_ERROR_ACCESS_VIOLATION,
-                    1045 => MDB2_ERROR_ACCESS_VIOLATION,
-                    1046 => MDB2_ERROR_NODBSELECTED,
-                    1048 => MDB2_ERROR_CONSTRAINT,
-                    1049 => MDB2_ERROR_NOSUCHDB,
-                    1050 => MDB2_ERROR_ALREADY_EXISTS,
-                    1051 => MDB2_ERROR_NOSUCHTABLE,
-                    1054 => MDB2_ERROR_NOSUCHFIELD,
-                    1060 => MDB2_ERROR_ALREADY_EXISTS,
-                    1061 => MDB2_ERROR_ALREADY_EXISTS,
-                    1062 => MDB2_ERROR_ALREADY_EXISTS,
-                    1064 => MDB2_ERROR_SYNTAX,
-                    1067 => MDB2_ERROR_INVALID,
-                    1072 => MDB2_ERROR_NOT_FOUND,
-                    1086 => MDB2_ERROR_ALREADY_EXISTS,
-                    1091 => MDB2_ERROR_NOT_FOUND,
-                    1100 => MDB2_ERROR_NOT_LOCKED,
-                    1109 => MDB2_ERROR_NOT_FOUND,
-                    1125 => MDB2_ERROR_ALREADY_EXISTS,
-                    1136 => MDB2_ERROR_VALUE_COUNT_ON_ROW,
-                    1138 => MDB2_ERROR_INVALID,
-                    1142 => MDB2_ERROR_ACCESS_VIOLATION,
-                    1143 => MDB2_ERROR_ACCESS_VIOLATION,
-                    1146 => MDB2_ERROR_NOSUCHTABLE,
-                    1149 => MDB2_ERROR_SYNTAX,
-                    1169 => MDB2_ERROR_CONSTRAINT,
-                    1176 => MDB2_ERROR_NOT_FOUND,
-                    1177 => MDB2_ERROR_NOSUCHTABLE,
-                    1213 => MDB2_ERROR_DEADLOCK,
-                    1216 => MDB2_ERROR_CONSTRAINT,
-                    1217 => MDB2_ERROR_CONSTRAINT,
-                    1227 => MDB2_ERROR_ACCESS_VIOLATION,
-                    1235 => MDB2_ERROR_CANNOT_CREATE,
-                    1299 => MDB2_ERROR_INVALID_DATE,
-                    1300 => MDB2_ERROR_INVALID,
-                    1304 => MDB2_ERROR_ALREADY_EXISTS,
-                    1305 => MDB2_ERROR_NOT_FOUND,
-                    1306 => MDB2_ERROR_CANNOT_DROP,
-                    1307 => MDB2_ERROR_CANNOT_CREATE,
-                    1334 => MDB2_ERROR_CANNOT_ALTER,
-                    1339 => MDB2_ERROR_NOT_FOUND,
-                    1356 => MDB2_ERROR_INVALID,
-                    1359 => MDB2_ERROR_ALREADY_EXISTS,
-                    1360 => MDB2_ERROR_NOT_FOUND,
-                    1363 => MDB2_ERROR_NOT_FOUND,
-                    1365 => MDB2_ERROR_DIVZERO,
-                    1451 => MDB2_ERROR_CONSTRAINT,
-                    1452 => MDB2_ERROR_CONSTRAINT,
-                    1542 => MDB2_ERROR_CANNOT_DROP,
-                    1546 => MDB2_ERROR_CONSTRAINT,
-                    1582 => MDB2_ERROR_CONSTRAINT,
-                    2003 => MDB2_ERROR_CONNECT_FAILED,
-                    2019 => MDB2_ERROR_INVALID,
-                );
-            }
-            if ($this->options['portability'] & MDB2_PORTABILITY_ERRORS) {
-                $ecode_map[1022] = MDB2_ERROR_CONSTRAINT;
-                $ecode_map[1048] = MDB2_ERROR_CONSTRAINT_NOT_NULL;
-                $ecode_map[1062] = MDB2_ERROR_CONSTRAINT;
-            } else {
-                // Doing this in case mode changes during runtime.
-                $ecode_map[1022] = MDB2_ERROR_ALREADY_EXISTS;
-                $ecode_map[1048] = MDB2_ERROR_CONSTRAINT;
-                $ecode_map[1062] = MDB2_ERROR_ALREADY_EXISTS;
-            }
-            if (isset($ecode_map[$native_code])) {
-                $error = $ecode_map[$native_code];
-            }
-        }
-        return array($error, $native_code, $native_msg);
-    }
-
-    // }}}
-    // {{{ escape()
-
-    /**
-     * Quotes a string so it can be safely used in a query. It will quote
-     * the text so it can safely be used within a query.
-     *
-     * @param   string  the input string to quote
-     * @param   bool    escape wildcards
-     *
-     * @return  string  quoted string
-     *
-     * @access  public
-     */
-    function escape($text, $escape_wildcards = false)
-    {
-        if ($escape_wildcards) {
-            $text = $this->escapePattern($text);
-        }
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-        $text = @mysql_real_escape_string($text, $connection);
-        return $text;
-    }
-
-    // }}}
-    // {{{ beginTransaction()
-
-    /**
-     * Start a transaction or set a savepoint.
-     *
-     * @param   string  name of a savepoint to set
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function beginTransaction($savepoint = null)
-    {
-        $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        $this->_getServerCapabilities();
-        if (!is_null($savepoint)) {
-            if (!$this->supports('savepoints')) {
-                return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'savepoints are not supported', __FUNCTION__);
-            }
-            if (!$this->in_transaction) {
-                return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                    'savepoint cannot be released when changes are auto committed', __FUNCTION__);
-            }
-            $query = 'SAVEPOINT '.$savepoint;
-            return $this->_doQuery($query, true);
-        } elseif ($this->in_transaction) {
-            return MDB2_OK;  //nothing to do
-        }
-        if (!$this->destructor_registered && $this->opened_persistent) {
-            $this->destructor_registered = true;
-            register_shutdown_function('MDB2_closeOpenTransactions');
-        }
-        $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0';
-        $result = $this->_doQuery($query, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = true;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ commit()
-
-    /**
-     * Commit the database changes done during a transaction that is in
-     * progress or release a savepoint. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after committing the pending changes.
-     *
-     * @param   string  name of a savepoint to release
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function commit($savepoint = null)
-    {
-        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (!$this->in_transaction) {
-            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
-        }
-        if (!is_null($savepoint)) {
-            if (!$this->supports('savepoints')) {
-                return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'savepoints are not supported', __FUNCTION__);
-            }
-            $server_info = $this->getServerVersion();
-            if (version_compare($server_info['major'].'.'.$server_info['minor'].'.'.$server_info['patch'], '5.0.3', '<')) {
-                return MDB2_OK;
-            }
-            $query = 'RELEASE SAVEPOINT '.$savepoint;
-            return $this->_doQuery($query, true);
-        }
-
-        if (!$this->supports('transactions')) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'transactions are not supported', __FUNCTION__);
-        }
-
-        $result = $this->_doQuery('COMMIT', true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if (!$this->start_transaction) {
-            $query = 'SET AUTOCOMMIT = 1';
-            $result = $this->_doQuery($query, true);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-        $this->in_transaction = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ rollback()
-
-    /**
-     * Cancel any database changes done during a transaction or since a specific
-     * savepoint that is in progress. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after canceling the pending changes.
-     *
-     * @param   string  name of a savepoint to rollback to
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function rollback($savepoint = null)
-    {
-        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (!$this->in_transaction) {
-            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                'rollback cannot be done changes are auto committed', __FUNCTION__);
-        }
-        if (!is_null($savepoint)) {
-            if (!$this->supports('savepoints')) {
-                return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                    'savepoints are not supported', __FUNCTION__);
-            }
-            $query = 'ROLLBACK TO SAVEPOINT '.$savepoint;
-            return $this->_doQuery($query, true);
-        }
-
-        $query = 'ROLLBACK';
-        $result = $this->_doQuery($query, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        if (!$this->start_transaction) {
-            $query = 'SET AUTOCOMMIT = 1';
-            $result = $this->_doQuery($query, true);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-        $this->in_transaction = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function setTransactionIsolation()
-
-    /**
-     * Set the transacton isolation level.
-     *
-     * @param   string  standard isolation level
-     *                  READ UNCOMMITTED (allows dirty reads)
-     *                  READ COMMITTED (prevents dirty reads)
-     *                  REPEATABLE READ (prevents nonrepeatable reads)
-     *                  SERIALIZABLE (prevents phantom reads)
-     * @param   array some transaction options:
-     *                  'wait' => 'WAIT' | 'NO WAIT'
-     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function setTransactionIsolation($isolation, $options = array())
-    {
-        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
-        if (!$this->supports('transactions')) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'transactions are not supported', __FUNCTION__);
-        }
-        switch ($isolation) {
-        case 'READ UNCOMMITTED':
-        case 'READ COMMITTED':
-        case 'REPEATABLE READ':
-        case 'SERIALIZABLE':
-            break;
-        default:
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'isolation level is not supported: '.$isolation, __FUNCTION__);
-        }
-
-        $query = "SET SESSION TRANSACTION ISOLATION LEVEL $isolation";
-        return $this->_doQuery($query, true);
-    }
-
-    // }}}
-    // {{{ _doConnect()
-
-    /**
-     * do the grunt work of the connect
-     *
-     * @return connection on success or MDB2 Error Object on failure
-     * @access protected
-     */
-    function _doConnect($username, $password, $persistent = false)
-    {
-        if (!PEAR::loadExtension($this->phptype)) {
-            return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__);
-        }
-
-        $params = array();
-        $unix = ($this->dsn['protocol'] && $this->dsn['protocol'] == 'unix');
-        if (empty($this->dsn['hostspec'])) {
-            $this->dsn['hostspec'] = $unix ? '' : 'localhost';
-        }
-        if ($this->dsn['hostspec']) {
-            $params[0] = $this->dsn['hostspec'] . ($this->dsn['port'] ? ':' . $this->dsn['port'] : '');
-        } else {
-            $params[0] = ':' . $this->dsn['socket'];
-        }
-        $params[] = $username ? $username : null;
-        $params[] = $password ? $password : null;
-        if (!$persistent) {
-            if ($this->_isNewLinkSet()) {
-                $params[] = true;
-            } else {
-                $params[] = false;
-            }
-        }
-        if (version_compare(phpversion(), '4.3.0', '>=')) {
-            $params[] = isset($this->dsn['client_flags'])
-                ? $this->dsn['client_flags'] : null;
-        }
-        $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';
-
-        $connection = @call_user_func_array($connect_function, $params);
-        if (!$connection) {
-            if (($err = @mysql_error()) != '') {
-                return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
-                    $err, __FUNCTION__);
-            } else {
-                return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
-                    'unable to establish a connection', __FUNCTION__);
-            }
-        }
-
-        if (!empty($this->dsn['charset'])) {
-            $result = $this->setCharset($this->dsn['charset'], $connection);
-            if (PEAR::isError($result)) {
-                $this->disconnect(false);
-                return $result;
-            }
-        }
-
-        return $connection;
-    }
-
-    // }}}
-    // {{{ connect()
-
-    /**
-     * Connect to the database
-     *
-     * @return MDB2_OK on success, MDB2 Error Object on failure
-     * @access public
-     */
-    function connect()
-    {
-        if (is_resource($this->connection)) {
-            //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
-            if (MDB2::areEquals($this->connected_dsn, $this->dsn)
-                && $this->opened_persistent == $this->options['persistent']
-            ) {
-                return MDB2_OK;
-            }
-            $this->disconnect(false);
-        }
-
-        $connection = $this->_doConnect(
-            $this->dsn['username'],
-            $this->dsn['password'],
-            $this->options['persistent']
-        );
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $this->connection = $connection;
-        $this->connected_dsn = $this->dsn;
-        $this->connected_database_name = '';
-        $this->opened_persistent = $this->options['persistent'];
-        $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
-
-        if ($this->database_name) {
-            if ($this->database_name != $this->connected_database_name) {
-                if (!@mysql_select_db($this->database_name, $connection)) {
-                    $err = $this->raiseError(null, null, null,
-                        'Could not select the database: '.$this->database_name, __FUNCTION__);
-                    return $err;
-                }
-                $this->connected_database_name = $this->database_name;
-            }
-        }
-
-        $this->_getServerCapabilities();
-
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ setCharset()
-
-    /**
-     * Set the charset on the current connection
-     *
-     * @param string    charset (or array(charset, collation))
-     * @param resource  connection handle
-     *
-     * @return true on success, MDB2 Error Object on failure
-     */
-    function setCharset($charset, $connection = null)
-    {
-        if (is_null($connection)) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-        $collation = null;
-        if (is_array($charset) && 2 == count($charset)) {
-            $collation = array_pop($charset);
-            $charset   = array_pop($charset);
-        }
-        $client_info = mysql_get_client_info();
-        if (function_exists('mysql_set_charset') && version_compare($client_info, '5.0.6')) {
-            if (!$result = mysql_set_charset($charset, $connection)) {
-                $err = $this->raiseError(null, null, null,
-                    'Could not set client character set', __FUNCTION__);
-                return $err;
-            }
-            return $result;
-        }
-        $query = "SET NAMES '".mysql_real_escape_string($charset, $connection)."'";
-        if (!is_null($collation)) {
-            $query .= " COLLATE '".mysql_real_escape_string($collation, $connection)."'";
-        }
-        return $this->_doQuery($query, true, $connection);
-    }
-
-    // }}}
-    // {{{ databaseExists()
-
-    /**
-     * check if given database name is exists?
-     *
-     * @param string $name    name of the database that should be checked
-     *
-     * @return mixed true/false on success, a MDB2 error on failure
-     * @access public
-     */
-    function databaseExists($name)
-    {
-        $connection = $this->_doConnect($this->dsn['username'],
-                                        $this->dsn['password'],
-                                        $this->options['persistent']);
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $result = @mysql_select_db($name, $connection);
-        @mysql_close($connection);
-
-        return $result;
-    }
-
-    // }}}
-    // {{{ disconnect()
-
-    /**
-     * Log out and disconnect from the database.
-     *
-     * @param  boolean $force if the disconnect should be forced even if the
-     *                        connection is opened persistently
-     * @return mixed true on success, false if not connected and error
-     *                object on error
-     * @access public
-     */
-    function disconnect($force = true)
-    {
-        if (is_resource($this->connection)) {
-            if ($this->in_transaction) {
-                $dsn = $this->dsn;
-                $database_name = $this->database_name;
-                $persistent = $this->options['persistent'];
-                $this->dsn = $this->connected_dsn;
-                $this->database_name = $this->connected_database_name;
-                $this->options['persistent'] = $this->opened_persistent;
-                $this->rollback();
-                $this->dsn = $dsn;
-                $this->database_name = $database_name;
-                $this->options['persistent'] = $persistent;
-            }
-
-            if (!$this->opened_persistent || $force) {
-                $ok = @mysql_close($this->connection);
-                if (!$ok) {
-                    return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED,
-                           null, null, null, __FUNCTION__);
-                }
-            }
-        } else {
-            return false;
-        }
-        return parent::disconnect($force);
-    }
-
-    // }}}
-    // {{{ standaloneQuery()
-
-    /**
-     * execute a query as DBA
-     *
-     * @param string $query the SQL query
-     * @param mixed   $types  array that contains the types of the columns in
-     *                        the result set
-     * @param boolean $is_manip  if the query is a manipulation query
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function standaloneQuery($query, $types = null, $is_manip = false)
-    {
-        $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username'];
-        $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password'];
-        $connection = $this->_doConnect($user, $pass, $this->options['persistent']);
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
-        
-        $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name);
-        if (!PEAR::isError($result)) {
-            $result = $this->_affectedRows($connection, $result);
-        }
-
-        @mysql_close($connection);
-        return $result;
-    }
-
-    // }}}
-    // {{{ _doQuery()
-
-    /**
-     * Execute a query
-     * @param string $query  query
-     * @param boolean $is_manip  if the query is a manipulation query
-     * @param resource $connection
-     * @param string $database_name
-     * @return result or error object
-     * @access protected
-     */
-    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
-    {
-        $this->last_query = $query;
-        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        if ($this->options['disable_query']) {
-            $result = $is_manip ? 0 : null;
-            return $result;
-        }
-
-        if (is_null($connection)) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-        if (is_null($database_name)) {
-            $database_name = $this->database_name;
-        }
-
-        if ($database_name) {
-            if ($database_name != $this->connected_database_name) {
-                if (!@mysql_select_db($database_name, $connection)) {
-                    $err = $this->raiseError(null, null, null,
-                        'Could not select the database: '.$database_name, __FUNCTION__);
-                    return $err;
-                }
-                $this->connected_database_name = $database_name;
-            }
-        }
-
-        $function = $this->options['result_buffering']
-            ? 'mysql_query' : 'mysql_unbuffered_query';
-        $result = @$function($query, $connection);
-        if (!$result && 0 !== mysql_errno($connection)) {
-            $err = $this->raiseError(null, null, null,
-                'Could not execute statement', __FUNCTION__);
-            return $err;
-        }
-
-        $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result));
-        return $result;
-    }
-
-    // }}}
-    // {{{ _affectedRows()
-
-    /**
-     * Returns the number of rows affected
-     *
-     * @param resource $result
-     * @param resource $connection
-     * @return mixed MDB2 Error Object or the number of rows affected
-     * @access private
-     */
-    function _affectedRows($connection, $result = null)
-    {
-        if (is_null($connection)) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-        return @mysql_affected_rows($connection);
-    }
-
-    // }}}
-    // {{{ _modifyQuery()
-
-    /**
-     * Changes a query string for various DBMS specific reasons
-     *
-     * @param string $query  query to modify
-     * @param boolean $is_manip  if it is a DML query
-     * @param integer $limit  limit the number of rows
-     * @param integer $offset  start reading from given offset
-     * @return string modified query
-     * @access protected
-     */
-    function _modifyQuery($query, $is_manip, $limit, $offset)
-    {
-        if ($this->options['portability'] & MDB2_PORTABILITY_DELETE_COUNT) {
-            // "DELETE FROM table" gives 0 affected rows in MySQL.
-            // This little hack lets you know how many rows were deleted.
-            if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
-                $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
-                                      'DELETE FROM \1 WHERE 1=1', $query);
-            }
-        }
-        if ($limit > 0
-            && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query)
-        ) {
-            $query = rtrim($query);
-            if (substr($query, -1) == ';') {
-                $query = substr($query, 0, -1);
-            }
-
-            // LIMIT doesn't always come last in the query
-            // @see http://dev.mysql.com/doc/refman/5.0/en/select.html
-            $after = '';
-            if (preg_match('/(\s+INTO\s+(?:OUT|DUMP)FILE\s.*)$/ims', $query, $matches)) {
-                $after = $matches[0];
-                $query = preg_replace('/(\s+INTO\s+(?:OUT|DUMP)FILE\s.*)$/ims', '', $query);
-            } elseif (preg_match('/(\s+FOR\s+UPDATE\s*)$/i', $query, $matches)) {
-               $after = $matches[0];
-               $query = preg_replace('/(\s+FOR\s+UPDATE\s*)$/im', '', $query);
-            } elseif (preg_match('/(\s+LOCK\s+IN\s+SHARE\s+MODE\s*)$/im', $query, $matches)) {
-               $after = $matches[0];
-               $query = preg_replace('/(\s+LOCK\s+IN\s+SHARE\s+MODE\s*)$/im', '', $query);
-            }
-
-            if ($is_manip) {
-                return $query . " LIMIT $limit" . $after;
-            } else {
-                return $query . " LIMIT $offset, $limit" . $after;
-            }
-        }
-        return $query;
-    }
-
-    // }}}
-    // {{{ getServerVersion()
-
-    /**
-     * return version information about the server
-     *
-     * @param bool   $native  determines if the raw version string should be returned
-     * @return mixed array/string with version information or MDB2 error object
-     * @access public
-     */
-    function getServerVersion($native = false)
-    {
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-        if ($this->connected_server_info) {
-            $server_info = $this->connected_server_info;
-        } else {
-            $server_info = @mysql_get_server_info($connection);
-        }
-        if (!$server_info) {
-            return $this->raiseError(null, null, null,
-                'Could not get server information', __FUNCTION__);
-        }
-        // cache server_info
-        $this->connected_server_info = $server_info;
-        if (!$native) {
-            $tmp = explode('.', $server_info, 3);
-            if (isset($tmp[2]) && strpos($tmp[2], '-')) {
-                $tmp2 = explode('-', @$tmp[2], 2);
-            } else {
-                $tmp2[0] = isset($tmp[2]) ? $tmp[2] : null;
-                $tmp2[1] = null;
-            }
-            $server_info = array(
-                'major' => isset($tmp[0]) ? $tmp[0] : null,
-                'minor' => isset($tmp[1]) ? $tmp[1] : null,
-                'patch' => $tmp2[0],
-                'extra' => $tmp2[1],
-                'native' => $server_info,
-            );
-        }
-        return $server_info;
-    }
-
-    // }}}
-    // {{{ _getServerCapabilities()
-
-    /**
-     * Fetch some information about the server capabilities
-     * (transactions, subselects, prepared statements, etc).
-     *
-     * @access private
-     */
-    function _getServerCapabilities()
-    {
-        if (!$this->server_capabilities_checked) {
-            $this->server_capabilities_checked = true;
-
-            //set defaults
-            $this->supported['sub_selects'] = 'emulated';
-            $this->supported['prepared_statements'] = 'emulated';
-            $this->supported['triggers'] = false;
-            $this->start_transaction = false;
-            $this->varchar_max_length = 255;
-            
-            $server_info = $this->getServerVersion();
-            if (is_array($server_info)) {
-                $server_version = $server_info['major'].'.'.$server_info['minor'].'.'.$server_info['patch'];
-
-                if (!version_compare($server_version, '4.1.0', '<')) {
-                    $this->supported['sub_selects'] = true;
-                    $this->supported['prepared_statements'] = true;
-                }
-
-                // SAVEPOINTs were introduced in MySQL 4.0.14 and 4.1.1 (InnoDB)
-                if (version_compare($server_version, '4.1.0', '>=')) {
-                    if (version_compare($server_version, '4.1.1', '<')) {
-                        $this->supported['savepoints'] = false;
-                    }
-                } elseif (version_compare($server_version, '4.0.14', '<')) {
-                    $this->supported['savepoints'] = false;
-                }
-
-                if (!version_compare($server_version, '4.0.11', '<')) {
-                    $this->start_transaction = true;
-                }
-
-                if (!version_compare($server_version, '5.0.3', '<')) {
-                    $this->varchar_max_length = 65532;
-                }
-
-                if (!version_compare($server_version, '5.0.2', '<')) {
-                    $this->supported['triggers'] = true;
-                }
-            }
-        }
-    }
-
-    // }}}
-    // {{{ function _skipUserDefinedVariable($query, $position)
-
-    /**
-     * Utility method, used by prepare() to avoid misinterpreting MySQL user 
-     * defined variables (SELECT @x:=5) for placeholders.
-     * Check if the placeholder is a false positive, i.e. if it is an user defined
-     * variable instead. If so, skip it and advance the position, otherwise
-     * return the current position, which is valid
-     *
-     * @param string $query
-     * @param integer $position current string cursor position
-     * @return integer $new_position
-     * @access protected
-     */
-    function _skipUserDefinedVariable($query, $position)
-    {
-        $found = strpos(strrev(substr($query, 0, $position)), '@');
-        if ($found === false) {
-            return $position;
-        }
-        $pos = strlen($query) - strlen(substr($query, $position)) - $found - 1;
-        $substring = substr($query, $pos, $position - $pos + 2);
-        if (preg_match('/^@\w+\s*:=$/', $substring)) {
-            return $position + 1; //found an user defined variable: skip it
-        }
-        return $position;
-    }
-
-    // }}}
-    // {{{ prepare()
-
-    /**
-     * Prepares a query for multiple execution with execute().
-     * With some database backends, this is emulated.
-     * prepare() requires a generic query as string like
-     * 'INSERT INTO numbers VALUES(?,?)' or
-     * 'INSERT INTO numbers VALUES(:foo,:bar)'.
-     * The ? and :name and are placeholders which can be set using
-     * bindParam() and the query can be sent off using the execute() method.
-     * The allowed format for :name can be set with the 'bindname_format' option.
-     *
-     * @param string $query the query to prepare
-     * @param mixed   $types  array that contains the types of the placeholders
-     * @param mixed   $result_types  array that contains the types of the columns in
-     *                        the result set or MDB2_PREPARE_RESULT, if set to
-     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
-     * @param mixed   $lobs   key (field) value (parameter) pair for all lob placeholders
-     * @return mixed resource handle for the prepared query on success, a MDB2
-     *        error on failure
-     * @access public
-     * @see bindParam, execute
-     */
-    function prepare($query, $types = null, $result_types = null, $lobs = array())
-    {
-        // connect to get server capabilities (http://pear.php.net/bugs/16147)
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        if ($this->options['emulate_prepared']
-            || $this->supported['prepared_statements'] !== true
-        ) {
-            return parent::prepare($query, $types, $result_types, $lobs);
-        }
-        $is_manip = ($result_types === MDB2_PREPARE_MANIP);
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
-        $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        $placeholder_type_guess = $placeholder_type = null;
-        $question = '?';
-        $colon = ':';
-        $positions = array();
-        $position = 0;
-        while ($position < strlen($query)) {
-            $q_position = strpos($query, $question, $position);
-            $c_position = strpos($query, $colon, $position);
-            if ($q_position && $c_position) {
-                $p_position = min($q_position, $c_position);
-            } elseif ($q_position) {
-                $p_position = $q_position;
-            } elseif ($c_position) {
-                $p_position = $c_position;
-            } else {
-                break;
-            }
-            if (is_null($placeholder_type)) {
-                $placeholder_type_guess = $query[$p_position];
-            }
-            
-            $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position);
-            if (PEAR::isError($new_pos)) {
-                return $new_pos;
-            }
-            if ($new_pos != $position) {
-                $position = $new_pos;
-                continue; //evaluate again starting from the new position
-            }
-            
-            //make sure this is not part of an user defined variable
-            $new_pos = $this->_skipUserDefinedVariable($query, $position);
-            if ($new_pos != $position) {
-                $position = $new_pos;
-                continue; //evaluate again starting from the new position
-            }
-
-            if ($query[$position] == $placeholder_type_guess) {
-                if (is_null($placeholder_type)) {
-                    $placeholder_type = $query[$p_position];
-                    $question = $colon = $placeholder_type;
-                }
-                if ($placeholder_type == ':') {
-                    $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
-                    $parameter = preg_replace($regexp, '\\1', $query);
-                    if ($parameter === '') {
-                        $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                            'named parameter name must match "bindname_format" option', __FUNCTION__);
-                        return $err;
-                    }
-                    $positions[$p_position] = $parameter;
-                    $query = substr_replace($query, '?', $position, strlen($parameter)+1);
-                } else {
-                    $positions[$p_position] = count($positions);
-                }
-                $position = $p_position + 1;
-            } else {
-                $position = $p_position;
-            }
-        }
-
-        static $prep_statement_counter = 1;
-        $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand()));
-        $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']);
-        $query = "PREPARE $statement_name FROM ".$this->quote($query, 'text');
-        $statement = $this->_doQuery($query, true, $connection);
-        if (PEAR::isError($statement)) {
-            return $statement;
-        }
-
-        $class_name = 'MDB2_Statement_'.$this->phptype;
-        $obj = new $class_name($this, $statement_name, $positions, $query, $types, $result_types, $is_manip, $limit, $offset);
-        $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj));
-        return $obj;
-    }
-
-    // }}}
-    // {{{ replace()
-
-    /**
-     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
-     * query, except that if there is already a row in the table with the same
-     * key field values, the old row is deleted before the new row is inserted.
-     *
-     * The REPLACE type of query does not make part of the SQL standards. Since
-     * practically only MySQL implements it natively, this type of query is
-     * emulated through this method for other DBMS using standard types of
-     * queries inside a transaction to assure the atomicity of the operation.
-     *
-     * @access public
-     *
-     * @param string $table name of the table on which the REPLACE query will
-     *  be executed.
-     * @param array $fields associative array that describes the fields and the
-     *  values that will be inserted or updated in the specified table. The
-     *  indexes of the array are the names of all the fields of the table. The
-     *  values of the array are also associative arrays that describe the
-     *  values and other properties of the table fields.
-     *
-     *  Here follows a list of field properties that need to be specified:
-     *
-     *    value:
-     *          Value to be assigned to the specified field. This value may be
-     *          of specified in database independent type format as this
-     *          function can perform the necessary datatype conversions.
-     *
-     *    Default:
-     *          this property is required unless the Null property
-     *          is set to 1.
-     *
-     *    type
-     *          Name of the type of the field. Currently, all types Metabase
-     *          are supported except for clob and blob.
-     *
-     *    Default: no type conversion
-     *
-     *    null
-     *          Boolean property that indicates that the value for this field
-     *          should be set to null.
-     *
-     *          The default value for fields missing in INSERT queries may be
-     *          specified the definition of a table. Often, the default value
-     *          is already null, but since the REPLACE may be emulated using
-     *          an UPDATE query, make sure that all fields of the table are
-     *          listed in this function argument array.
-     *
-     *    Default: 0
-     *
-     *    key
-     *          Boolean property that indicates that this field should be
-     *          handled as a primary key or at least as part of the compound
-     *          unique index of the table that will determine the row that will
-     *          updated if it exists or inserted a new row otherwise.
-     *
-     *          This function will fail if no key field is specified or if the
-     *          value of a key field is set to null because fields that are
-     *          part of unique index they may not be null.
-     *
-     *    Default: 0
-     *
-     * @see http://dev.mysql.com/doc/refman/5.0/en/replace.html
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     */
-    function replace($table, $fields)
-    {
-        $count = count($fields);
-        $query = $values = '';
-        $keys = $colnum = 0;
-        for (reset($fields); $colnum < $count; next($fields), $colnum++) {
-            $name = key($fields);
-            if ($colnum > 0) {
-                $query .= ',';
-                $values.= ',';
-            }
-            $query.= $this->quoteIdentifier($name, true);
-            if (isset($fields[$name]['null']) && $fields[$name]['null']) {
-                $value = 'NULL';
-            } else {
-                $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null;
-                $value = $this->quote($fields[$name]['value'], $type);
-                if (PEAR::isError($value)) {
-                    return $value;
-                }
-            }
-            $values.= $value;
-            if (isset($fields[$name]['key']) && $fields[$name]['key']) {
-                if ($value === 'NULL') {
-                    return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
-                        'key value '.$name.' may not be NULL', __FUNCTION__);
-                }
-                $keys++;
-            }
-        }
-        if ($keys == 0) {
-            return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
-                'not specified which fields are keys', __FUNCTION__);
-        }
-
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $table = $this->quoteIdentifier($table, true);
-        $query = "REPLACE INTO $table ($query) VALUES ($values)";
-        $result = $this->_doQuery($query, true, $connection);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return $this->_affectedRows($connection, $result);
-    }
-
-    // }}}
-    // {{{ nextID()
-
-    /**
-     * Returns the next free id of a sequence
-     *
-     * @param string $seq_name name of the sequence
-     * @param boolean $ondemand when true the sequence is
-     *                          automatic created, if it
-     *                          not exists
-     *
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function nextID($seq_name, $ondemand = true)
-    {
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
-        $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true);
-        $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)";
-        $this->pushErrorHandling(PEAR_ERROR_RETURN);
-        $this->expectError(MDB2_ERROR_NOSUCHTABLE);
-        $result = $this->_doQuery($query, true);
-        $this->popExpect();
-        $this->popErrorHandling();
-        if (PEAR::isError($result)) {
-            if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) {
-                $this->loadModule('Manager', null, true);
-                $result = $this->manager->createSequence($seq_name);
-                if (PEAR::isError($result)) {
-                    return $this->raiseError($result, null, null,
-                        'on demand sequence '.$seq_name.' could not be created', __FUNCTION__);
-                } else {
-                    return $this->nextID($seq_name, false);
-                }
-            }
-            return $result;
-        }
-        $value = $this->lastInsertID();
-        if (is_numeric($value)) {
-            $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value";
-            $result = $this->_doQuery($query, true);
-            if (PEAR::isError($result)) {
-                $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name;
-            }
-        }
-        return $value;
-    }
-
-    // }}}
-    // {{{ lastInsertID()
-
-    /**
-     * Returns the autoincrement ID if supported or $id or fetches the current
-     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
-     *
-     * @param string $table name of the table into which a new row was inserted
-     * @param string $field name of the field into which a new row was inserted
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function lastInsertID($table = null, $field = null)
-    {
-        // not using mysql_insert_id() due to http://pear.php.net/bugs/bug.php?id=8051
-        // not casting to integer to handle BIGINT http://pear.php.net/bugs/bug.php?id=17650
-        return $this->queryOne('SELECT LAST_INSERT_ID()');
-    }
-
-    // }}}
-    // {{{ currID()
-
-    /**
-     * Returns the current id of a sequence
-     *
-     * @param string $seq_name name of the sequence
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function currID($seq_name)
-    {
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
-        $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true);
-        $query = "SELECT MAX($seqcol_name) FROM $sequence_name";
-        return $this->queryOne($query, 'integer');
-    }
-}
-
-/**
- * MDB2 MySQL result driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Result_mysql extends MDB2_Result_Common
-{
-    // }}}
-    // {{{ fetchRow()
-
-    /**
-     * Fetch a row and insert the data into an existing array.
-     *
-     * @param int       $fetchmode  how the array data should be indexed
-     * @param int    $rownum    number of the row where the data can be found
-     * @return int data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
-    {
-        if (!is_null($rownum)) {
-            $seek = $this->seek($rownum);
-            if (PEAR::isError($seek)) {
-                return $seek;
-            }
-        }
-        if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
-            $fetchmode = $this->db->fetchmode;
-        }
-        if ($fetchmode & MDB2_FETCHMODE_ASSOC) {
-            $row = @mysql_fetch_assoc($this->result);
-            if (is_array($row)
-                && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
-            ) {
-                $row = array_change_key_case($row, $this->db->options['field_case']);
-            }
-        } else {
-           $row = @mysql_fetch_row($this->result);
-        }
-
-        if (!$row) {
-            if ($this->result === false) {
-                $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-                return $err;
-            }
-            return null;
-        }
-        $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
-        $rtrim = false;
-        if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) {
-            if (empty($this->types)) {
-                $mode += MDB2_PORTABILITY_RTRIM;
-            } else {
-                $rtrim = true;
-            }
-        }
-        if ($mode) {
-            $this->db->_fixResultArrayValues($row, $mode);
-        }
-        if (!empty($this->types)) {
-            $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim);
-        }
-        if (!empty($this->values)) {
-            $this->_assignBindColumns($row);
-        }
-        if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
-            $object_class = $this->db->options['fetch_class'];
-            if ($object_class == 'stdClass') {
-                $row = (object) $row;
-            } else {
-                $rowObj = new $object_class($row);
-                $row = $rowObj;
-            }
-        }
-        ++$this->rownum;
-        return $row;
-    }
-
-    // }}}
-    // {{{ _getColumnNames()
-
-    /**
-     * Retrieve the names of columns returned by the DBMS in a query result.
-     *
-     * @return  mixed   Array variable that holds the names of columns as keys
-     *                  or an MDB2 error on failure.
-     *                  Some DBMS may not return any columns when the result set
-     *                  does not contain any rows.
-     * @access private
-     */
-    function _getColumnNames()
-    {
-        $columns = array();
-        $numcols = $this->numCols();
-        if (PEAR::isError($numcols)) {
-            return $numcols;
-        }
-        for ($column = 0; $column < $numcols; $column++) {
-            $column_name = @mysql_field_name($this->result, $column);
-            $columns[$column_name] = $column;
-        }
-        if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $columns = array_change_key_case($columns, $this->db->options['field_case']);
-        }
-        return $columns;
-    }
-
-    // }}}
-    // {{{ numCols()
-
-    /**
-     * Count the number of columns returned by the DBMS in a query result.
-     *
-     * @return mixed integer value with the number of columns, a MDB2 error
-     *                       on failure
-     * @access public
-     */
-    function numCols()
-    {
-        $cols = @mysql_num_fields($this->result);
-        if (is_null($cols)) {
-            if ($this->result === false) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            } elseif (is_null($this->result)) {
-                return count($this->types);
-            }
-            return $this->db->raiseError(null, null, null,
-                'Could not get column count', __FUNCTION__);
-        }
-        return $cols;
-    }
-
-    // }}}
-    // {{{ free()
-
-    /**
-     * Free the internal resources associated with result.
-     *
-     * @return boolean true on success, false if result is invalid
-     * @access public
-     */
-    function free()
-    {
-        if (is_resource($this->result) && $this->db->connection) {
-            $free = @mysql_free_result($this->result);
-            if ($free === false) {
-                return $this->db->raiseError(null, null, null,
-                    'Could not free result', __FUNCTION__);
-            }
-        }
-        $this->result = false;
-        return MDB2_OK;
-    }
-}
-
-/**
- * MDB2 MySQL buffered result driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_BufferedResult_mysql extends MDB2_Result_mysql
-{
-    // }}}
-    // {{{ seek()
-
-    /**
-     * Seek to a specific row in a result set
-     *
-     * @param int    $rownum    number of the row where the data can be found
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function seek($rownum = 0)
-    {
-        if ($this->rownum != ($rownum - 1) && !@mysql_data_seek($this->result, $rownum)) {
-            if ($this->result === false) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            } elseif (is_null($this->result)) {
-                return MDB2_OK;
-            }
-            return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
-                'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__);
-        }
-        $this->rownum = $rownum - 1;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ valid()
-
-    /**
-     * Check if the end of the result set has been reached
-     *
-     * @return mixed true or false on sucess, a MDB2 error on failure
-     * @access public
-     */
-    function valid()
-    {
-        $numrows = $this->numRows();
-        if (PEAR::isError($numrows)) {
-            return $numrows;
-        }
-        return $this->rownum < ($numrows - 1);
-    }
-
-    // }}}
-    // {{{ numRows()
-
-    /**
-     * Returns the number of rows in a result object
-     *
-     * @return mixed MDB2 Error Object or the number of rows
-     * @access public
-     */
-    function numRows()
-    {
-        $rows = @mysql_num_rows($this->result);
-        if (false === $rows) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            } elseif (is_null($this->result)) {
-                return 0;
-            }
-            return $this->db->raiseError(null, null, null,
-                'Could not get row count', __FUNCTION__);
-        }
-        return $rows;
-    }
-    
-    // }}}
-}
-
-/**
- * MDB2 MySQL statement driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Statement_mysql extends MDB2_Statement_Common
-{
-    // {{{ _execute()
-
-    /**
-     * Execute a prepared query statement helper method.
-     *
-     * @param mixed $result_class string which specifies which result class to use
-     * @param mixed $result_wrap_class string which specifies which class to wrap results in
-     *
-     * @return mixed MDB2_Result or integer (affected rows) on success,
-     *               a MDB2 error on failure
-     * @access private
-     */
-    function _execute($result_class = true, $result_wrap_class = false)
-    {
-        if (is_null($this->statement)) {
-            $result = parent::_execute($result_class, $result_wrap_class);
-            return $result;
-        }
-        $this->db->last_query = $this->query;
-        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values));
-        if ($this->db->getOption('disable_query')) {
-            $result = $this->is_manip ? 0 : null;
-            return $result;
-        }
-
-        $connection = $this->db->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $query = 'EXECUTE '.$this->statement;
-        if (!empty($this->positions)) {
-            $parameters = array();
-            foreach ($this->positions as $parameter) {
-                if (!array_key_exists($parameter, $this->values)) {
-                    return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                        'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
-                }
-                $close = false;
-                $value = $this->values[$parameter];
-                $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null;
-                if (is_resource($value) || $type == 'clob' || $type == 'blob' && $this->db->options['lob_allow_url_include']) {
-                    if (!is_resource($value) && preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
-                        if ($match[1] == 'file://') {
-                            $value = $match[2];
-                        }
-                        $value = @fopen($value, 'r');
-                        $close = true;
-                    }
-                    if (is_resource($value)) {
-                        $data = '';
-                        while (!@feof($value)) {
-                            $data.= @fread($value, $this->db->options['lob_buffer_length']);
-                        }
-                        if ($close) {
-                            @fclose($value);
-                        }
-                        $value = $data;
-                    }
-                }
-                $quoted = $this->db->quote($value, $type);
-                if (PEAR::isError($quoted)) {
-                    return $quoted;
-                }
-                $param_query = 'SET @'.$parameter.' = '.$quoted;
-                $result = $this->db->_doQuery($param_query, true, $connection);
-                if (PEAR::isError($result)) {
-                    return $result;
-                }
-            }
-            $query.= ' USING @'.implode(', @', array_values($this->positions));
-        }
-
-        $result = $this->db->_doQuery($query, $this->is_manip, $connection);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        if ($this->is_manip) {
-            $affected_rows = $this->db->_affectedRows($connection, $result);
-            return $affected_rows;
-        }
-
-        $result = $this->db->_wrapResult($result, $this->result_types,
-            $result_class, $result_wrap_class, $this->limit, $this->offset);
-        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result));
-        return $result;
-    }
-
-    // }}}
-    // {{{ free()
-
-    /**
-     * Release resources allocated for the specified prepared query.
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function free()
-    {
-        if (is_null($this->positions)) {
-            return $this->db->raiseError(MDB2_ERROR, null, null,
-                'Prepared statement has already been freed', __FUNCTION__);
-        }
-        $result = MDB2_OK;
-
-        if (!is_null($this->statement)) {
-            $connection = $this->db->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-            $query = 'DEALLOCATE PREPARE '.$this->statement;
-            $result = $this->db->_doQuery($query, true, $connection);
-        }
-
-        parent::free();
-        return $result;
-    }
-}
-?>
+<?php
+// vim: set et ts=4 sw=4 fdm=marker:
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * MDB2 MySQL driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_mysql extends MDB2_Driver_Common
+{
+    // {{{ properties
+
+    public $string_quoting = array(
+        'start' => "'",
+        'end' => "'",
+        'escape' => '\\',
+        'escape_pattern' => '\\',
+    );
+
+    public $identifier_quoting = array(
+        'start' => '`',
+        'end' => '`',
+        'escape' => '`',
+    );
+
+    public $sql_comments = array(
+        array('start' => '-- ', 'end' => "\n", 'escape' => false),
+        array('start' => '#', 'end' => "\n", 'escape' => false),
+        array('start' => '/*', 'end' => '*/', 'escape' => false),
+    );
+
+    protected $server_capabilities_checked = false;
+
+    protected $start_transaction = false;
+
+    protected $varchar_max_length = 255;
+
+    // }}}
+    // {{{ constructor
+
+    /**
+     * Constructor
+     */
+    function __construct()
+    {
+        parent::__construct();
+
+        $this->phptype = 'mysql';
+        $this->dbsyntax = 'mysql';
+
+        $this->supported['sequences'] = 'emulated';
+        $this->supported['indexes'] = true;
+        $this->supported['affected_rows'] = true;
+        $this->supported['transactions'] = false;
+        $this->supported['savepoints'] = false;
+        $this->supported['summary_functions'] = true;
+        $this->supported['order_by_text'] = true;
+        $this->supported['current_id'] = 'emulated';
+        $this->supported['limit_queries'] = true;
+        $this->supported['LOBs'] = true;
+        $this->supported['replace'] = true;
+        $this->supported['sub_selects'] = 'emulated';
+        $this->supported['triggers'] = false;
+        $this->supported['auto_increment'] = true;
+        $this->supported['primary_key'] = true;
+        $this->supported['result_introspection'] = true;
+        $this->supported['prepared_statements'] = 'emulated';
+        $this->supported['identifier_quoting'] = true;
+        $this->supported['pattern_escaping'] = true;
+        $this->supported['new_link'] = true;
+
+        $this->options['DBA_username'] = false;
+        $this->options['DBA_password'] = false;
+        $this->options['default_table_type'] = '';
+        $this->options['max_identifiers_length'] = 64;
+
+        $this->_reCheckSupportedOptions();
+    }
+
+    // }}}
+    // {{{ _reCheckSupportedOptions()
+
+    /**
+     * If the user changes certain options, other capabilities may depend
+     * on the new settings, so we need to check them (again).
+     *
+     * @access private
+     */
+    function _reCheckSupportedOptions()
+    {
+        $this->supported['transactions'] = $this->options['use_transactions'];
+        $this->supported['savepoints']   = $this->options['use_transactions'];
+        if ($this->options['default_table_type']) {
+            switch (strtoupper($this->options['default_table_type'])) {
+            case 'BLACKHOLE':
+            case 'MEMORY':
+            case 'ARCHIVE':
+            case 'CSV':
+            case 'HEAP':
+            case 'ISAM':
+            case 'MERGE':
+            case 'MRG_ISAM':
+            case 'ISAM':
+            case 'MRG_MYISAM':
+            case 'MYISAM':
+                $this->supported['savepoints']   = false;
+                $this->supported['transactions'] = false;
+                $this->warnings[] = $this->options['default_table_type'] .
+                    ' is not a supported default table type';
+                break;
+            }
+        }
+    }
+
+    // }}}
+    // {{{ function setOption($option, $value)
+
+    /**
+     * set the option for the db class
+     *
+     * @param   string  option name
+     * @param   mixed   value for the option
+     *
+     * @return  mixed   MDB2_OK or MDB2 Error Object
+     *
+     * @access  public
+     */
+    function setOption($option, $value)
+    {
+        $res = parent::setOption($option, $value);
+        $this->_reCheckSupportedOptions();
+    }
+
+    // }}}
+    // {{{ errorInfo()
+
+    /**
+     * This method is used to collect information about an error
+     *
+     * @param integer $error
+     * @return array
+     * @access public
+     */
+    function errorInfo($error = null)
+    {
+        if ($this->connection) {
+            $native_code = @mysql_errno($this->connection);
+            $native_msg  = @mysql_error($this->connection);
+        } else {
+            $native_code = @mysql_errno();
+            $native_msg  = @mysql_error();
+        }
+        if (is_null($error)) {
+            static $ecode_map;
+            if (empty($ecode_map)) {
+                $ecode_map = array(
+                    1000 => MDB2_ERROR_INVALID, //hashchk
+                    1001 => MDB2_ERROR_INVALID, //isamchk
+                    1004 => MDB2_ERROR_CANNOT_CREATE,
+                    1005 => MDB2_ERROR_CANNOT_CREATE,
+                    1006 => MDB2_ERROR_CANNOT_CREATE,
+                    1007 => MDB2_ERROR_ALREADY_EXISTS,
+                    1008 => MDB2_ERROR_CANNOT_DROP,
+                    1009 => MDB2_ERROR_CANNOT_DROP,
+                    1010 => MDB2_ERROR_CANNOT_DROP,
+                    1011 => MDB2_ERROR_CANNOT_DELETE,
+                    1022 => MDB2_ERROR_ALREADY_EXISTS,
+                    1029 => MDB2_ERROR_NOT_FOUND,
+                    1032 => MDB2_ERROR_NOT_FOUND,
+                    1044 => MDB2_ERROR_ACCESS_VIOLATION,
+                    1045 => MDB2_ERROR_ACCESS_VIOLATION,
+                    1046 => MDB2_ERROR_NODBSELECTED,
+                    1048 => MDB2_ERROR_CONSTRAINT,
+                    1049 => MDB2_ERROR_NOSUCHDB,
+                    1050 => MDB2_ERROR_ALREADY_EXISTS,
+                    1051 => MDB2_ERROR_NOSUCHTABLE,
+                    1054 => MDB2_ERROR_NOSUCHFIELD,
+                    1060 => MDB2_ERROR_ALREADY_EXISTS,
+                    1061 => MDB2_ERROR_ALREADY_EXISTS,
+                    1062 => MDB2_ERROR_ALREADY_EXISTS,
+                    1064 => MDB2_ERROR_SYNTAX,
+                    1067 => MDB2_ERROR_INVALID,
+                    1072 => MDB2_ERROR_NOT_FOUND,
+                    1086 => MDB2_ERROR_ALREADY_EXISTS,
+                    1091 => MDB2_ERROR_NOT_FOUND,
+                    1100 => MDB2_ERROR_NOT_LOCKED,
+                    1109 => MDB2_ERROR_NOT_FOUND,
+                    1125 => MDB2_ERROR_ALREADY_EXISTS,
+                    1136 => MDB2_ERROR_VALUE_COUNT_ON_ROW,
+                    1138 => MDB2_ERROR_INVALID,
+                    1142 => MDB2_ERROR_ACCESS_VIOLATION,
+                    1143 => MDB2_ERROR_ACCESS_VIOLATION,
+                    1146 => MDB2_ERROR_NOSUCHTABLE,
+                    1149 => MDB2_ERROR_SYNTAX,
+                    1169 => MDB2_ERROR_CONSTRAINT,
+                    1176 => MDB2_ERROR_NOT_FOUND,
+                    1177 => MDB2_ERROR_NOSUCHTABLE,
+                    1213 => MDB2_ERROR_DEADLOCK,
+                    1216 => MDB2_ERROR_CONSTRAINT,
+                    1217 => MDB2_ERROR_CONSTRAINT,
+                    1227 => MDB2_ERROR_ACCESS_VIOLATION,
+                    1235 => MDB2_ERROR_CANNOT_CREATE,
+                    1299 => MDB2_ERROR_INVALID_DATE,
+                    1300 => MDB2_ERROR_INVALID,
+                    1304 => MDB2_ERROR_ALREADY_EXISTS,
+                    1305 => MDB2_ERROR_NOT_FOUND,
+                    1306 => MDB2_ERROR_CANNOT_DROP,
+                    1307 => MDB2_ERROR_CANNOT_CREATE,
+                    1334 => MDB2_ERROR_CANNOT_ALTER,
+                    1339 => MDB2_ERROR_NOT_FOUND,
+                    1356 => MDB2_ERROR_INVALID,
+                    1359 => MDB2_ERROR_ALREADY_EXISTS,
+                    1360 => MDB2_ERROR_NOT_FOUND,
+                    1363 => MDB2_ERROR_NOT_FOUND,
+                    1365 => MDB2_ERROR_DIVZERO,
+                    1451 => MDB2_ERROR_CONSTRAINT,
+                    1452 => MDB2_ERROR_CONSTRAINT,
+                    1542 => MDB2_ERROR_CANNOT_DROP,
+                    1546 => MDB2_ERROR_CONSTRAINT,
+                    1582 => MDB2_ERROR_CONSTRAINT,
+                    2003 => MDB2_ERROR_CONNECT_FAILED,
+                    2019 => MDB2_ERROR_INVALID,
+                );
+            }
+            if ($this->options['portability'] & MDB2_PORTABILITY_ERRORS) {
+                $ecode_map[1022] = MDB2_ERROR_CONSTRAINT;
+                $ecode_map[1048] = MDB2_ERROR_CONSTRAINT_NOT_NULL;
+                $ecode_map[1062] = MDB2_ERROR_CONSTRAINT;
+            } else {
+                // Doing this in case mode changes during runtime.
+                $ecode_map[1022] = MDB2_ERROR_ALREADY_EXISTS;
+                $ecode_map[1048] = MDB2_ERROR_CONSTRAINT;
+                $ecode_map[1062] = MDB2_ERROR_ALREADY_EXISTS;
+            }
+            if (isset($ecode_map[$native_code])) {
+                $error = $ecode_map[$native_code];
+            }
+        }
+        return array($error, $native_code, $native_msg);
+    }
+
+    // }}}
+    // {{{ escape()
+
+    /**
+     * Quotes a string so it can be safely used in a query. It will quote
+     * the text so it can safely be used within a query.
+     *
+     * @param   string  the input string to quote
+     * @param   bool    escape wildcards
+     *
+     * @return  string  quoted string
+     *
+     * @access  public
+     */
+    function escape($text, $escape_wildcards = false)
+    {
+        if ($escape_wildcards) {
+            $text = $this->escapePattern($text);
+        }
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+        $text = @mysql_real_escape_string($text, $connection);
+        return $text;
+    }
+
+    // }}}
+    // {{{ beginTransaction()
+
+    /**
+     * Start a transaction or set a savepoint.
+     *
+     * @param   string  name of a savepoint to set
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function beginTransaction($savepoint = null)
+    {
+        $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        $this->_getServerCapabilities();
+        if (!is_null($savepoint)) {
+            if (!$this->supports('savepoints')) {
+                return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'savepoints are not supported', __FUNCTION__);
+            }
+            if (!$this->in_transaction) {
+                return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                    'savepoint cannot be released when changes are auto committed', __FUNCTION__);
+            }
+            $query = 'SAVEPOINT '.$savepoint;
+            return $this->_doQuery($query, true);
+        } elseif ($this->in_transaction) {
+            return MDB2_OK;  //nothing to do
+        }
+        if (!$this->destructor_registered && $this->opened_persistent) {
+            $this->destructor_registered = true;
+            register_shutdown_function('MDB2_closeOpenTransactions');
+        }
+        $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0';
+        $result = $this->_doQuery($query, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = true;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ commit()
+
+    /**
+     * Commit the database changes done during a transaction that is in
+     * progress or release a savepoint. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after committing the pending changes.
+     *
+     * @param   string  name of a savepoint to release
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function commit($savepoint = null)
+    {
+        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (!$this->in_transaction) {
+            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
+        }
+        if (!is_null($savepoint)) {
+            if (!$this->supports('savepoints')) {
+                return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'savepoints are not supported', __FUNCTION__);
+            }
+            $server_info = $this->getServerVersion();
+            if (version_compare($server_info['major'].'.'.$server_info['minor'].'.'.$server_info['patch'], '5.0.3', '<')) {
+                return MDB2_OK;
+            }
+            $query = 'RELEASE SAVEPOINT '.$savepoint;
+            return $this->_doQuery($query, true);
+        }
+
+        if (!$this->supports('transactions')) {
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'transactions are not supported', __FUNCTION__);
+        }
+
+        $result = $this->_doQuery('COMMIT', true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if (!$this->start_transaction) {
+            $query = 'SET AUTOCOMMIT = 1';
+            $result = $this->_doQuery($query, true);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+        $this->in_transaction = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ rollback()
+
+    /**
+     * Cancel any database changes done during a transaction or since a specific
+     * savepoint that is in progress. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after canceling the pending changes.
+     *
+     * @param   string  name of a savepoint to rollback to
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function rollback($savepoint = null)
+    {
+        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (!$this->in_transaction) {
+            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                'rollback cannot be done changes are auto committed', __FUNCTION__);
+        }
+        if (!is_null($savepoint)) {
+            if (!$this->supports('savepoints')) {
+                return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                    'savepoints are not supported', __FUNCTION__);
+            }
+            $query = 'ROLLBACK TO SAVEPOINT '.$savepoint;
+            return $this->_doQuery($query, true);
+        }
+
+        $query = 'ROLLBACK';
+        $result = $this->_doQuery($query, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        if (!$this->start_transaction) {
+            $query = 'SET AUTOCOMMIT = 1';
+            $result = $this->_doQuery($query, true);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+        $this->in_transaction = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function setTransactionIsolation()
+
+    /**
+     * Set the transacton isolation level.
+     *
+     * @param   string  standard isolation level
+     *                  READ UNCOMMITTED (allows dirty reads)
+     *                  READ COMMITTED (prevents dirty reads)
+     *                  REPEATABLE READ (prevents nonrepeatable reads)
+     *                  SERIALIZABLE (prevents phantom reads)
+     * @param   array some transaction options:
+     *                  'wait' => 'WAIT' | 'NO WAIT'
+     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function setTransactionIsolation($isolation, $options = array())
+    {
+        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
+        if (!$this->supports('transactions')) {
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'transactions are not supported', __FUNCTION__);
+        }
+        switch ($isolation) {
+        case 'READ UNCOMMITTED':
+        case 'READ COMMITTED':
+        case 'REPEATABLE READ':
+        case 'SERIALIZABLE':
+            break;
+        default:
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'isolation level is not supported: '.$isolation, __FUNCTION__);
+        }
+
+        $query = "SET SESSION TRANSACTION ISOLATION LEVEL $isolation";
+        return $this->_doQuery($query, true);
+    }
+
+    // }}}
+    // {{{ _doConnect()
+
+    /**
+     * do the grunt work of the connect
+     *
+     * @return connection on success or MDB2 Error Object on failure
+     * @access protected
+     */
+    function _doConnect($username, $password, $persistent = false)
+    {
+        if (!PEAR::loadExtension($this->phptype)) {
+            return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__);
+        }
+
+        $params = array();
+        $unix = ($this->dsn['protocol'] && $this->dsn['protocol'] == 'unix');
+        if (empty($this->dsn['hostspec'])) {
+            $this->dsn['hostspec'] = $unix ? '' : 'localhost';
+        }
+        if ($this->dsn['hostspec']) {
+            $params[0] = $this->dsn['hostspec'] . ($this->dsn['port'] ? ':' . $this->dsn['port'] : '');
+        } else {
+            $params[0] = ':' . $this->dsn['socket'];
+        }
+        $params[] = $username ? $username : null;
+        $params[] = $password ? $password : null;
+        if (!$persistent) {
+            if ($this->_isNewLinkSet()) {
+                $params[] = true;
+            } else {
+                $params[] = false;
+            }
+        }
+        if (version_compare(phpversion(), '4.3.0', '>=')) {
+            $params[] = isset($this->dsn['client_flags'])
+                ? $this->dsn['client_flags'] : null;
+        }
+        $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';
+
+        $connection = @call_user_func_array($connect_function, $params);
+        if (!$connection) {
+            if (($err = @mysql_error()) != '') {
+                return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
+                    $err, __FUNCTION__);
+            } else {
+                return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
+                    'unable to establish a connection', __FUNCTION__);
+            }
+        }
+
+        if (!empty($this->dsn['charset'])) {
+            $result = $this->setCharset($this->dsn['charset'], $connection);
+            if (PEAR::isError($result)) {
+                $this->disconnect(false);
+                return $result;
+            }
+        }
+
+        return $connection;
+    }
+
+    // }}}
+    // {{{ connect()
+
+    /**
+     * Connect to the database
+     *
+     * @return MDB2_OK on success, MDB2 Error Object on failure
+     * @access public
+     */
+    function connect()
+    {
+        if (is_resource($this->connection)) {
+            //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
+            if (MDB2::areEquals($this->connected_dsn, $this->dsn)
+                && $this->opened_persistent == $this->options['persistent']
+            ) {
+                return MDB2_OK;
+            }
+            $this->disconnect(false);
+        }
+
+        $connection = $this->_doConnect(
+            $this->dsn['username'],
+            $this->dsn['password'],
+            $this->options['persistent']
+        );
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $this->connection = $connection;
+        $this->connected_dsn = $this->dsn;
+        $this->connected_database_name = '';
+        $this->opened_persistent = $this->options['persistent'];
+        $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
+
+        if ($this->database_name) {
+            if ($this->database_name != $this->connected_database_name) {
+                if (!@mysql_select_db($this->database_name, $connection)) {
+                    $err = $this->raiseError(null, null, null,
+                        'Could not select the database: '.$this->database_name, __FUNCTION__);
+                    return $err;
+                }
+                $this->connected_database_name = $this->database_name;
+            }
+        }
+
+        $this->_getServerCapabilities();
+
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ setCharset()
+
+    /**
+     * Set the charset on the current connection
+     *
+     * @param string    charset (or array(charset, collation))
+     * @param resource  connection handle
+     *
+     * @return true on success, MDB2 Error Object on failure
+     */
+    function setCharset($charset, $connection = null)
+    {
+        if (is_null($connection)) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+        $collation = null;
+        if (is_array($charset) && 2 == count($charset)) {
+            $collation = array_pop($charset);
+            $charset   = array_pop($charset);
+        }
+        $client_info = mysql_get_client_info();
+        if (function_exists('mysql_set_charset') && version_compare($client_info, '5.0.6')) {
+            if (!$result = mysql_set_charset($charset, $connection)) {
+                $err = $this->raiseError(null, null, null,
+                    'Could not set client character set', __FUNCTION__);
+                return $err;
+            }
+            return $result;
+        }
+        $query = "SET NAMES '".mysql_real_escape_string($charset, $connection)."'";
+        if (!is_null($collation)) {
+            $query .= " COLLATE '".mysql_real_escape_string($collation, $connection)."'";
+        }
+        return $this->_doQuery($query, true, $connection);
+    }
+
+    // }}}
+    // {{{ databaseExists()
+
+    /**
+     * check if given database name is exists?
+     *
+     * @param string $name    name of the database that should be checked
+     *
+     * @return mixed true/false on success, a MDB2 error on failure
+     * @access public
+     */
+    function databaseExists($name)
+    {
+        $connection = $this->_doConnect($this->dsn['username'],
+                                        $this->dsn['password'],
+                                        $this->options['persistent']);
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $result = @mysql_select_db($name, $connection);
+        @mysql_close($connection);
+
+        return $result;
+    }
+
+    // }}}
+    // {{{ disconnect()
+
+    /**
+     * Log out and disconnect from the database.
+     *
+     * @param  boolean $force if the disconnect should be forced even if the
+     *                        connection is opened persistently
+     * @return mixed true on success, false if not connected and error
+     *                object on error
+     * @access public
+     */
+    function disconnect($force = true)
+    {
+        if (is_resource($this->connection)) {
+            if ($this->in_transaction) {
+                $dsn = $this->dsn;
+                $database_name = $this->database_name;
+                $persistent = $this->options['persistent'];
+                $this->dsn = $this->connected_dsn;
+                $this->database_name = $this->connected_database_name;
+                $this->options['persistent'] = $this->opened_persistent;
+                $this->rollback();
+                $this->dsn = $dsn;
+                $this->database_name = $database_name;
+                $this->options['persistent'] = $persistent;
+            }
+
+            if (!$this->opened_persistent || $force) {
+                $ok = @mysql_close($this->connection);
+                if (!$ok) {
+                    return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED,
+                           null, null, null, __FUNCTION__);
+                }
+            }
+        } else {
+            return false;
+        }
+        return parent::disconnect($force);
+    }
+
+    // }}}
+    // {{{ standaloneQuery()
+
+    /**
+     * execute a query as DBA
+     *
+     * @param string $query the SQL query
+     * @param mixed   $types  array that contains the types of the columns in
+     *                        the result set
+     * @param boolean $is_manip  if the query is a manipulation query
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function standaloneQuery($query, $types = null, $is_manip = false)
+    {
+        $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username'];
+        $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password'];
+        $connection = $this->_doConnect($user, $pass, $this->options['persistent']);
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
+
+        $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name);
+        if (!PEAR::isError($result)) {
+            $result = $this->_affectedRows($connection, $result);
+        }
+
+        @mysql_close($connection);
+        return $result;
+    }
+
+    // }}}
+    // {{{ _doQuery()
+
+    /**
+     * Execute a query
+     * @param string $query  query
+     * @param boolean $is_manip  if the query is a manipulation query
+     * @param resource $connection
+     * @param string $database_name
+     * @return result or error object
+     * @access protected
+     */
+    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
+    {
+        $this->last_query = $query;
+        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        if ($this->options['disable_query']) {
+            $result = $is_manip ? 0 : null;
+            return $result;
+        }
+
+        if (is_null($connection)) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+        if (is_null($database_name)) {
+            $database_name = $this->database_name;
+        }
+
+        if ($database_name) {
+            if ($database_name != $this->connected_database_name) {
+                if (!@mysql_select_db($database_name, $connection)) {
+                    $err = $this->raiseError(null, null, null,
+                        'Could not select the database: '.$database_name, __FUNCTION__);
+                    return $err;
+                }
+                $this->connected_database_name = $database_name;
+            }
+        }
+
+        $function = $this->options['result_buffering']
+            ? 'mysql_query' : 'mysql_unbuffered_query';
+        $result = @$function($query, $connection);
+        if (!$result && 0 !== mysql_errno($connection)) {
+            $err = $this->raiseError(null, null, null,
+                'Could not execute statement', __FUNCTION__);
+            return $err;
+        }
+
+        $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result));
+        return $result;
+    }
+
+    // }}}
+    // {{{ _affectedRows()
+
+    /**
+     * Returns the number of rows affected
+     *
+     * @param resource $result
+     * @param resource $connection
+     * @return mixed MDB2 Error Object or the number of rows affected
+     * @access private
+     */
+    function _affectedRows($connection, $result = null)
+    {
+        if (is_null($connection)) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+        return @mysql_affected_rows($connection);
+    }
+
+    // }}}
+    // {{{ _modifyQuery()
+
+    /**
+     * Changes a query string for various DBMS specific reasons
+     *
+     * @param string $query  query to modify
+     * @param boolean $is_manip  if it is a DML query
+     * @param integer $limit  limit the number of rows
+     * @param integer $offset  start reading from given offset
+     * @return string modified query
+     * @access protected
+     */
+    function _modifyQuery($query, $is_manip, $limit, $offset)
+    {
+        if ($this->options['portability'] & MDB2_PORTABILITY_DELETE_COUNT) {
+            // "DELETE FROM table" gives 0 affected rows in MySQL.
+            // This little hack lets you know how many rows were deleted.
+            if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
+                $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
+                                      'DELETE FROM \1 WHERE 1=1', $query);
+            }
+        }
+        if ($limit > 0
+            && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query)
+        ) {
+            $query = rtrim($query);
+            if (substr($query, -1) == ';') {
+                $query = substr($query, 0, -1);
+            }
+
+            // LIMIT doesn't always come last in the query
+            // @see http://dev.mysql.com/doc/refman/5.0/en/select.html
+            $after = '';
+            if (preg_match('/(\s+INTO\s+(?:OUT|DUMP)FILE\s.*)$/ims', $query, $matches)) {
+                $after = $matches[0];
+                $query = preg_replace('/(\s+INTO\s+(?:OUT|DUMP)FILE\s.*)$/ims', '', $query);
+            } elseif (preg_match('/(\s+FOR\s+UPDATE\s*)$/i', $query, $matches)) {
+               $after = $matches[0];
+               $query = preg_replace('/(\s+FOR\s+UPDATE\s*)$/im', '', $query);
+            } elseif (preg_match('/(\s+LOCK\s+IN\s+SHARE\s+MODE\s*)$/im', $query, $matches)) {
+               $after = $matches[0];
+               $query = preg_replace('/(\s+LOCK\s+IN\s+SHARE\s+MODE\s*)$/im', '', $query);
+            }
+
+            if ($is_manip) {
+                return $query . " LIMIT $limit" . $after;
+            } else {
+                return $query . " LIMIT $offset, $limit" . $after;
+            }
+        }
+        return $query;
+    }
+
+    // }}}
+    // {{{ getServerVersion()
+
+    /**
+     * return version information about the server
+     *
+     * @param bool   $native  determines if the raw version string should be returned
+     * @return mixed array/string with version information or MDB2 error object
+     * @access public
+     */
+    function getServerVersion($native = false)
+    {
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+        if ($this->connected_server_info) {
+            $server_info = $this->connected_server_info;
+        } else {
+            $server_info = @mysql_get_server_info($connection);
+        }
+        if (!$server_info) {
+            return $this->raiseError(null, null, null,
+                'Could not get server information', __FUNCTION__);
+        }
+        // cache server_info
+        $this->connected_server_info = $server_info;
+        if (!$native) {
+            $tmp = explode('.', $server_info, 3);
+            if (isset($tmp[2]) && strpos($tmp[2], '-')) {
+                $tmp2 = explode('-', @$tmp[2], 2);
+            } else {
+                $tmp2[0] = isset($tmp[2]) ? $tmp[2] : null;
+                $tmp2[1] = null;
+            }
+            $server_info = array(
+                'major' => isset($tmp[0]) ? $tmp[0] : null,
+                'minor' => isset($tmp[1]) ? $tmp[1] : null,
+                'patch' => $tmp2[0],
+                'extra' => $tmp2[1],
+                'native' => $server_info,
+            );
+        }
+        return $server_info;
+    }
+
+    // }}}
+    // {{{ _getServerCapabilities()
+
+    /**
+     * Fetch some information about the server capabilities
+     * (transactions, subselects, prepared statements, etc).
+     *
+     * @access private
+     */
+    function _getServerCapabilities()
+    {
+        if (!$this->server_capabilities_checked) {
+            $this->server_capabilities_checked = true;
+
+            //set defaults
+            $this->supported['sub_selects'] = 'emulated';
+            $this->supported['prepared_statements'] = 'emulated';
+            $this->supported['triggers'] = false;
+            $this->start_transaction = false;
+            $this->varchar_max_length = 255;
+
+            $server_info = $this->getServerVersion();
+            if (is_array($server_info)) {
+                $server_version = $server_info['major'].'.'.$server_info['minor'].'.'.$server_info['patch'];
+
+                if (!version_compare($server_version, '4.1.0', '<')) {
+                    $this->supported['sub_selects'] = true;
+                    $this->supported['prepared_statements'] = true;
+                }
+
+                // SAVEPOINTs were introduced in MySQL 4.0.14 and 4.1.1 (InnoDB)
+                if (version_compare($server_version, '4.1.0', '>=')) {
+                    if (version_compare($server_version, '4.1.1', '<')) {
+                        $this->supported['savepoints'] = false;
+                    }
+                } elseif (version_compare($server_version, '4.0.14', '<')) {
+                    $this->supported['savepoints'] = false;
+                }
+
+                if (!version_compare($server_version, '4.0.11', '<')) {
+                    $this->start_transaction = true;
+                }
+
+                if (!version_compare($server_version, '5.0.3', '<')) {
+                    $this->varchar_max_length = 65532;
+                }
+
+                if (!version_compare($server_version, '5.0.2', '<')) {
+                    $this->supported['triggers'] = true;
+                }
+            }
+        }
+    }
+
+    // }}}
+    // {{{ function _skipUserDefinedVariable($query, $position)
+
+    /**
+     * Utility method, used by prepare() to avoid misinterpreting MySQL user
+     * defined variables (SELECT @x:=5) for placeholders.
+     * Check if the placeholder is a false positive, i.e. if it is an user defined
+     * variable instead. If so, skip it and advance the position, otherwise
+     * return the current position, which is valid
+     *
+     * @param string $query
+     * @param integer $position current string cursor position
+     * @return integer $new_position
+     * @access protected
+     */
+    function _skipUserDefinedVariable($query, $position)
+    {
+        $found = strpos(strrev(substr($query, 0, $position)), '@');
+        if ($found === false) {
+            return $position;
+        }
+        $pos = strlen($query) - strlen(substr($query, $position)) - $found - 1;
+        $substring = substr($query, $pos, $position - $pos + 2);
+        if (preg_match('/^@\w+\s*:=$/', $substring)) {
+            return $position + 1; //found an user defined variable: skip it
+        }
+        return $position;
+    }
+
+    // }}}
+    // {{{ prepare()
+
+    /**
+     * Prepares a query for multiple execution with execute().
+     * With some database backends, this is emulated.
+     * prepare() requires a generic query as string like
+     * 'INSERT INTO numbers VALUES(?,?)' or
+     * 'INSERT INTO numbers VALUES(:foo,:bar)'.
+     * The ? and :name and are placeholders which can be set using
+     * bindParam() and the query can be sent off using the execute() method.
+     * The allowed format for :name can be set with the 'bindname_format' option.
+     *
+     * @param string $query the query to prepare
+     * @param mixed   $types  array that contains the types of the placeholders
+     * @param mixed   $result_types  array that contains the types of the columns in
+     *                        the result set or MDB2_PREPARE_RESULT, if set to
+     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
+     * @param mixed   $lobs   key (field) value (parameter) pair for all lob placeholders
+     * @return mixed resource handle for the prepared query on success, a MDB2
+     *        error on failure
+     * @access public
+     * @see bindParam, execute
+     */
+    function prepare($query, $types = null, $result_types = null, $lobs = array())
+    {
+        // connect to get server capabilities (http://pear.php.net/bugs/16147)
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        if ($this->options['emulate_prepared']
+            || $this->supported['prepared_statements'] !== true
+        ) {
+            return parent::prepare($query, $types, $result_types, $lobs);
+        }
+        $is_manip = ($result_types === MDB2_PREPARE_MANIP);
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
+        $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        $placeholder_type_guess = $placeholder_type = null;
+        $question = '?';
+        $colon = ':';
+        $positions = array();
+        $position = 0;
+        while ($position < strlen($query)) {
+            $q_position = strpos($query, $question, $position);
+            $c_position = strpos($query, $colon, $position);
+            if ($q_position && $c_position) {
+                $p_position = min($q_position, $c_position);
+            } elseif ($q_position) {
+                $p_position = $q_position;
+            } elseif ($c_position) {
+                $p_position = $c_position;
+            } else {
+                break;
+            }
+            if (is_null($placeholder_type)) {
+                $placeholder_type_guess = $query[$p_position];
+            }
+
+            $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position);
+            if (PEAR::isError($new_pos)) {
+                return $new_pos;
+            }
+            if ($new_pos != $position) {
+                $position = $new_pos;
+                continue; //evaluate again starting from the new position
+            }
+
+            //make sure this is not part of an user defined variable
+            $new_pos = $this->_skipUserDefinedVariable($query, $position);
+            if ($new_pos != $position) {
+                $position = $new_pos;
+                continue; //evaluate again starting from the new position
+            }
+
+            if ($query[$position] == $placeholder_type_guess) {
+                if (is_null($placeholder_type)) {
+                    $placeholder_type = $query[$p_position];
+                    $question = $colon = $placeholder_type;
+                }
+                if ($placeholder_type == ':') {
+                    $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
+                    $parameter = preg_replace($regexp, '\\1', $query);
+                    if ($parameter === '') {
+                        $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
+                            'named parameter name must match "bindname_format" option', __FUNCTION__);
+                        return $err;
+                    }
+                    $positions[$p_position] = $parameter;
+                    $query = substr_replace($query, '?', $position, strlen($parameter)+1);
+                } else {
+                    $positions[$p_position] = count($positions);
+                }
+                $position = $p_position + 1;
+            } else {
+                $position = $p_position;
+            }
+        }
+
+        static $prep_statement_counter = 1;
+        $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand()));
+        $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']);
+        $query = "PREPARE $statement_name FROM ".$this->quote($query, 'text');
+        $statement = $this->_doQuery($query, true, $connection);
+        if (PEAR::isError($statement)) {
+            return $statement;
+        }
+
+        $class_name = 'MDB2_Statement_'.$this->phptype;
+        $obj = new $class_name($this, $statement_name, $positions, $query, $types, $result_types, $is_manip, $limit, $offset);
+        $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj));
+        return $obj;
+    }
+
+    // }}}
+    // {{{ replace()
+
+    /**
+     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
+     * query, except that if there is already a row in the table with the same
+     * key field values, the old row is deleted before the new row is inserted.
+     *
+     * The REPLACE type of query does not make part of the SQL standards. Since
+     * practically only MySQL implements it natively, this type of query is
+     * emulated through this method for other DBMS using standard types of
+     * queries inside a transaction to assure the atomicity of the operation.
+     *
+     * @access public
+     *
+     * @param string $table name of the table on which the REPLACE query will
+     *  be executed.
+     * @param array $fields associative array that describes the fields and the
+     *  values that will be inserted or updated in the specified table. The
+     *  indexes of the array are the names of all the fields of the table. The
+     *  values of the array are also associative arrays that describe the
+     *  values and other properties of the table fields.
+     *
+     *  Here follows a list of field properties that need to be specified:
+     *
+     *    value:
+     *          Value to be assigned to the specified field. This value may be
+     *          of specified in database independent type format as this
+     *          function can perform the necessary datatype conversions.
+     *
+     *    Default:
+     *          this property is required unless the Null property
+     *          is set to 1.
+     *
+     *    type
+     *          Name of the type of the field. Currently, all types Metabase
+     *          are supported except for clob and blob.
+     *
+     *    Default: no type conversion
+     *
+     *    null
+     *          Boolean property that indicates that the value for this field
+     *          should be set to null.
+     *
+     *          The default value for fields missing in INSERT queries may be
+     *          specified the definition of a table. Often, the default value
+     *          is already null, but since the REPLACE may be emulated using
+     *          an UPDATE query, make sure that all fields of the table are
+     *          listed in this function argument array.
+     *
+     *    Default: 0
+     *
+     *    key
+     *          Boolean property that indicates that this field should be
+     *          handled as a primary key or at least as part of the compound
+     *          unique index of the table that will determine the row that will
+     *          updated if it exists or inserted a new row otherwise.
+     *
+     *          This function will fail if no key field is specified or if the
+     *          value of a key field is set to null because fields that are
+     *          part of unique index they may not be null.
+     *
+     *    Default: 0
+     *
+     * @see http://dev.mysql.com/doc/refman/5.0/en/replace.html
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     */
+    function replace($table, $fields)
+    {
+        $count = count($fields);
+        $query = $values = '';
+        $keys = $colnum = 0;
+        for (reset($fields); $colnum < $count; next($fields), $colnum++) {
+            $name = key($fields);
+            if ($colnum > 0) {
+                $query .= ',';
+                $values.= ',';
+            }
+            $query.= $this->quoteIdentifier($name, true);
+            if (isset($fields[$name]['null']) && $fields[$name]['null']) {
+                $value = 'NULL';
+            } else {
+                $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null;
+                $value = $this->quote($fields[$name]['value'], $type);
+                if (PEAR::isError($value)) {
+                    return $value;
+                }
+            }
+            $values.= $value;
+            if (isset($fields[$name]['key']) && $fields[$name]['key']) {
+                if ($value === 'NULL') {
+                    return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
+                        'key value '.$name.' may not be NULL', __FUNCTION__);
+                }
+                $keys++;
+            }
+        }
+        if ($keys == 0) {
+            return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
+                'not specified which fields are keys', __FUNCTION__);
+        }
+
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $table = $this->quoteIdentifier($table, true);
+        $query = "REPLACE INTO $table ($query) VALUES ($values)";
+        $result = $this->_doQuery($query, true, $connection);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return $this->_affectedRows($connection, $result);
+    }
+
+    // }}}
+    // {{{ nextID()
+
+    /**
+     * Returns the next free id of a sequence
+     *
+     * @param string $seq_name name of the sequence
+     * @param boolean $ondemand when true the sequence is
+     *                          automatic created, if it
+     *                          not exists
+     *
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function nextID($seq_name, $ondemand = true)
+    {
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
+        $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true);
+        $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)";
+        $this->pushErrorHandling(PEAR_ERROR_RETURN);
+        $this->expectError(MDB2_ERROR_NOSUCHTABLE);
+        $result = $this->_doQuery($query, true);
+        $this->popExpect();
+        $this->popErrorHandling();
+        if (PEAR::isError($result)) {
+            if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) {
+                $this->loadModule('Manager', null, true);
+                $result = $this->manager->createSequence($seq_name);
+                if (PEAR::isError($result)) {
+                    return $this->raiseError($result, null, null,
+                        'on demand sequence '.$seq_name.' could not be created', __FUNCTION__);
+                } else {
+                    return $this->nextID($seq_name, false);
+                }
+            }
+            return $result;
+        }
+        $value = $this->lastInsertID();
+        if (is_numeric($value)) {
+            $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value";
+            $result = $this->_doQuery($query, true);
+            if (PEAR::isError($result)) {
+                $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name;
+            }
+        }
+        return $value;
+    }
+
+    // }}}
+    // {{{ lastInsertID()
+
+    /**
+     * Returns the autoincrement ID if supported or $id or fetches the current
+     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
+     *
+     * @param string $table name of the table into which a new row was inserted
+     * @param string $field name of the field into which a new row was inserted
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function lastInsertID($table = null, $field = null)
+    {
+        // not using mysql_insert_id() due to http://pear.php.net/bugs/bug.php?id=8051
+        // not casting to integer to handle BIGINT http://pear.php.net/bugs/bug.php?id=17650
+        return $this->queryOne('SELECT LAST_INSERT_ID()');
+    }
+
+    // }}}
+    // {{{ currID()
+
+    /**
+     * Returns the current id of a sequence
+     *
+     * @param string $seq_name name of the sequence
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function currID($seq_name)
+    {
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
+        $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true);
+        $query = "SELECT MAX($seqcol_name) FROM $sequence_name";
+        return $this->queryOne($query, 'integer');
+    }
+}
+
+/**
+ * MDB2 MySQL result driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Result_mysql extends MDB2_Result_Common
+{
+    // }}}
+    // {{{ fetchRow()
+
+    /**
+     * Fetch a row and insert the data into an existing array.
+     *
+     * @param int       $fetchmode  how the array data should be indexed
+     * @param int    $rownum    number of the row where the data can be found
+     * @return int data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
+    {
+        if (!is_null($rownum)) {
+            $seek = $this->seek($rownum);
+            if (PEAR::isError($seek)) {
+                return $seek;
+            }
+        }
+        if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
+            $fetchmode = $this->db->fetchmode;
+        }
+        if (   $fetchmode == MDB2_FETCHMODE_ASSOC
+            || $fetchmode == MDB2_FETCHMODE_OBJECT
+        ) {
+            $row = @mysql_fetch_assoc($this->result);
+            if (is_array($row)
+                && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
+            ) {
+                $row = array_change_key_case($row, $this->db->options['field_case']);
+            }
+        } else {
+           $row = @mysql_fetch_row($this->result);
+        }
+
+        if (!$row) {
+            if ($this->result === false) {
+                $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+                return $err;
+            }
+            return null;
+        }
+        $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
+        $rtrim = false;
+        if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) {
+            if (empty($this->types)) {
+                $mode += MDB2_PORTABILITY_RTRIM;
+            } else {
+                $rtrim = true;
+            }
+        }
+        if ($mode) {
+            $this->db->_fixResultArrayValues($row, $mode);
+        }
+        if (   (   $fetchmode != MDB2_FETCHMODE_ASSOC
+                && $fetchmode != MDB2_FETCHMODE_OBJECT)
+            && !empty($this->types)
+        ) {
+            $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim);
+        } elseif (($fetchmode == MDB2_FETCHMODE_ASSOC
+                || $fetchmode == MDB2_FETCHMODE_OBJECT)
+            && !empty($this->types_assoc)
+        ) {
+            $row = $this->db->datatype->convertResultRow($this->types_assoc, $row, $rtrim);
+        }
+        if (!empty($this->values)) {
+            $this->_assignBindColumns($row);
+        }
+        if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
+            $object_class = $this->db->options['fetch_class'];
+            if ($object_class == 'stdClass') {
+                $row = (object) $row;
+            } else {
+                $rowObj = new $object_class($row);
+                $row = $rowObj;
+            }
+        }
+        ++$this->rownum;
+        return $row;
+    }
+
+    // }}}
+    // {{{ _getColumnNames()
+
+    /**
+     * Retrieve the names of columns returned by the DBMS in a query result.
+     *
+     * @return  mixed   Array variable that holds the names of columns as keys
+     *                  or an MDB2 error on failure.
+     *                  Some DBMS may not return any columns when the result set
+     *                  does not contain any rows.
+     * @access private
+     */
+    function _getColumnNames()
+    {
+        $columns = array();
+        $numcols = $this->numCols();
+        if (PEAR::isError($numcols)) {
+            return $numcols;
+        }
+        for ($column = 0; $column < $numcols; $column++) {
+            $column_name = @mysql_field_name($this->result, $column);
+            $columns[$column_name] = $column;
+        }
+        if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $columns = array_change_key_case($columns, $this->db->options['field_case']);
+        }
+        return $columns;
+    }
+
+    // }}}
+    // {{{ numCols()
+
+    /**
+     * Count the number of columns returned by the DBMS in a query result.
+     *
+     * @return mixed integer value with the number of columns, a MDB2 error
+     *                       on failure
+     * @access public
+     */
+    function numCols()
+    {
+        $cols = @mysql_num_fields($this->result);
+        if (is_null($cols)) {
+            if ($this->result === false) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            } elseif (is_null($this->result)) {
+                return count($this->types);
+            }
+            return $this->db->raiseError(null, null, null,
+                'Could not get column count', __FUNCTION__);
+        }
+        return $cols;
+    }
+
+    // }}}
+    // {{{ free()
+
+    /**
+     * Free the internal resources associated with result.
+     *
+     * @return boolean true on success, false if result is invalid
+     * @access public
+     */
+    function free()
+    {
+        if (is_resource($this->result) && $this->db->connection) {
+            $free = @mysql_free_result($this->result);
+            if ($free === false) {
+                return $this->db->raiseError(null, null, null,
+                    'Could not free result', __FUNCTION__);
+            }
+        }
+        $this->result = false;
+        return MDB2_OK;
+    }
+}
+
+/**
+ * MDB2 MySQL buffered result driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_BufferedResult_mysql extends MDB2_Result_mysql
+{
+    // }}}
+    // {{{ seek()
+
+    /**
+     * Seek to a specific row in a result set
+     *
+     * @param int    $rownum    number of the row where the data can be found
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function seek($rownum = 0)
+    {
+        if ($this->rownum != ($rownum - 1) && !@mysql_data_seek($this->result, $rownum)) {
+            if ($this->result === false) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            } elseif (is_null($this->result)) {
+                return MDB2_OK;
+            }
+            return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
+                'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__);
+        }
+        $this->rownum = $rownum - 1;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ valid()
+
+    /**
+     * Check if the end of the result set has been reached
+     *
+     * @return mixed true or false on sucess, a MDB2 error on failure
+     * @access public
+     */
+    function valid()
+    {
+        $numrows = $this->numRows();
+        if (PEAR::isError($numrows)) {
+            return $numrows;
+        }
+        return $this->rownum < ($numrows - 1);
+    }
+
+    // }}}
+    // {{{ numRows()
+
+    /**
+     * Returns the number of rows in a result object
+     *
+     * @return mixed MDB2 Error Object or the number of rows
+     * @access public
+     */
+    function numRows()
+    {
+        $rows = @mysql_num_rows($this->result);
+        if (false === $rows) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            } elseif (is_null($this->result)) {
+                return 0;
+            }
+            return $this->db->raiseError(null, null, null,
+                'Could not get row count', __FUNCTION__);
+        }
+        return $rows;
+    }
+
+    // }}}
+}
+
+/**
+ * MDB2 MySQL statement driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Statement_mysql extends MDB2_Statement_Common
+{
+    // {{{ _execute()
+
+    /**
+     * Execute a prepared query statement helper method.
+     *
+     * @param mixed $result_class string which specifies which result class to use
+     * @param mixed $result_wrap_class string which specifies which class to wrap results in
+     *
+     * @return mixed MDB2_Result or integer (affected rows) on success,
+     *               a MDB2 error on failure
+     * @access private
+     */
+    function _execute($result_class = true, $result_wrap_class = true)
+    {
+        if (is_null($this->statement)) {
+            $result = parent::_execute($result_class, $result_wrap_class);
+            return $result;
+        }
+        $this->db->last_query = $this->query;
+        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values));
+        if ($this->db->getOption('disable_query')) {
+            $result = $this->is_manip ? 0 : null;
+            return $result;
+        }
+
+        $connection = $this->db->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $query = 'EXECUTE '.$this->statement;
+        if (!empty($this->positions)) {
+            $parameters = array();
+            foreach ($this->positions as $parameter) {
+                if (!array_key_exists($parameter, $this->values)) {
+                    return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
+                }
+                $close = false;
+                $value = $this->values[$parameter];
+                $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null;
+                if (is_resource($value) || $type == 'clob' || $type == 'blob' && $this->db->options['lob_allow_url_include']) {
+                    if (!is_resource($value) && preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
+                        if ($match[1] == 'file://') {
+                            $value = $match[2];
+                        }
+                        $value = @fopen($value, 'r');
+                        $close = true;
+                    }
+                    if (is_resource($value)) {
+                        $data = '';
+                        while (!@feof($value)) {
+                            $data.= @fread($value, $this->db->options['lob_buffer_length']);
+                        }
+                        if ($close) {
+                            @fclose($value);
+                        }
+                        $value = $data;
+                    }
+                }
+                $quoted = $this->db->quote($value, $type);
+                if (PEAR::isError($quoted)) {
+                    return $quoted;
+                }
+                $param_query = 'SET @'.$parameter.' = '.$quoted;
+                $result = $this->db->_doQuery($param_query, true, $connection);
+                if (PEAR::isError($result)) {
+                    return $result;
+                }
+            }
+            $query.= ' USING @'.implode(', @', array_values($this->positions));
+        }
+
+        $result = $this->db->_doQuery($query, $this->is_manip, $connection);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        if ($this->is_manip) {
+            $affected_rows = $this->db->_affectedRows($connection, $result);
+            return $affected_rows;
+        }
+
+        $result = $this->db->_wrapResult($result, $this->result_types,
+            $result_class, $result_wrap_class, $this->limit, $this->offset);
+        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result));
+        return $result;
+    }
+
+    // }}}
+    // {{{ free()
+
+    /**
+     * Release resources allocated for the specified prepared query.
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function free()
+    {
+        if (is_null($this->positions)) {
+            return $this->db->raiseError(MDB2_ERROR, null, null,
+                'Prepared statement has already been freed', __FUNCTION__);
+        }
+        $result = MDB2_OK;
+
+        if (!is_null($this->statement)) {
+            $connection = $this->db->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+            $query = 'DEALLOCATE PREPARE '.$this->statement;
+            $result = $this->db->_doQuery($query, true, $connection);
+        }
+
+        parent::free();
+        return $result;
+    }
+}
+?>
diff --git a/3rdparty/MDB2/Driver/pgsql.php b/3rdparty/MDB2/Driver/pgsql.php
index 15bd280f40bc7f8d22a3af4c7b6c94f020136e9d..8a8b3f7c91dea57eef3067cb424f8bed673e7c8c 100644
--- a/3rdparty/MDB2/Driver/pgsql.php
+++ b/3rdparty/MDB2/Driver/pgsql.php
@@ -1,1548 +1,1583 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Paul Cooper <pgc@ucecom.com>                                 |
-// +----------------------------------------------------------------------+
-//
-// $Id: pgsql.php 295587 2010-02-28 17:16:38Z quipo $
-
-/**
- * MDB2 PostGreSQL driver
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_Driver_pgsql extends MDB2_Driver_Common
-{
-    // {{{ properties
-    var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '\\');
-
-    var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"');
-    // }}}
-    // {{{ constructor
-
-    /**
-     * Constructor
-     */
-    function __construct()
-    {
-        parent::__construct();
-
-        $this->phptype = 'pgsql';
-        $this->dbsyntax = 'pgsql';
-
-        $this->supported['sequences'] = true;
-        $this->supported['indexes'] = true;
-        $this->supported['affected_rows'] = true;
-        $this->supported['summary_functions'] = true;
-        $this->supported['order_by_text'] = true;
-        $this->supported['transactions'] = true;
-        $this->supported['savepoints'] = true;
-        $this->supported['current_id'] = true;
-        $this->supported['limit_queries'] = true;
-        $this->supported['LOBs'] = true;
-        $this->supported['replace'] = 'emulated';
-        $this->supported['sub_selects'] = true;
-        $this->supported['triggers'] = true;
-        $this->supported['auto_increment'] = 'emulated';
-        $this->supported['primary_key'] = true;
-        $this->supported['result_introspection'] = true;
-        $this->supported['prepared_statements'] = true;
-        $this->supported['identifier_quoting'] = true;
-        $this->supported['pattern_escaping'] = true;
-        $this->supported['new_link'] = true;
-
-        $this->options['DBA_username'] = false;
-        $this->options['DBA_password'] = false;
-        $this->options['multi_query'] = false;
-        $this->options['disable_smart_seqname'] = true;
-        $this->options['max_identifiers_length'] = 63;
-    }
-
-    // }}}
-    // {{{ errorInfo()
-
-    /**
-     * This method is used to collect information about an error
-     *
-     * @param integer $error
-     * @return array
-     * @access public
-     */
-    function errorInfo($error = null)
-    {
-        // Fall back to MDB2_ERROR if there was no mapping.
-        $error_code = MDB2_ERROR;
-
-        $native_msg = '';
-        if (is_resource($error)) {
-            $native_msg = @pg_result_error($error);
-        } elseif ($this->connection) {
-            $native_msg = @pg_last_error($this->connection);
-            if (!$native_msg && @pg_connection_status($this->connection) === PGSQL_CONNECTION_BAD) {
-                $native_msg = 'Database connection has been lost.';
-                $error_code = MDB2_ERROR_CONNECT_FAILED;
-            }
-        } else {
-            $native_msg = @pg_last_error();
-        }
-
-        static $error_regexps;
-        if (empty($error_regexps)) {
-            $error_regexps = array(
-                '/column .* (of relation .*)?does not exist/i'
-                    => MDB2_ERROR_NOSUCHFIELD,
-                '/(relation|sequence|table).*does not exist|class .* not found/i'
-                    => MDB2_ERROR_NOSUCHTABLE,
-                '/database .* does not exist/'
-                    => MDB2_ERROR_NOT_FOUND,
-                '/constraint .* does not exist/'
-                    => MDB2_ERROR_NOT_FOUND,
-                '/index .* does not exist/'
-                    => MDB2_ERROR_NOT_FOUND,
-                '/database .* already exists/i'
-                    => MDB2_ERROR_ALREADY_EXISTS,
-                '/relation .* already exists/i'
-                    => MDB2_ERROR_ALREADY_EXISTS,
-                '/(divide|division) by zero$/i'
-                    => MDB2_ERROR_DIVZERO,
-                '/pg_atoi: error in .*: can\'t parse /i'
-                    => MDB2_ERROR_INVALID_NUMBER,
-                '/invalid input syntax for( type)? (integer|numeric)/i'
-                    => MDB2_ERROR_INVALID_NUMBER,
-                '/value .* is out of range for type \w*int/i'
-                    => MDB2_ERROR_INVALID_NUMBER,
-                '/integer out of range/i'
-                    => MDB2_ERROR_INVALID_NUMBER,
-                '/value too long for type character/i'
-                    => MDB2_ERROR_INVALID,
-                '/attribute .* not found|relation .* does not have attribute/i'
-                    => MDB2_ERROR_NOSUCHFIELD,
-                '/column .* specified in USING clause does not exist in (left|right) table/i'
-                    => MDB2_ERROR_NOSUCHFIELD,
-                '/parser: parse error at or near/i'
-                    => MDB2_ERROR_SYNTAX,
-                '/syntax error at/'
-                    => MDB2_ERROR_SYNTAX,
-                '/column reference .* is ambiguous/i'
-                    => MDB2_ERROR_SYNTAX,
-                '/permission denied/'
-                    => MDB2_ERROR_ACCESS_VIOLATION,
-                '/violates not-null constraint/'
-                    => MDB2_ERROR_CONSTRAINT_NOT_NULL,
-                '/violates [\w ]+ constraint/'
-                    => MDB2_ERROR_CONSTRAINT,
-                '/referential integrity violation/'
-                    => MDB2_ERROR_CONSTRAINT,
-                '/more expressions than target columns/i'
-                    => MDB2_ERROR_VALUE_COUNT_ON_ROW,
-            );
-        }
-        if (is_numeric($error) && $error < 0) {
-            $error_code = $error;
-        } else {
-            foreach ($error_regexps as $regexp => $code) {
-                if (preg_match($regexp, $native_msg)) {
-                    $error_code = $code;
-                    break;
-                }
-            }
-        }
-        return array($error_code, null, $native_msg);
-    }
-
-    // }}}
-    // {{{ escape()
-
-    /**
-     * Quotes a string so it can be safely used in a query. It will quote
-     * the text so it can safely be used within a query.
-     *
-     * @param   string  the input string to quote
-     * @param   bool    escape wildcards
-     *
-     * @return  string  quoted string
-     *
-     * @access  public
-     */
-    function escape($text, $escape_wildcards = false)
-    {
-        if ($escape_wildcards) {
-            $text = $this->escapePattern($text);
-        }
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-        if (is_resource($connection) && version_compare(PHP_VERSION, '5.2.0RC5', '>=')) {
-            $text = @pg_escape_string($connection, $text);
-        } else {
-            $text = @pg_escape_string($text);
-        }
-        return $text;
-    }
-
-    // }}}
-    // {{{ beginTransaction()
-
-    /**
-     * Start a transaction or set a savepoint.
-     *
-     * @param   string  name of a savepoint to set
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function beginTransaction($savepoint = null)
-    {
-        $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (null !== $savepoint) {
-            if (!$this->in_transaction) {
-                return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                    'savepoint cannot be released when changes are auto committed', __FUNCTION__);
-            }
-            $query = 'SAVEPOINT '.$savepoint;
-            return $this->_doQuery($query, true);
-        }
-        if ($this->in_transaction) {
-            return MDB2_OK;  //nothing to do
-        }
-        if (!$this->destructor_registered && $this->opened_persistent) {
-            $this->destructor_registered = true;
-            register_shutdown_function('MDB2_closeOpenTransactions');
-        }
-        $result = $this->_doQuery('BEGIN', true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = true;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ commit()
-
-    /**
-     * Commit the database changes done during a transaction that is in
-     * progress or release a savepoint. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after committing the pending changes.
-     *
-     * @param   string  name of a savepoint to release
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function commit($savepoint = null)
-    {
-        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (!$this->in_transaction) {
-            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
-        }
-        if (null !== $savepoint) {
-            $query = 'RELEASE SAVEPOINT '.$savepoint;
-            return $this->_doQuery($query, true);
-        }
-
-        $result = $this->_doQuery('COMMIT', true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ rollback()
-
-    /**
-     * Cancel any database changes done during a transaction or since a specific
-     * savepoint that is in progress. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after canceling the pending changes.
-     *
-     * @param   string  name of a savepoint to rollback to
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function rollback($savepoint = null)
-    {
-        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (!$this->in_transaction) {
-            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                'rollback cannot be done changes are auto committed', __FUNCTION__);
-        }
-        if (null !== $savepoint) {
-            $query = 'ROLLBACK TO SAVEPOINT '.$savepoint;
-            return $this->_doQuery($query, true);
-        }
-
-        $query = 'ROLLBACK';
-        $result = $this->_doQuery($query, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function setTransactionIsolation()
-
-    /**
-     * Set the transacton isolation level.
-     *
-     * @param   string  standard isolation level
-     *                  READ UNCOMMITTED (allows dirty reads)
-     *                  READ COMMITTED (prevents dirty reads)
-     *                  REPEATABLE READ (prevents nonrepeatable reads)
-     *                  SERIALIZABLE (prevents phantom reads)
-     * @param   array some transaction options:
-     *                  'wait' => 'WAIT' | 'NO WAIT'
-     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function setTransactionIsolation($isolation, $options = array())
-    {
-        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
-        switch ($isolation) {
-        case 'READ UNCOMMITTED':
-        case 'READ COMMITTED':
-        case 'REPEATABLE READ':
-        case 'SERIALIZABLE':
-            break;
-        default:
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'isolation level is not supported: '.$isolation, __FUNCTION__);
-        }
-
-        $query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL $isolation";
-        return $this->_doQuery($query, true);
-    }
-
-    // }}}
-    // {{{ _doConnect()
-
-    /**
-     * Do the grunt work of connecting to the database
-     *
-     * @return mixed connection resource on success, MDB2 Error Object on failure
-     * @access protected
-     */
-    function _doConnect($username, $password, $database_name, $persistent = false)
-    {
-        if (!PEAR::loadExtension($this->phptype)) {
-            return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__);
-        }
-        
-        if ($database_name == '') {
-            $database_name = 'template1';
-        }
-
-        $protocol = $this->dsn['protocol'] ? $this->dsn['protocol'] : 'tcp';
-
-        $params = array('');
-        if ($protocol == 'tcp') {
-            if ($this->dsn['hostspec']) {
-                $params[0].= 'host=' . $this->dsn['hostspec'];
-            }
-            if ($this->dsn['port']) {
-                $params[0].= ' port=' . $this->dsn['port'];
-            }
-        } elseif ($protocol == 'unix') {
-            // Allow for pg socket in non-standard locations.
-            if ($this->dsn['socket']) {
-                $params[0].= 'host=' . $this->dsn['socket'];
-            }
-            if ($this->dsn['port']) {
-                $params[0].= ' port=' . $this->dsn['port'];
-            }
-        }
-        if ($database_name) {
-            $params[0].= ' dbname=\'' . addslashes($database_name) . '\'';
-        }
-        if ($username) {
-            $params[0].= ' user=\'' . addslashes($username) . '\'';
-        }
-        if ($password) {
-            $params[0].= ' password=\'' . addslashes($password) . '\'';
-        }
-        if (!empty($this->dsn['options'])) {
-            $params[0].= ' options=' . $this->dsn['options'];
-        }
-        if (!empty($this->dsn['tty'])) {
-            $params[0].= ' tty=' . $this->dsn['tty'];
-        }
-        if (!empty($this->dsn['connect_timeout'])) {
-            $params[0].= ' connect_timeout=' . $this->dsn['connect_timeout'];
-        }
-        if (!empty($this->dsn['sslmode'])) {
-            $params[0].= ' sslmode=' . $this->dsn['sslmode'];
-        }
-        if (!empty($this->dsn['service'])) {
-            $params[0].= ' service=' . $this->dsn['service'];
-        }
-
-        if ($this->_isNewLinkSet()) {
-            if (version_compare(phpversion(), '4.3.0', '>=')) {
-                $params[] = PGSQL_CONNECT_FORCE_NEW;
-            }
-        }
-
-        $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect';
-        $connection = @call_user_func_array($connect_function, $params);
-        if (!$connection) {
-            return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
-                'unable to establish a connection', __FUNCTION__);
-        }
-
-       if (empty($this->dsn['disable_iso_date'])) {
-            if (!@pg_query($connection, "SET SESSION DATESTYLE = 'ISO'")) {
-                return $this->raiseError(null, null, null,
-                    'Unable to set date style to iso', __FUNCTION__);
-            }
-       }
-
-        if (!empty($this->dsn['charset'])) {
-            $result = $this->setCharset($this->dsn['charset'], $connection);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-
-        // Enable extra compatibility settings on 8.2 and later
-        if (function_exists('pg_parameter_status')) {
-            $version = pg_parameter_status($connection, 'server_version');
-            if ($version == false) {
-                return $this->raiseError(null, null, null,
-                  'Unable to retrieve server version', __FUNCTION__);
-            }
-            $version = explode ('.', $version);
-            if (    $version['0'] > 8
-                || ($version['0'] == 8 && $version['1'] >= 2)
-            ) {
-                if (!@pg_query($connection, "SET SESSION STANDARD_CONFORMING_STRINGS = OFF")) {
-                    return $this->raiseError(null, null, null,
-                      'Unable to set standard_conforming_strings to off', __FUNCTION__);
-                }
-
-                if (!@pg_query($connection, "SET SESSION ESCAPE_STRING_WARNING = OFF")) {
-                    return $this->raiseError(null, null, null,
-                      'Unable to set escape_string_warning to off', __FUNCTION__);
-                }
-            }
-        }
-
-        return $connection;
-    }
-
-    // }}}
-    // {{{ connect()
-
-    /**
-     * Connect to the database
-     *
-     * @return true on success, MDB2 Error Object on failure
-     * @access public
-     */
-    function connect()
-    {
-        if (is_resource($this->connection)) {
-            //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
-            if (MDB2::areEquals($this->connected_dsn, $this->dsn)
-                && $this->connected_database_name == $this->database_name
-                && ($this->opened_persistent == $this->options['persistent'])
-            ) {
-                return MDB2_OK;
-            }
-            $this->disconnect(false);
-        }
-
-        if ($this->database_name) {
-            $connection = $this->_doConnect($this->dsn['username'],
-                                            $this->dsn['password'],
-                                            $this->database_name,
-                                            $this->options['persistent']);
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-
-            $this->connection = $connection;
-            $this->connected_dsn = $this->dsn;
-            $this->connected_database_name = $this->database_name;
-            $this->opened_persistent = $this->options['persistent'];
-            $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
-        }
-
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ setCharset()
-
-    /**
-     * Set the charset on the current connection
-     *
-     * @param string    charset
-     * @param resource  connection handle
-     *
-     * @return true on success, MDB2 Error Object on failure
-     */
-    function setCharset($charset, $connection = null)
-    {
-        if (null === $connection) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-        if (is_array($charset)) {
-            $charset   = array_shift($charset);
-            $this->warnings[] = 'postgresql does not support setting client collation';
-        }
-        $result = @pg_set_client_encoding($connection, $charset);
-        if ($result == -1) {
-            return $this->raiseError(null, null, null,
-                'Unable to set client charset: '.$charset, __FUNCTION__);
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ databaseExists()
-
-    /**
-     * check if given database name is exists?
-     *
-     * @param string $name    name of the database that should be checked
-     *
-     * @return mixed true/false on success, a MDB2 error on failure
-     * @access public
-     */
-    function databaseExists($name)
-    {
-        $res = $this->_doConnect($this->dsn['username'],
-                                 $this->dsn['password'],
-                                 $this->escape($name),
-                                 $this->options['persistent']);
-        if (!PEAR::isError($res)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    // }}}
-    // {{{ disconnect()
-
-    /**
-     * Log out and disconnect from the database.
-     *
-     * @param  boolean $force if the disconnect should be forced even if the
-     *                        connection is opened persistently
-     * @return mixed true on success, false if not connected and error
-     *                object on error
-     * @access public
-     */
-    function disconnect($force = true)
-    {
-        if (is_resource($this->connection)) {
-            if ($this->in_transaction) {
-                $dsn = $this->dsn;
-                $database_name = $this->database_name;
-                $persistent = $this->options['persistent'];
-                $this->dsn = $this->connected_dsn;
-                $this->database_name = $this->connected_database_name;
-                $this->options['persistent'] = $this->opened_persistent;
-                $this->rollback();
-                $this->dsn = $dsn;
-                $this->database_name = $database_name;
-                $this->options['persistent'] = $persistent;
-            }
-
-            if (!$this->opened_persistent || $force) {
-                $ok = @pg_close($this->connection);
-                if (!$ok) {
-                    return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED,
-                           null, null, null, __FUNCTION__);
-                }
-            }
-        } else {
-            return false;
-        }
-        return parent::disconnect($force);
-    }
-
-    // }}}
-    // {{{ standaloneQuery()
-
-    /**
-     * execute a query as DBA
-     *
-     * @param string $query the SQL query
-     * @param mixed   $types  array that contains the types of the columns in
-     *                        the result set
-     * @param boolean $is_manip  if the query is a manipulation query
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function standaloneQuery($query, $types = null, $is_manip = false)
-    {
-        $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username'];
-        $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password'];
-        $connection = $this->_doConnect($user, $pass, $this->database_name, $this->options['persistent']);
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
-
-        $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name);
-        if (!PEAR::isError($result)) {
-            if ($is_manip) {
-                $result =  $this->_affectedRows($connection, $result);
-            } else {
-                $result =& $this->_wrapResult($result, $types, true, false, $limit, $offset);
-            }
-        }
-
-        @pg_close($connection);
-        return $result;
-    }
-
-    // }}}
-    // {{{ _doQuery()
-
-    /**
-     * Execute a query
-     * @param string $query  query
-     * @param boolean $is_manip  if the query is a manipulation query
-     * @param resource $connection
-     * @param string $database_name
-     * @return result or error object
-     * @access protected
-     */
-    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
-    {
-        $this->last_query = $query;
-        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        if ($this->options['disable_query']) {
-            $result = $is_manip ? 0 : null;
-            return $result;
-        }
-
-        if (null === $connection) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-
-        $function = $this->options['multi_query'] ? 'pg_send_query' : 'pg_query';
-        $result = @$function($connection, $query);
-        if (!$result) {
-            $err = $this->raiseError(null, null, null,
-                'Could not execute statement', __FUNCTION__);
-            return $err;
-        } elseif ($this->options['multi_query']) {
-            if (!($result = @pg_get_result($connection))) {
-                $err = $this->raiseError(null, null, null,
-                        'Could not get the first result from a multi query', __FUNCTION__);
-                return $err;
-            }
-        }
-
-        $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result));
-        return $result;
-    }
-
-    // }}}
-    // {{{ _affectedRows()
-
-    /**
-     * Returns the number of rows affected
-     *
-     * @param resource $result
-     * @param resource $connection
-     * @return mixed MDB2 Error Object or the number of rows affected
-     * @access private
-     */
-    function _affectedRows($connection, $result = null)
-    {
-        if (null === $connection) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-        return @pg_affected_rows($result);
-    }
-
-    // }}}
-    // {{{ _modifyQuery()
-
-    /**
-     * Changes a query string for various DBMS specific reasons
-     *
-     * @param string $query  query to modify
-     * @param boolean $is_manip  if it is a DML query
-     * @param integer $limit  limit the number of rows
-     * @param integer $offset  start reading from given offset
-     * @return string modified query
-     * @access protected
-     */
-    function _modifyQuery($query, $is_manip, $limit, $offset)
-    {
-        if ($limit > 0
-            && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query)
-        ) {
-            $query = rtrim($query);
-            if (substr($query, -1) == ';') {
-                $query = substr($query, 0, -1);
-            }
-            if ($is_manip) {
-                $query = $this->_modifyManipQuery($query, $limit);
-            } else {
-                $query.= " LIMIT $limit OFFSET $offset";
-            }
-        }
-        return $query;
-    }
-    
-    // }}}
-    // {{{ _modifyManipQuery()
-    
-    /**
-     * Changes a manip query string for various DBMS specific reasons
-     *
-     * @param string $query  query to modify
-     * @param integer $limit  limit the number of rows
-     * @return string modified query
-     * @access protected
-     */
-    function _modifyManipQuery($query, $limit)
-    {
-        $pos = strpos(strtolower($query), 'where');
-        $where = $pos ? substr($query, $pos) : '';
-
-        $manip_clause = '(\bDELETE\b\s+(?:\*\s+)?\bFROM\b|\bUPDATE\b)';
-        $from_clause  = '([\w\.]+)';
-        $where_clause = '(?:(.*)\bWHERE\b\s+(.*))|(.*)';
-        $pattern = '/^'. $manip_clause . '\s+' . $from_clause .'(?:\s)*(?:'. $where_clause .')?$/i';
-        $matches = preg_match($pattern, $query, $match);
-        if ($matches) {
-            $manip = $match[1];
-            $from  = $match[2];
-            $what  = (count($matches) == 6) ? $match[5] : $match[3];
-            return $manip.' '.$from.' '.$what.' WHERE ctid=(SELECT ctid FROM '.$from.' '.$where.' LIMIT '.$limit.')';
-        }
-        //return error?
-        return $query;
-    }
-
-    // }}}
-    // {{{ getServerVersion()
-
-    /**
-     * return version information about the server
-     *
-     * @param bool   $native  determines if the raw version string should be returned
-     * @return mixed array/string with version information or MDB2 error object
-     * @access public
-     */
-    function getServerVersion($native = false)
-    {
-        $query = 'SHOW SERVER_VERSION';
-        if ($this->connected_server_info) {
-            $server_info = $this->connected_server_info;
-        } else {
-            $server_info = $this->queryOne($query, 'text');
-            if (PEAR::isError($server_info)) {
-                return $server_info;
-            }
-        }
-        // cache server_info
-        $this->connected_server_info = $server_info;
-        if (!$native && !PEAR::isError($server_info)) {
-            $tmp = explode('.', $server_info, 3);
-            if (empty($tmp[2])
-                && isset($tmp[1])
-                && preg_match('/(\d+)(.*)/', $tmp[1], $tmp2)
-            ) {
-                $server_info = array(
-                    'major' => $tmp[0],
-                    'minor' => $tmp2[1],
-                    'patch' => null,
-                    'extra' => $tmp2[2],
-                    'native' => $server_info,
-                );
-            } else {
-                $server_info = array(
-                    'major' => isset($tmp[0]) ? $tmp[0] : null,
-                    'minor' => isset($tmp[1]) ? $tmp[1] : null,
-                    'patch' => isset($tmp[2]) ? $tmp[2] : null,
-                    'extra' => null,
-                    'native' => $server_info,
-                );
-            }
-        }
-        return $server_info;
-    }
-
-    // }}}
-    // {{{ prepare()
-
-    /**
-     * Prepares a query for multiple execution with execute().
-     * With some database backends, this is emulated.
-     * prepare() requires a generic query as string like
-     * 'INSERT INTO numbers VALUES(?,?)' or
-     * 'INSERT INTO numbers VALUES(:foo,:bar)'.
-     * The ? and :name and are placeholders which can be set using
-     * bindParam() and the query can be sent off using the execute() method.
-     * The allowed format for :name can be set with the 'bindname_format' option.
-     *
-     * @param string $query the query to prepare
-     * @param mixed   $types  array that contains the types of the placeholders
-     * @param mixed   $result_types  array that contains the types of the columns in
-     *                        the result set or MDB2_PREPARE_RESULT, if set to
-     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
-     * @param mixed   $lobs   key (field) value (parameter) pair for all lob placeholders
-     * @return mixed resource handle for the prepared query on success, a MDB2
-     *        error on failure
-     * @access public
-     * @see bindParam, execute
-     */
-    function prepare($query, $types = null, $result_types = null, $lobs = array())
-    {
-        if ($this->options['emulate_prepared']) {
-            return parent::prepare($query, $types, $result_types, $lobs);
-        }
-        $is_manip = ($result_types === MDB2_PREPARE_MANIP);
-        $offset = $this->offset;
-        $limit = $this->limit;
-        $this->offset = $this->limit = 0;
-        $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        $pgtypes = function_exists('pg_prepare') ? false : array();
-        if ($pgtypes !== false && !empty($types)) {
-            $this->loadModule('Datatype', null, true);
-        }
-        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
-        $placeholder_type_guess = $placeholder_type = null;
-        $question = '?';
-        $colon = ':';
-        $positions = array();
-        $position = $parameter = 0;
-        while ($position < strlen($query)) {
-            $q_position = strpos($query, $question, $position);
-            $c_position = strpos($query, $colon, $position);
-            //skip "::type" cast ("select id::varchar(20) from sometable where name=?")
-            $doublecolon_position = strpos($query, '::', $position);
-            if ($doublecolon_position !== false && $doublecolon_position == $c_position) {
-                $c_position = strpos($query, $colon, $position+2);
-            }
-            if ($q_position && $c_position) {
-                $p_position = min($q_position, $c_position);
-            } elseif ($q_position) {
-                $p_position = $q_position;
-            } elseif ($c_position) {
-                $p_position = $c_position;
-            } else {
-                break;
-            }
-            if (null === $placeholder_type) {
-                $placeholder_type_guess = $query[$p_position];
-            }
-            
-            $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position);
-            if (PEAR::isError($new_pos)) {
-                return $new_pos;
-            }
-            if ($new_pos != $position) {
-                $position = $new_pos;
-                continue; //evaluate again starting from the new position
-            }
-
-            if ($query[$position] == $placeholder_type_guess) {
-                if (null === $placeholder_type) {
-                    $placeholder_type = $query[$p_position];
-                    $question = $colon = $placeholder_type;
-                    if (!empty($types) && is_array($types)) {
-                        if ($placeholder_type == ':') {
-                        } else {
-                            $types = array_values($types);
-                        }
-                    }
-                }
-                if ($placeholder_type_guess == '?') {
-                    $length = 1;
-                    $name = $parameter;
-                } else {
-                    $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
-                    $param = preg_replace($regexp, '\\1', $query);
-                    if ($param === '') {
-                        $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                            'named parameter name must match "bindname_format" option', __FUNCTION__);
-                        return $err;
-                    }
-                    $length = strlen($param) + 1;
-                    $name = $param;
-                }
-                if ($pgtypes !== false) {
-                    if (is_array($types) && array_key_exists($name, $types)) {
-                        $pgtypes[] = $this->datatype->mapPrepareDatatype($types[$name]);
-                    } elseif (is_array($types) && array_key_exists($parameter, $types)) {
-                        $pgtypes[] = $this->datatype->mapPrepareDatatype($types[$parameter]);
-                    } else {
-                        $pgtypes[] = 'text';
-                    }
-                }
-                if (($key_parameter = array_search($name, $positions))) {
-                    $next_parameter = 1;
-                    foreach ($positions as $key => $value) {
-                        if ($key_parameter == $key) {
-                            break;
-                        }
-                        ++$next_parameter;
-                    }
-                } else {
-                    ++$parameter;
-                    $next_parameter = $parameter;
-                    $positions[] = $name;
-                }
-                $query = substr_replace($query, '$'.$parameter, $position, $length);
-                $position = $p_position + strlen($parameter);
-            } else {
-                $position = $p_position;
-            }
-        }
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-        static $prep_statement_counter = 1;
-        $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand()));
-        $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']);
-        if (false === $pgtypes) {
-            $result = @pg_prepare($connection, $statement_name, $query);
-            if (!$result) {
-                $err = $this->raiseError(null, null, null,
-                    'Unable to create prepared statement handle', __FUNCTION__);
-                return $err;
-            }
-        } else {
-            $types_string = '';
-            if ($pgtypes) {
-                $types_string = ' ('.implode(', ', $pgtypes).') ';
-            }
-            $query = 'PREPARE '.$statement_name.$types_string.' AS '.$query;
-            $statement = $this->_doQuery($query, true, $connection);
-            if (PEAR::isError($statement)) {
-                return $statement;
-            }
-        }
-
-        $class_name = 'MDB2_Statement_'.$this->phptype;
-        $obj = new $class_name($this, $statement_name, $positions, $query, $types, $result_types, $is_manip, $limit, $offset);
-        $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj));
-        return $obj;
-    }
-
-    // }}}
-    // {{{ function getSequenceName($sqn)
-
-    /**
-     * adds sequence name formatting to a sequence name
-     *
-     * @param   string  name of the sequence
-     *
-     * @return  string  formatted sequence name
-     *
-     * @access  public
-     */
-    function getSequenceName($sqn)
-    {
-        if (false === $this->options['disable_smart_seqname']) {
-            if (strpos($sqn, '_') !== false) {
-                list($table, $field) = explode('_', $sqn, 2);
-            }
-            $schema_list = $this->queryOne("SELECT array_to_string(current_schemas(false), ',')");
-            if (PEAR::isError($schema_list) || empty($schema_list) || count($schema_list) < 2) {
-                $order_by = ' a.attnum';
-                $schema_clause = ' AND n.nspname=current_schema()';
-            } else {
-                $schemas = explode(',', $schema_list);
-                $schema_clause = ' AND n.nspname IN ('.$schema_list.')';
-                $counter = 1;
-                $order_by = ' CASE ';
-                foreach ($schemas as $schema) {
-                    $order_by .= ' WHEN n.nspname='.$schema.' THEN '.$counter++;
-                }
-                $order_by .= ' ELSE '.$counter.' END, a.attnum';
-            }
-
-            $query = "SELECT substring((SELECT substring(pg_get_expr(d.adbin, d.adrelid) for 128)
-                    	    FROM pg_attrdef d
-                    	   WHERE d.adrelid = a.attrelid
-                    	     AND d.adnum = a.attnum
-                    	     AND a.atthasdef
-                    	 ) FROM 'nextval[^'']*''([^'']*)')
-                        FROM pg_attribute a
-                    LEFT JOIN pg_class c ON c.oid = a.attrelid
-                    LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef
-                    LEFT JOIN pg_namespace n ON c.relnamespace = n.oid
-                       WHERE (c.relname = ".$this->quote($sqn, 'text');
-            if (!empty($field)) {
-                $query .= " OR (c.relname = ".$this->quote($table, 'text')." AND a.attname = ".$this->quote($field, 'text').")";
-            }
-            $query .= "      )"
-                         .$schema_clause."
-                         AND NOT a.attisdropped
-                         AND a.attnum > 0
-                         AND pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval%'
-                    ORDER BY ".$order_by;
-            $seqname = $this->queryOne($query);
-            if (!PEAR::isError($seqname) && !empty($seqname) && is_string($seqname)) {
-                return $seqname;
-            }
-        }
-
-        return parent::getSequenceName($sqn);
-    }
-
-    // }}}
-    // {{{ nextID()
-
-    /**
-     * Returns the next free id of a sequence
-     *
-     * @param string $seq_name name of the sequence
-     * @param boolean $ondemand when true the sequence is
-     *                          automatic created, if it
-     *                          not exists
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function nextID($seq_name, $ondemand = true)
-    {
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
-        $query = "SELECT NEXTVAL('$sequence_name')";
-        $this->pushErrorHandling(PEAR_ERROR_RETURN);
-        $this->expectError(MDB2_ERROR_NOSUCHTABLE);
-        $result = $this->queryOne($query, 'integer');
-        $this->popExpect();
-        $this->popErrorHandling();
-        if (PEAR::isError($result)) {
-            if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) {
-                $this->loadModule('Manager', null, true);
-                $result = $this->manager->createSequence($seq_name);
-                if (PEAR::isError($result)) {
-                    return $this->raiseError($result, null, null,
-                        'on demand sequence could not be created', __FUNCTION__);
-                }
-                return $this->nextId($seq_name, false);
-            }
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ lastInsertID()
-
-    /**
-     * Returns the autoincrement ID if supported or $id or fetches the current
-     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
-     *
-     * @param string $table name of the table into which a new row was inserted
-     * @param string $field name of the field into which a new row was inserted
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function lastInsertID($table = null, $field = null)
-    {
-        if (empty($table) && empty($field)) {
-            return $this->queryOne('SELECT lastval()', 'integer');
-        }
-        $seq = $table.(empty($field) ? '' : '_'.$field);
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq), true);
-        return $this->queryOne("SELECT currval('$sequence_name')", 'integer');
-    }
-
-    // }}}
-    // {{{ currID()
-
-    /**
-     * Returns the current id of a sequence
-     *
-     * @param string $seq_name name of the sequence
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function currID($seq_name)
-    {
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
-        return $this->queryOne("SELECT last_value FROM $sequence_name", 'integer');
-    }
-}
-
-/**
- * MDB2 PostGreSQL result driver
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_Result_pgsql extends MDB2_Result_Common
-{
-    // }}}
-    // {{{ fetchRow()
-
-    /**
-     * Fetch a row and insert the data into an existing array.
-     *
-     * @param int       $fetchmode  how the array data should be indexed
-     * @param int    $rownum    number of the row where the data can be found
-     * @return int data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
-    {
-        if (null !== $rownum) {
-            $seek = $this->seek($rownum);
-            if (PEAR::isError($seek)) {
-                return $seek;
-            }
-        }
-        if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
-            $fetchmode = $this->db->fetchmode;
-        }
-        if ($fetchmode & MDB2_FETCHMODE_ASSOC) {
-            $row = @pg_fetch_array($this->result, null, PGSQL_ASSOC);
-            if (is_array($row)
-                && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
-            ) {
-                $row = array_change_key_case($row, $this->db->options['field_case']);
-            }
-        } else {
-            $row = @pg_fetch_row($this->result);
-        }
-        if (!$row) {
-            if (false === $this->result) {
-                $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-                return $err;
-            }
-            return null;
-        }
-        $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
-        $rtrim = false;
-        if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) {
-            if (empty($this->types)) {
-                $mode += MDB2_PORTABILITY_RTRIM;
-            } else {
-                $rtrim = true;
-            }
-        }
-        if ($mode) {
-            $this->db->_fixResultArrayValues($row, $mode);
-        }
-        if (!empty($this->types)) {
-            $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim);
-        }
-        if (!empty($this->values)) {
-            $this->_assignBindColumns($row);
-        }
-        if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
-            $object_class = $this->db->options['fetch_class'];
-            if ($object_class == 'stdClass') {
-                $row = (object) $row;
-            } else {
-                $rowObj = new $object_class($row);
-                $row = $rowObj;
-            }
-        }
-        ++$this->rownum;
-        return $row;
-    }
-
-    // }}}
-    // {{{ _getColumnNames()
-
-    /**
-     * Retrieve the names of columns returned by the DBMS in a query result.
-     *
-     * @return  mixed   Array variable that holds the names of columns as keys
-     *                  or an MDB2 error on failure.
-     *                  Some DBMS may not return any columns when the result set
-     *                  does not contain any rows.
-     * @access private
-     */
-    function _getColumnNames()
-    {
-        $columns = array();
-        $numcols = $this->numCols();
-        if (PEAR::isError($numcols)) {
-            return $numcols;
-        }
-        for ($column = 0; $column < $numcols; $column++) {
-            $column_name = @pg_field_name($this->result, $column);
-            $columns[$column_name] = $column;
-        }
-        if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $columns = array_change_key_case($columns, $this->db->options['field_case']);
-        }
-        return $columns;
-    }
-
-    // }}}
-    // {{{ numCols()
-
-    /**
-     * Count the number of columns returned by the DBMS in a query result.
-     *
-     * @access public
-     * @return mixed integer value with the number of columns, a MDB2 error
-     *                       on failure
-     */
-    function numCols()
-    {
-        $cols = @pg_num_fields($this->result);
-        if (null === $cols) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            }
-            if (null === $this->result) {
-                return count($this->types);
-            }
-            return $this->db->raiseError(null, null, null,
-                'Could not get column count', __FUNCTION__);
-        }
-        return $cols;
-    }
-
-    // }}}
-    // {{{ nextResult()
-
-    /**
-     * Move the internal result pointer to the next available result
-     *
-     * @return true on success, false if there is no more result set or an error object on failure
-     * @access public
-     */
-    function nextResult()
-    {
-        $connection = $this->db->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        if (!($this->result = @pg_get_result($connection))) {
-            return false;
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ free()
-
-    /**
-     * Free the internal resources associated with result.
-     *
-     * @return boolean true on success, false if result is invalid
-     * @access public
-     */
-    function free()
-    {
-        if (is_resource($this->result) && $this->db->connection) {
-            $free = @pg_free_result($this->result);
-            if (false === $free) {
-                return $this->db->raiseError(null, null, null,
-                    'Could not free result', __FUNCTION__);
-            }
-        }
-        $this->result = false;
-        return MDB2_OK;
-    }
-}
-
-/**
- * MDB2 PostGreSQL buffered result driver
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_BufferedResult_pgsql extends MDB2_Result_pgsql
-{
-    // {{{ seek()
-
-    /**
-     * Seek to a specific row in a result set
-     *
-     * @param int    $rownum    number of the row where the data can be found
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function seek($rownum = 0)
-    {
-        if ($this->rownum != ($rownum - 1) && !@pg_result_seek($this->result, $rownum)) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            }
-            if (null === $this->result) {
-                return MDB2_OK;
-            }
-            return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
-                'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__);
-        }
-        $this->rownum = $rownum - 1;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ valid()
-
-    /**
-     * Check if the end of the result set has been reached
-     *
-     * @return mixed true or false on sucess, a MDB2 error on failure
-     * @access public
-     */
-    function valid()
-    {
-        $numrows = $this->numRows();
-        if (PEAR::isError($numrows)) {
-            return $numrows;
-        }
-        return $this->rownum < ($numrows - 1);
-    }
-
-    // }}}
-    // {{{ numRows()
-
-    /**
-     * Returns the number of rows in a result object
-     *
-     * @return mixed MDB2 Error Object or the number of rows
-     * @access public
-     */
-    function numRows()
-    {
-        $rows = @pg_num_rows($this->result);
-        if (null === $rows) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            }
-            if (null === $this->result) {
-                return 0;
-            }
-            return $this->db->raiseError(null, null, null,
-                'Could not get row count', __FUNCTION__);
-        }
-        return $rows;
-    }
-}
-
-/**
- * MDB2 PostGreSQL statement driver
- *
- * @package MDB2
- * @category Database
- * @author  Paul Cooper <pgc@ucecom.com>
- */
-class MDB2_Statement_pgsql extends MDB2_Statement_Common
-{
-    // {{{ _execute()
-
-    /**
-     * Execute a prepared query statement helper method.
-     *
-     * @param mixed $result_class string which specifies which result class to use
-     * @param mixed $result_wrap_class string which specifies which class to wrap results in
-     *
-     * @return mixed MDB2_Result or integer (affected rows) on success,
-     *               a MDB2 error on failure
-     * @access private
-     */
-    function _execute($result_class = true, $result_wrap_class = false)
-    {
-        if (null === $this->statement) {
-            return parent::_execute($result_class, $result_wrap_class);
-        }
-        $this->db->last_query = $this->query;
-        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values));
-        if ($this->db->getOption('disable_query')) {
-            $result = $this->is_manip ? 0 : null;
-            return $result;
-        }
-
-        $connection = $this->db->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $query = false;
-        $parameters = array();
-        // todo: disabled until pg_execute() bytea issues are cleared up
-        if (true || !function_exists('pg_execute')) {
-            $query = 'EXECUTE '.$this->statement;
-        }
-        if (!empty($this->positions)) {
-            foreach ($this->positions as $parameter) {
-                if (!array_key_exists($parameter, $this->values)) {
-                    return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                        'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
-                }
-                $value = $this->values[$parameter];
-                $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null;
-                if (is_resource($value) || $type == 'clob' || $type == 'blob' || $this->db->options['lob_allow_url_include']) {
-                    if (!is_resource($value) && preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
-                        if ($match[1] == 'file://') {
-                            $value = $match[2];
-                        }
-                        $value = @fopen($value, 'r');
-                        $close = true;
-                    }
-                    if (is_resource($value)) {
-                        $data = '';
-                        while (!@feof($value)) {
-                            $data.= @fread($value, $this->db->options['lob_buffer_length']);
-                        }
-                        if ($close) {
-                            @fclose($value);
-                        }
-                        $value = $data;
-                    }
-                }
-                $quoted = $this->db->quote($value, $type, $query);
-                if (PEAR::isError($quoted)) {
-                    return $quoted;
-                }
-                $parameters[] = $quoted;
-            }
-            if ($query) {
-                $query.= ' ('.implode(', ', $parameters).')';
-            }
-        }
-
-        if (!$query) {
-            $result = @pg_execute($connection, $this->statement, $parameters);
-            if (!$result) {
-                $err = $this->db->raiseError(null, null, null,
-                    'Unable to execute statement', __FUNCTION__);
-                return $err;
-            }
-        } else {
-            $result = $this->db->_doQuery($query, $this->is_manip, $connection);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-
-        if ($this->is_manip) {
-            $affected_rows = $this->db->_affectedRows($connection, $result);
-            return $affected_rows;
-        }
-
-        $result = $this->db->_wrapResult($result, $this->result_types,
-            $result_class, $result_wrap_class, $this->limit, $this->offset);
-        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result));
-        return $result;
-    }
-
-    // }}}
-    // {{{ free()
-
-    /**
-     * Release resources allocated for the specified prepared query.
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function free()
-    {
-        if (null === $this->positions) {
-            return $this->db->raiseError(MDB2_ERROR, null, null,
-                'Prepared statement has already been freed', __FUNCTION__);
-        }
-        $result = MDB2_OK;
-
-        if (null !== $this->statement) {
-            $connection = $this->db->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-            $query = 'DEALLOCATE PREPARE '.$this->statement;
-            $result = $this->db->_doQuery($query, true, $connection);
-        }
-
-        parent::free();
-        return $result;
-    }
-}
-?>
\ No newline at end of file
+<?php
+// vim: set et ts=4 sw=4 fdm=marker:
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Paul Cooper <pgc@ucecom.com>                                 |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+/**
+ * MDB2 PostGreSQL driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_Driver_pgsql extends MDB2_Driver_Common
+{
+    // {{{ properties
+    var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '\\');
+
+    var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"');
+    // }}}
+    // {{{ constructor
+
+    /**
+     * Constructor
+     */
+    function __construct()
+    {
+        parent::__construct();
+
+        $this->phptype = 'pgsql';
+        $this->dbsyntax = 'pgsql';
+
+        $this->supported['sequences'] = true;
+        $this->supported['indexes'] = true;
+        $this->supported['affected_rows'] = true;
+        $this->supported['summary_functions'] = true;
+        $this->supported['order_by_text'] = true;
+        $this->supported['transactions'] = true;
+        $this->supported['savepoints'] = true;
+        $this->supported['current_id'] = true;
+        $this->supported['limit_queries'] = true;
+        $this->supported['LOBs'] = true;
+        $this->supported['replace'] = 'emulated';
+        $this->supported['sub_selects'] = true;
+        $this->supported['triggers'] = true;
+        $this->supported['auto_increment'] = 'emulated';
+        $this->supported['primary_key'] = true;
+        $this->supported['result_introspection'] = true;
+        $this->supported['prepared_statements'] = true;
+        $this->supported['identifier_quoting'] = true;
+        $this->supported['pattern_escaping'] = true;
+        $this->supported['new_link'] = true;
+
+        $this->options['DBA_username'] = false;
+        $this->options['DBA_password'] = false;
+        $this->options['multi_query'] = false;
+        $this->options['disable_smart_seqname'] = true;
+        $this->options['max_identifiers_length'] = 63;
+    }
+
+    // }}}
+    // {{{ errorInfo()
+
+    /**
+     * This method is used to collect information about an error
+     *
+     * @param integer $error
+     * @return array
+     * @access public
+     */
+    function errorInfo($error = null)
+    {
+        // Fall back to MDB2_ERROR if there was no mapping.
+        $error_code = MDB2_ERROR;
+
+        $native_msg = '';
+        if (is_resource($error)) {
+            $native_msg = @pg_result_error($error);
+        } elseif ($this->connection) {
+            $native_msg = @pg_last_error($this->connection);
+            if (!$native_msg && @pg_connection_status($this->connection) === PGSQL_CONNECTION_BAD) {
+                $native_msg = 'Database connection has been lost.';
+                $error_code = MDB2_ERROR_CONNECT_FAILED;
+            }
+        } else {
+            $native_msg = @pg_last_error();
+        }
+
+        static $error_regexps;
+        if (empty($error_regexps)) {
+            $error_regexps = array(
+                '/column .* (of relation .*)?does not exist/i'
+                    => MDB2_ERROR_NOSUCHFIELD,
+                '/(relation|sequence|table).*does not exist|class .* not found/i'
+                    => MDB2_ERROR_NOSUCHTABLE,
+                '/database .* does not exist/'
+                    => MDB2_ERROR_NOT_FOUND,
+                '/constraint .* does not exist/'
+                    => MDB2_ERROR_NOT_FOUND,
+                '/index .* does not exist/'
+                    => MDB2_ERROR_NOT_FOUND,
+                '/database .* already exists/i'
+                    => MDB2_ERROR_ALREADY_EXISTS,
+                '/relation .* already exists/i'
+                    => MDB2_ERROR_ALREADY_EXISTS,
+                '/(divide|division) by zero$/i'
+                    => MDB2_ERROR_DIVZERO,
+                '/pg_atoi: error in .*: can\'t parse /i'
+                    => MDB2_ERROR_INVALID_NUMBER,
+                '/invalid input syntax for( type)? (integer|numeric)/i'
+                    => MDB2_ERROR_INVALID_NUMBER,
+                '/value .* is out of range for type \w*int/i'
+                    => MDB2_ERROR_INVALID_NUMBER,
+                '/integer out of range/i'
+                    => MDB2_ERROR_INVALID_NUMBER,
+                '/value too long for type character/i'
+                    => MDB2_ERROR_INVALID,
+                '/attribute .* not found|relation .* does not have attribute/i'
+                    => MDB2_ERROR_NOSUCHFIELD,
+                '/column .* specified in USING clause does not exist in (left|right) table/i'
+                    => MDB2_ERROR_NOSUCHFIELD,
+                '/parser: parse error at or near/i'
+                    => MDB2_ERROR_SYNTAX,
+                '/syntax error at/'
+                    => MDB2_ERROR_SYNTAX,
+                '/column reference .* is ambiguous/i'
+                    => MDB2_ERROR_SYNTAX,
+                '/permission denied/'
+                    => MDB2_ERROR_ACCESS_VIOLATION,
+                '/violates not-null constraint/'
+                    => MDB2_ERROR_CONSTRAINT_NOT_NULL,
+                '/violates [\w ]+ constraint/'
+                    => MDB2_ERROR_CONSTRAINT,
+                '/referential integrity violation/'
+                    => MDB2_ERROR_CONSTRAINT,
+                '/more expressions than target columns/i'
+                    => MDB2_ERROR_VALUE_COUNT_ON_ROW,
+            );
+        }
+        if (is_numeric($error) && $error < 0) {
+            $error_code = $error;
+        } else {
+            foreach ($error_regexps as $regexp => $code) {
+                if (preg_match($regexp, $native_msg)) {
+                    $error_code = $code;
+                    break;
+                }
+            }
+        }
+        return array($error_code, null, $native_msg);
+    }
+
+    // }}}
+    // {{{ escape()
+
+    /**
+     * Quotes a string so it can be safely used in a query. It will quote
+     * the text so it can safely be used within a query.
+     *
+     * @param   string  the input string to quote
+     * @param   bool    escape wildcards
+     *
+     * @return  string  quoted string
+     *
+     * @access  public
+     */
+    function escape($text, $escape_wildcards = false)
+    {
+        if ($escape_wildcards) {
+            $text = $this->escapePattern($text);
+        }
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+        if (is_resource($connection) && version_compare(PHP_VERSION, '5.2.0RC5', '>=')) {
+            $text = @pg_escape_string($connection, $text);
+        } else {
+            $text = @pg_escape_string($text);
+        }
+        return $text;
+    }
+
+    // }}}
+    // {{{ beginTransaction()
+
+    /**
+     * Start a transaction or set a savepoint.
+     *
+     * @param   string  name of a savepoint to set
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function beginTransaction($savepoint = null)
+    {
+        $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (null !== $savepoint) {
+            if (!$this->in_transaction) {
+                return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                    'savepoint cannot be released when changes are auto committed', __FUNCTION__);
+            }
+            $query = 'SAVEPOINT '.$savepoint;
+            return $this->_doQuery($query, true);
+        }
+        if ($this->in_transaction) {
+            return MDB2_OK;  //nothing to do
+        }
+        if (!$this->destructor_registered && $this->opened_persistent) {
+            $this->destructor_registered = true;
+            register_shutdown_function('MDB2_closeOpenTransactions');
+        }
+        $result = $this->_doQuery('BEGIN', true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = true;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ commit()
+
+    /**
+     * Commit the database changes done during a transaction that is in
+     * progress or release a savepoint. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after committing the pending changes.
+     *
+     * @param   string  name of a savepoint to release
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function commit($savepoint = null)
+    {
+        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (!$this->in_transaction) {
+            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
+        }
+        if (null !== $savepoint) {
+            $query = 'RELEASE SAVEPOINT '.$savepoint;
+            return $this->_doQuery($query, true);
+        }
+
+        $result = $this->_doQuery('COMMIT', true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ rollback()
+
+    /**
+     * Cancel any database changes done during a transaction or since a specific
+     * savepoint that is in progress. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after canceling the pending changes.
+     *
+     * @param   string  name of a savepoint to rollback to
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function rollback($savepoint = null)
+    {
+        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (!$this->in_transaction) {
+            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                'rollback cannot be done changes are auto committed', __FUNCTION__);
+        }
+        if (null !== $savepoint) {
+            $query = 'ROLLBACK TO SAVEPOINT '.$savepoint;
+            return $this->_doQuery($query, true);
+        }
+
+        $query = 'ROLLBACK';
+        $result = $this->_doQuery($query, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function setTransactionIsolation()
+
+    /**
+     * Set the transacton isolation level.
+     *
+     * @param   string  standard isolation level
+     *                  READ UNCOMMITTED (allows dirty reads)
+     *                  READ COMMITTED (prevents dirty reads)
+     *                  REPEATABLE READ (prevents nonrepeatable reads)
+     *                  SERIALIZABLE (prevents phantom reads)
+     * @param   array some transaction options:
+     *                  'wait' => 'WAIT' | 'NO WAIT'
+     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function setTransactionIsolation($isolation, $options = array())
+    {
+        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
+        switch ($isolation) {
+        case 'READ UNCOMMITTED':
+        case 'READ COMMITTED':
+        case 'REPEATABLE READ':
+        case 'SERIALIZABLE':
+            break;
+        default:
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'isolation level is not supported: '.$isolation, __FUNCTION__);
+        }
+
+        $query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL $isolation";
+        return $this->_doQuery($query, true);
+    }
+
+    // }}}
+    // {{{ _doConnect()
+
+    /**
+     * Do the grunt work of connecting to the database
+     *
+     * @return mixed connection resource on success, MDB2 Error Object on failure
+     * @access protected
+     */
+    function _doConnect($username, $password, $database_name, $persistent = false)
+    {
+        if (!PEAR::loadExtension($this->phptype)) {
+            return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__);
+        }
+
+        if ($database_name == '') {
+            $database_name = 'template1';
+        }
+
+        $protocol = $this->dsn['protocol'] ? $this->dsn['protocol'] : 'tcp';
+
+        $params = array('');
+        if ($protocol == 'tcp') {
+            if ($this->dsn['hostspec']) {
+                $params[0].= 'host=' . $this->dsn['hostspec'];
+            }
+            if ($this->dsn['port']) {
+                $params[0].= ' port=' . $this->dsn['port'];
+            }
+        } elseif ($protocol == 'unix') {
+            // Allow for pg socket in non-standard locations.
+            if ($this->dsn['socket']) {
+                $params[0].= 'host=' . $this->dsn['socket'];
+            }
+            if ($this->dsn['port']) {
+                $params[0].= ' port=' . $this->dsn['port'];
+            }
+        }
+        if ($database_name) {
+            $params[0].= ' dbname=\'' . addslashes($database_name) . '\'';
+        }
+        if ($username) {
+            $params[0].= ' user=\'' . addslashes($username) . '\'';
+        }
+        if ($password) {
+            $params[0].= ' password=\'' . addslashes($password) . '\'';
+        }
+        if (!empty($this->dsn['options'])) {
+            $params[0].= ' options=' . $this->dsn['options'];
+        }
+        if (!empty($this->dsn['tty'])) {
+            $params[0].= ' tty=' . $this->dsn['tty'];
+        }
+        if (!empty($this->dsn['connect_timeout'])) {
+            $params[0].= ' connect_timeout=' . $this->dsn['connect_timeout'];
+        }
+        if (!empty($this->dsn['sslmode'])) {
+            $params[0].= ' sslmode=' . $this->dsn['sslmode'];
+        }
+        if (!empty($this->dsn['service'])) {
+            $params[0].= ' service=' . $this->dsn['service'];
+        }
+
+        if ($this->_isNewLinkSet()) {
+            if (version_compare(phpversion(), '4.3.0', '>=')) {
+                $params[] = PGSQL_CONNECT_FORCE_NEW;
+            }
+        }
+
+        $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect';
+        $connection = @call_user_func_array($connect_function, $params);
+        if (!$connection) {
+            return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
+                'unable to establish a connection', __FUNCTION__);
+        }
+
+       if (empty($this->dsn['disable_iso_date'])) {
+            if (!@pg_query($connection, "SET SESSION DATESTYLE = 'ISO'")) {
+                return $this->raiseError(null, null, null,
+                    'Unable to set date style to iso', __FUNCTION__);
+            }
+       }
+
+        if (!empty($this->dsn['charset'])) {
+            $result = $this->setCharset($this->dsn['charset'], $connection);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+
+        // Enable extra compatibility settings on 8.2 and later
+        if (function_exists('pg_parameter_status')) {
+            $version = pg_parameter_status($connection, 'server_version');
+            if ($version == false) {
+                return $this->raiseError(null, null, null,
+                  'Unable to retrieve server version', __FUNCTION__);
+            }
+            $version = explode ('.', $version);
+            if (    $version['0'] > 8
+                || ($version['0'] == 8 && $version['1'] >= 2)
+            ) {
+                if (!@pg_query($connection, "SET SESSION STANDARD_CONFORMING_STRINGS = OFF")) {
+                    return $this->raiseError(null, null, null,
+                      'Unable to set standard_conforming_strings to off', __FUNCTION__);
+                }
+
+                if (!@pg_query($connection, "SET SESSION ESCAPE_STRING_WARNING = OFF")) {
+                    return $this->raiseError(null, null, null,
+                      'Unable to set escape_string_warning to off', __FUNCTION__);
+                }
+            }
+        }
+
+        return $connection;
+    }
+
+    // }}}
+    // {{{ connect()
+
+    /**
+     * Connect to the database
+     *
+     * @return true on success, MDB2 Error Object on failure
+     * @access public
+     */
+    function connect()
+    {
+        if (is_resource($this->connection)) {
+            //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
+            if (MDB2::areEquals($this->connected_dsn, $this->dsn)
+                && $this->connected_database_name == $this->database_name
+                && ($this->opened_persistent == $this->options['persistent'])
+            ) {
+                return MDB2_OK;
+            }
+            $this->disconnect(false);
+        }
+
+        if ($this->database_name) {
+            $connection = $this->_doConnect($this->dsn['username'],
+                                            $this->dsn['password'],
+                                            $this->database_name,
+                                            $this->options['persistent']);
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+
+            $this->connection = $connection;
+            $this->connected_dsn = $this->dsn;
+            $this->connected_database_name = $this->database_name;
+            $this->opened_persistent = $this->options['persistent'];
+            $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
+        }
+
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ setCharset()
+
+    /**
+     * Set the charset on the current connection
+     *
+     * @param string    charset
+     * @param resource  connection handle
+     *
+     * @return true on success, MDB2 Error Object on failure
+     */
+    function setCharset($charset, $connection = null)
+    {
+        if (null === $connection) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+        if (is_array($charset)) {
+            $charset   = array_shift($charset);
+            $this->warnings[] = 'postgresql does not support setting client collation';
+        }
+        $result = @pg_set_client_encoding($connection, $charset);
+        if ($result == -1) {
+            return $this->raiseError(null, null, null,
+                'Unable to set client charset: '.$charset, __FUNCTION__);
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ databaseExists()
+
+    /**
+     * check if given database name is exists?
+     *
+     * @param string $name    name of the database that should be checked
+     *
+     * @return mixed true/false on success, a MDB2 error on failure
+     * @access public
+     */
+    function databaseExists($name)
+    {
+        $res = $this->_doConnect($this->dsn['username'],
+                                 $this->dsn['password'],
+                                 $this->escape($name),
+                                 $this->options['persistent']);
+        if (!PEAR::isError($res)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    // }}}
+    // {{{ disconnect()
+
+    /**
+     * Log out and disconnect from the database.
+     *
+     * @param  boolean $force if the disconnect should be forced even if the
+     *                        connection is opened persistently
+     * @return mixed true on success, false if not connected and error
+     *                object on error
+     * @access public
+     */
+    function disconnect($force = true)
+    {
+        if (is_resource($this->connection)) {
+            if ($this->in_transaction) {
+                $dsn = $this->dsn;
+                $database_name = $this->database_name;
+                $persistent = $this->options['persistent'];
+                $this->dsn = $this->connected_dsn;
+                $this->database_name = $this->connected_database_name;
+                $this->options['persistent'] = $this->opened_persistent;
+                $this->rollback();
+                $this->dsn = $dsn;
+                $this->database_name = $database_name;
+                $this->options['persistent'] = $persistent;
+            }
+
+            if (!$this->opened_persistent || $force) {
+                $ok = @pg_close($this->connection);
+                if (!$ok) {
+                    return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED,
+                           null, null, null, __FUNCTION__);
+                }
+            }
+        } else {
+            return false;
+        }
+        return parent::disconnect($force);
+    }
+
+    // }}}
+    // {{{ standaloneQuery()
+
+    /**
+     * execute a query as DBA
+     *
+     * @param string $query the SQL query
+     * @param mixed   $types  array that contains the types of the columns in
+     *                        the result set
+     * @param boolean $is_manip  if the query is a manipulation query
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function standaloneQuery($query, $types = null, $is_manip = false)
+    {
+        $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username'];
+        $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password'];
+        $connection = $this->_doConnect($user, $pass, $this->database_name, $this->options['persistent']);
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
+
+        $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name);
+        if (!PEAR::isError($result)) {
+            if ($is_manip) {
+                $result =  $this->_affectedRows($connection, $result);
+            } else {
+                $result = $this->_wrapResult($result, $types, true, true, $limit, $offset);
+            }
+        }
+
+        @pg_close($connection);
+        return $result;
+    }
+
+    // }}}
+    // {{{ _doQuery()
+
+    /**
+     * Execute a query
+     * @param string $query  query
+     * @param boolean $is_manip  if the query is a manipulation query
+     * @param resource $connection
+     * @param string $database_name
+     * @return result or error object
+     * @access protected
+     */
+    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
+    {
+        $this->last_query = $query;
+        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        if ($this->options['disable_query']) {
+            $result = $is_manip ? 0 : null;
+            return $result;
+        }
+
+        if (null === $connection) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+
+        $function = $this->options['multi_query'] ? 'pg_send_query' : 'pg_query';
+        $result = @$function($connection, $query);
+        if (!$result) {
+            $err = $this->raiseError(null, null, null,
+                'Could not execute statement', __FUNCTION__);
+            return $err;
+        } elseif ($this->options['multi_query']) {
+            if (!($result = @pg_get_result($connection))) {
+                $err = $this->raiseError(null, null, null,
+                        'Could not get the first result from a multi query', __FUNCTION__);
+                return $err;
+            }
+        }
+
+        $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result));
+        return $result;
+    }
+
+    // }}}
+    // {{{ _affectedRows()
+
+    /**
+     * Returns the number of rows affected
+     *
+     * @param resource $result
+     * @param resource $connection
+     * @return mixed MDB2 Error Object or the number of rows affected
+     * @access private
+     */
+    function _affectedRows($connection, $result = null)
+    {
+        if (null === $connection) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+        return @pg_affected_rows($result);
+    }
+
+    // }}}
+    // {{{ _modifyQuery()
+
+    /**
+     * Changes a query string for various DBMS specific reasons
+     *
+     * @param string $query  query to modify
+     * @param boolean $is_manip  if it is a DML query
+     * @param integer $limit  limit the number of rows
+     * @param integer $offset  start reading from given offset
+     * @return string modified query
+     * @access protected
+     */
+    function _modifyQuery($query, $is_manip, $limit, $offset)
+    {
+        if ($limit > 0
+            && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query)
+        ) {
+            $query = rtrim($query);
+            if (substr($query, -1) == ';') {
+                $query = substr($query, 0, -1);
+            }
+            if ($is_manip) {
+                $query = $this->_modifyManipQuery($query, $limit);
+            } else {
+                $query.= " LIMIT $limit OFFSET $offset";
+            }
+        }
+        return $query;
+    }
+
+    // }}}
+    // {{{ _modifyManipQuery()
+
+    /**
+     * Changes a manip query string for various DBMS specific reasons
+     *
+     * @param string $query  query to modify
+     * @param integer $limit  limit the number of rows
+     * @return string modified query
+     * @access protected
+     */
+    function _modifyManipQuery($query, $limit)
+    {
+        $pos = strpos(strtolower($query), 'where');
+        $where = $pos ? substr($query, $pos) : '';
+
+        $manip_clause = '(\bDELETE\b\s+(?:\*\s+)?\bFROM\b|\bUPDATE\b)';
+        $from_clause  = '([\w\.]+)';
+        $where_clause = '(?:(.*)\bWHERE\b\s+(.*))|(.*)';
+        $pattern = '/^'. $manip_clause . '\s+' . $from_clause .'(?:\s)*(?:'. $where_clause .')?$/i';
+        $matches = preg_match($pattern, $query, $match);
+        if ($matches) {
+            $manip = $match[1];
+            $from  = $match[2];
+            $what  = (count($matches) == 6) ? $match[5] : $match[3];
+            return $manip.' '.$from.' '.$what.' WHERE ctid=(SELECT ctid FROM '.$from.' '.$where.' LIMIT '.$limit.')';
+        }
+        //return error?
+        return $query;
+    }
+
+    // }}}
+    // {{{ getServerVersion()
+
+    /**
+     * return version information about the server
+     *
+     * @param bool   $native  determines if the raw version string should be returned
+     * @return mixed array/string with version information or MDB2 error object
+     * @access public
+     */
+    function getServerVersion($native = false)
+    {
+        $query = 'SHOW SERVER_VERSION';
+        if ($this->connected_server_info) {
+            $server_info = $this->connected_server_info;
+        } else {
+            $server_info = $this->queryOne($query, 'text');
+            if (PEAR::isError($server_info)) {
+                return $server_info;
+            }
+        }
+        // cache server_info
+        $this->connected_server_info = $server_info;
+        if (!$native && !PEAR::isError($server_info)) {
+            $tmp = explode('.', $server_info, 3);
+            if (empty($tmp[2])
+                && isset($tmp[1])
+                && preg_match('/(\d+)(.*)/', $tmp[1], $tmp2)
+            ) {
+                $server_info = array(
+                    'major' => $tmp[0],
+                    'minor' => $tmp2[1],
+                    'patch' => null,
+                    'extra' => $tmp2[2],
+                    'native' => $server_info,
+                );
+            } else {
+                $server_info = array(
+                    'major' => isset($tmp[0]) ? $tmp[0] : null,
+                    'minor' => isset($tmp[1]) ? $tmp[1] : null,
+                    'patch' => isset($tmp[2]) ? $tmp[2] : null,
+                    'extra' => null,
+                    'native' => $server_info,
+                );
+            }
+        }
+        return $server_info;
+    }
+
+    // }}}
+    // {{{ prepare()
+
+    /**
+     * Prepares a query for multiple execution with execute().
+     * With some database backends, this is emulated.
+     * prepare() requires a generic query as string like
+     * 'INSERT INTO numbers VALUES(?,?)' or
+     * 'INSERT INTO numbers VALUES(:foo,:bar)'.
+     * The ? and :name and are placeholders which can be set using
+     * bindParam() and the query can be sent off using the execute() method.
+     * The allowed format for :name can be set with the 'bindname_format' option.
+     *
+     * @param string $query the query to prepare
+     * @param mixed   $types  array that contains the types of the placeholders
+     * @param mixed   $result_types  array that contains the types of the columns in
+     *                        the result set or MDB2_PREPARE_RESULT, if set to
+     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
+     * @param mixed   $lobs   key (field) value (parameter) pair for all lob placeholders
+     * @return mixed resource handle for the prepared query on success, a MDB2
+     *        error on failure
+     * @access public
+     * @see bindParam, execute
+     */
+    function prepare($query, $types = null, $result_types = null, $lobs = array())
+    {
+        if ($this->options['emulate_prepared']) {
+            return parent::prepare($query, $types, $result_types, $lobs);
+        }
+        $is_manip = ($result_types === MDB2_PREPARE_MANIP);
+        $offset = $this->offset;
+        $limit = $this->limit;
+        $this->offset = $this->limit = 0;
+        $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        $pgtypes = function_exists('pg_prepare') ? false : array();
+        if ($pgtypes !== false && !empty($types)) {
+            $this->loadModule('Datatype', null, true);
+        }
+        $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
+        $placeholder_type_guess = $placeholder_type = null;
+        $question = '?';
+        $colon = ':';
+        $positions = array();
+        $position = $parameter = 0;
+        while ($position < strlen($query)) {
+            $q_position = strpos($query, $question, $position);
+            $c_position = strpos($query, $colon, $position);
+            //skip "::type" cast ("select id::varchar(20) from sometable where name=?")
+            $doublecolon_position = strpos($query, '::', $position);
+            if ($doublecolon_position !== false && $doublecolon_position == $c_position) {
+                $c_position = strpos($query, $colon, $position+2);
+            }
+            if ($q_position && $c_position) {
+                $p_position = min($q_position, $c_position);
+            } elseif ($q_position) {
+                $p_position = $q_position;
+            } elseif ($c_position) {
+                $p_position = $c_position;
+            } else {
+                break;
+            }
+            if (null === $placeholder_type) {
+                $placeholder_type_guess = $query[$p_position];
+            }
+
+            $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position);
+            if (PEAR::isError($new_pos)) {
+                return $new_pos;
+            }
+            if ($new_pos != $position) {
+                $position = $new_pos;
+                continue; //evaluate again starting from the new position
+            }
+
+            if ($query[$position] == $placeholder_type_guess) {
+                if (null === $placeholder_type) {
+                    $placeholder_type = $query[$p_position];
+                    $question = $colon = $placeholder_type;
+                    if (!empty($types) && is_array($types)) {
+                        if ($placeholder_type == ':') {
+                        } else {
+                            $types = array_values($types);
+                        }
+                    }
+                }
+                if ($placeholder_type_guess == '?') {
+                    $length = 1;
+                    $name = $parameter;
+                } else {
+                    $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
+                    $param = preg_replace($regexp, '\\1', $query);
+                    if ($param === '') {
+                        $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
+                            'named parameter name must match "bindname_format" option', __FUNCTION__);
+                        return $err;
+                    }
+                    $length = strlen($param) + 1;
+                    $name = $param;
+                }
+                if ($pgtypes !== false) {
+                    if (is_array($types) && array_key_exists($name, $types)) {
+                        $pgtypes[] = $this->datatype->mapPrepareDatatype($types[$name]);
+                    } elseif (is_array($types) && array_key_exists($parameter, $types)) {
+                        $pgtypes[] = $this->datatype->mapPrepareDatatype($types[$parameter]);
+                    } else {
+                        $pgtypes[] = 'text';
+                    }
+                }
+                if (($key_parameter = array_search($name, $positions)) !== false) {
+                    //$next_parameter = 1;
+                    $parameter = $key_parameter + 1;
+                    //foreach ($positions as $key => $value) {
+                    //    if ($key_parameter == $key) {
+                    //        break;
+                    //    }
+                    //    ++$next_parameter;
+                    //}
+                } else {
+                    ++$parameter;
+                    //$next_parameter = $parameter;
+                    $positions[] = $name;
+                }
+                $query = substr_replace($query, '$'.$parameter, $position, $length);
+                $position = $p_position + strlen($parameter);
+            } else {
+                $position = $p_position;
+            }
+        }
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+        static $prep_statement_counter = 1;
+        $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand()));
+        $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']);
+        if (false === $pgtypes) {
+            $result = @pg_prepare($connection, $statement_name, $query);
+            if (!$result) {
+                $err = $this->raiseError(null, null, null,
+                    'Unable to create prepared statement handle', __FUNCTION__);
+                return $err;
+            }
+        } else {
+            $types_string = '';
+            if ($pgtypes) {
+                $types_string = ' ('.implode(', ', $pgtypes).') ';
+            }
+            $query = 'PREPARE '.$statement_name.$types_string.' AS '.$query;
+            $statement = $this->_doQuery($query, true, $connection);
+            if (PEAR::isError($statement)) {
+                return $statement;
+            }
+        }
+
+        $class_name = 'MDB2_Statement_'.$this->phptype;
+        $obj = new $class_name($this, $statement_name, $positions, $query, $types, $result_types, $is_manip, $limit, $offset);
+        $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj));
+        return $obj;
+    }
+
+    // }}}
+    // {{{ function getSequenceName($sqn)
+
+    /**
+     * adds sequence name formatting to a sequence name
+     *
+     * @param   string  name of the sequence
+     *
+     * @return  string  formatted sequence name
+     *
+     * @access  public
+     */
+    function getSequenceName($sqn)
+    {
+        if (false === $this->options['disable_smart_seqname']) {
+            if (strpos($sqn, '_') !== false) {
+                list($table, $field) = explode('_', $sqn, 2);
+            }
+            $schema_list = $this->queryOne("SELECT array_to_string(current_schemas(false), ',')");
+            if (PEAR::isError($schema_list) || empty($schema_list) || count($schema_list) < 2) {
+                $order_by = ' a.attnum';
+                $schema_clause = ' AND n.nspname=current_schema()';
+            } else {
+                $schemas = explode(',', $schema_list);
+                $schema_clause = ' AND n.nspname IN ('.$schema_list.')';
+                $counter = 1;
+                $order_by = ' CASE ';
+                foreach ($schemas as $schema) {
+                    $order_by .= ' WHEN n.nspname='.$schema.' THEN '.$counter++;
+                }
+                $order_by .= ' ELSE '.$counter.' END, a.attnum';
+            }
+
+            $query = "SELECT substring((SELECT substring(pg_get_expr(d.adbin, d.adrelid) for 128)
+                    	    FROM pg_attrdef d
+                    	   WHERE d.adrelid = a.attrelid
+                    	     AND d.adnum = a.attnum
+                    	     AND a.atthasdef
+                    	 ) FROM 'nextval[^'']*''([^'']*)')
+                        FROM pg_attribute a
+                    LEFT JOIN pg_class c ON c.oid = a.attrelid
+                    LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef
+                    LEFT JOIN pg_namespace n ON c.relnamespace = n.oid
+                       WHERE (c.relname = ".$this->quote($sqn, 'text');
+            if (!empty($field)) {
+                $query .= " OR (c.relname = ".$this->quote($table, 'text')." AND a.attname = ".$this->quote($field, 'text').")";
+            }
+            $query .= "      )"
+                         .$schema_clause."
+                         AND NOT a.attisdropped
+                         AND a.attnum > 0
+                         AND pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval%'
+                    ORDER BY ".$order_by;
+            $seqname = $this->queryOne($query);
+            if (!PEAR::isError($seqname) && !empty($seqname) && is_string($seqname)) {
+                return $seqname;
+            }
+        }
+
+        return parent::getSequenceName($sqn);
+    }
+
+    // }}}
+    // {{{ nextID()
+
+    /**
+     * Returns the next free id of a sequence
+     *
+     * @param string $seq_name name of the sequence
+     * @param boolean $ondemand when true the sequence is
+     *                          automatic created, if it
+     *                          not exists
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function nextID($seq_name, $ondemand = true)
+    {
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
+        $query = "SELECT NEXTVAL('$sequence_name')";
+        $this->pushErrorHandling(PEAR_ERROR_RETURN);
+        $this->expectError(MDB2_ERROR_NOSUCHTABLE);
+        $result = $this->queryOne($query, 'integer');
+        $this->popExpect();
+        $this->popErrorHandling();
+        if (PEAR::isError($result)) {
+            if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) {
+                $this->loadModule('Manager', null, true);
+                $result = $this->manager->createSequence($seq_name);
+                if (PEAR::isError($result)) {
+                    return $this->raiseError($result, null, null,
+                        'on demand sequence could not be created', __FUNCTION__);
+                }
+                return $this->nextId($seq_name, false);
+            }
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ lastInsertID()
+
+    /**
+     * Returns the autoincrement ID if supported or $id or fetches the current
+     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
+     *
+     * @param string $table name of the table into which a new row was inserted
+     * @param string $field name of the field into which a new row was inserted
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function lastInsertID($table = null, $field = null)
+    {
+        if (empty($table) && empty($field)) {
+            return $this->queryOne('SELECT lastval()', 'integer');
+        }
+        $seq = $table.(empty($field) ? '' : '_'.$field);
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq), true);
+        return $this->queryOne("SELECT currval('$sequence_name')", 'integer');
+    }
+
+    // }}}
+    // {{{ currID()
+
+    /**
+     * Returns the current id of a sequence
+     *
+     * @param string $seq_name name of the sequence
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function currID($seq_name)
+    {
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
+        return $this->queryOne("SELECT last_value FROM $sequence_name", 'integer');
+    }
+}
+
+/**
+ * MDB2 PostGreSQL result driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_Result_pgsql extends MDB2_Result_Common
+{
+    // }}}
+    // {{{ fetchRow()
+
+    /**
+     * Fetch a row and insert the data into an existing array.
+     *
+     * @param int       $fetchmode  how the array data should be indexed
+     * @param int    $rownum    number of the row where the data can be found
+     * @return int data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
+    {
+        if (null !== $rownum) {
+            $seek = $this->seek($rownum);
+            if (PEAR::isError($seek)) {
+                return $seek;
+            }
+        }
+        if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
+            $fetchmode = $this->db->fetchmode;
+        }
+        if (   $fetchmode == MDB2_FETCHMODE_ASSOC
+            || $fetchmode == MDB2_FETCHMODE_OBJECT
+        ) {
+            $row = @pg_fetch_array($this->result, null, PGSQL_ASSOC);
+            if (is_array($row)
+                && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
+            ) {
+                $row = array_change_key_case($row, $this->db->options['field_case']);
+            }
+        } else {
+            $row = @pg_fetch_row($this->result);
+        }
+        if (!$row) {
+            if (false === $this->result) {
+                $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+                return $err;
+            }
+            return null;
+        }
+        $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
+        $rtrim = false;
+        if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) {
+            if (empty($this->types)) {
+                $mode += MDB2_PORTABILITY_RTRIM;
+            } else {
+                $rtrim = true;
+            }
+        }
+        if ($mode) {
+            $this->db->_fixResultArrayValues($row, $mode);
+        }
+        if (   (   $fetchmode != MDB2_FETCHMODE_ASSOC
+                && $fetchmode != MDB2_FETCHMODE_OBJECT)
+            && !empty($this->types)
+        ) {
+            $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim);
+        } elseif (($fetchmode == MDB2_FETCHMODE_ASSOC
+                || $fetchmode == MDB2_FETCHMODE_OBJECT)
+            && !empty($this->types_assoc)
+        ) {
+            $row = $this->db->datatype->convertResultRow($this->types_assoc, $row, $rtrim);
+        }
+        if (!empty($this->values)) {
+            $this->_assignBindColumns($row);
+        }
+        if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
+            $object_class = $this->db->options['fetch_class'];
+            if ($object_class == 'stdClass') {
+                $row = (object) $row;
+            } else {
+                $rowObj = new $object_class($row);
+                $row = $rowObj;
+            }
+        }
+        ++$this->rownum;
+        return $row;
+    }
+
+    // }}}
+    // {{{ _getColumnNames()
+
+    /**
+     * Retrieve the names of columns returned by the DBMS in a query result.
+     *
+     * @return  mixed   Array variable that holds the names of columns as keys
+     *                  or an MDB2 error on failure.
+     *                  Some DBMS may not return any columns when the result set
+     *                  does not contain any rows.
+     * @access private
+     */
+    function _getColumnNames()
+    {
+        $columns = array();
+        $numcols = $this->numCols();
+        if (PEAR::isError($numcols)) {
+            return $numcols;
+        }
+        for ($column = 0; $column < $numcols; $column++) {
+            $column_name = @pg_field_name($this->result, $column);
+            $columns[$column_name] = $column;
+        }
+        if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $columns = array_change_key_case($columns, $this->db->options['field_case']);
+        }
+        return $columns;
+    }
+
+    // }}}
+    // {{{ numCols()
+
+    /**
+     * Count the number of columns returned by the DBMS in a query result.
+     *
+     * @access public
+     * @return mixed integer value with the number of columns, a MDB2 error
+     *                       on failure
+     */
+    function numCols()
+    {
+        $cols = @pg_num_fields($this->result);
+        if (null === $cols) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            }
+            if (null === $this->result) {
+                return count($this->types);
+            }
+            return $this->db->raiseError(null, null, null,
+                'Could not get column count', __FUNCTION__);
+        }
+        return $cols;
+    }
+
+    // }}}
+    // {{{ nextResult()
+
+    /**
+     * Move the internal result pointer to the next available result
+     *
+     * @return true on success, false if there is no more result set or an error object on failure
+     * @access public
+     */
+    function nextResult()
+    {
+        $connection = $this->db->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        if (!($this->result = @pg_get_result($connection))) {
+            return false;
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ free()
+
+    /**
+     * Free the internal resources associated with result.
+     *
+     * @return boolean true on success, false if result is invalid
+     * @access public
+     */
+    function free()
+    {
+        if (is_resource($this->result) && $this->db->connection) {
+            $free = @pg_free_result($this->result);
+            if (false === $free) {
+                return $this->db->raiseError(null, null, null,
+                    'Could not free result', __FUNCTION__);
+            }
+        }
+        $this->result = false;
+        return MDB2_OK;
+    }
+}
+
+/**
+ * MDB2 PostGreSQL buffered result driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_BufferedResult_pgsql extends MDB2_Result_pgsql
+{
+    // {{{ seek()
+
+    /**
+     * Seek to a specific row in a result set
+     *
+     * @param int    $rownum    number of the row where the data can be found
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function seek($rownum = 0)
+    {
+        if ($this->rownum != ($rownum - 1) && !@pg_result_seek($this->result, $rownum)) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            }
+            if (null === $this->result) {
+                return MDB2_OK;
+            }
+            return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
+                'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__);
+        }
+        $this->rownum = $rownum - 1;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ valid()
+
+    /**
+     * Check if the end of the result set has been reached
+     *
+     * @return mixed true or false on sucess, a MDB2 error on failure
+     * @access public
+     */
+    function valid()
+    {
+        $numrows = $this->numRows();
+        if (PEAR::isError($numrows)) {
+            return $numrows;
+        }
+        return $this->rownum < ($numrows - 1);
+    }
+
+    // }}}
+    // {{{ numRows()
+
+    /**
+     * Returns the number of rows in a result object
+     *
+     * @return mixed MDB2 Error Object or the number of rows
+     * @access public
+     */
+    function numRows()
+    {
+        $rows = @pg_num_rows($this->result);
+        if (null === $rows) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            }
+            if (null === $this->result) {
+                return 0;
+            }
+            return $this->db->raiseError(null, null, null,
+                'Could not get row count', __FUNCTION__);
+        }
+        return $rows;
+    }
+}
+
+/**
+ * MDB2 PostGreSQL statement driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Paul Cooper <pgc@ucecom.com>
+ */
+class MDB2_Statement_pgsql extends MDB2_Statement_Common
+{
+    // {{{ _execute()
+
+    /**
+     * Execute a prepared query statement helper method.
+     *
+     * @param mixed $result_class string which specifies which result class to use
+     * @param mixed $result_wrap_class string which specifies which class to wrap results in
+     *
+     * @return mixed MDB2_Result or integer (affected rows) on success,
+     *               a MDB2 error on failure
+     * @access private
+     */
+    function _execute($result_class = true, $result_wrap_class = true)
+    {
+        if (null === $this->statement) {
+            return parent::_execute($result_class, $result_wrap_class);
+        }
+        $this->db->last_query = $this->query;
+        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values));
+        if ($this->db->getOption('disable_query')) {
+            $result = $this->is_manip ? 0 : null;
+            return $result;
+        }
+
+        $connection = $this->db->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $query = false;
+        $parameters = array();
+        // todo: disabled until pg_execute() bytea issues are cleared up
+        if (true || !function_exists('pg_execute')) {
+            $query = 'EXECUTE '.$this->statement;
+        }
+        if (!empty($this->positions)) {
+            foreach ($this->positions as $parameter) {
+                if (!array_key_exists($parameter, $this->values)) {
+                    return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
+                }
+                $value = $this->values[$parameter];
+                $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null;
+                if (is_resource($value) || $type == 'clob' || $type == 'blob' || $this->db->options['lob_allow_url_include']) {
+                    if (!is_resource($value) && preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
+                        if ($match[1] == 'file://') {
+                            $value = $match[2];
+                        }
+                        $value = @fopen($value, 'r');
+                        $close = true;
+                    }
+                    if (is_resource($value)) {
+                        $data = '';
+                        while (!@feof($value)) {
+                            $data.= @fread($value, $this->db->options['lob_buffer_length']);
+                        }
+                        if ($close) {
+                            @fclose($value);
+                        }
+                        $value = $data;
+                    }
+                }
+                $quoted = $this->db->quote($value, $type, $query);
+                if (PEAR::isError($quoted)) {
+                    return $quoted;
+                }
+                $parameters[] = $quoted;
+            }
+            if ($query) {
+                $query.= ' ('.implode(', ', $parameters).')';
+            }
+        }
+
+        if (!$query) {
+            $result = @pg_execute($connection, $this->statement, $parameters);
+            if (!$result) {
+                $err = $this->db->raiseError(null, null, null,
+                    'Unable to execute statement', __FUNCTION__);
+                return $err;
+            }
+        } else {
+            $result = $this->db->_doQuery($query, $this->is_manip, $connection);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+
+        if ($this->is_manip) {
+            $affected_rows = $this->db->_affectedRows($connection, $result);
+            return $affected_rows;
+        }
+
+        $result = $this->db->_wrapResult($result, $this->result_types,
+            $result_class, $result_wrap_class, $this->limit, $this->offset);
+        $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result));
+        return $result;
+    }
+
+    // }}}
+    // {{{ free()
+
+    /**
+     * Release resources allocated for the specified prepared query.
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function free()
+    {
+        if (null === $this->positions) {
+            return $this->db->raiseError(MDB2_ERROR, null, null,
+                'Prepared statement has already been freed', __FUNCTION__);
+        }
+        $result = MDB2_OK;
+
+        if (null !== $this->statement) {
+            $connection = $this->db->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+            $query = 'DEALLOCATE PREPARE '.$this->statement;
+            $result = $this->db->_doQuery($query, true, $connection);
+        }
+
+        parent::free();
+        return $result;
+    }
+
+    /**
+     * drop an existing table
+     *
+     * @param string $name name of the table that should be dropped
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function dropTable($name)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $name = $db->quoteIdentifier($name, true);
+        $result = $db->exec("DROP TABLE $name");
+
+        if (PEAR::isError($result)) {
+            $result = $db->exec("DROP TABLE $name CASCADE");
+        }
+
+       return $result;
+    }
+}
+?>
diff --git a/3rdparty/MDB2/Driver/sqlite.php b/3rdparty/MDB2/Driver/sqlite.php
index e8f1bba583cdf9651b32a646844de0ed6eec0c99..42363bb8c58cbe0eed5813aea5bc047182c67db2 100644
--- a/3rdparty/MDB2/Driver/sqlite.php
+++ b/3rdparty/MDB2/Driver/sqlite.php
@@ -1,1093 +1,1104 @@
-<?php
-// vim: set et ts=4 sw=4 fdm=marker:
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
-//
-
-/**
- * MDB2 SQLite driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Driver_sqlite extends MDB2_Driver_Common
-{
-    // {{{ properties
-    var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => false);
-
-    var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"');
-
-    var $_lasterror = '';
-
-    var $fix_assoc_fields_names = false;
-
-    // }}}
-    // {{{ constructor
-
-    /**
-     * Constructor
-     */
-    function __construct()
-    {
-        parent::__construct();
-
-        $this->phptype = 'sqlite';
-        $this->dbsyntax = 'sqlite';
-
-        $this->supported['sequences'] = 'emulated';
-        $this->supported['indexes'] = true;
-        $this->supported['affected_rows'] = true;
-        $this->supported['summary_functions'] = true;
-        $this->supported['order_by_text'] = true;
-        $this->supported['current_id'] = 'emulated';
-        $this->supported['limit_queries'] = true;
-        $this->supported['LOBs'] = true;
-        $this->supported['replace'] = true;
-        $this->supported['transactions'] = true;
-        $this->supported['savepoints'] = false;
-        $this->supported['sub_selects'] = true;
-        $this->supported['triggers'] = true;
-        $this->supported['auto_increment'] = true;
-        $this->supported['primary_key'] = false; // requires alter table implementation
-        $this->supported['result_introspection'] = false; // not implemented
-        $this->supported['prepared_statements'] = 'emulated';
-        $this->supported['identifier_quoting'] = true;
-        $this->supported['pattern_escaping'] = false;
-        $this->supported['new_link'] = false;
-
-        $this->options['DBA_username'] = false;
-        $this->options['DBA_password'] = false;
-        $this->options['base_transaction_name'] = '___php_MDB2_sqlite_auto_commit_off';
-        $this->options['fixed_float'] = 0;
-        $this->options['database_path'] = '';
-        $this->options['database_extension'] = '';
-        $this->options['server_version'] = '';
-        $this->options['max_identifiers_length'] = 128; //no real limit
-    }
-
-    // }}}
-    // {{{ errorInfo()
-
-    /**
-     * This method is used to collect information about an error
-     *
-     * @param integer $error
-     * @return array
-     * @access public
-     */
-    function errorInfo($error = null)
-    {
-        $native_code = null;
-        if ($this->connection) {
-            $native_code = @sqlite_last_error($this->connection);
-        }
-        $native_msg = $this->_lasterror
-            ? html_entity_decode($this->_lasterror) : @sqlite_error_string($native_code);
-            
-        // PHP 5.2+ prepends the function name to $php_errormsg, so we need
-        // this hack to work around it, per bug #9599.
-        $native_msg = preg_replace('/^sqlite[a-z_]+\(\)[^:]*: /', '', $native_msg);
-
-        if (null === $error) {
-            static $error_regexps;
-            if (empty($error_regexps)) {
-                $error_regexps = array(
-                    '/^no such table:/' => MDB2_ERROR_NOSUCHTABLE,
-                    '/^no such index:/' => MDB2_ERROR_NOT_FOUND,
-                    '/^(table|index) .* already exists$/' => MDB2_ERROR_ALREADY_EXISTS,
-                    '/PRIMARY KEY must be unique/i' => MDB2_ERROR_CONSTRAINT,
-                    '/is not unique/' => MDB2_ERROR_CONSTRAINT,
-                    '/columns .* are not unique/i' => MDB2_ERROR_CONSTRAINT,
-                    '/uniqueness constraint failed/' => MDB2_ERROR_CONSTRAINT,
-                    '/may not be NULL/' => MDB2_ERROR_CONSTRAINT_NOT_NULL,
-                    '/^no such column:/' => MDB2_ERROR_NOSUCHFIELD,
-                    '/no column named/' => MDB2_ERROR_NOSUCHFIELD,
-                    '/column not present in both tables/i' => MDB2_ERROR_NOSUCHFIELD,
-                    '/^near ".*": syntax error$/' => MDB2_ERROR_SYNTAX,
-                    '/[0-9]+ values for [0-9]+ columns/i' => MDB2_ERROR_VALUE_COUNT_ON_ROW,
-                 );
-            }
-            foreach ($error_regexps as $regexp => $code) {
-                if (preg_match($regexp, $native_msg)) {
-                    $error = $code;
-                    break;
-                }
-            }
-        }
-        return array($error, $native_code, $native_msg);
-    }
-
-    // }}}
-    // {{{ escape()
-
-    /**
-     * Quotes a string so it can be safely used in a query. It will quote
-     * the text so it can safely be used within a query.
-     *
-     * @param   string  the input string to quote
-     * @param   bool    escape wildcards
-     *
-     * @return  string  quoted string
-     *
-     * @access  public
-     */
-    function escape($text, $escape_wildcards = false)
-    {
-        $text = @sqlite_escape_string($text);
-        return $text;
-    }
-
-    // }}}
-    // {{{ beginTransaction()
-
-    /**
-     * Start a transaction or set a savepoint.
-     *
-     * @param   string  name of a savepoint to set
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function beginTransaction($savepoint = null)
-    {
-        $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (null !== $savepoint) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'savepoints are not supported', __FUNCTION__);
-        }
-        if ($this->in_transaction) {
-            return MDB2_OK;  //nothing to do
-        }
-        if (!$this->destructor_registered && $this->opened_persistent) {
-            $this->destructor_registered = true;
-            register_shutdown_function('MDB2_closeOpenTransactions');
-        }
-        $query = 'BEGIN TRANSACTION '.$this->options['base_transaction_name'];
-        $result = $this->_doQuery($query, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = true;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ commit()
-
-    /**
-     * Commit the database changes done during a transaction that is in
-     * progress or release a savepoint. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after committing the pending changes.
-     *
-     * @param   string  name of a savepoint to release
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function commit($savepoint = null)
-    {
-        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (!$this->in_transaction) {
-            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
-        }
-        if (null !== $savepoint) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'savepoints are not supported', __FUNCTION__);
-        }
-
-        $query = 'COMMIT TRANSACTION '.$this->options['base_transaction_name'];
-        $result = $this->_doQuery($query, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{
-
-    /**
-     * Cancel any database changes done during a transaction or since a specific
-     * savepoint that is in progress. This function may only be called when
-     * auto-committing is disabled, otherwise it will fail. Therefore, a new
-     * transaction is implicitly started after canceling the pending changes.
-     *
-     * @param   string  name of a savepoint to rollback to
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     */
-    function rollback($savepoint = null)
-    {
-        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
-        if (!$this->in_transaction) {
-            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                'rollback cannot be done changes are auto committed', __FUNCTION__);
-        }
-        if (null !== $savepoint) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'savepoints are not supported', __FUNCTION__);
-        }
-
-        $query = 'ROLLBACK TRANSACTION '.$this->options['base_transaction_name'];
-        $result = $this->_doQuery($query, true);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        $this->in_transaction = false;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ function setTransactionIsolation()
-
-    /**
-     * Set the transacton isolation level.
-     *
-     * @param   string  standard isolation level
-     *                  READ UNCOMMITTED (allows dirty reads)
-     *                  READ COMMITTED (prevents dirty reads)
-     *                  REPEATABLE READ (prevents nonrepeatable reads)
-     *                  SERIALIZABLE (prevents phantom reads)
-     * @param   array some transaction options:
-     *                  'wait' => 'WAIT' | 'NO WAIT'
-     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
-     *
-     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
-     *
-     * @access  public
-     * @since   2.1.1
-     */
-    function setTransactionIsolation($isolation, $options = array())
-    {
-        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
-        switch ($isolation) {
-        case 'READ UNCOMMITTED':
-            $isolation = 0;
-            break;
-        case 'READ COMMITTED':
-        case 'REPEATABLE READ':
-        case 'SERIALIZABLE':
-            $isolation = 1;
-            break;
-        default:
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'isolation level is not supported: '.$isolation, __FUNCTION__);
-        }
-
-        $query = "PRAGMA read_uncommitted=$isolation";
-        return $this->_doQuery($query, true);
-    }
-
-    // }}}
-    // {{{ getDatabaseFile()
-
-    /**
-     * Builds the string with path+dbname+extension
-     *
-     * @return string full database path+file
-     * @access protected
-     */
-    function _getDatabaseFile($database_name)
-    {
-        if ($database_name === '' || $database_name === ':memory:') {
-            return $database_name;
-        }
-        return $this->options['database_path'].$database_name.$this->options['database_extension'];
-    }
-
-    // }}}
-    // {{{ connect()
-
-    /**
-     * Connect to the database
-     *
-     * @return true on success, MDB2 Error Object on failure
-     **/
-    function connect()
-    {
-        $database_file = $this->_getDatabaseFile($this->database_name);
-        if (is_resource($this->connection)) {
-            //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
-            if (MDB2::areEquals($this->connected_dsn, $this->dsn)
-                && $this->connected_database_name == $database_file
-                && $this->opened_persistent == $this->options['persistent']
-            ) {
-                return MDB2_OK;
-            }
-            $this->disconnect(false);
-        }
-
-        if (!PEAR::loadExtension($this->phptype)) {
-            return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__);
-        }
-
-        if (empty($this->database_name)) {
-            return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
-            'unable to establish a connection', __FUNCTION__);
-        }
-
-        if ($database_file !== ':memory:') {
-            if (!file_exists($database_file)) {
-                if (!touch($database_file)) {
-                    return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                        'Could not create database file', __FUNCTION__);
-                }
-                if (!isset($this->dsn['mode'])
-                    || !is_numeric($this->dsn['mode'])
-                ) {
-                    $mode = 0644;
-                } else {
-                    $mode = octdec($this->dsn['mode']);
-                }
-                if (!chmod($database_file, $mode)) {
-                    return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                        'Could not be chmodded database file', __FUNCTION__);
-                }
-                if (!file_exists($database_file)) {
-                    return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
-                        'Could not be found database file', __FUNCTION__);
-                }
-            }
-            if (!is_file($database_file)) {
-                return $this->raiseError(MDB2_ERROR_INVALID, null, null,
-                        'Database is a directory name', __FUNCTION__);
-            }
-            if (!is_readable($database_file)) {
-                return $this->raiseError(MDB2_ERROR_ACCESS_VIOLATION, null, null,
-                        'Could not read database file', __FUNCTION__);
-            }
-        }
-
-        $connect_function = ($this->options['persistent'] ? 'sqlite_popen' : 'sqlite_open');
-        $php_errormsg = '';
-        if (version_compare('5.1.0', PHP_VERSION, '>')) {
-            @ini_set('track_errors', true);
-            $connection = @$connect_function($database_file);
-            @ini_restore('track_errors');
-        } else {
-            $connection = @$connect_function($database_file, 0666, $php_errormsg);
-        }
-        $this->_lasterror = $php_errormsg;
-        if (!$connection) {
-            return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
-            'unable to establish a connection', __FUNCTION__);
-        }
-
-        if ($this->fix_assoc_fields_names ||
-            $this->options['portability'] & MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES)
-        {
-            @sqlite_query("PRAGMA short_column_names = 1", $connection);
-            $this->fix_assoc_fields_names = true;
-        }
-
-        $this->connection = $connection;
-        $this->connected_dsn = $this->dsn;
-        $this->connected_database_name = $database_file;
-        $this->opened_persistent = $this->getoption('persistent');
-        $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
-
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ databaseExists()
-
-    /**
-     * check if given database name is exists?
-     *
-     * @param string $name    name of the database that should be checked
-     *
-     * @return mixed true/false on success, a MDB2 error on failure
-     * @access public
-     */
-    function databaseExists($name)
-    {
-        $database_file = $this->_getDatabaseFile($name);
-        $result = file_exists($database_file);
-        return $result;
-    }
-
-    // }}}
-    // {{{ disconnect()
-
-    /**
-     * Log out and disconnect from the database.
-     *
-     * @param  boolean $force if the disconnect should be forced even if the
-     *                        connection is opened persistently
-     * @return mixed true on success, false if not connected and error
-     *                object on error
-     * @access public
-     */
-    function disconnect($force = true)
-    {
-        if (is_resource($this->connection)) {
-            if ($this->in_transaction) {
-                $dsn = $this->dsn;
-                $database_name = $this->database_name;
-                $persistent = $this->options['persistent'];
-                $this->dsn = $this->connected_dsn;
-                $this->database_name = $this->connected_database_name;
-                $this->options['persistent'] = $this->opened_persistent;
-                $this->rollback();
-                $this->dsn = $dsn;
-                $this->database_name = $database_name;
-                $this->options['persistent'] = $persistent;
-            }
-
-            if (!$this->opened_persistent || $force) {
-                @sqlite_close($this->connection);
-            }
-        } else {
-            return false;
-        }
-        return parent::disconnect($force);
-    }
-
-    // }}}
-    // {{{ _doQuery()
-
-    /**
-     * Execute a query
-     * @param string $query  query
-     * @param boolean $is_manip  if the query is a manipulation query
-     * @param resource $connection
-     * @param string $database_name
-     * @return result or error object
-     * @access protected
-     */
-    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
-    {
-        $this->last_query = $query;
-        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
-        if ($result) {
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-            $query = $result;
-        }
-        if ($this->options['disable_query']) {
-            $result = $is_manip ? 0 : null;
-            return $result;
-        }
-
-        if (null === $connection) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-
-        $function = $this->options['result_buffering']
-            ? 'sqlite_query' : 'sqlite_unbuffered_query';
-        $php_errormsg = '';
-        if (version_compare('5.1.0', PHP_VERSION, '>')) {
-            @ini_set('track_errors', true);
-            do {
-                $result = @$function($query.';', $connection);
-            } while (sqlite_last_error($connection) == SQLITE_SCHEMA);
-            @ini_restore('track_errors');
-        } else {
-            do {
-                $result = @$function($query.';', $connection, SQLITE_BOTH, $php_errormsg);
-            } while (sqlite_last_error($connection) == SQLITE_SCHEMA);
-        }
-        $this->_lasterror = $php_errormsg;
-
-        if (!$result) {
-            $code = null;
-            if (0 === strpos($this->_lasterror, 'no such table')) {
-                $code = MDB2_ERROR_NOSUCHTABLE;
-            }
-            $err = $this->raiseError($code, null, null,
-                'Could not execute statement', __FUNCTION__);
-            return $err;
-        }
-
-        $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result));
-        return $result;
-    }
-
-    // }}}
-    // {{{ _affectedRows()
-
-    /**
-     * Returns the number of rows affected
-     *
-     * @param resource $result
-     * @param resource $connection
-     * @return mixed MDB2 Error Object or the number of rows affected
-     * @access private
-     */
-    function _affectedRows($connection, $result = null)
-    {
-        if (null === $connection) {
-            $connection = $this->getConnection();
-            if (PEAR::isError($connection)) {
-                return $connection;
-            }
-        }
-        return @sqlite_changes($connection);
-    }
-
-    // }}}
-    // {{{ _modifyQuery()
-
-    /**
-     * Changes a query string for various DBMS specific reasons
-     *
-     * @param string $query  query to modify
-     * @param boolean $is_manip  if it is a DML query
-     * @param integer $limit  limit the number of rows
-     * @param integer $offset  start reading from given offset
-     * @return string modified query
-     * @access protected
-     */
-    function _modifyQuery($query, $is_manip, $limit, $offset)
-    {
-        if ($this->options['portability'] & MDB2_PORTABILITY_DELETE_COUNT) {
-            if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
-                $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
-                                      'DELETE FROM \1 WHERE 1=1', $query);
-            }
-        }
-        if ($limit > 0
-            && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query)
-        ) {
-            $query = rtrim($query);
-            if (substr($query, -1) == ';') {
-                $query = substr($query, 0, -1);
-            }
-            if ($is_manip) {
-                $query.= " LIMIT $limit";
-            } else {
-                $query.= " LIMIT $offset,$limit";
-            }
-        }
-        return $query;
-    }
-
-    // }}}
-    // {{{ getServerVersion()
-
-    /**
-     * return version information about the server
-     *
-     * @param bool   $native  determines if the raw version string should be returned
-     * @return mixed array/string with version information or MDB2 error object
-     * @access public
-     */
-    function getServerVersion($native = false)
-    {
-        $server_info = false;
-        if ($this->connected_server_info) {
-            $server_info = $this->connected_server_info;
-        } elseif ($this->options['server_version']) {
-            $server_info = $this->options['server_version'];
-        } elseif (function_exists('sqlite_libversion')) {
-            $server_info = @sqlite_libversion();
-        }
-        if (!$server_info) {
-            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
-                'Requires either the "server_version" option or the sqlite_libversion() function', __FUNCTION__);
-        }
-        // cache server_info
-        $this->connected_server_info = $server_info;
-        if (!$native) {
-            $tmp = explode('.', $server_info, 3);
-            $server_info = array(
-                'major' => isset($tmp[0]) ? $tmp[0] : null,
-                'minor' => isset($tmp[1]) ? $tmp[1] : null,
-                'patch' => isset($tmp[2]) ? $tmp[2] : null,
-                'extra' => null,
-                'native' => $server_info,
-            );
-        }
-        return $server_info;
-    }
-
-    // }}}
-    // {{{ replace()
-
-    /**
-     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
-     * query, except that if there is already a row in the table with the same
-     * key field values, the old row is deleted before the new row is inserted.
-     *
-     * The REPLACE type of query does not make part of the SQL standards. Since
-     * practically only SQLite implements it natively, this type of query is
-     * emulated through this method for other DBMS using standard types of
-     * queries inside a transaction to assure the atomicity of the operation.
-     *
-     * @access public
-     *
-     * @param string $table name of the table on which the REPLACE query will
-     *  be executed.
-     * @param array $fields associative array that describes the fields and the
-     *  values that will be inserted or updated in the specified table. The
-     *  indexes of the array are the names of all the fields of the table. The
-     *  values of the array are also associative arrays that describe the
-     *  values and other properties of the table fields.
-     *
-     *  Here follows a list of field properties that need to be specified:
-     *
-     *    value:
-     *          Value to be assigned to the specified field. This value may be
-     *          of specified in database independent type format as this
-     *          function can perform the necessary datatype conversions.
-     *
-     *    Default:
-     *          this property is required unless the Null property
-     *          is set to 1.
-     *
-     *    type
-     *          Name of the type of the field. Currently, all types Metabase
-     *          are supported except for clob and blob.
-     *
-     *    Default: no type conversion
-     *
-     *    null
-     *          Boolean property that indicates that the value for this field
-     *          should be set to null.
-     *
-     *          The default value for fields missing in INSERT queries may be
-     *          specified the definition of a table. Often, the default value
-     *          is already null, but since the REPLACE may be emulated using
-     *          an UPDATE query, make sure that all fields of the table are
-     *          listed in this function argument array.
-     *
-     *    Default: 0
-     *
-     *    key
-     *          Boolean property that indicates that this field should be
-     *          handled as a primary key or at least as part of the compound
-     *          unique index of the table that will determine the row that will
-     *          updated if it exists or inserted a new row otherwise.
-     *
-     *          This function will fail if no key field is specified or if the
-     *          value of a key field is set to null because fields that are
-     *          part of unique index they may not be null.
-     *
-     *    Default: 0
-     *
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     */
-    function replace($table, $fields)
-    {
-        $count = count($fields);
-        $query = $values = '';
-        $keys = $colnum = 0;
-        for (reset($fields); $colnum < $count; next($fields), $colnum++) {
-            $name = key($fields);
-            if ($colnum > 0) {
-                $query .= ',';
-                $values.= ',';
-            }
-            $query.= $this->quoteIdentifier($name, true);
-            if (isset($fields[$name]['null']) && $fields[$name]['null']) {
-                $value = 'NULL';
-            } else {
-                $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null;
-                $value = $this->quote($fields[$name]['value'], $type);
-                if (PEAR::isError($value)) {
-                    return $value;
-                }
-            }
-            $values.= $value;
-            if (isset($fields[$name]['key']) && $fields[$name]['key']) {
-                if ($value === 'NULL') {
-                    return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
-                        'key value '.$name.' may not be NULL', __FUNCTION__);
-                }
-                $keys++;
-            }
-        }
-        if ($keys == 0) {
-            return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
-                'not specified which fields are keys', __FUNCTION__);
-        }
-
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-
-        $table = $this->quoteIdentifier($table, true);
-        $query = "REPLACE INTO $table ($query) VALUES ($values)";
-        $result = $this->_doQuery($query, true, $connection);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return $this->_affectedRows($connection, $result);
-    }
-
-    // }}}
-    // {{{ nextID()
-
-    /**
-     * Returns the next free id of a sequence
-     *
-     * @param string $seq_name name of the sequence
-     * @param boolean $ondemand when true the sequence is
-     *                          automatic created, if it
-     *                          not exists
-     *
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function nextID($seq_name, $ondemand = true)
-    {
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
-        $seqcol_name = $this->options['seqcol_name'];
-        $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)";
-        $this->pushErrorHandling(PEAR_ERROR_RETURN);
-        $this->expectError(MDB2_ERROR_NOSUCHTABLE);
-        $result = $this->_doQuery($query, true);
-        $this->popExpect();
-        $this->popErrorHandling();
-        if (PEAR::isError($result)) {
-            if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) {
-                $this->loadModule('Manager', null, true);
-                $result = $this->manager->createSequence($seq_name);
-                if (PEAR::isError($result)) {
-                    return $this->raiseError($result, null, null,
-                        'on demand sequence '.$seq_name.' could not be created', __FUNCTION__);
-                } else {
-                    return $this->nextID($seq_name, false);
-                }
-            }
-            return $result;
-        }
-        $value = $this->lastInsertID();
-        if (is_numeric($value)) {
-            $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value";
-            $result = $this->_doQuery($query, true);
-            if (PEAR::isError($result)) {
-                $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name;
-            }
-        }
-        return $value;
-    }
-
-    // }}}
-    // {{{ lastInsertID()
-
-    /**
-     * Returns the autoincrement ID if supported or $id or fetches the current
-     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
-     *
-     * @param string $table name of the table into which a new row was inserted
-     * @param string $field name of the field into which a new row was inserted
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function lastInsertID($table = null, $field = null)
-    {
-        $connection = $this->getConnection();
-        if (PEAR::isError($connection)) {
-            return $connection;
-        }
-        $value = @sqlite_last_insert_rowid($connection);
-        if (!$value) {
-            return $this->raiseError(null, null, null,
-                'Could not get last insert ID', __FUNCTION__);
-        }
-        return $value;
-    }
-
-    // }}}
-    // {{{ currID()
-
-    /**
-     * Returns the current id of a sequence
-     *
-     * @param string $seq_name name of the sequence
-     * @return mixed MDB2 Error Object or id
-     * @access public
-     */
-    function currID($seq_name)
-    {
-        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
-        $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true);
-        $query = "SELECT MAX($seqcol_name) FROM $sequence_name";
-        return $this->queryOne($query, 'integer');
-    }
-}
-
-/**
- * MDB2 SQLite result driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Result_sqlite extends MDB2_Result_Common
-{
-    // }}}
-    // {{{ fetchRow()
-
-    /**
-     * Fetch a row and insert the data into an existing array.
-     *
-     * @param int       $fetchmode  how the array data should be indexed
-     * @param int    $rownum    number of the row where the data can be found
-     * @return int data array on success, a MDB2 error on failure
-     * @access public
-     */
-    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
-    {
-        if (null !== $rownum) {
-            $seek = $this->seek($rownum);
-            if (PEAR::isError($seek)) {
-                return $seek;
-            }
-        }
-        if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
-            $fetchmode = $this->db->fetchmode;
-        }
-        if ($fetchmode & MDB2_FETCHMODE_ASSOC) {
-            $row = @sqlite_fetch_array($this->result, SQLITE_ASSOC);
-            if (is_array($row)
-                && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
-            ) {
-                $row = array_change_key_case($row, $this->db->options['field_case']);
-            }
-        } else {
-           $row = @sqlite_fetch_array($this->result, SQLITE_NUM);
-        }
-        if (!$row) {
-            if (false === $this->result) {
-                $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-                return $err;
-            }
-            return null;
-        }
-        $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
-        $rtrim = false;
-        if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) {
-            if (empty($this->types)) {
-                $mode += MDB2_PORTABILITY_RTRIM;
-            } else {
-                $rtrim = true;
-            }
-        }
-        if ($mode) {
-            $this->db->_fixResultArrayValues($row, $mode);
-        }
-        if (!empty($this->types)) {
-            $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim);
-        }
-        if (!empty($this->values)) {
-            $this->_assignBindColumns($row);
-        }
-        if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
-            $object_class = $this->db->options['fetch_class'];
-            if ($object_class == 'stdClass') {
-                $row = (object) $row;
-            } else {
-                $rowObj = new $object_class($row);
-                $row = $rowObj;
-            }
-        }
-        ++$this->rownum;
-        return $row;
-    }
-
-    // }}}
-    // {{{ _getColumnNames()
-
-    /**
-     * Retrieve the names of columns returned by the DBMS in a query result.
-     *
-     * @return  mixed   Array variable that holds the names of columns as keys
-     *                  or an MDB2 error on failure.
-     *                  Some DBMS may not return any columns when the result set
-     *                  does not contain any rows.
-     * @access private
-     */
-    function _getColumnNames()
-    {
-        $columns = array();
-        $numcols = $this->numCols();
-        if (PEAR::isError($numcols)) {
-            return $numcols;
-        }
-        for ($column = 0; $column < $numcols; $column++) {
-            $column_name = @sqlite_field_name($this->result, $column);
-            $columns[$column_name] = $column;
-        }
-        if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
-            $columns = array_change_key_case($columns, $this->db->options['field_case']);
-        }
-        return $columns;
-    }
-
-    // }}}
-    // {{{ numCols()
-
-    /**
-     * Count the number of columns returned by the DBMS in a query result.
-     *
-     * @access public
-     * @return mixed integer value with the number of columns, a MDB2 error
-     *                       on failure
-     */
-    function numCols()
-    {
-        $cols = @sqlite_num_fields($this->result);
-        if (null === $cols) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            }
-            if (null === $this->result) {
-                return count($this->types);
-            }
-            return $this->db->raiseError(null, null, null,
-                'Could not get column count', __FUNCTION__);
-        }
-        return $cols;
-    }
-}
-
-/**
- * MDB2 SQLite buffered result driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_BufferedResult_sqlite extends MDB2_Result_sqlite
-{
-    // {{{ seek()
-
-    /**
-     * Seek to a specific row in a result set
-     *
-     * @param int    $rownum    number of the row where the data can be found
-     * @return mixed MDB2_OK on success, a MDB2 error on failure
-     * @access public
-     */
-    function seek($rownum = 0)
-    {
-        if (!@sqlite_seek($this->result, $rownum)) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            }
-            if (null === $this->result) {
-                return MDB2_OK;
-            }
-            return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
-                'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__);
-        }
-        $this->rownum = $rownum - 1;
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ valid()
-
-    /**
-     * Check if the end of the result set has been reached
-     *
-     * @return mixed true or false on sucess, a MDB2 error on failure
-     * @access public
-     */
-    function valid()
-    {
-        $numrows = $this->numRows();
-        if (PEAR::isError($numrows)) {
-            return $numrows;
-        }
-        return $this->rownum < ($numrows - 1);
-    }
-
-    // }}}
-    // {{{ numRows()
-
-    /**
-     * Returns the number of rows in a result object
-     *
-     * @return mixed MDB2 Error Object or the number of rows
-     * @access public
-     */
-    function numRows()
-    {
-        $rows = @sqlite_num_rows($this->result);
-        if (null === $rows) {
-            if (false === $this->result) {
-                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                    'resultset has already been freed', __FUNCTION__);
-            }
-            if (null === $this->result) {
-                return 0;
-            }
-            return $this->db->raiseError(null, null, null,
-                'Could not get row count', __FUNCTION__);
-        }
-        return $rows;
-    }
-}
-
-/**
- * MDB2 SQLite statement driver
- *
- * @package MDB2
- * @category Database
- * @author  Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Statement_sqlite extends MDB2_Statement_Common
-{
-
-}
-?>
\ No newline at end of file
+<?php
+// vim: set et ts=4 sw=4 fdm=marker:
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+/**
+ * MDB2 SQLite driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Driver_sqlite extends MDB2_Driver_Common
+{
+    // {{{ properties
+    var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => false);
+
+    var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"');
+
+    var $_lasterror = '';
+
+    var $fix_assoc_fields_names = false;
+
+    // }}}
+    // {{{ constructor
+
+    /**
+     * Constructor
+     */
+    function __construct()
+    {
+        parent::__construct();
+
+        $this->phptype = 'sqlite';
+        $this->dbsyntax = 'sqlite';
+
+        $this->supported['sequences'] = 'emulated';
+        $this->supported['indexes'] = true;
+        $this->supported['affected_rows'] = true;
+        $this->supported['summary_functions'] = true;
+        $this->supported['order_by_text'] = true;
+        $this->supported['current_id'] = 'emulated';
+        $this->supported['limit_queries'] = true;
+        $this->supported['LOBs'] = true;
+        $this->supported['replace'] = true;
+        $this->supported['transactions'] = true;
+        $this->supported['savepoints'] = false;
+        $this->supported['sub_selects'] = true;
+        $this->supported['triggers'] = true;
+        $this->supported['auto_increment'] = true;
+        $this->supported['primary_key'] = false; // requires alter table implementation
+        $this->supported['result_introspection'] = false; // not implemented
+        $this->supported['prepared_statements'] = 'emulated';
+        $this->supported['identifier_quoting'] = true;
+        $this->supported['pattern_escaping'] = false;
+        $this->supported['new_link'] = false;
+
+        $this->options['DBA_username'] = false;
+        $this->options['DBA_password'] = false;
+        $this->options['base_transaction_name'] = '___php_MDB2_sqlite_auto_commit_off';
+        $this->options['fixed_float'] = 0;
+        $this->options['database_path'] = '';
+        $this->options['database_extension'] = '';
+        $this->options['server_version'] = '';
+        $this->options['max_identifiers_length'] = 128; //no real limit
+    }
+
+    // }}}
+    // {{{ errorInfo()
+
+    /**
+     * This method is used to collect information about an error
+     *
+     * @param integer $error
+     * @return array
+     * @access public
+     */
+    function errorInfo($error = null)
+    {
+        $native_code = null;
+        if ($this->connection) {
+            $native_code = @sqlite_last_error($this->connection);
+        }
+        $native_msg = $this->_lasterror
+            ? html_entity_decode($this->_lasterror) : @sqlite_error_string($native_code);
+
+        // PHP 5.2+ prepends the function name to $php_errormsg, so we need
+        // this hack to work around it, per bug #9599.
+        $native_msg = preg_replace('/^sqlite[a-z_]+\(\)[^:]*: /', '', $native_msg);
+
+        if (null === $error) {
+            static $error_regexps;
+            if (empty($error_regexps)) {
+                $error_regexps = array(
+                    '/^no such table:/' => MDB2_ERROR_NOSUCHTABLE,
+                    '/^no such index:/' => MDB2_ERROR_NOT_FOUND,
+                    '/^(table|index) .* already exists$/' => MDB2_ERROR_ALREADY_EXISTS,
+                    '/PRIMARY KEY must be unique/i' => MDB2_ERROR_CONSTRAINT,
+                    '/is not unique/' => MDB2_ERROR_CONSTRAINT,
+                    '/columns .* are not unique/i' => MDB2_ERROR_CONSTRAINT,
+                    '/uniqueness constraint failed/' => MDB2_ERROR_CONSTRAINT,
+                    '/violates .*constraint/' => MDB2_ERROR_CONSTRAINT,
+                    '/may not be NULL/' => MDB2_ERROR_CONSTRAINT_NOT_NULL,
+                    '/^no such column:/' => MDB2_ERROR_NOSUCHFIELD,
+                    '/no column named/' => MDB2_ERROR_NOSUCHFIELD,
+                    '/column not present in both tables/i' => MDB2_ERROR_NOSUCHFIELD,
+                    '/^near ".*": syntax error$/' => MDB2_ERROR_SYNTAX,
+                    '/[0-9]+ values for [0-9]+ columns/i' => MDB2_ERROR_VALUE_COUNT_ON_ROW,
+                 );
+            }
+            foreach ($error_regexps as $regexp => $code) {
+                if (preg_match($regexp, $native_msg)) {
+                    $error = $code;
+                    break;
+                }
+            }
+        }
+        return array($error, $native_code, $native_msg);
+    }
+
+    // }}}
+    // {{{ escape()
+
+    /**
+     * Quotes a string so it can be safely used in a query. It will quote
+     * the text so it can safely be used within a query.
+     *
+     * @param   string  the input string to quote
+     * @param   bool    escape wildcards
+     *
+     * @return  string  quoted string
+     *
+     * @access  public
+     */
+    function escape($text, $escape_wildcards = false)
+    {
+        $text = @sqlite_escape_string($text);
+        return $text;
+    }
+
+    // }}}
+    // {{{ beginTransaction()
+
+    /**
+     * Start a transaction or set a savepoint.
+     *
+     * @param   string  name of a savepoint to set
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function beginTransaction($savepoint = null)
+    {
+        $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (null !== $savepoint) {
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'savepoints are not supported', __FUNCTION__);
+        }
+        if ($this->in_transaction) {
+            return MDB2_OK;  //nothing to do
+        }
+        if (!$this->destructor_registered && $this->opened_persistent) {
+            $this->destructor_registered = true;
+            register_shutdown_function('MDB2_closeOpenTransactions');
+        }
+        $query = 'BEGIN TRANSACTION '.$this->options['base_transaction_name'];
+        $result = $this->_doQuery($query, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = true;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ commit()
+
+    /**
+     * Commit the database changes done during a transaction that is in
+     * progress or release a savepoint. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after committing the pending changes.
+     *
+     * @param   string  name of a savepoint to release
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function commit($savepoint = null)
+    {
+        $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (!$this->in_transaction) {
+            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
+        }
+        if (null !== $savepoint) {
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'savepoints are not supported', __FUNCTION__);
+        }
+
+        $query = 'COMMIT TRANSACTION '.$this->options['base_transaction_name'];
+        $result = $this->_doQuery($query, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{
+
+    /**
+     * Cancel any database changes done during a transaction or since a specific
+     * savepoint that is in progress. This function may only be called when
+     * auto-committing is disabled, otherwise it will fail. Therefore, a new
+     * transaction is implicitly started after canceling the pending changes.
+     *
+     * @param   string  name of a savepoint to rollback to
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     */
+    function rollback($savepoint = null)
+    {
+        $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
+        if (!$this->in_transaction) {
+            return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                'rollback cannot be done changes are auto committed', __FUNCTION__);
+        }
+        if (null !== $savepoint) {
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'savepoints are not supported', __FUNCTION__);
+        }
+
+        $query = 'ROLLBACK TRANSACTION '.$this->options['base_transaction_name'];
+        $result = $this->_doQuery($query, true);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->in_transaction = false;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ function setTransactionIsolation()
+
+    /**
+     * Set the transacton isolation level.
+     *
+     * @param   string  standard isolation level
+     *                  READ UNCOMMITTED (allows dirty reads)
+     *                  READ COMMITTED (prevents dirty reads)
+     *                  REPEATABLE READ (prevents nonrepeatable reads)
+     *                  SERIALIZABLE (prevents phantom reads)
+     * @param   array some transaction options:
+     *                  'wait' => 'WAIT' | 'NO WAIT'
+     *                  'rw'   => 'READ WRITE' | 'READ ONLY'
+     *
+     * @return  mixed   MDB2_OK on success, a MDB2 error on failure
+     *
+     * @access  public
+     * @since   2.1.1
+     */
+    function setTransactionIsolation($isolation, $options = array())
+    {
+        $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
+        switch ($isolation) {
+        case 'READ UNCOMMITTED':
+            $isolation = 0;
+            break;
+        case 'READ COMMITTED':
+        case 'REPEATABLE READ':
+        case 'SERIALIZABLE':
+            $isolation = 1;
+            break;
+        default:
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'isolation level is not supported: '.$isolation, __FUNCTION__);
+        }
+
+        $query = "PRAGMA read_uncommitted=$isolation";
+        return $this->_doQuery($query, true);
+    }
+
+    // }}}
+    // {{{ getDatabaseFile()
+
+    /**
+     * Builds the string with path+dbname+extension
+     *
+     * @return string full database path+file
+     * @access protected
+     */
+    function _getDatabaseFile($database_name)
+    {
+        if ($database_name === '' || $database_name === ':memory:') {
+            return $database_name;
+        }
+        return $this->options['database_path'].$database_name.$this->options['database_extension'];
+    }
+
+    // }}}
+    // {{{ connect()
+
+    /**
+     * Connect to the database
+     *
+     * @return true on success, MDB2 Error Object on failure
+     **/
+    function connect()
+    {
+        $database_file = $this->_getDatabaseFile($this->database_name);
+        if (is_resource($this->connection)) {
+            //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
+            if (MDB2::areEquals($this->connected_dsn, $this->dsn)
+                && $this->connected_database_name == $database_file
+                && $this->opened_persistent == $this->options['persistent']
+            ) {
+                return MDB2_OK;
+            }
+            $this->disconnect(false);
+        }
+
+        if (!PEAR::loadExtension($this->phptype)) {
+            return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__);
+        }
+
+        if (empty($this->database_name)) {
+            return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
+            'unable to establish a connection', __FUNCTION__);
+        }
+
+        if ($database_file !== ':memory:') {
+            if (!file_exists($database_file)) {
+                if (!touch($database_file)) {
+                    return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        'Could not create database file', __FUNCTION__);
+                }
+                if (!isset($this->dsn['mode'])
+                    || !is_numeric($this->dsn['mode'])
+                ) {
+                    $mode = 0644;
+                } else {
+                    $mode = octdec($this->dsn['mode']);
+                }
+                if (!chmod($database_file, $mode)) {
+                    return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        'Could not be chmodded database file', __FUNCTION__);
+                }
+                if (!file_exists($database_file)) {
+                    return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
+                        'Could not be found database file', __FUNCTION__);
+                }
+            }
+            if (!is_file($database_file)) {
+                return $this->raiseError(MDB2_ERROR_INVALID, null, null,
+                        'Database is a directory name', __FUNCTION__);
+            }
+            if (!is_readable($database_file)) {
+                return $this->raiseError(MDB2_ERROR_ACCESS_VIOLATION, null, null,
+                        'Could not read database file', __FUNCTION__);
+            }
+        }
+
+        $connect_function = ($this->options['persistent'] ? 'sqlite_popen' : 'sqlite_open');
+        $php_errormsg = '';
+        if (version_compare('5.1.0', PHP_VERSION, '>')) {
+            @ini_set('track_errors', true);
+            $connection = @$connect_function($database_file);
+            @ini_restore('track_errors');
+        } else {
+            $connection = @$connect_function($database_file, 0666, $php_errormsg);
+        }
+        $this->_lasterror = $php_errormsg;
+        if (!$connection) {
+            return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null,
+            'unable to establish a connection', __FUNCTION__);
+        }
+
+        if ($this->fix_assoc_fields_names ||
+            $this->options['portability'] & MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES)
+        {
+            @sqlite_query("PRAGMA short_column_names = 1", $connection);
+            $this->fix_assoc_fields_names = true;
+        }
+
+        $this->connection = $connection;
+        $this->connected_dsn = $this->dsn;
+        $this->connected_database_name = $database_file;
+        $this->opened_persistent = $this->getoption('persistent');
+        $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype;
+
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ databaseExists()
+
+    /**
+     * check if given database name is exists?
+     *
+     * @param string $name    name of the database that should be checked
+     *
+     * @return mixed true/false on success, a MDB2 error on failure
+     * @access public
+     */
+    function databaseExists($name)
+    {
+        $database_file = $this->_getDatabaseFile($name);
+        $result = file_exists($database_file);
+        return $result;
+    }
+
+    // }}}
+    // {{{ disconnect()
+
+    /**
+     * Log out and disconnect from the database.
+     *
+     * @param  boolean $force if the disconnect should be forced even if the
+     *                        connection is opened persistently
+     * @return mixed true on success, false if not connected and error
+     *                object on error
+     * @access public
+     */
+    function disconnect($force = true)
+    {
+        if (is_resource($this->connection)) {
+            if ($this->in_transaction) {
+                $dsn = $this->dsn;
+                $database_name = $this->database_name;
+                $persistent = $this->options['persistent'];
+                $this->dsn = $this->connected_dsn;
+                $this->database_name = $this->connected_database_name;
+                $this->options['persistent'] = $this->opened_persistent;
+                $this->rollback();
+                $this->dsn = $dsn;
+                $this->database_name = $database_name;
+                $this->options['persistent'] = $persistent;
+            }
+
+            if (!$this->opened_persistent || $force) {
+                @sqlite_close($this->connection);
+            }
+        } else {
+            return false;
+        }
+        return parent::disconnect($force);
+    }
+
+    // }}}
+    // {{{ _doQuery()
+
+    /**
+     * Execute a query
+     * @param string $query  query
+     * @param boolean $is_manip  if the query is a manipulation query
+     * @param resource $connection
+     * @param string $database_name
+     * @return result or error object
+     * @access protected
+     */
+    function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
+    {
+        $this->last_query = $query;
+        $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
+        if ($result) {
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+            $query = $result;
+        }
+        if ($this->options['disable_query']) {
+            $result = $is_manip ? 0 : null;
+            return $result;
+        }
+
+        if (null === $connection) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+
+        $function = $this->options['result_buffering']
+            ? 'sqlite_query' : 'sqlite_unbuffered_query';
+        $php_errormsg = '';
+        if (version_compare('5.1.0', PHP_VERSION, '>')) {
+            @ini_set('track_errors', true);
+            do {
+                $result = @$function($query.';', $connection);
+            } while (sqlite_last_error($connection) == SQLITE_SCHEMA);
+            @ini_restore('track_errors');
+        } else {
+            do {
+                $result = @$function($query.';', $connection, SQLITE_BOTH, $php_errormsg);
+            } while (sqlite_last_error($connection) == SQLITE_SCHEMA);
+        }
+        $this->_lasterror = $php_errormsg;
+
+        if (!$result) {
+            $code = null;
+            if (0 === strpos($this->_lasterror, 'no such table')) {
+                $code = MDB2_ERROR_NOSUCHTABLE;
+            }
+            $err = $this->raiseError($code, null, null,
+                'Could not execute statement', __FUNCTION__);
+            return $err;
+        }
+
+        $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result));
+        return $result;
+    }
+
+    // }}}
+    // {{{ _affectedRows()
+
+    /**
+     * Returns the number of rows affected
+     *
+     * @param resource $result
+     * @param resource $connection
+     * @return mixed MDB2 Error Object or the number of rows affected
+     * @access private
+     */
+    function _affectedRows($connection, $result = null)
+    {
+        if (null === $connection) {
+            $connection = $this->getConnection();
+            if (PEAR::isError($connection)) {
+                return $connection;
+            }
+        }
+        return @sqlite_changes($connection);
+    }
+
+    // }}}
+    // {{{ _modifyQuery()
+
+    /**
+     * Changes a query string for various DBMS specific reasons
+     *
+     * @param string $query  query to modify
+     * @param boolean $is_manip  if it is a DML query
+     * @param integer $limit  limit the number of rows
+     * @param integer $offset  start reading from given offset
+     * @return string modified query
+     * @access protected
+     */
+    function _modifyQuery($query, $is_manip, $limit, $offset)
+    {
+        if ($this->options['portability'] & MDB2_PORTABILITY_DELETE_COUNT) {
+            if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
+                $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
+                                      'DELETE FROM \1 WHERE 1=1', $query);
+            }
+        }
+        if ($limit > 0
+            && !preg_match('/LIMIT\s*\d(?:\s*(?:,|OFFSET)\s*\d+)?(?:[^\)]*)?$/i', $query)
+        ) {
+            $query = rtrim($query);
+            if (substr($query, -1) == ';') {
+                $query = substr($query, 0, -1);
+            }
+            if ($is_manip) {
+                $query.= " LIMIT $limit";
+            } else {
+                $query.= " LIMIT $offset,$limit";
+            }
+        }
+        return $query;
+    }
+
+    // }}}
+    // {{{ getServerVersion()
+
+    /**
+     * return version information about the server
+     *
+     * @param bool   $native  determines if the raw version string should be returned
+     * @return mixed array/string with version information or MDB2 error object
+     * @access public
+     */
+    function getServerVersion($native = false)
+    {
+        $server_info = false;
+        if ($this->connected_server_info) {
+            $server_info = $this->connected_server_info;
+        } elseif ($this->options['server_version']) {
+            $server_info = $this->options['server_version'];
+        } elseif (function_exists('sqlite_libversion')) {
+            $server_info = @sqlite_libversion();
+        }
+        if (!$server_info) {
+            return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
+                'Requires either the "server_version" option or the sqlite_libversion() function', __FUNCTION__);
+        }
+        // cache server_info
+        $this->connected_server_info = $server_info;
+        if (!$native) {
+            $tmp = explode('.', $server_info, 3);
+            $server_info = array(
+                'major' => isset($tmp[0]) ? $tmp[0] : null,
+                'minor' => isset($tmp[1]) ? $tmp[1] : null,
+                'patch' => isset($tmp[2]) ? $tmp[2] : null,
+                'extra' => null,
+                'native' => $server_info,
+            );
+        }
+        return $server_info;
+    }
+
+    // }}}
+    // {{{ replace()
+
+    /**
+     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
+     * query, except that if there is already a row in the table with the same
+     * key field values, the old row is deleted before the new row is inserted.
+     *
+     * The REPLACE type of query does not make part of the SQL standards. Since
+     * practically only SQLite implements it natively, this type of query is
+     * emulated through this method for other DBMS using standard types of
+     * queries inside a transaction to assure the atomicity of the operation.
+     *
+     * @access public
+     *
+     * @param string $table name of the table on which the REPLACE query will
+     *  be executed.
+     * @param array $fields associative array that describes the fields and the
+     *  values that will be inserted or updated in the specified table. The
+     *  indexes of the array are the names of all the fields of the table. The
+     *  values of the array are also associative arrays that describe the
+     *  values and other properties of the table fields.
+     *
+     *  Here follows a list of field properties that need to be specified:
+     *
+     *    value:
+     *          Value to be assigned to the specified field. This value may be
+     *          of specified in database independent type format as this
+     *          function can perform the necessary datatype conversions.
+     *
+     *    Default:
+     *          this property is required unless the Null property
+     *          is set to 1.
+     *
+     *    type
+     *          Name of the type of the field. Currently, all types Metabase
+     *          are supported except for clob and blob.
+     *
+     *    Default: no type conversion
+     *
+     *    null
+     *          Boolean property that indicates that the value for this field
+     *          should be set to null.
+     *
+     *          The default value for fields missing in INSERT queries may be
+     *          specified the definition of a table. Often, the default value
+     *          is already null, but since the REPLACE may be emulated using
+     *          an UPDATE query, make sure that all fields of the table are
+     *          listed in this function argument array.
+     *
+     *    Default: 0
+     *
+     *    key
+     *          Boolean property that indicates that this field should be
+     *          handled as a primary key or at least as part of the compound
+     *          unique index of the table that will determine the row that will
+     *          updated if it exists or inserted a new row otherwise.
+     *
+     *          This function will fail if no key field is specified or if the
+     *          value of a key field is set to null because fields that are
+     *          part of unique index they may not be null.
+     *
+     *    Default: 0
+     *
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     */
+    function replace($table, $fields)
+    {
+        $count = count($fields);
+        $query = $values = '';
+        $keys = $colnum = 0;
+        for (reset($fields); $colnum < $count; next($fields), $colnum++) {
+            $name = key($fields);
+            if ($colnum > 0) {
+                $query .= ',';
+                $values.= ',';
+            }
+            $query.= $this->quoteIdentifier($name, true);
+            if (isset($fields[$name]['null']) && $fields[$name]['null']) {
+                $value = 'NULL';
+            } else {
+                $type = isset($fields[$name]['type']) ? $fields[$name]['type'] : null;
+                $value = $this->quote($fields[$name]['value'], $type);
+                if (PEAR::isError($value)) {
+                    return $value;
+                }
+            }
+            $values.= $value;
+            if (isset($fields[$name]['key']) && $fields[$name]['key']) {
+                if ($value === 'NULL') {
+                    return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
+                        'key value '.$name.' may not be NULL', __FUNCTION__);
+                }
+                $keys++;
+            }
+        }
+        if ($keys == 0) {
+            return $this->raiseError(MDB2_ERROR_CANNOT_REPLACE, null, null,
+                'not specified which fields are keys', __FUNCTION__);
+        }
+
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+
+        $table = $this->quoteIdentifier($table, true);
+        $query = "REPLACE INTO $table ($query) VALUES ($values)";
+        $result = $this->_doQuery($query, true, $connection);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return $this->_affectedRows($connection, $result);
+    }
+
+    // }}}
+    // {{{ nextID()
+
+    /**
+     * Returns the next free id of a sequence
+     *
+     * @param string $seq_name name of the sequence
+     * @param boolean $ondemand when true the sequence is
+     *                          automatic created, if it
+     *                          not exists
+     *
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function nextID($seq_name, $ondemand = true)
+    {
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
+        $seqcol_name = $this->options['seqcol_name'];
+        $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)";
+        $this->pushErrorHandling(PEAR_ERROR_RETURN);
+        $this->expectError(MDB2_ERROR_NOSUCHTABLE);
+        $result = $this->_doQuery($query, true);
+        $this->popExpect();
+        $this->popErrorHandling();
+        if (PEAR::isError($result)) {
+            if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) {
+                $this->loadModule('Manager', null, true);
+                $result = $this->manager->createSequence($seq_name);
+                if (PEAR::isError($result)) {
+                    return $this->raiseError($result, null, null,
+                        'on demand sequence '.$seq_name.' could not be created', __FUNCTION__);
+                } else {
+                    return $this->nextID($seq_name, false);
+                }
+            }
+            return $result;
+        }
+        $value = $this->lastInsertID();
+        if (is_numeric($value)) {
+            $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value";
+            $result = $this->_doQuery($query, true);
+            if (PEAR::isError($result)) {
+                $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name;
+            }
+        }
+        return $value;
+    }
+
+    // }}}
+    // {{{ lastInsertID()
+
+    /**
+     * Returns the autoincrement ID if supported or $id or fetches the current
+     * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field)
+     *
+     * @param string $table name of the table into which a new row was inserted
+     * @param string $field name of the field into which a new row was inserted
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function lastInsertID($table = null, $field = null)
+    {
+        $connection = $this->getConnection();
+        if (PEAR::isError($connection)) {
+            return $connection;
+        }
+        $value = @sqlite_last_insert_rowid($connection);
+        if (!$value) {
+            return $this->raiseError(null, null, null,
+                'Could not get last insert ID', __FUNCTION__);
+        }
+        return $value;
+    }
+
+    // }}}
+    // {{{ currID()
+
+    /**
+     * Returns the current id of a sequence
+     *
+     * @param string $seq_name name of the sequence
+     * @return mixed MDB2 Error Object or id
+     * @access public
+     */
+    function currID($seq_name)
+    {
+        $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true);
+        $seqcol_name = $this->quoteIdentifier($this->options['seqcol_name'], true);
+        $query = "SELECT MAX($seqcol_name) FROM $sequence_name";
+        return $this->queryOne($query, 'integer');
+    }
+}
+
+/**
+ * MDB2 SQLite result driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Result_sqlite extends MDB2_Result_Common
+{
+    // }}}
+    // {{{ fetchRow()
+
+    /**
+     * Fetch a row and insert the data into an existing array.
+     *
+     * @param int       $fetchmode  how the array data should be indexed
+     * @param int    $rownum    number of the row where the data can be found
+     * @return int data array on success, a MDB2 error on failure
+     * @access public
+     */
+    function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
+    {
+        if (null !== $rownum) {
+            $seek = $this->seek($rownum);
+            if (PEAR::isError($seek)) {
+                return $seek;
+            }
+        }
+        if ($fetchmode == MDB2_FETCHMODE_DEFAULT) {
+            $fetchmode = $this->db->fetchmode;
+        }
+        if (   $fetchmode == MDB2_FETCHMODE_ASSOC
+            || $fetchmode == MDB2_FETCHMODE_OBJECT
+        ) {
+            $row = @sqlite_fetch_array($this->result, SQLITE_ASSOC);
+            if (is_array($row)
+                && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE
+            ) {
+                $row = array_change_key_case($row, $this->db->options['field_case']);
+            }
+        } else {
+           $row = @sqlite_fetch_array($this->result, SQLITE_NUM);
+        }
+        if (!$row) {
+            if (false === $this->result) {
+                $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+                return $err;
+            }
+            return null;
+        }
+        $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
+        $rtrim = false;
+        if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) {
+            if (empty($this->types)) {
+                $mode += MDB2_PORTABILITY_RTRIM;
+            } else {
+                $rtrim = true;
+            }
+        }
+        if ($mode) {
+            $this->db->_fixResultArrayValues($row, $mode);
+        }
+        if (   (   $fetchmode != MDB2_FETCHMODE_ASSOC
+                && $fetchmode != MDB2_FETCHMODE_OBJECT)
+            && !empty($this->types)
+        ) {
+            $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim);
+        } elseif (($fetchmode == MDB2_FETCHMODE_ASSOC
+                || $fetchmode == MDB2_FETCHMODE_OBJECT)
+            && !empty($this->types_assoc)
+        ) {
+            $row = $this->db->datatype->convertResultRow($this->types_assoc, $row, $rtrim);
+        }
+        if (!empty($this->values)) {
+            $this->_assignBindColumns($row);
+        }
+        if ($fetchmode === MDB2_FETCHMODE_OBJECT) {
+            $object_class = $this->db->options['fetch_class'];
+            if ($object_class == 'stdClass') {
+                $row = (object) $row;
+            } else {
+                $rowObj = new $object_class($row);
+                $row = $rowObj;
+            }
+        }
+        ++$this->rownum;
+        return $row;
+    }
+
+    // }}}
+    // {{{ _getColumnNames()
+
+    /**
+     * Retrieve the names of columns returned by the DBMS in a query result.
+     *
+     * @return  mixed   Array variable that holds the names of columns as keys
+     *                  or an MDB2 error on failure.
+     *                  Some DBMS may not return any columns when the result set
+     *                  does not contain any rows.
+     * @access private
+     */
+    function _getColumnNames()
+    {
+        $columns = array();
+        $numcols = $this->numCols();
+        if (PEAR::isError($numcols)) {
+            return $numcols;
+        }
+        for ($column = 0; $column < $numcols; $column++) {
+            $column_name = @sqlite_field_name($this->result, $column);
+            $columns[$column_name] = $column;
+        }
+        if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
+            $columns = array_change_key_case($columns, $this->db->options['field_case']);
+        }
+        return $columns;
+    }
+
+    // }}}
+    // {{{ numCols()
+
+    /**
+     * Count the number of columns returned by the DBMS in a query result.
+     *
+     * @access public
+     * @return mixed integer value with the number of columns, a MDB2 error
+     *                       on failure
+     */
+    function numCols()
+    {
+        $cols = @sqlite_num_fields($this->result);
+        if (null === $cols) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            }
+            if (null === $this->result) {
+                return count($this->types);
+            }
+            return $this->db->raiseError(null, null, null,
+                'Could not get column count', __FUNCTION__);
+        }
+        return $cols;
+    }
+}
+
+/**
+ * MDB2 SQLite buffered result driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_BufferedResult_sqlite extends MDB2_Result_sqlite
+{
+    // {{{ seek()
+
+    /**
+     * Seek to a specific row in a result set
+     *
+     * @param int    $rownum    number of the row where the data can be found
+     * @return mixed MDB2_OK on success, a MDB2 error on failure
+     * @access public
+     */
+    function seek($rownum = 0)
+    {
+        if (!@sqlite_seek($this->result, $rownum)) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            }
+            if (null === $this->result) {
+                return MDB2_OK;
+            }
+            return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
+                'tried to seek to an invalid row number ('.$rownum.')', __FUNCTION__);
+        }
+        $this->rownum = $rownum - 1;
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ valid()
+
+    /**
+     * Check if the end of the result set has been reached
+     *
+     * @return mixed true or false on sucess, a MDB2 error on failure
+     * @access public
+     */
+    function valid()
+    {
+        $numrows = $this->numRows();
+        if (PEAR::isError($numrows)) {
+            return $numrows;
+        }
+        return $this->rownum < ($numrows - 1);
+    }
+
+    // }}}
+    // {{{ numRows()
+
+    /**
+     * Returns the number of rows in a result object
+     *
+     * @return mixed MDB2 Error Object or the number of rows
+     * @access public
+     */
+    function numRows()
+    {
+        $rows = @sqlite_num_rows($this->result);
+        if (null === $rows) {
+            if (false === $this->result) {
+                return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                    'resultset has already been freed', __FUNCTION__);
+            }
+            if (null === $this->result) {
+                return 0;
+            }
+            return $this->db->raiseError(null, null, null,
+                'Could not get row count', __FUNCTION__);
+        }
+        return $rows;
+    }
+}
+
+/**
+ * MDB2 SQLite statement driver
+ *
+ * @package MDB2
+ * @category Database
+ * @author  Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Statement_sqlite extends MDB2_Statement_Common
+{
+
+}
+?>
diff --git a/3rdparty/MDB2/Extended.php b/3rdparty/MDB2/Extended.php
index fed82f965981bbf86c05013a4c205d67c26e9acb..5b0a5be34a02e36c5131849701b0ce12e65becd2 100644
--- a/3rdparty/MDB2/Extended.php
+++ b/3rdparty/MDB2/Extended.php
@@ -1,720 +1,723 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Extended.php 302784 2010-08-25 23:29:16Z quipo $
-
-/**
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-
-/**
- * Used by autoPrepare()
- */
-define('MDB2_AUTOQUERY_INSERT', 1);
-define('MDB2_AUTOQUERY_UPDATE', 2);
-define('MDB2_AUTOQUERY_DELETE', 3);
-define('MDB2_AUTOQUERY_SELECT', 4);
-
-/**
- * MDB2_Extended: class which adds several high level methods to MDB2
- *
- * @package MDB2
- * @category Database
- * @author Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Extended extends MDB2_Module_Common
-{
-    // {{{ autoPrepare()
-
-    /**
-     * Generate an insert, update or delete query and call prepare() on it
-     *
-     * @param string table
-     * @param array the fields names
-     * @param int type of query to build
-     *                          MDB2_AUTOQUERY_INSERT
-     *                          MDB2_AUTOQUERY_UPDATE
-     *                          MDB2_AUTOQUERY_DELETE
-     *                          MDB2_AUTOQUERY_SELECT
-     * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement)
-     * @param array that contains the types of the placeholders
-     * @param mixed array that contains the types of the columns in
-     *                        the result set or MDB2_PREPARE_RESULT, if set to
-     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
-     *
-     * @return resource handle for the query
-     * @see buildManipSQL
-     * @access public
-     */
-    function autoPrepare($table, $table_fields, $mode = MDB2_AUTOQUERY_INSERT,
-        $where = false, $types = null, $result_types = MDB2_PREPARE_MANIP)
-    {
-        $query = $this->buildManipSQL($table, $table_fields, $mode, $where);
-        if (PEAR::isError($query)) {
-            return $query;
-        }
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-        $lobs = array();
-        foreach ((array)$types as $param => $type) {
-            if (($type == 'clob') || ($type == 'blob')) {
-                $lobs[$param] = $table_fields[$param];
-            }
-        }
-        return $db->prepare($query, $types, $result_types, $lobs);
-    }
-
-    // }}}
-    // {{{ autoExecute()
-
-    /**
-     * Generate an insert, update or delete query and call prepare() and execute() on it
-     *
-     * @param string name of the table
-     * @param array assoc ($key=>$value) where $key is a field name and $value its value
-     * @param int type of query to build
-     *                          MDB2_AUTOQUERY_INSERT
-     *                          MDB2_AUTOQUERY_UPDATE
-     *                          MDB2_AUTOQUERY_DELETE
-     *                          MDB2_AUTOQUERY_SELECT
-     * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement)
-     * @param array that contains the types of the placeholders
-     * @param string which specifies which result class to use
-     * @param mixed  array that contains the types of the columns in
-     *                        the result set or MDB2_PREPARE_RESULT, if set to
-     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
-     *
-     * @return bool|MDB2_Error true on success, a MDB2 error on failure
-     * @see buildManipSQL
-     * @see autoPrepare
-     * @access public
-    */
-    function autoExecute($table, $fields_values, $mode = MDB2_AUTOQUERY_INSERT,
-        $where = false, $types = null, $result_class = true, $result_types = MDB2_PREPARE_MANIP)
-    {
-        $fields_values = (array)$fields_values;
-        if ($mode == MDB2_AUTOQUERY_SELECT) {
-            if (is_array($result_types)) {
-                $keys = array_keys($result_types);
-            } elseif (!empty($fields_values)) {
-                $keys = $fields_values;
-            } else {
-                $keys = array();
-            }
-        } else {
-            $keys = array_keys($fields_values);
-        }
-        $params = array_values($fields_values);
-        if (empty($params)) {
-            $query = $this->buildManipSQL($table, $keys, $mode, $where);
-
-            $db = $this->getDBInstance();
-            if (PEAR::isError($db)) {
-                return $db;
-            }
-            if ($mode == MDB2_AUTOQUERY_SELECT) {
-                $result = $db->query($query, $result_types, $result_class);
-            } else {
-                $result = $db->exec($query);
-            }
-        } else {
-            $stmt = $this->autoPrepare($table, $keys, $mode, $where, $types, $result_types);
-            if (PEAR::isError($stmt)) {
-                return $stmt;
-            }
-            $result = $stmt->execute($params, $result_class);
-            $stmt->free();
-        }
-        return $result;
-    }
-
-    // }}}
-    // {{{ buildManipSQL()
-
-    /**
-     * Make automaticaly an sql query for prepare()
-     *
-     * Example : buildManipSQL('table_sql', array('field1', 'field2', 'field3'), MDB2_AUTOQUERY_INSERT)
-     *           will return the string : INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?)
-     * NB : - This belongs more to a SQL Builder class, but this is a simple facility
-     *      - Be carefull ! If you don't give a $where param with an UPDATE/DELETE query, all
-     *        the records of the table will be updated/deleted !
-     *
-     * @param string name of the table
-     * @param ordered array containing the fields names
-     * @param int type of query to build
-     *                          MDB2_AUTOQUERY_INSERT
-     *                          MDB2_AUTOQUERY_UPDATE
-     *                          MDB2_AUTOQUERY_DELETE
-     *                          MDB2_AUTOQUERY_SELECT
-     * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement)
-     *
-     * @return string sql query for prepare()
-     * @access public
-     */
-    function buildManipSQL($table, $table_fields, $mode, $where = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if ($db->options['quote_identifier']) {
-            $table = $db->quoteIdentifier($table);
-        }
-
-        if (!empty($table_fields) && $db->options['quote_identifier']) {
-            foreach ($table_fields as $key => $field) {
-                $table_fields[$key] = $db->quoteIdentifier($field);
-            }
-        }
-
-        if ((false !== $where) && (null !== $where)) {
-            if (is_array($where)) {
-                $where = implode(' AND ', $where);
-            }
-            $where = ' WHERE '.$where;
-        }
-
-        switch ($mode) {
-        case MDB2_AUTOQUERY_INSERT:
-            if (empty($table_fields)) {
-                return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                'Insert requires table fields', __FUNCTION__);
-            }
-            $cols = implode(', ', $table_fields);
-            $values = '?'.str_repeat(', ?', (count($table_fields) - 1));
-            return 'INSERT INTO '.$table.' ('.$cols.') VALUES ('.$values.')';
-            break;
-        case MDB2_AUTOQUERY_UPDATE:
-            if (empty($table_fields)) {
-                return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
-                'Update requires table fields', __FUNCTION__);
-            }
-            $set = implode(' = ?, ', $table_fields).' = ?';
-            $sql = 'UPDATE '.$table.' SET '.$set.$where;
-            return $sql;
-            break;
-        case MDB2_AUTOQUERY_DELETE:
-            $sql = 'DELETE FROM '.$table.$where;
-            return $sql;
-            break;
-        case MDB2_AUTOQUERY_SELECT:
-            $cols = !empty($table_fields) ? implode(', ', $table_fields) : '*';
-            $sql = 'SELECT '.$cols.' FROM '.$table.$where;
-            return $sql;
-            break;
-        }
-        return $db->raiseError(MDB2_ERROR_SYNTAX, null, null,
-                'Non existant mode', __FUNCTION__);
-    }
-
-    // }}}
-    // {{{ limitQuery()
-
-    /**
-     * Generates a limited query
-     *
-     * @param string query
-     * @param array that contains the types of the columns in the result set
-     * @param integer the numbers of rows to fetch
-     * @param integer the row to start to fetching
-     * @param string which specifies which result class to use
-     * @param mixed   string which specifies which class to wrap results in
-     *
-     * @return MDB2_Result|MDB2_Error result set on success, a MDB2 error on failure
-     * @access public
-     */
-    function limitQuery($query, $types, $limit, $offset = 0, $result_class = true,
-        $result_wrap_class = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        $result = $db->setLimit($limit, $offset);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-        return $db->query($query, $types, $result_class, $result_wrap_class);
-    }
-
-    // }}}
-    // {{{ execParam()
-
-    /**
-     * Execute a parameterized DML statement.
-     *
-     * @param string the SQL query
-     * @param array if supplied, prepare/execute will be used
-     *       with this array as execute parameters
-     * @param array that contains the types of the values defined in $params
-     *
-     * @return int|MDB2_Error affected rows on success, a MDB2 error on failure
-     * @access public
-     */
-    function execParam($query, $params = array(), $param_types = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        settype($params, 'array');
-        if (empty($params)) {
-            return $db->exec($query);
-        }
-
-        $stmt = $db->prepare($query, $param_types, MDB2_PREPARE_MANIP);
-        if (PEAR::isError($stmt)) {
-            return $stmt;
-        }
-
-        $result = $stmt->execute($params);
-        if (PEAR::isError($result)) {
-            return $result;
-        }
-
-        $stmt->free();
-        return $result;
-    }
-
-    // }}}
-    // {{{ getOne()
-
-    /**
-     * Fetch the first column of the first row of data returned from a query.
-     * Takes care of doing the query and freeing the results when finished.
-     *
-     * @param string the SQL query
-     * @param string that contains the type of the column in the result set
-     * @param array if supplied, prepare/execute will be used
-     *       with this array as execute parameters
-     * @param array that contains the types of the values defined in $params
-     * @param int|string which column to return
-     *
-     * @return scalar|MDB2_Error data on success, a MDB2 error on failure
-     * @access public
-     */
-    function getOne($query, $type = null, $params = array(),
-        $param_types = null, $colnum = 0)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        settype($params, 'array');
-        settype($type, 'array');
-        if (empty($params)) {
-            return $db->queryOne($query, $type, $colnum);
-        }
-
-        $stmt = $db->prepare($query, $param_types, $type);
-        if (PEAR::isError($stmt)) {
-            return $stmt;
-        }
-
-        $result = $stmt->execute($params);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $one = $result->fetchOne($colnum);
-        $stmt->free();
-        $result->free();
-        return $one;
-    }
-
-    // }}}
-    // {{{ getRow()
-
-    /**
-     * Fetch the first row of data returned from a query.  Takes care
-     * of doing the query and freeing the results when finished.
-     *
-     * @param string the SQL query
-     * @param array that contains the types of the columns in the result set
-     * @param array if supplied, prepare/execute will be used
-     *       with this array as execute parameters
-     * @param array that contains the types of the values defined in $params
-     * @param int the fetch mode to use
-     *
-     * @return array|MDB2_Error data on success, a MDB2 error on failure
-     * @access public
-     */
-    function getRow($query, $types = null, $params = array(),
-        $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        settype($params, 'array');
-        if (empty($params)) {
-            return $db->queryRow($query, $types, $fetchmode);
-        }
-
-        $stmt = $db->prepare($query, $param_types, $types);
-        if (PEAR::isError($stmt)) {
-            return $stmt;
-        }
-
-        $result = $stmt->execute($params);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $row = $result->fetchRow($fetchmode);
-        $stmt->free();
-        $result->free();
-        return $row;
-    }
-
-    // }}}
-    // {{{ getCol()
-
-    /**
-     * Fetch a single column from a result set and return it as an
-     * indexed array.
-     *
-     * @param string the SQL query
-     * @param string that contains the type of the column in the result set
-     * @param array if supplied, prepare/execute will be used
-     *       with this array as execute parameters
-     * @param array that contains the types of the values defined in $params
-     * @param int|string which column to return
-     *
-     * @return array|MDB2_Error data on success, a MDB2 error on failure
-     * @access public
-     */
-    function getCol($query, $type = null, $params = array(),
-        $param_types = null, $colnum = 0)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        settype($params, 'array');
-        settype($type, 'array');
-        if (empty($params)) {
-            return $db->queryCol($query, $type, $colnum);
-        }
-
-        $stmt = $db->prepare($query, $param_types, $type);
-        if (PEAR::isError($stmt)) {
-            return $stmt;
-        }
-
-        $result = $stmt->execute($params);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $col = $result->fetchCol($colnum);
-        $stmt->free();
-        $result->free();
-        return $col;
-    }
-
-    // }}}
-    // {{{ getAll()
-
-    /**
-     * Fetch all the rows returned from a query.
-     *
-     * @param string the SQL query
-     * @param array that contains the types of the columns in the result set
-     * @param array if supplied, prepare/execute will be used
-     *       with this array as execute parameters
-     * @param array that contains the types of the values defined in $params
-     * @param int the fetch mode to use
-     * @param bool if set to true, the $all will have the first
-     *       column as its first dimension
-     * @param bool $force_array used only when the query returns exactly
-     *       two columns. If true, the values of the returned array will be
-     *       one-element arrays instead of scalars.
-     * @param bool $group if true, the values of the returned array is
-     *       wrapped in another array.  If the same key value (in the first
-     *       column) repeats itself, the values will be appended to this array
-     *       instead of overwriting the existing values.
-     *
-     * @return array|MDB2_Error data on success, a MDB2 error on failure
-     * @access public
-     */
-    function getAll($query, $types = null, $params = array(),
-        $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT,
-        $rekey = false, $force_array = false, $group = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        settype($params, 'array');
-        if (empty($params)) {
-            return $db->queryAll($query, $types, $fetchmode, $rekey, $force_array, $group);
-        }
-
-        $stmt = $db->prepare($query, $param_types, $types);
-        if (PEAR::isError($stmt)) {
-            return $stmt;
-        }
-
-        $result = $stmt->execute($params);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $all = $result->fetchAll($fetchmode, $rekey, $force_array, $group);
-        $stmt->free();
-        $result->free();
-        return $all;
-    }
-
-    // }}}
-    // {{{ getAssoc()
-
-    /**
-     * Fetch the entire result set of a query and return it as an
-     * associative array using the first column as the key.
-     *
-     * If the result set contains more than two columns, the value
-     * will be an array of the values from column 2-n.  If the result
-     * set contains only two columns, the returned value will be a
-     * scalar with the value of the second column (unless forced to an
-     * array with the $force_array parameter).  A MDB2 error code is
-     * returned on errors.  If the result set contains fewer than two
-     * columns, a MDB2_ERROR_TRUNCATED error is returned.
-     *
-     * For example, if the table 'mytable' contains:
-     * <pre>
-     *   ID      TEXT       DATE
-     * --------------------------------
-     *   1       'one'      944679408
-     *   2       'two'      944679408
-     *   3       'three'    944679408
-     * </pre>
-     * Then the call getAssoc('SELECT id,text FROM mytable') returns:
-     * <pre>
-     *    array(
-     *      '1' => 'one',
-     *      '2' => 'two',
-     *      '3' => 'three',
-     *    )
-     * </pre>
-     * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns:
-     * <pre>
-     *    array(
-     *      '1' => array('one', '944679408'),
-     *      '2' => array('two', '944679408'),
-     *      '3' => array('three', '944679408')
-     *    )
-     * </pre>
-     *
-     * If the more than one row occurs with the same value in the
-     * first column, the last row overwrites all previous ones by
-     * default.  Use the $group parameter if you don't want to
-     * overwrite like this.  Example:
-     * <pre>
-     * getAssoc('SELECT category,id,name FROM mytable', null, null
-     *           MDB2_FETCHMODE_ASSOC, false, true) returns:
-     *    array(
-     *      '1' => array(array('id' => '4', 'name' => 'number four'),
-     *                   array('id' => '6', 'name' => 'number six')
-     *             ),
-     *      '9' => array(array('id' => '4', 'name' => 'number four'),
-     *                   array('id' => '6', 'name' => 'number six')
-     *             )
-     *    )
-     * </pre>
-     *
-     * Keep in mind that database functions in PHP usually return string
-     * values for results regardless of the database's internal type.
-     *
-     * @param string the SQL query
-     * @param array that contains the types of the columns in the result set
-     * @param array if supplied, prepare/execute will be used
-     *       with this array as execute parameters
-     * @param array that contains the types of the values defined in $params
-     * @param bool $force_array used only when the query returns
-     * exactly two columns.  If TRUE, the values of the returned array
-     * will be one-element arrays instead of scalars.
-     * @param bool $group if TRUE, the values of the returned array
-     *       is wrapped in another array.  If the same key value (in the first
-     *       column) repeats itself, the values will be appended to this array
-     *       instead of overwriting the existing values.
-     *
-     * @return array|MDB2_Error data on success, a MDB2 error on failure
-     * @access public
-     */
-    function getAssoc($query, $types = null, $params = array(), $param_types = null,
-        $fetchmode = MDB2_FETCHMODE_DEFAULT, $force_array = false, $group = false)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        settype($params, 'array');
-        if (empty($params)) {
-            return $db->queryAll($query, $types, $fetchmode, true, $force_array, $group);
-        }
-
-        $stmt = $db->prepare($query, $param_types, $types);
-        if (PEAR::isError($stmt)) {
-            return $stmt;
-        }
-
-        $result = $stmt->execute($params);
-        if (!MDB2::isResultCommon($result)) {
-            return $result;
-        }
-
-        $all = $result->fetchAll($fetchmode, true, $force_array, $group);
-        $stmt->free();
-        $result->free();
-        return $all;
-    }
-
-    // }}}
-    // {{{ executeMultiple()
-
-    /**
-     * This function does several execute() calls on the same statement handle.
-     * $params must be an array indexed numerically from 0, one execute call is
-     * done for every 'row' in the array.
-     *
-     * If an error occurs during execute(), executeMultiple() does not execute
-     * the unfinished rows, but rather returns that error.
-     *
-     * @param resource query handle from prepare()
-     * @param array numeric array containing the data to insert into the query
-     *
-     * @return bool|MDB2_Error true on success, a MDB2 error on failure
-     * @access public
-     * @see prepare(), execute()
-     */
-    function executeMultiple($stmt, $params = null)
-    {
-        for ($i = 0, $j = count($params); $i < $j; $i++) {
-            $result = $stmt->execute($params[$i]);
-            if (PEAR::isError($result)) {
-                return $result;
-            }
-        }
-        return MDB2_OK;
-    }
-
-    // }}}
-    // {{{ getBeforeID()
-
-    /**
-     * Returns the next free id of a sequence if the RDBMS
-     * does not support auto increment
-     *
-     * @param string name of the table into which a new row was inserted
-     * @param string name of the field into which a new row was inserted
-     * @param bool when true the sequence is automatic created, if it not exists
-     * @param bool if the returned value should be quoted
-     *
-     * @return int|MDB2_Error id on success, a MDB2 error on failure
-     * @access public
-     */
-    function getBeforeID($table, $field = null, $ondemand = true, $quote = true)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if ($db->supports('auto_increment') !== true) {
-            $seq = $table.(empty($field) ? '' : '_'.$field);
-            $id = $db->nextID($seq, $ondemand);
-            if (!$quote || PEAR::isError($id)) {
-                return $id;
-            }
-            return $db->quote($id, 'integer');
-        } elseif (!$quote) {
-            return null;
-        }
-        return 'NULL';
-    }
-
-    // }}}
-    // {{{ getAfterID()
-
-    /**
-     * Returns the autoincrement ID if supported or $id
-     *
-     * @param mixed value as returned by getBeforeId()
-     * @param string name of the table into which a new row was inserted
-     * @param string name of the field into which a new row was inserted
-     *
-     * @return int|MDB2_Error id on success, a MDB2 error on failure
-     * @access public
-     */
-    function getAfterID($id, $table, $field = null)
-    {
-        $db = $this->getDBInstance();
-        if (PEAR::isError($db)) {
-            return $db;
-        }
-
-        if ($db->supports('auto_increment') !== true) {
-            return $id;
-        }
-        return $db->lastInsertID($table, $field);
-    }
-
-    // }}}
-}
+<?php
+// +----------------------------------------------------------------------+
+// | PHP versions 4 and 5                                                 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+/**
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+
+/**
+ * Used by autoPrepare()
+ */
+define('MDB2_AUTOQUERY_INSERT', 1);
+define('MDB2_AUTOQUERY_UPDATE', 2);
+define('MDB2_AUTOQUERY_DELETE', 3);
+define('MDB2_AUTOQUERY_SELECT', 4);
+
+/**
+ * MDB2_Extended: class which adds several high level methods to MDB2
+ *
+ * @package MDB2
+ * @category Database
+ * @author Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Extended extends MDB2_Module_Common
+{
+    // {{{ autoPrepare()
+
+    /**
+     * Generate an insert, update or delete query and call prepare() on it
+     *
+     * @param string table
+     * @param array the fields names
+     * @param int type of query to build
+     *                          MDB2_AUTOQUERY_INSERT
+     *                          MDB2_AUTOQUERY_UPDATE
+     *                          MDB2_AUTOQUERY_DELETE
+     *                          MDB2_AUTOQUERY_SELECT
+     * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement)
+     * @param array that contains the types of the placeholders
+     * @param mixed array that contains the types of the columns in
+     *                        the result set or MDB2_PREPARE_RESULT, if set to
+     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
+     *
+     * @return resource handle for the query
+     * @see buildManipSQL
+     * @access public
+     */
+    function autoPrepare($table, $table_fields, $mode = MDB2_AUTOQUERY_INSERT,
+        $where = false, $types = null, $result_types = MDB2_PREPARE_MANIP)
+    {
+        $query = $this->buildManipSQL($table, $table_fields, $mode, $where);
+        if (PEAR::isError($query)) {
+            return $query;
+        }
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+        $lobs = array();
+        foreach ((array)$types as $param => $type) {
+            if (($type == 'clob') || ($type == 'blob')) {
+                $lobs[$param] = $table_fields[$param];
+            }
+        }
+        return $db->prepare($query, $types, $result_types, $lobs);
+    }
+
+    // }}}
+    // {{{ autoExecute()
+
+    /**
+     * Generate an insert, update or delete query and call prepare() and execute() on it
+     *
+     * @param string name of the table
+     * @param array assoc ($key=>$value) where $key is a field name and $value its value
+     * @param int type of query to build
+     *                          MDB2_AUTOQUERY_INSERT
+     *                          MDB2_AUTOQUERY_UPDATE
+     *                          MDB2_AUTOQUERY_DELETE
+     *                          MDB2_AUTOQUERY_SELECT
+     * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement)
+     * @param array that contains the types of the placeholders
+     * @param string which specifies which result class to use
+     * @param mixed  array that contains the types of the columns in
+     *                        the result set or MDB2_PREPARE_RESULT, if set to
+     *                        MDB2_PREPARE_MANIP the query is handled as a manipulation query
+     *
+     * @return bool|MDB2_Error true on success, a MDB2 error on failure
+     * @see buildManipSQL
+     * @see autoPrepare
+     * @access public
+    */
+    function autoExecute($table, $fields_values, $mode = MDB2_AUTOQUERY_INSERT,
+        $where = false, $types = null, $result_class = true, $result_types = MDB2_PREPARE_MANIP)
+    {
+        $fields_values = (array)$fields_values;
+        if ($mode == MDB2_AUTOQUERY_SELECT) {
+            if (is_array($result_types)) {
+                $keys = array_keys($result_types);
+            } elseif (!empty($fields_values)) {
+                $keys = $fields_values;
+            } else {
+                $keys = array();
+            }
+        } else {
+            $keys = array_keys($fields_values);
+        }
+        $params = array_values($fields_values);
+        if (empty($params)) {
+            $query = $this->buildManipSQL($table, $keys, $mode, $where);
+
+            $db = $this->getDBInstance();
+            if (PEAR::isError($db)) {
+                return $db;
+            }
+            if ($mode == MDB2_AUTOQUERY_SELECT) {
+                $result = $db->query($query, $result_types, $result_class);
+            } else {
+                $result = $db->exec($query);
+            }
+        } else {
+            $stmt = $this->autoPrepare($table, $keys, $mode, $where, $types, $result_types);
+            if (PEAR::isError($stmt)) {
+                return $stmt;
+            }
+            $result = $stmt->execute($params, $result_class);
+            $stmt->free();
+        }
+        return $result;
+    }
+
+    // }}}
+    // {{{ buildManipSQL()
+
+    /**
+     * Make automaticaly an sql query for prepare()
+     *
+     * Example : buildManipSQL('table_sql', array('field1', 'field2', 'field3'), MDB2_AUTOQUERY_INSERT)
+     *           will return the string : INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?)
+     * NB : - This belongs more to a SQL Builder class, but this is a simple facility
+     *      - Be carefull ! If you don't give a $where param with an UPDATE/DELETE query, all
+     *        the records of the table will be updated/deleted !
+     *
+     * @param string name of the table
+     * @param ordered array containing the fields names
+     * @param int type of query to build
+     *                          MDB2_AUTOQUERY_INSERT
+     *                          MDB2_AUTOQUERY_UPDATE
+     *                          MDB2_AUTOQUERY_DELETE
+     *                          MDB2_AUTOQUERY_SELECT
+     * @param string (in case of update and delete queries, this string will be put after the sql WHERE statement)
+     *
+     * @return string sql query for prepare()
+     * @access public
+     */
+    function buildManipSQL($table, $table_fields, $mode, $where = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if ($db->options['quote_identifier']) {
+            $table = $db->quoteIdentifier($table);
+        }
+
+        if (!empty($table_fields) && $db->options['quote_identifier']) {
+            foreach ($table_fields as $key => $field) {
+                $table_fields[$key] = $db->quoteIdentifier($field);
+            }
+        }
+
+        if ((false !== $where) && (null !== $where)) {
+            if (is_array($where)) {
+                $where = implode(' AND ', $where);
+            }
+            $where = ' WHERE '.$where;
+        }
+
+        switch ($mode) {
+        case MDB2_AUTOQUERY_INSERT:
+            if (empty($table_fields)) {
+                return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                'Insert requires table fields', __FUNCTION__);
+            }
+            $cols = implode(', ', $table_fields);
+            $values = '?'.str_repeat(', ?', (count($table_fields) - 1));
+            return 'INSERT INTO '.$table.' ('.$cols.') VALUES ('.$values.')';
+            break;
+        case MDB2_AUTOQUERY_UPDATE:
+            if (empty($table_fields)) {
+                return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
+                'Update requires table fields', __FUNCTION__);
+            }
+            $set = implode(' = ?, ', $table_fields).' = ?';
+            $sql = 'UPDATE '.$table.' SET '.$set.$where;
+            return $sql;
+            break;
+        case MDB2_AUTOQUERY_DELETE:
+            $sql = 'DELETE FROM '.$table.$where;
+            return $sql;
+            break;
+        case MDB2_AUTOQUERY_SELECT:
+            $cols = !empty($table_fields) ? implode(', ', $table_fields) : '*';
+            $sql = 'SELECT '.$cols.' FROM '.$table.$where;
+            return $sql;
+            break;
+        }
+        return $db->raiseError(MDB2_ERROR_SYNTAX, null, null,
+                'Non existant mode', __FUNCTION__);
+    }
+
+    // }}}
+    // {{{ limitQuery()
+
+    /**
+     * Generates a limited query
+     *
+     * @param string query
+     * @param array that contains the types of the columns in the result set
+     * @param integer the numbers of rows to fetch
+     * @param integer the row to start to fetching
+     * @param string which specifies which result class to use
+     * @param mixed   string which specifies which class to wrap results in
+     *
+     * @return MDB2_Result|MDB2_Error result set on success, a MDB2 error on failure
+     * @access public
+     */
+    function limitQuery($query, $types, $limit, $offset = 0, $result_class = true,
+        $result_wrap_class = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        $result = $db->setLimit($limit, $offset);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        return $db->query($query, $types, $result_class, $result_wrap_class);
+    }
+
+    // }}}
+    // {{{ execParam()
+
+    /**
+     * Execute a parameterized DML statement.
+     *
+     * @param string the SQL query
+     * @param array if supplied, prepare/execute will be used
+     *       with this array as execute parameters
+     * @param array that contains the types of the values defined in $params
+     *
+     * @return int|MDB2_Error affected rows on success, a MDB2 error on failure
+     * @access public
+     */
+    function execParam($query, $params = array(), $param_types = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        settype($params, 'array');
+        if (empty($params)) {
+            return $db->exec($query);
+        }
+
+        $stmt = $db->prepare($query, $param_types, MDB2_PREPARE_MANIP);
+        if (PEAR::isError($stmt)) {
+            return $stmt;
+        }
+
+        $result = $stmt->execute($params);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
+        $stmt->free();
+        return $result;
+    }
+
+    // }}}
+    // {{{ getOne()
+
+    /**
+     * Fetch the first column of the first row of data returned from a query.
+     * Takes care of doing the query and freeing the results when finished.
+     *
+     * @param string the SQL query
+     * @param string that contains the type of the column in the result set
+     * @param array if supplied, prepare/execute will be used
+     *       with this array as execute parameters
+     * @param array that contains the types of the values defined in $params
+     * @param int|string which column to return
+     *
+     * @return scalar|MDB2_Error data on success, a MDB2 error on failure
+     * @access public
+     */
+    function getOne($query, $type = null, $params = array(),
+        $param_types = null, $colnum = 0)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        settype($params, 'array');
+        settype($type, 'array');
+        if (empty($params)) {
+            return $db->queryOne($query, $type, $colnum);
+        }
+
+        $stmt = $db->prepare($query, $param_types, $type);
+        if (PEAR::isError($stmt)) {
+            return $stmt;
+        }
+
+        $result = $stmt->execute($params);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $one = $result->fetchOne($colnum);
+        $stmt->free();
+        $result->free();
+        return $one;
+    }
+
+    // }}}
+    // {{{ getRow()
+
+    /**
+     * Fetch the first row of data returned from a query.  Takes care
+     * of doing the query and freeing the results when finished.
+     *
+     * @param string the SQL query
+     * @param array that contains the types of the columns in the result set
+     * @param array if supplied, prepare/execute will be used
+     *       with this array as execute parameters
+     * @param array that contains the types of the values defined in $params
+     * @param int the fetch mode to use
+     *
+     * @return array|MDB2_Error data on success, a MDB2 error on failure
+     * @access public
+     */
+    function getRow($query, $types = null, $params = array(),
+        $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        settype($params, 'array');
+        if (empty($params)) {
+            return $db->queryRow($query, $types, $fetchmode);
+        }
+
+        $stmt = $db->prepare($query, $param_types, $types);
+        if (PEAR::isError($stmt)) {
+            return $stmt;
+        }
+
+        $result = $stmt->execute($params);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $row = $result->fetchRow($fetchmode);
+        $stmt->free();
+        $result->free();
+        return $row;
+    }
+
+    // }}}
+    // {{{ getCol()
+
+    /**
+     * Fetch a single column from a result set and return it as an
+     * indexed array.
+     *
+     * @param string the SQL query
+     * @param string that contains the type of the column in the result set
+     * @param array if supplied, prepare/execute will be used
+     *       with this array as execute parameters
+     * @param array that contains the types of the values defined in $params
+     * @param int|string which column to return
+     *
+     * @return array|MDB2_Error data on success, a MDB2 error on failure
+     * @access public
+     */
+    function getCol($query, $type = null, $params = array(),
+        $param_types = null, $colnum = 0)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        settype($params, 'array');
+        settype($type, 'array');
+        if (empty($params)) {
+            return $db->queryCol($query, $type, $colnum);
+        }
+
+        $stmt = $db->prepare($query, $param_types, $type);
+        if (PEAR::isError($stmt)) {
+            return $stmt;
+        }
+
+        $result = $stmt->execute($params);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $col = $result->fetchCol($colnum);
+        $stmt->free();
+        $result->free();
+        return $col;
+    }
+
+    // }}}
+    // {{{ getAll()
+
+    /**
+     * Fetch all the rows returned from a query.
+     *
+     * @param string the SQL query
+     * @param array that contains the types of the columns in the result set
+     * @param array if supplied, prepare/execute will be used
+     *       with this array as execute parameters
+     * @param array that contains the types of the values defined in $params
+     * @param int the fetch mode to use
+     * @param bool if set to true, the $all will have the first
+     *       column as its first dimension
+     * @param bool $force_array used only when the query returns exactly
+     *       two columns. If true, the values of the returned array will be
+     *       one-element arrays instead of scalars.
+     * @param bool $group if true, the values of the returned array is
+     *       wrapped in another array.  If the same key value (in the first
+     *       column) repeats itself, the values will be appended to this array
+     *       instead of overwriting the existing values.
+     *
+     * @return array|MDB2_Error data on success, a MDB2 error on failure
+     * @access public
+     */
+    function getAll($query, $types = null, $params = array(),
+        $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT,
+        $rekey = false, $force_array = false, $group = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        settype($params, 'array');
+        if (empty($params)) {
+            return $db->queryAll($query, $types, $fetchmode, $rekey, $force_array, $group);
+        }
+
+        $stmt = $db->prepare($query, $param_types, $types);
+        if (PEAR::isError($stmt)) {
+            return $stmt;
+        }
+
+        $result = $stmt->execute($params);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $all = $result->fetchAll($fetchmode, $rekey, $force_array, $group);
+        $stmt->free();
+        $result->free();
+        return $all;
+    }
+
+    // }}}
+    // {{{ getAssoc()
+
+    /**
+     * Fetch the entire result set of a query and return it as an
+     * associative array using the first column as the key.
+     *
+     * If the result set contains more than two columns, the value
+     * will be an array of the values from column 2-n.  If the result
+     * set contains only two columns, the returned value will be a
+     * scalar with the value of the second column (unless forced to an
+     * array with the $force_array parameter).  A MDB2 error code is
+     * returned on errors.  If the result set contains fewer than two
+     * columns, a MDB2_ERROR_TRUNCATED error is returned.
+     *
+     * For example, if the table 'mytable' contains:
+     * <pre>
+     *   ID      TEXT       DATE
+     * --------------------------------
+     *   1       'one'      944679408
+     *   2       'two'      944679408
+     *   3       'three'    944679408
+     * </pre>
+     * Then the call getAssoc('SELECT id,text FROM mytable') returns:
+     * <pre>
+     *    array(
+     *      '1' => 'one',
+     *      '2' => 'two',
+     *      '3' => 'three',
+     *    )
+     * </pre>
+     * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns:
+     * <pre>
+     *    array(
+     *      '1' => array('one', '944679408'),
+     *      '2' => array('two', '944679408'),
+     *      '3' => array('three', '944679408')
+     *    )
+     * </pre>
+     *
+     * If the more than one row occurs with the same value in the
+     * first column, the last row overwrites all previous ones by
+     * default.  Use the $group parameter if you don't want to
+     * overwrite like this.  Example:
+     * <pre>
+     * getAssoc('SELECT category,id,name FROM mytable', null, null
+     *           MDB2_FETCHMODE_ASSOC, false, true) returns:
+     *    array(
+     *      '1' => array(array('id' => '4', 'name' => 'number four'),
+     *                   array('id' => '6', 'name' => 'number six')
+     *             ),
+     *      '9' => array(array('id' => '4', 'name' => 'number four'),
+     *                   array('id' => '6', 'name' => 'number six')
+     *             )
+     *    )
+     * </pre>
+     *
+     * Keep in mind that database functions in PHP usually return string
+     * values for results regardless of the database's internal type.
+     *
+     * @param string the SQL query
+     * @param array that contains the types of the columns in the result set
+     * @param array if supplied, prepare/execute will be used
+     *       with this array as execute parameters
+     * @param array that contains the types of the values defined in $params
+     * @param bool $force_array used only when the query returns
+     * exactly two columns.  If TRUE, the values of the returned array
+     * will be one-element arrays instead of scalars.
+     * @param bool $group if TRUE, the values of the returned array
+     *       is wrapped in another array.  If the same key value (in the first
+     *       column) repeats itself, the values will be appended to this array
+     *       instead of overwriting the existing values.
+     *
+     * @return array|MDB2_Error data on success, a MDB2 error on failure
+     * @access public
+     */
+    function getAssoc($query, $types = null, $params = array(), $param_types = null,
+        $fetchmode = MDB2_FETCHMODE_DEFAULT, $force_array = false, $group = false)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        settype($params, 'array');
+        if (empty($params)) {
+            return $db->queryAll($query, $types, $fetchmode, true, $force_array, $group);
+        }
+
+        $stmt = $db->prepare($query, $param_types, $types);
+        if (PEAR::isError($stmt)) {
+            return $stmt;
+        }
+
+        $result = $stmt->execute($params);
+        if (!MDB2::isResultCommon($result)) {
+            return $result;
+        }
+
+        $all = $result->fetchAll($fetchmode, true, $force_array, $group);
+        $stmt->free();
+        $result->free();
+        return $all;
+    }
+
+    // }}}
+    // {{{ executeMultiple()
+
+    /**
+     * This function does several execute() calls on the same statement handle.
+     * $params must be an array indexed numerically from 0, one execute call is
+     * done for every 'row' in the array.
+     *
+     * If an error occurs during execute(), executeMultiple() does not execute
+     * the unfinished rows, but rather returns that error.
+     *
+     * @param resource query handle from prepare()
+     * @param array numeric array containing the data to insert into the query
+     *
+     * @return bool|MDB2_Error true on success, a MDB2 error on failure
+     * @access public
+     * @see prepare(), execute()
+     */
+    function executeMultiple($stmt, $params = null)
+    {
+        if (MDB2::isError($stmt)) {
+            return $stmt;
+        }
+        for ($i = 0, $j = count($params); $i < $j; $i++) {
+            $result = $stmt->execute($params[$i]);
+            if (PEAR::isError($result)) {
+                return $result;
+            }
+        }
+        return MDB2_OK;
+    }
+
+    // }}}
+    // {{{ getBeforeID()
+
+    /**
+     * Returns the next free id of a sequence if the RDBMS
+     * does not support auto increment
+     *
+     * @param string name of the table into which a new row was inserted
+     * @param string name of the field into which a new row was inserted
+     * @param bool when true the sequence is automatic created, if it not exists
+     * @param bool if the returned value should be quoted
+     *
+     * @return int|MDB2_Error id on success, a MDB2 error on failure
+     * @access public
+     */
+    function getBeforeID($table, $field = null, $ondemand = true, $quote = true)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if ($db->supports('auto_increment') !== true) {
+            $seq = $table.(empty($field) ? '' : '_'.$field);
+            $id = $db->nextID($seq, $ondemand);
+            if (!$quote || PEAR::isError($id)) {
+                return $id;
+            }
+            return $db->quote($id, 'integer');
+        } elseif (!$quote) {
+            return null;
+        }
+        return 'NULL';
+    }
+
+    // }}}
+    // {{{ getAfterID()
+
+    /**
+     * Returns the autoincrement ID if supported or $id
+     *
+     * @param mixed value as returned by getBeforeId()
+     * @param string name of the table into which a new row was inserted
+     * @param string name of the field into which a new row was inserted
+     *
+     * @return int|MDB2_Error id on success, a MDB2 error on failure
+     * @access public
+     */
+    function getAfterID($id, $table, $field = null)
+    {
+        $db = $this->getDBInstance();
+        if (PEAR::isError($db)) {
+            return $db;
+        }
+
+        if ($db->supports('auto_increment') !== true) {
+            return $id;
+        }
+        return $db->lastInsertID($table, $field);
+    }
+
+    // }}}
+}
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Iterator.php b/3rdparty/MDB2/Iterator.php
index 8d31919b6deff679bd3c8233c874cd512488de74..46feade32183bc459abdb4691d7cbb602e887745 100644
--- a/3rdparty/MDB2/Iterator.php
+++ b/3rdparty/MDB2/Iterator.php
@@ -1,259 +1,262 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP version 5                                                        |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: Iterator.php 295586 2010-02-28 17:04:17Z quipo $
-
-/**
- * PHP5 Iterator
- *
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_Iterator implements Iterator
-{
-    protected $fetchmode;
-    protected $result;
-    protected $row;
-
-    // {{{ constructor
-
-    /**
-     * Constructor
-     */
-    public function __construct($result, $fetchmode = MDB2_FETCHMODE_DEFAULT)
-    {
-        $this->result = $result;
-        $this->fetchmode = $fetchmode;
-    }
-    // }}}
-
-    // {{{ seek()
-
-    /**
-     * Seek forward to a specific row in a result set
-     *
-     * @param int number of the row where the data can be found
-     *
-     * @return void
-     * @access public
-     */
-    public function seek($rownum)
-    {
-        $this->row = null;
-        if ($this->result) {
-            $this->result->seek($rownum);
-        }
-    }
-    // }}}
-
-    // {{{ next()
-
-    /**
-     * Fetch next row of data
-     *
-     * @return void
-     * @access public
-     */
-    public function next()
-    {
-        $this->row = null;
-    }
-    // }}}
-
-    // {{{ current()
-
-    /**
-     * return a row of data
-     *
-     * @return void
-     * @access public
-     */
-    public function current()
-    {
-        if (null === $this->row) {
-            $row = $this->result->fetchRow($this->fetchmode);
-            if (PEAR::isError($row)) {
-                $row = false;
-            }
-            $this->row = $row;
-        }
-        return $this->row;
-    }
-    // }}}
-
-    // {{{ valid()
-
-    /**
-     * Check if the end of the result set has been reached
-     *
-     * @return bool true/false, false is also returned on failure
-     * @access public
-     */
-    public function valid()
-    {
-        return (bool)$this->current();
-    }
-    // }}}
-
-    // {{{ free()
-
-    /**
-     * Free the internal resources associated with result.
-     *
-     * @return bool|MDB2_Error true on success, false|MDB2_Error if result is invalid
-     * @access public
-     */
-    public function free()
-    {
-        if ($this->result) {
-            return $this->result->free();
-        }
-        $this->result = false;
-        $this->row = null;
-        return false;
-    }
-    // }}}
-
-    // {{{ key()
-
-    /**
-     * Returns the row number
-     *
-     * @return int|bool|MDB2_Error true on success, false|MDB2_Error if result is invalid
-     * @access public
-     */
-    public function key()
-    {
-        if ($this->result) {
-            return $this->result->rowCount();
-        }
-        return false;
-    }
-    // }}}
-
-    // {{{ rewind()
-
-    /**
-     * Seek to the first row in a result set
-     *
-     * @return void
-     * @access public
-     */
-    public function rewind()
-    {
-    }
-    // }}}
-
-    // {{{ destructor
-
-    /**
-     * Destructor
-     */
-    public function __destruct()
-    {
-        $this->free();
-    }
-    // }}}
-}
-
-/**
- * PHP5 buffered Iterator
- *
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_BufferedIterator extends MDB2_Iterator implements SeekableIterator
-{
-    // {{{ valid()
-
-    /**
-     * Check if the end of the result set has been reached
-     *
-     * @return bool|MDB2_Error true on success, false|MDB2_Error if result is invalid
-     * @access public
-     */
-    public function valid()
-    {
-        if ($this->result) {
-            return $this->result->valid();
-        }
-        return false;
-    }
-    // }}}
-
-    // {{{count()
-
-    /**
-     * Returns the number of rows in a result object
-     *
-     * @return int|MDB2_Error number of rows, false|MDB2_Error if result is invalid
-     * @access public
-     */
-    public function count()
-    {
-        if ($this->result) {
-            return $this->result->numRows();
-        }
-        return false;
-    }
-    // }}}
-
-    // {{{ rewind()
-
-    /**
-     * Seek to the first row in a result set
-     *
-     * @return void
-     * @access public
-     */
-    public function rewind()
-    {
-        $this->seek(0);
-    }
-    // }}}
-}
-
+<?php
+// +----------------------------------------------------------------------+
+// | PHP version 5                                                        |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+/**
+ * PHP5 Iterator
+ *
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_Iterator implements Iterator
+{
+    protected $fetchmode;
+    /**
+     * @var MDB2_Result_Common
+     */
+    protected $result;
+    protected $row;
+
+    // {{{ constructor
+
+    /**
+     * Constructor
+     */
+    public function __construct(MDB2_Result_Common $result, $fetchmode = MDB2_FETCHMODE_DEFAULT)
+    {
+        $this->result = $result;
+        $this->fetchmode = $fetchmode;
+    }
+    // }}}
+
+    // {{{ seek()
+
+    /**
+     * Seek forward to a specific row in a result set
+     *
+     * @param int number of the row where the data can be found
+     *
+     * @return void
+     * @access public
+     */
+    public function seek($rownum)
+    {
+        $this->row = null;
+        if ($this->result) {
+            $this->result->seek($rownum);
+        }
+    }
+    // }}}
+
+    // {{{ next()
+
+    /**
+     * Fetch next row of data
+     *
+     * @return void
+     * @access public
+     */
+    public function next()
+    {
+        $this->row = null;
+    }
+    // }}}
+
+    // {{{ current()
+
+    /**
+     * return a row of data
+     *
+     * @return void
+     * @access public
+     */
+    public function current()
+    {
+        if (null === $this->row) {
+            $row = $this->result->fetchRow($this->fetchmode);
+            if (PEAR::isError($row)) {
+                $row = false;
+            }
+            $this->row = $row;
+        }
+        return $this->row;
+    }
+    // }}}
+
+    // {{{ valid()
+
+    /**
+     * Check if the end of the result set has been reached
+     *
+     * @return bool true/false, false is also returned on failure
+     * @access public
+     */
+    public function valid()
+    {
+        return (bool)$this->current();
+    }
+    // }}}
+
+    // {{{ free()
+
+    /**
+     * Free the internal resources associated with result.
+     *
+     * @return bool|MDB2_Error true on success, false|MDB2_Error if result is invalid
+     * @access public
+     */
+    public function free()
+    {
+        if ($this->result) {
+            return $this->result->free();
+        }
+        $this->result = false;
+        $this->row = null;
+        return false;
+    }
+    // }}}
+
+    // {{{ key()
+
+    /**
+     * Returns the row number
+     *
+     * @return int|bool|MDB2_Error true on success, false|MDB2_Error if result is invalid
+     * @access public
+     */
+    public function key()
+    {
+        if ($this->result) {
+            return $this->result->rowCount();
+        }
+        return false;
+    }
+    // }}}
+
+    // {{{ rewind()
+
+    /**
+     * Seek to the first row in a result set
+     *
+     * @return void
+     * @access public
+     */
+    public function rewind()
+    {
+    }
+    // }}}
+
+    // {{{ destructor
+
+    /**
+     * Destructor
+     */
+    public function __destruct()
+    {
+        $this->free();
+    }
+    // }}}
+}
+
+/**
+ * PHP5 buffered Iterator
+ *
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_BufferedIterator extends MDB2_Iterator implements SeekableIterator
+{
+    // {{{ valid()
+
+    /**
+     * Check if the end of the result set has been reached
+     *
+     * @return bool|MDB2_Error true on success, false|MDB2_Error if result is invalid
+     * @access public
+     */
+    public function valid()
+    {
+        if ($this->result) {
+            return $this->result->valid();
+        }
+        return false;
+    }
+    // }}}
+
+    // {{{count()
+
+    /**
+     * Returns the number of rows in a result object
+     *
+     * @return int|MDB2_Error number of rows, false|MDB2_Error if result is invalid
+     * @access public
+     */
+    public function count()
+    {
+        if ($this->result) {
+            return $this->result->numRows();
+        }
+        return false;
+    }
+    // }}}
+
+    // {{{ rewind()
+
+    /**
+     * Seek to the first row in a result set
+     *
+     * @return void
+     * @access public
+     */
+    public function rewind()
+    {
+        $this->seek(0);
+    }
+    // }}}
+}
+
 ?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/LOB.php b/3rdparty/MDB2/LOB.php
index f7df13dc4782c31c8e92d0bfca15e7b1775efcd7..537a77e546bcddbf49b8aa1488f74ee62dcdcdeb 100644
--- a/3rdparty/MDB2/LOB.php
+++ b/3rdparty/MDB2/LOB.php
@@ -1,264 +1,264 @@
-<?php
-// +----------------------------------------------------------------------+
-// | PHP version 5                                                        |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lukas Smith <smith@pooteeweet.org>                           |
-// +----------------------------------------------------------------------+
-//
-// $Id: LOB.php 222350 2006-10-25 11:52:21Z lsmith $
-
-/**
- * @package  MDB2
- * @category Database
- * @author   Lukas Smith <smith@pooteeweet.org>
- */
-
-require_once 'MDB2.php';
-
-/**
- * MDB2_LOB: user land stream wrapper implementation for LOB support
- *
- * @package MDB2
- * @category Database
- * @author Lukas Smith <smith@pooteeweet.org>
- */
-class MDB2_LOB
-{
-    /**
-     * contains the key to the global MDB2 instance array of the associated
-     * MDB2 instance
-     *
-     * @var integer
-     * @access protected
-     */
-    var $db_index;
-
-    /**
-     * contains the key to the global MDB2_LOB instance array of the associated
-     * MDB2_LOB instance
-     *
-     * @var integer
-     * @access protected
-     */
-    var $lob_index;
-
-    // {{{ stream_open()
-
-    /**
-     * open stream
-     *
-     * @param string specifies the URL that was passed to fopen()
-     * @param string the mode used to open the file
-     * @param int holds additional flags set by the streams API
-     * @param string not used
-     *
-     * @return bool
-     * @access public
-     */
-    function stream_open($path, $mode, $options, &$opened_path)
-    {
-        if (!preg_match('/^rb?\+?$/', $mode)) {
-            return false;
-        }
-        $url = parse_url($path);
-        if (empty($url['host'])) {
-            return false;
-        }
-        $this->db_index = (int)$url['host'];
-        if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            return false;
-        }
-        $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
-        $this->lob_index = (int)$url['user'];
-        if (!isset($db->datatype->lobs[$this->lob_index])) {
-            return false;
-        }
-        return true;
-    }
-    // }}}
-
-    // {{{ stream_read()
-
-    /**
-     * read stream
-     *
-     * @param int number of bytes to read
-     *
-     * @return string
-     * @access public
-     */
-    function stream_read($count)
-    {
-        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
-            $db->datatype->_retrieveLOB($db->datatype->lobs[$this->lob_index]);
-
-            $data = $db->datatype->_readLOB($db->datatype->lobs[$this->lob_index], $count);
-            $length = strlen($data);
-            if ($length == 0) {
-                $db->datatype->lobs[$this->lob_index]['endOfLOB'] = true;
-            }
-            $db->datatype->lobs[$this->lob_index]['position'] += $length;
-            return $data;
-        }
-    }
-    // }}}
-
-    // {{{ stream_write()
-
-    /**
-     * write stream, note implemented
-     *
-     * @param string data
-     *
-     * @return int
-     * @access public
-     */
-    function stream_write($data)
-    {
-        return 0;
-    }
-    // }}}
-
-    // {{{ stream_tell()
-
-    /**
-     * return the current position
-     *
-     * @return int current position
-     * @access public
-     */
-    function stream_tell()
-    {
-        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
-            return $db->datatype->lobs[$this->lob_index]['position'];
-        }
-    }
-    // }}}
-
-    // {{{ stream_eof()
-
-    /**
-     * Check if stream reaches EOF
-     *
-     * @return bool
-     * @access public
-     */
-    function stream_eof()
-    {
-        if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            return true;
-        }
-
-        $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
-        $result = $db->datatype->_endOfLOB($db->datatype->lobs[$this->lob_index]);
-        if (version_compare(phpversion(), "5.0", ">=")
-            && version_compare(phpversion(), "5.1", "<")
-        ) {
-            return !$result;
-        }
-        return $result;
-    }
-    // }}}
-
-    // {{{ stream_seek()
-
-    /**
-     * Seek stream, not implemented
-     *
-     * @param int offset
-     * @param int whence
-     *
-     * @return bool
-     * @access public
-     */
-    function stream_seek($offset, $whence)
-    {
-        return false;
-    }
-    // }}}
-
-    // {{{ stream_stat()
-
-    /**
-     * return information about stream
-     *
-     * @access public
-     */
-    function stream_stat()
-    {
-        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
-            return array(
-              'db_index' => $this->db_index,
-              'lob_index' => $this->lob_index,
-            );
-        }
-    }
-    // }}}
-
-    // {{{ stream_close()
-
-    /**
-     * close stream
-     *
-     * @access public
-     */
-    function stream_close()
-    {
-        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
-            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
-            if (isset($db->datatype->lobs[$this->lob_index])) {
-                $db->datatype->_destroyLOB($db->datatype->lobs[$this->lob_index]);
-                unset($db->datatype->lobs[$this->lob_index]);
-            }
-        }
-    }
-    // }}}
-}
-
-// register streams wrapper
-if (!stream_wrapper_register("MDB2LOB", "MDB2_LOB")) {
-    MDB2::raiseError();
-    return false;
-}
-
-?>
+<?php
+// +----------------------------------------------------------------------+
+// | PHP version 5                                                        |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
+// | Stig. S. Bakken, Lukas Smith                                         |
+// | All rights reserved.                                                 |
+// +----------------------------------------------------------------------+
+// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
+// | API as well as database abstraction for PHP applications.            |
+// | This LICENSE is in the BSD license style.                            |
+// |                                                                      |
+// | Redistribution and use in source and binary forms, with or without   |
+// | modification, are permitted provided that the following conditions   |
+// | are met:                                                             |
+// |                                                                      |
+// | Redistributions of source code must retain the above copyright       |
+// | notice, this list of conditions and the following disclaimer.        |
+// |                                                                      |
+// | Redistributions in binary form must reproduce the above copyright    |
+// | notice, this list of conditions and the following disclaimer in the  |
+// | documentation and/or other materials provided with the distribution. |
+// |                                                                      |
+// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
+// | Lukas Smith nor the names of his contributors may be used to endorse |
+// | or promote products derived from this software without specific prior|
+// | written permission.                                                  |
+// |                                                                      |
+// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
+// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
+// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
+// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
+// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
+// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
+// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
+// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
+// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
+// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
+// | POSSIBILITY OF SUCH DAMAGE.                                          |
+// +----------------------------------------------------------------------+
+// | Author: Lukas Smith <smith@pooteeweet.org>                           |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+
+/**
+ * @package  MDB2
+ * @category Database
+ * @author   Lukas Smith <smith@pooteeweet.org>
+ */
+
+require_once 'MDB2.php';
+
+/**
+ * MDB2_LOB: user land stream wrapper implementation for LOB support
+ *
+ * @package MDB2
+ * @category Database
+ * @author Lukas Smith <smith@pooteeweet.org>
+ */
+class MDB2_LOB
+{
+    /**
+     * contains the key to the global MDB2 instance array of the associated
+     * MDB2 instance
+     *
+     * @var integer
+     * @access protected
+     */
+    var $db_index;
+
+    /**
+     * contains the key to the global MDB2_LOB instance array of the associated
+     * MDB2_LOB instance
+     *
+     * @var integer
+     * @access protected
+     */
+    var $lob_index;
+
+    // {{{ stream_open()
+
+    /**
+     * open stream
+     *
+     * @param string specifies the URL that was passed to fopen()
+     * @param string the mode used to open the file
+     * @param int holds additional flags set by the streams API
+     * @param string not used
+     *
+     * @return bool
+     * @access public
+     */
+    function stream_open($path, $mode, $options, &$opened_path)
+    {
+        if (!preg_match('/^rb?\+?$/', $mode)) {
+            return false;
+        }
+        $url = parse_url($path);
+        if (empty($url['host'])) {
+            return false;
+        }
+        $this->db_index = (int)$url['host'];
+        if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            return false;
+        }
+        $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
+        $this->lob_index = (int)$url['user'];
+        if (!isset($db->datatype->lobs[$this->lob_index])) {
+            return false;
+        }
+        return true;
+    }
+    // }}}
+
+    // {{{ stream_read()
+
+    /**
+     * read stream
+     *
+     * @param int number of bytes to read
+     *
+     * @return string
+     * @access public
+     */
+    function stream_read($count)
+    {
+        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
+            $db->datatype->_retrieveLOB($db->datatype->lobs[$this->lob_index]);
+
+            $data = $db->datatype->_readLOB($db->datatype->lobs[$this->lob_index], $count);
+            $length = strlen($data);
+            if ($length == 0) {
+                $db->datatype->lobs[$this->lob_index]['endOfLOB'] = true;
+            }
+            $db->datatype->lobs[$this->lob_index]['position'] += $length;
+            return $data;
+        }
+    }
+    // }}}
+
+    // {{{ stream_write()
+
+    /**
+     * write stream, note implemented
+     *
+     * @param string data
+     *
+     * @return int
+     * @access public
+     */
+    function stream_write($data)
+    {
+        return 0;
+    }
+    // }}}
+
+    // {{{ stream_tell()
+
+    /**
+     * return the current position
+     *
+     * @return int current position
+     * @access public
+     */
+    function stream_tell()
+    {
+        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
+            return $db->datatype->lobs[$this->lob_index]['position'];
+        }
+    }
+    // }}}
+
+    // {{{ stream_eof()
+
+    /**
+     * Check if stream reaches EOF
+     *
+     * @return bool
+     * @access public
+     */
+    function stream_eof()
+    {
+        if (!isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            return true;
+        }
+
+        $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
+        $result = $db->datatype->_endOfLOB($db->datatype->lobs[$this->lob_index]);
+        if (version_compare(phpversion(), "5.0", ">=")
+            && version_compare(phpversion(), "5.1", "<")
+        ) {
+            return !$result;
+        }
+        return $result;
+    }
+    // }}}
+
+    // {{{ stream_seek()
+
+    /**
+     * Seek stream, not implemented
+     *
+     * @param int offset
+     * @param int whence
+     *
+     * @return bool
+     * @access public
+     */
+    function stream_seek($offset, $whence)
+    {
+        return false;
+    }
+    // }}}
+
+    // {{{ stream_stat()
+
+    /**
+     * return information about stream
+     *
+     * @access public
+     */
+    function stream_stat()
+    {
+        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
+            return array(
+              'db_index' => $this->db_index,
+              'lob_index' => $this->lob_index,
+            );
+        }
+    }
+    // }}}
+
+    // {{{ stream_close()
+
+    /**
+     * close stream
+     *
+     * @access public
+     */
+    function stream_close()
+    {
+        if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
+            $db =& $GLOBALS['_MDB2_databases'][$this->db_index];
+            if (isset($db->datatype->lobs[$this->lob_index])) {
+                $db->datatype->_destroyLOB($db->datatype->lobs[$this->lob_index]);
+                unset($db->datatype->lobs[$this->lob_index]);
+            }
+        }
+    }
+    // }}}
+}
+
+// register streams wrapper
+if (!stream_wrapper_register("MDB2LOB", "MDB2_LOB")) {
+    MDB2::raiseError();
+    return false;
+}
+
+?>
diff --git a/3rdparty/MDB2/Schema.php b/3rdparty/MDB2/Schema.php
index 037397018135680fafb6888dc73984f9e0a78677..5eeb97b055bf1c74a101ad0601f0b58e94d60e30 100644
--- a/3rdparty/MDB2/Schema.php
+++ b/3rdparty/MDB2/Schema.php
@@ -1,8 +1,6 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
 /**
- * PHP version 4, 5
- *
- * Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
  * Stig. S. Bakken, Lukas Smith, Igor Feghali
  * All rights reserved.
  *
@@ -39,15 +37,14 @@
  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Lukas Smith <smith@pooteeweet.org>
- * Author: Igor Feghali <ifeghali@php.net>
+ * PHP version 5
  *
  * @category Database
  * @package  MDB2_Schema
  * @author   Lukas Smith <smith@pooteeweet.org>
  * @author   Igor Feghali <ifeghali@php.net>
  * @license  BSD http://www.opensource.org/licenses/bsd-license.php
- * @version  CVS: $Id: Schema.php,v 1.132 2009/02/22 21:43:22 ifeghali Exp $
+ * @version  SVN: $Id$
  * @link     http://pear.php.net/packages/MDB2_Schema
  */
 
@@ -96,7 +93,7 @@ class MDB2_Schema extends PEAR
         'parser'                => 'MDB2_Schema_Parser',
         'writer'                => 'MDB2_Schema_Writer',
         'validate'              => 'MDB2_Schema_Validate',
-        'drop_missing_tables'   => false
+        'drop_obsolete_objects' => false
     );
 
     // }}}
@@ -237,9 +234,9 @@ class MDB2_Schema extends PEAR
      * @access public
      * @see     MDB2::parseDSN
      */
-    function &factory(&$db, $options = array())
+    static function &factory(&$db, $options = array())
     {
-        $obj =& new MDB2_Schema();
+        $obj = new MDB2_Schema();
 
         $result = $obj->connect($db, $options);
         if (PEAR::isError($result)) {
@@ -284,14 +281,14 @@ class MDB2_Schema extends PEAR
 
         $this->disconnect();
         if (!MDB2::isConnection($db)) {
-            $db =& MDB2::factory($db, $db_options);
+            $db = MDB2::factory($db, $db_options);
         }
 
         if (PEAR::isError($db)) {
             return $db;
         }
 
-        $this->db =& $db;
+        $this->db = $db;
         $this->db->loadModule('Datatype');
         $this->db->loadModule('Manager');
         $this->db->loadModule('Reverse');
@@ -380,7 +377,7 @@ class MDB2_Schema extends PEAR
         $dtd_file = $this->options['dtd_file'];
         if ($dtd_file) {
             include_once 'XML/DTD/XmlValidator.php';
-            $dtd =& new XML_DTD_XmlValidator;
+            $dtd = new XML_DTD_XmlValidator;
             if (!$dtd->isValid($dtd_file, $input_file)) {
                 return $this->raiseError(MDB2_SCHEMA_ERROR_PARSE, null, null, $dtd->getMessage());
             }
@@ -393,7 +390,16 @@ class MDB2_Schema extends PEAR
             return $result;
         }
 
-        $parser =& new $class_name($variables, $fail_on_invalid_names, $structure, $this->options['valid_types'], $this->options['force_defaults']);
+        $max_identifiers_length = null;
+        if (isset($this->db->options['max_identifiers_length'])) {
+            $max_identifiers_length = $this->db->options['max_identifiers_length'];
+        }
+        
+        $parser = new $class_name($variables, $fail_on_invalid_names, $structure,
+            $this->options['valid_types'], $this->options['force_defaults'],
+            $max_identifiers_length
+        );
+
         $result = $parser->setInputFile($input_file);
         if (PEAR::isError($result)) {
             return $result;
@@ -436,7 +442,17 @@ class MDB2_Schema extends PEAR
             return $result;
         }
 
-        $val =& new $class_name($this->options['fail_on_invalid_names'], $this->options['valid_types'], $this->options['force_defaults']);
+        $max_identifiers_length = null;
+        if (isset($this->db->options['max_identifiers_length'])) {
+            $max_identifiers_length = $this->db->options['max_identifiers_length'];
+        }
+
+        $val = new $class_name(
+            $this->options['fail_on_invalid_names'],
+            $this->options['valid_types'],
+            $this->options['force_defaults'],
+            $max_identifiers_length
+        );
 
         $database_definition = array(
             'name' => $database,
@@ -470,7 +486,7 @@ class MDB2_Schema extends PEAR
                 'initialization' => array()
             );
 
-            $table_definition =& $database_definition['tables'][$table_name];
+            $table_definition = $database_definition['tables'][$table_name];
             foreach ($fields as $field_name) {
                 $definition = $this->db->reverse->getTableFieldDefinition($table_name, $field_name);
                 if (PEAR::isError($definition)) {
@@ -628,6 +644,7 @@ class MDB2_Schema extends PEAR
             if (PEAR::isError($result)) {
                 return $result;
             }
+            $database_definition['tables'][$table_name]=$table_definition;
 
         }
 
@@ -1455,16 +1472,17 @@ class MDB2_Schema extends PEAR
                     $changes['tables'] = MDB2_Schema::arrayMergeClobber($changes['tables'], $change);
                 }
             }
-
-            if (!empty($previous_definition['tables'])
-                && is_array($previous_definition['tables'])) {
-                foreach ($previous_definition['tables'] as $table_name => $table) {
-                    if (empty($defined_tables[$table_name])) {
-                        $changes['tables']['remove'][$table_name] = true;
-                    }
+        }
+        if (!empty($previous_definition['tables'])
+            && is_array($previous_definition['tables'])
+        ) {
+            foreach ($previous_definition['tables'] as $table_name => $table) {
+                if (empty($defined_tables[$table_name])) {
+                    $changes['tables']['remove'][$table_name] = true;
                 }
             }
         }
+
         if (!empty($current_definition['sequences']) && is_array($current_definition['sequences'])) {
             $changes['sequences'] = $defined_sequences = array();
             foreach ($current_definition['sequences'] as $sequence_name => $sequence) {
@@ -1484,14 +1502,17 @@ class MDB2_Schema extends PEAR
                     $changes['sequences'] = MDB2_Schema::arrayMergeClobber($changes['sequences'], $change);
                 }
             }
-            if (!empty($previous_definition['sequences']) && is_array($previous_definition['sequences'])) {
-                foreach ($previous_definition['sequences'] as $sequence_name => $sequence) {
-                    if (empty($defined_sequences[$sequence_name])) {
-                        $changes['sequences']['remove'][$sequence_name] = true;
-                    }
+        }
+        if (!empty($previous_definition['sequences'])
+            && is_array($previous_definition['sequences'])
+        ) {
+            foreach ($previous_definition['sequences'] as $sequence_name => $sequence) {
+                if (empty($defined_sequences[$sequence_name])) {
+                    $changes['sequences']['remove'][$sequence_name] = true;
                 }
             }
         }
+
         return $changes;
     }
 
@@ -2022,9 +2043,10 @@ class MDB2_Schema extends PEAR
             }
         }
  
-        if ($this->options['drop_missing_tables']
+        if ($this->options['drop_obsolete_objects']
             && !empty($changes['remove'])
-            && is_array($changes['remove'])) {
+            && is_array($changes['remove'])
+        ) {
             foreach ($changes['remove'] as $table_name => $table) {
                 $result = $this->db->manager->dropTable($table_name);
                 if (PEAR::isError($result)) {
@@ -2105,7 +2127,10 @@ class MDB2_Schema extends PEAR
             }
         }
 
-        if (!empty($changes['remove']) && is_array($changes['remove'])) {
+        if ($this->options['drop_obsolete_objects']
+            && !empty($changes['remove'])
+            && is_array($changes['remove'])
+        ) {
             foreach ($changes['remove'] as $sequence_name => $sequence) {
                 $result = $this->db->manager->dropSequence($sequence_name);
                 if (PEAR::isError($result)) {
@@ -2232,7 +2257,7 @@ class MDB2_Schema extends PEAR
             }
 
             if (!empty($changes['tables']['remove']) && is_array($changes['tables']['remove'])) {
-                if ($this->options['drop_missing_tables']) {
+                if ($this->options['drop_obsolete_objects']) {
                     foreach ($changes['tables']['remove'] as $table_name => $table) {
                         $this->db->debug("$table_name:", __FUNCTION__);
                         $this->db->debug("\tRemoved table '$table_name'", __FUNCTION__);
@@ -2338,9 +2363,15 @@ class MDB2_Schema extends PEAR
                 }
             }
             if (!empty($changes['sequences']['remove']) && is_array($changes['sequences']['remove'])) {
-                foreach ($changes['sequences']['remove'] as $sequence_name => $sequence) {
-                    $this->db->debug("$sequence_name:", __FUNCTION__);
-                    $this->db->debug("\tAdded sequence '$sequence_name'", __FUNCTION__);
+                if ($this->options['drop_obsolete_objects']) {
+                    foreach ($changes['sequences']['remove'] as $sequence_name => $sequence) {
+                        $this->db->debug("$sequence_name:", __FUNCTION__);
+                        $this->db->debug("\tRemoved sequence '$sequence_name'", __FUNCTION__);
+                    }
+                } else {
+                    foreach ($changes['sequences']['remove'] as $sequence_name => $sequence) {
+                        $this->db->debug("\tObsolete sequence '$sequence_name' left as is", __FUNCTION__);
+                    }
                 }
             }
             if (!empty($changes['sequences']['change']) && is_array($changes['sequences']['change'])) {
@@ -2448,7 +2479,7 @@ class MDB2_Schema extends PEAR
             }
         }
 
-        $writer =& new $class_name($this->options['valid_types']);
+        $writer = new $class_name($this->options['valid_types']);
         return $writer->dumpDatabase($database_definition, $arguments, $dump);
     }
 
@@ -2696,9 +2727,9 @@ class MDB2_Schema extends PEAR
      * @access  public
      * @see PEAR_Error
      */
-    function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
+    static function &raiseError($code = null, $mode = null, $options = null, $userinfo = null, $dummy1 = null, $dummy2 = null, $dummy3 = false)
     {
-        $err =& PEAR::raiseError(null, $code, $mode, $options,
+        $err = PEAR::raiseError(null, $code, $mode, $options,
                                 $userinfo, 'MDB2_Schema_Error', true);
         return $err;
     }
@@ -2717,7 +2748,7 @@ class MDB2_Schema extends PEAR
      * @return  bool  true if parameter is an error
      * @access  public
      */
-    function isError($data, $code = null)
+    static function isError($data, $code = null)
     {
         if (is_a($data, 'MDB2_Schema_Error')) {
             if (is_null($code)) {
@@ -2764,4 +2795,3 @@ class MDB2_Schema_Error extends PEAR_Error
             $mode, $level, $debuginfo);
     }
 }
-?>
diff --git a/3rdparty/MDB2/Schema/Parser.php b/3rdparty/MDB2/Schema/Parser.php
index 9e8e74b6317bd6968f077a282a6e4f937f7fb674..cfd0c37d8a3a834234bb7d7b7b48c675c29f2ca7 100644
--- a/3rdparty/MDB2/Schema/Parser.php
+++ b/3rdparty/MDB2/Schema/Parser.php
@@ -1,8 +1,6 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
 /**
- * PHP versions 4 and 5
- *
- * Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
  * Stig. S. Bakken, Lukas Smith, Igor Feghali
  * All rights reserved.
  *
@@ -39,21 +37,17 @@
  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Christian Dickmann <dickmann@php.net>
- * Author: Igor Feghali <ifeghali@php.net>
- *
- * $Id: Parser.php,v 1.68 2008/11/30 03:34:00 clockwerx Exp $
+ * PHP version 5
  *
  * @category Database
  * @package  MDB2_Schema
  * @author   Christian Dickmann <dickmann@php.net>
  * @author   Igor Feghali <ifeghali@php.net>
  * @license  BSD http://www.opensource.org/licenses/bsd-license.php
- * @version  CVS: $Id: Parser.php,v 1.68 2008/11/30 03:34:00 clockwerx Exp $
+ * @version  SVN: $Id$
  * @link     http://pear.php.net/packages/MDB2_Schema
  */
 
-
 require_once 'XML/Parser.php';
 require_once 'MDB2/Schema/Validate.php';
 
@@ -114,27 +108,83 @@ class MDB2_Schema_Parser extends XML_Parser
 
     var $val;
 
+    /**
+     * PHP 5 constructor
+     *
+     * @param array $variables              mixed array with user defined schema
+     *                                      variables
+     * @param bool  $fail_on_invalid_names  array with reserved words per RDBMS
+     * @param array $structure              multi dimensional array with 
+     *                                      database schema and data
+     * @param array $valid_types            information of all valid fields 
+     *                                      types
+     * @param bool  $force_defaults         if true sets a default value to
+     *                                      field when not explicit
+     * @param int   $max_identifiers_length maximum allowed size for entities 
+     *                                      name
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
     function __construct($variables, $fail_on_invalid_names = true,
-                         $structure = false, $valid_types = array(),
-                         $force_defaults = true)
-    {
+        $structure = false, $valid_types = array(), $force_defaults = true,
+        $max_identifiers_length = null
+    ) {
         // force ISO-8859-1 due to different defaults for PHP4 and PHP5
         // todo: this probably needs to be investigated some more andcleaned up
-        parent::XML_Parser('ISO-8859-1');
+        parent::__construct('ISO-8859-1');
 
         $this->variables = $variables;
         $this->structure = $structure;
-        $this->val       =& new MDB2_Schema_Validate($fail_on_invalid_names, $valid_types, $force_defaults);
+        $this->val       = new MDB2_Schema_Validate(
+            $fail_on_invalid_names,
+            $valid_types,
+            $force_defaults,
+            $max_identifiers_length
+        );
     }
 
+    /**
+     * PHP 4 compatible constructor
+     *
+     * @param array $variables              mixed array with user defined schema
+     *                                      variables
+     * @param bool  $fail_on_invalid_names  array with reserved words per RDBMS
+     * @param array $structure              multi dimensional array with 
+     *                                      database schema and data
+     * @param array $valid_types            information of all valid fields 
+     *                                      types
+     * @param bool  $force_defaults         if true sets a default value to
+     *                                      field when not explicit
+     * @param int   $max_identifiers_length maximum allowed size for entities 
+     *                                      name
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
     function MDB2_Schema_Parser($variables, $fail_on_invalid_names = true,
-                                $structure = false, $valid_types = array(),
-                                $force_defaults = true)
-    {
+        $structure = false, $valid_types = array(), $force_defaults = true,
+        $max_identifiers_length = null
+    ) {
         $this->__construct($variables, $fail_on_invalid_names, $structure, $valid_types, $force_defaults);
     }
 
-    function startHandler($xp, $element, $attribs)
+    /**
+     * Triggered when reading a XML open tag <element>
+     *
+     * @param resource $xp      xml parser resource
+     * @param string   $element element name
+     * @param array    $attribs attributes
+     *
+     * @return void
+     * @access private
+     * @static
+     */
+    function startHandler($xp, $element, &$attribs)
     {
         if (strtolower($element) == 'variable') {
             $this->var_mode = true;
@@ -335,12 +385,21 @@ class MDB2_Schema_Parser extends XML_Parser
                 'start' => '',
                 'description' => '',
                 'comments' => '',
-                'on' => array('table' => '', 'field' => '')
             );
             break;
         }
     }
 
+    /**
+     * Triggered when reading a XML close tag </element>
+     *
+     * @param resource $xp      xml parser resource
+     * @param string   $element element name
+     *
+     * @return void
+     * @access private
+     * @static
+     */
     function endHandler($xp, $element)
     {
         if (strtolower($element) == 'variable') {
@@ -503,7 +562,21 @@ class MDB2_Schema_Parser extends XML_Parser
         $this->element = implode('-', $this->elements);
     }
 
-    function &raiseError($msg = null, $xmlecode = 0, $xp = null, $ecode = MDB2_SCHEMA_ERROR_PARSE)
+    /**
+     * Pushes a MDB2_Schema_Error into stack and returns it
+     *
+     * @param string   $msg      textual message
+     * @param int      $xmlecode PHP's XML parser error code
+     * @param resource $xp       xml parser resource
+     * @param int      $ecode    MDB2_Schema's error code
+     *
+     * @return object
+     * @access private
+     * @static
+     */
+    static function &raiseError($msg = null, $xmlecode = 0, $xp = null, $ecode = MDB2_SCHEMA_ERROR_PARSE, $userinfo = null,
+                         $error_class = null,
+                         $skipmsg = false)
     {
         if (is_null($this->error)) {
             $error = '';
@@ -530,11 +603,21 @@ class MDB2_Schema_Parser extends XML_Parser
 
             $error .= "\n";
 
-            $this->error =& MDB2_Schema::raiseError($ecode, null, null, $error);
+            $this->error = MDB2_Schema::raiseError($ecode, null, null, $error);
         }
         return $this->error;
     }
 
+    /**
+     * Triggered when reading data in a XML element (text between tags) 
+     *
+     * @param resource $xp   xml parser resource
+     * @param string   $data text
+     *
+     * @return void
+     * @access private
+     * @static
+     */
     function cdataHandler($xp, $data)
     {
         if ($this->var_mode == true) {
@@ -806,6 +889,9 @@ class MDB2_Schema_Parser extends XML_Parser
         case 'database-sequence-comments':
             $this->sequence['comments'] .= $data;
             break;
+        case 'database-sequence-on':
+            $this->sequence['on'] = array('table' => '', 'field' => '');
+            break;
         case 'database-sequence-on-table':
             $this->sequence['on']['table'] .= $data;
             break;
@@ -815,5 +901,3 @@ class MDB2_Schema_Parser extends XML_Parser
         }
     }
 }
-
-?>
diff --git a/3rdparty/MDB2/Schema/Parser2.php b/3rdparty/MDB2/Schema/Parser2.php
index 01318473fddf0163f89626aa14d0002ce5ed53f3..b415b4a336e7447de736c45c2bb04aff9acedab4 100644
--- a/3rdparty/MDB2/Schema/Parser2.php
+++ b/3rdparty/MDB2/Schema/Parser2.php
@@ -1,8 +1,6 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
 /**
- * PHP versions 4 and 5
- *
- * Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
  * Stig. S. Bakken, Lukas Smith, Igor Feghali
  * All rights reserved.
  *
@@ -39,13 +37,13 @@
  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Igor Feghali <ifeghali@php.net>
+ * PHP version 5
  *
  * @category Database
  * @package  MDB2_Schema
  * @author   Igor Feghali <ifeghali@php.net>
  * @license  BSD http://www.opensource.org/licenses/bsd-license.php
- * @version  CVS: $Id: Parser2.php,v 1.12 2008/11/30 03:34:00 clockwerx Exp $
+ * @version  SVN: $Id$
  * @link     http://pear.php.net/packages/MDB2_Schema
  */
 
@@ -100,8 +98,30 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
 
     var $init = array();
 
-    function __construct($variables, $fail_on_invalid_names = true, $structure = false, $valid_types = array(), $force_defaults = true)
-    {
+    /**
+     * PHP 5 constructor
+     *
+     * @param array $variables              mixed array with user defined schema
+     *                                      variables
+     * @param bool  $fail_on_invalid_names  array with reserved words per RDBMS
+     * @param array $structure              multi dimensional array with 
+     *                                      database schema and data
+     * @param array $valid_types            information of all valid fields 
+     *                                      types
+     * @param bool  $force_defaults         if true sets a default value to
+     *                                      field when not explicit
+     * @param int   $max_identifiers_length maximum allowed size for entities 
+     *                                      name
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
+    function __construct($variables, $fail_on_invalid_names = true,
+        $structure = false, $valid_types = array(), $force_defaults = true,
+        $max_identifiers_length = null
+    ) {
         // force ISO-8859-1 due to different defaults for PHP4 and PHP5
         // todo: this probably needs to be investigated some more and cleaned up
         $this->options['encoding'] = 'ISO-8859-1';
@@ -119,15 +139,44 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         $this->variables = $variables;
         $this->structure = $structure;
 
-        $this->val =& new MDB2_Schema_Validate($fail_on_invalid_names, $valid_types, $force_defaults);
+        $this->val = new MDB2_Schema_Validate($fail_on_invalid_names, $valid_types, $force_defaults);
         parent::XML_Unserializer($this->options);
     }
 
-    function MDB2_Schema_Parser2($variables, $fail_on_invalid_names = true, $structure = false, $valid_types = array(), $force_defaults = true)
-    {
+    /**
+     * PHP 4 compatible constructor
+     *
+     * @param array $variables              mixed array with user defined schema
+     *                                      variables
+     * @param bool  $fail_on_invalid_names  array with reserved words per RDBMS
+     * @param array $structure              multi dimensional array with 
+     *                                      database schema and data
+     * @param array $valid_types            information of all valid fields 
+     *                                      types
+     * @param bool  $force_defaults         if true sets a default value to
+     *                                      field when not explicit
+     * @param int   $max_identifiers_length maximum allowed size for entities 
+     *                                      name
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
+    function MDB2_Schema_Parser2($variables, $fail_on_invalid_names = true,
+        $structure = false, $valid_types = array(), $force_defaults = true,
+        $max_identifiers_length = null
+    ) {
         $this->__construct($variables, $fail_on_invalid_names, $structure, $valid_types, $force_defaults);
     }
 
+    /**
+     * Main method. Parses XML Schema File.
+     *
+     * @return bool|error object
+     *
+     * @access public
+     */
     function parse()
     {
         $result = $this->unserialize($this->filename, true);
@@ -140,18 +189,33 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         }
     }
 
+    /**
+     * Do the necessary stuff to set the input XML schema file
+     *
+     * @param string $filename full path to schema file
+     *
+     * @return boolean MDB2_OK on success
+     *
+     * @access public
+     */
     function setInputFile($filename)
     {
         $this->filename = $filename;
         return MDB2_OK;
     }
 
-    function renameKey(&$arr, $oKey, $nKey)
-    {
-        $arr[$nKey] = &$arr[$oKey];
-        unset($arr[$oKey]);
-    }
-
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at database level.
+     *
+     * @param array $database multi dimensional array with database definition 
+     *                        and data.
+     *
+     * @return bool|error     MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixDatabaseKeys($database)
     {
         $this->database_definition = array(
@@ -204,6 +268,18 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         return MDB2_OK;
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at table level.
+     *
+     * @param array $table multi dimensional array with table definition 
+     *                     and data.
+     *
+     * @return bool|error  MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixTableKeys($table)
     {
         $this->table = array(
@@ -279,6 +355,17 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         return MDB2_OK;
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at table field level.
+     *
+     * @param array $field array with table field definition
+     *
+     * @return bool|error  MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixTableFieldKeys($field)
     {
         $this->field = array();
@@ -328,6 +415,17 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         return MDB2_OK;
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at table index level.
+     *
+     * @param array $index array with table index definition
+     *
+     * @return bool|error  MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixTableIndexKeys($index)
     {
         $this->index = array(
@@ -389,6 +487,17 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         return MDB2_OK;
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at table constraint level.
+     *
+     * @param array $constraint array with table index definition
+     *
+     * @return bool|error MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixTableConstraintKeys($constraint) 
     {
         $this->constraint = array(
@@ -468,6 +577,18 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         return MDB2_OK;
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at table data level.
+     *
+     * @param array  $element multi dimensional array with query definition
+     * @param string $type    whether its a insert|update|delete query
+     *
+     * @return bool|error  MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixTableInitializationKeys($element, $type = '')
     {
         if (!empty($element['select']) && is_array($element['select'])) {
@@ -480,6 +601,43 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         $this->table['initialization'][] = array( 'type' => $type, 'data' => $this->init );
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works deeper at the table initialization level (data). At this 
+     * point we are look at one of the below:
+     *  
+     * <insert>
+     *       {field}+
+     * </insert>
+     *
+     * <select> (this is a select extracted off a insert-select query)
+     *       <table/>
+     *       {field}+
+     *       <where>
+     *             {expression}
+     *       </where>?
+     * </select>
+     * 
+     * <update>
+     *       {field}+
+     *       <where>
+     *             {expression}
+     *       </where>?
+     * </update>
+     *
+     * <delete>
+     *       <where>
+     *             {expression}
+     *       </where>
+     * </delete>
+     *
+     * @param array $element multi dimensional array with query definition
+     *
+     * @return bool|error  MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixTableInitializationDataKeys($element)
     {
         $this->init = array();
@@ -505,6 +663,22 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         }
     }
 
+    /**
+     * Recursively diggs into an "expression" element. According to our 
+     * documentation an "expression" element is of the kind:
+     *
+     * <expression>
+     *       <null/> or <value/> or <column/> or {function} or {expression}
+     *       <operator/>
+     *       <null/> or <value/> or <column/> or {function} or {expression}
+     * </expression>
+     *
+     * @param array &$arr reference to current element definition
+     *
+     * @return void
+     *
+     * @access private
+     */
     function setExpression(&$arr)
     {
         $element = each($arr);
@@ -555,6 +729,30 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         }
     }
 
+    /**
+     * Enforce the default values for mandatory keys and ensure everything goes 
+     * always in the same order (simulates the behaviour of the original 
+     * parser). Works at database sequences level. A "sequence" element looks
+     * like:
+     *
+     * <sequence>
+     *       <name/>
+     *       <was/>?
+     *       <start/>?
+     *       <description/>?
+     *       <comments/>?
+     *       <on>
+     *             <table/>
+     *             <field/>
+     *       </on>?
+     * </sequence>
+     *
+     * @param array $sequence multi dimensional array with sequence definition
+     *
+     * @return bool|error  MDB2_OK on success or error object
+     *
+     * @access private
+     */
     function fixSequenceKeys($sequence)
     {
         $this->sequence = array(
@@ -562,7 +760,6 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
             'start' => '',
             'description' => '',
             'comments' => '',
-            'on' => array('table' => '', 'field' => '')
         );
 
         if (!empty($sequence['name'])) {
@@ -610,15 +807,23 @@ class MDB2_Schema_Parser2 extends XML_Unserializer
         return MDB2_OK;
     }
 
+    /**
+     * Pushes a MDB2_Schema_Error into stack and returns it
+     *
+     * @param string $msg   textual message
+     * @param int    $ecode MDB2_Schema's error code
+     *
+     * @return object
+     * @access private
+     * @static
+     */
     function &raiseError($msg = null, $ecode = MDB2_SCHEMA_ERROR_PARSE)
     {
         if (is_null($this->error)) {
             $error = 'Parser error: '.$msg."\n";
 
-            $this->error =& MDB2_Schema::raiseError($ecode, null, null, $error);
+            $this->error = MDB2_Schema::raiseError($ecode, null, null, $error);
         }
         return $this->error;
     }
 }
-
-?>
diff --git a/3rdparty/MDB2/Schema/Reserved/ibase.php b/3rdparty/MDB2/Schema/Reserved/ibase.php
index b208abc83a383c6a4d792b7c25b9bbcedb10b6a8..d797822a4b96b3ea350701924e4539c7d4b67ce7 100644
--- a/3rdparty/MDB2/Schema/Reserved/ibase.php
+++ b/3rdparty/MDB2/Schema/Reserved/ibase.php
@@ -1,49 +1,51 @@
-<?php
-// {{{ Disclaimer, Licence, copyrights
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Lorenzo Alberton <l.alberton@quipo.it>                       |
-// +----------------------------------------------------------------------+
-//
-// }}}
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
+/**
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
+ * Stig. S. Bakken, Lukas Smith, Igor Feghali
+ * All rights reserved.
+ *
+ * MDB2_Schema enables users to maintain RDBMS independant schema files
+ * in XML that can be used to manipulate both data and database schemas
+ * This LICENSE is in the BSD license style.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,
+ * Lukas Smith, Igor Feghali nor the names of his contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * PHP version 5
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   Lorenzo Alberton <l.alberton@quipo.it>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @version  SVN: $Id$
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
 // {{{ $GLOBALS['_MDB2_Schema_Reserved']['ibase']
 /**
  * Has a list of reserved words of Interbase/Firebird
@@ -433,4 +435,3 @@ $GLOBALS['_MDB2_Schema_Reserved']['ibase'] = array(
     'ZONE',
 );
 // }}}
-?>
\ No newline at end of file
diff --git a/3rdparty/MDB2/Schema/Reserved/mssql.php b/3rdparty/MDB2/Schema/Reserved/mssql.php
index 74ac688578015f7c552854918cbe97ee4977a96e..7aa65f426f9a2f78526e07b7548d154ca2ceac2d 100644
--- a/3rdparty/MDB2/Schema/Reserved/mssql.php
+++ b/3rdparty/MDB2/Schema/Reserved/mssql.php
@@ -1,48 +1,52 @@
-<?php
-// {{{ Disclaimer, Licence, copyrights
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: David Coallier <davidc@php.net>                              |
-// +----------------------------------------------------------------------+
-// }}}
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
+/**
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
+ * Stig. S. Bakken, Lukas Smith, Igor Feghali
+ * All rights reserved.
+ *
+ * MDB2_Schema enables users to maintain RDBMS independant schema files
+ * in XML that can be used to manipulate both data and database schemas
+ * This LICENSE is in the BSD license style.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,
+ * Lukas Smith, Igor Feghali nor the names of his contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * PHP version 5
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   David Coallier <davidc@php.net>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @version  SVN: $Id$
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
+
 // {{{ $GLOBALS['_MDB2_Schema_Reserved']['mssql']
 /**
  * Has a list of all the reserved words for mssql.
@@ -254,5 +258,3 @@ $GLOBALS['_MDB2_Schema_Reserved']['mssql'] = array(
     'SELECT',
 );
 //}}}
-
-?>
diff --git a/3rdparty/MDB2/Schema/Reserved/mysql.php b/3rdparty/MDB2/Schema/Reserved/mysql.php
index 4f0575e0bb1018d21ad7cdc1f50c124f8f5b98f6..6a4338b261d58e6a5f6337c6f070ed32a0167cfe 100644
--- a/3rdparty/MDB2/Schema/Reserved/mysql.php
+++ b/3rdparty/MDB2/Schema/Reserved/mysql.php
@@ -1,50 +1,52 @@
-<?php
-// {{{ Disclaimer, Licence, copyrights
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: David Coallier <davidc@php.net>                              |
-// +----------------------------------------------------------------------+
-//
-// $Id: mysql.php,v 1.3 2006/03/01 12:16:40 lsmith Exp $
-// }}}
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
+/**
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
+ * Stig. S. Bakken, Lukas Smith, Igor Feghali
+ * All rights reserved.
+ *
+ * MDB2_Schema enables users to maintain RDBMS independant schema files
+ * in XML that can be used to manipulate both data and database schemas
+ * This LICENSE is in the BSD license style.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,
+ * Lukas Smith, Igor Feghali nor the names of his contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * PHP version 5
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   David Coallier <davidc@php.net>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @version  SVN: $Id$
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
+
 // {{{ $GLOBALS['_MDB2_Schema_Reserved']['mysql']
 /**
  * Has a list of reserved words of mysql
@@ -281,4 +283,3 @@ $GLOBALS['_MDB2_Schema_Reserved']['mysql'] = array(
     'ZEROFILL',
     );
     // }}}
-?>
diff --git a/3rdparty/MDB2/Schema/Reserved/oci8.php b/3rdparty/MDB2/Schema/Reserved/oci8.php
index 57fe12ddcab96ac1835ce133c68291add516a2f3..3cc898e1d68715a049900c50280d9efc39433f0c 100644
--- a/3rdparty/MDB2/Schema/Reserved/oci8.php
+++ b/3rdparty/MDB2/Schema/Reserved/oci8.php
@@ -1,48 +1,52 @@
-<?php
-// {{{ Disclaimer, Licence, copyrights
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: David Coallier <davidc@php.net>                              |
-// +----------------------------------------------------------------------+
-// }}}
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
+/**
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
+ * Stig. S. Bakken, Lukas Smith, Igor Feghali
+ * All rights reserved.
+ *
+ * MDB2_Schema enables users to maintain RDBMS independant schema files
+ * in XML that can be used to manipulate both data and database schemas
+ * This LICENSE is in the BSD license style.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,
+ * Lukas Smith, Igor Feghali nor the names of his contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * PHP version 5
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   David Coallier <davidc@php.net>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @version  SVN: $Id$
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
+
 // {{{ $GLOBALS['_MDB2_Schema_Reserved']['oci8']
 /**
  * Has a list of all the reserved words for oracle.
@@ -167,5 +171,3 @@ $GLOBALS['_MDB2_Schema_Reserved']['oci8'] = array(
     'WITH',
 );
 // }}}
-
-?>
diff --git a/3rdparty/MDB2/Schema/Reserved/pgsql.php b/3rdparty/MDB2/Schema/Reserved/pgsql.php
index d358e9c12f033a42b806fb5645a4caa9d1a74ed5..84537685e0fb9113f347822fc433c9bfdad56381 100644
--- a/3rdparty/MDB2/Schema/Reserved/pgsql.php
+++ b/3rdparty/MDB2/Schema/Reserved/pgsql.php
@@ -1,49 +1,52 @@
-<?php
-// {{{ Disclaimer, Licence, copyrights
-// +----------------------------------------------------------------------+
-// | PHP versions 4 and 5                                                 |
-// +----------------------------------------------------------------------+
-// | Copyright (c) 1998-2006 Manuel Lemos, Tomas V.V.Cox,                 |
-// | Stig. S. Bakken, Lukas Smith                                         |
-// | All rights reserved.                                                 |
-// +----------------------------------------------------------------------+
-// | MDB2 is a merge of PEAR DB and Metabases that provides a unified DB  |
-// | API as well as database abstraction for PHP applications.            |
-// | This LICENSE is in the BSD license style.                            |
-// |                                                                      |
-// | Redistribution and use in source and binary forms, with or without   |
-// | modification, are permitted provided that the following conditions   |
-// | are met:                                                             |
-// |                                                                      |
-// | Redistributions of source code must retain the above copyright       |
-// | notice, this list of conditions and the following disclaimer.        |
-// |                                                                      |
-// | Redistributions in binary form must reproduce the above copyright    |
-// | notice, this list of conditions and the following disclaimer in the  |
-// | documentation and/or other materials provided with the distribution. |
-// |                                                                      |
-// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
-// | Lukas Smith nor the names of his contributors may be used to endorse |
-// | or promote products derived from this software without specific prior|
-// | written permission.                                                  |
-// |                                                                      |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
-// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
-// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
-// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
-// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
-// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
-// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
-// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
-// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
-// | POSSIBILITY OF SUCH DAMAGE.                                          |
-// +----------------------------------------------------------------------+
-// | Author: Marcelo Santos Araujo <msaraujo@php.net>                     |
-// +----------------------------------------------------------------------+
-//
-// }}}
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
+/**
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
+ * Stig. S. Bakken, Lukas Smith, Igor Feghali
+ * All rights reserved.
+ *
+ * MDB2_Schema enables users to maintain RDBMS independant schema files
+ * in XML that can be used to manipulate both data and database schemas
+ * This LICENSE is in the BSD license style.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,
+ * Lukas Smith, Igor Feghali nor the names of his contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * PHP version 5
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   Marcelo Santos Araujo <msaraujo@php.net>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @version  SVN: $Id$
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
+
 // {{{ $GLOBALS['_MDB2_Schema_Reserved']['pgsql']
 /**
  * Has a list of reserved words of pgsql
@@ -143,5 +146,3 @@ $GLOBALS['_MDB2_Schema_Reserved']['pgsql'] = array(
     'WHERE'
 );
 // }}}
-?>
-
diff --git a/3rdparty/MDB2/Schema/Tool.php b/3rdparty/MDB2/Schema/Tool.php
index 9689a0f6d73ef6ee01d01246a1f4e1b449af6333..3210c9173ebd49acccf26597bd9fc8c80886432e 100644
--- a/3rdparty/MDB2/Schema/Tool.php
+++ b/3rdparty/MDB2/Schema/Tool.php
@@ -1,8 +1,6 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
 /**
- * PHP versions 4 and 5
- *
- * Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
  * Stig. S. Bakken, Lukas Smith, Igor Feghali
  * All rights reserved.
  *
@@ -39,14 +37,13 @@
  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Christian Weiske <cweiske@php.net>
- * $Id: Tool.php,v 1.6 2008/12/13 00:26:07 clockwerx Exp $
+ * PHP version 5
  *
  * @category Database
  * @package  MDB2_Schema
  * @author   Christian Weiske <cweiske@php.net>
  * @license  BSD http://www.opensource.org/licenses/bsd-license.php
- * @version  CVS: $Id: Tool.php,v 1.6 2008/12/13 00:26:07 clockwerx Exp $
+ * @version  SVN: $Id$
  * @link     http://pear.php.net/packages/MDB2_Schema
  */
 
@@ -152,7 +149,9 @@ class MDB2_Schema_Tool
         case '--init':
             return 'init';
         default:
-            throw new MDB2_Schema_Tool_ParameterException("Unknown mode \"$arg\"");
+            throw new MDB2_Schema_Tool_ParameterException(
+                "Unknown mode \"$arg\""
+            );
         }
     }//protected function getAction(&$args)
 
@@ -179,7 +178,8 @@ class MDB2_Schema_Tool
     */
     protected function doHelp()
     {
-        self::toStdErr(<<<EOH
+        self::toStdErr(
+<<<EOH
 Usage: mdb2_schematool mode parameters
 
 Works with database schemas
@@ -205,7 +205,8 @@ EOH
     */
     protected function doHelpDump()
     {
-        self::toStdErr( <<<EOH
+        self::toStdErr(
+<<<EOH
 Usage: mdb2_schematool dump [all|data|schema] [-p] DSN
 
 Dumps a database schema to stdout
@@ -216,7 +217,8 @@ DSN: Data source name in the form of
  driver://user:password@host/database
 
 User and password may be omitted.
-Using -p reads password from stdin which is more secure than passing it in the parameter.
+Using -p reads password from stdin which is more secure than passing it in the 
+parameter.
 
 EOH
         );
@@ -231,7 +233,8 @@ EOH
     */
     protected function doHelpInit()
     {
-        self::toStdErr( <<<EOH
+        self::toStdErr(
+<<<EOH
 Usage: mdb2_schematool init source [-p] destination
 
 Initializes a database with data
@@ -244,7 +247,8 @@ DSN: Data source name in the form of
  driver://user:password@host/database
 
 User and password may be omitted.
-Using -p reads password from stdin which is more secure than passing it in the parameter.
+Using -p reads password from stdin which is more secure than passing it in the 
+parameter.
 
 EOH
         );
@@ -259,7 +263,8 @@ EOH
     */
     protected function doHelpLoad()
     {
-        self::toStdErr( <<<EOH
+        self::toStdErr(
+<<<EOH
 Usage: mdb2_schematool load [-p] source [-p] destination
 
 Loads a database schema from source to destination
@@ -272,7 +277,8 @@ DSN: Data source name in the form of
  driver://user:password@host/database
 
 User and password may be omitted.
-Using -p reads password from stdin which is more secure than passing it in the parameter.
+Using -p reads password from stdin which is more secure than passing it in the 
+parameter.
 
 EOH
         );
@@ -334,7 +340,9 @@ EOH
     protected function getFileOrDsn(&$args)
     {
         if (count($args) == 0) {
-            throw new MDB2_Schema_Tool_ParameterException('File or DSN expected');
+            throw new MDB2_Schema_Tool_ParameterException(
+                'File or DSN expected'
+            );
         }
 
         $arg = array_shift($args);
@@ -450,7 +458,8 @@ EOH
         list($type, $dsn) = $this->getFileOrDsn($args);
         if ($type == 'file') {
             throw new MDB2_Schema_Tool_ParameterException(
-                'Dumping a schema file as a schema file does not make much sense'
+                'Dumping a schema file as a schema file does not make much ' .
+                'sense'
             );
         }
 
@@ -503,8 +512,14 @@ EOH
             $definition = $schemaDest->parseDatabaseDefinitionFile($dsnSource);
             $where      = 'loading schema file';
         } else {
-            $schemaSource = MDB2_Schema::factory($dsnSource, $this->getSchemaOptions());
-            $this->throwExceptionOnError($schemaSource, 'connecting to source database');
+            $schemaSource = MDB2_Schema::factory(
+                $dsnSource,
+                $this->getSchemaOptions()
+            );
+            $this->throwExceptionOnError(
+                $schemaSource,
+                'connecting to source database'
+            );
 
             $definition = $schemaSource->getDefinitionFromDatabase();
             $where      = 'loading definition from database';
@@ -514,7 +529,11 @@ EOH
 
         //create destination database from definition
         $simulate = false;
-        $op       = $schemaDest->createDatabase($definition, array(), $simulate);
+        $op       = $schemaDest->createDatabase(
+            $definition,
+            array(),
+            $simulate
+        );
         $this->throwExceptionOnError($op, 'creating the database');
     }//protected function doLoad($args)
 
@@ -545,10 +564,16 @@ EOH
         }
 
         $schemaDest = MDB2_Schema::factory($dsnDest, $this->getSchemaOptions());
-        $this->throwExceptionOnError($schemaDest, 'connecting to destination database');
+        $this->throwExceptionOnError(
+            $schemaDest,
+            'connecting to destination database'
+        );
 
         $definition = $schemaDest->getDefinitionFromDatabase();
-        $this->throwExceptionOnError($definition, 'loading definition from database');
+        $this->throwExceptionOnError(
+            $definition,
+            'loading definition from database'
+        );
 
         $op = $schemaDest->writeInitialization($dsnSource, $definition);
         $this->throwExceptionOnError($op, 'initializing database');
@@ -556,5 +581,3 @@ EOH
 
 
 }//class MDB2_Schema_Tool
-
-?>
diff --git a/3rdparty/MDB2/Schema/Tool/ParameterException.php b/3rdparty/MDB2/Schema/Tool/ParameterException.php
index fab1e03e250de7206d7ccf7f195354fb8edfc4a2..92bea69391722dda6fa09b1bbac162577b2a4744 100644
--- a/3rdparty/MDB2/Schema/Tool/ParameterException.php
+++ b/3rdparty/MDB2/Schema/Tool/ParameterException.php
@@ -1,6 +1,61 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
+/**
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
+ * Stig. S. Bakken, Lukas Smith, Igor Feghali
+ * All rights reserved.
+ *
+ * MDB2_Schema enables users to maintain RDBMS independant schema files
+ * in XML that can be used to manipulate both data and database schemas
+ * This LICENSE is in the BSD license style.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,
+ * Lukas Smith, Igor Feghali nor the names of his contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+ * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * PHP version 5
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   Christian Weiske <cweiske@php.net>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @version  SVN: $Id$
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
 
+/**
+ * To be implemented yet
+ *
+ * @category Database
+ * @package  MDB2_Schema
+ * @author   Christian Weiske <cweiske@php.net>
+ * @license  BSD http://www.opensource.org/licenses/bsd-license.php
+ * @link     http://pear.php.net/packages/MDB2_Schema
+ */
 class MDB2_Schema_Tool_ParameterException extends Exception
-{}
-
-?>
\ No newline at end of file
+{
+}
diff --git a/3rdparty/MDB2/Schema/Validate.php b/3rdparty/MDB2/Schema/Validate.php
index 21be024ce9fbbc883ea200aecbad1f7c038abcf7..4cff175576f1d7d702588b71bc20af066ab79ccf 100644
--- a/3rdparty/MDB2/Schema/Validate.php
+++ b/3rdparty/MDB2/Schema/Validate.php
@@ -1,8 +1,6 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
 /**
- * PHP versions 4 and 5
- *
- * Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
  * Stig. S. Bakken, Lukas Smith, Igor Feghali
  * All rights reserved.
  *
@@ -39,15 +37,14 @@
  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Christian Dickmann <dickmann@php.net>
- * Author: Igor Feghali <ifeghali@php.net>
+ * PHP version 5
  *
  * @category Database
  * @package  MDB2_Schema
  * @author   Christian Dickmann <dickmann@php.net>
  * @author   Igor Feghali <ifeghali@php.net>
  * @license  BSD http://www.opensource.org/licenses/bsd-license.php
- * @version  CVS: $Id: Validate.php,v 1.42 2008/11/30 03:34:00 clockwerx Exp $
+ * @version  SVN: $Id$
  * @link     http://pear.php.net/packages/MDB2_Schema
  */
 
@@ -70,11 +67,30 @@ class MDB2_Schema_Validate
 
     var $force_defaults = true;
 
+    var $max_identifiers_length = null;
+
     // }}}
     // {{{ constructor
 
-    function __construct($fail_on_invalid_names = true, $valid_types = array(), $force_defaults = true)
-    {
+    /**
+     * PHP 5 constructor
+     *
+     * @param bool  $fail_on_invalid_names  array with reserved words per RDBMS
+     * @param array $valid_types            information of all valid fields 
+     *                                      types
+     * @param bool  $force_defaults         if true sets a default value to
+     *                                      field when not explicit
+     * @param int   $max_identifiers_length maximum allowed size for entities 
+     *                                      name
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
+    function __construct($fail_on_invalid_names = true, $valid_types = array(),
+        $force_defaults = true, $max_identifiers_length = null
+    ) {
         if (empty($GLOBALS['_MDB2_Schema_Reserved'])) {
             $GLOBALS['_MDB2_Schema_Reserved'] = array();
         }
@@ -87,21 +103,49 @@ class MDB2_Schema_Validate
         } else {
             $this->fail_on_invalid_names = array();
         }
-        $this->valid_types    = $valid_types;
-        $this->force_defaults = $force_defaults;
+        $this->valid_types            = $valid_types;
+        $this->force_defaults         = $force_defaults;
+        $this->max_identifiers_length = $max_identifiers_length;
     }
 
-    function MDB2_Schema_Validate($fail_on_invalid_names = true, $valid_types = array(), $force_defaults = true)
-    {
+    /**
+     * PHP 4 compatible constructor
+     *
+     * @param bool  $fail_on_invalid_names  array with reserved words per RDBMS
+     * @param array $valid_types            information of all valid fields 
+     *                                      types
+     * @param bool  $force_defaults         if true sets a default value to
+     *                                      field when not explicit
+     * @param int   $max_identifiers_length maximum allowed size for entities 
+     *                                      name
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
+    function MDB2_Schema_Validate($fail_on_invalid_names = true, $valid_types = array(),
+        $force_defaults = true, $max_identifiers_length = null
+    ) {
         $this->__construct($fail_on_invalid_names, $valid_types, $force_defaults);
     }
 
     // }}}
     // {{{ raiseError()
 
+    /**
+     * Pushes a MDB2_Schema_Error into stack and returns it
+     *
+     * @param int    $ecode MDB2_Schema's error code
+     * @param string $msg   textual message
+     *
+     * @return object
+     * @access private
+     * @static
+     */
     function &raiseError($ecode, $msg = null)
     {
-        $error =& MDB2_Schema::raiseError($ecode, null, null, $msg);
+        $error = MDB2_Schema::raiseError($ecode, null, null, $msg);
         return $error;
     }
 
@@ -176,27 +220,18 @@ class MDB2_Schema_Validate
      */
     function validateTable($tables, &$table, $table_name)
     {
-        /* Have we got a name? */
-        if (!$table_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'a table has to have a name');
-        }
-
         /* Table name duplicated? */
         if (is_array($tables) && isset($tables[$table_name])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
                 'table "'.$table_name.'" already exists');
         }
 
-        /* Table name reserved? */
-        if (is_array($this->fail_on_invalid_names)) {
-            $name = strtoupper($table_name);
-            foreach ($this->fail_on_invalid_names as $rdbms) {
-                if (in_array($name, $GLOBALS['_MDB2_Schema_Reserved'][$rdbms])) {
-                    return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                        'table name "'.$table_name.'" is a reserved word in: '.$rdbms);
-                }
-            }
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($table_name, 'table');
+        if (PEAR::isError($result)) {
+            return $result;
         }
 
         /* Was */
@@ -289,10 +324,12 @@ class MDB2_Schema_Validate
      */
     function validateField($fields, &$field, $field_name)
     {
-        /* Have we got a name? */
-        if (!$field_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'field name missing');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($field_name, 'field');
+        if (PEAR::isError($result)) {
+            return $result;
         }
 
         /* Field name duplicated? */
@@ -301,17 +338,6 @@ class MDB2_Schema_Validate
                 'field "'.$field_name.'" already exists');
         }
 
-        /* Field name reserverd? */
-        if (is_array($this->fail_on_invalid_names)) {
-            $name = strtoupper($field_name);
-            foreach ($this->fail_on_invalid_names as $rdbms) {
-                if (in_array($name, $GLOBALS['_MDB2_Schema_Reserved'][$rdbms])) {
-                    return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                        'field name "'.$field_name.'" is a reserved word in: '.$rdbms);
-                }
-            }
-        }
-
         /* Type check */
         if (empty($field['type'])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
@@ -422,10 +448,14 @@ class MDB2_Schema_Validate
      */
     function validateIndex($table_indexes, &$index, $index_name)
     {
-        if (!$index_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'an index has to have a name');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($index_name, 'index');
+        if (PEAR::isError($result)) {
+            return $result;
         }
+
         if (is_array($table_indexes) && isset($table_indexes[$index_name])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
                 'index "'.$index_name.'" already exists');
@@ -470,14 +500,18 @@ class MDB2_Schema_Validate
      */
     function validateIndexField($index_fields, &$field, $field_name)
     {
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($field_name, 'index field');
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+
         if (is_array($index_fields) && isset($index_fields[$field_name])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
                 'index field "'.$field_name.'" already exists');
         }
-        if (!$field_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'the index-field-name is required');
-        }
         if (empty($field['sorting'])) {
             $field['sorting'] = 'ascending';
         } elseif ($field['sorting'] !== 'ascending' && $field['sorting'] !== 'descending') {
@@ -506,10 +540,14 @@ class MDB2_Schema_Validate
      */
     function validateConstraint($table_constraints, &$constraint, $constraint_name)
     {
-        if (!$constraint_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'a foreign key has to have a name');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($constraint_name, 'foreign key');
+        if (PEAR::isError($result)) {
+            return $result;
         }
+
         if (is_array($table_constraints) && isset($table_constraints[$constraint_name])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
                 'foreign key "'.$constraint_name.'" already exists');
@@ -555,10 +593,14 @@ class MDB2_Schema_Validate
      */
     function validateConstraintField($constraint_fields, $field_name)
     {
-        if (!$field_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'empty value for foreign-field');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($field_name, 'foreign key field');
+        if (PEAR::isError($result)) {
+            return $result;
         }
+
         if (is_array($constraint_fields) && isset($constraint_fields[$field_name])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
                 'foreign field "'.$field_name.'" already exists');
@@ -582,10 +624,14 @@ class MDB2_Schema_Validate
      */
     function validateConstraintReferencedField($referenced_fields, $field_name)
     {
-        if (!$field_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'empty value for referenced foreign-field');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($field_name, 'referenced foreign field');
+        if (PEAR::isError($result)) {
+            return $result;
         }
+
         if (is_array($referenced_fields) && isset($referenced_fields[$field_name])) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
                 'foreign field "'.$field_name.'" already referenced');
@@ -612,9 +658,12 @@ class MDB2_Schema_Validate
      */
     function validateSequence($sequences, &$sequence, $sequence_name)
     {
-        if (!$sequence_name) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'a sequence has to have a name');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($sequence_name, 'sequence');
+        if (PEAR::isError($result)) {
+            return $result;
         }
 
         if (is_array($sequences) && isset($sequences[$sequence_name])) {
@@ -661,21 +710,17 @@ class MDB2_Schema_Validate
      */
     function validateDatabase(&$database)
     {
-        /* Have we got a name? */
-        if (!is_array($database) || !isset($database['name']) || !$database['name']) {
+        if (!is_array($database)) {
             return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'a database has to have a name');
+                'something wrong went with database definition');
         }
 
-        /* Database name reserved? */
-        if (is_array($this->fail_on_invalid_names)) {
-            $name = strtoupper($database['name']);
-            foreach ($this->fail_on_invalid_names as $rdbms) {
-                if (in_array($name, $GLOBALS['_MDB2_Schema_Reserved'][$rdbms])) {
-                    return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                        'database name "'.$database['name'].'" is a reserved word in: '.$rdbms);
-                }
-            }
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($database['name'], 'database');
+        if (PEAR::isError($result)) {
+            return $result;
         }
 
         /* Create */
@@ -798,9 +843,12 @@ class MDB2_Schema_Validate
      */
     function validateDataField($table_fields, $instruction_fields, &$field)
     {
-        if (!$field['name']) {
-            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
-                'field-name has to be specified');
+        /**
+         * Valid name ?
+         */
+        $result = $this->validateIdentifier($field['name'], 'field');
+        if (PEAR::isError($result)) {
+            return $result;
         }
 
         if (is_array($instruction_fields) && isset($instruction_fields[$field['name']])) {
@@ -917,6 +965,62 @@ class MDB2_Schema_Validate
         }
         return MDB2_OK;
     }
-}
 
-?>
+    // }}}
+    // {{{ validateIdentifier()
+
+    /**
+     * Checks whether a given identifier is valid for current driver.
+     *
+     * @param string $id   identifier to check
+     * @param string $type whether identifier represents a table name, index, etc.
+     *
+     * @return bool|error object
+     *
+     * @access public
+     */
+    function validateIdentifier($id, $type)
+    {
+        $max_length = $this->max_identifiers_length;
+        $cur_length = strlen($id);
+
+        /**
+         * Have we got a name?
+         */
+        if (!$id) {
+            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
+                "a $type has to have a name");
+        }
+
+        /**
+         * Supported length ?
+         */
+        if ($max_length !== null
+            && $cur_length > $max_length
+        ) {
+            return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
+                "$type name '$id' is too long for current driver");
+        } elseif ($cur_length > 30) {
+            // FIXME: find a way to issue a warning in MDB2_Schema object
+            /* $this->warnings[] = "$type name '$id' might not be 
+            portable to other drivers"; */
+        }
+
+        /**
+         * Reserved ?
+         */
+        if (is_array($this->fail_on_invalid_names)) {
+            $name = strtoupper($id);
+            foreach ($this->fail_on_invalid_names as $rdbms) {
+                if (in_array($name, $GLOBALS['_MDB2_Schema_Reserved'][$rdbms])) {
+                    return $this->raiseError(MDB2_SCHEMA_ERROR_VALIDATE,
+                        "$type name '$id' is a reserved word in: $rdbms");
+                }
+            }
+        }
+
+        return MDB2_OK;
+    }
+
+    // }}}
+}
diff --git a/3rdparty/MDB2/Schema/Writer.php b/3rdparty/MDB2/Schema/Writer.php
index 5ae4918dc1d086af46f6e297a72c7af9d4105b1f..70a03168de6e559136f44dda037f849cc89f3e9e 100644
--- a/3rdparty/MDB2/Schema/Writer.php
+++ b/3rdparty/MDB2/Schema/Writer.php
@@ -1,8 +1,6 @@
-<?php
+<?php /* vim: se et ts=4 sw=4 sts=4 fdm=marker tw=80: */
 /**
- * PHP versions 4 and 5
- *
- * Copyright (c) 1998-2008 Manuel Lemos, Tomas V.V.Cox,
+ * Copyright (c) 1998-2010 Manuel Lemos, Tomas V.V.Cox,
  * Stig. S. Bakken, Lukas Smith, Igor Feghali
  * All rights reserved.
  *
@@ -39,15 +37,14 @@
  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * Author: Lukas Smith <smith@pooteeweet.org>
- * Author: Igor Feghali <ifeghali@php.net>
+ * PHP version 5
  *
  * @category Database
  * @package  MDB2_Schema
  * @author   Lukas Smith <smith@pooteeweet.org>
  * @author   Igor Feghali <ifeghali@php.net>
  * @license  BSD http://www.opensource.org/licenses/bsd-license.php
- * @version  CVS: $Id: Writer.php,v 1.40 2008/11/30 03:34:00 clockwerx Exp $
+ * @version  SVN: $Id$
  * @link     http://pear.php.net/packages/MDB2_Schema
  */
 
@@ -69,11 +66,33 @@ class MDB2_Schema_Writer
     // }}}
     // {{{ constructor
 
+    /**
+     * PHP 5 constructor
+     *
+     * @param array $valid_types information of all valid fields 
+     *                           types
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
     function __construct($valid_types = array())
     {
         $this->valid_types = $valid_types;
     }
 
+    /**
+     * PHP 4 compatible constructor
+     *
+     * @param array $valid_types information of all valid fields 
+     *                           types
+     *
+     * @return void
+     *
+     * @access public
+     * @static
+     */
     function MDB2_Schema_Writer($valid_types = array())
     {
         $this->__construct($valid_types);
@@ -87,15 +106,18 @@ class MDB2_Schema_Writer
      * callbacks etc.  Basically a wrapper for PEAR::raiseError
      * without the message string.
      *
-     * @param int|PEAR_Error $code    integer error code or and PEAR_Error instance
-     * @param int            $mode    error mode, see PEAR_Error docs
-     *                                error level (E_USER_NOTICE etc).  If error mode is
-     *                                PEAR_ERROR_CALLBACK, this is the callback function,
-     *                                either as a function name, or as an array of an
-     *                                object and method name.  For other error modes this
-     *                                parameter is ignored.
-     * @param string         $options Extra debug information.  Defaults to the last
-     *                                query and native error code.
+     * @param int|PEAR_Error $code     integer error code or and PEAR_Error 
+     *                                 instance
+     * @param int            $mode     error mode, see PEAR_Error docs error
+     *                                 level (E_USER_NOTICE etc).  If error mode
+     *                                 is PEAR_ERROR_CALLBACK, this is the
+     *                                 callback function, either as a function
+     *                                 name, or as an array of an object and
+     *                                 method name.  For other error modes this
+     *                                 parameter is ignored.
+     * @param string         $options  Extra debug information. Defaults to the
+     *                                 last query and native error code.
+     * @param string         $userinfo User-friendly error message
      *
      * @return object  a PEAR error object
      * @access  public
@@ -103,7 +125,7 @@ class MDB2_Schema_Writer
      */
     function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
     {
-        $error =& MDB2_Schema::raiseError($code, $mode, $options, $userinfo);
+        $error = MDB2_Schema::raiseError($code, $mode, $options, $userinfo);
         return $error;
     }
 
@@ -578,4 +600,3 @@ class MDB2_Schema_Writer
 
     // }}}
 }
-?>
diff --git a/3rdparty/PEAR.php b/3rdparty/PEAR.php
index 2aa85259d62dc69c0cad3f38320bc82fdcf28af9..501f6a653d8a9e8741beca76ca4f2227790057f8 100644
--- a/3rdparty/PEAR.php
+++ b/3rdparty/PEAR.php
@@ -247,7 +247,7 @@ class PEAR
      * @access  public
      * @return  bool    true if parameter is an error
      */
-    function isError($data, $code = null)
+    static function isError($data, $code = null)
     {
         if (!is_a($data, 'PEAR_Error')) {
             return false;
@@ -469,7 +469,7 @@ class PEAR
      * @see PEAR::setErrorHandling
      * @since PHP 4.0.5
      */
-    function &raiseError($message = null,
+    static function &raiseError($message = null,
                          $code = null,
                          $mode = null,
                          $options = null,
@@ -555,11 +555,11 @@ class PEAR
     function &throwError($message = null, $code = null, $userinfo = null)
     {
         if (isset($this) && is_a($this, 'PEAR')) {
-            $a = &$this->raiseError($message, $code, null, null, $userinfo);
+            $a = $this->raiseError($message, $code, null, null, $userinfo);
             return $a;
         }
 
-        $a = &PEAR::raiseError($message, $code, null, null, $userinfo);
+        $a = PEAR::raiseError($message, $code, null, null, $userinfo);
         return $a;
     }
 
@@ -695,7 +695,7 @@ class PEAR
     * @param string $ext The extension name
     * @return bool Success or not on the dl() call
     */
-    function loadExtension($ext)
+    static function loadExtension($ext)
     {
         if (extension_loaded($ext)) {
             return true;
diff --git a/3rdparty/PEAR/Autoloader.php b/3rdparty/PEAR/Autoloader.php
index 0ed707ec842f577ca1649d74e0b4e3446170fb24..51620c7085f7d6a54864b31bde09d042fdea741a 100644
--- a/3rdparty/PEAR/Autoloader.php
+++ b/3rdparty/PEAR/Autoloader.php
@@ -144,7 +144,7 @@ class PEAR_Autoloader extends PEAR
             $include_file = preg_replace('/[^a-z0-9]/i', '_', $classname);
             include_once $include_file;
         }
-        $obj =& new $classname;
+        $obj = new $classname;
         $methods = get_class_methods($classname);
         foreach ($methods as $method) {
             // don't import priviate methods and constructors
diff --git a/3rdparty/PEAR/Command.php b/3rdparty/PEAR/Command.php
index db39b8f36f357f17dc97a2d463d4c5908a207fb4..13518d4e4b253574978b389b2bae4f64a0a3143f 100644
--- a/3rdparty/PEAR/Command.php
+++ b/3rdparty/PEAR/Command.php
@@ -133,8 +133,8 @@ class PEAR_Command
             $a = PEAR::raiseError("unknown command `$command'");
             return $a;
         }
-        $ui =& PEAR_Command::getFrontendObject();
-        $obj = &new $class($ui, $config);
+        $ui = PEAR_Command::getFrontendObject();
+        $obj = new $class($ui, $config);
         return $obj;
     }
 
@@ -149,7 +149,7 @@ class PEAR_Command
         if (!class_exists($class)) {
             return PEAR::raiseError("unknown command `$command'");
         }
-        $ui =& PEAR_Command::getFrontendObject();
+        $ui = PEAR_Command::getFrontendObject();
         $config = &PEAR_Config::singleton();
         $obj = &new $class($ui, $config);
         return $obj;
diff --git a/3rdparty/PEAR/Common.php b/3rdparty/PEAR/Common.php
index 3a8c7e80d33f83aae44ff7a7ebed70a969312d5d..83f2de742ac0e68db714cb5cd056e2c76495c4a3 100644
--- a/3rdparty/PEAR/Common.php
+++ b/3rdparty/PEAR/Common.php
@@ -168,7 +168,7 @@ class PEAR_Common extends PEAR
     function PEAR_Common()
     {
         parent::PEAR();
-        $this->config = &PEAR_Config::singleton();
+        $this->config = PEAR_Config::singleton();
         $this->debug = $this->config->get('verbose');
     }
 
diff --git a/3rdparty/PEAR/PackageFile/Generator/v1.php b/3rdparty/PEAR/PackageFile/Generator/v1.php
index 2f42f178d595c8b57f7d7ac9838e2008af8c3109..69a4818799e2f99d6964e4859c61e4dad1f08665 100644
--- a/3rdparty/PEAR/PackageFile/Generator/v1.php
+++ b/3rdparty/PEAR/PackageFile/Generator/v1.php
@@ -109,7 +109,7 @@ class PEAR_PackageFile_Generator_v1
         // }}}
         $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true);
         if ($packagexml) {
-            $tar =& new Archive_Tar($dest_package, $compress);
+            $tar = new Archive_Tar($dest_package, $compress);
             $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
             // ----- Creates with the package.xml file
             $ok = $tar->createModify(array($packagexml), '', $where);
diff --git a/3rdparty/PEAR/PackageFile/Generator/v2.php b/3rdparty/PEAR/PackageFile/Generator/v2.php
index 4d202df27d30602c0f9acb46ad2d3c59fd61faca..8250e0ac4d027a85d3776ff6244b8a5958c30f57 100644
--- a/3rdparty/PEAR/PackageFile/Generator/v2.php
+++ b/3rdparty/PEAR/PackageFile/Generator/v2.php
@@ -269,7 +269,7 @@ http://pear.php.net/dtd/package-2.0.xsd',
         $name       = $pf1 !== null ? 'package2.xml' : 'package.xml';
         $packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, $name);
         if ($packagexml) {
-            $tar =& new Archive_Tar($dest_package, $compress);
+            $tar = new Archive_Tar($dest_package, $compress);
             $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
             // ----- Creates with the package.xml file
             $ok = $tar->createModify(array($packagexml), '', $where);
diff --git a/3rdparty/XML/Parser.php b/3rdparty/XML/Parser.php
index a38a161aef9dae100925b8cdcafde59883254aaa..04dd348753d2949f7c08a45492c69ce9c30b262a 100644
--- a/3rdparty/XML/Parser.php
+++ b/3rdparty/XML/Parser.php
@@ -191,26 +191,6 @@ class XML_Parser extends PEAR
      */
     var $_validEncodings = array('ISO-8859-1', 'UTF-8', 'US-ASCII');
 
-    // }}}
-    // {{{ php4 constructor
-
-    /**
-     * Creates an XML parser.
-     *
-     * This is needed for PHP4 compatibility, it will
-     * call the constructor, when a new instance is created.
-     *
-     * @param string $srcenc source charset encoding, use NULL (default) to use
-     *                       whatever the document specifies
-     * @param string $mode   how this parser object should work, "event" for
-     *                       startelement/endelement-type events, "func"
-     *                       to have it call functions named after elements
-     * @param string $tgtenc a valid target encoding
-     */
-    function XML_Parser($srcenc = null, $mode = 'event', $tgtenc = null)
-    {
-        XML_Parser::__construct($srcenc, $mode, $tgtenc);
-    }
     // }}}
     // {{{ php5 constructor
 
@@ -364,7 +344,7 @@ class XML_Parser extends PEAR
             }
             $this->parser = $xp;
             $result       = $this->_initHandlers($this->mode);
-            if ($this->isError($result)) {
+            if (PEAR::isError($result)) {
                 return $result;
             }
             xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, $this->folding);
@@ -393,7 +373,7 @@ class XML_Parser extends PEAR
     function reset()
     {
         $result = $this->_create();
-        if ($this->isError($result)) {
+        if (PEAR::isError($result)) {
             return $result;
         }
         return true;
@@ -505,7 +485,7 @@ class XML_Parser extends PEAR
          * reset the parser
          */
         $result = $this->reset();
-        if ($this->isError($result)) {
+        if (PEAR::isError($result)) {
             return $result;
         }
         // if $this->fp was fopened previously
@@ -610,10 +590,16 @@ class XML_Parser extends PEAR
      *
      * @return XML_Parser_Error reference to the error object
      **/
-    function &raiseError($msg = null, $ecode = 0)
+    static function &raiseError($message = null,
+                         $code = 0,
+                         $mode = null,
+                         $options = null,
+                         $userinfo = null,
+                         $error_class = null,
+                         $skipmsg = false)
     {
         $msg = !is_null($msg) ? $msg : $this->parser;
-        $err = &new XML_Parser_Error($msg, $ecode);
+        $err = new XML_Parser_Error($msg, $ecode);
         return parent::raiseError($err);
     }
 
diff --git a/3rdparty/simpletest/test/acceptance_test.php b/3rdparty/simpletest/test/acceptance_test.php
deleted file mode 100644
index e96fe737e5fcdae82a72762bbbf5b9979ef4df4b..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/acceptance_test.php
+++ /dev/null
@@ -1,1729 +0,0 @@
-<?php
-// $Id: acceptance_test.php 2013 2011-04-29 09:29:45Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../compatibility.php');
-require_once(dirname(__FILE__) . '/../browser.php');
-require_once(dirname(__FILE__) . '/../web_tester.php');
-require_once(dirname(__FILE__) . '/../unit_tester.php');
-
-class SimpleTestAcceptanceTest extends WebTestCase {
-    static function samples() {
-        return 'http://www.lastcraft.com/test/';
-    }
-}
-
-class TestOfLiveBrowser extends UnitTestCase {
-    function samples() {
-        return SimpleTestAcceptanceTest::samples();
-    }
-
-    function testGet() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $this->assertTrue($browser->get($this->samples() . 'network_confirm.php'));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/', $browser->getContent());
-        $this->assertEqual($browser->getTitle(), 'Simple test target file');
-        $this->assertEqual($browser->getResponseCode(), 200);
-        $this->assertEqual($browser->getMimeType(), 'text/html');
-    }
-
-    function testPost() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $this->assertTrue($browser->post($this->samples() . 'network_confirm.php'));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/', $browser->getContent());
-    }
-
-    function testAbsoluteLinkFollowing() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($browser->clickLink('Absolute'));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-    }
-
-    function testRelativeEncodedLinkFollowing() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'link_confirm.php');
-        // Warning: the below data is ISO 8859-1 encoded
-        $this->assertTrue($browser->clickLink("m\xE4rc\xEAl kiek'eboe"));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-    }
-
-    function testRelativeLinkFollowing() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($browser->clickLink('Relative'));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-    }
-
-    function testUnifiedClickLinkClicking() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($browser->click('Relative'));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-    }
-
-    function testIdLinkFollowing() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($browser->clickLinkById(1));
-        $this->assertPattern('/target for the SimpleTest/', $browser->getContent());
-    }
-
-    function testCookieReading() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'set_cookies.php');
-        $this->assertEqual($browser->getCurrentCookieValue('session_cookie'), 'A');
-        $this->assertEqual($browser->getCurrentCookieValue('short_cookie'), 'B');
-        $this->assertEqual($browser->getCurrentCookieValue('day_cookie'), 'C');
-    }
-
-    function testSimpleSubmit() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'form.html');
-        $this->assertTrue($browser->clickSubmit('Go!'));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/', $browser->getContent());
-        $this->assertPattern('/go=\[Go!\]/', $browser->getContent());
-    }
-
-    function testUnifiedClickCanSubmit() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $browser->get($this->samples() . 'form.html');
-        $this->assertTrue($browser->click('Go!'));
-        $this->assertPattern('/go=\[Go!\]/', $browser->getContent());
-    }
-}
-
-class TestOfLocalFileBrowser extends UnitTestCase {
-    function samples() {
-        return 'file://'.dirname(__FILE__).'/site/';
-    }
-
-    function testGet() {
-        $browser = new SimpleBrowser();
-        $browser->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-        $this->assertTrue($browser->get($this->samples() . 'file.html'));
-        $this->assertPattern('/Link to SimpleTest/', $browser->getContent());
-        $this->assertEqual($browser->getTitle(), 'Link to SimpleTest');
-        $this->assertFalse($browser->getResponseCode());
-        $this->assertEqual($browser->getMimeType(), '');
-    }
-}
-
-class TestOfRequestMethods extends UnitTestCase {
-    function samples() {
-        return SimpleTestAcceptanceTest::samples();
-    }
-
-	function testHeadRequest() {
-		$browser = new SimpleBrowser();
-		$this->assertTrue($browser->head($this->samples() . 'request_methods.php'));
-		$this->assertEqual($browser->getResponseCode(), 202);
-	}
-
-	function testGetRequest() {
-		$browser = new SimpleBrowser();
-		$this->assertTrue($browser->get($this->samples() . 'request_methods.php'));
-		$this->assertEqual($browser->getResponseCode(), 405);
-	}
-
-	function testPostWithPlainEncoding() {
-		$browser = new SimpleBrowser();
-		$this->assertTrue($browser->post($this->samples() . 'request_methods.php', 'A content message'));
-		$this->assertEqual($browser->getResponseCode(), 406);
-		$this->assertPattern('/Please ensure content type is an XML format/', $browser->getContent());
-	}
-
-	function testPostWithXmlEncoding() {
-		$browser = new SimpleBrowser();
-		$this->assertTrue($browser->post($this->samples() . 'request_methods.php', '<a><b>c</b></a>', 'text/xml'));
-		$this->assertEqual($browser->getResponseCode(), 201);
-		$this->assertPattern('/c/', $browser->getContent());
-	}
-
-	function testPutWithPlainEncoding() {
-		$browser = new SimpleBrowser();
-		$this->assertTrue($browser->put($this->samples() . 'request_methods.php', 'A content message'));
-		$this->assertEqual($browser->getResponseCode(), 406);
-		$this->assertPattern('/Please ensure content type is an XML format/', $browser->getContent());
-	}
-
-	function testPutWithXmlEncoding() {
-		$browser = new SimpleBrowser();
-		$this->assertTrue($browser->put($this->samples() . 'request_methods.php', '<a><b>c</b></a>', 'application/xml'));
-		$this->assertEqual($browser->getResponseCode(), 201);
-		$this->assertPattern('/c/', $browser->getContent());
-	}
-
-	function testDeleteRequest() {
-		$browser = new SimpleBrowser();
-		$browser->delete($this->samples() . 'request_methods.php');
-		$this->assertEqual($browser->getResponseCode(), 202);
-		$this->assertPattern('/Your delete request was accepted/', $browser->getContent());
-	}
-
-}
-
-class TestRadioFields extends SimpleTestAcceptanceTest {
-    function testSetFieldAsInteger() {
-        $this->get($this->samples() . 'form_with_radio_buttons.html');
-        $this->assertTrue($this->setField('tested_field', 2));
-        $this->clickSubmitByName('send');
-        $this->assertEqual($this->getUrl(), $this->samples() . 'form_with_radio_buttons.html?tested_field=2&send=click+me');
-    }
-
-    function testSetFieldAsString() {
-        $this->get($this->samples() . 'form_with_radio_buttons.html');
-        $this->assertTrue($this->setField('tested_field', '2'));
-        $this->clickSubmitByName('send');
-        $this->assertEqual($this->getUrl(), $this->samples() . 'form_with_radio_buttons.html?tested_field=2&send=click+me');
-    }
-}
-
-class TestOfLiveFetching extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testFormWithArrayBasedInputs() {
-        $this->get($this->samples() . 'form_with_array_based_inputs.php');
-        $this->setField('value[]', '3', '1');
-        $this->setField('value[]', '4', '2');
-        $this->clickSubmit('Go');
-        $this->assertPattern('/QUERY_STRING : value%5B%5D=3&value%5B%5D=4&submit=Go/');
-    }
-
-    function testFormWithQuotedValues() {
-        $this->get($this->samples() . 'form_with_quoted_values.php');
-        $this->assertField('a', 'default');
-        $this->assertFieldById('text_field', 'default');
-        $this->clickSubmit('Go');
-        $this->assertPattern('/a=default&submit=Go/');
-    }
-
-    function testGet() {
-        $this->assertTrue($this->get($this->samples() . 'network_confirm.php'));
-        $this->assertEqual($this->getUrl(), $this->samples() . 'network_confirm.php');
-        $this->assertText('target for the SimpleTest');
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertTitle('Simple test target file');
-        $this->assertTitle(new PatternExpectation('/target file/'));
-        $this->assertResponse(200);
-        $this->assertMime('text/html');
-        $this->assertHeader('connection', 'close');
-        $this->assertHeader('connection', new PatternExpectation('/los/'));
-    }
-
-    function testSlowGet() {
-        $this->assertTrue($this->get($this->samples() . 'slow_page.php'));
-    }
-
-    function testTimedOutGet() {
-        $this->setConnectionTimeout(1);
-        $this->ignoreErrors();
-        $this->assertFalse($this->get($this->samples() . 'slow_page.php'));
-    }
-
-    function testPost() {
-        $this->assertTrue($this->post($this->samples() . 'network_confirm.php'));
-        $this->assertText('target for the SimpleTest');
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-    }
-
-    function testGetWithData() {
-        $this->get($this->samples() . 'network_confirm.php', array("a" => "aaa"));
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[aaa]');
-    }
-
-    function testPostWithData() {
-        $this->post($this->samples() . 'network_confirm.php', array("a" => "aaa"));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aaa]');
-    }
-
-    function testPostWithRecursiveData() {
-        $this->post($this->samples() . 'network_confirm.php', array("a" => "aaa"));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aaa]');
-
-        $this->post($this->samples() . 'network_confirm.php', array("a[aa]" => "aaa"));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aa=[aaa]]');
-
-        $this->post($this->samples() . 'network_confirm.php', array("a[aa][aaa]" => "aaaa"));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aa=[aaa=[aaaa]]]');
-
-        $this->post($this->samples() . 'network_confirm.php', array("a" => array("aa" => "aaa")));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aa=[aaa]]');
-
-        $this->post($this->samples() . 'network_confirm.php', array("a" => array("aa" => array("aaa" => "aaaa"))));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aa=[aaa=[aaaa]]]');
-    }
-
-    function testRelativeGet() {
-        $this->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($this->get('network_confirm.php'));
-        $this->assertText('target for the SimpleTest');
-    }
-
-    function testRelativePost() {
-        $this->post($this->samples() . 'link_confirm.php', array('a' => '123'));
-        $this->assertTrue($this->post('network_confirm.php'));
-        $this->assertText('target for the SimpleTest');
-    }
-}
-
-class TestOfLinkFollowing extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testLinkAssertions() {
-        $this->get($this->samples() . 'link_confirm.php');
-        $this->assertLink('Absolute', $this->samples() . 'network_confirm.php');
-        $this->assertLink('Absolute', new PatternExpectation('/confirm/'));
-        $this->assertClickable('Absolute');
-    }
-
-    function testAbsoluteLinkFollowing() {
-        $this->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($this->clickLink('Absolute'));
-        $this->assertText('target for the SimpleTest');
-    }
-
-    function testRelativeLinkFollowing() {
-        $this->get($this->samples() . 'link_confirm.php');
-        $this->assertTrue($this->clickLink('Relative'));
-        $this->assertText('target for the SimpleTest');
-    }
-
-    function testLinkIdFollowing() {
-        $this->get($this->samples() . 'link_confirm.php');
-        $this->assertLinkById(1);
-        $this->assertTrue($this->clickLinkById(1));
-        $this->assertText('target for the SimpleTest');
-    }
-
-    function testAbsoluteUrlBehavesAbsolutely() {
-        $this->get($this->samples() . 'link_confirm.php');
-        $this->get('http://www.lastcraft.com');
-        $this->assertText('No guarantee of quality is given or even intended');
-    }
-
-    function testRelativeUrlRespectsBaseTag() {
-        $this->get($this->samples() . 'base_tag/base_link.html');
-        $this->click('Back to test pages');
-        $this->assertTitle('Simple test target file');
-    }
-}
-
-class TestOfLivePageLinkingWithMinimalLinks extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testClickToExplicitelyNamedSelfReturns() {
-        $this->get($this->samples() . 'front_controller_style/a_page.php');
-        $this->assertEqual($this->getUrl(), $this->samples() . 'front_controller_style/a_page.php');
-        $this->assertTitle('Simple test page with links');
-        $this->assertLink('Self');
-        $this->clickLink('Self');
-        $this->assertTitle('Simple test page with links');
-    }
-
-    function testClickToMissingPageReturnsToSamePage() {
-        $this->get($this->samples() . 'front_controller_style/a_page.php');
-        $this->clickLink('No page');
-        $this->assertTitle('Simple test page with links');
-        $this->assertText('[action=no_page]');
-    }
-
-    function testClickToBareActionReturnsToSamePage() {
-        $this->get($this->samples() . 'front_controller_style/a_page.php');
-        $this->clickLink('Bare action');
-        $this->assertTitle('Simple test page with links');
-        $this->assertText('[action=]');
-    }
-
-    function testClickToSingleQuestionMarkReturnsToSamePage() {
-        $this->get($this->samples() . 'front_controller_style/a_page.php');
-        $this->clickLink('Empty query');
-        $this->assertTitle('Simple test page with links');
-    }
-
-    function testClickToEmptyStringReturnsToSamePage() {
-        $this->get($this->samples() . 'front_controller_style/a_page.php');
-        $this->clickLink('Empty link');
-        $this->assertTitle('Simple test page with links');
-    }
-
-    function testClickToSingleDotGoesToCurrentDirectory() {
-        $this->get($this->samples() . 'front_controller_style/a_page.php');
-        $this->clickLink('Current directory');
-        $this->assertTitle(
-                'Simple test front controller',
-                '%s -> index.php needs to be set as a default web server home page');
-    }
-
-    function testClickBackADirectoryLevel() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickLink('Down one');
-        $this->assertPattern('|Index of .*?/test|i');
-    }
-}
-
-class TestOfLiveFrontControllerEmulation extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testJumpToNamedPage() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->assertText('Simple test front controller');
-        $this->clickLink('Index');
-        $this->assertResponse(200);
-        $this->assertText('[action=index]');
-    }
-
-    function testJumpToUnnamedPage() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickLink('No page');
-        $this->assertResponse(200);
-        $this->assertText('Simple test front controller');
-        $this->assertText('[action=no_page]');
-    }
-
-    function testJumpToUnnamedPageWithBareParameter() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickLink('Bare action');
-        $this->assertResponse(200);
-        $this->assertText('Simple test front controller');
-        $this->assertText('[action=]');
-    }
-
-    function testJumpToUnnamedPageWithEmptyQuery() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickLink('Empty query');
-        $this->assertResponse(200);
-        $this->assertPattern('/Simple test front controller/');
-        $this->assertPattern('/raw get data.*?\[\].*?get data/si');
-    }
-
-    function testJumpToUnnamedPageWithEmptyLink() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickLink('Empty link');
-        $this->assertResponse(200);
-        $this->assertPattern('/Simple test front controller/');
-        $this->assertPattern('/raw get data.*?\[\].*?get data/si');
-    }
-
-    function testJumpBackADirectoryLevel() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickLink('Down one');
-        $this->assertPattern('|Index of .*?/test|');
-    }
-
-    function testSubmitToNamedPage() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->assertText('Simple test front controller');
-        $this->clickSubmit('Index');
-        $this->assertResponse(200);
-        $this->assertText('[action=Index]');
-    }
-
-    function testSubmitToSameDirectory() {
-        $this->get($this->samples() . 'front_controller_style/index.php');
-        $this->clickSubmit('Same directory');
-        $this->assertResponse(200);
-        $this->assertText('[action=Same+directory]');
-    }
-
-    function testSubmitToEmptyAction() {
-        $this->get($this->samples() . 'front_controller_style/index.php');
-        $this->clickSubmit('Empty action');
-        $this->assertResponse(200);
-        $this->assertText('[action=Empty+action]');
-    }
-
-    function testSubmitToNoAction() {
-        $this->get($this->samples() . 'front_controller_style/index.php');
-        $this->clickSubmit('No action');
-        $this->assertResponse(200);
-        $this->assertText('[action=No+action]');
-    }
-
-    function testSubmitBackADirectoryLevel() {
-        $this->get($this->samples() . 'front_controller_style/');
-        $this->clickSubmit('Down one');
-        $this->assertPattern('|Index of .*?/test|');
-    }
-
-    function testSubmitToNamedPageWithMixedPostAndGet() {
-        $this->get($this->samples() . 'front_controller_style/?a=A');
-        $this->assertText('Simple test front controller');
-        $this->clickSubmit('Index post');
-        $this->assertText('action=[Index post]');
-        $this->assertNoText('[a=A]');
-    }
-
-    function testSubmitToSameDirectoryMixedPostAndGet() {
-        $this->get($this->samples() . 'front_controller_style/index.php?a=A');
-        $this->clickSubmit('Same directory post');
-        $this->assertText('action=[Same directory post]');
-        $this->assertNoText('[a=A]');
-    }
-
-    function testSubmitToEmptyActionMixedPostAndGet() {
-        $this->get($this->samples() . 'front_controller_style/index.php?a=A');
-        $this->clickSubmit('Empty action post');
-        $this->assertText('action=[Empty action post]');
-        $this->assertText('[a=A]');
-    }
-
-    function testSubmitToNoActionMixedPostAndGet() {
-        $this->get($this->samples() . 'front_controller_style/index.php?a=A');
-        $this->clickSubmit('No action post');
-        $this->assertText('action=[No action post]');
-        $this->assertText('[a=A]');
-    }
-}
-
-class TestOfLiveHeaders extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testConfirmingHeaderExistence() {
-        $this->get('http://www.lastcraft.com/');
-        $this->assertHeader('content-type');
-        $this->assertHeader('content-type', 'text/html');
-        $this->assertHeader('content-type', new PatternExpectation('/HTML/i'));
-        $this->assertNoHeader('WWW-Authenticate');
-    }
-}
-
-class TestOfLiveRedirects extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testNoRedirects() {
-        $this->setMaximumRedirects(0);
-        $this->get($this->samples() . 'redirect.php');
-        $this->assertTitle('Redirection test');
-    }
-
-    function testRedirects() {
-        $this->setMaximumRedirects(1);
-        $this->get($this->samples() . 'redirect.php');
-        $this->assertTitle('Simple test target file');
-    }
-
-    function testRedirectLosesGetData() {
-        $this->get($this->samples() . 'redirect.php', array('a' => 'aaa'));
-        $this->assertNoText('a=[aaa]');
-    }
-
-    function testRedirectKeepsExtraRequestDataOfItsOwn() {
-        $this->get($this->samples() . 'redirect.php');
-        $this->assertText('r=[rrr]');
-    }
-
-    function testRedirectLosesPostData() {
-        $this->post($this->samples() . 'redirect.php', array('a' => 'aaa'));
-        $this->assertTitle('Simple test target file');
-        $this->assertNoText('a=[aaa]');
-    }
-
-    function testRedirectWithBaseUrlChange() {
-        $this->get($this->samples() . 'base_change_redirect.php');
-        $this->assertTitle('Simple test target file in folder');
-        $this->get($this->samples() . 'path/base_change_redirect.php');
-        $this->assertTitle('Simple test target file');
-    }
-
-    function testRedirectWithDoubleBaseUrlChange() {
-        $this->get($this->samples() . 'double_base_change_redirect.php');
-        $this->assertTitle('Simple test target file');
-    }
-}
-
-class TestOfLiveCookies extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function here() {
-        return new SimpleUrl($this->samples());
-    }
-
-    function thisHost() {
-        $here = $this->here();
-        return $here->getHost();
-    }
-
-    function thisPath() {
-        $here = $this->here();
-        return $here->getPath();
-    }
-
-    function testCookieSettingAndAssertions() {
-        $this->setCookie('a', 'Test cookie a');
-        $this->setCookie('b', 'Test cookie b', $this->thisHost());
-        $this->setCookie('c', 'Test cookie c', $this->thisHost(), $this->thisPath());
-        $this->get($this->samples() . 'network_confirm.php');
-        $this->assertText('Test cookie a');
-        $this->assertText('Test cookie b');
-        $this->assertText('Test cookie c');
-        $this->assertCookie('a');
-        $this->assertCookie('b', 'Test cookie b');
-        $this->assertTrue($this->getCookie('c') == 'Test cookie c');
-    }
-
-    function testNoCookieSetWhenCookiesDisabled() {
-        $this->setCookie('a', 'Test cookie a');
-        $this->ignoreCookies();
-        $this->get($this->samples() . 'network_confirm.php');
-        $this->assertNoText('Test cookie a');
-    }
-
-    function testCookieReading() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->assertCookie('session_cookie', 'A');
-        $this->assertCookie('short_cookie', 'B');
-        $this->assertCookie('day_cookie', 'C');
-    }
-
-    function testNoCookie() {
-        $this->assertNoCookie('aRandomCookie');
-    }
-
-    function testNoCookieReadingWhenCookiesDisabled() {
-        $this->ignoreCookies();
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->assertNoCookie('session_cookie');
-        $this->assertNoCookie('short_cookie');
-        $this->assertNoCookie('day_cookie');
-    }
-
-    function testCookiePatternAssertions() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->assertCookie('session_cookie', new PatternExpectation('/a/i'));
-    }
-
-    function testTemporaryCookieExpiry() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->restart();
-        $this->assertNoCookie('session_cookie');
-        $this->assertCookie('day_cookie', 'C');
-    }
-
-    function testTimedCookieExpiryWith100SecondMargin() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->ageCookies(3600);
-        $this->restart(time() + 100);
-        $this->assertNoCookie('session_cookie');
-        $this->assertNoCookie('hour_cookie');
-        $this->assertCookie('day_cookie', 'C');
-    }
-
-    function testNoClockOverDriftBy100Seconds() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->restart(time() + 200);
-        $this->assertNoCookie(
-                'short_cookie',
-                '%s -> Please check your computer clock setting if you are not using NTP');
-    }
-
-    function testNoClockUnderDriftBy100Seconds() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->restart(time() + 0);
-        $this->assertCookie(
-                'short_cookie',
-                'B',
-                '%s -> Please check your computer clock setting if you are not using NTP');
-    }
-
-    function testCookiePath() {
-        $this->get($this->samples() . 'set_cookies.php');
-        $this->assertNoCookie('path_cookie', 'D');
-        $this->get('./path/show_cookies.php');
-        $this->assertPattern('/path_cookie/');
-        $this->assertCookie('path_cookie', 'D');
-    }
-}
-
-class LiveTestOfForms extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testSimpleSubmit() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('go=[Go!]');
-    }
-
-    function testDefaultFormValues() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertFieldByName('a', '');
-        $this->assertFieldByName('b', 'Default text');
-        $this->assertFieldByName('c', '');
-        $this->assertFieldByName('d', 'd1');
-        $this->assertFieldByName('e', false);
-        $this->assertFieldByName('f', 'on');
-        $this->assertFieldByName('g', 'g3');
-        $this->assertFieldByName('h', 2);
-        $this->assertFieldByName('go', 'Go!');
-        $this->assertClickable('Go!');
-        $this->assertSubmit('Go!');
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('go=[Go!]');
-        $this->assertText('a=[]');
-        $this->assertText('b=[Default text]');
-        $this->assertText('c=[]');
-        $this->assertText('d=[d1]');
-        $this->assertNoText('e=[');
-        $this->assertText('f=[on]');
-        $this->assertText('g=[g3]');
-    }
-
-    function testFormSubmissionByButtonLabel() {
-        $this->get($this->samples() . 'form.html');
-        $this->setFieldByName('a', 'aaa');
-        $this->setFieldByName('b', 'bbb');
-        $this->setFieldByName('c', 'ccc');
-        $this->setFieldByName('d', 'D2');
-        $this->setFieldByName('e', 'on');
-        $this->setFieldByName('f', false);
-        $this->setFieldByName('g', 'g2');
-        $this->setFieldByName('h', 1);
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[aaa]');
-        $this->assertText('b=[bbb]');
-        $this->assertText('c=[ccc]');
-        $this->assertText('d=[d2]');
-        $this->assertText('e=[on]');
-        $this->assertNoText('f=[');
-        $this->assertText('g=[g2]');
-    }
-
-    function testAdditionalFormValues() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickSubmit('Go!', array('add' => 'A')));
-        $this->assertText('go=[Go!]');
-        $this->assertText('add=[A]');
-    }
-
-    function testFormSubmissionByName() {
-        $this->get($this->samples() . 'form.html');
-        $this->setFieldByName('a', 'A');
-        $this->assertTrue($this->clickSubmitByName('go'));
-        $this->assertText('a=[A]');
-    }
-
-    function testFormSubmissionByNameAndAdditionalParameters() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickSubmitByName('go', array('add' => 'A')));
-        $this->assertText('go=[Go!]');
-        $this->assertText('add=[A]');
-    }
-
-    function testFormSubmissionBySubmitButtonLabeledSubmit() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickSubmitByName('test'));
-        $this->assertText('test=[Submit]');
-    }
-
-    function testFormSubmissionWithIds() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertFieldById(1, '');
-        $this->assertFieldById(2, 'Default text');
-        $this->assertFieldById(3, '');
-        $this->assertFieldById(4, 'd1');
-        $this->assertFieldById(5, false);
-        $this->assertFieldById(6, 'on');
-        $this->assertFieldById(8, 'g3');
-        $this->assertFieldById(11, 2);
-        $this->setFieldById(1, 'aaa');
-        $this->setFieldById(2, 'bbb');
-        $this->setFieldById(3, 'ccc');
-        $this->setFieldById(4, 'D2');
-        $this->setFieldById(5, 'on');
-        $this->setFieldById(6, false);
-        $this->setFieldById(8, 'g2');
-        $this->setFieldById(11, 'H1');
-        $this->assertTrue($this->clickSubmitById(99));
-        $this->assertText('a=[aaa]');
-        $this->assertText('b=[bbb]');
-        $this->assertText('c=[ccc]');
-        $this->assertText('d=[d2]');
-        $this->assertText('e=[on]');
-        $this->assertNoText('f=[');
-        $this->assertText('g=[g2]');
-        $this->assertText('h=[1]');
-        $this->assertText('go=[Go!]');
-    }
-
-    function testFormSubmissionWithIdsAndAdditionnalData() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickSubmitById(99, array('additionnal' => "data")));
-        $this->assertText('additionnal=[data]');
-    }
-
-    function testFormSubmissionWithLabels() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertField('Text A', '');
-        $this->assertField('Text B', 'Default text');
-        $this->assertField('Text area C', '');
-        $this->assertField('Selection D', 'd1');
-        $this->assertField('Checkbox E', false);
-        $this->assertField('Checkbox F', 'on');
-        $this->assertField('3', 'g3');
-        $this->assertField('Selection H', 2);
-        $this->setField('Text A', 'aaa');
-        $this->setField('Text B', 'bbb');
-        $this->setField('Text area C', 'ccc');
-        $this->setField('Selection D', 'D2');
-        $this->setField('Checkbox E', 'on');
-        $this->setField('Checkbox F', false);
-        $this->setField('2', 'g2');
-        $this->setField('Selection H', 'H1');
-        $this->clickSubmit('Go!');
-        $this->assertText('a=[aaa]');
-        $this->assertText('b=[bbb]');
-        $this->assertText('c=[ccc]');
-        $this->assertText('d=[d2]');
-        $this->assertText('e=[on]');
-        $this->assertNoText('f=[');
-        $this->assertText('g=[g2]');
-        $this->assertText('h=[1]');
-        $this->assertText('go=[Go!]');
-    }
-
-    function testSettingCheckboxWithBooleanTrueSetsUnderlyingValue() {
-        $this->get($this->samples() . 'form.html');
-        $this->setField('Checkbox E', true);
-        $this->assertField('Checkbox E', 'on');
-        $this->clickSubmit('Go!');
-        $this->assertText('e=[on]');
-    }
-
-    function testFormSubmissionWithMixedPostAndGet() {
-        $this->get($this->samples() . 'form_with_mixed_post_and_get.html');
-        $this->setField('Text A', 'Hello');
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[Hello]');
-        $this->assertText('x=[X]');
-        $this->assertText('y=[Y]');
-    }
-
-    function testFormSubmissionWithMixedPostAndEncodedGet() {
-        $this->get($this->samples() . 'form_with_mixed_post_and_get.html');
-        $this->setField('Text B', 'Hello');
-        $this->assertTrue($this->clickSubmit('Go encoded!'));
-        $this->assertText('b=[Hello]');
-        $this->assertText('x=[X]');
-        $this->assertText('y=[Y]');
-    }
-
-    function testFormSubmissionWithoutAction() {
-        $this->get($this->samples() . 'form_without_action.php?test=test');
-        $this->assertText('_GET : [test]');
-        $this->assertTrue($this->clickSubmit('Submit Post With Empty Action'));
-        $this->assertText('_GET : [test]');
-        $this->assertText('_POST : [test]');
-    }
-
-    function testImageSubmissionByLabel() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertImage('Image go!');
-        $this->assertTrue($this->clickImage('Image go!', 10, 12));
-        $this->assertText('go_x=[10]');
-        $this->assertText('go_y=[12]');
-    }
-
-    function testImageSubmissionByLabelWithAdditionalParameters() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickImage('Image go!', 10, 12, array('add' => 'A')));
-        $this->assertText('add=[A]');
-    }
-
-    function testImageSubmissionByName() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickImageByName('go', 10, 12));
-        $this->assertText('go_x=[10]');
-        $this->assertText('go_y=[12]');
-    }
-
-    function testImageSubmissionById() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickImageById(97, 10, 12));
-        $this->assertText('go_x=[10]');
-        $this->assertText('go_y=[12]');
-    }
-
-    function testButtonSubmissionByLabel() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->clickSubmit('Button go!', 10, 12));
-        $this->assertPattern('/go=\[ButtonGo\]/s');
-    }
-
-    function testNamelessSubmitSendsNoValue() {
-        $this->get($this->samples() . 'form_with_unnamed_submit.html');
-        $this->click('Go!');
-        $this->assertNoText('Go!');
-        $this->assertNoText('submit');
-    }
-
-    function testNamelessImageSendsXAndYValues() {
-        $this->get($this->samples() . 'form_with_unnamed_submit.html');
-        $this->clickImage('Image go!', 4, 5);
-        $this->assertNoText('ImageGo');
-        $this->assertText('x=[4]');
-        $this->assertText('y=[5]');
-    }
-
-    function testNamelessButtonSendsNoValue() {
-        $this->get($this->samples() . 'form_with_unnamed_submit.html');
-        $this->click('Button Go!');
-        $this->assertNoText('ButtonGo');
-    }
-
-    function testSelfSubmit() {
-        $this->get($this->samples() . 'self_form.php');
-        $this->assertNoText('[Submitted]');
-        $this->assertNoText('[Wrong form]');
-        $this->assertTrue($this->clickSubmit());
-        $this->assertText('[Submitted]');
-        $this->assertNoText('[Wrong form]');
-        $this->assertTitle('Test of form self submission');
-    }
-
-    function testSelfSubmitWithParameters() {
-        $this->get($this->samples() . 'self_form.php');
-        $this->setFieldByName('visible', 'Resent');
-        $this->assertTrue($this->clickSubmit());
-        $this->assertText('[Resent]');
-    }
-
-    function testSettingOfBlankOption() {
-        $this->get($this->samples() . 'form.html');
-        $this->assertTrue($this->setFieldByName('d', ''));
-        $this->clickSubmit('Go!');
-        $this->assertText('d=[]');
-    }
-
-    function testAssertingFieldValueWithPattern() {
-        $this->get($this->samples() . 'form.html');
-        $this->setField('c', 'A very long string');
-        $this->assertField('c', new PatternExpectation('/very long/'));
-    }
-
-    function testSendingMultipartFormDataEncodedForm() {
-        $this->get($this->samples() . 'form_data_encoded_form.html');
-        $this->assertField('Text A', '');
-        $this->assertField('Text B', 'Default text');
-        $this->assertField('Text area C', '');
-        $this->assertField('Selection D', 'd1');
-        $this->assertField('Checkbox E', false);
-        $this->assertField('Checkbox F', 'on');
-        $this->assertField('3', 'g3');
-        $this->assertField('Selection H', 2);
-        $this->setField('Text A', 'aaa');
-        $this->setField('Text B', 'bbb');
-        $this->setField('Text area C', 'ccc');
-        $this->setField('Selection D', 'D2');
-        $this->setField('Checkbox E', 'on');
-        $this->setField('Checkbox F', false);
-        $this->setField('2', 'g2');
-        $this->setField('Selection H', 'H1');
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[aaa]');
-        $this->assertText('b=[bbb]');
-        $this->assertText('c=[ccc]');
-        $this->assertText('d=[d2]');
-        $this->assertText('e=[on]');
-        $this->assertNoText('f=[');
-        $this->assertText('g=[g2]');
-        $this->assertText('h=[1]');
-        $this->assertText('go=[Go!]');
-    }
-
-    function testSettingVariousBlanksInFields() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->assertField('Text A', '');
-        $this->setField('Text A', '0');
-        $this->assertField('Text A', '0');
-        $this->assertField('Text area B', '');
-        $this->setField('Text area B', '0');
-        $this->assertField('Text area B', '0');
-        $this->assertField('Selection D', '');
-        $this->setField('Selection D', 'D2');
-        $this->assertField('Selection D', 'D2');
-        $this->setField('Selection D', 'D3');
-        $this->assertField('Selection D', '0');
-        $this->setField('Selection D', 'D4');
-        $this->assertField('Selection D', '?');
-        $this->assertField('Checkbox E', '');
-        $this->assertField('Checkbox F', 'on');
-        $this->assertField('Checkbox G', '0');
-        $this->assertField('Checkbox H', '?');
-        $this->assertFieldByName('i', 'on');
-        $this->setFieldByName('i', '');
-        $this->assertFieldByName('i', '');
-        $this->setFieldByName('i', '0');
-        $this->assertFieldByName('i', '0');
-        $this->setFieldByName('i', '?');
-        $this->assertFieldByName('i', '?');
-    }
-
-    function testDefaultValueOfTextareaHasNewlinesAndWhitespacePreserved() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->assertField('Text area C', '                ');
-    }
-
-    function chars($t) {
-        for ($i = 0; $i < strlen($t); $i++) {
-            print "[$t[$i]]";
-        }
-    }
-
-    function testSubmissionOfBlankFields() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->setField('Text A', '');
-        $this->setField('Text area B', '');
-        $this->setFieldByName('i', '');
-        $this->click('Go!');
-        $this->assertText('a=[]');
-        $this->assertText('b=[]');
-        $this->assertText('d=[]');
-        $this->assertText('e=[]');
-        $this->assertText('i=[]');
-    }
-
-    function testDefaultValueOfTextareaHasNewlinesAndWhitespacePreservedOnSubmission() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->click('Go!');
-        $this->assertPattern('/c=\[                \]/');
-    }
-
-    function testSubmissionOfEmptyValues() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->setField('Selection D', 'D2');
-        $this->click('Go!');
-        $this->assertText('a=[]');
-        $this->assertText('b=[]');
-        $this->assertText('d=[D2]');
-        $this->assertText('f=[on]');
-        $this->assertText('i=[on]');
-    }
-
-    function testSubmissionOfZeroes() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->setField('Text A', '0');
-        $this->setField('Text area B', '0');
-        $this->setField('Selection D', 'D3');
-        $this->setFieldByName('i', '0');
-        $this->click('Go!');
-        $this->assertText('a=[0]');
-        $this->assertText('b=[0]');
-        $this->assertText('d=[0]');
-        $this->assertText('g=[0]');
-        $this->assertText('i=[0]');
-    }
-
-    function testSubmissionOfQuestionMarks() {
-        $this->get($this->samples() . 'form_with_false_defaults.html');
-        $this->setField('Text A', '?');
-        $this->setField('Text area B', '?');
-        $this->setField('Selection D', 'D4');
-        $this->setFieldByName('i', '?');
-        $this->click('Go!');
-        $this->assertText('a=[?]');
-        $this->assertText('b=[?]');
-        $this->assertText('d=[?]');
-        $this->assertText('h=[?]');
-        $this->assertText('i=[?]');
-    }
-
-    function testSubmissionOfHtmlEncodedValues() {
-        $this->get($this->samples() . 'form_with_tricky_defaults.html');
-        $this->assertField('Text A', '&\'"<>');
-        $this->assertField('Text B', '"');
-        $this->assertField('Text area C', '&\'"<>');
-        $this->assertField('Selection D', "'");
-        $this->assertField('Checkbox E', '&\'"<>');
-        $this->assertField('Checkbox F', false);
-        $this->assertFieldByname('i', "'");
-        $this->click('Go!');
-        $this->assertText('a=[&\'"<>, "]');
-        $this->assertText('c=[&\'"<>]');
-        $this->assertText("d=[']");
-        $this->assertText('e=[&\'"<>]');
-        $this->assertText("i=[']");
-    }
-
-    function testFormActionRespectsBaseTag() {
-        $this->get($this->samples() . 'base_tag/form.html');
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('go=[Go!]');
-        $this->assertText('a=[]');
-    }
-}
-
-class TestOfLiveMultiValueWidgets extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testDefaultFormValueSubmission() {
-        $this->get($this->samples() . 'multiple_widget_form.html');
-        $this->assertFieldByName('a', array('a2', 'a3'));
-        $this->assertFieldByName('b', array('b2', 'b3'));
-        $this->assertFieldByName('c[]', array('c2', 'c3'));
-        $this->assertFieldByName('d', array('2', '3'));
-        $this->assertFieldByName('e', array('2', '3'));
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[a2, a3]');
-        $this->assertText('b=[b2, b3]');
-        $this->assertText('c=[c2, c3]');
-        $this->assertText('d=[2, 3]');
-        $this->assertText('e=[2, 3]');
-    }
-
-    function testSubmittingMultipleValues() {
-        $this->get($this->samples() . 'multiple_widget_form.html');
-        $this->setFieldByName('a', array('a1', 'a4'));
-        $this->assertFieldByName('a', array('a1', 'a4'));
-        $this->assertFieldByName('a', array('a4', 'a1'));
-        $this->setFieldByName('b', array('b1', 'b4'));
-        $this->assertFieldByName('b', array('b1', 'b4'));
-        $this->setFieldByName('c[]', array('c1', 'c4'));
-        $this->assertField('c[]', array('c1', 'c4'));
-        $this->setFieldByName('d', array('1', '4'));
-        $this->assertField('d', array('1', '4'));
-        $this->setFieldByName('e', array('e1', 'e4'));
-        $this->assertField('e', array('1', '4'));
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[a1, a4]');
-        $this->assertText('b=[b1, b4]');
-        $this->assertText('c=[c1, c4]');
-        $this->assertText('d=[1, 4]');
-        $this->assertText('e=[1, 4]');
-    }
-
-    function testSettingByOptionValue() {
-        $this->get($this->samples() . 'multiple_widget_form.html');
-        $this->setFieldByName('d', array('1', '4'));
-        $this->assertField('d', array('1', '4'));
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('d=[1, 4]');
-    }
-
-    function testSubmittingMultipleValuesByLabel() {
-        $this->get($this->samples() . 'multiple_widget_form.html');
-        $this->setField('Multiple selection A', array('a1', 'a4'));
-        $this->assertField('Multiple selection A', array('a1', 'a4'));
-        $this->assertField('Multiple selection A', array('a4', 'a1'));
-        $this->setField('multiple selection C', array('c1', 'c4'));
-        $this->assertField('multiple selection C', array('c1', 'c4'));
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[a1, a4]');
-        $this->assertText('c=[c1, c4]');
-    }
-
-    function testSavantStyleHiddenFieldDefaults() {
-        $this->get($this->samples() . 'savant_style_form.html');
-        $this->assertFieldByName('a', array('a0'));
-        $this->assertFieldByName('b', array('b0'));
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[a0]');
-        $this->assertText('b=[b0]');
-    }
-
-    function testSavantStyleHiddenDefaultsAreOverridden() {
-        $this->get($this->samples() . 'savant_style_form.html');
-        $this->assertTrue($this->setFieldByName('a', array('a1')));
-        $this->assertTrue($this->setFieldByName('b', 'b1'));
-        $this->assertTrue($this->clickSubmit('Go!'));
-        $this->assertText('a=[a1]');
-        $this->assertText('b=[b1]');
-    }
-
-    function testSavantStyleFormSettingById() {
-        $this->get($this->samples() . 'savant_style_form.html');
-        $this->assertFieldById(1, array('a0'));
-        $this->assertFieldById(4, array('b0'));
-        $this->assertTrue($this->setFieldById(2, 'a1'));
-        $this->assertTrue($this->setFieldById(5, 'b1'));
-        $this->assertTrue($this->clickSubmitById(99));
-        $this->assertText('a=[a1]');
-        $this->assertText('b=[b1]');
-    }
-}
-
-class TestOfFileUploads extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testSingleFileUpload() {
-        $this->get($this->samples() . 'upload_form.html');
-        $this->assertTrue($this->setField('Content:',
-                dirname(__FILE__) . '/support/upload_sample.txt'));
-        $this->assertField('Content:', dirname(__FILE__) . '/support/upload_sample.txt');
-        $this->click('Go!');
-        $this->assertText('Sample for testing file upload');
-    }
-
-    function testMultipleFileUpload() {
-        $this->get($this->samples() . 'upload_form.html');
-        $this->assertTrue($this->setField('Content:',
-                dirname(__FILE__) . '/support/upload_sample.txt'));
-        $this->assertTrue($this->setField('Supplemental:',
-                dirname(__FILE__) . '/support/supplementary_upload_sample.txt'));
-        $this->assertField('Supplemental:',
-                dirname(__FILE__) . '/support/supplementary_upload_sample.txt');
-        $this->click('Go!');
-        $this->assertText('Sample for testing file upload');
-        $this->assertText('Some more text content');
-    }
-
-    function testBinaryFileUpload() {
-        $this->get($this->samples() . 'upload_form.html');
-        $this->assertTrue($this->setField('Content:',
-                dirname(__FILE__) . '/support/latin1_sample'));
-        $this->click('Go!');
-        $this->assertText(
-                implode('', file(dirname(__FILE__) . '/support/latin1_sample')));
-    }
-}
-
-class TestOfLiveHistoryNavigation extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testRetry() {
-        $this->get($this->samples() . 'cookie_based_counter.php');
-        $this->assertPattern('/count: 1/i');
-        $this->retry();
-        $this->assertPattern('/count: 2/i');
-        $this->retry();
-        $this->assertPattern('/count: 3/i');
-    }
-
-    function testOfBackButton() {
-        $this->get($this->samples() . '1.html');
-        $this->clickLink('2');
-        $this->assertTitle('2');
-        $this->assertTrue($this->back());
-        $this->assertTitle('1');
-        $this->assertTrue($this->forward());
-        $this->assertTitle('2');
-        $this->assertFalse($this->forward());
-    }
-
-    function testGetRetryResubmitsData() {
-        $this->assertTrue($this->get(
-                $this->samples() . 'network_confirm.php?a=aaa'));
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[aaa]');
-        $this->retry();
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[aaa]');
-    }
-
-    function testGetRetryResubmitsExtraData() {
-        $this->assertTrue($this->get(
-                $this->samples() . 'network_confirm.php',
-                array('a' => 'aaa')));
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[aaa]');
-        $this->retry();
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[aaa]');
-    }
-
-    function testPostRetryResubmitsData() {
-        $this->assertTrue($this->post(
-                $this->samples() . 'network_confirm.php',
-                array('a' => 'aaa')));
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aaa]');
-        $this->retry();
-        $this->assertPattern('/Request method.*?<dd>POST<\/dd>/');
-        $this->assertText('a=[aaa]');
-    }
-
-    function testGetRetryResubmitsRepeatedData() {
-        $this->assertTrue($this->get(
-                $this->samples() . 'network_confirm.php?a=1&a=2'));
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[1, 2]');
-        $this->retry();
-        $this->assertPattern('/Request method.*?<dd>GET<\/dd>/');
-        $this->assertText('a=[1, 2]');
-    }
-}
-
-class TestOfLiveAuthentication extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testChallengeFromProtectedPage() {
-        $this->get($this->samples() . 'protected/');
-        $this->assertResponse(401);
-        $this->assertAuthentication('Basic');
-        $this->assertRealm('SimpleTest basic authentication');
-        $this->assertRealm(new PatternExpectation('/simpletest/i'));
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->retry();
-        $this->assertResponse(200);
-    }
-
-    function testTrailingSlashImpliedWithinRealm() {
-        $this->get($this->samples() . 'protected/');
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->get($this->samples() . 'protected');
-        $this->assertResponse(200);
-    }
-
-    function testTrailingSlashImpliedSettingRealm() {
-        $this->get($this->samples() . 'protected');
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->get($this->samples() . 'protected/');
-        $this->assertResponse(200);
-    }
-
-    function testEncodedAuthenticationFetchesPage() {
-        $this->get('http://test:secret@www.lastcraft.com/test/protected/');
-        $this->assertResponse(200);
-    }
-
-    function testEncodedAuthenticationFetchesPageAfterTrailingSlashRedirect() {
-        $this->get('http://test:secret@www.lastcraft.com/test/protected');
-        $this->assertResponse(200);
-    }
-
-    function testRealmExtendsToWholeDirectory() {
-        $this->get($this->samples() . 'protected/1.html');
-        $this->authenticate('test', 'secret');
-        $this->clickLink('2');
-        $this->assertResponse(200);
-        $this->clickLink('3');
-        $this->assertResponse(200);
-    }
-
-    function testRedirectKeepsAuthentication() {
-        $this->get($this->samples() . 'protected/local_redirect.php');
-        $this->authenticate('test', 'secret');
-        $this->assertTitle('Simple test target file');
-    }
-
-    function testRedirectKeepsEncodedAuthentication() {
-        $this->get('http://test:secret@www.lastcraft.com/test/protected/local_redirect.php');
-        $this->assertResponse(200);
-        $this->assertTitle('Simple test target file');
-    }
-
-    function testSessionRestartLosesAuthentication() {
-        $this->get($this->samples() . 'protected/');
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->restart();
-        $this->get($this->samples() . 'protected/');
-        $this->assertResponse(401);
-    }
-}
-
-class TestOfLoadingFrames extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testNoFramesContentWhenFramesDisabled() {
-        $this->ignoreFrames();
-        $this->get($this->samples() . 'one_page_frameset.html');
-        $this->assertTitle('Frameset for testing of SimpleTest');
-        $this->assertText('This content is for no frames only');
-    }
-
-    function testPatternMatchCanReadTheOnlyFrame() {
-        $this->get($this->samples() . 'one_page_frameset.html');
-        $this->assertText('A target for the SimpleTest test suite');
-        $this->assertNoText('This content is for no frames only');
-    }
-
-    function testMessyFramesetResponsesByName() {
-        $this->assertTrue($this->get(
-                $this->samples() . 'messy_frameset.html'));
-        $this->assertTitle('Frameset for testing of SimpleTest');
-
-        $this->assertTrue($this->setFrameFocus('Front controller'));
-        $this->assertResponse(200);
-        $this->assertText('Simple test front controller');
-
-        $this->assertTrue($this->setFrameFocus('One'));
-        $this->assertResponse(200);
-        $this->assertLink('2');
-
-        $this->assertTrue($this->setFrameFocus('Frame links'));
-        $this->assertResponse(200);
-        $this->assertLink('Set one to 2');
-
-        $this->assertTrue($this->setFrameFocus('Counter'));
-        $this->assertResponse(200);
-        $this->assertText('Count: 1');
-
-        $this->assertTrue($this->setFrameFocus('Redirected'));
-        $this->assertResponse(200);
-        $this->assertText('r=rrr');
-
-        $this->assertTrue($this->setFrameFocus('Protected'));
-        $this->assertResponse(401);
-
-        $this->assertTrue($this->setFrameFocus('Protected redirect'));
-        $this->assertResponse(401);
-
-        $this->assertTrue($this->setFrameFocusByIndex(1));
-        $this->assertResponse(200);
-        $this->assertText('Simple test front controller');
-
-        $this->assertTrue($this->setFrameFocusByIndex(2));
-        $this->assertResponse(200);
-        $this->assertLink('2');
-
-        $this->assertTrue($this->setFrameFocusByIndex(3));
-        $this->assertResponse(200);
-        $this->assertLink('Set one to 2');
-
-        $this->assertTrue($this->setFrameFocusByIndex(4));
-        $this->assertResponse(200);
-        $this->assertText('Count: 1');
-
-        $this->assertTrue($this->setFrameFocusByIndex(5));
-        $this->assertResponse(200);
-        $this->assertText('r=rrr');
-
-        $this->assertTrue($this->setFrameFocusByIndex(6));
-        $this->assertResponse(401);
-
-        $this->assertTrue($this->setFrameFocusByIndex(7));
-    }
-
-    function testReloadingFramesetPage() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->assertText('Count: 1');
-        $this->retry();
-        $this->assertText('Count: 2');
-        $this->retry();
-        $this->assertText('Count: 3');
-    }
-
-    function testReloadingSingleFrameWithCookieCounter() {
-        $this->get($this->samples() . 'counting_frameset.html');
-        $this->setFrameFocus('a');
-        $this->assertText('Count: 1');
-        $this->setFrameFocus('b');
-        $this->assertText('Count: 2');
-
-        $this->setFrameFocus('a');
-        $this->retry();
-        $this->assertText('Count: 3');
-        $this->retry();
-        $this->assertText('Count: 4');
-        $this->setFrameFocus('b');
-        $this->assertText('Count: 2');
-    }
-
-    function testReloadingFrameWhenUnfocusedReloadsWholeFrameset() {
-        $this->get($this->samples() . 'counting_frameset.html');
-        $this->setFrameFocus('a');
-        $this->assertText('Count: 1');
-        $this->setFrameFocus('b');
-        $this->assertText('Count: 2');
-
-        $this->clearFrameFocus('a');
-        $this->retry();
-
-        $this->assertTitle('Frameset for testing of SimpleTest');
-        $this->setFrameFocus('a');
-        $this->assertText('Count: 3');
-        $this->setFrameFocus('b');
-        $this->assertText('Count: 4');
-    }
-
-    function testClickingNormalLinkReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('2');
-        $this->assertLink('3');
-        $this->assertText('Simple test front controller');
-    }
-
-    function testJumpToNamedPageReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->assertPattern('/Simple test front controller/');
-        $this->clickLink('Index');
-        $this->assertResponse(200);
-        $this->assertText('[action=index]');
-        $this->assertText('Count: 1');
-    }
-
-    function testJumpToUnnamedPageReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('No page');
-        $this->assertResponse(200);
-        $this->assertText('Simple test front controller');
-        $this->assertText('[action=no_page]');
-        $this->assertText('Count: 1');
-    }
-
-    function testJumpToUnnamedPageWithBareParameterReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('Bare action');
-        $this->assertResponse(200);
-        $this->assertText('Simple test front controller');
-        $this->assertText('[action=]');
-        $this->assertText('Count: 1');
-    }
-
-    function testJumpToUnnamedPageWithEmptyQueryReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('Empty query');
-        $this->assertResponse(200);
-        $this->assertPattern('/Simple test front controller/');
-        $this->assertPattern('/raw get data.*?\[\].*?get data/si');
-        $this->assertPattern('/Count: 1/');
-    }
-
-    function testJumpToUnnamedPageWithEmptyLinkReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('Empty link');
-        $this->assertResponse(200);
-        $this->assertPattern('/Simple test front controller/');
-        $this->assertPattern('/raw get data.*?\[\].*?get data/si');
-        $this->assertPattern('/Count: 1/');
-    }
-
-    function testJumpBackADirectoryLevelReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('Down one');
-        $this->assertPattern('/index of .*\/test/i');
-        $this->assertPattern('/Count: 1/');
-    }
-
-    function testSubmitToNamedPageReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->assertPattern('/Simple test front controller/');
-        $this->clickSubmit('Index');
-        $this->assertResponse(200);
-        $this->assertText('[action=Index]');
-        $this->assertText('Count: 1');
-    }
-
-    function testSubmitToSameDirectoryReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickSubmit('Same directory');
-        $this->assertResponse(200);
-        $this->assertText('[action=Same+directory]');
-        $this->assertText('Count: 1');
-    }
-
-    function testSubmitToEmptyActionReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickSubmit('Empty action');
-        $this->assertResponse(200);
-        $this->assertText('[action=Empty+action]');
-        $this->assertText('Count: 1');
-    }
-
-    function testSubmitToNoActionReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickSubmit('No action');
-        $this->assertResponse(200);
-        $this->assertText('[action=No+action]');
-        $this->assertText('Count: 1');
-    }
-
-    function testSubmitBackADirectoryLevelReplacesJustThatFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickSubmit('Down one');
-        $this->assertPattern('/index of .*\/test/i');
-        $this->assertPattern('/Count: 1/');
-    }
-
-    function testTopLinkExitsFrameset() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->clickLink('Exit the frameset');
-        $this->assertTitle('Simple test target file');
-    }
-
-    function testLinkInOnePageCanLoadAnother() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->assertNoLink('3');
-        $this->clickLink('Set one to 2');
-        $this->assertLink('3');
-        $this->assertNoLink('2');
-        $this->assertTitle('Frameset for testing of SimpleTest');
-    }
-
-    function testFrameWithRelativeLinksRespectsBaseTagForThatPage() {
-        $this->get($this->samples() . 'base_tag/frameset.html');
-        $this->click('Back to test pages');
-        $this->assertTitle('Frameset for testing of SimpleTest');
-        $this->assertText('A target for the SimpleTest test suite');
-    }
-
-    function testRelativeLinkInFrameIsNotAffectedByFramesetBaseTag() {
-        $this->get($this->samples() . 'base_tag/frameset_with_base_tag.html');
-        $this->assertText('This is page 1');
-        $this->click('To page 2');
-        $this->assertTitle('Frameset for testing of SimpleTest');
-        $this->assertText('This is page 2');
-    }
-}
-
-class TestOfFrameAuthentication extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testUnauthenticatedFrameSendsChallenge() {
-        $this->get($this->samples() . 'protected/');
-        $this->setFrameFocus('Protected');
-        $this->assertAuthentication('Basic');
-        $this->assertRealm('SimpleTest basic authentication');
-        $this->assertResponse(401);
-    }
-
-    function testCanReadFrameFromAlreadyAuthenticatedRealm() {
-        $this->get($this->samples() . 'protected/');
-        $this->authenticate('test', 'secret');
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->setFrameFocus('Protected');
-        $this->assertResponse(200);
-        $this->assertText('A target for the SimpleTest test suite');
-    }
-
-    function testCanAuthenticateFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->setFrameFocus('Protected');
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->assertText('A target for the SimpleTest test suite');
-        $this->clearFrameFocus();
-        $this->assertText('Count: 1');
-    }
-
-    function testCanAuthenticateRedirectedFrame() {
-        $this->get($this->samples() . 'messy_frameset.html');
-        $this->setFrameFocus('Protected redirect');
-        $this->assertResponse(401);
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->assertText('A target for the SimpleTest test suite');
-        $this->clearFrameFocus();
-        $this->assertText('Count: 1');
-    }
-}
-
-class TestOfNestedFrames extends SimpleTestAcceptanceTest {
-    function setUp() {
-        $this->addHeader('User-Agent: SimpleTest ' . SimpleTest::getVersion());
-    }
-
-    function testCanNavigateToSpecificContent() {
-        $this->get($this->samples() . 'nested_frameset.html');
-        $this->assertTitle('Nested frameset for testing of SimpleTest');
-
-        $this->assertPattern('/This is frame A/');
-        $this->assertPattern('/This is frame B/');
-        $this->assertPattern('/Simple test front controller/');
-        $this->assertLink('2');
-        $this->assertLink('Set one to 2');
-        $this->assertPattern('/Count: 1/');
-        $this->assertPattern('/r=rrr/');
-
-        $this->setFrameFocus('pair');
-        $this->assertPattern('/This is frame A/');
-        $this->assertPattern('/This is frame B/');
-        $this->assertNoPattern('/Simple test front controller/');
-        $this->assertNoLink('2');
-
-        $this->setFrameFocus('aaa');
-        $this->assertPattern('/This is frame A/');
-        $this->assertNoPattern('/This is frame B/');
-
-        $this->clearFrameFocus();
-        $this->assertResponse(200);
-        $this->setFrameFocus('messy');
-        $this->assertResponse(200);
-        $this->setFrameFocus('Front controller');
-        $this->assertResponse(200);
-        $this->assertPattern('/Simple test front controller/');
-        $this->assertNoLink('2');
-    }
-
-    function testReloadingFramesetPage() {
-        $this->get($this->samples() . 'nested_frameset.html');
-        $this->assertPattern('/Count: 1/');
-        $this->retry();
-        $this->assertPattern('/Count: 2/');
-        $this->retry();
-        $this->assertPattern('/Count: 3/');
-    }
-
-    function testRetryingNestedPageOnlyRetriesThatSet() {
-        $this->get($this->samples() . 'nested_frameset.html');
-        $this->assertPattern('/Count: 1/');
-        $this->setFrameFocus('messy');
-        $this->retry();
-        $this->assertPattern('/Count: 2/');
-        $this->setFrameFocus('Counter');
-        $this->retry();
-        $this->assertPattern('/Count: 3/');
-
-        $this->clearFrameFocus();
-        $this->setFrameFocus('messy');
-        $this->setFrameFocus('Front controller');
-        $this->retry();
-
-        $this->clearFrameFocus();
-        $this->assertPattern('/Count: 3/');
-    }
-
-    function testAuthenticatingNestedPage() {
-        $this->get($this->samples() . 'nested_frameset.html');
-        $this->setFrameFocus('messy');
-        $this->setFrameFocus('Protected');
-        $this->assertAuthentication('Basic');
-        $this->assertRealm('SimpleTest basic authentication');
-        $this->assertResponse(401);
-
-        $this->authenticate('test', 'secret');
-        $this->assertResponse(200);
-        $this->assertPattern('/A target for the SimpleTest test suite/');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/adapter_test.php b/3rdparty/simpletest/test/adapter_test.php
deleted file mode 100644
index c1a06a2f6534b60f6f20e69864fa8fac6c738438..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/adapter_test.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-// $Id: adapter_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../extensions/pear_test_case.php');
-
-class SameTestClass {
-}
-
-class TestOfPearAdapter extends PHPUnit_TestCase {
-    
-    function testBoolean() {
-        $this->assertTrue(true, "PEAR true");
-        $this->assertFalse(false, "PEAR false");
-    }
-    
-    function testName() {
-        $this->assertTrue($this->getName() == get_class($this));
-    }
-    
-    function testPass() {
-        $this->pass("PEAR pass");
-    }
-    
-    function testNulls() {
-        $value = null;
-        $this->assertNull($value, "PEAR null");
-        $value = 0;
-        $this->assertNotNull($value, "PEAR not null");
-    }
-    
-    function testType() {
-        $this->assertType("Hello", "string", "PEAR type");
-    }
-    
-    function testEquals() {
-        $this->assertEquals(12, 12, "PEAR identity");
-        $this->setLooselyTyped(true);
-        $this->assertEquals("12", 12, "PEAR equality");
-    }
-    
-    function testSame() {
-        $same = new SameTestClass();
-        $this->assertSame($same, $same, "PEAR same");
-    }
-    
-    function testRegExp() {
-        $this->assertRegExp('/hello/', "A big hello from me", "PEAR regex");
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/all_tests.php b/3rdparty/simpletest/test/all_tests.php
deleted file mode 100644
index 99ce9451e32b8d62edc5e29efadab38ea43bbac8..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/all_tests.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../autorun.php');
-
-class AllTests extends TestSuite {
-    function AllTests() {
-        $this->TestSuite('All tests for SimpleTest ' . SimpleTest::getVersion());
-        $this->addFile(dirname(__FILE__) . '/unit_tests.php');
-        $this->addFile(dirname(__FILE__) . '/shell_test.php');
-        $this->addFile(dirname(__FILE__) . '/live_test.php');
-        $this->addFile(dirname(__FILE__) . '/acceptance_test.php');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/arguments_test.php b/3rdparty/simpletest/test/arguments_test.php
deleted file mode 100644
index 0cca4e99b244436869243a65b09cdfe8816cfcce..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/arguments_test.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-// $Id: cookies_test.php 1506 2007-05-07 00:58:03Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../arguments.php');
-
-class TestOfCommandLineArgumentParsing extends UnitTestCase {
-    function testArgumentListWithJustProgramNameGivesFalseToEveryName() {
-        $arguments = new SimpleArguments(array('me'));
-        $this->assertIdentical($arguments->a, false);
-        $this->assertIdentical($arguments->all(), array());
-    }
-    
-    function testSingleArgumentNameRecordedAsTrue() {
-        $arguments = new SimpleArguments(array('me', '-a'));
-        $this->assertIdentical($arguments->a, true);
-    }
-    
-    function testSingleArgumentCanBeGivenAValue() {
-        $arguments = new SimpleArguments(array('me', '-a=AAA'));
-        $this->assertIdentical($arguments->a, 'AAA');
-    }
-    
-    function testSingleArgumentCanBeGivenSpaceSeparatedValue() {
-        $arguments = new SimpleArguments(array('me', '-a', 'AAA'));
-        $this->assertIdentical($arguments->a, 'AAA');
-    }
-    
-    function testWillBuildArrayFromRepeatedValue() {
-        $arguments = new SimpleArguments(array('me', '-a', 'A', '-a', 'AA'));
-        $this->assertIdentical($arguments->a, array('A', 'AA'));
-    }
-    
-    function testWillBuildArrayFromMultiplyRepeatedValues() {
-        $arguments = new SimpleArguments(array('me', '-a', 'A', '-a', 'AA', '-a', 'AAA'));
-        $this->assertIdentical($arguments->a, array('A', 'AA', 'AAA'));
-    }
-    
-    function testCanParseLongFormArguments() {
-        $arguments = new SimpleArguments(array('me', '--aa=AA', '--bb', 'BB'));
-        $this->assertIdentical($arguments->aa, 'AA');
-        $this->assertIdentical($arguments->bb, 'BB');
-    }
-    
-    function testGetsFullSetOfResultsAsHash() {
-        $arguments = new SimpleArguments(array('me', '-a', '-b=1', '-b', '2', '--aa=AA', '--bb', 'BB', '-c'));
-        $this->assertEqual($arguments->all(),
-                           array('a' => true, 'b' => array('1', '2'), 'aa' => 'AA', 'bb' => 'BB', 'c' => true));
-    }
-}
-
-class TestOfHelpOutput extends UnitTestCase {
-    function testDisplaysGeneralHelpBanner() {
-        $help = new SimpleHelp('Cool program');
-        $this->assertEqual($help->render(), "Cool program\n");
-    }
-    
-    function testDisplaysOnlySingleLineEndings() {
-        $help = new SimpleHelp("Cool program\n");
-        $this->assertEqual($help->render(), "Cool program\n");
-    }
-    
-    function testDisplaysHelpOnShortFlag() {
-        $help = new SimpleHelp('Cool program');
-        $help->explainFlag('a', 'Enables A');
-        $this->assertEqual($help->render(), "Cool program\n-a    Enables A\n");
-    }
-    
-    function testHasAtleastFourSpacesAfterLongestFlag() {
-        $help = new SimpleHelp('Cool program');
-        $help->explainFlag('a', 'Enables A');
-        $help->explainFlag('long', 'Enables Long');
-        $this->assertEqual($help->render(),
-                           "Cool program\n-a        Enables A\n--long    Enables Long\n");
-    }
-    
-    function testCanDisplaysMultipleFlagsForEachOption() {
-        $help = new SimpleHelp('Cool program');
-        $help->explainFlag(array('a', 'aa'), 'Enables A');
-        $this->assertEqual($help->render(), "Cool program\n-a      Enables A\n  --aa\n");
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/authentication_test.php b/3rdparty/simpletest/test/authentication_test.php
deleted file mode 100644
index 081cccddfaedb74c38ce2fcc611cbbaa2f15a687..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/authentication_test.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-// $Id: authentication_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../authentication.php');
-require_once(dirname(__FILE__) . '/../http.php');
-Mock::generate('SimpleHttpRequest');
-
-class TestOfRealm extends UnitTestCase {
-    
-    function testWithinSameUrl() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/hello.html'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/hello.html')));
-    }
-    
-    function testInsideWithLongerUrl() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/hello.html')));
-    }
-    
-    function testBelowRootIsOutside() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/more/hello.html')));
-    }
-    
-    function testOldNetscapeDefinitionIsOutside() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/'));
-        $this->assertFalse($realm->isWithin(
-                new SimpleUrl('http://www.here.com/pathmore/hello.html')));
-    }
-    
-    function testInsideWithMissingTrailingSlash() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path')));
-    }
-    
-    function testDifferentPageNameStillInside() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/hello.html'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/goodbye.html')));
-    }
-    
-    function testNewUrlInSameDirectoryDoesNotChangeRealm() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/hello.html'));
-        $realm->stretch(new SimpleUrl('http://www.here.com/path/goodbye.html'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/index.html')));
-        $this->assertFalse($realm->isWithin(
-                new SimpleUrl('http://www.here.com/index.html')));
-    }
-    
-    function testNewUrlMakesRealmTheCommonPath() {
-        $realm = new SimpleRealm(
-                'Basic',
-                new SimpleUrl('http://www.here.com/path/here/hello.html'));
-        $realm->stretch(new SimpleUrl('http://www.here.com/path/there/goodbye.html'));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/here/index.html')));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/there/index.html')));
-        $this->assertTrue($realm->isWithin(
-                new SimpleUrl('http://www.here.com/path/index.html')));
-        $this->assertFalse($realm->isWithin(
-                new SimpleUrl('http://www.here.com/index.html')));
-        $this->assertFalse($realm->isWithin(
-                new SimpleUrl('http://www.here.com/paths/index.html')));
-        $this->assertFalse($realm->isWithin(
-                new SimpleUrl('http://www.here.com/pathindex.html')));
-    }
-}
-
-class TestOfAuthenticator extends UnitTestCase {
-    
-    function testNoRealms() {
-        $request = new MockSimpleHttpRequest();
-        $request->expectNever('addHeaderLine');
-        $authenticator = new SimpleAuthenticator();
-        $authenticator->addHeaders($request, new SimpleUrl('http://here.com/'));
-    }
-    
-    function &createSingleRealm() {
-        $authenticator = new SimpleAuthenticator();
-        $authenticator->addRealm(
-                new SimpleUrl('http://www.here.com/path/hello.html'),
-                'Basic',
-                'Sanctuary');
-        $authenticator->setIdentityForRealm('www.here.com', 'Sanctuary', 'test', 'secret');
-        return $authenticator;
-    }
-    
-    function testOutsideRealm() {
-        $request = new MockSimpleHttpRequest();
-        $request->expectNever('addHeaderLine');
-        $authenticator = &$this->createSingleRealm();
-        $authenticator->addHeaders(
-                $request,
-                new SimpleUrl('http://www.here.com/hello.html'));
-    }
-    
-    function testWithinRealm() {
-        $request = new MockSimpleHttpRequest();
-        $request->expectOnce('addHeaderLine');
-        $authenticator = &$this->createSingleRealm();
-        $authenticator->addHeaders(
-                $request,
-                new SimpleUrl('http://www.here.com/path/more/hello.html'));
-    }
-    
-    function testRestartingClearsRealm() {
-        $request = new MockSimpleHttpRequest();
-        $request->expectNever('addHeaderLine');
-        $authenticator = &$this->createSingleRealm();
-        $authenticator->restartSession();
-        $authenticator->addHeaders(
-                $request,
-                new SimpleUrl('http://www.here.com/hello.html'));
-    }
-    
-    function testDifferentHostIsOutsideRealm() {
-        $request = new MockSimpleHttpRequest();
-        $request->expectNever('addHeaderLine');
-        $authenticator = &$this->createSingleRealm();
-        $authenticator->addHeaders(
-                $request,
-                new SimpleUrl('http://here.com/path/hello.html'));
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/autorun_test.php b/3rdparty/simpletest/test/autorun_test.php
deleted file mode 100644
index d85ea19897ce7150f690fb4a4d996e4f2c045491..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/autorun_test.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/support/test1.php');
-
-class TestOfAutorun extends UnitTestCase {
-    function testLoadIfIncluded() {
-        $tests = new TestSuite();
-        $tests->addFile(dirname(__FILE__) . '/support/test1.php');
-        $this->assertEqual($tests->getSize(), 1);
-    }
-
-    function testExitStatusOneIfTestsFail() {
-        exec('php ' . dirname(__FILE__) . '/support/failing_test.php', $output, $exit_status);
-        $this->assertEqual($exit_status, 1);
-    }
-
-    function testExitStatusZeroIfTestsPass() {
-        exec('php ' . dirname(__FILE__) . '/support/passing_test.php', $output, $exit_status);
-        $this->assertEqual($exit_status, 0);
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/bad_test_suite.php b/3rdparty/simpletest/test/bad_test_suite.php
deleted file mode 100644
index b426013be40f19a9d7634e1084394b45fbe182b9..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/bad_test_suite.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../autorun.php');
-
-class BadTestCases extends TestSuite {
-    function BadTestCases() {
-        $this->TestSuite('Two bad test cases');
-        $this->addFile(dirname(__FILE__) . '/support/empty_test_file.php');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/browser_test.php b/3rdparty/simpletest/test/browser_test.php
deleted file mode 100644
index 3a52aaa8ff4a1c8b5ba9eae486fdbad0231eeaef..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/browser_test.php
+++ /dev/null
@@ -1,802 +0,0 @@
-<?php
-// $Id: browser_test.php 1964 2009-10-13 15:27:31Z maetl_ $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../browser.php');
-require_once(dirname(__FILE__) . '/../user_agent.php');
-require_once(dirname(__FILE__) . '/../http.php');
-require_once(dirname(__FILE__) . '/../page.php');
-require_once(dirname(__FILE__) . '/../encoding.php');
-
-Mock::generate('SimpleHttpResponse');
-Mock::generate('SimplePage');
-Mock::generate('SimpleForm');
-Mock::generate('SimpleUserAgent');
-Mock::generatePartial(
-        'SimpleBrowser',
-        'MockParseSimpleBrowser',
-        array('createUserAgent', 'parse'));
-Mock::generatePartial(
-        'SimpleBrowser',
-        'MockUserAgentSimpleBrowser',
-        array('createUserAgent'));
-
-class TestOfHistory extends UnitTestCase {
-
-    function testEmptyHistoryHasFalseContents() {
-        $history = new SimpleBrowserHistory();
-        $this->assertIdentical($history->getUrl(), false);
-        $this->assertIdentical($history->getParameters(), false);
-    }
-
-    function testCannotMoveInEmptyHistory() {
-        $history = new SimpleBrowserHistory();
-        $this->assertFalse($history->back());
-        $this->assertFalse($history->forward());
-    }
-
-    function testCurrentTargetAccessors() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.here.com/'),
-                new SimpleGetEncoding());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.here.com/'));
-        $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
-    }
-
-    function testSecondEntryAccessors() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $history->recordEntry(
-                new SimpleUrl('http://www.second.com/'),
-                new SimplePostEncoding(array('a' => 1)));
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.second.com/'));
-        $this->assertIdentical(
-                $history->getParameters(),
-                new SimplePostEncoding(array('a' => 1)));
-    }
-
-    function testGoingBackwards() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $history->recordEntry(
-                new SimpleUrl('http://www.second.com/'),
-                new SimplePostEncoding(array('a' => 1)));
-        $this->assertTrue($history->back());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
-        $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
-    }
-
-    function testGoingBackwardsOffBeginning() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $this->assertFalse($history->back());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
-        $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
-    }
-
-    function testGoingForwardsOffEnd() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $this->assertFalse($history->forward());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
-        $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
-    }
-
-    function testGoingBackwardsAndForwards() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $history->recordEntry(
-                new SimpleUrl('http://www.second.com/'),
-                new SimplePostEncoding(array('a' => 1)));
-        $this->assertTrue($history->back());
-        $this->assertTrue($history->forward());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.second.com/'));
-        $this->assertIdentical(
-                $history->getParameters(),
-                new SimplePostEncoding(array('a' => 1)));
-    }
-
-    function testNewEntryReplacesNextOne() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $history->recordEntry(
-                new SimpleUrl('http://www.second.com/'),
-                new SimplePostEncoding(array('a' => 1)));
-        $history->back();
-        $history->recordEntry(
-                new SimpleUrl('http://www.third.com/'),
-                new SimpleGetEncoding());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.third.com/'));
-        $this->assertIdentical($history->getParameters(), new SimpleGetEncoding());
-    }
-
-    function testNewEntryDropsFutureEntries() {
-        $history = new SimpleBrowserHistory();
-        $history->recordEntry(
-                new SimpleUrl('http://www.first.com/'),
-                new SimpleGetEncoding());
-        $history->recordEntry(
-                new SimpleUrl('http://www.second.com/'),
-                new SimpleGetEncoding());
-        $history->recordEntry(
-                new SimpleUrl('http://www.third.com/'),
-                new SimpleGetEncoding());
-        $history->back();
-        $history->back();
-        $history->recordEntry(
-                new SimpleUrl('http://www.fourth.com/'),
-                new SimpleGetEncoding());
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.fourth.com/'));
-        $this->assertFalse($history->forward());
-        $history->back();
-        $this->assertIdentical($history->getUrl(), new SimpleUrl('http://www.first.com/'));
-        $this->assertFalse($history->back());
-    }
-}
-
-class TestOfParsedPageAccess extends UnitTestCase {
-
-    function loadPage(&$page) {
-        $response = new MockSimpleHttpResponse($this);
-        $agent = new MockSimpleUserAgent($this);
-        $agent->returns('fetchResponse', $response);
-
-        $browser = new MockParseSimpleBrowser($this);
-        $browser->returns('createUserAgent', $agent);
-        $browser->returns('parse', $page);
-        $browser->__construct();
-
-        $browser->get('http://this.com/page.html');
-        return $browser;
-    }
-
-    function testAccessorsWhenNoPage() {
-        $agent = new MockSimpleUserAgent($this);
-        $browser = new MockParseSimpleBrowser($this);
-        $browser->returns('createUserAgent', $agent);
-        $browser->__construct();
-        $this->assertEqual($browser->getContent(), '');
-    }
-
-    function testParse() {
-        $page = new MockSimplePage();
-        $page->setReturnValue('getRequest', "GET here.html\r\n\r\n");
-        $page->setReturnValue('getRaw', 'Raw HTML');
-        $page->setReturnValue('getTitle', 'Here');
-        $page->setReturnValue('getFrameFocus', 'Frame');
-        $page->setReturnValue('getMimeType', 'text/html');
-        $page->setReturnValue('getResponseCode', 200);
-        $page->setReturnValue('getAuthentication', 'Basic');
-        $page->setReturnValue('getRealm', 'Somewhere');
-        $page->setReturnValue('getTransportError', 'Ouch!');
-
-        $browser = $this->loadPage($page);
-        $this->assertEqual($browser->getRequest(), "GET here.html\r\n\r\n");
-        $this->assertEqual($browser->getContent(), 'Raw HTML');
-        $this->assertEqual($browser->getTitle(), 'Here');
-        $this->assertEqual($browser->getFrameFocus(), 'Frame');
-        $this->assertIdentical($browser->getResponseCode(), 200);
-        $this->assertEqual($browser->getMimeType(), 'text/html');
-        $this->assertEqual($browser->getAuthentication(), 'Basic');
-        $this->assertEqual($browser->getRealm(), 'Somewhere');
-        $this->assertEqual($browser->getTransportError(), 'Ouch!');
-    }
-
-    function testLinkAffirmationWhenPresent() {
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlsByLabel', array('http://www.nowhere.com'));
-        $page->expectOnce('getUrlsByLabel', array('a link label'));
-        $browser = $this->loadPage($page);
-        $this->assertIdentical($browser->getLink('a link label'), 'http://www.nowhere.com');
-    }
-
-    function testLinkAffirmationByIdWhenPresent() {
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlById', 'a_page.com', array(99));
-        $page->setReturnValue('getUrlById', false, array('*'));
-        $browser = $this->loadPage($page);
-        $this->assertIdentical($browser->getLinkById(99), 'a_page.com');
-        $this->assertFalse($browser->getLinkById(98));
-    }
-
-    function testSettingFieldIsPassedToPage() {
-        $page = new MockSimplePage();
-        $page->expectOnce('setField', array(new SimpleByLabelOrName('key'), 'Value', false));
-        $page->setReturnValue('getField', 'Value');
-        $browser = $this->loadPage($page);
-        $this->assertEqual($browser->getField('key'), 'Value');
-        $browser->setField('key', 'Value');
-    }
-}
-
-class TestOfBrowserNavigation extends UnitTestCase {
-    function createBrowser($agent, $page) {
-        $browser = new MockParseSimpleBrowser();
-        $browser->returns('createUserAgent', $agent);
-        $browser->returns('parse', $page);
-        $browser->__construct();
-        return $browser;
-    }
-
-    function testBrowserRequestMethods() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(
-                0,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/get.req'), new SimpleGetEncoding()));
-        $agent->expectAt(
-                1,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/post.req'), new SimplePostEncoding()));
-        $agent->expectAt(
-                2,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/put.req'), new SimplePutEncoding()));
-        $agent->expectAt(
-                3,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/delete.req'), new SimpleDeleteEncoding()));
-        $agent->expectAt(
-                4,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/head.req'), new SimpleHeadEncoding()));                               
-        $agent->expectCallCount('fetchResponse', 5);
-
-        $page = new MockSimplePage();
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/get.req');
-        $browser->post('http://this.com/post.req');
-        $browser->put('http://this.com/put.req');
-        $browser->delete('http://this.com/delete.req');
-        $browser->head('http://this.com/head.req');
-    }  
-    
-    function testClickLinkRequestsPage() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(
-                0,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/page.html'), new SimpleGetEncoding()));
-        $agent->expectAt(
-                1,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/new.html'), new SimpleGetEncoding()));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlsByLabel', array(new SimpleUrl('http://this.com/new.html')));
-        $page->expectOnce('getUrlsByLabel', array('New'));
-        $page->setReturnValue('getRaw', 'A page');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickLink('New'));
-    }
-
-    function testClickLinkWithUnknownFrameStillRequestsWholePage() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(
-                0,
-                'fetchResponse',
-                array(new SimpleUrl('http://this.com/page.html'), new SimpleGetEncoding()));
-        $target = new SimpleUrl('http://this.com/new.html');
-        $target->setTarget('missing');
-        $agent->expectAt(
-                1,
-                'fetchResponse',
-                array($target, new SimpleGetEncoding()));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $parsed_url = new SimpleUrl('http://this.com/new.html');
-        $parsed_url->setTarget('missing');
-
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlsByLabel', array($parsed_url));
-        $page->setReturnValue('hasFrames', false);
-        $page->expectOnce('getUrlsByLabel', array('New'));
-        $page->setReturnValue('getRaw', 'A page');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickLink('New'));
-    }
-
-    function testClickingMissingLinkFails() {
-        $agent = new MockSimpleUserAgent($this);
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlsByLabel', array());
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $this->assertTrue($browser->get('http://this.com/page.html'));
-        $this->assertFalse($browser->clickLink('New'));
-    }
-
-    function testClickIndexedLink() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(
-                1,
-                'fetchResponse',
-                array(new SimpleUrl('1.html'), new SimpleGetEncoding()));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $page = new MockSimplePage();
-        $page->setReturnValue(
-                'getUrlsByLabel',
-                array(new SimpleUrl('0.html'), new SimpleUrl('1.html')));
-        $page->setReturnValue('getRaw', 'A page');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickLink('New', 1));
-    }
-
-    function testClinkLinkById() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(1, 'fetchResponse', array(
-                new SimpleUrl('http://this.com/link.html'),
-                new SimpleGetEncoding()));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlById', new SimpleUrl('http://this.com/link.html'));
-        $page->expectOnce('getUrlById', array(2));
-        $page->setReturnValue('getRaw', 'A page');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickLinkById(2));
-    }
-
-    function testClickingMissingLinkIdFails() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $page = new MockSimplePage();
-        $page->setReturnValue('getUrlById', false);
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertFalse($browser->clickLink(0));
-    }
-
-    function testSubmitFormByLabel() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(1, 'fetchResponse', array(
-                new SimpleUrl('http://this.com/handler.html'),
-                new SimplePostEncoding(array('a' => 'A'))));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A')));
-        $form->expectOnce('submitButton', array(new SimpleByLabel('Go'), false));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormBySubmit', $form);
-        $page->expectOnce('getFormBySubmit', array(new SimpleByLabel('Go')));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickSubmit('Go'));
-    }
-
-    function testDefaultSubmitFormByLabel() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(1,  'fetchResponse', array(
-                new SimpleUrl('http://this.com/page.html'),
-                new SimpleGetEncoding(array('a' => 'A'))));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/page.html'));
-        $form->setReturnValue('getMethod', 'get');
-        $form->setReturnValue('submitButton', new SimpleGetEncoding(array('a' => 'A')));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormBySubmit', $form);
-        $page->expectOnce('getFormBySubmit', array(new SimpleByLabel('Submit')));
-        $page->setReturnValue('getRaw', 'stuff');
-        $page->setReturnValue('getUrl', new SimpleUrl('http://this.com/page.html'));
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickSubmit());
-    }
-
-    function testSubmitFormByName() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A')));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormBySubmit', $form);
-        $page->expectOnce('getFormBySubmit', array(new SimpleByName('me')));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickSubmitByName('me'));
-    }
-
-    function testSubmitFormById() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submitButton', new SimplePostEncoding(array('a' => 'A')));
-        $form->expectOnce('submitButton', array(new SimpleById(99), false));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormBySubmit', $form);
-        $page->expectOnce('getFormBySubmit', array(new SimpleById(99)));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickSubmitById(99));
-    }
-
-    function testSubmitFormByImageLabel() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A')));
-        $form->expectOnce('submitImage', array(new SimpleByLabel('Go!'), 10, 11, false));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormByImage', $form);
-        $page->expectOnce('getFormByImage', array(new SimpleByLabel('Go!')));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickImage('Go!', 10, 11));
-    }
-
-    function testSubmitFormByImageName() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A')));
-        $form->expectOnce('submitImage', array(new SimpleByName('a'), 10, 11, false));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormByImage', $form);
-        $page->expectOnce('getFormByImage', array(new SimpleByName('a')));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickImageByName('a', 10, 11));
-    }
-
-    function testSubmitFormByImageId() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submitImage', new SimplePostEncoding(array('a' => 'A')));
-        $form->expectOnce('submitImage', array(new SimpleById(99), 10, 11, false));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormByImage', $form);
-        $page->expectOnce('getFormByImage', array(new SimpleById(99)));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->clickImageById(99, 10, 11));
-    }
-
-    function testSubmitFormByFormId() {
-        $agent = new MockSimpleUserAgent();
-        $agent->returns('fetchResponse', new MockSimpleHttpResponse());
-        $agent->expectAt(1, 'fetchResponse', array(
-                new SimpleUrl('http://this.com/handler.html'),
-                new SimplePostEncoding(array('a' => 'A'))));
-        $agent->expectCallCount('fetchResponse', 2);
-
-        $form = new MockSimpleForm();
-        $form->setReturnValue('getAction', new SimpleUrl('http://this.com/handler.html'));
-        $form->setReturnValue('getMethod', 'post');
-        $form->setReturnValue('submit', new SimplePostEncoding(array('a' => 'A')));
-
-        $page = new MockSimplePage();
-        $page->returns('getFormById', $form);
-        $page->expectOnce('getFormById', array(33));
-        $page->setReturnValue('getRaw', 'stuff');
-
-        $browser = $this->createBrowser($agent, $page);
-        $browser->get('http://this.com/page.html');
-        $this->assertTrue($browser->submitFormById(33));
-    }
-}
-
-class TestOfBrowserFrames extends UnitTestCase {
-
-    function createBrowser($agent) {
-        $browser = new MockUserAgentSimpleBrowser();
-        $browser->returns('createUserAgent', $agent);
-        $browser->__construct();
-        return $browser;
-    }
-
-    function createUserAgent($pages) {
-        $agent = new MockSimpleUserAgent();
-        foreach ($pages as $url => $raw) {
-            $url = new SimpleUrl($url);
-            $response = new MockSimpleHttpResponse();
-            $response->setReturnValue('getUrl', $url);
-            $response->setReturnValue('getContent', $raw);
-            $agent->returns('fetchResponse', $response, array($url, '*'));
-        }
-        return $agent;
-    }
-
-    function testSimplePageHasNoFrames() {
-        $browser = $this->createBrowser($this->createUserAgent(
-                array('http://site.with.no.frames/' => 'A non-framed page')));
-        $this->assertEqual(
-                $browser->get('http://site.with.no.frames/'),
-                'A non-framed page');
-        $this->assertIdentical($browser->getFrames(), 'http://site.with.no.frames/');
-    }
-
-    function testFramesetWithSingleFrame() {
-        $frameset = '<frameset><frame name="a" src="frame.html"></frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.one.frame/' => $frameset,
-                'http://site.with.one.frame/frame.html' => 'A frame')));
-        $this->assertEqual($browser->get('http://site.with.one.frame/'), 'A frame');
-        $this->assertIdentical(
-                $browser->getFrames(),
-                array('a' => 'http://site.with.one.frame/frame.html'));
-    }
-
-    function testTitleTakenFromFramesetPage() {
-        $frameset = '<title>Frameset title</title>' .
-                '<frameset><frame name="a" src="frame.html"></frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.one.frame/' => $frameset,
-                'http://site.with.one.frame/frame.html' => '<title>Page title</title>')));
-        $browser->get('http://site.with.one.frame/');
-        $this->assertEqual($browser->getTitle(), 'Frameset title');
-    }
-
-    function testFramesetWithSingleUnnamedFrame() {
-        $frameset = '<frameset><frame src="frame.html"></frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.one.frame/' => $frameset,
-                'http://site.with.one.frame/frame.html' => 'One frame')));
-        $this->assertEqual(
-                $browser->get('http://site.with.one.frame/'),
-                'One frame');
-        $this->assertIdentical(
-                $browser->getFrames(),
-                array(1 => 'http://site.with.one.frame/frame.html'));
-    }
-
-    function testFramesetWithMultipleFrames() {
-        $frameset = '<frameset>' .
-                '<frame name="a" src="frame_a.html">' .
-                '<frame name="b" src="frame_b.html">' .
-                '<frame name="c" src="frame_c.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.frames/' => $frameset,
-                'http://site.with.frames/frame_a.html' => 'A frame',
-                'http://site.with.frames/frame_b.html' => 'B frame',
-                'http://site.with.frames/frame_c.html' => 'C frame')));
-        $this->assertEqual(
-                $browser->get('http://site.with.frames/'),
-                'A frameB frameC frame');
-        $this->assertIdentical($browser->getFrames(), array(
-                'a' => 'http://site.with.frames/frame_a.html',
-                'b' => 'http://site.with.frames/frame_b.html',
-                'c' => 'http://site.with.frames/frame_c.html'));
-    }
-
-    function testFrameFocusByName() {
-        $frameset = '<frameset>' .
-                '<frame name="a" src="frame_a.html">' .
-                '<frame name="b" src="frame_b.html">' .
-                '<frame name="c" src="frame_c.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.frames/' => $frameset,
-                'http://site.with.frames/frame_a.html' => 'A frame',
-                'http://site.with.frames/frame_b.html' => 'B frame',
-                'http://site.with.frames/frame_c.html' => 'C frame')));
-        $browser->get('http://site.with.frames/');
-        $browser->setFrameFocus('a');
-        $this->assertEqual($browser->getContent(), 'A frame');
-        $browser->setFrameFocus('b');
-        $this->assertEqual($browser->getContent(), 'B frame');
-        $browser->setFrameFocus('c');
-        $this->assertEqual($browser->getContent(), 'C frame');
-    }
-
-    function testFramesetWithSomeNamedFrames() {
-        $frameset = '<frameset>' .
-                '<frame name="a" src="frame_a.html">' .
-                '<frame src="frame_b.html">' .
-                '<frame name="c" src="frame_c.html">' .
-                '<frame src="frame_d.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.frames/' => $frameset,
-                'http://site.with.frames/frame_a.html' => 'A frame',
-                'http://site.with.frames/frame_b.html' => 'B frame',
-                'http://site.with.frames/frame_c.html' => 'C frame',
-                'http://site.with.frames/frame_d.html' => 'D frame')));
-        $this->assertEqual(
-                $browser->get('http://site.with.frames/'),
-                'A frameB frameC frameD frame');
-        $this->assertIdentical($browser->getFrames(), array(
-                'a' => 'http://site.with.frames/frame_a.html',
-                2 => 'http://site.with.frames/frame_b.html',
-                'c' => 'http://site.with.frames/frame_c.html',
-                4 => 'http://site.with.frames/frame_d.html'));
-    }
-
-    function testFrameFocusWithMixedNamesAndIndexes() {
-        $frameset = '<frameset>' .
-                '<frame name="a" src="frame_a.html">' .
-                '<frame src="frame_b.html">' .
-                '<frame name="c" src="frame_c.html">' .
-                '<frame src="frame_d.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.frames/' => $frameset,
-                'http://site.with.frames/frame_a.html' => 'A frame',
-                'http://site.with.frames/frame_b.html' => 'B frame',
-                'http://site.with.frames/frame_c.html' => 'C frame',
-                'http://site.with.frames/frame_d.html' => 'D frame')));
-        $browser->get('http://site.with.frames/');
-        $browser->setFrameFocus('a');
-        $this->assertEqual($browser->getContent(), 'A frame');
-        $browser->setFrameFocus(2);
-        $this->assertEqual($browser->getContent(), 'B frame');
-        $browser->setFrameFocus('c');
-        $this->assertEqual($browser->getContent(), 'C frame');
-        $browser->setFrameFocus(4);
-        $this->assertEqual($browser->getContent(), 'D frame');
-        $browser->clearFrameFocus();
-        $this->assertEqual($browser->getContent(), 'A frameB frameC frameD frame');
-    }
-
-    function testNestedFrameset() {
-        $inner = '<frameset>' .
-                '<frame name="page" src="page.html">' .
-                '</frameset>';
-        $outer = '<frameset>' .
-                '<frame name="inner" src="inner.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.nested.frame/' => $outer,
-                'http://site.with.nested.frame/inner.html' => $inner,
-                'http://site.with.nested.frame/page.html' => 'The page')));
-        $this->assertEqual(
-                $browser->get('http://site.with.nested.frame/'),
-                'The page');
-        $this->assertIdentical($browser->getFrames(), array(
-                'inner' => array(
-                        'page' => 'http://site.with.nested.frame/page.html')));
-    }
-
-    function testCanNavigateToNestedFrame() {
-        $inner = '<frameset>' .
-                '<frame name="one" src="one.html">' .
-                '<frame name="two" src="two.html">' .
-                '</frameset>';
-        $outer = '<frameset>' .
-                '<frame name="inner" src="inner.html">' .
-                '<frame name="three" src="three.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.nested.frames/' => $outer,
-                'http://site.with.nested.frames/inner.html' => $inner,
-                'http://site.with.nested.frames/one.html' => 'Page one',
-                'http://site.with.nested.frames/two.html' => 'Page two',
-                'http://site.with.nested.frames/three.html' => 'Page three')));
-
-        $browser->get('http://site.with.nested.frames/');
-        $this->assertEqual($browser->getContent(), 'Page onePage twoPage three');
-
-        $this->assertTrue($browser->setFrameFocus('inner'));
-        $this->assertEqual($browser->getFrameFocus(), array('inner'));
-        $this->assertTrue($browser->setFrameFocus('one'));
-        $this->assertEqual($browser->getFrameFocus(), array('inner', 'one'));
-        $this->assertEqual($browser->getContent(), 'Page one');
-
-        $this->assertTrue($browser->setFrameFocus('two'));
-        $this->assertEqual($browser->getFrameFocus(), array('inner', 'two'));
-        $this->assertEqual($browser->getContent(), 'Page two');
-
-        $browser->clearFrameFocus();
-        $this->assertTrue($browser->setFrameFocus('three'));
-        $this->assertEqual($browser->getFrameFocus(), array('three'));
-        $this->assertEqual($browser->getContent(), 'Page three');
-
-        $this->assertTrue($browser->setFrameFocus('inner'));
-        $this->assertEqual($browser->getContent(), 'Page onePage two');
-    }
-
-    function testCanNavigateToNestedFrameByIndex() {
-        $inner = '<frameset>' .
-                '<frame src="one.html">' .
-                '<frame src="two.html">' .
-                '</frameset>';
-        $outer = '<frameset>' .
-                '<frame src="inner.html">' .
-                '<frame src="three.html">' .
-                '</frameset>';
-        $browser = $this->createBrowser($this->createUserAgent(array(
-                'http://site.with.nested.frames/' => $outer,
-                'http://site.with.nested.frames/inner.html' => $inner,
-                'http://site.with.nested.frames/one.html' => 'Page one',
-                'http://site.with.nested.frames/two.html' => 'Page two',
-                'http://site.with.nested.frames/three.html' => 'Page three')));
-
-        $browser->get('http://site.with.nested.frames/');
-        $this->assertEqual($browser->getContent(), 'Page onePage twoPage three');
-
-        $this->assertTrue($browser->setFrameFocusByIndex(1));
-        $this->assertEqual($browser->getFrameFocus(), array(1));
-        $this->assertTrue($browser->setFrameFocusByIndex(1));
-        $this->assertEqual($browser->getFrameFocus(), array(1, 1));
-        $this->assertEqual($browser->getContent(), 'Page one');
-
-        $this->assertTrue($browser->setFrameFocusByIndex(2));
-        $this->assertEqual($browser->getFrameFocus(), array(1, 2));
-        $this->assertEqual($browser->getContent(), 'Page two');
-
-        $browser->clearFrameFocus();
-        $this->assertTrue($browser->setFrameFocusByIndex(2));
-        $this->assertEqual($browser->getFrameFocus(), array(2));
-        $this->assertEqual($browser->getContent(), 'Page three');
-
-        $this->assertTrue($browser->setFrameFocusByIndex(1));
-        $this->assertEqual($browser->getContent(), 'Page onePage two');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/collector_test.php b/3rdparty/simpletest/test/collector_test.php
deleted file mode 100644
index efdbf377ece41ed96968d28f65ac82ac78d12543..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/collector_test.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-// $Id: collector_test.php 1769 2008-04-19 14:39:00Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../collector.php');
-SimpleTest::ignore('MockTestSuite');
-Mock::generate('TestSuite');
-
-class PathEqualExpectation extends EqualExpectation {
-	function __construct($value, $message = '%s') {
-    	parent::__construct(str_replace("\\", '/', $value), $message);
-	}
-
-    function test($compare) {
-        return parent::test(str_replace("\\", '/', $compare));
-    }
-}
-
-class TestOfCollector extends UnitTestCase {
-    function testCollectionIsAddedToGroup() {
-        $suite = new MockTestSuite();
-        $suite->expectMinimumCallCount('addFile', 2);
-        $suite->expect(
-                'addFile',
-                array(new PatternExpectation('/collectable\\.(1|2)$/')));
-        $collector = new SimpleCollector();
-        $collector->collect($suite, dirname(__FILE__) . '/support/collector/');
-    }
-}
-
-class TestOfPatternCollector extends UnitTestCase {
-
-    function testAddingEverythingToGroup() {
-        $suite = new MockTestSuite();
-        $suite->expectCallCount('addFile', 2);
-        $suite->expect(
-                'addFile',
-                array(new PatternExpectation('/collectable\\.(1|2)$/')));
-        $collector = new SimplePatternCollector('/.*/');
-        $collector->collect($suite, dirname(__FILE__) . '/support/collector/');
-    }
-
-    function testOnlyMatchedFilesAreAddedToGroup() {
-        $suite = new MockTestSuite();
-        $suite->expectOnce('addFile', array(new PathEqualExpectation(
-        		dirname(__FILE__) . '/support/collector/collectable.1')));
-        $collector = new SimplePatternCollector('/1$/');
-        $collector->collect($suite, dirname(__FILE__) . '/support/collector/');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/command_line_test.php b/3rdparty/simpletest/test/command_line_test.php
deleted file mode 100644
index 5baabff33c6794916815ed8ade8265677e1aa76b..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/command_line_test.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../default_reporter.php');
-
-class TestOfCommandLineParsing extends UnitTestCase {
-    
-    function testDefaultsToEmptyStringToMeanNullToTheSelectiveReporter() {
-        $parser = new SimpleCommandLineParser(array());
-        $this->assertIdentical($parser->getTest(), '');
-        $this->assertIdentical($parser->getTestCase(), '');
-    }
-    
-    function testNotXmlByDefault() {
-        $parser = new SimpleCommandLineParser(array());
-        $this->assertFalse($parser->isXml());
-    }
-    
-    function testCanDetectRequestForXml() {
-        $parser = new SimpleCommandLineParser(array('--xml'));
-        $this->assertTrue($parser->isXml());
-    }
-    
-    function testCanReadAssignmentSyntax() {
-        $parser = new SimpleCommandLineParser(array('--test=myTest'));
-        $this->assertEqual($parser->getTest(), 'myTest');
-    }
-    
-    function testCanReadFollowOnSyntax() {
-        $parser = new SimpleCommandLineParser(array('--test', 'myTest'));
-        $this->assertEqual($parser->getTest(), 'myTest');
-    }
-    
-    function testCanReadShortForms() {
-        $parser = new SimpleCommandLineParser(array('-t', 'myTest', '-c', 'MyClass', '-x'));
-        $this->assertEqual($parser->getTest(), 'myTest');
-        $this->assertEqual($parser->getTestCase(), 'MyClass');
-        $this->assertTrue($parser->isXml());
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/compatibility_test.php b/3rdparty/simpletest/test/compatibility_test.php
deleted file mode 100644
index b8635e5bb8370fa46c6d4ac2a97d23fa58188c3b..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/compatibility_test.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-// $Id: compatibility_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../compatibility.php');
-
-class ComparisonClass { }
-class ComparisonSubclass extends ComparisonClass { }
-interface ComparisonInterface { }
-class ComparisonClassWithInterface implements ComparisonInterface { }
-
-class TestOfCompatibility extends UnitTestCase {
-    
-    function testIsA() {
-        $this->assertTrue(SimpleTestCompatibility::isA(
-                new ComparisonClass(),
-                'ComparisonClass'));
-        $this->assertFalse(SimpleTestCompatibility::isA(
-                new ComparisonClass(),
-                'ComparisonSubclass'));
-        $this->assertTrue(SimpleTestCompatibility::isA(
-                new ComparisonSubclass(),
-                'ComparisonClass'));
-    }
-    
-    function testIdentityOfNumericStrings() {
-        $numericString1 = "123";
-        $numericString2 = "00123";
-        $this->assertNotIdentical($numericString1, $numericString2);
-    }
-    
-    function testIdentityOfObjects() {
-        $object1 = new ComparisonClass();
-        $object2 = new ComparisonClass();
-        $this->assertIdentical($object1, $object2);
-    }
-    
-    function testReferences () {
-        $thing = "Hello";
-        $thing_reference = &$thing;
-        $thing_copy = $thing;
-        $this->assertTrue(SimpleTestCompatibility::isReference(
-                $thing,
-                $thing));
-        $this->assertTrue(SimpleTestCompatibility::isReference(
-                $thing,
-                $thing_reference));
-        $this->assertFalse(SimpleTestCompatibility::isReference(
-                $thing,
-                $thing_copy));
-    }
-    
-    function testObjectReferences () {
-        $object = new ComparisonClass();
-        $object_reference = $object;
-        $object_copy = new ComparisonClass();
-        $object_assignment = $object;
-        $this->assertTrue(SimpleTestCompatibility::isReference(
-                $object,
-                $object));
-        $this->assertTrue(SimpleTestCompatibility::isReference(
-                $object,
-                $object_reference));
-        $this->assertFalse(SimpleTestCompatibility::isReference(
-                $object,
-                $object_copy));
-        if (version_compare(phpversion(), '5', '>=')) {
-            $this->assertTrue(SimpleTestCompatibility::isReference(
-                    $object,
-                    $object_assignment));
-        } else {
-            $this->assertFalse(SimpleTestCompatibility::isReference(
-                    $object,
-                    $object_assignment));
-        }
-    }
-    
-    function testInteraceComparison() {
-        $object = new ComparisonClassWithInterface();
-        $this->assertFalse(SimpleTestCompatibility::isA(
-                new ComparisonClass(),
-                'ComparisonInterface'));
-        $this->assertTrue(SimpleTestCompatibility::isA(
-                new ComparisonClassWithInterface(),
-                'ComparisonInterface'));
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/cookies_test.php b/3rdparty/simpletest/test/cookies_test.php
deleted file mode 100644
index 0b49e43bf9f809805499d56d1c8ef2fc27e9662e..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/cookies_test.php
+++ /dev/null
@@ -1,227 +0,0 @@
-<?php
-// $Id: cookies_test.php 1506 2007-05-07 00:58:03Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../cookies.php');
-
-class TestOfCookie extends UnitTestCase {
-    
-    function testCookieDefaults() {
-        $cookie = new SimpleCookie("name");
-        $this->assertFalse($cookie->getValue());
-        $this->assertEqual($cookie->getPath(), "/");
-        $this->assertIdentical($cookie->getHost(), false);
-        $this->assertFalse($cookie->getExpiry());
-        $this->assertFalse($cookie->isSecure());
-    }
-    
-    function testCookieAccessors() {
-        $cookie = new SimpleCookie(
-                "name",
-                "value",
-                "/path",
-                "Mon, 18 Nov 2002 15:50:29 GMT",
-                true);
-        $this->assertEqual($cookie->getName(), "name");
-        $this->assertEqual($cookie->getValue(), "value");
-        $this->assertEqual($cookie->getPath(), "/path/");
-        $this->assertEqual($cookie->getExpiry(), "Mon, 18 Nov 2002 15:50:29 GMT");
-        $this->assertTrue($cookie->isSecure());
-    }
-    
-    function testFullHostname() {
-        $cookie = new SimpleCookie("name");
-        $this->assertTrue($cookie->setHost("host.name.here"));
-        $this->assertEqual($cookie->getHost(), "host.name.here");
-        $this->assertTrue($cookie->setHost("host.com"));
-        $this->assertEqual($cookie->getHost(), "host.com");
-    }
-    
-    function testHostTruncation() {
-        $cookie = new SimpleCookie("name");
-        $cookie->setHost("this.host.name.here");
-        $this->assertEqual($cookie->getHost(), "host.name.here");
-        $cookie->setHost("this.host.com");
-        $this->assertEqual($cookie->getHost(), "host.com");
-        $this->assertTrue($cookie->setHost("dashes.in-host.com"));
-        $this->assertEqual($cookie->getHost(), "in-host.com");
-    }
-    
-    function testBadHosts() {
-        $cookie = new SimpleCookie("name");
-        $this->assertFalse($cookie->setHost("gibberish"));
-        $this->assertFalse($cookie->setHost("host.here"));
-        $this->assertFalse($cookie->setHost("host..com"));
-        $this->assertFalse($cookie->setHost("..."));
-        $this->assertFalse($cookie->setHost("host.com."));
-    }
-    
-    function testHostValidity() {
-        $cookie = new SimpleCookie("name");
-        $cookie->setHost("this.host.name.here");
-        $this->assertTrue($cookie->isValidHost("host.name.here"));
-        $this->assertTrue($cookie->isValidHost("that.host.name.here"));
-        $this->assertFalse($cookie->isValidHost("bad.host"));
-        $this->assertFalse($cookie->isValidHost("nearly.name.here"));
-    }
-    
-    function testPathValidity() {
-        $cookie = new SimpleCookie("name", "value", "/path");
-        $this->assertFalse($cookie->isValidPath("/"));
-        $this->assertTrue($cookie->isValidPath("/path/"));
-        $this->assertTrue($cookie->isValidPath("/path/more"));
-    }
-    
-    function testSessionExpiring() {
-        $cookie = new SimpleCookie("name", "value", "/path");
-        $this->assertTrue($cookie->isExpired(0));
-    }
-    
-    function testTimestampExpiry() {
-        $cookie = new SimpleCookie("name", "value", "/path", 456);
-        $this->assertFalse($cookie->isExpired(0));
-        $this->assertTrue($cookie->isExpired(457));
-        $this->assertFalse($cookie->isExpired(455));
-    }
-    
-    function testDateExpiry() {
-        $cookie = new SimpleCookie(
-                "name",
-                "value",
-                "/path",
-                "Mon, 18 Nov 2002 15:50:29 GMT");
-        $this->assertTrue($cookie->isExpired("Mon, 18 Nov 2002 15:50:30 GMT"));
-        $this->assertFalse($cookie->isExpired("Mon, 18 Nov 2002 15:50:28 GMT"));
-    }
-    
-    function testAging() {
-        $cookie = new SimpleCookie("name", "value", "/path", 200);
-        $cookie->agePrematurely(199);
-        $this->assertFalse($cookie->isExpired(0));
-        $cookie->agePrematurely(2);
-        $this->assertTrue($cookie->isExpired(0));
-    }
-}
-
-class TestOfCookieJar extends UnitTestCase {
-    
-    function testAddCookie() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie("a", "A");
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A'));
-    }
-    
-    function testHostFilter() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A', 'my-host.com');
-        $jar->setCookie('b', 'B', 'another-host.com');
-        $jar->setCookie('c', 'C');
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('my-host.com')),
-                array('a=A', 'c=C'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('another-host.com')),
-                array('b=B', 'c=C'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('www.another-host.com')),
-                array('b=B', 'c=C'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('new-host.org')),
-                array('c=C'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('/')),
-                array('a=A', 'b=B', 'c=C'));
-    }
-    
-    function testPathFilter() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A', false, '/path/');
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/elsewhere')), array());
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/')), array('a=A'));
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path')), array('a=A'));
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/pa')), array());
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/here')), array('a=A'));
-    }
-    
-    function testPathFilterDeeply() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A', false, '/path/more_path/');
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/')), array());
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path')), array());
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/pa')), array());
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/more_path/')), array('a=A'));
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/more_path/and_more')), array('a=A'));
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/path/not_here/')), array());
-    }
-    
-    function testMultipleCookieWithDifferentPathsButSameName() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'abc', false, '/');
-        $jar->setCookie('a', '123', false, '/path/here/');
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('/')),
-                array('a=abc'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('my-host.com/')),
-                array('a=abc'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('my-host.com/path/')),
-                array('a=abc'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('my-host.com/path/here')),
-                array('a=abc', 'a=123'));
-        $this->assertEqual(
-                $jar->selectAsPairs(new SimpleUrl('my-host.com/path/here/there')),
-                array('a=abc', 'a=123'));
-    }
-    
-    function testOverwrite() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'abc', false, '/');
-        $jar->setCookie('a', 'cde', false, '/');
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=cde'));
-    }
-    
-    function testClearSessionCookies() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A', false, '/');
-        $jar->restartSession();
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
-    }
-    
-    function testExpiryFilterByDate() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A', false, '/', 'Wed, 25-Dec-02 04:24:20 GMT');
-        $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT");
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A'));
-        $jar->restartSession("Wed, 25-Dec-02 04:24:21 GMT");
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
-    }
-    
-    function testExpiryFilterByAgeing() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A', false, '/', 'Wed, 25-Dec-02 04:24:20 GMT');
-        $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT");
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=A'));
-        $jar->agePrematurely(2);
-        $jar->restartSession("Wed, 25-Dec-02 04:24:19 GMT");
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
-    }
-    
-    function testCookieClearing() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'abc', false, '/');
-        $jar->setCookie('a', '', false, '/');
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a='));
-    }
-    
-    function testCookieClearByLoweringDate() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'abc', false, '/', 'Wed, 25-Dec-02 04:24:21 GMT');
-        $jar->setCookie('a', 'def', false, '/', 'Wed, 25-Dec-02 04:24:19 GMT');
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array('a=def'));
-        $jar->restartSession('Wed, 25-Dec-02 04:24:20 GMT');
-        $this->assertEqual($jar->selectAsPairs(new SimpleUrl('/')), array());
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/detached_test.php b/3rdparty/simpletest/test/detached_test.php
deleted file mode 100644
index f651d97eb61404bf57c31f47760f4b434299976c..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/detached_test.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-// $Id: detached_test.php 1884 2009-07-01 16:30:40Z lastcraft $
-require_once('../detached.php');
-require_once('../reporter.php');
-
-// The following URL will depend on your own installation.
-$command = 'php ' . dirname(__FILE__) . '/visual_test.php xml';
-
-$test = new TestSuite('Remote tests');
-$test->add(new DetachedTestCase($command));
-if (SimpleReporter::inCli()) {
-    exit ($test->run(new TextReporter()) ? 0 : 1);
-}
-$test->run(new HtmlReporter());
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/dumper_test.php b/3rdparty/simpletest/test/dumper_test.php
deleted file mode 100644
index 789047de92467d02abc1a75bf8847335df24d615..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/dumper_test.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-// $Id: dumper_test.php 1505 2007-04-30 23:39:59Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-
-class DumperDummy {
-}
-
-class TestOfTextFormatting extends UnitTestCase {
-    
-    function testClipping() {
-        $dumper = new SimpleDumper();
-        $this->assertEqual(
-                $dumper->clipString("Hello", 6),
-                "Hello",
-                "Hello, 6->%s");
-        $this->assertEqual(
-                $dumper->clipString("Hello", 5),
-                "Hello",
-                "Hello, 5->%s");
-        $this->assertEqual(
-                $dumper->clipString("Hello world", 3),
-                "Hel...",
-                "Hello world, 3->%s");
-        $this->assertEqual(
-                $dumper->clipString("Hello world", 6, 3),
-                "Hello ...",
-                "Hello world, 6, 3->%s");
-        $this->assertEqual(
-                $dumper->clipString("Hello world", 3, 6),
-                "...o w...",
-                "Hello world, 3, 6->%s");
-        $this->assertEqual(
-                $dumper->clipString("Hello world", 4, 11),
-                "...orld",
-                "Hello world, 4, 11->%s");
-        $this->assertEqual(
-                $dumper->clipString("Hello world", 4, 12),
-                "...orld",
-                "Hello world, 4, 12->%s");
-    }
-    
-    function testDescribeNull() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern('/null/i', $dumper->describeValue(null));
-    }
-    
-    function testDescribeBoolean() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern('/boolean/i', $dumper->describeValue(true));
-        $this->assertPattern('/true/i', $dumper->describeValue(true));
-        $this->assertPattern('/false/i', $dumper->describeValue(false));
-    }
-    
-    function testDescribeString() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern('/string/i', $dumper->describeValue('Hello'));
-        $this->assertPattern('/Hello/', $dumper->describeValue('Hello'));
-    }
-    
-    function testDescribeInteger() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern('/integer/i', $dumper->describeValue(35));
-        $this->assertPattern('/35/', $dumper->describeValue(35));
-    }
-    
-    function testDescribeFloat() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern('/float/i', $dumper->describeValue(0.99));
-        $this->assertPattern('/0\.99/', $dumper->describeValue(0.99));
-    }
-    
-    function testDescribeArray() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern('/array/i', $dumper->describeValue(array(1, 4)));
-        $this->assertPattern('/2/i', $dumper->describeValue(array(1, 4)));
-    }
-    
-    function testDescribeObject() {
-        $dumper = new SimpleDumper();
-        $this->assertPattern(
-                '/object/i',
-                $dumper->describeValue(new DumperDummy()));
-        $this->assertPattern(
-                '/DumperDummy/i',
-                $dumper->describeValue(new DumperDummy()));
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/eclipse_test.php b/3rdparty/simpletest/test/eclipse_test.php
deleted file mode 100644
index c90cbc918fd614e6d45f526f33665199deaed9ea..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/eclipse_test.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-// $Id: eclipse_test.php 1739 2008-04-09 20:48:37Z edwardzyang $
-
-//To run this from the eclipse plugin...you need to make sure that the 
-//SimpleTest path in the preferences is the same as the location of the 
-//eclipse.php file below otherwise you end up with two "different" eclipse.php 
-//files included and that does not work...
-
-include_once(dirname(__FILE__) . '/../eclipse.php');
-Mock::generate('SimpleSocket');
-
-class TestOfEclipse extends UnitTestCase {
-	
-	function testPass() {
-		$listener = &new MockSimpleSocket();
-		
-		$fullpath = realpath(dirname(__FILE__).'/support/test1.php');
-		$testpath = EclipseReporter::escapeVal($fullpath);
-		$expected = "{status:\"pass\",message:\"pass1 at [$testpath line 4]\",group:\"$testpath\",case:\"test1\",method:\"test_pass\"}";
-		//this should work...but it doesn't so the next line and the last line are the hacks
-		//$listener->expectOnce('write',array($expected));
-		$listener->setReturnValue('write',-1);
-		
-		$pathparts = pathinfo($fullpath);
-		$filename = $pathparts['basename'];
-		$test= &new TestSuite($filename);
-		$test->addTestFile($fullpath);
-		$test->run(new EclipseReporter($listener));
-		$this->assertEqual($expected,$listener->output);
-	}
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/encoding_test.php b/3rdparty/simpletest/test/encoding_test.php
deleted file mode 100644
index a09236e057cc4df97cb7b5603c36e2e328de8b5d..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/encoding_test.php
+++ /dev/null
@@ -1,240 +0,0 @@
-<?php
-// $Id: encoding_test.php 1963 2009-10-07 11:57:52Z maetl_ $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../url.php');
-require_once(dirname(__FILE__) . '/../socket.php');
-
-Mock::generate('SimpleSocket');
-
-class TestOfEncodedParts extends UnitTestCase {
-    
-    function testFormEncodedAsKeyEqualsValue() {
-        $pair = new SimpleEncodedPair('a', 'A');
-        $this->assertEqual($pair->asRequest(), 'a=A');
-    }
-    
-    function testMimeEncodedAsHeadersAndContent() {
-        $pair = new SimpleEncodedPair('a', 'A');
-        $this->assertEqual(
-                $pair->asMime(),
-                "Content-Disposition: form-data; name=\"a\"\r\n\r\nA");
-    }
-    
-    function testAttachmentEncodedAsHeadersWithDispositionAndContent() {
-        $part = new SimpleAttachment('a', 'A', 'aaa.txt');
-        $this->assertEqual(
-                $part->asMime(),
-                "Content-Disposition: form-data; name=\"a\"; filename=\"aaa.txt\"\r\n" .
-                        "Content-Type: text/plain\r\n\r\nA");
-    }
-}
-
-class TestOfEncoding extends UnitTestCase {
-    private $content_so_far;
-    
-    function write($content) {
-        $this->content_so_far .= $content;
-    }
-    
-    function clear() {
-        $this->content_so_far = '';
-    }
-    
-    function assertWritten($encoding, $content, $message = '%s') {
-        $this->clear();
-        $encoding->writeTo($this);
-        $this->assertIdentical($this->content_so_far, $content, $message);
-    }
-    
-    function testGetEmpty() {
-        $encoding = new SimpleGetEncoding();
-        $this->assertIdentical($encoding->getValue('a'), false);
-        $this->assertIdentical($encoding->asUrlRequest(), '');
-    }
-    
-    function testPostEmpty() {
-        $encoding = new SimplePostEncoding();
-        $this->assertIdentical($encoding->getValue('a'), false);
-        $this->assertWritten($encoding, '');
-    }
-    
-    function testPrefilled() {
-        $encoding = new SimplePostEncoding(array('a' => 'aaa'));
-        $this->assertIdentical($encoding->getValue('a'), 'aaa');
-        $this->assertWritten($encoding, 'a=aaa');
-    }
-    
-    function testPrefilledWithTwoLevels() {
-        $query = array('a' => array('aa' => 'aaa'));
-        $encoding = new SimplePostEncoding($query);
-        $this->assertTrue($encoding->hasMoreThanOneLevel($query));
-        $this->assertEqual($encoding->rewriteArrayWithMultipleLevels($query), array('a[aa]' => 'aaa'));
-        $this->assertIdentical($encoding->getValue('a[aa]'), 'aaa');
-        $this->assertWritten($encoding, 'a%5Baa%5D=aaa');
-    }
-    
-    function testPrefilledWithThreeLevels() {
-        $query = array('a' => array('aa' => array('aaa' => 'aaaa')));
-        $encoding = new SimplePostEncoding($query);
-        $this->assertTrue($encoding->hasMoreThanOneLevel($query));
-        $this->assertEqual($encoding->rewriteArrayWithMultipleLevels($query), array('a[aa][aaa]' => 'aaaa'));
-        $this->assertIdentical($encoding->getValue('a[aa][aaa]'), 'aaaa');
-        $this->assertWritten($encoding, 'a%5Baa%5D%5Baaa%5D=aaaa');
-    }
-    
-    function testPrefilledWithObject() {
-        $encoding = new SimplePostEncoding(new SimpleEncoding(array('a' => 'aaa')));
-        $this->assertIdentical($encoding->getValue('a'), 'aaa');
-        $this->assertWritten($encoding, 'a=aaa');
-    }
-    
-    function testMultiplePrefilled() {
-        $query = array('a' => array('a1', 'a2'));
-        $encoding = new SimplePostEncoding($query);
-        $this->assertTrue($encoding->hasMoreThanOneLevel($query));
-        $this->assertEqual($encoding->rewriteArrayWithMultipleLevels($query), array('a[0]' => 'a1', 'a[1]' => 'a2'));
-        $this->assertIdentical($encoding->getValue('a[0]'), 'a1');
-        $this->assertIdentical($encoding->getValue('a[1]'), 'a2');
-        $this->assertWritten($encoding, 'a%5B0%5D=a1&a%5B1%5D=a2');
-    }
-    
-    function testSingleParameter() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', 'Hello');
-        $this->assertEqual($encoding->getValue('a'), 'Hello');
-        $this->assertWritten($encoding, 'a=Hello');
-    }
-    
-    function testFalseParameter() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', false);
-        $this->assertEqual($encoding->getValue('a'), false);
-        $this->assertWritten($encoding, '');
-    }
-    
-    function testUrlEncoding() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', 'Hello there!');
-        $this->assertWritten($encoding, 'a=Hello+there%21');
-    }
-    
-    function testUrlEncodingOfKey() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a!', 'Hello');
-        $this->assertWritten($encoding, 'a%21=Hello');
-    }
-    
-    function testMultipleParameter() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', 'Hello');
-        $encoding->add('b', 'Goodbye');
-        $this->assertWritten($encoding, 'a=Hello&b=Goodbye');
-    }
-    
-    function testEmptyParameters() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', '');
-        $encoding->add('b', '');
-        $this->assertWritten($encoding, 'a=&b=');
-    }
-    
-    function testRepeatedParameter() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', 'Hello');
-        $encoding->add('a', 'Goodbye');
-        $this->assertIdentical($encoding->getValue('a'), array('Hello', 'Goodbye'));
-        $this->assertWritten($encoding, 'a=Hello&a=Goodbye');
-    }
-    
-    function testAddingLists() {
-        $encoding = new SimplePostEncoding();
-        $encoding->add('a', array('Hello', 'Goodbye'));
-        $this->assertIdentical($encoding->getValue('a'), array('Hello', 'Goodbye'));
-        $this->assertWritten($encoding, 'a=Hello&a=Goodbye');
-    }
-    
-    function testMergeInHash() {
-        $encoding = new SimpleGetEncoding(array('a' => 'A1', 'b' => 'B'));
-        $encoding->merge(array('a' => 'A2'));
-        $this->assertIdentical($encoding->getValue('a'), array('A1', 'A2'));
-        $this->assertIdentical($encoding->getValue('b'), 'B');
-    }
-    
-    function testMergeInObject() {
-        $encoding = new SimpleGetEncoding(array('a' => 'A1', 'b' => 'B'));
-        $encoding->merge(new SimpleEncoding(array('a' => 'A2')));
-        $this->assertIdentical($encoding->getValue('a'), array('A1', 'A2'));
-        $this->assertIdentical($encoding->getValue('b'), 'B');
-    }
-    
-    function testPrefilledMultipart() {
-        $encoding = new SimpleMultipartEncoding(array('a' => 'aaa'), 'boundary');
-        $this->assertIdentical($encoding->getValue('a'), 'aaa');
-        $this->assertwritten($encoding,
-                "--boundary\r\n" .
-                "Content-Disposition: form-data; name=\"a\"\r\n" .
-                "\r\n" .
-                "aaa\r\n" .
-                "--boundary--\r\n");
-    }
-    
-    function testAttachment() {
-        $encoding = new SimpleMultipartEncoding(array(), 'boundary');
-        $encoding->attach('a', 'aaa', 'aaa.txt');
-        $this->assertIdentical($encoding->getValue('a'), 'aaa.txt');
-        $this->assertwritten($encoding,
-                "--boundary\r\n" .
-                "Content-Disposition: form-data; name=\"a\"; filename=\"aaa.txt\"\r\n" .
-                "Content-Type: text/plain\r\n" .
-                "\r\n" .
-                "aaa\r\n" .
-                "--boundary--\r\n");
-    }
-    
-    function testEntityEncodingDefaultContentType() {
-        $encoding = new SimpleEntityEncoding();
-        $this->assertIdentical($encoding->getContentType(), 'application/x-www-form-urlencoded');
-        $this->assertWritten($encoding, '');
-    }
-    
-    function testEntityEncodingTextBody() {
-        $encoding = new SimpleEntityEncoding('plain text');
-        $this->assertIdentical($encoding->getContentType(), 'text/plain');
-        $this->assertWritten($encoding, 'plain text');
-    }
-    
-    function testEntityEncodingXmlBody() {
-        $encoding = new SimpleEntityEncoding('<p><a>xml</b><b>text</b></p>', 'text/xml');
-        $this->assertIdentical($encoding->getContentType(), 'text/xml');
-        $this->assertWritten($encoding, '<p><a>xml</b><b>text</b></p>');
-    }
-}
-
-class TestOfEncodingHeaders extends UnitTestCase {
-    
-    function testEmptyEncodingWritesZeroContentLength() {
-        $socket = new MockSimpleSocket();
-        $socket->expectAt(0, 'write', array("Content-Length: 0\r\n"));
-        $socket->expectAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
-        $encoding = new SimpleEntityEncoding();
-        $encoding->writeHeadersTo($socket);
-    }
-    
-    function testTextEncodingWritesDefaultContentType() {
-        $socket = new MockSimpleSocket();
-        $socket->expectAt(0, 'write', array("Content-Length: 18\r\n"));
-        $socket->expectAt(1, 'write', array("Content-Type: text/plain\r\n"));
-        $encoding = new SimpleEntityEncoding('one two three four');
-        $encoding->writeHeadersTo($socket);
-    }
-    
-    function testEmptyMultipartEncodingWritesEndBoundaryContentLength() {
-        $socket = new MockSimpleSocket();
-        $socket->expectAt(0, 'write', array("Content-Length: 14\r\n"));
-        $socket->expectAt(1, 'write', array("Content-Type: multipart/form-data; boundary=boundary\r\n"));
-        $encoding = new SimpleMultipartEncoding(array(), 'boundary');
-        $encoding->writeHeadersTo($socket);
-    }
-    
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/errors_test.php b/3rdparty/simpletest/test/errors_test.php
deleted file mode 100644
index ebb9e05891f25d15279f986d58732edd096ae984..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/errors_test.php
+++ /dev/null
@@ -1,229 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../errors.php');
-require_once(dirname(__FILE__) . '/../expectation.php');
-require_once(dirname(__FILE__) . '/../test_case.php');
-Mock::generate('SimpleTestCase');
-Mock::generate('SimpleExpectation');
-SimpleTest::ignore('MockSimpleTestCase');
-
-class TestOfErrorQueue extends UnitTestCase {
-
-    function setUp() {
-        $context = SimpleTest::getContext();
-        $queue = $context->get('SimpleErrorQueue');
-        $queue->clear();
-    }
-
-    function tearDown() {
-        $context = SimpleTest::getContext();
-        $queue = $context->get('SimpleErrorQueue');
-        $queue->clear();
-    }
-
-    function testExpectationMatchCancelsIncomingError() {
-        $test = new MockSimpleTestCase();
-        $test->expectOnce('assert', array(
-                new IdenticalExpectation(new AnythingExpectation()),
-                'B',
-                'a message'));
-        $test->setReturnValue('assert', true);
-        $test->expectNever('error');
-        $queue = new SimpleErrorQueue();
-        $queue->setTestCase($test);
-        $queue->expectError(new AnythingExpectation(), 'a message');
-        $queue->add(1024, 'B', 'b.php', 100);
-    }
-}
-
-class TestOfErrorTrap extends UnitTestCase {
-    private $old;
-
-    function setUp() {
-        $this->old = error_reporting(E_ALL);
-        set_error_handler('SimpleTestErrorHandler');
-    }
-
-    function tearDown() {
-        restore_error_handler();
-        error_reporting($this->old);
-    }
-
-    function testQueueStartsEmpty() {
-        $context = SimpleTest::getContext();
-        $queue = $context->get('SimpleErrorQueue');
-        $this->assertFalse($queue->extract());
-    }
-
-    function testErrorsAreSwallowedByMatchingExpectation() {
-        $this->expectError('Ouch!');
-        trigger_error('Ouch!');
-    }
-
-    function testErrorsAreSwallowedInOrder() {
-        $this->expectError('a');
-        $this->expectError('b');
-        trigger_error('a');
-        trigger_error('b');
-    }
-
-    function testAnyErrorCanBeSwallowed() {
-        $this->expectError();
-        trigger_error('Ouch!');
-    }
-
-    function testErrorCanBeSwallowedByPatternMatching() {
-        $this->expectError(new PatternExpectation('/ouch/i'));
-        trigger_error('Ouch!');
-    }
-
-    function testErrorWithPercentsPassesWithNoSprintfError() {
-        $this->expectError("%");
-        trigger_error('%');
-    }
-}
-
-class TestOfErrors extends UnitTestCase {
-    private $old;
-
-    function setUp() {
-        $this->old = error_reporting(E_ALL);
-    }
-
-    function tearDown() {
-        error_reporting($this->old);
-    }
-
-    function testDefaultWhenAllReported() {
-        error_reporting(E_ALL);
-        $this->expectError('Ouch!');
-        trigger_error('Ouch!');
-    }
-
-    function testNoticeWhenReported() {
-        error_reporting(E_ALL);
-        $this->expectError('Ouch!');
-        trigger_error('Ouch!', E_USER_NOTICE);
-    }
-
-    function testWarningWhenReported() {
-        error_reporting(E_ALL);
-        $this->expectError('Ouch!');
-        trigger_error('Ouch!', E_USER_WARNING);
-    }
-
-    function testErrorWhenReported() {
-        error_reporting(E_ALL);
-        $this->expectError('Ouch!');
-        trigger_error('Ouch!', E_USER_ERROR);
-    }
-
-    function testNoNoticeWhenNotReported() {
-        error_reporting(0);
-        trigger_error('Ouch!', E_USER_NOTICE);
-    }
-
-    function testNoWarningWhenNotReported() {
-        error_reporting(0);
-        trigger_error('Ouch!', E_USER_WARNING);
-    }
-
-    function testNoticeSuppressedWhenReported() {
-        error_reporting(E_ALL);
-        @trigger_error('Ouch!', E_USER_NOTICE);
-    }
-
-    function testWarningSuppressedWhenReported() {
-        error_reporting(E_ALL);
-        @trigger_error('Ouch!', E_USER_WARNING);
-    }
-
-    function testErrorWithPercentsReportedWithNoSprintfError() {
-        $this->expectError('%');
-        trigger_error('%');
-    }
-}
-
-class TestOfPHP52RecoverableErrors extends UnitTestCase {
-    function skip() {
-        $this->skipIf(
-                version_compare(phpversion(), '5.2', '<'),
-                'E_RECOVERABLE_ERROR not tested for PHP below 5.2');
-    }
-
-    function testError() {
-        eval('
-            class RecoverableErrorTestingStub {
-                function ouch(RecoverableErrorTestingStub $obj) {
-                }
-            }
-        ');
-
-        $stub = new RecoverableErrorTestingStub();
-        $this->expectError(new PatternExpectation('/must be an instance of RecoverableErrorTestingStub/i'));
-        $stub->ouch(new stdClass());
-    }
-}
-
-class TestOfErrorsExcludingPHP52AndAbove extends UnitTestCase {
-    function skip() {
-        $this->skipIf(
-                version_compare(phpversion(), '5.2', '>='),
-                'E_USER_ERROR not tested for PHP 5.2 and above');
-    }
-
-    function testNoErrorWhenNotReported() {
-        error_reporting(0);
-        trigger_error('Ouch!', E_USER_ERROR);
-    }
-
-    function testErrorSuppressedWhenReported() {
-        error_reporting(E_ALL);
-        @trigger_error('Ouch!', E_USER_ERROR);
-    }
-}
-
-SimpleTest::ignore('TestOfNotEnoughErrors');
-/**
- * This test is ignored as it is used by {@link TestRunnerForLeftOverAndNotEnoughErrors}
- * to verify that it fails as expected.
- *
- * @ignore
- */
-class TestOfNotEnoughErrors extends UnitTestCase {
-    function testExpectTwoErrorsThrowOne() {
-        $this->expectError('Error 1');
-        trigger_error('Error 1');
-        $this->expectError('Error 2');
-    }
-}
-
-SimpleTest::ignore('TestOfLeftOverErrors');
-/**
- * This test is ignored as it is used by {@link TestRunnerForLeftOverAndNotEnoughErrors}
- * to verify that it fails as expected.
- *
- * @ignore
- */
-class TestOfLeftOverErrors extends UnitTestCase {
-    function testExpectOneErrorGetTwo() {
-        $this->expectError('Error 1');
-        trigger_error('Error 1');
-        trigger_error('Error 2');
-    }
-}
-
-class TestRunnerForLeftOverAndNotEnoughErrors extends UnitTestCase {
-    function testRunLeftOverErrorsTestCase() {
-        $test = new TestOfLeftOverErrors();
-        $this->assertFalse($test->run(new SimpleReporter()));
-    }
-
-    function testRunNotEnoughErrors() {
-        $test = new TestOfNotEnoughErrors();
-        $this->assertFalse($test->run(new SimpleReporter()));
-    }
-}
-
-// TODO: Add stacked error handler test
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/exceptions_test.php b/3rdparty/simpletest/test/exceptions_test.php
deleted file mode 100644
index 1011543d4fa8c9443a76377272c7b20513d85379..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/exceptions_test.php
+++ /dev/null
@@ -1,183 +0,0 @@
-<?php
-// $Id: exceptions_test.php 1882 2009-07-01 14:30:05Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../exceptions.php');
-require_once(dirname(__FILE__) . '/../expectation.php');
-require_once(dirname(__FILE__) . '/../test_case.php');
-Mock::generate('SimpleTestCase');
-Mock::generate('SimpleExpectation');
-
-class MyTestException extends Exception {}
-class HigherTestException extends MyTestException {}
-class OtherTestException extends Exception {}
-
-class TestOfExceptionExpectation extends UnitTestCase {
-
-    function testExceptionClassAsStringWillMatchExceptionsRootedOnThatClass() {
-        $expectation = new ExceptionExpectation('MyTestException');
-        $this->assertTrue($expectation->test(new MyTestException()));
-        $this->assertTrue($expectation->test(new HigherTestException()));
-        $this->assertFalse($expectation->test(new OtherTestException()));
-    }
-
-    function testMatchesClassAndMessageWhenExceptionExpected() {
-        $expectation = new ExceptionExpectation(new MyTestException('Hello'));
-        $this->assertTrue($expectation->test(new MyTestException('Hello')));
-        $this->assertFalse($expectation->test(new HigherTestException('Hello')));
-        $this->assertFalse($expectation->test(new OtherTestException('Hello')));
-        $this->assertFalse($expectation->test(new MyTestException('Goodbye')));
-        $this->assertFalse($expectation->test(new MyTestException()));
-    }
-
-    function testMessagelessExceptionMatchesOnlyOnClass() {
-        $expectation = new ExceptionExpectation(new MyTestException());
-        $this->assertTrue($expectation->test(new MyTestException()));
-        $this->assertFalse($expectation->test(new HigherTestException()));
-    }
-}
-
-class TestOfExceptionTrap extends UnitTestCase {
-
-    function testNoExceptionsInQueueMeansNoTestMessages() {
-        $test = new MockSimpleTestCase();
-        $test->expectNever('assert');
-        $queue = new SimpleExceptionTrap();
-        $this->assertFalse($queue->isExpected($test, new Exception()));
-    }
-
-    function testMatchingExceptionGivesTrue() {
-        $expectation = new MockSimpleExpectation();
-        $expectation->setReturnValue('test', true);
-        $test = new MockSimpleTestCase();
-        $test->setReturnValue('assert', true);
-        $queue = new SimpleExceptionTrap();
-        $queue->expectException($expectation, 'message');
-        $this->assertTrue($queue->isExpected($test, new Exception()));
-    }
-
-    function testMatchingExceptionTriggersAssertion() {
-        $test = new MockSimpleTestCase();
-        $test->expectOnce('assert', array(
-                '*',
-                new ExceptionExpectation(new Exception()),
-                'message'));
-        $queue = new SimpleExceptionTrap();
-        $queue->expectException(new ExceptionExpectation(new Exception()), 'message');
-        $queue->isExpected($test, new Exception());
-    }
-}
-
-class TestOfCatchingExceptions extends UnitTestCase {
-
-    function testCanCatchAnyExpectedException() {
-        $this->expectException();
-        throw new Exception();
-    }
-
-    function testCanMatchExceptionByClass() {
-        $this->expectException('MyTestException');
-        throw new HigherTestException();
-    }
-
-    function testCanMatchExceptionExactly() {
-        $this->expectException(new Exception('Ouch'));
-        throw new Exception('Ouch');
-    }
-
-    function testLastListedExceptionIsTheOneThatCounts() {
-        $this->expectException('OtherTestException');
-        $this->expectException('MyTestException');
-        throw new HigherTestException();
-    }
-}
-
-class TestOfIgnoringExceptions extends UnitTestCase {
-
-    function testCanIgnoreAnyException() {
-        $this->ignoreException();
-        throw new Exception();
-    }
-
-    function testCanIgnoreSpecificException() {
-        $this->ignoreException('MyTestException');
-        throw new MyTestException();
-    }
-
-    function testCanIgnoreExceptionExactly() {
-        $this->ignoreException(new Exception('Ouch'));
-        throw new Exception('Ouch');
-    }
-
-    function testIgnoredExceptionsDoNotMaskExpectedExceptions() {
-        $this->ignoreException('Exception');
-        $this->expectException('MyTestException');
-        throw new MyTestException();
-    }
-
-    function testCanIgnoreMultipleExceptions() {
-        $this->ignoreException('MyTestException');
-        $this->ignoreException('OtherTestException');
-        throw new OtherTestException();
-    }
-}
-
-class TestOfCallingTearDownAfterExceptions extends UnitTestCase {
-    private $debri = 0;
-
-    function tearDown() {
-        $this->debri--;
-    }
-
-    function testLeaveSomeDebri() {
-        $this->debri++;
-        $this->expectException();
-        throw new Exception(__FUNCTION__);
-    }
-
-	function testDebriWasRemovedOnce() {
-        $this->assertEqual($this->debri, 0);
-	}
-}
-
-class TestOfExceptionThrownInSetUpDoesNotRunTestBody extends UnitTestCase {
-
-	function setUp() {
-        $this->expectException();
-        throw new Exception();
-	}
-
-	function testShouldNotBeRun() {
-        $this->fail('This test body should not be run');
-	}
-
-	function testShouldNotBeRunEither() {
-        $this->fail('This test body should not be run either');
-	}
-}
-
-class TestOfExpectExceptionWithSetUp extends UnitTestCase {
-
-	function setUp() {
-        $this->expectException();
-	}
-
-	function testThisExceptionShouldBeCaught() {
-        throw new Exception();
-	}
-
-	function testJustThrowingMyTestException() {
-        throw new MyTestException();
-	}
-}
-
-class TestOfThrowingExceptionsInTearDown extends UnitTestCase {
-
-    function tearDown() {
-        throw new Exception();
-    }
-
-    function testDoesntFatal() {
-        $this->expectException();
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/expectation_test.php b/3rdparty/simpletest/test/expectation_test.php
deleted file mode 100644
index 31fbe65e683289b907c14b9bec36e7174cb378db..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/expectation_test.php
+++ /dev/null
@@ -1,317 +0,0 @@
-<?php
-// $Id: expectation_test.php 2009 2011-04-28 08:57:25Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../expectation.php');
-
-class TestOfEquality extends UnitTestCase {
-
-    function testBoolean() {
-        $is_true = new EqualExpectation(true);
-        $this->assertTrue($is_true->test(true));
-        $this->assertFalse($is_true->test(false));
-    }
-
-    function testStringMatch() {
-        $hello = new EqualExpectation("Hello");
-        $this->assertTrue($hello->test("Hello"));
-        $this->assertFalse($hello->test("Goodbye"));
-    }
-
-    function testInteger() {
-        $fifteen = new EqualExpectation(15);
-        $this->assertTrue($fifteen->test(15));
-        $this->assertFalse($fifteen->test(14));
-    }
-
-    function testFloat() {
-        $pi = new EqualExpectation(3.14);
-        $this->assertTrue($pi->test(3.14));
-        $this->assertFalse($pi->test(3.15));
-    }
-
-    function testArray() {
-        $colours = new EqualExpectation(array("r", "g", "b"));
-        $this->assertTrue($colours->test(array("r", "g", "b")));
-        $this->assertFalse($colours->test(array("g", "b", "r")));
-    }
-
-    function testHash() {
-        $is_blue = new EqualExpectation(array("r" => 0, "g" => 0, "b" => 255));
-        $this->assertTrue($is_blue->test(array("r" => 0, "g" => 0, "b" => 255)));
-        $this->assertFalse($is_blue->test(array("r" => 0, "g" => 255, "b" => 0)));
-    }
-
-    function testHashWithOutOfOrderKeysShouldStillMatch() {
-        $any_order = new EqualExpectation(array('a' => 1, 'b' => 2));
-        $this->assertTrue($any_order->test(array('b' => 2, 'a' => 1)));
-    }
-}
-
-class TestOfWithin extends UnitTestCase {
-
-    function testWithinFloatingPointMargin() {
-        $within = new WithinMarginExpectation(1.0, 0.2);
-        $this->assertFalse($within->test(0.7));
-        $this->assertTrue($within->test(0.8));
-        $this->assertTrue($within->test(0.9));
-        $this->assertTrue($within->test(1.1));
-        $this->assertTrue($within->test(1.2));
-        $this->assertFalse($within->test(1.3));
-    }
-
-    function testOutsideFloatingPointMargin() {
-        $within = new OutsideMarginExpectation(1.0, 0.2);
-        $this->assertTrue($within->test(0.7));
-        $this->assertFalse($within->test(0.8));
-        $this->assertFalse($within->test(1.2));
-        $this->assertTrue($within->test(1.3));
-    }
-}
-
-class TestOfInequality extends UnitTestCase {
-
-    function testStringMismatch() {
-        $not_hello = new NotEqualExpectation("Hello");
-        $this->assertTrue($not_hello->test("Goodbye"));
-        $this->assertFalse($not_hello->test("Hello"));
-    }
-}
-
-class RecursiveNasty {
-    private $me;
-
-    function RecursiveNasty() {
-        $this->me = $this;
-    }
-}
-
-class OpaqueContainer {
-    private $stuff;
-    private $value;
-
-    public function __construct($value) {
-        $this->value = $value;
-    }
-}
-
-class DerivedOpaqueContainer extends OpaqueContainer {
-    // Deliberately have a variable whose name with the same suffix as a later
-    // variable
-    private $new_value = 1;
-
-    // Deliberately obscures the variable of the same name in the base
-    // class.
-    private $value;
-
-    public function __construct($value, $base_value) {
-        parent::__construct($base_value);
-        $this->value = $value;
-    }
-}
-
-class TestOfIdentity extends UnitTestCase {
-
-    function testType() {
-        $string = new IdenticalExpectation("37");
-        $this->assertTrue($string->test("37"));
-        $this->assertFalse($string->test(37));
-        $this->assertFalse($string->test("38"));
-    }
-
-    function _testNastyPhp5Bug() {
-        $this->assertFalse(new RecursiveNasty() != new RecursiveNasty());
-    }
-
-    function _testReallyHorribleRecursiveStructure() {
-        $hopeful = new IdenticalExpectation(new RecursiveNasty());
-        $this->assertTrue($hopeful->test(new RecursiveNasty()));
-    }
-
-    function testCanComparePrivateMembers() {
-        $expectFive = new IdenticalExpectation(new OpaqueContainer(5));
-        $this->assertTrue($expectFive->test(new OpaqueContainer(5)));
-        $this->assertFalse($expectFive->test(new OpaqueContainer(6)));
-    }
-
-    function testCanComparePrivateMembersOfObjectsInArrays() {
-        $expectFive = new IdenticalExpectation(array(new OpaqueContainer(5)));
-        $this->assertTrue($expectFive->test(array(new OpaqueContainer(5))));
-        $this->assertFalse($expectFive->test(array(new OpaqueContainer(6))));
-    }
-
-    function testCanComparePrivateMembersOfObjectsWherePrivateMemberOfBaseClassIsObscured() {
-        $expectFive = new IdenticalExpectation(array(new DerivedOpaqueContainer(1,2)));
-        $this->assertTrue($expectFive->test(array(new DerivedOpaqueContainer(1,2))));
-        $this->assertFalse($expectFive->test(array(new DerivedOpaqueContainer(0,2))));
-        $this->assertFalse($expectFive->test(array(new DerivedOpaqueContainer(0,9))));
-        $this->assertFalse($expectFive->test(array(new DerivedOpaqueContainer(1,0))));
-    }
-}
-
-class TransparentContainer {
-    public $value;
-
-    public function __construct($value) {
-        $this->value = $value;
-    }
-}
-
-class TestOfMemberComparison extends UnitTestCase {
-
-    function testMemberExpectationCanMatchPublicMember() {
-        $expect_five = new MemberExpectation('value', 5);
-        $this->assertTrue($expect_five->test(new TransparentContainer(5)));
-        $this->assertFalse($expect_five->test(new TransparentContainer(8)));
-    }
-
-    function testMemberExpectationCanMatchPrivateMember() {
-        $expect_five = new MemberExpectation('value', 5);
-        $this->assertTrue($expect_five->test(new OpaqueContainer(5)));
-        $this->assertFalse($expect_five->test(new OpaqueContainer(8)));
-    }
-
-    function testMemberExpectationCanMatchPrivateMemberObscuredByDerivedClass() {
-        $expect_five = new MemberExpectation('value', 5);
-        $this->assertTrue($expect_five->test(new DerivedOpaqueContainer(5,8)));
-        $this->assertTrue($expect_five->test(new DerivedOpaqueContainer(5,5)));
-        $this->assertFalse($expect_five->test(new DerivedOpaqueContainer(8,8)));
-        $this->assertFalse($expect_five->test(new DerivedOpaqueContainer(8,5)));
-    }
-
-}
-
-class DummyReferencedObject{}
-
-class TestOfReference extends UnitTestCase {
-
-    function testReference() {
-        $foo = "foo";
-        $ref = &$foo;
-        $not_ref = $foo;
-        $bar = "bar";
-
-        $expect = new ReferenceExpectation($foo);
-        $this->assertTrue($expect->test($ref));
-        $this->assertFalse($expect->test($not_ref));
-        $this->assertFalse($expect->test($bar));
-    }
-}
-
-class TestOfNonIdentity extends UnitTestCase {
-
-    function testType() {
-        $string = new NotIdenticalExpectation("37");
-        $this->assertTrue($string->test("38"));
-        $this->assertTrue($string->test(37));
-        $this->assertFalse($string->test("37"));
-    }
-}
-
-class TestOfPatterns extends UnitTestCase {
-
-    function testWanted() {
-        $pattern = new PatternExpectation('/hello/i');
-        $this->assertTrue($pattern->test("Hello world"));
-        $this->assertFalse($pattern->test("Goodbye world"));
-    }
-
-    function testUnwanted() {
-        $pattern = new NoPatternExpectation('/hello/i');
-        $this->assertFalse($pattern->test("Hello world"));
-        $this->assertTrue($pattern->test("Goodbye world"));
-    }
-}
-
-class ExpectedMethodTarget {
-    function hasThisMethod() {}
-}
-
-class TestOfMethodExistence extends UnitTestCase {
-
-    function testHasMethod() {
-        $instance = new ExpectedMethodTarget();
-        $expectation = new MethodExistsExpectation('hasThisMethod');
-        $this->assertTrue($expectation->test($instance));
-        $expectation = new MethodExistsExpectation('doesNotHaveThisMethod');
-        $this->assertFalse($expectation->test($instance));
-    }
-}
-
-class TestOfIsA extends UnitTestCase {
-
-    function testString() {
-        $expectation = new IsAExpectation('string');
-        $this->assertTrue($expectation->test('Hello'));
-        $this->assertFalse($expectation->test(5));
-    }
-
-    function testBoolean() {
-        $expectation = new IsAExpectation('boolean');
-        $this->assertTrue($expectation->test(true));
-        $this->assertFalse($expectation->test(1));
-    }
-
-    function testBool() {
-        $expectation = new IsAExpectation('bool');
-        $this->assertTrue($expectation->test(true));
-        $this->assertFalse($expectation->test(1));
-    }
-
-    function testDouble() {
-        $expectation = new IsAExpectation('double');
-        $this->assertTrue($expectation->test(5.0));
-        $this->assertFalse($expectation->test(5));
-    }
-
-    function testFloat() {
-        $expectation = new IsAExpectation('float');
-        $this->assertTrue($expectation->test(5.0));
-        $this->assertFalse($expectation->test(5));
-    }
-
-    function testReal() {
-        $expectation = new IsAExpectation('real');
-        $this->assertTrue($expectation->test(5.0));
-        $this->assertFalse($expectation->test(5));
-    }
-
-    function testInteger() {
-        $expectation = new IsAExpectation('integer');
-        $this->assertTrue($expectation->test(5));
-        $this->assertFalse($expectation->test(5.0));
-    }
-
-    function testInt() {
-        $expectation = new IsAExpectation('int');
-        $this->assertTrue($expectation->test(5));
-        $this->assertFalse($expectation->test(5.0));
-    }
-
-    function testScalar() {
-        $expectation = new IsAExpectation('scalar');
-        $this->assertTrue($expectation->test(5));
-        $this->assertFalse($expectation->test(array(5)));
-    }
-
-    function testNumeric() {
-        $expectation = new IsAExpectation('numeric');
-        $this->assertTrue($expectation->test(5));
-        $this->assertFalse($expectation->test('string'));
-    }
-
-    function testNull() {
-        $expectation = new IsAExpectation('null');
-        $this->assertTrue($expectation->test(null));
-        $this->assertFalse($expectation->test('string'));
-    }
-}
-
-class TestOfNotA extends UnitTestCase {
-
-    function testString() {
-        $expectation = new NotAExpectation('string');
-        $this->assertFalse($expectation->test('Hello'));
-        $this->assertTrue($expectation->test(5));
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/form_test.php b/3rdparty/simpletest/test/form_test.php
deleted file mode 100644
index 70a18f2b3a0a3abe7cfccb6c4475f0bc6fbb3b08..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/form_test.php
+++ /dev/null
@@ -1,344 +0,0 @@
-<?php
-// $Id: form_test.php 1996 2010-07-27 09:11:59Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../url.php');
-require_once(dirname(__FILE__) . '/../form.php');
-require_once(dirname(__FILE__) . '/../page.php');
-require_once(dirname(__FILE__) . '/../encoding.php');
-Mock::generate('SimplePage');
-
-class TestOfForm extends UnitTestCase {
-    
-    function page($url, $action = false) {
-        $page = new MockSimplePage();
-        $page->returns('getUrl', new SimpleUrl($url));
-        $page->returns('expandUrl', new SimpleUrl($url));
-        return $page;
-    }
-    
-    function testFormAttributes() {
-        $tag = new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php', 'id' => '33'));
-        $form = new SimpleForm($tag, $this->page('http://host/a/index.html'));
-        $this->assertEqual($form->getMethod(), 'get');
-        $this->assertIdentical($form->getId(), '33');
-        $this->assertNull($form->getValue(new SimpleByName('a')));
-    }
-    
-    function testAction() {
-        $page = new MockSimplePage();
-        $page->expectOnce('expandUrl', array(new SimpleUrl('here.php')));
-        $page->setReturnValue('expandUrl', new SimpleUrl('http://host/here.php'));
-        $tag = new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php'));
-        $form = new SimpleForm($tag, $page);
-        $this->assertEqual($form->getAction(), new SimpleUrl('http://host/here.php'));
-    }
-    
-    function testEmptyAction() {
-        $tag = new SimpleFormTag(array('method' => 'GET', 'action' => '', 'id' => '33'));
-        $form = new SimpleForm($tag, $this->page('http://host/a/index.html'));
-        $this->assertEqual(
-                $form->getAction(),
-                new SimpleUrl('http://host/a/index.html'));
-    }
-    
-    function testMissingAction() {
-        $tag = new SimpleFormTag(array('method' => 'GET'));
-        $form = new SimpleForm($tag, $this->page('http://host/a/index.html'));
-        $this->assertEqual(
-                $form->getAction(),
-                new SimpleUrl('http://host/a/index.html'));
-    }
-    
-    function testRootAction() {
-        $page = new MockSimplePage();
-        $page->expectOnce('expandUrl', array(new SimpleUrl('/')));
-        $page->setReturnValue('expandUrl', new SimpleUrl('http://host/'));
-        $tag = new SimpleFormTag(array('method' => 'GET', 'action' => '/'));
-        $form = new SimpleForm($tag, $page);
-        $this->assertEqual(
-                $form->getAction(),
-                new SimpleUrl('http://host/'));
-    }
-    
-    function testDefaultFrameTargetOnForm() {
-        $page = new MockSimplePage();
-        $page->expectOnce('expandUrl', array(new SimpleUrl('here.php')));
-        $page->setReturnValue('expandUrl', new SimpleUrl('http://host/here.php'));
-        $tag = new SimpleFormTag(array('method' => 'GET', 'action' => 'here.php'));
-        $form = new SimpleForm($tag, $page);
-        $form->setDefaultTarget('frame');
-        $expected = new SimpleUrl('http://host/here.php');
-        $expected->setTarget('frame');
-        $this->assertEqual($form->getAction(), $expected);
-    }
-    
-    function testTextWidget() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleTextTag(
-                array('name' => 'me', 'type' => 'text', 'value' => 'Myself')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'Myself');
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'Not me'));
-        $this->assertFalse($form->setField(new SimpleByName('not_present'), 'Not me'));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'Not me');
-        $this->assertNull($form->getValue(new SimpleByName('not_present')));
-    }
-    
-    function testTextWidgetById() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleTextTag(
-                array('name' => 'me', 'type' => 'text', 'value' => 'Myself', 'id' => 50)));
-        $this->assertIdentical($form->getValue(new SimpleById(50)), 'Myself');
-        $this->assertTrue($form->setField(new SimpleById(50), 'Not me'));
-        $this->assertIdentical($form->getValue(new SimpleById(50)), 'Not me');
-    }
-    
-    function testTextWidgetByLabel() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $widget = new SimpleTextTag(array('name' => 'me', 'type' => 'text', 'value' => 'a'));
-        $form->addWidget($widget);
-        $widget->setLabel('thing');
-        $this->assertIdentical($form->getValue(new SimpleByLabel('thing')), 'a');
-        $this->assertTrue($form->setField(new SimpleByLabel('thing'), 'b'));
-        $this->assertIdentical($form->getValue(new SimpleByLabel('thing')), 'b');
-    }
-    
-    function testSubmitEmpty() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $this->assertIdentical($form->submit(), new SimpleGetEncoding());
-    }
-    
-    function testSubmitButton() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
-        $form->addWidget(new SimpleSubmitTag(
-                array('type' => 'submit', 'name' => 'go', 'value' => 'Go!', 'id' => '9')));
-        $this->assertTrue($form->hasSubmit(new SimpleByName('go')));
-        $this->assertEqual($form->getValue(new SimpleByName('go')), 'Go!');
-        $this->assertEqual($form->getValue(new SimpleById(9)), 'Go!');
-        $this->assertEqual(
-                $form->submitButton(new SimpleByName('go')),
-                new SimpleGetEncoding(array('go' => 'Go!')));            
-        $this->assertEqual(
-                $form->submitButton(new SimpleByLabel('Go!')),
-                new SimpleGetEncoding(array('go' => 'Go!')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleById(9)),
-                new SimpleGetEncoding(array('go' => 'Go!')));            
-    }
-    
-    function testSubmitWithAdditionalParameters() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
-        $form->addWidget(new SimpleSubmitTag(
-                array('type' => 'submit', 'name' => 'go', 'value' => 'Go!')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleByLabel('Go!'), array('a' => 'A')),
-                new SimpleGetEncoding(array('go' => 'Go!', 'a' => 'A')));            
-    }
-    
-    function testSubmitButtonWithLabelOfSubmit() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
-        $form->addWidget(new SimpleSubmitTag(
-                array('type' => 'submit', 'name' => 'test', 'value' => 'Submit')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleByName('test')),
-                new SimpleGetEncoding(array('test' => 'Submit')));            
-        $this->assertEqual(
-                $form->submitButton(new SimpleByLabel('Submit')),
-                new SimpleGetEncoding(array('test' => 'Submit')));            
-    }
-    
-    function testSubmitButtonWithWhitespacePaddedLabelOfSubmit() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
-        $form->addWidget(new SimpleSubmitTag(
-                array('type' => 'submit', 'name' => 'test', 'value' => ' Submit ')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleByLabel('Submit')),
-                new SimpleGetEncoding(array('test' => ' Submit ')));            
-    }
-    
-    function testImageSubmitButton() {
-        $form = new SimpleForm(new SimpleFormTag(array()),  $this->page('htp://host'));
-        $form->addWidget(new SimpleImageSubmitTag(array(
-                'type' => 'image',
-                'src' => 'source.jpg',
-                'name' => 'go',
-                'alt' => 'Go!',
-                'id' => '9')));
-        $this->assertTrue($form->hasImage(new SimpleByLabel('Go!')));
-        $this->assertEqual(
-                $form->submitImage(new SimpleByLabel('Go!'), 100, 101),
-                new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101)));
-        $this->assertTrue($form->hasImage(new SimpleByName('go')));
-        $this->assertEqual(
-                $form->submitImage(new SimpleByName('go'), 100, 101),
-                new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101)));
-        $this->assertTrue($form->hasImage(new SimpleById(9)));
-        $this->assertEqual(
-                $form->submitImage(new SimpleById(9), 100, 101),
-                new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101)));
-    }
-    
-    function testImageSubmitButtonWithAdditionalData() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleImageSubmitTag(array(
-                'type' => 'image',
-                'src' => 'source.jpg',
-                'name' => 'go',
-                'alt' => 'Go!')));
-        $this->assertEqual(
-                $form->submitImage(new SimpleByLabel('Go!'), 100, 101, array('a' => 'A')),
-                new SimpleGetEncoding(array('go.x' => 100, 'go.y' => 101, 'a' => 'A')));
-    }
-    
-    function testButtonTag() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('http://host'));
-        $widget = new SimpleButtonTag(
-                array('type' => 'submit', 'name' => 'go', 'value' => 'Go', 'id' => '9'));
-        $widget->addContent('Go!');
-        $form->addWidget($widget);
-        $this->assertTrue($form->hasSubmit(new SimpleByName('go')));
-        $this->assertTrue($form->hasSubmit(new SimpleByLabel('Go!')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleByName('go')),
-                new SimpleGetEncoding(array('go' => 'Go')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleByLabel('Go!')),
-                new SimpleGetEncoding(array('go' => 'Go')));
-        $this->assertEqual(
-                $form->submitButton(new SimpleById(9)),
-                new SimpleGetEncoding(array('go' => 'Go')));
-    }
-    
-    function testMultipleFieldsWithSameNameSubmitted() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $input = new SimpleTextTag(array('name' => 'elements[]', 'value' => '1'));
-        $form->addWidget($input);
-        $input = new SimpleTextTag(array('name' => 'elements[]', 'value' => '2'));
-        $form->addWidget($input);
-        $form->setField(new SimpleByLabelOrName('elements[]'), '3', 1);
-        $form->setField(new SimpleByLabelOrName('elements[]'), '4', 2);
-		$submit = $form->submit();
-		$requests = $submit->getAll();
-        $this->assertEqual(count($requests), 2);
-        $this->assertIdentical($requests[0], new SimpleEncodedPair('elements[]', '3'));
-        $this->assertIdentical($requests[1], new SimpleEncodedPair('elements[]', '4'));
-    }
-    
-    function testSingleSelectFieldSubmitted() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $select = new SimpleSelectionTag(array('name' => 'a'));
-        $select->addTag(new SimpleOptionTag(
-                array('value' => 'aaa', 'selected' => '')));
-        $form->addWidget($select);
-        $this->assertIdentical(
-                $form->submit(),
-                new SimpleGetEncoding(array('a' => 'aaa')));
-    }
-    
-    function testSingleSelectFieldSubmittedWithPost() {
-        $form = new SimpleForm(new SimpleFormTag(array('method' => 'post')), $this->page('htp://host'));
-        $select = new SimpleSelectionTag(array('name' => 'a'));
-        $select->addTag(new SimpleOptionTag(
-                array('value' => 'aaa', 'selected' => '')));
-        $form->addWidget($select);
-        $this->assertIdentical(
-                $form->submit(),
-                new SimplePostEncoding(array('a' => 'aaa')));
-    }
-    
-    function testUnchecked() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleCheckboxTag(
-                array('name' => 'me', 'type' => 'checkbox')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), false);
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'on'));
-        $this->assertEqual($form->getValue(new SimpleByName('me')), 'on');
-        $this->assertFalse($form->setField(new SimpleByName('me'), 'other'));
-        $this->assertEqual($form->getValue(new SimpleByName('me')), 'on');
-    }
-    
-    function testChecked() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleCheckboxTag(
-                array('name' => 'me', 'value' => 'a', 'type' => 'checkbox', 'checked' => '')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
-        $this->assertEqual($form->getValue(new SimpleByName('me')), 'a');
-        $this->assertTrue($form->setField(new SimpleByName('me'), false));
-        $this->assertEqual($form->getValue(new SimpleByName('me')), false);
-    }
-    
-    function testSingleUncheckedRadioButton() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleRadioButtonTag(
-                array('name' => 'me', 'value' => 'a', 'type' => 'radio')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), false);
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
-        $this->assertEqual($form->getValue(new SimpleByName('me')), 'a');
-    }
-    
-    function testSingleCheckedRadioButton() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleRadioButtonTag(
-                array('name' => 'me', 'value' => 'a', 'type' => 'radio', 'checked' => '')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
-        $this->assertFalse($form->setField(new SimpleByName('me'), 'other'));
-    }
-    
-    function testUncheckedRadioButtons() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleRadioButtonTag(
-                array('name' => 'me', 'value' => 'a', 'type' => 'radio')));
-        $form->addWidget(new SimpleRadioButtonTag(
-                array('name' => 'me', 'value' => 'b', 'type' => 'radio')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), false);
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'b'));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b');
-        $this->assertFalse($form->setField(new SimpleByName('me'), 'c'));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b');
-    }
-    
-    function testCheckedRadioButtons() {
-        $form = new SimpleForm(new SimpleFormTag(array()), $this->page('htp://host'));
-        $form->addWidget(new SimpleRadioButtonTag(
-                array('name' => 'me', 'value' => 'a', 'type' => 'radio')));
-        $form->addWidget(new SimpleRadioButtonTag(
-                array('name' => 'me', 'value' => 'b', 'type' => 'radio', 'checked' => '')));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'b');
-        $this->assertTrue($form->setField(new SimpleByName('me'), 'a'));
-        $this->assertIdentical($form->getValue(new SimpleByName('me')), 'a');
-    }
-    
-    function testMultipleFieldsWithSameKey() {
-        $form = new SimpleForm(new SimpleFormTag(array()),  $this->page('htp://host'));
-        $form->addWidget(new SimpleCheckboxTag(
-                array('name' => 'a', 'type' => 'checkbox', 'value' => 'me')));
-        $form->addWidget(new SimpleCheckboxTag(
-                array('name' => 'a', 'type' => 'checkbox', 'value' => 'you')));
-        $this->assertIdentical($form->getValue(new SimpleByName('a')), false);
-        $this->assertTrue($form->setField(new SimpleByName('a'), 'me'));
-        $this->assertIdentical($form->getValue(new SimpleByName('a')), 'me');
-    }
-
-    function testRemoveGetParamsFromAction() {
-        Mock::generatePartial('SimplePage', 'MockPartialSimplePage', array('getUrl'));
-        $page = new MockPartialSimplePage();
-        $page->returns('getUrl', new SimpleUrl('htp://host/'));
-
-        # Keep GET params in "action", if the form has no widgets
-        $form = new SimpleForm(new SimpleFormTag(array('action'=>'?test=1')), $page);
-        $this->assertEqual($form->getAction()->asString(), 'htp://host/');
-
-        $form = new SimpleForm(new SimpleFormTag(array('action'=>'?test=1')),  $page);
-        $form->addWidget(new SimpleTextTag(array('name' => 'me', 'type' => 'text', 'value' => 'a')));
-        $this->assertEqual($form->getAction()->asString(), 'htp://host/');
-
-        $form = new SimpleForm(new SimpleFormTag(array('action'=>'')),  $page);
-        $this->assertEqual($form->getAction()->asString(), 'htp://host/');
-
-        $form = new SimpleForm(new SimpleFormTag(array('action'=>'?test=1', 'method'=>'post')),  $page);
-        $this->assertEqual($form->getAction()->asString(), 'htp://host/?test=1');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/frames_test.php b/3rdparty/simpletest/test/frames_test.php
deleted file mode 100644
index 29309700e3115ff1b30ac08ec9f522466f9c96ee..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/frames_test.php
+++ /dev/null
@@ -1,549 +0,0 @@
-<?php
-// $Id: frames_test.php 1899 2009-07-28 19:33:42Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../tag.php');
-require_once(dirname(__FILE__) . '/../page.php');
-require_once(dirname(__FILE__) . '/../frames.php');
-Mock::generate('SimplePage');
-Mock::generate('SimpleForm');
-
-class TestOfFrameset extends UnitTestCase {
-
-    function testTitleReadFromFramesetPage() {
-        $page = new MockSimplePage();
-        $page->setReturnValue('getTitle', 'This page');
-        $frameset = new SimpleFrameset($page);
-        $this->assertEqual($frameset->getTitle(), 'This page');
-    }
-
-    function TestHeadersReadFromFramesetByDefault() {
-        $page = new MockSimplePage();
-        $page->setReturnValue('getHeaders', 'Header: content');
-        $page->setReturnValue('getMimeType', 'text/xml');
-        $page->setReturnValue('getResponseCode', 401);
-        $page->setReturnValue('getTransportError', 'Could not parse headers');
-        $page->setReturnValue('getAuthentication', 'Basic');
-        $page->setReturnValue('getRealm', 'Safe place');
-
-        $frameset = new SimpleFrameset($page);
-
-        $this->assertIdentical($frameset->getHeaders(), 'Header: content');
-        $this->assertIdentical($frameset->getMimeType(), 'text/xml');
-        $this->assertIdentical($frameset->getResponseCode(), 401);
-        $this->assertIdentical($frameset->getTransportError(), 'Could not parse headers');
-        $this->assertIdentical($frameset->getAuthentication(), 'Basic');
-        $this->assertIdentical($frameset->getRealm(), 'Safe place');
-    }
-
-    function testEmptyFramesetHasNoContent() {
-        $page = new MockSimplePage();
-        $page->setReturnValue('getRaw', 'This content');
-        $frameset = new SimpleFrameset($page);
-        $this->assertEqual($frameset->getRaw(), '');
-    }
-
-    function testRawContentIsFromOnlyFrame() {
-        $page = new MockSimplePage();
-        $page->expectNever('getRaw');
-
-        $frame = new MockSimplePage();
-        $frame->setReturnValue('getRaw', 'Stuff');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame);
-        $this->assertEqual($frameset->getRaw(), 'Stuff');
-    }
-
-    function testRawContentIsFromAllFrames() {
-        $page = new MockSimplePage();
-        $page->expectNever('getRaw');
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getRaw', 'Stuff1');
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getRaw', 'Stuff2');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2);
-        $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2');
-    }
-
-    function testTextContentIsFromOnlyFrame() {
-        $page = new MockSimplePage();
-        $page->expectNever('getText');
-
-        $frame = new MockSimplePage();
-        $frame->setReturnValue('getText', 'Stuff');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame);
-        $this->assertEqual($frameset->getText(), 'Stuff');
-    }
-
-    function testTextContentIsFromAllFrames() {
-        $page = new MockSimplePage();
-        $page->expectNever('getText');
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getText', 'Stuff1');
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getText', 'Stuff2');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2);
-        $this->assertEqual($frameset->getText(), 'Stuff1 Stuff2');
-    }
-
-    function testFieldFoundIsFirstInFramelist() {
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getField', null);
-        $frame1->expectOnce('getField', array(new SimpleByName('a')));
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getField', 'A');
-        $frame2->expectOnce('getField', array(new SimpleByName('a')));
-
-        $frame3 = new MockSimplePage();
-        $frame3->expectNever('getField');
-
-        $page = new MockSimplePage();
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2);
-        $frameset->addFrame($frame3);
-        $this->assertIdentical($frameset->getField(new SimpleByName('a')), 'A');
-    }
-
-    function testFrameReplacementByIndex() {
-        $page = new MockSimplePage();
-        $page->expectNever('getRaw');
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getRaw', 'Stuff1');
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getRaw', 'Stuff2');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1);
-        $frameset->setFrame(array(1), $frame2);
-        $this->assertEqual($frameset->getRaw(), 'Stuff2');
-    }
-
-    function testFrameReplacementByName() {
-        $page = new MockSimplePage();
-        $page->expectNever('getRaw');
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getRaw', 'Stuff1');
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getRaw', 'Stuff2');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1, 'a');
-        $frameset->setFrame(array('a'), $frame2);
-        $this->assertEqual($frameset->getRaw(), 'Stuff2');
-    }
-}
-
-class TestOfFrameNavigation extends UnitTestCase {
-
-    function testStartsWithoutFrameFocus() {
-        $page = new MockSimplePage();
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame(new MockSimplePage());
-        $this->assertFalse($frameset->getFrameFocus());
-    }
-
-    function testCanFocusOnSingleFrame() {
-        $page = new MockSimplePage();
-        $page->expectNever('getRaw');
-
-        $frame = new MockSimplePage();
-        $frame->setReturnValue('getFrameFocus', array());
-        $frame->setReturnValue('getRaw', 'Stuff');
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame);
-
-        $this->assertFalse($frameset->setFrameFocusByIndex(0));
-        $this->assertTrue($frameset->setFrameFocusByIndex(1));
-        $this->assertEqual($frameset->getRaw(), 'Stuff');
-        $this->assertFalse($frameset->setFrameFocusByIndex(2));
-        $this->assertIdentical($frameset->getFrameFocus(), array(1));
-    }
-
-    function testContentComesFromFrameInFocus() {
-        $page = new MockSimplePage();
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getRaw', 'Stuff1');
-        $frame1->setReturnValue('getFrameFocus', array());
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getRaw', 'Stuff2');
-        $frame2->setReturnValue('getFrameFocus', array());
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2);
-
-        $this->assertTrue($frameset->setFrameFocusByIndex(1));
-        $this->assertEqual($frameset->getFrameFocus(), array(1));
-        $this->assertEqual($frameset->getRaw(), 'Stuff1');
-
-        $this->assertTrue($frameset->setFrameFocusByIndex(2));
-        $this->assertEqual($frameset->getFrameFocus(), array(2));
-        $this->assertEqual($frameset->getRaw(), 'Stuff2');
-
-        $this->assertFalse($frameset->setFrameFocusByIndex(3));
-        $this->assertEqual($frameset->getFrameFocus(), array(2));
-
-        $frameset->clearFrameFocus();
-        $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2');
-    }
-
-    function testCanFocusByName() {
-        $page = new MockSimplePage();
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getRaw', 'Stuff1');
-        $frame1->setReturnValue('getFrameFocus', array());
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getRaw', 'Stuff2');
-        $frame2->setReturnValue('getFrameFocus', array());
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1, 'A');
-        $frameset->addFrame($frame2, 'B');
-
-        $this->assertTrue($frameset->setFrameFocus('A'));
-        $this->assertEqual($frameset->getFrameFocus(), array('A'));
-        $this->assertEqual($frameset->getRaw(), 'Stuff1');
-
-        $this->assertTrue($frameset->setFrameFocusByIndex(2));
-        $this->assertEqual($frameset->getFrameFocus(), array('B'));
-        $this->assertEqual($frameset->getRaw(), 'Stuff2');
-
-        $this->assertFalse($frameset->setFrameFocus('z'));
-
-        $frameset->clearFrameFocus();
-        $this->assertEqual($frameset->getRaw(), 'Stuff1Stuff2');
-    }
-}
-
-class TestOfFramesetPageInterface extends UnitTestCase {
-    private $page_interface;
-    private $frameset_interface;
-
-    function __construct() {
-        parent::__construct();
-        $this->page_interface = $this->getPageMethods();
-        $this->frameset_interface = $this->getFramesetMethods();
-    }
-
-    function assertListInAnyOrder($list, $expected) {
-        sort($list);
-        sort($expected);
-        $this->assertEqual($list, $expected);
-    }
-
-    private function getPageMethods() {
-        $methods = array();
-        foreach (get_class_methods('SimplePage') as $method) {
-            if (strtolower($method) == strtolower('SimplePage')) {
-                continue;
-            }
-            if (strtolower($method) == strtolower('getFrameset')) {
-                continue;
-            }
-            if (strncmp($method, '_', 1) == 0) {
-                continue;
-            }
-            if (in_array($method, array('setTitle', 'setBase', 'setForms', 'normalise', 'setFrames', 'addLink'))) {
-                continue;
-            }
-            $methods[] = $method;
-        }
-        return $methods;
-    }
-
-    private function getFramesetMethods() {
-        $methods = array();
-        foreach (get_class_methods('SimpleFrameset') as $method) {
-            if (strtolower($method) == strtolower('SimpleFrameset')) {
-                continue;
-            }
-            if (strncmp($method, '_', 1) == 0) {
-                continue;
-            }
-            if (strncmp($method, 'add', 3) == 0) {
-                continue;
-            }
-            $methods[] = $method;
-        }
-        return $methods;
-    }
-
-    function testFramsetHasPageInterface() {
-        $difference = array();
-        foreach ($this->page_interface as $method) {
-            if (! in_array($method, $this->frameset_interface)) {
-                $this->fail("No [$method] in Frameset class");
-                return;
-            }
-        }
-        $this->pass('Frameset covers Page interface');
-    }
-
-    function testHeadersReadFromFrameIfInFocus() {
-        $frame = new MockSimplePage();
-        $frame->setReturnValue('getUrl', new SimpleUrl('http://localhost/stuff'));
-
-        $frame->setReturnValue('getRequest', 'POST stuff');
-        $frame->setReturnValue('getMethod', 'POST');
-        $frame->setReturnValue('getRequestData', array('a' => 'A'));
-        $frame->setReturnValue('getHeaders', 'Header: content');
-        $frame->setReturnValue('getMimeType', 'text/xml');
-        $frame->setReturnValue('getResponseCode', 401);
-        $frame->setReturnValue('getTransportError', 'Could not parse headers');
-        $frame->setReturnValue('getAuthentication', 'Basic');
-        $frame->setReturnValue('getRealm', 'Safe place');
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame);
-        $frameset->setFrameFocusByIndex(1);
-
-        $url = new SimpleUrl('http://localhost/stuff');
-        $url->setTarget(1);
-        $this->assertIdentical($frameset->getUrl(), $url);
-
-        $this->assertIdentical($frameset->getRequest(), 'POST stuff');
-        $this->assertIdentical($frameset->getMethod(), 'POST');
-        $this->assertIdentical($frameset->getRequestData(), array('a' => 'A'));
-        $this->assertIdentical($frameset->getHeaders(), 'Header: content');
-        $this->assertIdentical($frameset->getMimeType(), 'text/xml');
-        $this->assertIdentical($frameset->getResponseCode(), 401);
-        $this->assertIdentical($frameset->getTransportError(), 'Could not parse headers');
-        $this->assertIdentical($frameset->getAuthentication(), 'Basic');
-        $this->assertIdentical($frameset->getRealm(), 'Safe place');
-    }
-
-    function testUrlsComeFromBothFrames() {
-        $page = new MockSimplePage();
-        $page->expectNever('getUrls');
-
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue(
-                'getUrls',
-                array('http://www.lastcraft.com/', 'http://myserver/'));
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue(
-                'getUrls',
-                array('http://www.lastcraft.com/', 'http://test/'));
-
-        $frameset = new SimpleFrameset($page);
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2);
-        $this->assertListInAnyOrder(
-                $frameset->getUrls(),
-                array('http://www.lastcraft.com/', 'http://myserver/', 'http://test/'));
-    }
-
-    function testLabelledUrlsComeFromBothFrames() {
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue(
-                'getUrlsByLabel',
-                array(new SimpleUrl('goodbye.php')),
-                array('a'));
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue(
-                'getUrlsByLabel',
-                array(new SimpleUrl('hello.php')),
-                array('a'));
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2, 'Two');
-
-        $expected1 = new SimpleUrl('goodbye.php');
-        $expected1->setTarget(1);
-        $expected2 = new SimpleUrl('hello.php');
-        $expected2->setTarget('Two');
-        $this->assertEqual(
-                $frameset->getUrlsByLabel('a'),
-                array($expected1, $expected2));
-    }
-
-    function testUrlByIdComesFromFirstFrameToRespond() {
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getUrlById', new SimpleUrl('four.php'), array(4));
-        $frame1->setReturnValue('getUrlById', false, array(5));
-
-        $frame2 = new MockSimplePage();
-        $frame2->setReturnValue('getUrlById', false, array(4));
-        $frame2->setReturnValue('getUrlById', new SimpleUrl('five.php'), array(5));
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame1);
-        $frameset->addFrame($frame2);
-
-        $four = new SimpleUrl('four.php');
-        $four->setTarget(1);
-        $this->assertEqual($frameset->getUrlById(4), $four);
-        $five = new SimpleUrl('five.php');
-        $five->setTarget(2);
-        $this->assertEqual($frameset->getUrlById(5), $five);
-    }
-
-    function testReadUrlsFromFrameInFocus() {
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getUrls', array('a'));
-        $frame1->setReturnValue('getUrlsByLabel', array(new SimpleUrl('l')));
-        $frame1->setReturnValue('getUrlById', new SimpleUrl('i'));
-
-        $frame2 = new MockSimplePage();
-        $frame2->expectNever('getUrls');
-        $frame2->expectNever('getUrlsByLabel');
-        $frame2->expectNever('getUrlById');
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame1, 'A');
-        $frameset->addFrame($frame2, 'B');
-        $frameset->setFrameFocus('A');
-
-        $this->assertIdentical($frameset->getUrls(), array('a'));
-        $expected = new SimpleUrl('l');
-        $expected->setTarget('A');
-        $this->assertIdentical($frameset->getUrlsByLabel('label'), array($expected));
-        $expected = new SimpleUrl('i');
-        $expected->setTarget('A');
-        $this->assertIdentical($frameset->getUrlById(99), $expected);
-    }
-
-    function testReadFrameTaggedUrlsFromFrameInFocus() {
-        $frame = new MockSimplePage();
-
-        $by_label = new SimpleUrl('l');
-        $by_label->setTarget('L');
-        $frame->setReturnValue('getUrlsByLabel', array($by_label));
-
-        $by_id = new SimpleUrl('i');
-        $by_id->setTarget('I');
-        $frame->setReturnValue('getUrlById', $by_id);
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame, 'A');
-        $frameset->setFrameFocus('A');
-
-        $this->assertIdentical($frameset->getUrlsByLabel('label'), array($by_label));
-        $this->assertIdentical($frameset->getUrlById(99), $by_id);
-    }
-
-    function testFindingFormsById() {
-        $frame = new MockSimplePage();
-        $form = new MockSimpleForm();
-        $frame->returns('getFormById', $form, array('a'));
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame(new MockSimplePage(), 'A');
-        $frameset->addFrame($frame, 'B');
-        $this->assertSame($frameset->getFormById('a'), $form);
-
-        $frameset->setFrameFocus('A');
-        $this->assertNull($frameset->getFormById('a'));
-
-        $frameset->setFrameFocus('B');
-        $this->assertSame($frameset->getFormById('a'), $form);
-    }
-
-    function testFindingFormsBySubmit() {
-        $frame = new MockSimplePage();
-        $form = new MockSimpleForm();
-        $frame->returns(
-                'getFormBySubmit',
-                $form,
-                array(new SimpleByLabel('a')));
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame(new MockSimplePage(), 'A');
-        $frameset->addFrame($frame, 'B');
-        $this->assertSame($frameset->getFormBySubmit(new SimpleByLabel('a')), $form);
-
-        $frameset->setFrameFocus('A');
-        $this->assertNull($frameset->getFormBySubmit(new SimpleByLabel('a')));
-
-        $frameset->setFrameFocus('B');
-        $this->assertSame($frameset->getFormBySubmit(new SimpleByLabel('a')), $form);
-    }
-
-    function testFindingFormsByImage() {
-        $frame = new MockSimplePage();
-        $form = new MockSimpleForm();
-        $frame->returns(
-                'getFormByImage',
-                $form,
-                array(new SimpleByLabel('a')));
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame(new MockSimplePage(), 'A');
-        $frameset->addFrame($frame, 'B');
-        $this->assertSame($frameset->getFormByImage(new SimpleByLabel('a')), $form);
-
-        $frameset->setFrameFocus('A');
-        $this->assertNull($frameset->getFormByImage(new SimpleByLabel('a')));
-
-        $frameset->setFrameFocus('B');
-        $this->assertSame($frameset->getFormByImage(new SimpleByLabel('a')), $form);
-    }
-
-    function testSettingAllFrameFieldsWhenNoFrameFocus() {
-        $frame1 = new MockSimplePage();
-        $frame1->expectOnce('setField', array(new SimpleById(22), 'A'));
-
-        $frame2 = new MockSimplePage();
-        $frame2->expectOnce('setField', array(new SimpleById(22), 'A'));
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame1, 'A');
-        $frameset->addFrame($frame2, 'B');
-        $frameset->setField(new SimpleById(22), 'A');
-    }
-
-    function testOnlySettingFieldFromFocusedFrame() {
-        $frame1 = new MockSimplePage();
-        $frame1->expectOnce('setField', array(new SimpleByLabelOrName('a'), 'A'));
-
-        $frame2 = new MockSimplePage();
-        $frame2->expectNever('setField');
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame1, 'A');
-        $frameset->addFrame($frame2, 'B');
-        $frameset->setFrameFocus('A');
-        $frameset->setField(new SimpleByLabelOrName('a'), 'A');
-    }
-
-    function testOnlyGettingFieldFromFocusedFrame() {
-        $frame1 = new MockSimplePage();
-        $frame1->setReturnValue('getField', 'f', array(new SimpleByName('a')));
-
-        $frame2 = new MockSimplePage();
-        $frame2->expectNever('getField');
-
-        $frameset = new SimpleFrameset(new MockSimplePage());
-        $frameset->addFrame($frame1, 'A');
-        $frameset->addFrame($frame2, 'B');
-        $frameset->setFrameFocus('A');
-        $this->assertIdentical($frameset->getField(new SimpleByName('a')), 'f');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/http_test.php b/3rdparty/simpletest/test/http_test.php
deleted file mode 100644
index bd3fdd0d02841897f06473957802e2212637ddc0..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/http_test.php
+++ /dev/null
@@ -1,492 +0,0 @@
-<?php
-// $Id: http_test.php 1964 2009-10-13 15:27:31Z maetl_ $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../encoding.php');
-require_once(dirname(__FILE__) . '/../http.php');
-require_once(dirname(__FILE__) . '/../socket.php');
-require_once(dirname(__FILE__) . '/../cookies.php');
-Mock::generate('SimpleSocket');
-Mock::generate('SimpleCookieJar');
-Mock::generate('SimpleRoute');
-Mock::generatePartial(
-		'SimpleRoute',
-		'PartialSimpleRoute',
-array('createSocket'));
-Mock::generatePartial(
-        'SimpleProxyRoute',
-        'PartialSimpleProxyRoute',
-array('createSocket'));
-
-class TestOfDirectRoute extends UnitTestCase {
-
-	function testDefaultGetRequest() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET /here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: a.valid.host\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-		$route = new PartialSimpleRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(new SimpleUrl('http://a.valid.host/here.html'));
-		$this->assertSame($route->createConnection('GET', 15), $socket);
-	}
-
-	function testDefaultPostRequest() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("POST /here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: a.valid.host\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-		$route = new PartialSimpleRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(new SimpleUrl('http://a.valid.host/here.html'));
-
-		$route->createConnection('POST', 15);
-	}
-	
-	function testDefaultDeleteRequest() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("DELETE /here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: a.valid.host\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-		$route = new PartialSimpleRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(new SimpleUrl('http://a.valid.host/here.html'));
-		$this->assertSame($route->createConnection('DELETE', 15), $socket);
-	}
-	
-	function testDefaultHeadRequest() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("HEAD /here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: a.valid.host\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-		$route = new PartialSimpleRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(new SimpleUrl('http://a.valid.host/here.html'));
-		$this->assertSame($route->createConnection('HEAD', 15), $socket);
-	}
-
-	function testGetWithPort() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET /here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: a.valid.host:81\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-
-		$route = new PartialSimpleRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(new SimpleUrl('http://a.valid.host:81/here.html'));
-
-		$route->createConnection('GET', 15);
-	}
-
-	function testGetWithParameters() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET /here.html?a=1&b=2 HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: a.valid.host\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-
-		$route = new PartialSimpleRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'));
-
-		$route->createConnection('GET', 15);
-	}
-}
-
-class TestOfProxyRoute extends UnitTestCase {
-
-	function testDefaultGet() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: my-proxy:8080\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-
-		$route = new PartialSimpleProxyRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(
-		new SimpleUrl('http://a.valid.host/here.html'),
-		new SimpleUrl('http://my-proxy'));
-		$route->createConnection('GET', 15);
-	}
-
-	function testDefaultPost() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("POST http://a.valid.host/here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: my-proxy:8080\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-
-		$route = new PartialSimpleProxyRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(
-		new SimpleUrl('http://a.valid.host/here.html'),
-		new SimpleUrl('http://my-proxy'));
-		$route->createConnection('POST', 15);
-	}
-
-	function testGetWithPort() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET http://a.valid.host:81/here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: my-proxy:8081\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-
-		$route = new PartialSimpleProxyRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(
-		new SimpleUrl('http://a.valid.host:81/here.html'),
-		new SimpleUrl('http://my-proxy:8081'));
-		$route->createConnection('GET', 15);
-	}
-
-	function testGetWithParameters() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET http://a.valid.host/here.html?a=1&b=2 HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: my-proxy:8080\r\n"));
-		$socket->expectAt(2, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 3);
-
-		$route = new PartialSimpleProxyRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(
-		new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'),
-		new SimpleUrl('http://my-proxy'));
-		$route->createConnection('GET', 15);
-	}
-
-	function testGetWithAuthentication() {
-		$encoded = base64_encode('Me:Secret');
-
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n"));
-		$socket->expectAt(1, 'write', array("Host: my-proxy:8080\r\n"));
-		$socket->expectAt(2, 'write', array("Proxy-Authorization: Basic $encoded\r\n"));
-		$socket->expectAt(3, 'write', array("Connection: close\r\n"));
-		$socket->expectCallCount('write', 4);
-
-		$route = new PartialSimpleProxyRoute();
-		$route->setReturnReference('createSocket', $socket);
-		$route->__construct(
-		new SimpleUrl('http://a.valid.host/here.html'),
-		new SimpleUrl('http://my-proxy'),
-                'Me',
-                'Secret');
-		$route->createConnection('GET', 15);
-	}
-}
-
-class TestOfHttpRequest extends UnitTestCase {
-
-	function testReadingBadConnection() {
-		$socket = new MockSimpleSocket();
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$request = new SimpleHttpRequest($route, new SimpleGetEncoding());
-		$reponse = $request->fetch(15);
-		$this->assertTrue($reponse->isError());
-	}
-
-	function testReadingGoodConnection() {
-		$socket = new MockSimpleSocket();
-		$socket->expectOnce('write', array("\r\n"));
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$route->expect('createConnection', array('GET', 15));
-
-		$request = new SimpleHttpRequest($route, new SimpleGetEncoding());
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
-	}
-
-	function testWritingAdditionalHeaders() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("My: stuff\r\n"));
-		$socket->expectAt(1, 'write', array("\r\n"));
-		$socket->expectCallCount('write', 2);
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-
-		$request = new SimpleHttpRequest($route, new SimpleGetEncoding());
-		$request->addHeaderLine('My: stuff');
-		$request->fetch(15);
-	}
-
-	function testCookieWriting() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("Cookie: a=A\r\n"));
-		$socket->expectAt(1, 'write', array("\r\n"));
-		$socket->expectCallCount('write', 2);
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-
-		$jar = new SimpleCookieJar();
-		$jar->setCookie('a', 'A');
-
-		$request = new SimpleHttpRequest($route, new SimpleGetEncoding());
-		$request->readCookiesFromJar($jar, new SimpleUrl('/'));
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
-	}
-
-	function testMultipleCookieWriting() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("Cookie: a=A;b=B\r\n"));
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-
-		$jar = new SimpleCookieJar();
-		$jar->setCookie('a', 'A');
-		$jar->setCookie('b', 'B');
-
-		$request = new SimpleHttpRequest($route, new SimpleGetEncoding());
-		$request->readCookiesFromJar($jar, new SimpleUrl('/'));
-		$request->fetch(15);
-	}
-	
-    function testReadingDeleteConnection() {
-		$socket = new MockSimpleSocket();
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$route->expect('createConnection', array('DELETE', 15));
-
-		$request = new SimpleHttpRequest($route, new SimpleDeleteEncoding());
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');    	
-    }
-}
-
-class TestOfHttpPostRequest extends UnitTestCase {
-
-	function testReadingBadConnectionCausesErrorBecauseOfDeadSocket() {
-		$socket = new MockSimpleSocket();
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$request = new SimpleHttpRequest($route, new SimplePostEncoding());
-		$reponse = $request->fetch(15);
-		$this->assertTrue($reponse->isError());
-	}
-
-	function testReadingGoodConnection() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("Content-Length: 0\r\n"));
-		$socket->expectAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
-		$socket->expectAt(2, 'write', array("\r\n"));
-		$socket->expectAt(3, 'write', array(""));
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$route->expect('createConnection', array('POST', 15));
-
-		$request = new SimpleHttpRequest($route, new SimplePostEncoding());
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
-	}
-
-	function testContentHeadersCalculatedWithUrlEncodedParams() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("Content-Length: 3\r\n"));
-		$socket->expectAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
-		$socket->expectAt(2, 'write', array("\r\n"));
-		$socket->expectAt(3, 'write', array("a=A"));
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$route->expect('createConnection', array('POST', 15));
-
-		$request = new SimpleHttpRequest(
-		$route,
-		new SimplePostEncoding(array('a' => 'A')));
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
-	}
-
-	function testContentHeadersCalculatedWithRawEntityBody() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("Content-Length: 8\r\n"));
-		$socket->expectAt(1, 'write', array("Content-Type: text/plain\r\n"));
-		$socket->expectAt(2, 'write', array("\r\n"));
-		$socket->expectAt(3, 'write', array("raw body"));
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$route->expect('createConnection', array('POST', 15));
-
-		$request = new SimpleHttpRequest(
-		$route,
-		new SimplePostEncoding('raw body'));
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
-	}
-
-	function testContentHeadersCalculatedWithXmlEntityBody() {
-		$socket = new MockSimpleSocket();
-		$socket->expectAt(0, 'write', array("Content-Length: 27\r\n"));
-		$socket->expectAt(1, 'write', array("Content-Type: text/xml\r\n"));
-		$socket->expectAt(2, 'write', array("\r\n"));
-		$socket->expectAt(3, 'write', array("<a><b>one</b><c>two</c></a>"));
-
-		$route = new MockSimpleRoute();
-		$route->setReturnReference('createConnection', $socket);
-		$route->expect('createConnection', array('POST', 15));
-
-		$request = new SimpleHttpRequest(
-		$route,
-		new SimplePostEncoding('<a><b>one</b><c>two</c></a>', 'text/xml'));
-		$this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
-	}
-}
-
-class TestOfHttpHeaders extends UnitTestCase {
-
-	function testParseBasicHeaders() {
-		$headers = new SimpleHttpHeaders(
-                "HTTP/1.1 200 OK\r\n" .
-                "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" .
-                "Content-Type: text/plain\r\n" .
-                "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" .
-                "Connection: close");
-		$this->assertIdentical($headers->getHttpVersion(), "1.1");
-		$this->assertIdentical($headers->getResponseCode(), 200);
-		$this->assertEqual($headers->getMimeType(), "text/plain");
-	}
-
-	function testNonStandardResponseHeader() {
-		$headers = new SimpleHttpHeaders(
-                "HTTP/1.1 302 (HTTP-Version SP Status-Code CRLF)\r\n" .
-                "Connection: close");
-		$this->assertIdentical($headers->getResponseCode(), 302);
-	}
-
-	function testCanParseMultipleCookies() {
-		$jar = new MockSimpleCookieJar();
-		$jar->expectAt(0, 'setCookie', array('a', 'aaa', 'host', '/here/', 'Wed, 25 Dec 2002 04:24:20 GMT'));
-		$jar->expectAt(1, 'setCookie', array('b', 'bbb', 'host', '/', false));
-
-		$headers = new SimpleHttpHeaders(
-                "HTTP/1.1 200 OK\r\n" .
-                "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" .
-                "Content-Type: text/plain\r\n" .
-                "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" .
-                "Set-Cookie: a=aaa; expires=Wed, 25-Dec-02 04:24:20 GMT; path=/here/\r\n" .
-                "Set-Cookie: b=bbb\r\n" .
-                "Connection: close");
-		$headers->writeCookiesToJar($jar, new SimpleUrl('http://host'));
-	}
-
-	function testCanRecogniseRedirect() {
-		$headers = new SimpleHttpHeaders("HTTP/1.1 301 OK\r\n" .
-                "Content-Type: text/plain\r\n" .
-                "Content-Length: 0\r\n" .
-                "Location: http://www.somewhere-else.com/\r\n" .
-                "Connection: close");
-		$this->assertIdentical($headers->getResponseCode(), 301);
-		$this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/");
-		$this->assertTrue($headers->isRedirect());
-	}
-
-	function testCanParseChallenge() {
-		$headers = new SimpleHttpHeaders("HTTP/1.1 401 Authorization required\r\n" .
-                "Content-Type: text/plain\r\n" .
-                "Connection: close\r\n" .
-                "WWW-Authenticate: Basic realm=\"Somewhere\"");
-		$this->assertEqual($headers->getAuthentication(), 'Basic');
-		$this->assertEqual($headers->getRealm(), 'Somewhere');
-		$this->assertTrue($headers->isChallenge());
-	}
-}
-
-class TestOfHttpResponse extends UnitTestCase {
-
-	function testBadRequest() {
-		$socket = new MockSimpleSocket();
-		$socket->setReturnValue('getSent', '');
-
-		$response = new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
-		$this->assertTrue($response->isError());
-		$this->assertPattern('/Nothing fetched/', $response->getError());
-		$this->assertIdentical($response->getContent(), false);
-		$this->assertIdentical($response->getSent(), '');
-	}
-
-	function testBadSocketDuringResponse() {
-		$socket = new MockSimpleSocket();
-		$socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n");
-		$socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
-		$socket->setReturnValue("read", "");
-		$socket->setReturnValue('getSent', 'HTTP/1.1 ...');
-
-		$response = new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
-		$this->assertTrue($response->isError());
-		$this->assertEqual($response->getContent(), '');
-		$this->assertEqual($response->getSent(), 'HTTP/1.1 ...');
-	}
-
-	function testIncompleteHeader() {
-		$socket = new MockSimpleSocket();
-		$socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n");
-		$socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
-		$socket->setReturnValueAt(2, "read", "Content-Type: text/plain\r\n");
-		$socket->setReturnValue("read", "");
-
-		$response = new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
-		$this->assertTrue($response->isError());
-		$this->assertEqual($response->getContent(), "");
-	}
-
-	function testParseOfResponseHeadersWhenChunked() {
-		$socket = new MockSimpleSocket();
-		$socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\nDate: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
-		$socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
-		$socket->setReturnValueAt(2, "read", "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\nConne");
-		$socket->setReturnValueAt(3, "read", "ction: close\r\n\r\nthis is a test file\n");
-		$socket->setReturnValueAt(4, "read", "with two lines in it\n");
-		$socket->setReturnValue("read", "");
-
-		$response = new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
-		$this->assertFalse($response->isError());
-		$this->assertEqual(
-		$response->getContent(),
-                "this is a test file\nwith two lines in it\n");
-		$headers = $response->getHeaders();
-		$this->assertIdentical($headers->getHttpVersion(), "1.1");
-		$this->assertIdentical($headers->getResponseCode(), 200);
-		$this->assertEqual($headers->getMimeType(), "text/plain");
-		$this->assertFalse($headers->isRedirect());
-		$this->assertFalse($headers->getLocation());
-	}
-
-	function testRedirect() {
-		$socket = new MockSimpleSocket();
-		$socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n");
-		$socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
-		$socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com/\r\n");
-		$socket->setReturnValueAt(3, "read", "Connection: close\r\n");
-		$socket->setReturnValueAt(4, "read", "\r\n");
-		$socket->setReturnValue("read", "");
-
-		$response = new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
-		$headers = $response->getHeaders();
-		$this->assertTrue($headers->isRedirect());
-		$this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/");
-	}
-
-	function testRedirectWithPort() {
-		$socket = new MockSimpleSocket();
-		$socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n");
-		$socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
-		$socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com:80/\r\n");
-		$socket->setReturnValueAt(3, "read", "Connection: close\r\n");
-		$socket->setReturnValueAt(4, "read", "\r\n");
-		$socket->setReturnValue("read", "");
-
-		$response = new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
-		$headers = $response->getHeaders();
-		$this->assertTrue($headers->isRedirect());
-		$this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com:80/");
-	}
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/interfaces_test.php b/3rdparty/simpletest/test/interfaces_test.php
deleted file mode 100644
index ab30fe47ff8ef8f674052686fd02e9f7a48fc644..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/interfaces_test.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-// $Id: interfaces_test.php 1981 2010-03-23 23:29:56Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-if (function_exists('spl_classes')) {
-    include(dirname(__FILE__) . '/support/spl_examples.php');
-}
-if (version_compare(PHP_VERSION, '5.1', '>=')) {
-    include(dirname(__FILE__) . '/interfaces_test_php5_1.php');
-}
-
-interface DummyInterface {
-    function aMethod();
-    function anotherMethod($a);
-    function &referenceMethod(&$a);
-}
-
-Mock::generate('DummyInterface');
-Mock::generatePartial('DummyInterface', 'PartialDummyInterface', array());
-
-class TestOfMockInterfaces extends UnitTestCase {
-
-    function testCanMockAnInterface() {
-        $mock = new MockDummyInterface();
-        $this->assertIsA($mock, 'SimpleMock');
-        $this->assertIsA($mock, 'MockDummyInterface');
-        $this->assertTrue(method_exists($mock, 'aMethod'));
-        $this->assertTrue(method_exists($mock, 'anotherMethod'));
-        $this->assertNull($mock->aMethod());
-    }
-
-    function testMockedInterfaceExpectsParameters() {
-        $mock = new MockDummyInterface();
-        $this->expectError();
-        $mock->anotherMethod();
-    }
-
-    function testCannotPartiallyMockAnInterface() {
-        $this->assertFalse(class_exists('PartialDummyInterface'));
-    }
-}
-
-class TestOfSpl extends UnitTestCase {
-    
-    function skip() {
-        $this->skipUnless(function_exists('spl_classes'), 'No SPL module loaded');
-    }
-
-    function testCanMockAllSplClasses() {
-        if (! function_exists('spl_classes')) {
-            return;
-        }
-        foreach(spl_classes() as $class) {
-            if ($class == 'SplHeap' or $class = 'SplFileObject') {
-                continue;
-            }
-            if (version_compare(PHP_VERSION, '5.1', '<') &&
-                $class == 'CachingIterator' ||
-                $class == 'CachingRecursiveIterator' ||
-                $class == 'FilterIterator' ||
-                $class == 'LimitIterator' ||
-                $class == 'ParentIterator') {
-                // These iterators require an iterator be passed to them during
-                // construction in PHP 5.0; there is no way for SimpleTest
-                // to supply such an iterator, however, so support for it is
-                // disabled.
-                continue;
-            }
-            $mock_class = "Mock$class";
-            Mock::generate($class);
-            $this->assertIsA(new $mock_class(), $mock_class);
-        }
-    }
-
-    function testExtensionOfCommonSplClasses() {
-        Mock::generate('IteratorImplementation');
-        $this->assertIsA(
-                new IteratorImplementation(),
-                'IteratorImplementation');
-        Mock::generate('IteratorAggregateImplementation');
-        $this->assertIsA(
-                new IteratorAggregateImplementation(),
-                'IteratorAggregateImplementation');
-   }
-}
-
-class WithHint {
-    function hinted(DummyInterface $object) { }
-}
-
-class ImplementsDummy implements DummyInterface {
-    function aMethod() { }
-    function anotherMethod($a) { }
-    function &referenceMethod(&$a) { }
-    function extraMethod($a = false) { }
-}
-Mock::generate('ImplementsDummy');
-
-class TestOfImplementations extends UnitTestCase {
-
-    function testMockedInterfaceCanPassThroughTypeHint() {
-        $mock = new MockDummyInterface();
-        $hinter = new WithHint();
-        $hinter->hinted($mock);
-    }
-
-    function testImplementedInterfacesAreCarried() {
-        $mock = new MockImplementsDummy();
-        $hinter = new WithHint();
-        $hinter->hinted($mock);
-    }
-    
-    function testNoSpuriousWarningsWhenSkippingDefaultedParameter() {
-        $mock = new MockImplementsDummy();
-        $mock->extraMethod();
-    }
-}
-
-interface SampleInterfaceWithConstruct {
-    function __construct($something);
-}
-
-class TestOfInterfaceMocksWithConstruct extends UnitTestCase {
-    function TODO_testBasicConstructOfAnInterface() {   // Fails in PHP 5.3dev
-        Mock::generate('SampleInterfaceWithConstruct');
-    }
-}
-
-interface SampleInterfaceWithClone {
-    function __clone();
-}
-
-class TestOfSampleInterfaceWithClone extends UnitTestCase {
-    function testCanMockWithoutErrors() {
-        Mock::generate('SampleInterfaceWithClone');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/interfaces_test_php5_1.php b/3rdparty/simpletest/test/interfaces_test_php5_1.php
deleted file mode 100644
index 3d154f9953972d2fc1b10cd3b59efb322d8678a4..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/interfaces_test_php5_1.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-interface SampleInterfaceWithHintInSignature {
-    function method(array $hinted);
-}
-
-class TestOfInterfaceMocksWithHintInSignature extends UnitTestCase {
-    function testBasicConstructOfAnInterfaceWithHintInSignature() {
-        Mock::generate('SampleInterfaceWithHintInSignature');
-        $mock = new MockSampleInterfaceWithHintInSignature();
-        $this->assertIsA($mock, 'SampleInterfaceWithHintInSignature');
-    }
-}
-
diff --git a/3rdparty/simpletest/test/live_test.php b/3rdparty/simpletest/test/live_test.php
deleted file mode 100644
index 3fbb54499d3e5de230696580a82cb049bc3a9ee2..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/live_test.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-// $Id: live_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../socket.php');
-require_once(dirname(__FILE__) . '/../http.php');
-require_once(dirname(__FILE__) . '/../compatibility.php');
-
-if (SimpleTest::getDefaultProxy()) {
-    SimpleTest::ignore('LiveHttpTestCase');
-}
-
-class LiveHttpTestCase extends UnitTestCase {
-
-    function testBadSocket() {
-        $socket = new SimpleSocket('bad_url', 111, 5);
-        $this->assertTrue($socket->isError());
-        $this->assertPattern(
-                '/Cannot open \\[bad_url:111\\] with \\[/',
-                $socket->getError());
-        $this->assertFalse($socket->isOpen());
-        $this->assertFalse($socket->write('A message'));
-    }
-    
-    function testSocketClosure() {
-        $socket = new SimpleSocket('www.lastcraft.com', 80, 15, 8);
-        $this->assertTrue($socket->isOpen());
-        $this->assertTrue($socket->write("GET /test/network_confirm.php HTTP/1.0\r\n"));
-        $socket->write("Host: www.lastcraft.com\r\n");
-        $socket->write("Connection: close\r\n\r\n");
-        $this->assertEqual($socket->read(), "HTTP/1.1");
-        $socket->close();
-        $this->assertIdentical($socket->read(), false);
-    }
-    
-    function testRecordOfSentCharacters() {
-        $socket = new SimpleSocket('www.lastcraft.com', 80, 15);
-        $this->assertTrue($socket->write("GET /test/network_confirm.php HTTP/1.0\r\n"));
-        $socket->write("Host: www.lastcraft.com\r\n");
-        $socket->write("Connection: close\r\n\r\n");
-        $socket->close();
-        $this->assertEqual($socket->getSent(),
-                "GET /test/network_confirm.php HTTP/1.0\r\n" .
-                "Host: www.lastcraft.com\r\n" .
-                "Connection: close\r\n\r\n");
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/mock_objects_test.php b/3rdparty/simpletest/test/mock_objects_test.php
deleted file mode 100644
index 7f3178995a743dc99340aba201cd27a8cfe148b1..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/mock_objects_test.php
+++ /dev/null
@@ -1,985 +0,0 @@
-<?php
-// $Id: mock_objects_test.php 1900 2009-07-29 11:44:37Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../expectation.php');
-require_once(dirname(__FILE__) . '/../mock_objects.php');
-
-class TestOfAnythingExpectation extends UnitTestCase {
-    function testSimpleInteger() {
-        $expectation = new AnythingExpectation();
-        $this->assertTrue($expectation->test(33));
-        $this->assertTrue($expectation->test(false));
-        $this->assertTrue($expectation->test(null));
-    }
-}
-
-class TestOfParametersExpectation extends UnitTestCase {
-
-    function testEmptyMatch() {
-        $expectation = new ParametersExpectation(array());
-        $this->assertTrue($expectation->test(array()));
-        $this->assertFalse($expectation->test(array(33)));
-    }
-
-    function testSingleMatch() {
-        $expectation = new ParametersExpectation(array(0));
-        $this->assertFalse($expectation->test(array(1)));
-        $this->assertTrue($expectation->test(array(0)));
-    }
-
-    function testAnyMatch() {
-        $expectation = new ParametersExpectation(false);
-        $this->assertTrue($expectation->test(array()));
-        $this->assertTrue($expectation->test(array(1, 2)));
-    }
-
-    function testMissingParameter() {
-        $expectation = new ParametersExpectation(array(0));
-        $this->assertFalse($expectation->test(array()));
-    }
-
-    function testNullParameter() {
-        $expectation = new ParametersExpectation(array(null));
-        $this->assertTrue($expectation->test(array(null)));
-        $this->assertFalse($expectation->test(array()));
-    }
-
-    function testAnythingExpectations() {
-        $expectation = new ParametersExpectation(array(new AnythingExpectation()));
-        $this->assertFalse($expectation->test(array()));
-        $this->assertIdentical($expectation->test(array(null)), true);
-        $this->assertIdentical($expectation->test(array(13)), true);
-    }
-
-    function testOtherExpectations() {
-        $expectation = new ParametersExpectation(
-                array(new PatternExpectation('/hello/i')));
-        $this->assertFalse($expectation->test(array('Goodbye')));
-        $this->assertTrue($expectation->test(array('hello')));
-        $this->assertTrue($expectation->test(array('Hello')));
-    }
-
-    function testIdentityOnly() {
-        $expectation = new ParametersExpectation(array("0"));
-        $this->assertFalse($expectation->test(array(0)));
-        $this->assertTrue($expectation->test(array("0")));
-    }
-
-    function testLongList() {
-        $expectation = new ParametersExpectation(
-                array("0", 0, new AnythingExpectation(), false));
-        $this->assertTrue($expectation->test(array("0", 0, 37, false)));
-        $this->assertFalse($expectation->test(array("0", 0, 37, true)));
-        $this->assertFalse($expectation->test(array("0", 0, 37)));
-    }
-}
-
-class TestOfSimpleSignatureMap extends UnitTestCase {
-
-    function testEmpty() {
-        $map = new SimpleSignatureMap();
-        $this->assertFalse($map->isMatch("any", array()));
-        $this->assertNull($map->findFirstAction("any", array()));
-    }
-
-    function testDifferentCallSignaturesCanHaveDifferentReferences() {
-        $map = new SimpleSignatureMap();
-        $fred = 'Fred';
-        $jim = 'jim';
-        $map->add(array(0), $fred);
-        $map->add(array('0'), $jim);
-        $this->assertSame($fred, $map->findFirstAction(array(0)));
-        $this->assertSame($jim, $map->findFirstAction(array('0')));
-    }
-
-    function testWildcard() {
-        $fred = 'Fred';
-        $map = new SimpleSignatureMap();
-        $map->add(array(new AnythingExpectation(), 1, 3), $fred);
-        $this->assertTrue($map->isMatch(array(2, 1, 3)));
-        $this->assertSame($map->findFirstAction(array(2, 1, 3)), $fred);
-    }
-
-    function testAllWildcard() {
-        $fred = 'Fred';
-        $map = new SimpleSignatureMap();
-        $this->assertFalse($map->isMatch(array(2, 1, 3)));
-        $map->add('', $fred);
-        $this->assertTrue($map->isMatch(array(2, 1, 3)));
-        $this->assertSame($map->findFirstAction(array(2, 1, 3)), $fred);
-    }
-
-    function testOrdering() {
-        $map = new SimpleSignatureMap();
-        $map->add(array(1, 2), new SimpleByValue("1, 2"));
-        $map->add(array(1, 3), new SimpleByValue("1, 3"));
-        $map->add(array(1), new SimpleByValue("1"));
-        $map->add(array(1, 4), new SimpleByValue("1, 4"));
-        $map->add(array(new AnythingExpectation()), new SimpleByValue("Any"));
-        $map->add(array(2), new SimpleByValue("2"));
-        $map->add("", new SimpleByValue("Default"));
-        $map->add(array(), new SimpleByValue("None"));
-        $this->assertEqual($map->findFirstAction(array(1, 2)), new SimpleByValue("1, 2"));
-        $this->assertEqual($map->findFirstAction(array(1, 3)), new SimpleByValue("1, 3"));
-        $this->assertEqual($map->findFirstAction(array(1, 4)), new SimpleByValue("1, 4"));
-        $this->assertEqual($map->findFirstAction(array(1)), new SimpleByValue("1"));
-        $this->assertEqual($map->findFirstAction(array(2)), new SimpleByValue("Any"));
-        $this->assertEqual($map->findFirstAction(array(3)), new SimpleByValue("Any"));
-        $this->assertEqual($map->findFirstAction(array()), new SimpleByValue("Default"));
-    }
-}
-
-class TestOfCallSchedule extends UnitTestCase {
-    function testCanBeSetToAlwaysReturnTheSameReference() {
-        $a = 5;
-        $schedule = new SimpleCallSchedule();
-        $schedule->register('aMethod', false, new SimpleByReference($a));
-        $this->assertReference($schedule->respond(0, 'aMethod', array()), $a);
-        $this->assertReference($schedule->respond(1, 'aMethod', array()), $a);
-    }
-
-    function testSpecificSignaturesOverrideTheAlwaysCase() {
-        $any = 'any';
-        $one = 'two';
-        $schedule = new SimpleCallSchedule();
-        $schedule->register('aMethod', array(1), new SimpleByReference($one));
-        $schedule->register('aMethod', false, new SimpleByReference($any));
-        $this->assertReference($schedule->respond(0, 'aMethod', array(2)), $any);
-        $this->assertReference($schedule->respond(0, 'aMethod', array(1)), $one);
-    }
-
-    function testReturnsCanBeSetOverTime() {
-        $one = 'one';
-        $two = 'two';
-        $schedule = new SimpleCallSchedule();
-        $schedule->registerAt(0, 'aMethod', false, new SimpleByReference($one));
-        $schedule->registerAt(1, 'aMethod', false, new SimpleByReference($two));
-        $this->assertReference($schedule->respond(0, 'aMethod', array()), $one);
-        $this->assertReference($schedule->respond(1, 'aMethod', array()), $two);
-    }
-
-    function testReturnsOverTimecanBeAlteredByTheArguments() {
-        $one = '1';
-        $two = '2';
-        $two_a = '2a';
-        $schedule = new SimpleCallSchedule();
-        $schedule->registerAt(0, 'aMethod', false, new SimpleByReference($one));
-        $schedule->registerAt(1, 'aMethod', array('a'), new SimpleByReference($two_a));
-        $schedule->registerAt(1, 'aMethod', false, new SimpleByReference($two));
-        $this->assertReference($schedule->respond(0, 'aMethod', array()), $one);
-        $this->assertReference($schedule->respond(1, 'aMethod', array()), $two);
-        $this->assertReference($schedule->respond(1, 'aMethod', array('a')), $two_a);
-    }
-
-    function testCanReturnByValue() {
-        $a = 5;
-        $schedule = new SimpleCallSchedule();
-        $schedule->register('aMethod', false, new SimpleByValue($a));
-        $this->assertCopy($schedule->respond(0, 'aMethod', array()), $a);
-    }
-
-    function testCanThrowException() {
-        if (version_compare(phpversion(), '5', '>=')) {
-            $schedule = new SimpleCallSchedule();
-            $schedule->register('aMethod', false, new SimpleThrower(new Exception('Ouch')));
-            $this->expectException(new Exception('Ouch'));
-            $schedule->respond(0, 'aMethod', array());
-        }
-    }
-
-    function testCanEmitError() {
-        $schedule = new SimpleCallSchedule();
-        $schedule->register('aMethod', false, new SimpleErrorThrower('Ouch', E_USER_WARNING));
-        $this->expectError('Ouch');
-        $schedule->respond(0, 'aMethod', array());
-    }
-}
-
-class Dummy {
-    function Dummy() {
-    }
-
-    function aMethod() {
-        return true;
-    }
-
-    function &aReferenceMethod() {
-        return true;
-    }
-
-    function anotherMethod() {
-        return true;
-    }
-}
-Mock::generate('Dummy');
-Mock::generate('Dummy', 'AnotherMockDummy');
-Mock::generate('Dummy', 'MockDummyWithExtraMethods', array('extraMethod'));
-
-class TestOfMockGeneration extends UnitTestCase {
-
-    function testCloning() {
-        $mock = new MockDummy();
-        $this->assertTrue(method_exists($mock, "aMethod"));
-        $this->assertNull($mock->aMethod());
-    }
-
-    function testCloningWithExtraMethod() {
-        $mock = new MockDummyWithExtraMethods();
-        $this->assertTrue(method_exists($mock, "extraMethod"));
-    }
-
-    function testCloningWithChosenClassName() {
-        $mock = new AnotherMockDummy();
-        $this->assertTrue(method_exists($mock, "aMethod"));
-    }
-}
-
-class TestOfMockReturns extends UnitTestCase {
-
-    function testDefaultReturn() {
-        $mock = new MockDummy();
-        $mock->returnsByValue("aMethod", "aaa");
-        $this->assertIdentical($mock->aMethod(), "aaa");
-        $this->assertIdentical($mock->aMethod(), "aaa");
-    }
-
-    function testParameteredReturn() {
-        $mock = new MockDummy();
-        $mock->returnsByValue('aMethod', 'aaa', array(1, 2, 3));
-        $this->assertNull($mock->aMethod());
-        $this->assertIdentical($mock->aMethod(1, 2, 3), 'aaa');
-    }
-
-    function testSetReturnGivesObjectReference() {
-        $mock = new MockDummy();
-        $object = new Dummy();
-        $mock->returns('aMethod', $object, array(1, 2, 3));
-        $this->assertSame($mock->aMethod(1, 2, 3), $object);
-    }
-
-    function testSetReturnReferenceGivesOriginalReference() {
-        $mock = new MockDummy();
-        $object = 1;
-        $mock->returnsByReference('aReferenceMethod', $object, array(1, 2, 3));
-        $this->assertReference($mock->aReferenceMethod(1, 2, 3), $object);
-    }
-
-    function testReturnValueCanBeChosenJustByPatternMatchingArguments() {
-        $mock = new MockDummy();
-        $mock->returnsByValue(
-                "aMethod",
-                "aaa",
-                array(new PatternExpectation('/hello/i')));
-        $this->assertIdentical($mock->aMethod('Hello'), 'aaa');
-        $this->assertNull($mock->aMethod('Goodbye'));
-    }
-
-    function testMultipleMethods() {
-        $mock = new MockDummy();
-        $mock->returnsByValue("aMethod", 100, array(1));
-        $mock->returnsByValue("aMethod", 200, array(2));
-        $mock->returnsByValue("anotherMethod", 10, array(1));
-        $mock->returnsByValue("anotherMethod", 20, array(2));
-        $this->assertIdentical($mock->aMethod(1), 100);
-        $this->assertIdentical($mock->anotherMethod(1), 10);
-        $this->assertIdentical($mock->aMethod(2), 200);
-        $this->assertIdentical($mock->anotherMethod(2), 20);
-    }
-
-    function testReturnSequence() {
-        $mock = new MockDummy();
-        $mock->returnsByValueAt(0, "aMethod", "aaa");
-        $mock->returnsByValueAt(1, "aMethod", "bbb");
-        $mock->returnsByValueAt(3, "aMethod", "ddd");
-        $this->assertIdentical($mock->aMethod(), "aaa");
-        $this->assertIdentical($mock->aMethod(), "bbb");
-        $this->assertNull($mock->aMethod());
-        $this->assertIdentical($mock->aMethod(), "ddd");
-    }
-
-    function testSetReturnReferenceAtGivesOriginal() {
-        $mock = new MockDummy();
-        $object = 100;
-        $mock->returnsByReferenceAt(1, "aReferenceMethod", $object);
-        $this->assertNull($mock->aReferenceMethod());
-        $this->assertReference($mock->aReferenceMethod(), $object);
-        $this->assertNull($mock->aReferenceMethod());
-    }
-
-    function testReturnsAtGivesOriginalObjectHandle() {
-        $mock = new MockDummy();
-        $object = new Dummy();
-        $mock->returnsAt(1, "aMethod", $object);
-        $this->assertNull($mock->aMethod());
-        $this->assertSame($mock->aMethod(), $object);
-        $this->assertNull($mock->aMethod());
-    }
-
-    function testComplicatedReturnSequence() {
-        $mock = new MockDummy();
-        $object = new Dummy();
-        $mock->returnsAt(1, "aMethod", "aaa", array("a"));
-        $mock->returnsAt(1, "aMethod", "bbb");
-        $mock->returnsAt(2, "aMethod", $object, array('*', 2));
-        $mock->returnsAt(2, "aMethod", "value", array('*', 3));
-        $mock->returns("aMethod", 3, array(3));
-        $this->assertNull($mock->aMethod());
-        $this->assertEqual($mock->aMethod("a"), "aaa");
-        $this->assertSame($mock->aMethod(1, 2), $object);
-        $this->assertEqual($mock->aMethod(3), 3);
-        $this->assertNull($mock->aMethod());
-    }
-
-    function testMultipleMethodSequences() {
-        $mock = new MockDummy();
-        $mock->returnsByValueAt(0, "aMethod", "aaa");
-        $mock->returnsByValueAt(1, "aMethod", "bbb");
-        $mock->returnsByValueAt(0, "anotherMethod", "ccc");
-        $mock->returnsByValueAt(1, "anotherMethod", "ddd");
-        $this->assertIdentical($mock->aMethod(), "aaa");
-        $this->assertIdentical($mock->anotherMethod(), "ccc");
-        $this->assertIdentical($mock->aMethod(), "bbb");
-        $this->assertIdentical($mock->anotherMethod(), "ddd");
-    }
-
-    function testSequenceFallback() {
-        $mock = new MockDummy();
-        $mock->returnsByValueAt(0, "aMethod", "aaa", array('a'));
-        $mock->returnsByValueAt(1, "aMethod", "bbb", array('a'));
-        $mock->returnsByValue("aMethod", "AAA");
-        $this->assertIdentical($mock->aMethod('a'), "aaa");
-        $this->assertIdentical($mock->aMethod('b'), "AAA");
-    }
-
-    function testMethodInterference() {
-        $mock = new MockDummy();
-        $mock->returnsByValueAt(0, "anotherMethod", "aaa");
-        $mock->returnsByValue("aMethod", "AAA");
-        $this->assertIdentical($mock->aMethod(), "AAA");
-        $this->assertIdentical($mock->anotherMethod(), "aaa");
-    }
-}
-
-class TestOfMockExpectationsThatPass extends UnitTestCase {
-
-    function testAnyArgument() {
-        $mock = new MockDummy();
-        $mock->expect('aMethod', array('*'));
-        $mock->aMethod(1);
-        $mock->aMethod('hello');
-    }
-
-    function testAnyTwoArguments() {
-        $mock = new MockDummy();
-        $mock->expect('aMethod', array('*', '*'));
-        $mock->aMethod(1, 2);
-    }
-
-    function testSpecificArgument() {
-        $mock = new MockDummy();
-        $mock->expect('aMethod', array(1));
-        $mock->aMethod(1);
-    }
-
-    function testExpectation() {
-        $mock = new MockDummy();
-        $mock->expect('aMethod', array(new IsAExpectation('Dummy')));
-        $mock->aMethod(new Dummy());
-    }
-
-    function testArgumentsInSequence() {
-        $mock = new MockDummy();
-        $mock->expectAt(0, 'aMethod', array(1, 2));
-        $mock->expectAt(1, 'aMethod', array(3, 4));
-        $mock->aMethod(1, 2);
-        $mock->aMethod(3, 4);
-    }
-
-    function testAtLeastOnceSatisfiedByOneCall() {
-        $mock = new MockDummy();
-        $mock->expectAtLeastOnce('aMethod');
-        $mock->aMethod();
-    }
-
-    function testAtLeastOnceSatisfiedByTwoCalls() {
-        $mock = new MockDummy();
-        $mock->expectAtLeastOnce('aMethod');
-        $mock->aMethod();
-        $mock->aMethod();
-    }
-
-    function testOnceSatisfiedByOneCall() {
-        $mock = new MockDummy();
-        $mock->expectOnce('aMethod');
-        $mock->aMethod();
-    }
-
-    function testMinimumCallsSatisfiedByEnoughCalls() {
-        $mock = new MockDummy();
-        $mock->expectMinimumCallCount('aMethod', 1);
-        $mock->aMethod();
-    }
-
-    function testMinimumCallsSatisfiedByTooManyCalls() {
-        $mock = new MockDummy();
-        $mock->expectMinimumCallCount('aMethod', 3);
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->aMethod();
-    }
-
-    function testMaximumCallsSatisfiedByEnoughCalls() {
-        $mock = new MockDummy();
-        $mock->expectMaximumCallCount('aMethod', 1);
-        $mock->aMethod();
-    }
-
-    function testMaximumCallsSatisfiedByNoCalls() {
-        $mock = new MockDummy();
-        $mock->expectMaximumCallCount('aMethod', 1);
-    }
-}
-
-class MockWithInjectedTestCase extends SimpleMock {
-    protected function getCurrentTestCase() {
-        return SimpleTest::getContext()->getTest()->getMockedTest();
-    }
-}
-SimpleTest::setMockBaseClass('MockWithInjectedTestCase');
-Mock::generate('Dummy', 'MockDummyWithInjectedTestCase');
-SimpleTest::setMockBaseClass('SimpleMock');
-Mock::generate('SimpleTestCase');
-
-class LikeExpectation extends IdenticalExpectation {
-    function __construct($expectation) {
-        $expectation->message = '';
-        parent::__construct($expectation);
-    }
-
-    function test($compare) {
-        $compare->message = '';
-        return parent::test($compare);
-    }
-
-    function testMessage($compare) {
-        $compare->message = '';
-        return parent::testMessage($compare);
-    }
-}
-
-class TestOfMockExpectations extends UnitTestCase {
-    private $test;
-
-    function setUp() {
-        $this->test = new MockSimpleTestCase();
-    }
-
-    function getMockedTest() {
-        return $this->test;
-    }
-
-    function testSettingExpectationOnNonMethodThrowsError() {
-        $mock = new MockDummyWithInjectedTestCase();
-        $this->expectError();
-        $mock->expectMaximumCallCount('aMissingMethod', 2);
-    }
-
-    function testMaxCallsDetectsOverrun() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 2), 3));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectMaximumCallCount('aMethod', 2);
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testTallyOnMaxCallsSendsPassOnUnderrun() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 2), 2));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectMaximumCallCount("aMethod", 2);
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testExpectNeverDetectsOverrun() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 0), 1));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectNever('aMethod');
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testTallyOnExpectNeverStillSendsPassOnUnderrun() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 0), 0));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectNever('aMethod');
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testMinCalls() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 2), 2));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectMinimumCallCount('aMethod', 2);
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testFailedNever() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 0), 1));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectNever('aMethod');
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testUnderOnce() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 1), 0));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectOnce('aMethod');
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testOverOnce() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 1), 2));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectOnce('aMethod');
-        $mock->aMethod();
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testUnderAtLeastOnce() {
-        $this->test->expectOnce('assert', array(new MemberExpectation('count', 1), 0));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectAtLeastOnce("aMethod");
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testZeroArguments() {
-        $this->test->expectOnce('assert',
-                                array(new MemberExpectation('expected', array()), array(), '*'));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expect('aMethod', array());
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testExpectedArguments() {
-        $this->test->expectOnce('assert',
-                                array(new MemberExpectation('expected', array(1, 2, 3)), array(1, 2, 3), '*'));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expect('aMethod', array(1, 2, 3));
-        $mock->aMethod(1, 2, 3);
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testFailedArguments() {
-        $this->test->expectOnce('assert',
-                                array(new MemberExpectation('expected', array('this')), array('that'), '*'));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expect('aMethod', array('this'));
-        $mock->aMethod('that');
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testWildcardsAreTranslatedToAnythingExpectations() {
-        $this->test->expectOnce('assert',
-                                array(new MemberExpectation('expected',
-                                                            array(new AnythingExpectation(),
-                                                                  123,
-                                                                  new AnythingExpectation())),
-                                      array(100, 123, 101), '*'));
-        $mock = new MockDummyWithInjectedTestCase($this);
-        $mock->expect("aMethod", array('*', 123, '*'));
-        $mock->aMethod(100, 123, 101);
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testSpecificPassingSequence() {
-        $this->test->expectAt(0, 'assert',
-                              array(new MemberExpectation('expected', array(1, 2, 3)), array(1, 2, 3), '*'));
-        $this->test->expectAt(1, 'assert',
-                              array(new MemberExpectation('expected', array('Hello')), array('Hello'), '*'));
-        $mock = new MockDummyWithInjectedTestCase();
-        $mock->expectAt(1, 'aMethod', array(1, 2, 3));
-        $mock->expectAt(2, 'aMethod', array('Hello'));
-        $mock->aMethod();
-        $mock->aMethod(1, 2, 3);
-        $mock->aMethod('Hello');
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-    }
-
-    function testNonArrayForExpectedParametersGivesError() {
-        $mock = new MockDummyWithInjectedTestCase();
-        $this->expectError(new PatternExpectation('/\$args.*not an array/i'));
-        $mock->expect("aMethod", "foo");
-        $mock->aMethod();
-        $mock->mock->atTestEnd('testSomething', $this->test);
-   }
-}
-
-class TestOfMockComparisons extends UnitTestCase {
-
-    function testEqualComparisonOfMocksDoesNotCrash() {
-        $expectation = new EqualExpectation(new MockDummy());
-        $this->assertTrue($expectation->test(new MockDummy(), true));
-    }
-
-    function testIdenticalComparisonOfMocksDoesNotCrash() {
-        $expectation = new IdenticalExpectation(new MockDummy());
-        $this->assertTrue($expectation->test(new MockDummy()));
-    }
-}
-
-class ClassWithSpecialMethods {
-    function __get($name) { }
-    function __set($name, $value) { }
-    function __isset($name) { }
-    function __unset($name) { }
-    function __call($method, $arguments) { }
-    function __toString() { }
-}
-Mock::generate('ClassWithSpecialMethods');
-
-class TestOfSpecialMethodsAfterPHP51 extends UnitTestCase {
-
-    function skip() {
-        $this->skipIf(version_compare(phpversion(), '5.1', '<'), '__isset and __unset overloading not tested unless PHP 5.1+');
-    }
-
-    function testCanEmulateIsset() {
-        $mock = new MockClassWithSpecialMethods();
-        $mock->returnsByValue('__isset', true);
-        $this->assertIdentical(isset($mock->a), true);
-    }
-
-    function testCanExpectUnset() {
-        $mock = new MockClassWithSpecialMethods();
-        $mock->expectOnce('__unset', array('a'));
-        unset($mock->a);
-    }
-
-}
-
-class TestOfSpecialMethods extends UnitTestCase {
-    function skip() {
-        $this->skipIf(version_compare(phpversion(), '5', '<'), 'Overloading not tested unless PHP 5+');
-    }
-
-    function testCanMockTheThingAtAll() {
-        $mock = new MockClassWithSpecialMethods();
-    }
-
-    function testReturnFromSpecialAccessor() {
-        $mock = new MockClassWithSpecialMethods();
-        $mock->returnsByValue('__get', '1st Return', array('first'));
-        $mock->returnsByValue('__get', '2nd Return', array('second'));
-        $this->assertEqual($mock->first, '1st Return');
-        $this->assertEqual($mock->second, '2nd Return');
-    }
-
-    function testcanExpectTheSettingOfValue() {
-        $mock = new MockClassWithSpecialMethods();
-        $mock->expectOnce('__set', array('a', 'A'));
-        $mock->a = 'A';
-    }
-
-    function testCanSimulateAnOverloadmethod() {
-        $mock = new MockClassWithSpecialMethods();
-        $mock->expectOnce('__call', array('amOverloaded', array('A')));
-        $mock->returnsByValue('__call', 'aaa');
-        $this->assertIdentical($mock->amOverloaded('A'), 'aaa');
-    }
-
-    function testToStringMagic() {
-        $mock = new MockClassWithSpecialMethods();
-        $mock->expectOnce('__toString');
-        $mock->returnsByValue('__toString', 'AAA');
-        ob_start();
-        print $mock;
-        $output = ob_get_contents();
-        ob_end_clean();
-        $this->assertEqual($output, 'AAA');
-    }
-}
-
-class WithStaticMethod {
-    static function aStaticMethod() { }
-}
-Mock::generate('WithStaticMethod');
-
-class TestOfMockingClassesWithStaticMethods extends UnitTestCase {
-
-    function testStaticMethodIsMockedAsStatic() {
-        $mock = new WithStaticMethod();
-        $reflection = new ReflectionClass($mock);
-        $method = $reflection->getMethod('aStaticMethod');
-        $this->assertTrue($method->isStatic());
-    }
-}
-
-class MockTestException extends Exception { }
-
-class TestOfThrowingExceptionsFromMocks extends UnitTestCase {
-
-    function testCanThrowOnMethodCall() {
-        $mock = new MockDummy();
-        $mock->throwOn('aMethod');
-        $this->expectException();
-        $mock->aMethod();
-    }
-
-    function testCanThrowSpecificExceptionOnMethodCall() {
-        $mock = new MockDummy();
-        $mock->throwOn('aMethod', new MockTestException());
-        $this->expectException();
-        $mock->aMethod();
-    }
-
-    function testThrowsOnlyWhenCallSignatureMatches() {
-        $mock = new MockDummy();
-        $mock->throwOn('aMethod', new MockTestException(), array(3));
-        $mock->aMethod(1);
-        $mock->aMethod(2);
-        $this->expectException();
-        $mock->aMethod(3);
-    }
-
-    function testCanThrowOnParticularInvocation() {
-        $mock = new MockDummy();
-        $mock->throwAt(2, 'aMethod', new MockTestException());
-        $mock->aMethod();
-        $mock->aMethod();
-        $this->expectException();
-        $mock->aMethod();
-    }
-}
-
-class TestOfThrowingErrorsFromMocks extends UnitTestCase {
-
-    function testCanGenerateErrorFromMethodCall() {
-        $mock = new MockDummy();
-        $mock->errorOn('aMethod', 'Ouch!');
-        $this->expectError('Ouch!');
-        $mock->aMethod();
-    }
-
-    function testGeneratesErrorOnlyWhenCallSignatureMatches() {
-        $mock = new MockDummy();
-        $mock->errorOn('aMethod', 'Ouch!', array(3));
-        $mock->aMethod(1);
-        $mock->aMethod(2);
-        $this->expectError();
-        $mock->aMethod(3);
-    }
-
-    function testCanGenerateErrorOnParticularInvocation() {
-        $mock = new MockDummy();
-        $mock->errorAt(2, 'aMethod', 'Ouch!');
-        $mock->aMethod();
-        $mock->aMethod();
-        $this->expectError();
-        $mock->aMethod();
-    }
-}
-
-Mock::generatePartial('Dummy', 'TestDummy', array('anotherMethod', 'aReferenceMethod'));
-
-class TestOfPartialMocks extends UnitTestCase {
-
-    function testMethodReplacementWithNoBehaviourReturnsNull() {
-        $mock = new TestDummy();
-        $this->assertEqual($mock->aMethod(99), 99);
-        $this->assertNull($mock->anotherMethod());
-    }
-
-    function testSettingReturns() {
-        $mock = new TestDummy();
-        $mock->returnsByValue('anotherMethod', 33, array(3));
-        $mock->returnsByValue('anotherMethod', 22);
-        $mock->returnsByValueAt(2, 'anotherMethod', 44, array(3));
-        $this->assertEqual($mock->anotherMethod(), 22);
-        $this->assertEqual($mock->anotherMethod(3), 33);
-        $this->assertEqual($mock->anotherMethod(3), 44);
-    }
-
-    function testSetReturnReferenceGivesOriginal() {
-        $mock = new TestDummy();
-        $object = 99;
-        $mock->returnsByReferenceAt(0, 'aReferenceMethod', $object, array(3));
-        $this->assertReference($mock->aReferenceMethod(3), $object);
-    }
-
-    function testReturnsAtGivesOriginalObjectHandle() {
-        $mock = new TestDummy();
-        $object = new Dummy();
-        $mock->returnsAt(0, 'anotherMethod', $object, array(3));
-        $this->assertSame($mock->anotherMethod(3), $object);
-    }
-
-    function testExpectations() {
-        $mock = new TestDummy();
-        $mock->expectCallCount('anotherMethod', 2);
-        $mock->expect('anotherMethod', array(77));
-        $mock->expectAt(1, 'anotherMethod', array(66));
-        $mock->anotherMethod(77);
-        $mock->anotherMethod(66);
-    }
-
-    function testSettingExpectationOnMissingMethodThrowsError() {
-        $mock = new TestDummy();
-        $this->expectError();
-        $mock->expectCallCount('aMissingMethod', 2);
-    }
-}
-
-class ConstructorSuperClass {
-    function ConstructorSuperClass() { }
-}
-
-class ConstructorSubClass extends ConstructorSuperClass { }
-
-class TestOfPHP4StyleSuperClassConstruct extends UnitTestCase {
-    function testBasicConstruct() {
-        Mock::generate('ConstructorSubClass');
-        $mock = new MockConstructorSubClass();
-        $this->assertIsA($mock, 'ConstructorSubClass');
-        $this->assertTrue(method_exists($mock, 'ConstructorSuperClass'));
-    }
-}
-
-class TestOfPHP5StaticMethodMocking extends UnitTestCase {
-    function testCanCreateAMockObjectWithStaticMethodsWithoutError() {
-        eval('
-            class SimpleObjectContainingStaticMethod {
-                static function someStatic() { }
-            }
-        ');
-        Mock::generate('SimpleObjectContainingStaticMethod');
-    }
-}
-
-class TestOfPHP5AbstractMethodMocking extends UnitTestCase {
-    function testCanCreateAMockObjectFromAnAbstractWithProperFunctionDeclarations() {
-        eval('
-            abstract class SimpleAbstractClassContainingAbstractMethods {
-                abstract function anAbstract();
-                abstract function anAbstractWithParameter($foo);
-                abstract function anAbstractWithMultipleParameters($foo, $bar);
-            }
-        ');
-        Mock::generate('SimpleAbstractClassContainingAbstractMethods');
-        $this->assertTrue(
-            method_exists(
-                // Testing with class name alone does not work in PHP 5.0
-                new MockSimpleAbstractClassContainingAbstractMethods,
-                'anAbstract'
-            )
-        );
-        $this->assertTrue(
-            method_exists(
-                new MockSimpleAbstractClassContainingAbstractMethods,
-                'anAbstractWithParameter'
-            )
-        );
-        $this->assertTrue(
-            method_exists(
-                new MockSimpleAbstractClassContainingAbstractMethods,
-                'anAbstractWithMultipleParameters'
-            )
-        );
-    }
-
-    function testMethodsDefinedAsAbstractInParentShouldHaveFullSignature() {
-        eval('
-             abstract class SimpleParentAbstractClassContainingAbstractMethods {
-                abstract function anAbstract();
-                abstract function anAbstractWithParameter($foo);
-                abstract function anAbstractWithMultipleParameters($foo, $bar);
-            }
-
-             class SimpleChildAbstractClassContainingAbstractMethods extends SimpleParentAbstractClassContainingAbstractMethods {
-                function anAbstract(){}
-                function anAbstractWithParameter($foo){}
-                function anAbstractWithMultipleParameters($foo, $bar){}
-            }
-
-            class EvenDeeperEmptyChildClass extends SimpleChildAbstractClassContainingAbstractMethods {}
-        ');
-        Mock::generate('SimpleChildAbstractClassContainingAbstractMethods');
-        $this->assertTrue(
-            method_exists(
-                new MockSimpleChildAbstractClassContainingAbstractMethods,
-                'anAbstract'
-            )
-        );
-        $this->assertTrue(
-            method_exists(
-                new MockSimpleChildAbstractClassContainingAbstractMethods,
-                'anAbstractWithParameter'
-            )
-        );
-        $this->assertTrue(
-            method_exists(
-                new MockSimpleChildAbstractClassContainingAbstractMethods,
-                'anAbstractWithMultipleParameters'
-            )
-        );
-        Mock::generate('EvenDeeperEmptyChildClass');
-        $this->assertTrue(
-            method_exists(
-                new MockEvenDeeperEmptyChildClass,
-                'anAbstract'
-            )
-        );
-        $this->assertTrue(
-            method_exists(
-                new MockEvenDeeperEmptyChildClass,
-                'anAbstractWithParameter'
-            )
-        );
-        $this->assertTrue(
-            method_exists(
-                new MockEvenDeeperEmptyChildClass,
-                'anAbstractWithMultipleParameters'
-            )
-        );
-    }
-}
-
-class DummyWithProtected
-{
-    public function aMethodCallsProtected() { return $this->aProtectedMethod(); }
-    protected function aProtectedMethod() { return true; }
-}
-
-Mock::generatePartial('DummyWithProtected', 'TestDummyWithProtected', array('aProtectedMethod'));
-class TestOfProtectedMethodPartialMocks extends UnitTestCase
-{
-    function testProtectedMethodExists() {
-        $this->assertTrue(
-            method_exists(
-                new TestDummyWithProtected,
-                'aProtectedMethod'
-            )
-        );
-    }
-
-    function testProtectedMethodIsCalled() {
-        $object = new DummyWithProtected();
-        $this->assertTrue($object->aMethodCallsProtected(), 'ensure original was called');
-    }
-
-    function testMockedMethodIsCalled() {
-        $object = new TestDummyWithProtected();
-        $object->returnsByValue('aProtectedMethod', false);
-        $this->assertFalse($object->aMethodCallsProtected());
-    }
-}
-
-?>
diff --git a/3rdparty/simpletest/test/page_test.php b/3rdparty/simpletest/test/page_test.php
deleted file mode 100644
index fdc15c5d008b8ddfafa939e2c28b1dd278783f7f..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/page_test.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-// $Id: page_test.php 1913 2009-07-29 16:50:56Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../expectation.php');
-require_once(dirname(__FILE__) . '/../http.php');
-require_once(dirname(__FILE__) . '/../page.php');
-Mock::generate('SimpleHttpHeaders');
-Mock::generate('SimpleHttpResponse');
-
-class TestOfPageInterface extends UnitTestCase {
-    function testInterfaceOnEmptyPage() {
-        $page = new SimplePage();
-        $this->assertEqual($page->getTransportError(), 'No page fetched yet');
-        $this->assertIdentical($page->getRaw(), false);
-        $this->assertIdentical($page->getHeaders(), false);
-        $this->assertIdentical($page->getMimeType(), false);
-        $this->assertIdentical($page->getResponseCode(), false);
-        $this->assertIdentical($page->getAuthentication(), false);
-        $this->assertIdentical($page->getRealm(), false);
-        $this->assertFalse($page->hasFrames());
-        $this->assertIdentical($page->getUrls(), array());
-        $this->assertIdentical($page->getTitle(), false);
-    }
-}
-
-class TestOfPageHeaders extends UnitTestCase {
-
-    function testUrlAccessor() {
-        $headers = new MockSimpleHttpHeaders();
-
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getHeaders', $headers);
-        $response->setReturnValue('getMethod', 'POST');
-        $response->setReturnValue('getUrl', new SimpleUrl('here'));
-        $response->setReturnValue('getRequestData', array('a' => 'A'));
-
-        $page = new SimplePage($response);
-        $this->assertEqual($page->getMethod(), 'POST');
-        $this->assertEqual($page->getUrl(), new SimpleUrl('here'));
-        $this->assertEqual($page->getRequestData(), array('a' => 'A'));
-    }
-
-    function testTransportError() {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getError', 'Ouch');
-
-        $page = new SimplePage($response);
-        $this->assertEqual($page->getTransportError(), 'Ouch');
-    }
-
-    function testHeadersAccessor() {
-        $headers = new MockSimpleHttpHeaders();
-        $headers->setReturnValue('getRaw', 'My: Headers');
-
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getHeaders', $headers);
-
-        $page = new SimplePage($response);
-        $this->assertEqual($page->getHeaders(), 'My: Headers');
-    }
-
-    function testMimeAccessor() {
-        $headers = new MockSimpleHttpHeaders();
-        $headers->setReturnValue('getMimeType', 'text/html');
-
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getHeaders', $headers);
-
-        $page = new SimplePage($response);
-        $this->assertEqual($page->getMimeType(), 'text/html');
-    }
-
-    function testResponseAccessor() {
-        $headers = new MockSimpleHttpHeaders();
-        $headers->setReturnValue('getResponseCode', 301);
-
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getHeaders', $headers);
-
-        $page = new SimplePage($response);
-        $this->assertIdentical($page->getResponseCode(), 301);
-    }
-
-    function testAuthenticationAccessors() {
-        $headers = new MockSimpleHttpHeaders();
-        $headers->setReturnValue('getAuthentication', 'Basic');
-        $headers->setReturnValue('getRealm', 'Secret stuff');
-
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getHeaders', $headers);
-
-        $page = new SimplePage($response);
-        $this->assertEqual($page->getAuthentication(), 'Basic');
-        $this->assertEqual($page->getRealm(), 'Secret stuff');
-    }
-}
-
-class TestOfHtmlStrippingAndNormalisation extends UnitTestCase {
-
-	function testImageSuppressionWhileKeepingParagraphsAndAltText() {
-        $this->assertEqual(
-                SimplePage::normalise('<img src="foo.png" /><p>some text</p><img src="bar.png" alt="bar" />'),
-                'some text bar');
-	}
-
-    function testSpaceNormalisation() {
-        $this->assertEqual(
-                SimplePage::normalise("\nOne\tTwo   \nThree\t"),
-                'One Two Three');
-    }
-
-    function testMultilinesCommentSuppression() {
-        $this->assertEqual(
-                SimplePage::normalise('<!--\n Hello \n-->'),
-                '');
-    }
-
-    function testCommentSuppression() {
-        $this->assertEqual(
-                SimplePage::normalise('<!--Hello-->'),
-                '');
-    }
-
-    function testJavascriptSuppression() {
-        $this->assertEqual(
-                SimplePage::normalise('<script attribute="test">\nHello\n</script>'),
-                '');
-        $this->assertEqual(
-                SimplePage::normalise('<script attribute="test">Hello</script>'),
-                '');
-        $this->assertEqual(
-                SimplePage::normalise('<script>Hello</script>'),
-                '');
-    }
-
-    function testTagSuppression() {
-        $this->assertEqual(
-                SimplePage::normalise('<b>Hello</b>'),
-                'Hello');
-    }
-
-    function testAdjoiningTagSuppression() {
-        $this->assertEqual(
-                SimplePage::normalise('<b>Hello</b><em>Goodbye</em>'),
-                'HelloGoodbye');
-    }
-
-    function testExtractImageAltTextWithDifferentQuotes() {
-        $this->assertEqual(
-                SimplePage::normalise('<img alt="One"><img alt=\'Two\'><img alt=Three>'),
-                'One Two Three');
-    }
-
-    function testExtractImageAltTextMultipleTimes() {
-        $this->assertEqual(
-                SimplePage::normalise('<img alt="One"><img alt="Two"><img alt="Three">'),
-                'One Two Three');
-    }
-
-    function testHtmlEntityTranslation() {
-        $this->assertEqual(
-                SimplePage::normalise('&lt;&gt;&quot;&amp;&#039;'),
-                '<>"&\'');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/parse_error_test.php b/3rdparty/simpletest/test/parse_error_test.php
deleted file mode 100644
index c3ffb3d42057459a7590e5583d949e88e9afbca0..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/parse_error_test.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-// $Id: parse_error_test.php 1509 2007-05-08 22:11:49Z lastcraft $
-require_once('../unit_tester.php');
-require_once('../reporter.php');
-
-$test = &new TestSuite('This should fail');
-$test->addFile('test_with_parse_error.php');
-$test->run(new HtmlReporter());
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/parsing_test.php b/3rdparty/simpletest/test/parsing_test.php
deleted file mode 100644
index 2c5e6cafe1d7bdab93e55b9d422ceb7d0ad378e3..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/parsing_test.php
+++ /dev/null
@@ -1,642 +0,0 @@
-<?php
-// $Id: page_test.php 1912 2009-07-29 16:39:17Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../page.php');
-require_once(dirname(__FILE__) . '/../php_parser.php');
-require_once(dirname(__FILE__) . '/../tidy_parser.php');
-Mock::generate('SimpleHttpResponse');
-
-abstract class TestOfParsing extends UnitTestCase {
-
-    function testRawAccessor() {
-        $page = $this->whenVisiting('http://host/', 'Raw HTML');
-        $this->assertEqual($page->getRaw(), 'Raw HTML');
-    }
-
-    function testTextAccessor() {
-        $page = $this->whenVisiting('http://host/', '<b>Some</b> &quot;messy&quot; HTML');
-        $this->assertEqual($page->getText(), 'Some "messy" HTML');
-    }
-
-    function testFramesetAbsence() {
-        $page = $this->whenVisiting('http://here/', '');
-        $this->assertFalse($page->hasFrames());
-        $this->assertIdentical($page->getFrameset(), false);
-    }
-
-    function testPageWithNoUrlsGivesEmptyArrayOfLinks() {
-        $page = $this->whenVisiting('http://here/', '<html><body><p>Stuff</p></body></html>');
-        $this->assertIdentical($page->getUrls(), array());
-    }
-
-    function testAddAbsoluteLink() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><a href="http://somewhere.com">Label</a></html>');
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://somewhere.com')));
-    }
-
-    function testUrlLabelsHaveHtmlTagsStripped() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><a href="http://somewhere.com"><b>Label</b></a></html>');
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://somewhere.com')));
-    }
-
-    function testAddStrictRelativeLink() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><a href="./somewhere.php">Label</a></html>');
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://host/somewhere.php')));
-    }
-
-    function testAddBareRelativeLink() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><a href="somewhere.php">Label</a></html>');
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://host/somewhere.php')));
-    }
-
-    function testAddRelativeLinkWithBaseTag() {
-        $raw = '<html><head><base href="http://www.lastcraft.com/stuff/"></head>' .
-               '<body><a href="somewhere.php">Label</a></body>' .
-               '</html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://www.lastcraft.com/stuff/somewhere.php')));
-    }
-
-    function testAddAbsoluteLinkWithBaseTag() {
-        $raw = '<html><head><base href="http://www.lastcraft.com/stuff/"></head>' .
-               '<body><a href="http://here.com/somewhere.php">Label</a></body>' .
-               '</html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://here.com/somewhere.php')));
-    }
-
-    function testCanFindLinkInsideForm() {
-        $raw = '<html><body><form><a href="./somewhere.php">Label</a></form></body></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://host/somewhere.php')));
-    }
-
-    function testCanGetLinksByIdOrLabel() {
-        $raw = '<html><body><a href="./somewhere.php" id="33">Label</a></body></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual(
-                $page->getUrlsByLabel('Label'),
-                array(new SimpleUrl('http://host/somewhere.php')));
-        $this->assertFalse($page->getUrlById(0));
-        $this->assertEqual(
-                $page->getUrlById(33),
-                new SimpleUrl('http://host/somewhere.php'));
-    }
-
-    function testCanFindLinkByNormalisedLabel() {
-        $raw = '<html><body><a href="./somewhere.php" id="33"><em>Long &amp; thin</em></a></body></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual(
-                $page->getUrlsByLabel('Long & thin'),
-                array(new SimpleUrl('http://host/somewhere.php')));
-    }
-
-    function testCanFindLinkByImageAltText() {
-        $raw = '<a href="./somewhere.php" id="33"><img src="pic.jpg" alt="&lt;A picture&gt;"></a>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual(
-                array_map(array($this, 'urlToString'), $page->getUrlsByLabel('<A picture>')),
-                array('http://host/somewhere.php'));
-    }
-
-    function testTitle() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><head><title>Me</title></head></html>');
-        $this->assertEqual($page->getTitle(), 'Me');
-    }
-
-    function testTitleWithEntityReference() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><head><Title>Me&amp;Me</TITLE></head></html>');
-        $this->assertEqual($page->getTitle(), "Me&Me");
-    }
-
-    function testOnlyFramesInFramesetAreRecognised() {
-        $raw =
-            '<frameset>' .
-            '  <frame src="2.html"></frame>' .
-            '  <frame src="3.html"></frame>' .
-            '</frameset>' .
-            '<frame src="4.html"></frame>';
-        $page = $this->whenVisiting('http://here', $raw);
-        $this->assertTrue($page->hasFrames());
-        $this->assertSameFrameset($page->getFrameset(), array(
-                1 => new SimpleUrl('http://here/2.html'),
-                2 => new SimpleUrl('http://here/3.html')));
-    }
-
-    function testReadsNamesInFrames() {
-        $raw =
-            '<frameset>' .
-            '  <frame src="1.html"></frame>' .
-            '  <frame src="2.html" name="A"></frame>' .
-            '  <frame src="3.html" name="B"></frame>' .
-            '  <frame src="4.html"></frame>' .
-            '</frameset>';
-        $page = $this->whenVisiting('http://here', $raw);
-        $this->assertTrue($page->hasFrames());
-        $this->assertSameFrameset($page->getFrameset(), array(
-                1 => new SimpleUrl('http://here/1.html'),
-                'A' => new SimpleUrl('http://here/2.html'),
-                'B' => new SimpleUrl('http://here/3.html'),
-                4 => new SimpleUrl('http://here/4.html')));
-    }
-
-    function testRelativeFramesRespectBaseTag() {
-        $raw = '<base href="https://there.com/stuff/"><frameset><frame src="1.html"></frameset>';
-        $page = $this->whenVisiting('http://here', $raw);
-        $this->assertSameFrameset(
-                $page->getFrameset(),
-                array(1 => new SimpleUrl('https://there.com/stuff/1.html')));
-    }
-
-    function testSingleFrameInNestedFrameset() {
-        $raw = '<html><frameset><frameset>' .
-                '<frame src="a.html">' .
-                '</frameset></frameset></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->hasFrames());
-        $this->assertIdentical(
-                $page->getFrameset(),
-                array(1 => new SimpleUrl('http://host/a.html')));
-    }
-
-    function testFramesCollectedWithNestedFramesetTags() {
-        $raw = '<html><frameset>' .
-                '<frame src="a.html">' .
-                '<frameset><frame src="b.html"></frameset>' .
-                '<frame src="c.html">' .
-                '</frameset></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->hasFrames());
-        $this->assertIdentical($page->getFrameset(), array(
-                1 => new SimpleUrl('http://host/a.html'),
-                2 => new SimpleUrl('http://host/b.html'),
-                3 => new SimpleUrl('http://host/c.html')));
-    }
-
-    function testNamedFrames() {
-        $raw = '<html><frameset>' .
-                '<frame src="a.html">' .
-                '<frame name="_one" src="b.html">' .
-                '<frame src="c.html">' .
-                '<frame src="d.html" name="_two">' .
-                '</frameset></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->hasFrames());
-        $this->assertIdentical($page->getFrameset(), array(
-                1 => new SimpleUrl('http://host/a.html'),
-                '_one' => new SimpleUrl('http://host/b.html'),
-                3 => new SimpleUrl('http://host/c.html'),
-                '_two' => new SimpleUrl('http://host/d.html')));
-    }
-
-    function testCanReadElementOfCompleteForm() {
-        $raw = '<html><head><form>' .
-                '<input type="text" name="here" value="Hello">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('here')), "Hello");
-    }
-
-    function testCanReadElementOfUnclosedForm() {
-        $raw = '<html><head><form>' .
-                '<input type="text" name="here" value="Hello">' .
-                '</head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('here')), "Hello");
-    }
-
-    function testCanReadElementByLabel() {
-        $raw = '<html><head><form>' .
-                '<label>Where<input type="text" name="here" value="Hello"></label>' .
-                '</head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabel('Where')), "Hello");
-    }
-
-    function testCanFindFormByLabel() {
-        $raw = '<html><head><form><input type="submit"></form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertNull($page->getFormBySubmit(new SimpleByLabel('submit')));
-        $this->assertNull($page->getFormBySubmit(new SimpleByName('submit')));
-        $this->assertIsA(
-                $page->getFormBySubmit(new SimpleByLabel('Submit')),
-                'SimpleForm');
-    }
-
-    function testConfirmSubmitAttributesAreCaseSensitive() {
-        $raw = '<html><head><FORM><INPUT TYPE="SUBMIT" NAME="S" VALUE="S"></FORM></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertIsA(
-                $page->getFormBySubmit(new SimpleByName('S')),
-                'SimpleForm');
-        $this->assertIsA(
-                $page->getFormBySubmit(new SimpleByLabel('S')),
-                'SimpleForm');
-    }
-
-    function testCanFindFormByImage() {
-        $raw = '<html><head><form>' .
-                '<input type="image" id=100 alt="Label" name="me">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertIsA(
-                $page->getFormByImage(new SimpleByLabel('Label')),
-                'SimpleForm');
-        $this->assertIsA(
-                $page->getFormByImage(new SimpleByName('me')),
-                'SimpleForm');
-        $this->assertIsA(
-                $page->getFormByImage(new SimpleById(100)),
-                'SimpleForm');
-    }
-
-    function testCanFindFormByButtonTag() {
-        $raw = '<html><head><form>' .
-                '<button type="submit" name="b" value="B">BBB</button>' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertNull($page->getFormBySubmit(new SimpleByLabel('b')));
-        $this->assertNull($page->getFormBySubmit(new SimpleByLabel('B')));
-        $this->assertIsA(
-                $page->getFormBySubmit(new SimpleByName('b')),
-                'SimpleForm');
-        $this->assertIsA(
-                $page->getFormBySubmit(new SimpleByLabel('BBB')),
-                'SimpleForm');
-    }
-
-    function testCanFindFormById() {
-        $raw = '<html><head><form id="55"><input type="submit"></form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertNull($page->getFormById(54));
-        $this->assertIsA($page->getFormById(55), 'SimpleForm');
-    }
-
-    function testFormCanBeSubmitted() {
-        $raw = '<html><head><form method="GET" action="here.php">' .
-                '<input type="submit" name="s" value="Submit">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $form = $page->getFormBySubmit(new SimpleByLabel('Submit'));
-        $this->assertEqual(
-                $form->submitButton(new SimpleByLabel('Submit')),
-                new SimpleGetEncoding(array('s' => 'Submit')));
-    }
-
-    function testUnparsedTagDoesNotCrash() {
-        $raw = '<form><input type="reset" name="Clear"></form>';
-        $this->whenVisiting('http://host', $raw);
-    }
-
-    function testReadingTextField() {
-        $raw = '<html><head><form>' .
-                '<input type="text" name="a">' .
-                '<input type="text" name="b" value="bbb" id=3>' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertNull($page->getField(new SimpleByName('missing')));
-        $this->assertIdentical($page->getField(new SimpleByName('a')), '');
-        $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb');
-    }
-
-    function testEntitiesAreDecodedInDefaultTextFieldValue() {
-        $raw = '<form><input type="text" name="a" value="&amp;\'&quot;&lt;&gt;"></form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), '&\'"<>');
-    }
-
-    function testReadingTextFieldIsCaseInsensitive() {
-        $raw = '<html><head><FORM>' .
-                '<INPUT TYPE="TEXT" NAME="a">' .
-                '<INPUT TYPE="TEXT" NAME="b" VALUE="bbb" id=3>' .
-                '</FORM></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertNull($page->getField(new SimpleByName('missing')));
-        $this->assertIdentical($page->getField(new SimpleByName('a')), '');
-        $this->assertIdentical($page->getField(new SimpleByName('b')), 'bbb');
-    }
-
-    function testSettingTextField() {
-        $raw = '<html><head><form>' .
-                '<input type="text" name="a">' .
-                '<input type="text" name="b" id=3>' .
-                '<input type="submit">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa'));
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa');
-        $this->assertTrue($page->setField(new SimpleById(3), 'bbb'));
-        $this->assertEqual($page->getField(new SimpleBYId(3)), 'bbb');
-        $this->assertFalse($page->setField(new SimpleByName('z'), 'zzz'));
-        $this->assertNull($page->getField(new SimpleByName('z')));
-    }
-
-    function testSettingTextFieldByEnclosingLabel() {
-        $raw = '<html><head><form>' .
-                '<label>Stuff' .
-                '<input type="text" name="a" value="A">' .
-                '</label>' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'A');
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
-        $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa'));
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa');
-    }
-
-    function testLabelsWithoutForDoNotAttachToInputsWithNoId() {
-        $raw = '<form action="network_confirm.php?x=X&y=Y" method="post">
-            <label>Text A <input type="text" name="a" value="one"></label>
-            <label>Text B <input type="text" name="b" value="two"></label>
-        </form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabelOrName('Text A')), 'one');
-        $this->assertEqual($page->getField(new SimpleByLabelOrName('Text B')), 'two');
-        $this->assertTrue($page->setField(new SimpleByLabelOrName('Text A'), '1'));
-        $this->assertTrue($page->setField(new SimpleByLabelOrName('Text B'), '2'));
-        $this->assertEqual($page->getField(new SimpleByLabelOrName('Text A')), '1');
-        $this->assertEqual($page->getField(new SimpleByLabelOrName('Text B')), '2');
-    }
-
-    function testGettingTextFieldByEnclosingLabelWithConflictingOtherFields() {
-        $raw = '<html><head><form>' .
-                '<label>Stuff' .
-                '<input type="text" name="a" value="A">' .
-                '</label>' .
-                '<input type="text" name="b" value="B">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'A');
-        $this->assertEqual($page->getField(new SimpleByName('b')), 'B');
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
-    }
-
-    function testSettingTextFieldByExternalLabel() {
-        $raw = '<html><head><form>' .
-                '<label for="aaa">Stuff</label>' .
-                '<input id="aaa" type="text" name="a" value="A">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
-        $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'aaa'));
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'aaa');
-    }
-
-    function testReadingTextArea() {
-        $raw = '<html><head><form>' .
-                '<textarea name="a">aaa</textarea>' .
-                '<input type="submit">' .
-                '</form></head></html>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa');
-    }
-
-    function testEntitiesAreDecodedInTextareaValue() {
-        $raw = '<form><textarea name="a">&amp;\'&quot;&lt;&gt;</textarea></form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), '&\'"<>');
-    }
-
-    function testNewlinesPreservedInTextArea() {
-        $raw = "<form><textarea name=\"a\">hello\r\nworld</textarea></form>";
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), "hello\r\nworld");
-    }
-
-    function testWhitespacePreservedInTextArea() {
-        $raw = '<form><textarea name="a">     </textarea></form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), '     ');
-    }
-
-    function testComplexWhitespaceInTextArea() {
-        $raw = "<html>\n" .
-                "    <head><title></title></head>\n" .
-                "    <body>\n" .
-                "        <form>\n".
-                "            <label>Text area C\n" .
-                "                <textarea name='c'>\n" .
-                "                </textarea>\n" .
-                "            </label>\n" .
-                "        </form>\n" .
-                "    </body>\n" .
-                "</html>";
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('c')), "                ");
-    }
-
-    function testSettingTextArea() {
-        $raw = '<form>' .
-                '<textarea name="a">aaa</textarea>' .
-                '<input type="submit">' .
-                '</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->setField(new SimpleByName('a'), 'AAA'));
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'AAA');
-    }
-
-    function testDontIncludeTextAreaContentInLabel() {
-        $raw = '<form><label>Text area C<textarea id=3 name="c">mouse</textarea></label></form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabel('Text area C')), 'mouse');
-    }
-
-    function testSettingSelectionField() {
-        $raw = '<form>' .
-                '<select name="a">' .
-                '<option>aaa</option>' .
-                '<option selected>bbb</option>' .
-                '</select>' .
-                '<input type="submit">' .
-                '</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'bbb');
-        $this->assertFalse($page->setField(new SimpleByName('a'), 'ccc'));
-        $this->assertTrue($page->setField(new SimpleByName('a'), 'aaa'));
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'aaa');
-    }
-
-    function testSelectionOptionsAreNormalised() {
-        $raw = '<form>' .
-                '<select name="a">' .
-                '<option selected><b>Big</b> bold</option>' .
-                '<option>small <em>italic</em></option>' .
-                '</select>' .
-                '</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'Big bold');
-        $this->assertTrue($page->setField(new SimpleByName('a'), 'small italic'));
-        $this->assertEqual($page->getField(new SimpleByName('a')), 'small italic');
-    }
-
-    function testCanParseBlankOptions() {
-        $raw = '<form>
-                <select id=4 name="d">
-                    <option value="d1">D1</option>
-                    <option value="d2">D2</option>
-                    <option></option>
-                </select>
-                </form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->setField(new SimpleByName('d'), ''));
-    }
-
-    function testTwoSelectionFieldsAreIndependent() {
-        $raw = '<form>
-                    <select id=4 name="d">
-                        <option value="d1" selected>D1</option>
-                        <option value="d2">D2</option>
-                    </select>
-                    <select id=11 name="h">
-                        <option value="h1">H1</option>
-                        <option value="h2" selected>H2</option>
-                    </select>
-                </form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->setField(new SimpleByName('d'), 'd2'));
-        $this->assertTrue($page->setField(new SimpleByName('h'), 'h1'));
-        $this->assertEqual($page->getField(new SimpleByName('d')), 'd2');
-    }
-
-    function testEmptyOptionDoesNotScrewUpTwoSelectionFields() {
-        $raw = '<form>
-                    <select name="d">
-                        <option value="d1" selected>D1</option>
-                        <option value="d2">D2</option>
-                        <option></option>
-                    </select>
-                    <select name="h">
-                        <option value="h1">H1</option>
-                        <option value="h2" selected>H2</option>
-                    </select>
-                </form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->setField(new SimpleByName('d'), 'd2'));
-        $this->assertTrue($page->setField(new SimpleByName('h'), 'h1'));
-        $this->assertEqual($page->getField(new SimpleByName('d')), 'd2');
-    }
-
-    function testSettingSelectionFieldByEnclosingLabel() {
-        $raw = '<form>' .
-                '<label>Stuff' .
-                '<select name="a"><option selected>A</option><option>B</option></select>' .
-                '</label>' .
-                '</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A');
-        $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'B'));
-        $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'B');
-    }
-
-    function testTwoSelectionFieldsWithLabelsAreIndependent() {
-        $raw = '<form>
-                    <label>Labelled D
-                        <select id=4 name="d">
-                            <option value="d1" selected>D1</option>
-                            <option value="d2">D2</option>
-                        </select>
-                    </label>
-                    <label>Labelled H
-                        <select id=11 name="h">
-                            <option value="h1">H1</option>
-                            <option value="h2" selected>H2</option>
-                        </select>
-                    </label>
-                </form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertTrue($page->setField(new SimpleByLabel('Labelled D'), 'd2'));
-        $this->assertTrue($page->setField(new SimpleByLabel('Labelled H'), 'h1'));
-        $this->assertEqual($page->getField(new SimpleByLabel('Labelled D')), 'd2');
-    }
-
-    function testSettingRadioButtonByEnclosingLabel() {
-        $raw = '<form>' .
-                '<label>A<input type="radio" name="r" value="a" checked></label>' .
-                '<label>B<input type="radio" name="r" value="b"></label>' .
-                '</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabel('A')), 'a');
-        $this->assertTrue($page->setField(new SimpleBylabel('B'), 'b'));
-        $this->assertEqual($page->getField(new SimpleByLabel('B')), 'b');
-    }
-
-    function testCanParseInputsWithAllKindsOfAttributeQuoting() {
-        $raw = '<form>' .
-                '<input type="checkbox" name=\'first\' value=one checked></input>' .
-                '<input type=checkbox name="second" value="two"></input>' .
-                '<input type=checkbox name="third" value=\'three\' checked="checked" />' .
-                '</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByName('first')), 'one');
-        $this->assertEqual($page->getField(new SimpleByName('second')), false);
-        $this->assertEqual($page->getField(new SimpleByName('third')), 'three');
-    }
-
-    function urlToString($url) {
-        return $url->asString();
-    }
-
-    function assertSameFrameset($actual, $expected) {
-        $this->assertIdentical(array_map(array($this, 'urlToString'), $actual),
-                               array_map(array($this, 'urlToString'), $expected));
-    }
-}
-
-class TestOfParsingUsingPhpParser extends TestOfParsing {
-
-    function whenVisiting($url, $content) {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getContent', $content);
-        $response->setReturnValue('getUrl', new SimpleUrl($url));
-        $builder = new SimplePhpPageBuilder();
-        return $builder->parse($response);
-    }
-
-    function testNastyTitle() {
-        $page = $this->whenVisiting('http://host',
-                                    '<html><head><Title> <b>Me&amp;Me </TITLE></b></head></html>');
-        $this->assertEqual($page->getTitle(), "Me&Me");
-    }
-
-    function testLabelShouldStopAtClosingLabelTag() {
-        $raw = '<form><label>start<textarea id=3 name="c" wrap="hard">stuff</textarea>end</label>stuff</form>';
-        $page = $this->whenVisiting('http://host', $raw);
-        $this->assertEqual($page->getField(new SimpleByLabel('startend')), 'stuff');
-    }
-}
-
-class TestOfParsingUsingTidyParser extends TestOfParsing {
-
-    function skip() {
-        $this->skipUnless(extension_loaded('tidy'), 'Install \'tidy\' php extension to enable html tidy based parser');
-    }
-
-    function whenVisiting($url, $content) {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getContent', $content);
-        $response->setReturnValue('getUrl', new SimpleUrl($url));
-        $builder = new SimpleTidyPageBuilder();
-        return $builder->parse($response);
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/php_parser_test.php b/3rdparty/simpletest/test/php_parser_test.php
deleted file mode 100644
index d95c7d06a60efd0f56ce6e899e5d21fc814922aa..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/php_parser_test.php
+++ /dev/null
@@ -1,489 +0,0 @@
-<?php
-// $Id: php_parser_test.php 1911 2009-07-29 16:38:04Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../php_parser.php');
-require_once(dirname(__FILE__) . '/../tag.php');
-Mock::generate('SimplePage');
-Mock::generate('SimplePhpPageBuilder');
-Mock::generate('SimpleHttpResponse');
-Mock::generatePartial(
-        'SimplePhpPageBuilder',
-        'PartialSimplePhpPageBuilder',
-        array('createPage', 'createParser'));
-Mock::generate('SimpleHtmlSaxParser');
-Mock::generate('SimplePhpPageBuilder');
-
-class TestOfParallelRegex extends UnitTestCase {
-
-    function testNoPatterns() {
-        $regex = new ParallelRegex(false);
-        $this->assertFalse($regex->match("Hello", $match));
-        $this->assertEqual($match, "");
-    }
-
-    function testNoSubject() {
-        $regex = new ParallelRegex(false);
-        $regex->addPattern(".*");
-        $this->assertTrue($regex->match("", $match));
-        $this->assertEqual($match, "");
-    }
-
-    function testMatchAll() {
-        $regex = new ParallelRegex(false);
-        $regex->addPattern(".*");
-        $this->assertTrue($regex->match("Hello", $match));
-        $this->assertEqual($match, "Hello");
-    }
-
-    function testCaseSensitive() {
-        $regex = new ParallelRegex(true);
-        $regex->addPattern("abc");
-        $this->assertTrue($regex->match("abcdef", $match));
-        $this->assertEqual($match, "abc");
-        $this->assertTrue($regex->match("AAABCabcdef", $match));
-        $this->assertEqual($match, "abc");
-    }
-
-    function testCaseInsensitive() {
-        $regex = new ParallelRegex(false);
-        $regex->addPattern("abc");
-        $this->assertTrue($regex->match("abcdef", $match));
-        $this->assertEqual($match, "abc");
-        $this->assertTrue($regex->match("AAABCabcdef", $match));
-        $this->assertEqual($match, "ABC");
-    }
-
-    function testMatchMultiple() {
-        $regex = new ParallelRegex(true);
-        $regex->addPattern("abc");
-        $regex->addPattern("ABC");
-        $this->assertTrue($regex->match("abcdef", $match));
-        $this->assertEqual($match, "abc");
-        $this->assertTrue($regex->match("AAABCabcdef", $match));
-        $this->assertEqual($match, "ABC");
-        $this->assertFalse($regex->match("Hello", $match));
-    }
-
-    function testPatternLabels() {
-        $regex = new ParallelRegex(false);
-        $regex->addPattern("abc", "letter");
-        $regex->addPattern("123", "number");
-        $this->assertIdentical($regex->match("abcdef", $match), "letter");
-        $this->assertEqual($match, "abc");
-        $this->assertIdentical($regex->match("0123456789", $match), "number");
-        $this->assertEqual($match, "123");
-    }
-}
-
-class TestOfStateStack extends UnitTestCase {
-
-    function testStartState() {
-        $stack = new SimpleStateStack("one");
-        $this->assertEqual($stack->getCurrent(), "one");
-    }
-
-    function testExhaustion() {
-        $stack = new SimpleStateStack("one");
-        $this->assertFalse($stack->leave());
-    }
-
-    function testStateMoves() {
-        $stack = new SimpleStateStack("one");
-        $stack->enter("two");
-        $this->assertEqual($stack->getCurrent(), "two");
-        $stack->enter("three");
-        $this->assertEqual($stack->getCurrent(), "three");
-        $this->assertTrue($stack->leave());
-        $this->assertEqual($stack->getCurrent(), "two");
-        $stack->enter("third");
-        $this->assertEqual($stack->getCurrent(), "third");
-        $this->assertTrue($stack->leave());
-        $this->assertTrue($stack->leave());
-        $this->assertEqual($stack->getCurrent(), "one");
-    }
-}
-
-class TestParser {
-
-    function accept() {
-    }
-
-    function a() {
-    }
-
-    function b() {
-    }
-}
-Mock::generate('TestParser');
-
-class TestOfLexer extends UnitTestCase {
-
-    function testEmptyPage() {
-        $handler = new MockTestParser();
-        $handler->expectNever("accept");
-        $handler->setReturnValue("accept", true);
-        $handler->expectNever("accept");
-        $handler->setReturnValue("accept", true);
-        $lexer = new SimpleLexer($handler);
-        $lexer->addPattern("a+");
-        $this->assertTrue($lexer->parse(""));
-    }
-
-    function testSinglePattern() {
-        $handler = new MockTestParser();
-        $handler->expectAt(0, "accept", array("aaa", LEXER_MATCHED));
-        $handler->expectAt(1, "accept", array("x", LEXER_UNMATCHED));
-        $handler->expectAt(2, "accept", array("a", LEXER_MATCHED));
-        $handler->expectAt(3, "accept", array("yyy", LEXER_UNMATCHED));
-        $handler->expectAt(4, "accept", array("a", LEXER_MATCHED));
-        $handler->expectAt(5, "accept", array("x", LEXER_UNMATCHED));
-        $handler->expectAt(6, "accept", array("aaa", LEXER_MATCHED));
-        $handler->expectAt(7, "accept", array("z", LEXER_UNMATCHED));
-        $handler->expectCallCount("accept", 8);
-        $handler->setReturnValue("accept", true);
-        $lexer = new SimpleLexer($handler);
-        $lexer->addPattern("a+");
-        $this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));
-    }
-
-    function testMultiplePattern() {
-        $handler = new MockTestParser();
-        $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x");
-        for ($i = 0; $i < count($target); $i++) {
-            $handler->expectAt($i, "accept", array($target[$i], '*'));
-        }
-        $handler->expectCallCount("accept", count($target));
-        $handler->setReturnValue("accept", true);
-        $lexer = new SimpleLexer($handler);
-        $lexer->addPattern("a+");
-        $lexer->addPattern("b+");
-        $this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));
-    }
-}
-
-class TestOfLexerModes extends UnitTestCase {
-
-    function testIsolatedPattern() {
-        $handler = new MockTestParser();
-        $handler->expectAt(0, "a", array("a", LEXER_MATCHED));
-        $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectAt(2, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(3, "a", array("bxb", LEXER_UNMATCHED));
-        $handler->expectAt(4, "a", array("aaa", LEXER_MATCHED));
-        $handler->expectAt(5, "a", array("x", LEXER_UNMATCHED));
-        $handler->expectAt(6, "a", array("aaaa", LEXER_MATCHED));
-        $handler->expectAt(7, "a", array("x", LEXER_UNMATCHED));
-        $handler->expectCallCount("a", 8);
-        $handler->setReturnValue("a", true);
-        $lexer = new SimpleLexer($handler, "a");
-        $lexer->addPattern("a+", "a");
-        $lexer->addPattern("b+", "b");
-        $this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));
-    }
-
-    function testModeChange() {
-        $handler = new MockTestParser();
-        $handler->expectAt(0, "a", array("a", LEXER_MATCHED));
-        $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectAt(2, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(3, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectAt(4, "a", array("aaa", LEXER_MATCHED));
-        $handler->expectAt(0, "b", array(":", LEXER_ENTER));
-        $handler->expectAt(1, "b", array("a", LEXER_UNMATCHED));
-        $handler->expectAt(2, "b", array("b", LEXER_MATCHED));
-        $handler->expectAt(3, "b", array("a", LEXER_UNMATCHED));
-        $handler->expectAt(4, "b", array("bb", LEXER_MATCHED));
-        $handler->expectAt(5, "b", array("a", LEXER_UNMATCHED));
-        $handler->expectAt(6, "b", array("bbb", LEXER_MATCHED));
-        $handler->expectAt(7, "b", array("a", LEXER_UNMATCHED));
-        $handler->expectCallCount("a", 5);
-        $handler->expectCallCount("b", 8);
-        $handler->setReturnValue("a", true);
-        $handler->setReturnValue("b", true);
-        $lexer = new SimpleLexer($handler, "a");
-        $lexer->addPattern("a+", "a");
-        $lexer->addEntryPattern(":", "a", "b");
-        $lexer->addPattern("b+", "b");
-        $this->assertTrue($lexer->parse("abaabaaa:ababbabbba"));
-    }
-
-    function testNesting() {
-        $handler = new MockTestParser();
-        $handler->setReturnValue("a", true);
-        $handler->setReturnValue("b", true);
-        $handler->expectAt(0, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(1, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectAt(2, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(3, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectAt(0, "b", array("(", LEXER_ENTER));
-        $handler->expectAt(1, "b", array("bb", LEXER_MATCHED));
-        $handler->expectAt(2, "b", array("a", LEXER_UNMATCHED));
-        $handler->expectAt(3, "b", array("bb", LEXER_MATCHED));
-        $handler->expectAt(4, "b", array(")", LEXER_EXIT));
-        $handler->expectAt(4, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(5, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectCallCount("a", 6);
-        $handler->expectCallCount("b", 5);
-        $lexer = new SimpleLexer($handler, "a");
-        $lexer->addPattern("a+", "a");
-        $lexer->addEntryPattern("(", "a", "b");
-        $lexer->addPattern("b+", "b");
-        $lexer->addExitPattern(")", "b");
-        $this->assertTrue($lexer->parse("aabaab(bbabb)aab"));
-    }
-
-    function testSingular() {
-        $handler = new MockTestParser();
-        $handler->setReturnValue("a", true);
-        $handler->setReturnValue("b", true);
-        $handler->expectAt(0, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(1, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(2, "a", array("xx", LEXER_UNMATCHED));
-        $handler->expectAt(3, "a", array("xx", LEXER_UNMATCHED));
-        $handler->expectAt(0, "b", array("b", LEXER_SPECIAL));
-        $handler->expectAt(1, "b", array("bbb", LEXER_SPECIAL));
-        $handler->expectCallCount("a", 4);
-        $handler->expectCallCount("b", 2);
-        $lexer = new SimpleLexer($handler, "a");
-        $lexer->addPattern("a+", "a");
-        $lexer->addSpecialPattern("b+", "a", "b");
-        $this->assertTrue($lexer->parse("aabaaxxbbbxx"));
-    }
-
-    function testUnwindTooFar() {
-        $handler = new MockTestParser();
-        $handler->setReturnValue("a", true);
-        $handler->expectAt(0, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(1, "a", array(")", LEXER_EXIT));
-        $handler->expectCallCount("a", 2);
-        $lexer = new SimpleLexer($handler, "a");
-        $lexer->addPattern("a+", "a");
-        $lexer->addExitPattern(")", "a");
-        $this->assertFalse($lexer->parse("aa)aa"));
-    }
-}
-
-class TestOfLexerHandlers extends UnitTestCase {
-
-    function testModeMapping() {
-        $handler = new MockTestParser();
-        $handler->setReturnValue("a", true);
-        $handler->expectAt(0, "a", array("aa", LEXER_MATCHED));
-        $handler->expectAt(1, "a", array("(", LEXER_ENTER));
-        $handler->expectAt(2, "a", array("bb", LEXER_MATCHED));
-        $handler->expectAt(3, "a", array("a", LEXER_UNMATCHED));
-        $handler->expectAt(4, "a", array("bb", LEXER_MATCHED));
-        $handler->expectAt(5, "a", array(")", LEXER_EXIT));
-        $handler->expectAt(6, "a", array("b", LEXER_UNMATCHED));
-        $handler->expectCallCount("a", 7);
-        $lexer = new SimpleLexer($handler, "mode_a");
-        $lexer->addPattern("a+", "mode_a");
-        $lexer->addEntryPattern("(", "mode_a", "mode_b");
-        $lexer->addPattern("b+", "mode_b");
-        $lexer->addExitPattern(")", "mode_b");
-        $lexer->mapHandler("mode_a", "a");
-        $lexer->mapHandler("mode_b", "a");
-        $this->assertTrue($lexer->parse("aa(bbabb)b"));
-    }
-}
-
-class TestOfSimpleHtmlLexer extends UnitTestCase {
-
-    function &createParser() {
-        $parser = new MockSimpleHtmlSaxParser();
-        $parser->setReturnValue('acceptStartToken', true);
-        $parser->setReturnValue('acceptEndToken', true);
-        $parser->setReturnValue('acceptAttributeToken', true);
-        $parser->setReturnValue('acceptEntityToken', true);
-        $parser->setReturnValue('acceptTextToken', true);
-        $parser->setReturnValue('ignore', true);
-        return $parser;
-    }
-
-    function testNoContent() {
-        $parser = $this->createParser();
-        $parser->expectNever('acceptStartToken');
-        $parser->expectNever('acceptEndToken');
-        $parser->expectNever('acceptAttributeToken');
-        $parser->expectNever('acceptEntityToken');
-        $parser->expectNever('acceptTextToken');
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse(''));
-    }
-
-    function testUninteresting() {
-        $parser = $this->createParser();
-        $parser->expectOnce('acceptTextToken', array('<html></html>', '*'));
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse('<html></html>'));
-    }
-
-    function testSkipCss() {
-        $parser = $this->createParser();
-        $parser->expectNever('acceptTextToken');
-        $parser->expectAtLeastOnce('ignore');
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse("<style>Lot's of styles</style>"));
-    }
-
-    function testSkipJavaScript() {
-        $parser = $this->createParser();
-        $parser->expectNever('acceptTextToken');
-        $parser->expectAtLeastOnce('ignore');
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse("<SCRIPT>Javascript code {';:^%^%�$'@\"*(}</SCRIPT>"));
-    }
-
-    function testSkipHtmlComments() {
-        $parser = $this->createParser();
-        $parser->expectNever('acceptTextToken');
-        $parser->expectAtLeastOnce('ignore');
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse("<!-- <title>title</title><style>styles</style> -->"));
-    }
-
-    function testTagWithNoAttributes() {
-        $parser = $this->createParser();
-        $parser->expectAt(0, 'acceptStartToken', array('<title', '*'));
-        $parser->expectAt(1, 'acceptStartToken', array('>', '*'));
-        $parser->expectCallCount('acceptStartToken', 2);
-        $parser->expectOnce('acceptTextToken', array('Hello', '*'));
-        $parser->expectOnce('acceptEndToken', array('</title>', '*'));
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse('<title>Hello</title>'));
-    }
-
-    function testTagWithAttributes() {
-        $parser = $this->createParser();
-        $parser->expectOnce('acceptTextToken', array('label', '*'));
-        $parser->expectAt(0, 'acceptStartToken', array('<a', '*'));
-        $parser->expectAt(1, 'acceptStartToken', array('href', '*'));
-        $parser->expectAt(2, 'acceptStartToken', array('>', '*'));
-        $parser->expectCallCount('acceptStartToken', 3);
-        $parser->expectAt(0, 'acceptAttributeToken', array('= "', '*'));
-        $parser->expectAt(1, 'acceptAttributeToken', array('here.html', '*'));
-        $parser->expectAt(2, 'acceptAttributeToken', array('"', '*'));
-        $parser->expectCallCount('acceptAttributeToken', 3);
-        $parser->expectOnce('acceptEndToken', array('</a>', '*'));
-        $lexer = new SimpleHtmlLexer($parser);
-        $this->assertTrue($lexer->parse('<a href = "here.html">label</a>'));
-    }
-}
-
-class TestOfHtmlSaxParser extends UnitTestCase {
-
-    function createListener() {
-        $listener = new MockSimplePhpPageBuilder();
-        $listener->setReturnValue('startElement', true);
-        $listener->setReturnValue('addContent', true);
-        $listener->setReturnValue('endElement', true);
-        return $listener;
-    }
-
-    function testFramesetTag() {
-        $listener = $this->createListener();
-        $listener->expectOnce('startElement', array('frameset', array()));
-        $listener->expectOnce('addContent', array('Frames'));
-        $listener->expectOnce('endElement', array('frameset'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<frameset>Frames</frameset>'));
-    }
-
-    function testTagWithUnquotedAttributes() {
-        $listener = $this->createListener();
-        $listener->expectOnce(
-                'startElement',
-                array('input', array('name' => 'a.b.c', 'value' => 'd')));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<input name=a.b.c value = d>'));
-    }
-
-    function testTagInsideContent() {
-        $listener = $this->createListener();
-        $listener->expectOnce('startElement', array('a', array()));
-        $listener->expectAt(0, 'addContent', array('<html>'));
-        $listener->expectAt(1, 'addContent', array('</html>'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<html><a></a></html>'));
-    }
-
-    function testTagWithInternalContent() {
-        $listener = $this->createListener();
-        $listener->expectOnce('startElement', array('a', array()));
-        $listener->expectOnce('addContent', array('label'));
-        $listener->expectOnce('endElement', array('a'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<a>label</a>'));
-    }
-
-    function testLinkAddress() {
-        $listener = $this->createListener();
-        $listener->expectOnce('startElement', array('a', array('href' => 'here.html')));
-        $listener->expectOnce('addContent', array('label'));
-        $listener->expectOnce('endElement', array('a'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse("<a href = 'here.html'>label</a>"));
-    }
-
-    function testEncodedAttribute() {
-        $listener = $this->createListener();
-        $listener->expectOnce('startElement', array('a', array('href' => 'here&there.html')));
-        $listener->expectOnce('addContent', array('label'));
-        $listener->expectOnce('endElement', array('a'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse("<a href = 'here&amp;there.html'>label</a>"));
-    }
-
-    function testTagWithId() {
-        $listener = $this->createListener();
-        $listener->expectOnce('startElement', array('a', array('id' => '0')));
-        $listener->expectOnce('addContent', array('label'));
-        $listener->expectOnce('endElement', array('a'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<a id="0">label</a>'));
-    }
-
-    function testTagWithEmptyAttributes() {
-        $listener = $this->createListener();
-        $listener->expectOnce(
-                'startElement',
-                array('option', array('value' => '', 'selected' => '')));
-        $listener->expectOnce('addContent', array('label'));
-        $listener->expectOnce('endElement', array('option'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<option value="" selected>label</option>'));
-    }
-
-    function testComplexTagWithLotsOfCaseVariations() {
-        $listener = $this->createListener();
-        $listener->expectOnce(
-                'startElement',
-                array('a', array('href' => 'here.html', 'style' => "'cool'")));
-        $listener->expectOnce('addContent', array('label'));
-        $listener->expectOnce('endElement', array('a'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<A HREF = \'here.html\' Style="\'cool\'">label</A>'));
-    }
-
-    function testXhtmlSelfClosingTag() {
-        $listener = $this->createListener();
-        $listener->expectOnce(
-                'startElement',
-                array('input', array('type' => 'submit', 'name' => 'N', 'value' => 'V')));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse('<input type="submit" name="N" value="V" />'));
-    }
-
-    function testNestedFrameInFrameset() {
-        $listener = $this->createListener();
-        $listener->expectAt(0, 'startElement', array('frameset', array()));
-        $listener->expectAt(1, 'startElement', array('frame', array('src' => 'frame.html')));
-        $listener->expectCallCount('startElement', 2);
-        $listener->expectOnce('addContent', array('<noframes>Hello</noframes>'));
-        $listener->expectOnce('endElement', array('frameset'));
-        $parser = new SimpleHtmlSaxParser($listener);
-        $this->assertTrue($parser->parse(
-                '<frameset><frame src="frame.html"><noframes>Hello</noframes></frameset>'));
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/recorder_test.php b/3rdparty/simpletest/test/recorder_test.php
deleted file mode 100644
index fdae4c1cccce69cfbca77e650180310fb58a446d..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/recorder_test.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-// $Id: test.php 1500 2007-04-29 14:33:31Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../recorder.php');
-
-class TestOfRecorder extends UnitTestCase {
-    
-    function testContentOfRecorderWithOnePassAndOneFailure() {
-        $test = new TestSuite();
-        $test->addFile(dirname(__FILE__) . '/support/recorder_sample.php');
-        $recorder = new Recorder(new SimpleReporter());
-        $test->run($recorder);
-        $this->assertEqual(count($recorder->results), 2);
-        $this->assertIsA($recorder->results[0], 'SimpleResultOfPass');
-        $this->assertEqual('testTrueIsTrue', array_pop($recorder->results[0]->breadcrumb));
-        $this->assertPattern('/ at \[.*\Wrecorder_sample\.php line 7\]/', $recorder->results[0]->message);
-        $this->assertIsA($recorder->results[1], 'SimpleResultOfFail');
-        $this->assertEqual('testFalseIsTrue', array_pop($recorder->results[1]->breadcrumb));
-        $this->assertPattern("/Expected false, got \[Boolean: true\] at \[.*\Wrecorder_sample\.php line 11\]/",
-                             $recorder->results[1]->message);
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/reflection_php5_test.php b/3rdparty/simpletest/test/reflection_php5_test.php
deleted file mode 100644
index d9f46e6db78c886a543996b93543744b19ef6e1c..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/reflection_php5_test.php
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php
-// $Id: reflection_php5_test.php 1778 2008-04-21 16:13:08Z edwardzyang $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../reflection_php5.php');
-
-class AnyOldLeafClass {
-	function aMethod() { }
-}
-
-abstract class AnyOldClass {
-	function aMethod() { }
-}
-
-class AnyOldLeafClassWithAFinal {
-	final function aMethod() { }
-}
-
-interface AnyOldInterface {
-	function aMethod();
-}
-
-interface AnyOldArgumentInterface {
-	function aMethod(AnyOldInterface $argument);
-}
-
-interface AnyDescendentInterface extends AnyOldInterface {
-}
-
-class AnyOldImplementation implements AnyOldInterface {
-	function aMethod() { }
-	function extraMethod() { }
-}
-
-abstract class AnyAbstractImplementation implements AnyOldInterface {
-}
-
-abstract class AnotherOldAbstractClass {
-    protected abstract function aMethod(AnyOldInterface $argument);
-}
-
-class AnyOldSubclass extends AnyOldImplementation { }
-
-class AnyOldArgumentClass {
-	function aMethod($argument) { }
-}
-
-class AnyOldArgumentImplementation implements AnyOldArgumentInterface {
-	function aMethod(AnyOldInterface $argument) { }
-}
-
-class AnyOldTypeHintedClass implements AnyOldArgumentInterface {
-	function aMethod(AnyOldInterface $argument) { }
-}
-
-class AnyDescendentImplementation implements AnyDescendentInterface {
-	function aMethod() { }
-}
-
-class AnyOldOverloadedClass {
-	function __isset($key) { }
-	function __unset($key) { }
-}
-
-class AnyOldClassWithStaticMethods {
-	static function aStatic() { }
-	static function aStaticWithParameters($arg1, $arg2) { }
-}
-
-abstract class AnyOldAbstractClassWithAbstractMethods {
-    abstract function anAbstract();
-    abstract function anAbstractWithParameter($foo);
-    abstract function anAbstractWithMultipleParameters($foo, $bar);
-}
-
-class TestOfReflection extends UnitTestCase {
-
-	function testClassExistence() {
-		$reflection = new SimpleReflection('AnyOldLeafClass');
-		$this->assertTrue($reflection->classOrInterfaceExists());
-		$this->assertTrue($reflection->classOrInterfaceExistsSansAutoload());
-		$this->assertFalse($reflection->isAbstract());
-		$this->assertFalse($reflection->isInterface());
-	}
-
-	function testClassNonExistence() {
-		$reflection = new SimpleReflection('UnknownThing');
-		$this->assertFalse($reflection->classOrInterfaceExists());
-		$this->assertFalse($reflection->classOrInterfaceExistsSansAutoload());
-	}
-
-	function testDetectionOfAbstractClass() {
-		$reflection = new SimpleReflection('AnyOldClass');
-		$this->assertTrue($reflection->isAbstract());
-	}
-
-	function testDetectionOfFinalMethods() {
-		$reflection = new SimpleReflection('AnyOldClass');
-		$this->assertFalse($reflection->hasFinal());
-		$reflection = new SimpleReflection('AnyOldLeafClassWithAFinal');
-		$this->assertTrue($reflection->hasFinal());
-	}
-
-	function testFindingParentClass() {
-		$reflection = new SimpleReflection('AnyOldSubclass');
-		$this->assertEqual($reflection->getParent(), 'AnyOldImplementation');
-	}
-
-	function testInterfaceExistence() {
-		$reflection = new SimpleReflection('AnyOldInterface');
-		$this->assertTrue($reflection->classOrInterfaceExists());
-		$this->assertTrue($reflection->classOrInterfaceExistsSansAutoload());
-		$this->assertTrue($reflection->isInterface());
-	}
-
-	function testMethodsListFromClass() {
-		$reflection = new SimpleReflection('AnyOldClass');
-		$this->assertIdentical($reflection->getMethods(), array('aMethod'));
-	}
-
-	function testMethodsListFromInterface() {
-		$reflection = new SimpleReflection('AnyOldInterface');
-		$this->assertIdentical($reflection->getMethods(), array('aMethod'));
-		$this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod'));
-	}
-
-	function testMethodsComeFromDescendentInterfacesASWell() {
-		$reflection = new SimpleReflection('AnyDescendentInterface');
-		$this->assertIdentical($reflection->getMethods(), array('aMethod'));
-	}
-	
-	function testCanSeparateInterfaceMethodsFromOthers() {
-		$reflection = new SimpleReflection('AnyOldImplementation');
-		$this->assertIdentical($reflection->getMethods(), array('aMethod', 'extraMethod'));
-		$this->assertIdentical($reflection->getInterfaceMethods(), array('aMethod'));
-	}
-
-	function testMethodsComeFromDescendentInterfacesInAbstractClass() {
-		$reflection = new SimpleReflection('AnyAbstractImplementation');
-		$this->assertIdentical($reflection->getMethods(), array('aMethod'));
-	}
-
-	function testInterfaceHasOnlyItselfToImplement() {
-		$reflection = new SimpleReflection('AnyOldInterface');
-		$this->assertEqual(
-				$reflection->getInterfaces(),
-				array('AnyOldInterface'));
-	}
-
-	function testInterfacesListedForClass() {
-		$reflection = new SimpleReflection('AnyOldImplementation');
-		$this->assertEqual(
-				$reflection->getInterfaces(),
-				array('AnyOldInterface'));
-	}
-
-	function testInterfacesListedForSubclass() {
-		$reflection = new SimpleReflection('AnyOldSubclass');
-		$this->assertEqual(
-				$reflection->getInterfaces(),
-				array('AnyOldInterface'));
-	}
-
-	function testNoParameterCreationWhenNoInterface() {
-		$reflection = new SimpleReflection('AnyOldArgumentClass');
-		$function = $reflection->getSignature('aMethod');
-		if (version_compare(phpversion(), '5.0.2', '<=')) {
-			$this->assertEqual('function amethod($argument)', strtolower($function));
-		} else {
-			$this->assertEqual('function aMethod($argument)', $function);
-		}
-	}
-
-	function testParameterCreationWithoutTypeHinting() {
-		$reflection = new SimpleReflection('AnyOldArgumentImplementation');
-		$function = $reflection->getSignature('aMethod');
-		if (version_compare(phpversion(), '5.0.2', '<=')) {
-			$this->assertEqual('function amethod(AnyOldInterface $argument)', $function);
-		} else {
-			$this->assertEqual('function aMethod(AnyOldInterface $argument)', $function);
-		}
-	}
-
-	function testParameterCreationForTypeHinting() {
-		$reflection = new SimpleReflection('AnyOldTypeHintedClass');
-		$function = $reflection->getSignature('aMethod');
-		if (version_compare(phpversion(), '5.0.2', '<=')) {
-			$this->assertEqual('function amethod(AnyOldInterface $argument)', $function);
-		} else {
-			$this->assertEqual('function aMethod(AnyOldInterface $argument)', $function);
-		}
-	}
-
-	function testIssetFunctionSignature() {
-		$reflection = new SimpleReflection('AnyOldOverloadedClass');
-		$function = $reflection->getSignature('__isset');
-		$this->assertEqual('function __isset($key)', $function);
-	}
-	
-	function testUnsetFunctionSignature() {
-		$reflection = new SimpleReflection('AnyOldOverloadedClass');
-		$function = $reflection->getSignature('__unset');
-		$this->assertEqual('function __unset($key)', $function);
-	}
-
-	function testProperlyReflectsTheFinalInterfaceWhenObjectImplementsAnExtendedInterface() {
-		$reflection = new SimpleReflection('AnyDescendentImplementation');
-		$interfaces = $reflection->getInterfaces();
-		$this->assertEqual(1, count($interfaces));
-		$this->assertEqual('AnyDescendentInterface', array_shift($interfaces));
-	}
-	
-	function testCreatingSignatureForAbstractMethod() {
-	    $reflection = new SimpleReflection('AnotherOldAbstractClass');
-	    $this->assertEqual($reflection->getSignature('aMethod'), 'function aMethod(AnyOldInterface $argument)');
-	}
-	
-	function testCanProperlyGenerateStaticMethodSignatures() {
-		$reflection = new SimpleReflection('AnyOldClassWithStaticMethods');
-		$this->assertEqual('static function aStatic()', $reflection->getSignature('aStatic'));
-		$this->assertEqual(
-			'static function aStaticWithParameters($arg1, $arg2)',
-			$reflection->getSignature('aStaticWithParameters')
-		);
-	}
-}
-
-class TestOfReflectionWithTypeHints extends UnitTestCase {
-	function skip() {
-		$this->skipIf(version_compare(phpversion(), '5.1.0', '<'), 'Reflection with type hints only tested for PHP 5.1.0 and above');
-	}
-
-	function testParameterCreationForTypeHintingWithArray() {
-		eval('interface AnyOldArrayTypeHintedInterface {
-				  function amethod(array $argument);
-			  } 
-			  class AnyOldArrayTypeHintedClass implements AnyOldArrayTypeHintedInterface {
-				  function amethod(array $argument) {}
-			  }');
-		$reflection = new SimpleReflection('AnyOldArrayTypeHintedClass');
-		$function = $reflection->getSignature('amethod');
-		$this->assertEqual('function amethod(array $argument)', $function);
-	}
-}
-
-class TestOfAbstractsWithAbstractMethods extends UnitTestCase {
-    function testCanProperlyGenerateAbstractMethods() {
-        $reflection = new SimpleReflection('AnyOldAbstractClassWithAbstractMethods');
-        $this->assertEqual(
-            'function anAbstract()',
-            $reflection->getSignature('anAbstract')
-        );
-        $this->assertEqual(
-            'function anAbstractWithParameter($foo)',
-            $reflection->getSignature('anAbstractWithParameter')
-        );
-        $this->assertEqual(
-            'function anAbstractWithMultipleParameters($foo, $bar)',
-            $reflection->getSignature('anAbstractWithMultipleParameters')
-        );
-    }
-}
-
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/remote_test.php b/3rdparty/simpletest/test/remote_test.php
deleted file mode 100644
index 5f3f96a4de9e176056b238e0fba78fa10ce2a117..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/remote_test.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-// $Id: remote_test.php 1759 2008-04-15 02:37:07Z edwardzyang $
-require_once('../remote.php');
-require_once('../reporter.php');
-
-// The following URL will depend on your own installation.
-if (isset($_SERVER['SCRIPT_URI'])) {
-    $base_uri = $_SERVER['SCRIPT_URI'];
-} elseif (isset($_SERVER['HTTP_HOST']) && isset($_SERVER['PHP_SELF'])) {
-    $base_uri = 'http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
-};
-$test_url = str_replace('remote_test.php', 'visual_test.php', $base_uri);
-
-$test = new TestSuite('Remote tests');
-$test->add(new RemoteTestCase($test_url . '?xml=yes', $test_url . '?xml=yes&dry=yes'));
-if (SimpleReporter::inCli()) {
-    exit ($test->run(new TextReporter()) ? 0 : 1);
-}
-$test->run(new HtmlReporter());
diff --git a/3rdparty/simpletest/test/shell_test.php b/3rdparty/simpletest/test/shell_test.php
deleted file mode 100644
index d1d769a679598999afad5f9c9876b731bd785d83..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/shell_test.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-// $Id: shell_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../shell_tester.php');
-
-class TestOfShell extends UnitTestCase {
-    
-    function testEcho() {
-        $shell = new SimpleShell();
-        $this->assertIdentical($shell->execute('echo Hello'), 0);
-        $this->assertPattern('/Hello/', $shell->getOutput());
-    }
-    
-    function testBadCommand() {
-        $shell = new SimpleShell();
-        $this->assertNotEqual($ret = $shell->execute('blurgh! 2>&1'), 0);
-    }
-}
-
-class TestOfShellTesterAndShell extends ShellTestCase {
-    
-    function testEcho() {
-        $this->assertTrue($this->execute('echo Hello'));
-        $this->assertExitCode(0);
-        $this->assertoutput('Hello');
-    }
-    
-    function testFileExistence() {
-        $this->assertFileExists(dirname(__FILE__) . '/all_tests.php');
-        $this->assertFileNotExists('wibble');
-    }
-    
-    function testFilePatterns() {
-        $this->assertFilePattern('/all[_ ]tests/i', dirname(__FILE__) . '/all_tests.php');
-        $this->assertNoFilePattern('/sputnik/i', dirname(__FILE__) . '/all_tests.php');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/shell_tester_test.php b/3rdparty/simpletest/test/shell_tester_test.php
deleted file mode 100644
index b12c602a39fd23edbd190f3e84c9dd7c42b48ac1..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/shell_tester_test.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-// $Id: shell_tester_test.php 1787 2008-04-26 20:35:39Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../shell_tester.php');
-Mock::generate('SimpleShell');
-
-class TestOfShellTestCase extends ShellTestCase {
-    private $mock_shell = false;
-    
-    function getShell() {
-        return $this->mock_shell;
-    }
-    
-    function testGenericEquality() {
-        $this->assertEqual('a', 'a');
-        $this->assertNotEqual('a', 'A');
-    }
-    
-    function testExitCode() {
-        $this->mock_shell = new MockSimpleShell();
-        $this->mock_shell->setReturnValue('execute', 0);
-        $this->mock_shell->expectOnce('execute', array('ls'));
-        $this->assertTrue($this->execute('ls'));
-        $this->assertExitCode(0);
-    }
-    
-    function testOutput() {
-        $this->mock_shell = new MockSimpleShell();
-        $this->mock_shell->setReturnValue('execute', 0);
-        $this->mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n");
-        $this->assertOutput("Line 1\nLine 2\n");
-    }
-    
-    function testOutputPatterns() {
-        $this->mock_shell = new MockSimpleShell();
-        $this->mock_shell->setReturnValue('execute', 0);
-        $this->mock_shell->setReturnValue('getOutput', "Line 1\nLine 2\n");
-        $this->assertOutputPattern('/line/i');
-        $this->assertNoOutputPattern('/line 2/');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/simpletest_test.php b/3rdparty/simpletest/test/simpletest_test.php
deleted file mode 100644
index daa65c6f4726f707e274642ba5016248f7668f1e..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/simpletest_test.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-// $Id: simpletest_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../simpletest.php');
-
-SimpleTest::ignore('ShouldNeverBeRunEither');
-
-class ShouldNeverBeRun extends UnitTestCase {
-    function testWithNoChanceOfSuccess() {
-        $this->fail('Should be ignored');
-    }
-}
-
-class ShouldNeverBeRunEither extends ShouldNeverBeRun { }
-
-class TestOfStackTrace extends UnitTestCase {
-
-    function testCanFindAssertInTrace() {
-        $trace = new SimpleStackTrace(array('assert'));
-        $this->assertEqual(
-                $trace->traceMethod(array(array(
-                        'file' => '/my_test.php',
-                        'line' => 24,
-                        'function' => 'assertSomething'))),
-                ' at [/my_test.php line 24]');
-    }
-}
-
-class DummyResource { }
-
-class TestOfContext extends UnitTestCase {
-
-    function testCurrentContextIsUnique() {
-        $this->assertSame(
-                SimpleTest::getContext(),
-                SimpleTest::getContext());
-    }
-
-    function testContextHoldsCurrentTestCase() {
-        $context = SimpleTest::getContext();
-        $this->assertSame($this, $context->getTest());
-    }
-
-    function testResourceIsSingleInstanceWithContext() {
-        $context = new SimpleTestContext();
-        $this->assertSame(
-                $context->get('DummyResource'),
-                $context->get('DummyResource'));
-    }
-
-    function testClearingContextResetsResources() {
-        $context = new SimpleTestContext();
-        $resource = $context->get('DummyResource');
-        $context->clear();
-        $this->assertClone($resource, $context->get('DummyResource'));
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/site/file.html b/3rdparty/simpletest/test/site/file.html
deleted file mode 100644
index cc41aee1b8b638347b7ef84533b3714c44b12005..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/site/file.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-    <head><title>Link to SimpleTest</title></head>
-    <body>
-        <a href="http://simpletest.org/">Link to SimpleTest</a>
-    </body>
-</html>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/socket_test.php b/3rdparty/simpletest/test/socket_test.php
deleted file mode 100644
index 729adda4960d8e3e236bcaab3617348aa7321986..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/socket_test.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-// $Id: socket_test.php 1782 2008-04-25 17:09:06Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../socket.php');
-Mock::generate('SimpleSocket');
-
-class TestOfSimpleStickyError extends UnitTestCase {
-    
-    function testSettingError() {
-        $error = new SimpleStickyError();
-        $this->assertFalse($error->isError());
-        $error->setError('Ouch');
-        $this->assertTrue($error->isError());
-        $this->assertEqual($error->getError(), 'Ouch');
-    }
-    
-    function testClearingError() {
-        $error = new SimpleStickyError();
-        $error->setError('Ouch');
-        $this->assertTrue($error->isError());
-        $error->clearError();
-        $this->assertFalse($error->isError());
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/collector/collectable.1 b/3rdparty/simpletest/test/support/collector/collectable.1
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/3rdparty/simpletest/test/support/collector/collectable.2 b/3rdparty/simpletest/test/support/collector/collectable.2
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/3rdparty/simpletest/test/support/empty_test_file.php b/3rdparty/simpletest/test/support/empty_test_file.php
deleted file mode 100644
index 31e3f7bed620a0064bdbdb28716698e04dcdfe4f..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/empty_test_file.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../../autorun.php');
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/failing_test.php b/3rdparty/simpletest/test/support/failing_test.php
deleted file mode 100644
index 30f0d7507d9877d7804ff67c55391dfb880093c8..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/failing_test.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../../autorun.php');
-
-class FailingTest extends UnitTestCase {
-    function test_fail() {
-        $this->assertEqual(1,2);
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/latin1_sample b/3rdparty/simpletest/test/support/latin1_sample
deleted file mode 100644
index 190352577660774b2d23243f9a1169b16fb53ad9..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/latin1_sample
+++ /dev/null
@@ -1 +0,0 @@
-�������@�����櫻��
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/passing_test.php b/3rdparty/simpletest/test/support/passing_test.php
deleted file mode 100644
index b786321635357733a8356e9dd1911cb0a6d55d04..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/passing_test.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-require_once(dirname(__FILE__) . '/../../autorun.php');
-
-class PassingTest extends UnitTestCase {
-    function test_pass() {
-        $this->assertEqual(2,2);
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/recorder_sample.php b/3rdparty/simpletest/test/support/recorder_sample.php
deleted file mode 100644
index 4f157f6b601312e8a0afe2617e1c4ef75565e9b6..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/recorder_sample.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-// $Id: sample_test.php 1500 2007-04-29 14:33:31Z pp11 $
-require_once dirname(__FILE__) . '/../../autorun.php';
-
-class SampleTestForRecorder extends UnitTestCase {
-    function testTrueIsTrue() {
-        $this->assertTrue(true);
-    }
-
-    function testFalseIsTrue() {
-        $this->assertFalse(true);
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/spl_examples.php b/3rdparty/simpletest/test/support/spl_examples.php
deleted file mode 100644
index 45add356c445f3df47692b746a1cdd409446ff6d..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/spl_examples.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-    // $Id: spl_examples.php 1262 2006-02-05 19:35:31Z lastcraft $
-
-    class IteratorImplementation implements Iterator {
-        function current() { }
-        function next() { }
-        function key() { }
-        function valid() { }
-        function rewind() { }
-    }
-
-    class IteratorAggregateImplementation implements IteratorAggregate {
-        function getIterator() { }
-    }
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/supplementary_upload_sample.txt b/3rdparty/simpletest/test/support/supplementary_upload_sample.txt
deleted file mode 100644
index d8aa9e8101328e4d96244187a9a11a8f6d460478..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/supplementary_upload_sample.txt
+++ /dev/null
@@ -1 +0,0 @@
-Some more text content
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/support/test1.php b/3rdparty/simpletest/test/support/test1.php
deleted file mode 100644
index b414586d64212af6913d30eeadfec0f0d4817ad0..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/test1.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-class test1 extends UnitTestCase {
-	function test_pass(){
-		$this->assertEqual(3,1+2, "pass1");
-	}
-}
-?>
diff --git a/3rdparty/simpletest/test/support/upload_sample.txt b/3rdparty/simpletest/test/support/upload_sample.txt
deleted file mode 100644
index ec98d7c5e3fe88d9be026122fc63e089aa504f56..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/support/upload_sample.txt
+++ /dev/null
@@ -1 +0,0 @@
-Sample for testing file upload
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/tag_test.php b/3rdparty/simpletest/test/tag_test.php
deleted file mode 100644
index 5e8a377f089cf7d3a79c8fef811aa27cb560c0a5..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/tag_test.php
+++ /dev/null
@@ -1,554 +0,0 @@
-<?php
-// $Id: tag_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../tag.php');
-require_once(dirname(__FILE__) . '/../encoding.php');
-Mock::generate('SimpleMultipartEncoding');
-
-class TestOfTag extends UnitTestCase {
-    
-    function testStartValuesWithoutAdditionalContent() {
-        $tag = new SimpleTitleTag(array('a' => '1', 'b' => ''));
-        $this->assertEqual($tag->getTagName(), 'title');
-        $this->assertIdentical($tag->getAttribute('a'), '1');
-        $this->assertIdentical($tag->getAttribute('b'), '');
-        $this->assertIdentical($tag->getAttribute('c'), false);
-        $this->assertIdentical($tag->getContent(), '');
-    }
-    
-    function testTitleContent() {
-        $tag = new SimpleTitleTag(array());
-        $this->assertTrue($tag->expectEndTag());
-        $tag->addContent('Hello');
-        $tag->addContent('World');
-        $this->assertEqual($tag->getText(), 'HelloWorld');
-    }
-    
-    function testMessyTitleContent() {
-        $tag = new SimpleTitleTag(array());
-        $this->assertTrue($tag->expectEndTag());
-        $tag->addContent('<b>Hello</b>');
-        $tag->addContent('<em>World</em>');
-        $this->assertEqual($tag->getText(), 'HelloWorld');
-    }
-    
-    function testTagWithNoEnd() {
-        $tag = new SimpleTextTag(array());
-        $this->assertFalse($tag->expectEndTag());
-    }
-    
-    function testAnchorHref() {
-        $tag = new SimpleAnchorTag(array('href' => 'http://here/'));
-        $this->assertEqual($tag->getHref(), 'http://here/');
-        
-        $tag = new SimpleAnchorTag(array('href' => ''));
-        $this->assertIdentical($tag->getAttribute('href'), '');
-        $this->assertIdentical($tag->getHref(), '');
-        
-        $tag = new SimpleAnchorTag(array());
-        $this->assertIdentical($tag->getAttribute('href'), false);
-        $this->assertIdentical($tag->getHref(), '');
-    }
-    
-    function testIsIdMatchesIdAttribute() {
-        $tag = new SimpleAnchorTag(array('href' => 'http://here/', 'id' => 7));
-        $this->assertIdentical($tag->getAttribute('id'), '7');
-        $this->assertTrue($tag->isId(7));
-    }
-}
-
-class TestOfWidget extends UnitTestCase {
-    
-    function testTextEmptyDefault() {
-        $tag = new SimpleTextTag(array('type' => 'text'));
-        $this->assertIdentical($tag->getDefault(), '');
-        $this->assertIdentical($tag->getValue(), '');
-    }
-    
-    function testSettingOfExternalLabel() {
-        $tag = new SimpleTextTag(array('type' => 'text'));
-        $tag->setLabel('it');
-        $this->assertTrue($tag->isLabel('it'));
-    }
-    
-    function testTextDefault() {
-        $tag = new SimpleTextTag(array('value' => 'aaa'));
-        $this->assertEqual($tag->getDefault(), 'aaa');
-        $this->assertEqual($tag->getValue(), 'aaa');
-    }
-    
-    function testSettingTextValue() {
-        $tag = new SimpleTextTag(array('value' => 'aaa'));
-        $tag->setValue('bbb');
-        $this->assertEqual($tag->getValue(), 'bbb');
-        $tag->resetValue();
-        $this->assertEqual($tag->getValue(), 'aaa');
-    }
-    
-    function testFailToSetHiddenValue() {
-        $tag = new SimpleTextTag(array('value' => 'aaa', 'type' => 'hidden'));
-        $this->assertFalse($tag->setValue('bbb'));
-        $this->assertEqual($tag->getValue(), 'aaa');
-    }
-    
-    function testSubmitDefaults() {
-        $tag = new SimpleSubmitTag(array('type' => 'submit'));
-        $this->assertIdentical($tag->getName(), false);
-        $this->assertEqual($tag->getValue(), 'Submit');
-        $this->assertFalse($tag->setValue('Cannot set this'));
-        $this->assertEqual($tag->getValue(), 'Submit');
-        $this->assertEqual($tag->getLabel(), 'Submit');
-        
-        $encoding = new MockSimpleMultipartEncoding();
-        $encoding->expectNever('add');
-        $tag->write($encoding);
-    }
-    
-    function testPopulatedSubmit() {
-        $tag = new SimpleSubmitTag(
-                array('type' => 'submit', 'name' => 's', 'value' => 'Ok!'));
-        $this->assertEqual($tag->getName(), 's');
-        $this->assertEqual($tag->getValue(), 'Ok!');
-        $this->assertEqual($tag->getLabel(), 'Ok!');
-        
-        $encoding = new MockSimpleMultipartEncoding();
-        $encoding->expectOnce('add', array('s', 'Ok!'));
-        $tag->write($encoding);
-    }
-    
-    function testImageSubmit() {
-        $tag = new SimpleImageSubmitTag(
-                array('type' => 'image', 'name' => 's', 'alt' => 'Label'));
-        $this->assertEqual($tag->getName(), 's');
-        $this->assertEqual($tag->getLabel(), 'Label');
-        
-        $encoding = new MockSimpleMultipartEncoding();
-        $encoding->expectAt(0, 'add', array('s.x', 20));
-        $encoding->expectAt(1, 'add', array('s.y', 30));
-        $tag->write($encoding, 20, 30);
-    }
-    
-    function testImageSubmitTitlePreferredOverAltForLabel() {
-        $tag = new SimpleImageSubmitTag(
-                array('type' => 'image', 'name' => 's', 'alt' => 'Label', 'title' => 'Title'));
-        $this->assertEqual($tag->getLabel(), 'Title');
-    }
-    
-    function testButton() {
-        $tag = new SimpleButtonTag(
-                array('type' => 'submit', 'name' => 's', 'value' => 'do'));
-        $tag->addContent('I am a button');
-        $this->assertEqual($tag->getName(), 's');
-        $this->assertEqual($tag->getValue(), 'do');
-        $this->assertEqual($tag->getLabel(), 'I am a button');
-
-        $encoding = new MockSimpleMultipartEncoding();
-        $encoding->expectOnce('add', array('s', 'do'));
-        $tag->write($encoding);
-    }
-}
-
-class TestOfTextArea extends UnitTestCase {
-    
-    function testDefault() {
-        $tag = new SimpleTextAreaTag(array('name' => 'a'));
-        $tag->addContent('Some text');
-        $this->assertEqual($tag->getName(), 'a');
-        $this->assertEqual($tag->getDefault(), 'Some text');
-    }
-    
-    function testWrapping() {
-        $tag = new SimpleTextAreaTag(array('cols' => '10', 'wrap' => 'physical'));
-        $tag->addContent("Lot's of text that should be wrapped");
-        $this->assertEqual(
-                $tag->getDefault(),
-                "Lot's of\r\ntext that\r\nshould be\r\nwrapped");
-        $tag->setValue("New long text\r\nwith two lines");
-        $this->assertEqual(
-                $tag->getValue(),
-                "New long\r\ntext\r\nwith two\r\nlines");
-    }
-    
-    function testWrappingRemovesLeadingcariageReturn() {
-        $tag = new SimpleTextAreaTag(array('cols' => '20', 'wrap' => 'physical'));
-        $tag->addContent("\rStuff");
-        $this->assertEqual($tag->getDefault(), 'Stuff');
-        $tag->setValue("\nNew stuff\n");
-        $this->assertEqual($tag->getValue(), "New stuff\r\n");
-    }
-    
-    function testBreaksAreNewlineAndCarriageReturn() {
-        $tag = new SimpleTextAreaTag(array('cols' => '10'));
-        $tag->addContent("Some\nText\rwith\r\nbreaks");
-        $this->assertEqual($tag->getValue(), "Some\r\nText\r\nwith\r\nbreaks");
-    }
-}
-
-class TestOfCheckbox extends UnitTestCase {
-    
-    function testCanSetCheckboxToNamedValueWithBooleanTrue() {
-        $tag = new SimpleCheckboxTag(array('name' => 'a', 'value' => 'A'));
-        $this->assertEqual($tag->getValue(), false);
-        $tag->setValue(true);
-        $this->assertIdentical($tag->getValue(), 'A');
-    }
-}
-
-class TestOfSelection extends UnitTestCase {
-    
-    function testEmpty() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $this->assertIdentical($tag->getValue(), '');
-    }
-    
-    function testSingle() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $option = new SimpleOptionTag(array());
-        $option->addContent('AAA');
-        $tag->addTag($option);
-        $this->assertEqual($tag->getValue(), 'AAA');
-    }
-    
-    function testSingleDefault() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $option = new SimpleOptionTag(array('selected' => ''));
-        $option->addContent('AAA');
-        $tag->addTag($option);
-        $this->assertEqual($tag->getValue(), 'AAA');
-    }
-    
-    function testSingleMappedDefault() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $option = new SimpleOptionTag(array('selected' => '', 'value' => 'aaa'));
-        $option->addContent('AAA');
-        $tag->addTag($option);
-        $this->assertEqual($tag->getValue(), 'aaa');
-    }
-    
-    function testStartsWithDefault() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $a = new SimpleOptionTag(array());
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('selected' => ''));
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $c = new SimpleOptionTag(array());
-        $c->addContent('CCC');
-        $tag->addTag($c);
-        $this->assertEqual($tag->getValue(), 'BBB');
-    }
-    
-    function testSettingOption() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $a = new SimpleOptionTag(array());
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('selected' => ''));
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $c = new SimpleOptionTag(array());
-        $c->addContent('CCC');
-        $tag->setValue('AAA');
-        $this->assertEqual($tag->getValue(), 'AAA');
-    }
-    
-    function testSettingMappedOption() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $a = new SimpleOptionTag(array('value' => 'aaa'));
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('value' => 'bbb', 'selected' => ''));
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $c = new SimpleOptionTag(array('value' => 'ccc'));
-        $c->addContent('CCC');
-        $tag->addTag($c);
-        $tag->setValue('AAA');
-        $this->assertEqual($tag->getValue(), 'aaa');
-        $tag->setValue('ccc');
-        $this->assertEqual($tag->getValue(), 'ccc');
-    }
-    
-    function testSelectionDespiteSpuriousWhitespace() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $a = new SimpleOptionTag(array());
-        $a->addContent(' AAA ');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('selected' => ''));
-        $b->addContent(' BBB ');
-        $tag->addTag($b);
-        $c = new SimpleOptionTag(array());
-        $c->addContent(' CCC ');
-        $tag->addTag($c);
-        $this->assertEqual($tag->getValue(), ' BBB ');
-        $tag->setValue('AAA');
-        $this->assertEqual($tag->getValue(), ' AAA ');
-    }
-    
-    function testFailToSetIllegalOption() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $a = new SimpleOptionTag(array());
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('selected' => ''));
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $c = new SimpleOptionTag(array());
-        $c->addContent('CCC');
-        $tag->addTag($c);
-        $this->assertFalse($tag->setValue('Not present'));
-        $this->assertEqual($tag->getValue(), 'BBB');
-    }
-    
-    function testNastyOptionValuesThatLookLikeFalse() {
-        $tag = new SimpleSelectionTag(array('name' => 'a'));
-        $a = new SimpleOptionTag(array('value' => '1'));
-        $a->addContent('One');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('value' => '0'));
-        $b->addContent('Zero');
-        $tag->addTag($b);
-        $this->assertIdentical($tag->getValue(), '1');
-        $tag->setValue('Zero');
-        $this->assertIdentical($tag->getValue(), '0');
-    }
-    
-    function testBlankOption() {
-        $tag = new SimpleSelectionTag(array('name' => 'A'));
-        $a = new SimpleOptionTag(array());
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array());
-        $b->addContent('b');
-        $tag->addTag($b);
-        $this->assertIdentical($tag->getValue(), '');
-        $tag->setValue('b');
-        $this->assertIdentical($tag->getValue(), 'b');
-        $tag->setValue('');
-        $this->assertIdentical($tag->getValue(), '');
-    }
-    
-    function testMultipleDefaultWithNoSelections() {
-        $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
-        $a = new SimpleOptionTag(array());
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array());
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $this->assertIdentical($tag->getDefault(), array());
-        $this->assertIdentical($tag->getValue(), array());
-    }
-    
-    function testMultipleDefaultWithSelections() {
-        $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
-        $a = new SimpleOptionTag(array('selected' => ''));
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array('selected' => ''));
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $this->assertIdentical($tag->getDefault(), array('AAA', 'BBB'));
-        $this->assertIdentical($tag->getValue(), array('AAA', 'BBB'));
-    }
-    
-    function testSettingMultiple() {
-        $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
-        $a = new SimpleOptionTag(array('selected' => ''));
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array());
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $c = new SimpleOptionTag(array('selected' => '', 'value' => 'ccc'));
-        $c->addContent('CCC');
-        $tag->addTag($c);
-        $this->assertIdentical($tag->getDefault(), array('AAA', 'ccc'));
-        $this->assertTrue($tag->setValue(array('BBB', 'ccc')));
-        $this->assertIdentical($tag->getValue(), array('BBB', 'ccc'));
-        $this->assertTrue($tag->setValue(array()));
-        $this->assertIdentical($tag->getValue(), array());
-    }
-    
-    function testFailToSetIllegalOptionsInMultiple() {
-        $tag = new MultipleSelectionTag(array('name' => 'a', 'multiple' => ''));
-        $a = new SimpleOptionTag(array('selected' => ''));
-        $a->addContent('AAA');
-        $tag->addTag($a);
-        $b = new SimpleOptionTag(array());
-        $b->addContent('BBB');
-        $tag->addTag($b);
-        $this->assertFalse($tag->setValue(array('CCC')));
-        $this->assertTrue($tag->setValue(array('AAA', 'BBB')));
-        $this->assertFalse($tag->setValue(array('AAA', 'CCC')));
-    }
-}
-
-class TestOfRadioGroup extends UnitTestCase {
-    
-    function testEmptyGroup() {
-        $group = new SimpleRadioGroup();
-        $this->assertIdentical($group->getDefault(), false);
-        $this->assertIdentical($group->getValue(), false);
-        $this->assertFalse($group->setValue('a'));
-    }
-    
-    function testReadingSingleButtonGroup() {
-        $group = new SimpleRadioGroup();
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'A', 'checked' => '')));
-        $this->assertIdentical($group->getDefault(), 'A');
-        $this->assertIdentical($group->getValue(), 'A');
-    }
-    
-    function testReadingMultipleButtonGroup() {
-        $group = new SimpleRadioGroup();
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'A')));
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'B', 'checked' => '')));
-        $this->assertIdentical($group->getDefault(), 'B');
-        $this->assertIdentical($group->getValue(), 'B');
-    }
-    
-    function testFailToSetUnlistedValue() {
-        $group = new SimpleRadioGroup();
-        $group->addWidget(new SimpleRadioButtonTag(array('value' => 'z')));
-        $this->assertFalse($group->setValue('a'));
-        $this->assertIdentical($group->getValue(), false);
-    }
-    
-    function testSettingNewValueClearsTheOldOne() {
-        $group = new SimpleRadioGroup();
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'A')));
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'B', 'checked' => '')));
-        $this->assertTrue($group->setValue('A'));
-        $this->assertIdentical($group->getValue(), 'A');
-    }
-    
-    function testIsIdMatchesAnyWidgetInSet() {
-        $group = new SimpleRadioGroup();
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'A', 'id' => 'i1')));
-        $group->addWidget(new SimpleRadioButtonTag(
-                array('value' => 'B', 'id' => 'i2')));
-        $this->assertFalse($group->isId('i0'));
-        $this->assertTrue($group->isId('i1'));
-        $this->assertTrue($group->isId('i2'));
-    }
-    
-    function testIsLabelMatchesAnyWidgetInSet() {
-        $group = new SimpleRadioGroup();
-        $button1 = new SimpleRadioButtonTag(array('value' => 'A'));
-        $button1->setLabel('one');
-        $group->addWidget($button1);
-        $button2 = new SimpleRadioButtonTag(array('value' => 'B'));
-        $button2->setLabel('two');
-        $group->addWidget($button2);
-        $this->assertFalse($group->isLabel('three'));
-        $this->assertTrue($group->isLabel('one'));
-        $this->assertTrue($group->isLabel('two'));
-    }
-}
-
-class TestOfTagGroup extends UnitTestCase {
-    
-    function testReadingMultipleCheckboxGroup() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
-        $group->addWidget(new SimpleCheckboxTag(
-                array('value' => 'B', 'checked' => '')));
-        $this->assertIdentical($group->getDefault(), 'B');
-        $this->assertIdentical($group->getValue(), 'B');
-    }
-    
-    function testReadingMultipleUncheckedItems() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));            
-        $this->assertIdentical($group->getDefault(), false);
-        $this->assertIdentical($group->getValue(), false);
-    }
-    
-    function testReadingMultipleCheckedItems() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(
-                array('value' => 'A', 'checked' => '')));
-        $group->addWidget(new SimpleCheckboxTag(
-                array('value' => 'B', 'checked' => '')));
-        $this->assertIdentical($group->getDefault(), array('A', 'B'));
-        $this->assertIdentical($group->getValue(), array('A', 'B'));
-    }
-    
-    function testSettingSingleValue() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
-        $this->assertTrue($group->setValue('A'));
-        $this->assertIdentical($group->getValue(), 'A');
-        $this->assertTrue($group->setValue('B'));
-        $this->assertIdentical($group->getValue(), 'B');
-    }
-    
-    function testSettingMultipleValues() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
-        $this->assertTrue($group->setValue(array('A', 'B')));
-        $this->assertIdentical($group->getValue(), array('A', 'B'));
-    }
-    
-    function testSettingNoValue() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'A')));
-        $group->addWidget(new SimpleCheckboxTag(array('value' => 'B')));
-        $this->assertTrue($group->setValue(false));
-        $this->assertIdentical($group->getValue(), false);
-    }
-    
-    function testIsIdMatchesAnyIdInSet() {
-        $group = new SimpleCheckboxGroup();
-        $group->addWidget(new SimpleCheckboxTag(array('id' => 1, 'value' => 'A')));
-        $group->addWidget(new SimpleCheckboxTag(array('id' => 2, 'value' => 'B')));
-        $this->assertFalse($group->isId(0));
-        $this->assertTrue($group->isId(1));
-        $this->assertTrue($group->isId(2));
-    }
-}
-
-class TestOfUploadWidget extends UnitTestCase {
-    
-    function testValueIsFilePath() {
-        $upload = new SimpleUploadTag(array('name' => 'a'));
-        $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt');
-        $this->assertEqual($upload->getValue(), dirname(__FILE__) . '/support/upload_sample.txt');
-    }
-    
-    function testSubmitsFileContents() {
-        $encoding = new MockSimpleMultipartEncoding();
-        $encoding->expectOnce('attach', array(
-                'a',
-                'Sample for testing file upload',
-                'upload_sample.txt'));
-        $upload = new SimpleUploadTag(array('name' => 'a'));
-        $upload->setValue(dirname(__FILE__) . '/support/upload_sample.txt');
-        $upload->write($encoding);
-    }
-}
-
-class TestOfLabelTag extends UnitTestCase {
-    
-    function testLabelShouldHaveAnEndTag() {
-        $label = new SimpleLabelTag(array());
-        $this->assertTrue($label->expectEndTag());
-    }
-    
-    function testContentIsTextOnly() {
-        $label = new SimpleLabelTag(array());
-        $label->addContent('Here <tag>are</tag> words');
-        $this->assertEqual($label->getText(), 'Here are words');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/test_with_parse_error.php b/3rdparty/simpletest/test/test_with_parse_error.php
deleted file mode 100644
index 41a5832a5cb9fe5e8589115921527f73b4298a0d..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/test_with_parse_error.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-    // $Id: test_with_parse_error.php 901 2005-01-24 00:32:14Z lastcraft $
-    
-    class TestCaseWithParseError extends UnitTestCase {
-        wibble
-    }
-    
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/unit_tester_test.php b/3rdparty/simpletest/test/unit_tester_test.php
deleted file mode 100644
index ce9850f09abd2ae28d0a8e95a67bbe0573e65942..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/unit_tester_test.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-// $Id: unit_tester_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-
-class ReferenceForTesting {
-}
-
-class TestOfUnitTester extends UnitTestCase {
-    
-    function testAssertTrueReturnsAssertionAsBoolean() {
-        $this->assertTrue($this->assertTrue(true));
-    }
-    
-    function testAssertFalseReturnsAssertionAsBoolean() {
-        $this->assertTrue($this->assertFalse(false));
-    }
-    
-    function testAssertEqualReturnsAssertionAsBoolean() {
-        $this->assertTrue($this->assertEqual(5, 5));
-    }
-    
-    function testAssertIdenticalReturnsAssertionAsBoolean() {
-        $this->assertTrue($this->assertIdentical(5, 5));
-    }
-    
-    function testCoreAssertionsDoNotThrowErrors() {
-        $this->assertIsA($this, 'UnitTestCase');
-        $this->assertNotA($this, 'WebTestCase');
-    }
-    
-    function testReferenceAssertionOnObjects() {
-        $a = new ReferenceForTesting();
-        $b = $a;
-        $this->assertSame($a, $b);
-    }
-    
-    function testReferenceAssertionOnScalars() {
-        $a = 25;
-        $b = &$a;
-        $this->assertReference($a, $b);
-    }
-    
-    function testCloneOnObjects() {
-        $a = new ReferenceForTesting();
-        $b = new ReferenceForTesting();
-        $this->assertClone($a, $b);
-    }
-
-    function TODO_testCloneOnScalars() {
-        $a = 25;
-        $b = 25;
-        $this->assertClone($a, $b);
-    }
-
-    function testCopyOnScalars() {
-        $a = 25;
-        $b = 25;
-        $this->assertCopy($a, $b);
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/unit_tests.php b/3rdparty/simpletest/test/unit_tests.php
deleted file mode 100644
index 9e621293f9e1640e0006c765c4ff0c2709aa7536..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/unit_tests.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-// $Id: unit_tests.php 1986 2010-04-02 10:02:42Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../unit_tester.php');
-require_once(dirname(__FILE__) . '/../shell_tester.php');
-require_once(dirname(__FILE__) . '/../mock_objects.php');
-require_once(dirname(__FILE__) . '/../web_tester.php');
-require_once(dirname(__FILE__) . '/../extensions/pear_test_case.php');
-
-class UnitTests extends TestSuite {
-    function UnitTests() {
-        $this->TestSuite('Unit tests');
-        $path = dirname(__FILE__);
-        $this->addFile($path . '/errors_test.php');
-        $this->addFile($path . '/exceptions_test.php');
-        $this->addFile($path . '/arguments_test.php');
-        $this->addFile($path . '/autorun_test.php');
-        $this->addFile($path . '/compatibility_test.php');
-        $this->addFile($path . '/simpletest_test.php');
-        $this->addFile($path . '/dumper_test.php');
-        $this->addFile($path . '/expectation_test.php');
-        $this->addFile($path . '/unit_tester_test.php');
-        $this->addFile($path . '/reflection_php5_test.php');
-        $this->addFile($path . '/mock_objects_test.php');
-        $this->addFile($path . '/interfaces_test.php');
-        $this->addFile($path . '/collector_test.php');
-        $this->addFile($path . '/recorder_test.php');
-        $this->addFile($path . '/adapter_test.php');
-        $this->addFile($path . '/socket_test.php');
-        $this->addFile($path . '/encoding_test.php');
-        $this->addFile($path . '/url_test.php');
-        $this->addFile($path . '/cookies_test.php');
-        $this->addFile($path . '/http_test.php');
-        $this->addFile($path . '/authentication_test.php');
-        $this->addFile($path . '/user_agent_test.php');
-        $this->addFile($path . '/php_parser_test.php');
-        $this->addFile($path . '/parsing_test.php');
-        $this->addFile($path . '/tag_test.php');
-        $this->addFile($path . '/form_test.php');
-        $this->addFile($path . '/page_test.php');
-        $this->addFile($path . '/frames_test.php');
-        $this->addFile($path . '/browser_test.php');
-        $this->addFile($path . '/web_tester_test.php');
-        $this->addFile($path . '/shell_tester_test.php');
-        $this->addFile($path . '/xml_test.php');
-        $this->addFile($path . '/../extensions/testdox/test.php');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/url_test.php b/3rdparty/simpletest/test/url_test.php
deleted file mode 100644
index 80119afbdde88d7aa78fa654f9c5dc0d7b0e7513..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/url_test.php
+++ /dev/null
@@ -1,515 +0,0 @@
-<?php
-// $Id: url_test.php 1998 2010-07-27 09:55:55Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../url.php');
-
-class TestOfUrl extends UnitTestCase {
-    
-    function testDefaultUrl() {
-        $url = new SimpleUrl('');
-        $this->assertEqual($url->getScheme(), '');
-        $this->assertEqual($url->getHost(), '');
-        $this->assertEqual($url->getScheme('http'), 'http');
-        $this->assertEqual($url->getHost('localhost'), 'localhost');
-        $this->assertEqual($url->getPath(), '');
-    }
-    
-    function testBasicParsing() {
-        $url = new SimpleUrl('https://www.lastcraft.com/test/');
-        $this->assertEqual($url->getScheme(), 'https');
-        $this->assertEqual($url->getHost(), 'www.lastcraft.com');
-        $this->assertEqual($url->getPath(), '/test/');
-    }
-    
-    function testRelativeUrls() {
-        $url = new SimpleUrl('../somewhere.php');
-        $this->assertEqual($url->getScheme(), false);
-        $this->assertEqual($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '../somewhere.php');
-    }
-    
-    function testParseBareParameter() {
-        $url = new SimpleUrl('?a');
-        $this->assertEqual($url->getPath(), '');
-        $this->assertEqual($url->getEncodedRequest(), '?a');
-        $url->addRequestParameter('x', 'X');
-        $this->assertEqual($url->getEncodedRequest(), '?a=&x=X');
-    }
-    
-    function testParseEmptyParameter() {
-        $url = new SimpleUrl('?a=');
-        $this->assertEqual($url->getPath(), '');
-        $this->assertEqual($url->getEncodedRequest(), '?a=');
-        $url->addRequestParameter('x', 'X');
-        $this->assertEqual($url->getEncodedRequest(), '?a=&x=X');
-    }
-    
-    function testParseParameterPair() {
-        $url = new SimpleUrl('?a=A');
-        $this->assertEqual($url->getPath(), '');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A');
-        $url->addRequestParameter('x', 'X');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&x=X');
-    }
-    
-    function testParseMultipleParameters() {
-        $url = new SimpleUrl('?a=A&b=B');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B');
-        $url->addRequestParameter('x', 'X');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&x=X');
-    }
-    
-    function testParsingParameterMixture() {
-        $url = new SimpleUrl('?a=A&b=&c');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c');
-        $url->addRequestParameter('x', 'X');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c=&x=X');
-    }
-    
-    function testAddParametersFromScratch() {
-        $url = new SimpleUrl('');
-        $url->addRequestParameter('a', 'A');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A');
-        $url->addRequestParameter('b', 'B');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B');
-        $url->addRequestParameter('a', 'aaa');
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=B&a=aaa');
-    }
-    
-    function testClearingParameters() {
-        $url = new SimpleUrl('');
-        $url->addRequestParameter('a', 'A');
-        $url->clearRequest();
-        $this->assertIdentical($url->getEncodedRequest(), '');
-    }
-    
-    function testEncodingParameters() {
-        $url = new SimpleUrl('');
-        $url->addRequestParameter('a', '?!"\'#~@[]{}:;<>,./|$%^&*()_+-=');
-        $this->assertIdentical(
-                $request = $url->getEncodedRequest(),
-                '?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%24%25%5E%26%2A%28%29_%2B-%3D');
-    }
-    
-    function testDecodingParameters() {            
-        $url = new SimpleUrl('?a=%3F%21%22%27%23%7E%40%5B%5D%7B%7D%3A%3B%3C%3E%2C.%2F%7C%24%25%5E%26%2A%28%29_%2B-%3D');
-        $this->assertEqual(
-                $url->getEncodedRequest(),
-                '?a=' . urlencode('?!"\'#~@[]{}:;<>,./|$%^&*()_+-='));
-    }
-    
-    function testUrlInQueryDoesNotConfuseParsing() {
-        $url = new SimpleUrl('wibble/login.php?url=http://www.google.com/moo/');
-        $this->assertFalse($url->getScheme());
-        $this->assertFalse($url->getHost());
-        $this->assertEqual($url->getPath(), 'wibble/login.php');
-        $this->assertEqual($url->getEncodedRequest(), '?url=http://www.google.com/moo/');
-    }
-    
-    function testSettingCordinates() {
-        $url = new SimpleUrl('');
-        $url->setCoordinates('32', '45');
-        $this->assertIdentical($url->getX(), 32);
-        $this->assertIdentical($url->getY(), 45);
-        $this->assertEqual($url->getEncodedRequest(), '');
-    }
-    
-    function testParseCordinates() {
-        $url = new SimpleUrl('?32,45');
-        $this->assertIdentical($url->getX(), 32);
-        $this->assertIdentical($url->getY(), 45);
-    }
-    
-    function testClearingCordinates() {
-        $url = new SimpleUrl('?32,45');
-        $url->setCoordinates();
-        $this->assertIdentical($url->getX(), false);
-        $this->assertIdentical($url->getY(), false);
-    }
-    
-    function testParsingParameterCordinateMixture() {
-        $url = new SimpleUrl('?a=A&b=&c?32,45');
-        $this->assertIdentical($url->getX(), 32);
-        $this->assertIdentical($url->getY(), 45);
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c');
-    }
-    
-    function testParsingParameterWithBadCordinates() {
-        $url = new SimpleUrl('?a=A&b=&c?32');
-        $this->assertIdentical($url->getX(), false);
-        $this->assertIdentical($url->getY(), false);
-        $this->assertEqual($url->getEncodedRequest(), '?a=A&b=&c?32');
-    }
-    
-    function testPageSplitting() {
-        $url = new SimpleUrl('./here/../there/somewhere.php');
-        $this->assertEqual($url->getPath(), './here/../there/somewhere.php');
-        $this->assertEqual($url->getPage(), 'somewhere.php');
-        $this->assertEqual($url->getBasePath(), './here/../there/');
-    }
-    
-    function testAbsolutePathPageSplitting() {
-        $url = new SimpleUrl("http://host.com/here/there/somewhere.php");
-        $this->assertEqual($url->getPath(), "/here/there/somewhere.php");
-        $this->assertEqual($url->getPage(), "somewhere.php");
-        $this->assertEqual($url->getBasePath(), "/here/there/");
-    }
-    
-    function testSplittingUrlWithNoPageGivesEmptyPage() {
-        $url = new SimpleUrl('/here/there/');
-        $this->assertEqual($url->getPath(), '/here/there/');
-        $this->assertEqual($url->getPage(), '');
-        $this->assertEqual($url->getBasePath(), '/here/there/');
-    }
-    
-    function testPathNormalisation() {
-        $url = new SimpleUrl();
-        $this->assertEqual(
-                $url->normalisePath('https://host.com/I/am/here/../there/somewhere.php'),
-                'https://host.com/I/am/there/somewhere.php');
-    }
-
-    // regression test for #1535407
-    function testPathNormalisationWithSinglePeriod() {
-        $url = new SimpleUrl();
-        $this->assertEqual(
-            $url->normalisePath('https://host.com/I/am/here/./../there/somewhere.php'),
-            'https://host.com/I/am/there/somewhere.php');
-    }
-    
-    // regression test for #1852413
-    function testHostnameExtractedFromUContainingAtSign() {
-        $url = new SimpleUrl("http://localhost/name@example.com");
-        $this->assertEqual($url->getScheme(), "http");
-        $this->assertEqual($url->getUsername(), "");
-        $this->assertEqual($url->getPassword(), "");
-        $this->assertEqual($url->getHost(), "localhost");
-        $this->assertEqual($url->getPath(), "/name@example.com");
-    }
-
-    function testHostnameInLocalhost() {
-        $url = new SimpleUrl("http://localhost/name/example.com");
-        $this->assertEqual($url->getScheme(), "http");
-        $this->assertEqual($url->getUsername(), "");
-        $this->assertEqual($url->getPassword(), "");
-        $this->assertEqual($url->getHost(), "localhost");
-        $this->assertEqual($url->getPath(), "/name/example.com");
-    }
-
-    function testUsernameAndPasswordAreUrlDecoded() {
-        $url = new SimpleUrl('http://' . urlencode('test@test') .
-                ':' . urlencode('$!�@*&%') . '@www.lastcraft.com');
-        $this->assertEqual($url->getUsername(), 'test@test');
-        $this->assertEqual($url->getPassword(), '$!�@*&%');
-    }
-    
-    function testBlitz() {
-        $this->assertUrl(
-                "https://username:password@www.somewhere.com:243/this/that/here.php?a=1&b=2#anchor",
-                array("https", "username", "password", "www.somewhere.com", 243, "/this/that/here.php", "com", "?a=1&b=2", "anchor"),
-                array("a" => "1", "b" => "2"));
-        $this->assertUrl(
-                "username:password@www.somewhere.com/this/that/here.php?a=1",
-                array(false, "username", "password", "www.somewhere.com", false, "/this/that/here.php", "com", "?a=1", false),
-                array("a" => "1"));
-        $this->assertUrl(
-                "username:password@somewhere.com:243?1,2",
-                array(false, "username", "password", "somewhere.com", 243, "/", "com", "", false),
-                array(),
-                array(1, 2));
-        $this->assertUrl(
-                "https://www.somewhere.com",
-                array("https", false, false, "www.somewhere.com", false, "/", "com", "", false));
-        $this->assertUrl(
-                "username@www.somewhere.com:243#anchor",
-                array(false, "username", false, "www.somewhere.com", 243, "/", "com", "", "anchor"));
-        $this->assertUrl(
-                "/this/that/here.php?a=1&b=2?3,4",
-                array(false, false, false, false, false, "/this/that/here.php", false, "?a=1&b=2", false),
-                array("a" => "1", "b" => "2"),
-                array(3, 4));
-        $this->assertUrl(
-                "username@/here.php?a=1&b=2",
-                array(false, "username", false, false, false, "/here.php", false, "?a=1&b=2", false),
-                array("a" => "1", "b" => "2"));
-    }
-    
-    function testAmbiguousHosts() {
-        $this->assertUrl(
-                "tigger",
-                array(false, false, false, false, false, "tigger", false, "", false));
-        $this->assertUrl(
-                "/tigger",
-                array(false, false, false, false, false, "/tigger", false, "", false));
-        $this->assertUrl(
-                "//tigger",
-                array(false, false, false, "tigger", false, "/", false, "", false));
-        $this->assertUrl(
-                "//tigger/",
-                array(false, false, false, "tigger", false, "/", false, "", false));
-        $this->assertUrl(
-                "tigger.com",
-                array(false, false, false, "tigger.com", false, "/", "com", "", false));
-        $this->assertUrl(
-                "me.net/tigger",
-                array(false, false, false, "me.net", false, "/tigger", "net", "", false));
-    }
-    
-    function testAsString() {
-        $this->assertPreserved('https://www.here.com');
-        $this->assertPreserved('http://me:secret@www.here.com');
-        $this->assertPreserved('http://here/there');
-        $this->assertPreserved('http://here/there?a=A&b=B');
-        $this->assertPreserved('http://here/there?a=1&a=2');
-        $this->assertPreserved('http://here/there?a=1&a=2?9,8');
-        $this->assertPreserved('http://host?a=1&a=2');
-        $this->assertPreserved('http://host#stuff');
-        $this->assertPreserved('http://me:secret@www.here.com/a/b/c/here.html?a=A?7,6');
-        $this->assertPreserved('http://www.here.com/?a=A__b=B');
-        $this->assertPreserved('http://www.example.com:8080/');
-    }
-    
-    function testUrlWithTwoSlashesInPath() {
-        $url = new SimpleUrl('/article/categoryedit/insert//');
-        $this->assertEqual($url->getPath(), '/article/categoryedit/insert//');
-    }
-    
-    function testUrlWithRequestKeyEncoded() {
-        $url = new SimpleUrl('/?foo%5B1%5D=bar');
-        $this->assertEqual($url->getEncodedRequest(), '?foo%5B1%5D=bar');
-        $url->addRequestParameter('a[1]', 'b[]');
-        $this->assertEqual($url->getEncodedRequest(), '?foo%5B1%5D=bar&a%5B1%5D=b%5B%5D');
-
-        $url = new SimpleUrl('/');
-        $url->addRequestParameter('a[1]', 'b[]');
-        $this->assertEqual($url->getEncodedRequest(), '?a%5B1%5D=b%5B%5D');
-    }
-
-    function testUrlWithRequestKeyEncodedAndParamNamLookingLikePair() {
-        $url = new SimpleUrl('/');
-        $url->addRequestParameter('foo[]=bar', '');
-        $this->assertEqual($url->getEncodedRequest(), '?foo%5B%5D%3Dbar=');
-        $url = new SimpleUrl('/?foo%5B%5D%3Dbar=');
-        $this->assertEqual($url->getEncodedRequest(), '?foo%5B%5D%3Dbar=');
-    }
-
-    function assertUrl($raw, $parts, $params = false, $coords = false) {
-        if (! is_array($params)) {
-            $params = array();
-        }
-        $url = new SimpleUrl($raw);
-        $this->assertIdentical($url->getScheme(), $parts[0], "[$raw] scheme -> %s");
-        $this->assertIdentical($url->getUsername(), $parts[1], "[$raw] username -> %s");
-        $this->assertIdentical($url->getPassword(), $parts[2], "[$raw] password -> %s");
-        $this->assertIdentical($url->getHost(), $parts[3], "[$raw] host -> %s");
-        $this->assertIdentical($url->getPort(), $parts[4], "[$raw] port -> %s");
-        $this->assertIdentical($url->getPath(), $parts[5], "[$raw] path -> %s");
-        $this->assertIdentical($url->getTld(), $parts[6], "[$raw] tld -> %s");
-        $this->assertIdentical($url->getEncodedRequest(), $parts[7], "[$raw] encoded -> %s");
-        $this->assertIdentical($url->getFragment(), $parts[8], "[$raw] fragment -> %s");
-        if ($coords) {
-            $this->assertIdentical($url->getX(), $coords[0], "[$raw] x -> %s");
-            $this->assertIdentical($url->getY(), $coords[1], "[$raw] y -> %s");
-        }
-    }
-    
-    function assertPreserved($string) {
-        $url = new SimpleUrl($string);
-        $this->assertEqual($url->asString(), $string);
-    }
-}
-
-class TestOfAbsoluteUrls extends UnitTestCase {
-    
-	function testDirectoriesAfterFilename() {
-		$string = '../../index.php/foo/bar';
-		$url = new SimpleUrl($string);
-		$this->assertEqual($url->asString(), $string);
-		
-		$absolute = $url->makeAbsolute('http://www.domain.com/some/path/');
-		$this->assertEqual($absolute->asString(), 'http://www.domain.com/index.php/foo/bar');
-	}
-
-    function testMakingAbsolute() {
-        $url = new SimpleUrl('../there/somewhere.php');
-        $this->assertEqual($url->getPath(), '../there/somewhere.php');
-        $absolute = $url->makeAbsolute('https://host.com:1234/I/am/here/');
-        $this->assertEqual($absolute->getScheme(), 'https');
-        $this->assertEqual($absolute->getHost(), 'host.com');
-        $this->assertEqual($absolute->getPort(), 1234);
-        $this->assertEqual($absolute->getPath(), '/I/am/there/somewhere.php');
-    }
-    
-    function testMakingAnEmptyUrlAbsolute() {
-        $url = new SimpleUrl('');
-        $this->assertEqual($url->getPath(), '');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
-        $this->assertEqual($absolute->getScheme(), 'http');
-        $this->assertEqual($absolute->getHost(), 'host.com');
-        $this->assertEqual($absolute->getPath(), '/I/am/here/page.html');
-    }
-    
-    function testMakingAnEmptyUrlAbsoluteWithMissingPageName() {
-        $url = new SimpleUrl('');
-        $this->assertEqual($url->getPath(), '');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
-        $this->assertEqual($absolute->getScheme(), 'http');
-        $this->assertEqual($absolute->getHost(), 'host.com');
-        $this->assertEqual($absolute->getPath(), '/I/am/here/');
-    }
-    
-    function testMakingAShortQueryUrlAbsolute() {
-        $url = new SimpleUrl('?a#b');
-        $this->assertEqual($url->getPath(), '');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
-        $this->assertEqual($absolute->getScheme(), 'http');
-        $this->assertEqual($absolute->getHost(), 'host.com');
-        $this->assertEqual($absolute->getPath(), '/I/am/here/');
-        $this->assertEqual($absolute->getEncodedRequest(), '?a');
-        $this->assertEqual($absolute->getFragment(), 'b');
-    }
-    
-    function testMakingADirectoryUrlAbsolute() {
-        $url = new SimpleUrl('hello/');
-        $this->assertEqual($url->getPath(), 'hello/');
-        $this->assertEqual($url->getBasePath(), 'hello/');
-        $this->assertEqual($url->getPage(), '');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
-        $this->assertEqual($absolute->getPath(), '/I/am/here/hello/');
-    }
-    
-    function testMakingARootUrlAbsolute() {
-        $url = new SimpleUrl('/');
-        $this->assertEqual($url->getPath(), '/');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
-        $this->assertEqual($absolute->getPath(), '/');
-    }
-    
-    function testMakingARootPageUrlAbsolute() {
-        $url = new SimpleUrl('/here.html');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/page.html');
-        $this->assertEqual($absolute->getPath(), '/here.html');
-    }
-    
-    function testCarryAuthenticationFromRootPage() {
-        $url = new SimpleUrl('here.html');
-        $absolute = $url->makeAbsolute('http://test:secret@host.com/');
-        $this->assertEqual($absolute->getPath(), '/here.html');
-        $this->assertEqual($absolute->getUsername(), 'test');
-        $this->assertEqual($absolute->getPassword(), 'secret');
-    }
-    
-    function testMakingCoordinateUrlAbsolute() {
-        $url = new SimpleUrl('?1,2');
-        $this->assertEqual($url->getPath(), '');
-        $absolute = $url->makeAbsolute('http://host.com/I/am/here/');
-        $this->assertEqual($absolute->getScheme(), 'http');
-        $this->assertEqual($absolute->getHost(), 'host.com');
-        $this->assertEqual($absolute->getPath(), '/I/am/here/');
-        $this->assertEqual($absolute->getX(), 1);
-        $this->assertEqual($absolute->getY(), 2);
-    }
-    
-    function testMakingAbsoluteAppendedPath() {
-        $url = new SimpleUrl('./there/somewhere.php');
-        $absolute = $url->makeAbsolute('https://host.com/here/');
-        $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php');
-    }
-    
-    function testMakingAbsoluteBadlyFormedAppendedPath() {
-        $url = new SimpleUrl('there/somewhere.php');
-        $absolute = $url->makeAbsolute('https://host.com/here/');
-        $this->assertEqual($absolute->getPath(), '/here/there/somewhere.php');
-    }
-    
-    function testMakingAbsoluteHasNoEffectWhenAlreadyAbsolute() {
-        $url = new SimpleUrl('https://test:secret@www.lastcraft.com:321/stuff/?a=1#f');
-        $absolute = $url->makeAbsolute('http://host.com/here/');
-        $this->assertEqual($absolute->getScheme(), 'https');
-        $this->assertEqual($absolute->getUsername(), 'test');
-        $this->assertEqual($absolute->getPassword(), 'secret');
-        $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
-        $this->assertEqual($absolute->getPort(), 321);
-        $this->assertEqual($absolute->getPath(), '/stuff/');
-        $this->assertEqual($absolute->getEncodedRequest(), '?a=1');
-        $this->assertEqual($absolute->getFragment(), 'f');
-    }
-    
-    function testMakingAbsoluteCarriesAuthenticationWhenAlreadyAbsolute() {
-        $url = new SimpleUrl('https://www.lastcraft.com');
-        $absolute = $url->makeAbsolute('http://test:secret@host.com/here/');
-        $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
-        $this->assertEqual($absolute->getUsername(), 'test');
-        $this->assertEqual($absolute->getPassword(), 'secret');
-    }
-    
-    function testMakingHostOnlyAbsoluteDoesNotCarryAnyOtherInformation() {
-        $url = new SimpleUrl('http://www.lastcraft.com');
-        $absolute = $url->makeAbsolute('https://host.com:81/here/');
-        $this->assertEqual($absolute->getScheme(), 'http');
-        $this->assertEqual($absolute->getHost(), 'www.lastcraft.com');
-        $this->assertIdentical($absolute->getPort(), false);
-        $this->assertEqual($absolute->getPath(), '/');
-    }
-}
-
-class TestOfFrameUrl extends UnitTestCase {
-    
-    function testTargetAttachment() {
-        $url = new SimpleUrl('http://www.site.com/home.html');
-        $this->assertIdentical($url->getTarget(), false);
-        $url->setTarget('A frame');
-        $this->assertIdentical($url->getTarget(), 'A frame');
-    }
-}
-
-/**
- * @note Based off of http://www.mozilla.org/quality/networking/testing/filetests.html
- */
-class TestOfFileUrl extends UnitTestCase {
-    
-    function testMinimalUrl() {
-        $url = new SimpleUrl('file:///');
-        $this->assertEqual($url->getScheme(), 'file');
-        $this->assertIdentical($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '/');
-    }
-    
-    function testUnixUrl() {
-        $url = new SimpleUrl('file:///fileInRoot');
-        $this->assertEqual($url->getScheme(), 'file');
-        $this->assertIdentical($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '/fileInRoot');
-    }
-    
-    function testDOSVolumeUrl() {
-        $url = new SimpleUrl('file:///C:/config.sys');
-        $this->assertEqual($url->getScheme(), 'file');
-        $this->assertIdentical($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '/C:/config.sys');
-    }
-    
-    function testDOSVolumePromotion() {
-        $url = new SimpleUrl('file://C:/config.sys');
-        $this->assertEqual($url->getScheme(), 'file');
-        $this->assertIdentical($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '/C:/config.sys');
-    }
-    
-    function testDOSBackslashes() {
-        $url = new SimpleUrl('file:///C:\config.sys');
-        $this->assertEqual($url->getScheme(), 'file');
-        $this->assertIdentical($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '/C:/config.sys');
-    }
-    
-    function testDOSDirnameAfterFile() {
-        $url = new SimpleUrl('file://C:\config.sys');
-        $this->assertEqual($url->getScheme(), 'file');
-        $this->assertIdentical($url->getHost(), false);
-        $this->assertEqual($url->getPath(), '/C:/config.sys');
-    }
-    
-}
-
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/user_agent_test.php b/3rdparty/simpletest/test/user_agent_test.php
deleted file mode 100644
index 030abeb257d84bb30204a88f0a7c54809803622e..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/user_agent_test.php
+++ /dev/null
@@ -1,348 +0,0 @@
-<?php
-// $Id: user_agent_test.php 1788 2008-04-27 11:01:59Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../user_agent.php');
-require_once(dirname(__FILE__) . '/../authentication.php');
-require_once(dirname(__FILE__) . '/../http.php');
-require_once(dirname(__FILE__) . '/../encoding.php');
-Mock::generate('SimpleHttpRequest');
-Mock::generate('SimpleHttpResponse');
-Mock::generate('SimpleHttpHeaders');
-Mock::generatePartial('SimpleUserAgent', 'MockRequestUserAgent', array('createHttpRequest'));
-
-class TestOfFetchingUrlParameters extends UnitTestCase {
-    
-    function setUp() {
-        $this->headers = new MockSimpleHttpHeaders();
-        $this->response = new MockSimpleHttpResponse();
-        $this->response->setReturnValue('isError', false);
-        $this->response->returns('getHeaders', new MockSimpleHttpHeaders());
-        $this->request = new MockSimpleHttpRequest();
-        $this->request->returns('fetch', $this->response);
-    }
-    
-    function testGetRequestWithoutIncidentGivesNoErrors() {
-        $url = new SimpleUrl('http://test:secret@this.com/page.html');
-        $url->addRequestParameters(array('a' => 'A', 'b' => 'B'));
-        
-        $agent = new MockRequestUserAgent();
-        $agent->returns('createHttpRequest', $this->request);
-        $agent->__construct();
-        
-        $response = $agent->fetchResponse(
-                new SimpleUrl('http://test:secret@this.com/page.html'),
-                new SimpleGetEncoding(array('a' => 'A', 'b' => 'B')));
-        $this->assertFalse($response->isError());
-    }
-}
-
-class TestOfAdditionalHeaders extends UnitTestCase {
-    
-    function testAdditionalHeaderAddedToRequest() {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders());
-        
-        $request = new MockSimpleHttpRequest();
-        $request->setReturnReference('fetch', $response);
-        $request->expectOnce(
-                'addHeaderLine',
-                array('User-Agent: SimpleTest'));
-        
-        $agent = new MockRequestUserAgent();
-        $agent->setReturnReference('createHttpRequest', $request);
-        $agent->__construct();
-        $agent->addHeader('User-Agent: SimpleTest');
-        $response = $agent->fetchResponse(new SimpleUrl('http://this.host/'), new SimpleGetEncoding());
-    }
-}
-
-class TestOfBrowserCookies extends UnitTestCase {
-
-    private function createStandardResponse() {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue("isError", false);
-        $response->setReturnValue("getContent", "stuff");
-        $response->setReturnReference("getHeaders", new MockSimpleHttpHeaders());
-        return $response;
-    }
-    
-    private function createCookieSite($header_lines) {
-        $headers = new SimpleHttpHeaders($header_lines);
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue("isError", false);
-        $response->setReturnReference("getHeaders", $headers);
-        $response->setReturnValue("getContent", "stuff");
-        $request = new MockSimpleHttpRequest();
-        $request->setReturnReference("fetch", $response);
-        return $request;
-    }
-    
-    private function createMockedRequestUserAgent(&$request) {
-        $agent = new MockRequestUserAgent();
-        $agent->setReturnReference('createHttpRequest', $request);
-        $agent->__construct();
-        return $agent;
-    }
-    
-    function testCookieJarIsSentToRequest() {
-        $jar = new SimpleCookieJar();
-        $jar->setCookie('a', 'A');
-        
-        $request = new MockSimpleHttpRequest();
-        $request->returns('fetch', $this->createStandardResponse());
-        $request->expectOnce('readCookiesFromJar', array($jar, '*'));
-        
-        $agent = $this->createMockedRequestUserAgent($request);
-        $agent->setCookie('a', 'A');
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-    }
-      
-    function testNoCookieJarIsSentToRequestWhenCookiesAreDisabled() {
-        $request = new MockSimpleHttpRequest();
-        $request->returns('fetch', $this->createStandardResponse());
-        $request->expectNever('readCookiesFromJar');
-        
-        $agent = $this->createMockedRequestUserAgent($request);
-        $agent->setCookie('a', 'A');
-        $agent->ignoreCookies();
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-    }
-  
-    function testReadingNewCookie() {
-        $request = $this->createCookieSite('Set-cookie: a=AAAA');
-        $agent = $this->createMockedRequestUserAgent($request);
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-        $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA");
-    }
-  
-    function testIgnoringNewCookieWhenCookiesDisabled() {
-        $request = $this->createCookieSite('Set-cookie: a=AAAA');
-        $agent = $this->createMockedRequestUserAgent($request);
-        $agent->ignoreCookies();
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-        $this->assertIdentical($agent->getCookieValue("this.com", "this/path/", "a"), false);
-    }
-   
-    function testOverwriteCookieThatAlreadyExists() {
-        $request = $this->createCookieSite('Set-cookie: a=AAAA');
-        $agent = $this->createMockedRequestUserAgent($request);
-        $agent->setCookie('a', 'A');
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-        $this->assertEqual($agent->getCookieValue("this.com", "this/path/", "a"), "AAAA");
-    }
-   
-    function testClearCookieBySettingExpiry() {
-        $request = $this->createCookieSite('Set-cookie: a=b');
-        $agent = $this->createMockedRequestUserAgent($request);
-        
-        $agent->setCookie("a", "A", "this/path/", "Wed, 25-Dec-02 04:24:21 GMT");
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-        $this->assertIdentical(
-                $agent->getCookieValue("this.com", "this/path/", "a"),
-                "b");
-        $agent->restart("Wed, 25-Dec-02 04:24:20 GMT");
-        $this->assertIdentical(
-                $agent->getCookieValue("this.com", "this/path/", "a"),
-                false);
-    }
-    
-    function testAgeingAndClearing() {
-        $request = $this->createCookieSite('Set-cookie: a=A; expires=Wed, 25-Dec-02 04:24:21 GMT; path=/this/path');
-        $agent = $this->createMockedRequestUserAgent($request);
-        
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-        $agent->restart("Wed, 25-Dec-02 04:24:20 GMT");
-        $this->assertIdentical(
-                $agent->getCookieValue("this.com", "this/path/", "a"),
-                "A");
-        $agent->ageCookies(2);
-        $agent->restart("Wed, 25-Dec-02 04:24:20 GMT");
-        $this->assertIdentical(
-                $agent->getCookieValue("this.com", "this/path/", "a"),
-                false);
-    }
-    
-    function testReadingIncomingAndSettingNewCookies() {
-        $request = $this->createCookieSite('Set-cookie: a=AAA');
-        $agent = $this->createMockedRequestUserAgent($request);
-        
-        $this->assertNull($agent->getBaseCookieValue("a", false));
-        $agent->fetchResponse(
-                new SimpleUrl('http://this.com/this/path/page.html'),
-                new SimpleGetEncoding());
-        $agent->setCookie("b", "BBB", "this.com", "this/path/");
-        $this->assertEqual(
-                $agent->getBaseCookieValue("a", new SimpleUrl('http://this.com/this/path/page.html')),
-                "AAA");
-        $this->assertEqual(
-                $agent->getBaseCookieValue("b", new SimpleUrl('http://this.com/this/path/page.html')),
-                "BBB");
-    }
-}
-
-class TestOfHttpRedirects extends UnitTestCase {
-    
-    function createRedirect($content, $redirect) {
-        $headers = new MockSimpleHttpHeaders();
-        $headers->setReturnValue('isRedirect', (boolean)$redirect);
-        $headers->setReturnValue('getLocation', $redirect);
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('getContent', $content);
-        $response->setReturnReference('getHeaders', $headers);
-        $request = new MockSimpleHttpRequest();
-        $request->setReturnReference('fetch', $response);
-        return $request;
-    }
-    
-    function testDisabledRedirects() {
-        $agent = new MockRequestUserAgent();
-        $agent->returns(
-                'createHttpRequest',
-                $this->createRedirect('stuff', 'there.html'));
-        $agent->expectOnce('createHttpRequest');
-        $agent->__construct();
-        $agent->setMaximumRedirects(0);
-        $response = $agent->fetchResponse(new SimpleUrl('here.html'), new SimpleGetEncoding());
-        $this->assertEqual($response->getContent(), 'stuff');
-    }
-    
-    function testSingleRedirect() {
-        $agent = new MockRequestUserAgent();
-        $agent->returnsAt(
-                0,
-                'createHttpRequest',
-                $this->createRedirect('first', 'two.html'));
-        $agent->returnsAt(
-                1,
-                'createHttpRequest',
-                $this->createRedirect('second', 'three.html'));
-        $agent->expectCallCount('createHttpRequest', 2);
-        $agent->__construct();
-        
-        $agent->setMaximumRedirects(1);
-        $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding());
-        $this->assertEqual($response->getContent(), 'second');
-    }
-    
-    function testDoubleRedirect() {
-        $agent = new MockRequestUserAgent();
-        $agent->returnsAt(
-                0,
-                'createHttpRequest',
-                $this->createRedirect('first', 'two.html'));
-        $agent->returnsAt(
-                1,
-                'createHttpRequest',
-                $this->createRedirect('second', 'three.html'));
-        $agent->returnsAt(
-                2,
-                'createHttpRequest',
-                $this->createRedirect('third', 'four.html'));
-        $agent->expectCallCount('createHttpRequest', 3);
-        $agent->__construct();
-        
-        $agent->setMaximumRedirects(2);
-        $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding());
-        $this->assertEqual($response->getContent(), 'third');
-    }
-    
-    function testSuccessAfterRedirect() {
-        $agent = new MockRequestUserAgent();
-        $agent->returnsAt(
-                0,
-                'createHttpRequest',
-                $this->createRedirect('first', 'two.html'));
-        $agent->returnsAt(
-                1,
-                'createHttpRequest',
-                $this->createRedirect('second', false));
-        $agent->returnsAt(
-                2,
-                'createHttpRequest',
-                $this->createRedirect('third', 'four.html'));
-        $agent->expectCallCount('createHttpRequest', 2);
-        $agent->__construct();
-        
-        $agent->setMaximumRedirects(2);
-        $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimpleGetEncoding());
-        $this->assertEqual($response->getContent(), 'second');
-    }
-    
-    function testRedirectChangesPostToGet() {
-        $agent = new MockRequestUserAgent();
-        $agent->returnsAt(
-                0,
-                'createHttpRequest',
-                $this->createRedirect('first', 'two.html'));
-        $agent->expectAt(0, 'createHttpRequest', array('*', new IsAExpectation('SimplePostEncoding')));
-        $agent->returnsAt(
-                1,
-                'createHttpRequest',
-                $this->createRedirect('second', 'three.html'));
-        $agent->expectAt(1, 'createHttpRequest', array('*', new IsAExpectation('SimpleGetEncoding')));
-        $agent->expectCallCount('createHttpRequest', 2);
-        $agent->__construct();
-        $agent->setMaximumRedirects(1);
-        $response = $agent->fetchResponse(new SimpleUrl('one.html'), new SimplePostEncoding());
-    }
-}
-
-class TestOfBadHosts extends UnitTestCase {
-    
-    private function createSimulatedBadHost() {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnValue('isError', true);
-        $response->setReturnValue('getError', 'Bad socket');
-        $response->setReturnValue('getContent', false);
-        $request = new MockSimpleHttpRequest();
-        $request->setReturnReference('fetch', $response);
-        return $request;
-    }
-    
-    function testUntestedHost() {
-        $request = $this->createSimulatedBadHost();
-        $agent = new MockRequestUserAgent();
-        $agent->setReturnReference('createHttpRequest', $request);
-        $agent->__construct();
-        $response = $agent->fetchResponse(
-                new SimpleUrl('http://this.host/this/path/page.html'),
-                new SimpleGetEncoding());
-        $this->assertTrue($response->isError());
-    }
-}
-
-class TestOfAuthorisation extends UnitTestCase {
-    
-    function testAuthenticateHeaderAdded() {
-        $response = new MockSimpleHttpResponse();
-        $response->setReturnReference('getHeaders', new MockSimpleHttpHeaders());
-        
-        $request = new MockSimpleHttpRequest();
-        $request->returns('fetch', $response);
-        $request->expectOnce(
-                'addHeaderLine',
-                array('Authorization: Basic ' . base64_encode('test:secret')));
-        
-        $agent = new MockRequestUserAgent();
-        $agent->returns('createHttpRequest', $request);
-        $agent->__construct();
-        $response = $agent->fetchResponse(
-                new SimpleUrl('http://test:secret@this.host'),
-                new SimpleGetEncoding());
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/visual_test.php b/3rdparty/simpletest/test/visual_test.php
deleted file mode 100644
index 6b9d085d67f9bd2939e56b98695034462a152998..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/visual_test.php
+++ /dev/null
@@ -1,495 +0,0 @@
-<?php
-// $Id: visual_test.php 1884 2009-07-01 16:30:40Z lastcraft $
-
-// NOTE:
-// Some of these tests are designed to fail! Do not be alarmed.
-//                         ----------------
-
-// The following tests are a bit hacky. Whilst Kent Beck tried to
-// build a unit tester with a unit tester, I am not that brave.
-// Instead I have just hacked together odd test scripts until
-// I have enough of a tester to procede more formally.
-//
-// The proper tests start in all_tests.php
-require_once('../unit_tester.php');
-require_once('../shell_tester.php');
-require_once('../mock_objects.php');
-require_once('../reporter.php');
-require_once('../xml.php');
-
-class TestDisplayClass {
-    private $a;
-
-    function TestDisplayClass($a) {
-        $this->a = $a;
-    }
-}
-
-class PassingUnitTestCaseOutput extends UnitTestCase {
-
-    function testOfResults() {
-        $this->pass('Pass');
-    }
-
-    function testTrue() {
-        $this->assertTrue(true);
-    }
-
-    function testFalse() {
-        $this->assertFalse(false);
-    }
-
-    function testExpectation() {
-        $expectation = &new EqualExpectation(25, 'My expectation message: %s');
-        $this->assert($expectation, 25, 'My assert message : %s');
-    }
-
-    function testNull() {
-        $this->assertNull(null, "%s -> Pass");
-        $this->assertNotNull(false, "%s -> Pass");
-    }
-
-    function testType() {
-        $this->assertIsA("hello", "string", "%s -> Pass");
-        $this->assertIsA($this, "PassingUnitTestCaseOutput", "%s -> Pass");
-        $this->assertIsA($this, "UnitTestCase", "%s -> Pass");
-    }
-
-    function testTypeEquality() {
-        $this->assertEqual("0", 0, "%s -> Pass");
-    }
-
-    function testNullEquality() {
-        $this->assertNotEqual(null, 1, "%s -> Pass");
-        $this->assertNotEqual(1, null, "%s -> Pass");
-    }
-
-    function testIntegerEquality() {
-        $this->assertNotEqual(1, 2, "%s -> Pass");
-    }
-
-    function testStringEquality() {
-        $this->assertEqual("a", "a", "%s -> Pass");
-        $this->assertNotEqual("aa", "ab", "%s -> Pass");
-    }
-
-    function testHashEquality() {
-        $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> Pass");
-    }
-
-    function testWithin() {
-        $this->assertWithinMargin(5, 5.4, 0.5, "%s -> Pass");
-    }
-
-    function testOutside() {
-        $this->assertOutsideMargin(5, 5.6, 0.5, "%s -> Pass");
-    }
-
-    function testStringIdentity() {
-        $a = "fred";
-        $b = $a;
-        $this->assertIdentical($a, $b, "%s -> Pass");
-    }
-
-    function testTypeIdentity() {
-        $a = "0";
-        $b = 0;
-        $this->assertNotIdentical($a, $b, "%s -> Pass");
-    }
-
-    function testNullIdentity() {
-        $this->assertNotIdentical(null, 1, "%s -> Pass");
-        $this->assertNotIdentical(1, null, "%s -> Pass");
-    }
-
-    function testHashIdentity() {
-    }
-
-    function testObjectEquality() {
-        $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Pass");
-        $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Pass");
-    }
-
-    function testObjectIndentity() {
-        $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Pass");
-        $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Pass");
-    }
-
-    function testReference() {
-        $a = "fred";
-        $b = &$a;
-        $this->assertReference($a, $b, "%s -> Pass");
-    }
-
-    function testCloneOnDifferentObjects() {
-        $a = "fred";
-        $b = $a;
-        $c = "Hello";
-        $this->assertClone($a, $b, "%s -> Pass");
-    }
-
-    function testPatterns() {
-        $this->assertPattern('/hello/i', "Hello there", "%s -> Pass");
-        $this->assertNoPattern('/hello/', "Hello there", "%s -> Pass");
-    }
-
-    function testLongStrings() {
-        $text = "";
-        for ($i = 0; $i < 10; $i++) {
-            $text .= "0123456789";
-        }
-        $this->assertEqual($text, $text);
-    }
-}
-
-class FailingUnitTestCaseOutput extends UnitTestCase {
-
-    function testOfResults() {
-        $this->fail('Fail');        // Fail.
-    }
-
-    function testTrue() {
-        $this->assertTrue(false);        // Fail.
-    }
-
-    function testFalse() {
-        $this->assertFalse(true);        // Fail.
-    }
-
-    function testExpectation() {
-        $expectation = &new EqualExpectation(25, 'My expectation message: %s');
-        $this->assert($expectation, 24, 'My assert message : %s');        // Fail.
-    }
-
-    function testNull() {
-        $this->assertNull(false, "%s -> Fail");        // Fail.
-        $this->assertNotNull(null, "%s -> Fail");        // Fail.
-    }
-
-    function testType() {
-        $this->assertIsA(14, "string", "%s -> Fail");        // Fail.
-        $this->assertIsA(14, "TestOfUnitTestCaseOutput", "%s -> Fail");        // Fail.
-        $this->assertIsA($this, "TestReporter", "%s -> Fail");        // Fail.
-    }
-
-    function testTypeEquality() {
-        $this->assertNotEqual("0", 0, "%s -> Fail");        // Fail.
-    }
-
-    function testNullEquality() {
-        $this->assertEqual(null, 1, "%s -> Fail");        // Fail.
-        $this->assertEqual(1, null, "%s -> Fail");        // Fail.
-    }
-
-    function testIntegerEquality() {
-        $this->assertEqual(1, 2, "%s -> Fail");        // Fail.
-    }
-
-    function testStringEquality() {
-        $this->assertNotEqual("a", "a", "%s -> Fail");    // Fail.
-        $this->assertEqual("aa", "ab", "%s -> Fail");        // Fail.
-    }
-
-    function testHashEquality() {
-        $this->assertEqual(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "Z"), "%s -> Fail");
-    }
-
-    function testWithin() {
-        $this->assertWithinMargin(5, 5.6, 0.5, "%s -> Fail");   // Fail.
-    }
-
-    function testOutside() {
-        $this->assertOutsideMargin(5, 5.4, 0.5, "%s -> Fail");   // Fail.
-    }
-
-    function testStringIdentity() {
-        $a = "fred";
-        $b = $a;
-        $this->assertNotIdentical($a, $b, "%s -> Fail");       // Fail.
-    }
-
-    function testTypeIdentity() {
-        $a = "0";
-        $b = 0;
-        $this->assertIdentical($a, $b, "%s -> Fail");        // Fail.
-    }
-
-    function testNullIdentity() {
-        $this->assertIdentical(null, 1, "%s -> Fail");        // Fail.
-        $this->assertIdentical(1, null, "%s -> Fail");        // Fail.
-    }
-
-    function testHashIdentity() {
-        $this->assertIdentical(array("a" => "A", "b" => "B"), array("b" => "B", "a" => "A"), "%s -> fail");        // Fail.
-    }
-
-    function testObjectEquality() {
-        $this->assertNotEqual(new TestDisplayClass(4), new TestDisplayClass(4), "%s -> Fail");    // Fail.
-        $this->assertEqual(new TestDisplayClass(4), new TestDisplayClass(5), "%s -> Fail");        // Fail.
-    }
-
-    function testObjectIndentity() {
-        $this->assertNotIdentical(new TestDisplayClass(false), new TestDisplayClass(false), "%s -> Fail");    // Fail.
-        $this->assertIdentical(new TestDisplayClass(false), new TestDisplayClass(0), "%s -> Fail");        // Fail.
-    }
-
-    function testReference() {
-        $a = "fred";
-        $b = &$a;
-        $this->assertClone($a, $b, "%s -> Fail");        // Fail.
-    }
-
-    function testCloneOnDifferentObjects() {
-        $a = "fred";
-        $b = $a;
-        $c = "Hello";
-        $this->assertClone($a, $c, "%s -> Fail");        // Fail.
-    }
-
-    function testPatterns() {
-        $this->assertPattern('/hello/', "Hello there", "%s -> Fail");            // Fail.
-        $this->assertNoPattern('/hello/i', "Hello there", "%s -> Fail");      // Fail.
-    }
-
-    function testLongStrings() {
-        $text = "";
-        for ($i = 0; $i < 10; $i++) {
-            $text .= "0123456789";
-        }
-        $this->assertEqual($text . $text, $text . "a" . $text);        // Fail.
-    }
-}
-
-class Dummy {
-    function Dummy() {
-    }
-
-    function a() {
-    }
-}
-Mock::generate('Dummy');
-
-class TestOfMockObjectsOutput extends UnitTestCase {
-
-    function testCallCounts() {
-        $dummy = &new MockDummy();
-        $dummy->expectCallCount('a', 1, 'My message: %s');
-        $dummy->a();
-        $dummy->a();
-    }
-
-    function testMinimumCallCounts() {
-        $dummy = &new MockDummy();
-        $dummy->expectMinimumCallCount('a', 2, 'My message: %s');
-        $dummy->a();
-        $dummy->a();
-    }
-
-    function testEmptyMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array());
-        $dummy->a();
-        $dummy->a(null);        // Fail.
-    }
-
-    function testEmptyMatchingWithCustomMessage() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(), 'My expectation message: %s');
-        $dummy->a();
-        $dummy->a(null);        // Fail.
-    }
-
-    function testNullMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(null));
-        $dummy->a(null);
-        $dummy->a();        // Fail.
-    }
-
-    function testBooleanMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(true, false));
-        $dummy->a(true, false);
-        $dummy->a(true, true);        // Fail.
-    }
-
-    function testIntegerMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(32, 33));
-        $dummy->a(32, 33);
-        $dummy->a(32, 34);        // Fail.
-    }
-
-    function testFloatMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(3.2, 3.3));
-        $dummy->a(3.2, 3.3);
-        $dummy->a(3.2, 3.4);        // Fail.
-    }
-
-    function testStringMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array('32', '33'));
-        $dummy->a('32', '33');
-        $dummy->a('32', '34');        // Fail.
-    }
-
-    function testEmptyMatchingWithCustomExpectationMessage() {
-        $dummy = &new MockDummy();
-        $dummy->expect(
-                'a',
-                array(new EqualExpectation('A', 'My part expectation message: %s')),
-                'My expectation message: %s');
-        $dummy->a('A');
-        $dummy->a('B');        // Fail.
-    }
-
-    function testArrayMatching() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(array(32), array(33)));
-        $dummy->a(array(32), array(33));
-        $dummy->a(array(32), array('33'));        // Fail.
-    }
-
-    function testObjectMatching() {
-        $a = new Dummy();
-        $a->a = 'a';
-        $b = new Dummy();
-        $b->b = 'b';
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array($a, $b));
-        $dummy->a($a, $b);
-        $dummy->a($a, $a);        // Fail.
-    }
-
-    function testBigList() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array(false, 0, 1, 1.0));
-        $dummy->a(false, 0, 1, 1.0);
-        $dummy->a(true, false, 2, 2.0);        // Fail.
-    }
-}
-
-class TestOfPastBugs extends UnitTestCase {
-
-    function testMixedTypes() {
-        $this->assertEqual(array(), null, "%s -> Pass");
-        $this->assertIdentical(array(), null, "%s -> Fail");    // Fail.
-    }
-
-    function testMockWildcards() {
-        $dummy = &new MockDummy();
-        $dummy->expect('a', array('*', array(33)));
-        $dummy->a(array(32), array(33));
-        $dummy->a(array(32), array('33'));        // Fail.
-    }
-}
-
-class TestOfVisualShell extends ShellTestCase {
-
-    function testDump() {
-        $this->execute('ls');
-        $this->dumpOutput();
-        $this->execute('dir');
-        $this->dumpOutput();
-    }
-
-    function testDumpOfList() {
-        $this->execute('ls');
-        $this->dump($this->getOutputAsList());
-    }
-}
-
-class PassesAsWellReporter extends HtmlReporter {
-
-    protected function getCss() {
-        return parent::getCss() . ' .pass { color: darkgreen; }';
-    }
-
-    function paintPass($message) {
-        parent::paintPass($message);
-        print "<span class=\"pass\">Pass</span>: ";
-        $breadcrumb = $this->getTestList();
-        array_shift($breadcrumb);
-        print implode(" -&gt; ", $breadcrumb);
-        print " -&gt; " . htmlentities($message) . "<br />\n";
-    }
-
-    function paintSignal($type, &$payload) {
-        print "<span class=\"fail\">$type</span>: ";
-        $breadcrumb = $this->getTestList();
-        array_shift($breadcrumb);
-        print implode(" -&gt; ", $breadcrumb);
-        print " -&gt; " . htmlentities(serialize($payload)) . "<br />\n";
-    }
-}
-
-class TestOfSkippingNoMatterWhat extends UnitTestCase {
-    function skip() {
-        $this->skipIf(true, 'Always skipped -> %s');
-    }
-
-    function testFail() {
-        $this->fail('This really shouldn\'t have happened');
-    }
-}
-
-class TestOfSkippingOrElse extends UnitTestCase {
-    function skip() {
-        $this->skipUnless(false, 'Always skipped -> %s');
-    }
-
-    function testFail() {
-        $this->fail('This really shouldn\'t have happened');
-    }
-}
-
-class TestOfSkippingTwiceOver extends UnitTestCase {
-    function skip() {
-        $this->skipIf(true, 'First reason -> %s');
-        $this->skipIf(true, 'Second reason -> %s');
-    }
-
-    function testFail() {
-        $this->fail('This really shouldn\'t have happened');
-    }
-}
-
-class TestThatShouldNotBeSkipped extends UnitTestCase {
-    function skip() {
-        $this->skipIf(false);
-        $this->skipUnless(true);
-    }
-
-    function testFail() {
-        $this->fail('We should see this message');
-    }
-
-    function testPass() {
-        $this->pass('We should see this message');
-    }
-}
-
-$test = &new TestSuite('Visual test with 46 passes, 47 fails and 0 exceptions');
-$test->add(new PassingUnitTestCaseOutput());
-$test->add(new FailingUnitTestCaseOutput());
-$test->add(new TestOfMockObjectsOutput());
-$test->add(new TestOfPastBugs());
-$test->add(new TestOfVisualShell());
-$test->add(new TestOfSkippingNoMatterWhat());
-$test->add(new TestOfSkippingOrElse());
-$test->add(new TestOfSkippingTwiceOver());
-$test->add(new TestThatShouldNotBeSkipped());
-
-if (isset($_GET['xml']) || in_array('xml', (isset($argv) ? $argv : array()))) {
-    $reporter = new XmlReporter();
-} elseif (TextReporter::inCli()) {
-    $reporter = new TextReporter();
-} else {
-    $reporter = new PassesAsWellReporter();
-}
-if (isset($_GET['dry']) || in_array('dry', (isset($argv) ? $argv : array()))) {
-    $reporter->makeDry();
-}
-exit ($test->run($reporter) ? 0 : 1);
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/web_tester_test.php b/3rdparty/simpletest/test/web_tester_test.php
deleted file mode 100644
index 8c3bf1adf639e8587c048f314239cc86928629a1..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/web_tester_test.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-// $Id: web_tester_test.php 1748 2008-04-14 01:50:41Z lastcraft $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../web_tester.php');
-
-class TestOfFieldExpectation extends UnitTestCase {
-    
-    function testStringMatchingIsCaseSensitive() {
-        $expectation = new FieldExpectation('a');
-        $this->assertTrue($expectation->test('a'));
-        $this->assertTrue($expectation->test(array('a')));
-        $this->assertFalse($expectation->test('A'));
-    }
-    
-    function testMatchesInteger() {
-        $expectation = new FieldExpectation('1');
-        $this->assertTrue($expectation->test('1'));
-        $this->assertTrue($expectation->test(1));
-        $this->assertTrue($expectation->test(array('1')));
-        $this->assertTrue($expectation->test(array(1)));
-    }
-    
-    function testNonStringFailsExpectation() {
-        $expectation = new FieldExpectation('a');
-        $this->assertFalse($expectation->test(null));
-    }
-    
-    function testUnsetFieldCanBeTestedFor() {
-        $expectation = new FieldExpectation(false);
-        $this->assertTrue($expectation->test(false));
-    }
-    
-    function testMultipleValuesCanBeInAnyOrder() {
-        $expectation = new FieldExpectation(array('a', 'b'));
-        $this->assertTrue($expectation->test(array('a', 'b')));
-        $this->assertTrue($expectation->test(array('b', 'a')));
-        $this->assertFalse($expectation->test(array('a', 'a')));            
-        $this->assertFalse($expectation->test('a'));            
-    }
-    
-    function testSingleItemCanBeArrayOrString() {
-        $expectation = new FieldExpectation(array('a'));
-        $this->assertTrue($expectation->test(array('a')));
-        $this->assertTrue($expectation->test('a'));
-    }
-}
-
-class TestOfHeaderExpectations extends UnitTestCase {
-    
-    function testExpectingOnlyTheHeaderName() {
-        $expectation = new HttpHeaderExpectation('a');
-        $this->assertIdentical($expectation->test(false), false);
-        $this->assertIdentical($expectation->test('a: A'), true);
-        $this->assertIdentical($expectation->test('A: A'), true);
-        $this->assertIdentical($expectation->test('a: B'), true);
-        $this->assertIdentical($expectation->test(' a : A '), true);
-    }
-    
-    function testHeaderValueAsWell() {
-        $expectation = new HttpHeaderExpectation('a', 'A');
-        $this->assertIdentical($expectation->test(false), false);
-        $this->assertIdentical($expectation->test('a: A'), true);
-        $this->assertIdentical($expectation->test('A: A'), true);
-        $this->assertIdentical($expectation->test('A: a'), false);
-        $this->assertIdentical($expectation->test('a: B'), false);
-        $this->assertIdentical($expectation->test(' a : A '), true);
-        $this->assertIdentical($expectation->test(' a : AB '), false);
-    }
-    
-    function testHeaderValueWithColons() {
-        $expectation = new HttpHeaderExpectation('a', 'A:B:C');
-        $this->assertIdentical($expectation->test('a: A'), false);
-        $this->assertIdentical($expectation->test('a: A:B'), false);
-        $this->assertIdentical($expectation->test('a: A:B:C'), true);
-        $this->assertIdentical($expectation->test('a: A:B:C:D'), false);
-    }
-    
-    function testMultilineSearch() {
-        $expectation = new HttpHeaderExpectation('a', 'A');
-        $this->assertIdentical($expectation->test("aa: A\r\nb: B\r\nc: C"), false);
-        $this->assertIdentical($expectation->test("aa: A\r\na: A\r\nb: B"), true);
-    }
-    
-    function testMultilineSearchWithPadding() {
-        $expectation = new HttpHeaderExpectation('a', ' A ');
-        $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), false);
-        $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), true);
-    }
-    
-    function testPatternMatching() {
-        $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/'));
-        $this->assertIdentical($expectation->test('a: A'), true);
-        $this->assertIdentical($expectation->test('A: A'), true);
-        $this->assertIdentical($expectation->test('A: a'), false);
-        $this->assertIdentical($expectation->test('a: B'), false);
-        $this->assertIdentical($expectation->test(' a : A '), true);
-        $this->assertIdentical($expectation->test(' a : AB '), true);
-    }
-    
-    function testCaseInsensitivePatternMatching() {
-        $expectation = new HttpHeaderExpectation('a', new PatternExpectation('/A/i'));
-        $this->assertIdentical($expectation->test('a: a'), true);
-        $this->assertIdentical($expectation->test('a: B'), false);
-        $this->assertIdentical($expectation->test(' a : A '), true);
-        $this->assertIdentical($expectation->test(' a : BAB '), true);
-        $this->assertIdentical($expectation->test(' a : bab '), true);
-    }
-    
-    function testUnwantedHeader() {
-        $expectation = new NoHttpHeaderExpectation('a');
-        $this->assertIdentical($expectation->test(''), true);
-        $this->assertIdentical($expectation->test('stuff'), true);
-        $this->assertIdentical($expectation->test('b: B'), true);
-        $this->assertIdentical($expectation->test('a: A'), false);
-        $this->assertIdentical($expectation->test('A: A'), false);
-    }
-    
-    function testMultilineUnwantedSearch() {
-        $expectation = new NoHttpHeaderExpectation('a');
-        $this->assertIdentical($expectation->test("aa:A\r\nb:B\r\nc:C"), true);
-        $this->assertIdentical($expectation->test("aa:A\r\na:A\r\nb:B"), false);
-    }
-    
-    function testLocationHeaderSplitsCorrectly() {
-        $expectation = new HttpHeaderExpectation('Location', 'http://here/');
-        $this->assertIdentical($expectation->test('Location: http://here/'), true);
-    }
-}
-
-class TestOfTextExpectations extends UnitTestCase {
-    
-    function testMatchingSubString() {
-        $expectation = new TextExpectation('wanted');
-        $this->assertIdentical($expectation->test(''), false);
-        $this->assertIdentical($expectation->test('Wanted'), false);
-        $this->assertIdentical($expectation->test('wanted'), true);
-        $this->assertIdentical($expectation->test('the wanted text is here'), true);
-    }
-    
-    function testNotMatchingSubString() {
-        $expectation = new NoTextExpectation('wanted');
-        $this->assertIdentical($expectation->test(''), true);
-        $this->assertIdentical($expectation->test('Wanted'), true);
-        $this->assertIdentical($expectation->test('wanted'), false);
-        $this->assertIdentical($expectation->test('the wanted text is here'), false);
-    }
-}
-
-class TestOfGenericAssertionsInWebTester extends WebTestCase {
-    function testEquality() {
-        $this->assertEqual('a', 'a');
-        $this->assertNotEqual('a', 'A');
-    }
-}
-?>
\ No newline at end of file
diff --git a/3rdparty/simpletest/test/xml_test.php b/3rdparty/simpletest/test/xml_test.php
deleted file mode 100644
index f99e0dcd98b07dbe7489512ee6cf14f38e2e4253..0000000000000000000000000000000000000000
--- a/3rdparty/simpletest/test/xml_test.php
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-// $Id: xml_test.php 1787 2008-04-26 20:35:39Z pp11 $
-require_once(dirname(__FILE__) . '/../autorun.php');
-require_once(dirname(__FILE__) . '/../xml.php');
-Mock::generate('SimpleScorer');
-
-if (! function_exists('xml_parser_create')) {
-    SimpleTest::ignore('TestOfXmlStructureParsing');
-    SimpleTest::ignore('TestOfXmlResultsParsing');
-}
-
-class TestOfNestingTags extends UnitTestCase {
-    function testGroupSize() {
-        $nesting = new NestingGroupTag(array('SIZE' => 2));
-        $this->assertEqual($nesting->getSize(), 2);
-    }
-}
-
-class TestOfXmlStructureParsing extends UnitTestCase {
-    function testValidXml() {
-        $listener = new MockSimpleScorer();
-        $listener->expectNever('paintGroupStart');
-        $listener->expectNever('paintGroupEnd');
-        $listener->expectNever('paintCaseStart');
-        $listener->expectNever('paintCaseEnd');
-        $parser = new SimpleTestXmlParser($listener);
-        $this->assertTrue($parser->parse("<?xml version=\"1.0\"?>\n"));
-        $this->assertTrue($parser->parse("<run>\n"));
-        $this->assertTrue($parser->parse("</run>\n"));
-    }
-
-    function testEmptyGroup() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintGroupStart', array('a_group', 7));
-        $listener->expectOnce('paintGroupEnd', array('a_group'));
-        $parser = new SimpleTestXmlParser($listener);
-        $parser->parse("<?xml version=\"1.0\"?>\n");
-        $parser->parse("<run>\n");
-        $this->assertTrue($parser->parse("<group size=\"7\">\n"));
-        $this->assertTrue($parser->parse("<name>a_group</name>\n"));
-        $this->assertTrue($parser->parse("</group>\n"));
-        $parser->parse("</run>\n");
-    }
-
-    function testEmptyCase() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintCaseStart', array('a_case'));
-        $listener->expectOnce('paintCaseEnd', array('a_case'));
-        $parser = new SimpleTestXmlParser($listener);
-        $parser->parse("<?xml version=\"1.0\"?>\n");
-        $parser->parse("<run>\n");
-        $this->assertTrue($parser->parse("<case>\n"));
-        $this->assertTrue($parser->parse("<name>a_case</name>\n"));
-        $this->assertTrue($parser->parse("</case>\n"));
-        $parser->parse("</run>\n");
-    }
-
-    function testEmptyMethod() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintCaseStart', array('a_case'));
-        $listener->expectOnce('paintCaseEnd', array('a_case'));
-        $listener->expectOnce('paintMethodStart', array('a_method'));
-        $listener->expectOnce('paintMethodEnd', array('a_method'));
-        $parser = new SimpleTestXmlParser($listener);
-        $parser->parse("<?xml version=\"1.0\"?>\n");
-        $parser->parse("<run>\n");
-        $parser->parse("<case>\n");
-        $parser->parse("<name>a_case</name>\n");
-        $this->assertTrue($parser->parse("<test>\n"));
-        $this->assertTrue($parser->parse("<name>a_method</name>\n"));
-        $this->assertTrue($parser->parse("</test>\n"));
-        $parser->parse("</case>\n");
-        $parser->parse("</run>\n");
-    }
-
-    function testNestedGroup() {
-        $listener = new MockSimpleScorer();
-        $listener->expectAt(0, 'paintGroupStart', array('a_group', 7));
-        $listener->expectAt(1, 'paintGroupStart', array('b_group', 3));
-        $listener->expectCallCount('paintGroupStart', 2);
-        $listener->expectAt(0, 'paintGroupEnd', array('b_group'));
-        $listener->expectAt(1, 'paintGroupEnd', array('a_group'));
-        $listener->expectCallCount('paintGroupEnd', 2);
-
-        $parser = new SimpleTestXmlParser($listener);
-        $parser->parse("<?xml version=\"1.0\"?>\n");
-        $parser->parse("<run>\n");
-
-        $this->assertTrue($parser->parse("<group size=\"7\">\n"));
-        $this->assertTrue($parser->parse("<name>a_group</name>\n"));
-        $this->assertTrue($parser->parse("<group size=\"3\">\n"));
-        $this->assertTrue($parser->parse("<name>b_group</name>\n"));
-        $this->assertTrue($parser->parse("</group>\n"));
-        $this->assertTrue($parser->parse("</group>\n"));
-        $parser->parse("</run>\n");
-    }
-}
-
-class AnyOldSignal {
-    public $stuff = true;
-}
-
-class TestOfXmlResultsParsing extends UnitTestCase {
-
-    function sendValidStart(&$parser) {
-        $parser->parse("<?xml version=\"1.0\"?>\n");
-        $parser->parse("<run>\n");
-        $parser->parse("<case>\n");
-        $parser->parse("<name>a_case</name>\n");
-        $parser->parse("<test>\n");
-        $parser->parse("<name>a_method</name>\n");
-    }
-
-    function sendValidEnd(&$parser) {
-        $parser->parse("</test>\n");
-        $parser->parse("</case>\n");
-        $parser->parse("</run>\n");
-    }
-
-    function testPass() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintPass', array('a_message'));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse("<pass>a_message</pass>\n"));
-        $this->sendValidEnd($parser);
-    }
-
-    function testFail() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintFail', array('a_message'));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse("<fail>a_message</fail>\n"));
-        $this->sendValidEnd($parser);
-    }
-
-    function testException() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintError', array('a_message'));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse("<exception>a_message</exception>\n"));
-        $this->sendValidEnd($parser);
-    }
-
-    function testSkip() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintSkip', array('a_message'));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse("<skip>a_message</skip>\n"));
-        $this->sendValidEnd($parser);
-    }
-
-    function testSignal() {
-        $signal = new AnyOldSignal();
-        $signal->stuff = "Hello";
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintSignal', array('a_signal', $signal));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse(
-                "<signal type=\"a_signal\"><![CDATA[" .
-                serialize($signal) . "]]></signal>\n"));
-        $this->sendValidEnd($parser);
-    }
-
-    function testMessage() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintMessage', array('a_message'));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse("<message>a_message</message>\n"));
-        $this->sendValidEnd($parser);
-    }
-
-    function testFormattedMessage() {
-        $listener = new MockSimpleScorer();
-        $listener->expectOnce('paintFormattedMessage', array("\na\tmessage\n"));
-        $parser = new SimpleTestXmlParser($listener);
-        $this->sendValidStart($parser);
-        $this->assertTrue($parser->parse("<formatted><![CDATA[\na\tmessage\n]]></formatted>\n"));
-        $this->sendValidEnd($parser);
-    }
-}
-?>
\ No newline at end of file
diff --git a/apps/admin_dependencies_chk/appinfo/app.php b/apps/admin_dependencies_chk/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/admin_dependencies_chk/settings.php b/apps/admin_dependencies_chk/settings.php
old mode 100755
new mode 100644
diff --git a/apps/admin_migrate/appinfo/app.php b/apps/admin_migrate/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/admin_migrate/settings.php b/apps/admin_migrate/settings.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/addBm.php b/apps/bookmarks/addBm.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/ajax/delBookmark.php b/apps/bookmarks/ajax/delBookmark.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/ajax/editBookmark.php b/apps/bookmarks/ajax/editBookmark.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/ajax/recordClick.php b/apps/bookmarks/ajax/recordClick.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/appinfo/migrate.php b/apps/bookmarks/appinfo/migrate.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/index.php b/apps/bookmarks/index.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js
index 73986e491860a28c17f4013c65acd50c1f51f686..a746cf437bf9d209cee4b5debee629b2984801b8 100644
--- a/apps/bookmarks/js/bookmarks.js
+++ b/apps/bookmarks/js/bookmarks.js
@@ -60,7 +60,14 @@ function addOrEditBookmark(event) {
 	var title = encodeEntities($('#bookmark_add_title').val());
 	var tags = encodeEntities($('#bookmark_add_tags').val());
 	$("#firstrun").hide();
-
+	if($.trim(url) == '') {
+		OC.dialogs.alert('A valid bookmark url must be provided', 'Error creating bookmark');
+		return false;
+	}
+	if($.trim(title) == '') {
+		OC.dialogs.alert('A valid bookmark title must be provided', 'Error creating bookmark');
+		return false;
+	}
 	if (id == 0) {
 		$.ajax({
 			url: OC.filePath('bookmarks', 'ajax', 'addBookmark.php'),
@@ -115,11 +122,8 @@ function showBookmark(event) {
 	if ($('.bookmarks_add').css('display') == 'none') {
 		$('.bookmarks_add').slideToggle();
 	}
-	$('html, body').animate({
-      scrollTop: ($('.bookmarks_menu'))?$('.bookmarks_menu').offset().top:0
-		}, 500);
-
 }
+
 function replaceQueryString(url,param,value) {
     var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i");
     if (url.match(re))
diff --git a/apps/bookmarks/lib/bookmarks.php b/apps/bookmarks/lib/bookmarks.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/lib/search.php b/apps/bookmarks/lib/search.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/settings.php b/apps/bookmarks/settings.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/templates/bookmarklet.php b/apps/bookmarks/templates/bookmarklet.php
old mode 100755
new mode 100644
diff --git a/apps/bookmarks/templates/list.php b/apps/bookmarks/templates/list.php
index ced6154c1986533749e215f02d9190cfcd45071c..fdd2b19f79ac0dcee2ce737cdb57c26a975c66e2 100644
--- a/apps/bookmarks/templates/list.php
+++ b/apps/bookmarks/templates/list.php
@@ -7,7 +7,7 @@
  * See the COPYING-README file.
  */
 ?>
-<input type="hidden" id="bookmarkFilterTag" value="<?php if(isset($_GET['tag'])) echo htmlentities($_GET['tag']); ?>" />
+<input type="hidden" id="bookmarkFilterTag" value="<?php if(isset($_GET['tag'])) echo htmlentities($_GET['tag'],ENT_COMPAT,'utf-8'); ?>" />
 <div id="controls">
 	<input type="hidden" id="bookmark_add_id" value="0" />
 	<input type="text" id="bookmark_add_url" placeholder="<?php echo $l->t('Address'); ?>" class="bookmarks_input" />
diff --git a/apps/calendar/ajax/calendar/activation.php b/apps/calendar/ajax/calendar/activation.php
old mode 100755
new mode 100644
index 3523590aa27df0180aaec803f183385eb3fb7f01..380db6a9437c46aae0ecc2546459d31c48f8bda5
--- a/apps/calendar/ajax/calendar/activation.php
+++ b/apps/calendar/ajax/calendar/activation.php
@@ -10,7 +10,11 @@
 OCP\JSON::checkLoggedIn();
 OCP\JSON::checkAppEnabled('calendar');
 $calendarid = $_POST['calendarid'];
-$calendar = OC_Calendar_App::getCalendar($calendarid);//access check
+$calendar = OC_Calendar_App::getCalendar($calendarid, true);
+if(!$calendar){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
 OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']);
 $calendar = OC_Calendar_App::getCalendar($calendarid);
 OCP\JSON::success(array(
diff --git a/apps/calendar/ajax/calendar/delete.php b/apps/calendar/ajax/calendar/delete.php
old mode 100755
new mode 100644
index a36a05346500c436b64892fb19e3257451c6548b..9e092f2df1d931d9c4cd9d32bb21db3460c8a412
--- a/apps/calendar/ajax/calendar/delete.php
+++ b/apps/calendar/ajax/calendar/delete.php
@@ -11,7 +11,11 @@ OCP\JSON::checkLoggedIn();
 OCP\JSON::checkAppEnabled('calendar');
 
 $cal = $_POST["calendarid"];
-$calendar = OC_Calendar_App::getCalendar($cal);
+$calendar = OC_Calendar_App::getCalendar($cal, true);
+if(!$calendar){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
 $del = OC_Calendar_Calendar::deleteCalendar($cal);
 if($del == true){
 	OCP\JSON::success();
diff --git a/apps/calendar/ajax/calendar/edit.form.php b/apps/calendar/ajax/calendar/edit.form.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/calendar/edit.php b/apps/calendar/ajax/calendar/edit.php
old mode 100755
new mode 100644
index 77366809311ced6709508d3b0f0372eaccf2fc16..516c9f6c765c81237ad0265720708e70d346bea8
--- a/apps/calendar/ajax/calendar/edit.php
+++ b/apps/calendar/ajax/calendar/edit.php
@@ -11,7 +11,11 @@ OCP\JSON::checkLoggedIn();
 OCP\JSON::checkAppEnabled('calendar');
 
 $calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions();
-$calendar = OC_Calendar_App::getCalendar($_GET['calendarid']);
+$calendar = OC_Calendar_App::getCalendar($_GET['calendarid'], true);
+if(!$calendar){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
 $tmpl = new OCP\Template("calendar", "part.editcalendar");
 $tmpl->assign('new', false);
 $tmpl->assign('calendarcolor_options', $calendarcolor_options);
diff --git a/apps/calendar/ajax/calendar/new.form.php b/apps/calendar/ajax/calendar/new.form.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/calendar/new.php b/apps/calendar/ajax/calendar/new.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/calendar/overview.php b/apps/calendar/ajax/calendar/overview.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/calendar/update.php b/apps/calendar/ajax/calendar/update.php
old mode 100755
new mode 100644
index 3b1cc32b3165bfc7cf2d5c4e2c9e6d3f8e5459ef..dce0027304aba8086bb16b80c1162ac205dc3bcb
--- a/apps/calendar/ajax/calendar/update.php
+++ b/apps/calendar/ajax/calendar/update.php
@@ -25,7 +25,11 @@ foreach($calendars as $cal){
 }
 
 $calendarid = $_POST['id'];
-$calendar = OC_Calendar_App::getCalendar($calendarid);//access check
+$calendar = OC_Calendar_App::getCalendar($calendarid, true);
+if(!$calendar){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
 OC_Calendar_Calendar::editCalendar($calendarid, strip_tags($_POST['name']), null, null, null, $_POST['color']);
 OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']);
 
diff --git a/apps/calendar/ajax/categories/rescan.php b/apps/calendar/ajax/categories/rescan.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/changeview.php b/apps/calendar/ajax/changeview.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/delete.php b/apps/calendar/ajax/event/delete.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/edit.form.php b/apps/calendar/ajax/event/edit.form.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/edit.php b/apps/calendar/ajax/event/edit.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/move.php b/apps/calendar/ajax/event/move.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/new.form.php b/apps/calendar/ajax/event/new.form.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/new.php b/apps/calendar/ajax/event/new.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/event/resize.php b/apps/calendar/ajax/event/resize.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/import/dialog.php b/apps/calendar/ajax/import/dialog.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/import/import.php b/apps/calendar/ajax/import/import.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/getfirstday.php b/apps/calendar/ajax/settings/getfirstday.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/gettimezonedetection.php b/apps/calendar/ajax/settings/gettimezonedetection.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/guesstimezone.php b/apps/calendar/ajax/settings/guesstimezone.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/setfirstday.php b/apps/calendar/ajax/settings/setfirstday.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/settimeformat.php b/apps/calendar/ajax/settings/settimeformat.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/settimezone.php b/apps/calendar/ajax/settings/settimezone.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/timeformat.php b/apps/calendar/ajax/settings/timeformat.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/settings/timezonedetection.php b/apps/calendar/ajax/settings/timezonedetection.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/share/activation.php b/apps/calendar/ajax/share/activation.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/share/changepermission.php b/apps/calendar/ajax/share/changepermission.php
old mode 100755
new mode 100644
index e4a4f186ab06548457eecb15467e7fd6802b1959..2737420c94ede4c2717f8008cd163c040d401242
--- a/apps/calendar/ajax/share/changepermission.php
+++ b/apps/calendar/ajax/share/changepermission.php
@@ -17,6 +17,14 @@ switch($idtype){
 		OCP\JSON::error(array('message'=>'unexspected parameter'));
 		exit;
 }
+if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
+if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
 $sharewith = $_GET['sharewith'];
 $sharetype = strip_tags($_GET['sharetype']);
 switch($sharetype){
diff --git a/apps/calendar/ajax/share/dropdown.php b/apps/calendar/ajax/share/dropdown.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/share/share.php b/apps/calendar/ajax/share/share.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/ajax/share/unshare.php b/apps/calendar/ajax/share/unshare.php
old mode 100755
new mode 100644
index cbd5ed8e505bbe8c511e919578316be2c8a2c49d..fe7c98452d7e14528dd4d9532944d1ee51350756
--- a/apps/calendar/ajax/share/unshare.php
+++ b/apps/calendar/ajax/share/unshare.php
@@ -16,6 +16,14 @@ switch($idtype){
 		OCP\JSON::error(array('message'=>'unexspected parameter'));
 		exit;
 }
+if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
+if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){
+	OCP\JSON::error(array('message'=>'permission denied'));
+	exit;
+}
 $sharewith = $_GET['sharewith'];
 $sharetype = strip_tags($_GET['sharetype']);
 switch($sharetype){
diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/appinfo/remote.php b/apps/calendar/appinfo/remote.php
old mode 100755
new mode 100644
index 7ff6a2fbbe2b3cbc00111bac59adb9d7f8258dbe..3bd8737ee974831bc6577f83b1bad2640c973215
--- a/apps/calendar/appinfo/remote.php
+++ b/apps/calendar/appinfo/remote.php
@@ -7,6 +7,14 @@
  */
 OCP\App::checkAppEnabled('calendar');
 
+if(substr($_SERVER["REQUEST_URI"],0,strlen(OC::$APPSWEBROOT . '/apps/calendar/caldav.php')) == OC::$APPSWEBROOT . '/apps/calendar/caldav.php'){
+	$baseuri = OC::$APPSWEBROOT . '/apps/calendar/caldav.php';
+}
+
+// only need authentication apps
+$RUNTIME_APPTYPES=array('authentication');
+OC_App::loadApps($RUNTIME_APPTYPES);
+
 // Backends
 $authBackend = new OC_Connector_Sabre_Auth();
 $principalBackend = new OC_Connector_Sabre_Principal();
diff --git a/apps/calendar/appinfo/update.php b/apps/calendar/appinfo/update.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/caldav.php b/apps/calendar/caldav.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b811d3cdf1225da95b546c69564198cfc8bba9e
--- /dev/null
+++ b/apps/calendar/caldav.php
@@ -0,0 +1,6 @@
+<?php
+if(!file_exists('../../lib/base.php')){
+	die('Please update the path to /lib/base.php in caldav.php or make use of /remote.php/caldav/');
+}
+require_once('../../lib/base.php');
+require_once('appinfo/remote.php');
\ No newline at end of file
diff --git a/apps/calendar/export.php b/apps/calendar/export.php
old mode 100755
new mode 100644
index 0756e1df20e3cda05b31ff760e28d8c124b1f329..5780d191a57bd308c2aa7ac0344c67801aaa28d3
--- a/apps/calendar/export.php
+++ b/apps/calendar/export.php
@@ -14,6 +14,10 @@ $event = isset($_GET['eventid']) ? $_GET['eventid'] : NULL;
 $nl = "\r\n";
 if(isset($cal)){
 	$calendar = OC_Calendar_App::getCalendar($cal, true);
+	if(!$calendar){
+		header('HTTP/1.0 404 Not Found');
+		exit;
+	}
 	$calobjects = OC_Calendar_Object::all($cal);
 	header('Content-Type: text/Calendar');
 	header('Content-Disposition: inline; filename=' . $calendar['displayname'] . '.ics'); 
@@ -22,6 +26,10 @@ if(isset($cal)){
 	}
 }elseif(isset($event)){
 	$data = OC_Calendar_App::getEventObject($_GET['eventid'], true);
+	if(!$data){
+		header('HTTP/1.0 404 Not Found');
+		exit;
+	}
 	$calendarid = $data['calendarid'];
 	$calendar = OC_Calendar_App::getCalendar($calendarid);
 	header('Content-Type: text/Calendar');
diff --git a/apps/calendar/index.php b/apps/calendar/index.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js
index f2e5071ba3c098cc761b88b369bfa599318fb825..243ce1798bc5d0889de4e537901810252bc2b5a9 100644
--- a/apps/calendar/js/calendar.js
+++ b/apps/calendar/js/calendar.js
@@ -379,6 +379,7 @@ Calendar={
 					$('#dialog_holder').load(OC.filePath('calendar', 'ajax/calendar', 'overview.php'), function(){
 						$('#choosecalendar_dialog').dialog({
 							width : 600,
+							height: 400,
 							close : function(event, ui) {
 								$(this).dialog('destroy').remove();
 							}
@@ -543,7 +544,7 @@ Calendar={
 				$('#share_user').live('change', function(){
 					if($('#sharewithuser_' + $('#share_user option:selected').text()).length == 0){
 						Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $('#share_user option:selected').text(), 'user');
-						var newitem = '<li id="sharewithuser_' + $('#share_user option:selected').text() +'"><input type="checkbox" width="12px" style="visibility:hidden;" title="' + $('#share_user option:selected').text() + '">' + $('#share_user option:selected').text() + '<img src="/owncloud/core/img/actions/delete.svg" class="svg action" style="display:none;float:right;"></li>';
+						var newitem = '<li id="sharewithuser_' + $('#share_user option:selected').text() +'"><input type="checkbox" width="12px" style="visibility:hidden;" title="' + $('#share_user option:selected').text() + '">' + $('#share_user option:selected').text() + '<img src="' + oc_webroot + '/core/img/actions/delete.svg" class="svg action" style="display:none;float:right;"></li>';
 						$('#sharewithuser_list').append(newitem);
 						$('#sharewithuser_' + $('#share_user option:selected').text() + ' > img').click(function(){
 							$('#share_user option[value="' + $(this).parent().text() + '"]').removeAttr('disabled');
@@ -558,7 +559,7 @@ Calendar={
 				$('#share_group').live('change', function(){
 					if($('#sharewithgroup_' + $('#share_group option:selected').text()).length == 0){
 						Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $('#share_group option:selected').text(), 'group');
-						var newitem = '<li id="sharewithgroup_' + $('#share_group option:selected').text() +'"><input type="checkbox" width="12px" style="visibility:hidden;" title="' + $('#share_group option:selected').text() + '">' + $('#share_group option:selected').text() + '<img src="/owncloud/core/img/actions/delete.svg" class="svg action" style="display:none;float:right;"></li>';
+						var newitem = '<li id="sharewithgroup_' + $('#share_group option:selected').text() +'"><input type="checkbox" width="12px" style="visibility:hidden;" title="' + $('#share_group option:selected').text() + '">' + $('#share_group option:selected').text() + '<img src="' + oc_webroot + '/core/img/actions/delete.svg" class="svg action" style="display:none;float:right;"></li>';
 						$('#sharewithgroup_list').append(newitem);
 						$('#sharewithgroup_' + $('#share_group option:selected').text() + ' > img').click(function(){
 							$('#share_group option[value="' + $(this).parent().text() + '"]').removeAttr('disabled');
diff --git a/apps/calendar/l10n/ca.php b/apps/calendar/l10n/ca.php
index 50e9c1fc56e88e510a311cc5115f73ba3f662f6a..afb1c799d93d9e012b30ce39ccf1b0579578163f 100644
--- a/apps/calendar/l10n/ca.php
+++ b/apps/calendar/l10n/ca.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "No s'han trobat calendaris.",
+"No events found." => "No s'han trobat events.",
 "Wrong calendar" => "Calendari erroni",
 "New Timezone:" => "Nova zona horària:",
 "Timezone changed" => "La zona horària ha canviat",
 "Invalid request" => "Sol.licitud no vàlida",
 "Calendar" => "Calendari",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Aniversari",
 "Business" => "Feina",
 "Call" => "Trucada",
@@ -19,6 +22,7 @@
 "Projects" => "Projectes",
 "Questions" => "Preguntes",
 "Work" => "Feina",
+"unnamed" => "sense nom",
 "Does not repeat" => "No es repeteix",
 "Daily" => "Diari",
 "Weekly" => "Mensual",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendaris",
 "There was a fail, while parsing the file." => "S'ha produït un error en analitzar el fitxer.",
 "Choose active calendars" => "Seleccioneu calendaris actius",
+"Your calendars" => "Els vostres calendaris",
 "CalDav Link" => "Enllaç CalDav",
+"Shared calendars" => "Calendaris compartits",
+"No shared calendars" => "No hi ha calendaris compartits",
+"Share Calendar" => "Comparteix el calendari",
 "Download" => "Baixa",
 "Edit" => "Edita",
 "Delete" => "Suprimeix",
+"shared with you by" => "compartit amb vós",
 "New calendar" => "Calendari nou",
 "Edit calendar" => "Edita el calendari",
 "Displayname" => "Mostra el nom",
@@ -94,8 +103,15 @@
 "Cancel" => "Cancel·la",
 "Edit an event" => "Edició d'un esdeveniment",
 "Export" => "Exporta",
+"Eventinfo" => "Eventinfo",
+"Repeating" => "Repetició",
+"Alarm" => "Alarma",
+"Attendees" => "Assistents",
+"Share" => "Comparteix",
 "Title of the Event" => "Títol de l'esdeveniment",
 "Category" => "Categoria",
+"Separate categories with commas" => "Separeu les categories amb comes",
+"Edit categories" => "Edita categories",
 "All Day Event" => "Esdeveniment de tot el dia",
 "From" => "Des de",
 "To" => "Fins a",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "El calendari s'ha importat amb èxit",
 "Close Dialog" => "Tanca el diàleg",
 "Create a new event" => "Crea un nou esdeveniment",
+"View an event" => "Mostra un event",
+"No categories selected" => "No hi ha categories seleccionades",
 "Select category" => "Seleccioneu categoria",
+"of" => "de",
+"at" => "a",
 "Timezone" => "Zona horària",
 "Check always for changes of the timezone" => "Comprova sempre en els canvis de zona horària",
 "Timeformat" => "Format de temps",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Adreça de sincronització del calendari CalDAV:"
+"First day of the week" => "Primer dia de la setmana",
+"Calendar CalDAV syncing address:" => "Adreça de sincronització del calendari CalDAV:",
+"Users" => "Usuaris",
+"select users" => "seleccioneu usuaris",
+"Editable" => "Editable",
+"Groups" => "Grups",
+"select groups" => "seleccioneu grups",
+"make public" => "fes-ho public"
 );
diff --git a/apps/calendar/l10n/cs_CZ.php b/apps/calendar/l10n/cs_CZ.php
index 5149aea8fe5b1bae6d786152cdf3acaf97640761..05d286d82c1a4af4ca35e8e03785b43ff6e98fca 100644
--- a/apps/calendar/l10n/cs_CZ.php
+++ b/apps/calendar/l10n/cs_CZ.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Žádné kalendáře nenalezeny.",
+"No events found." => "Žádné události nenalezeny.",
 "Wrong calendar" => "Nesprávný kalendář",
 "New Timezone:" => "Nová časová zóna:",
 "Timezone changed" => "Časová zóna byla změněna",
 "Invalid request" => "Chybný požadavek",
 "Calendar" => "Kalendář",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "d. MMM[ yyyy]{ '&#8212;' d.[ MMM] yyyy}",
 "Birthday" => "Narozeniny",
 "Business" => "Obchodní",
 "Call" => "Hovor",
@@ -19,6 +22,7 @@
 "Projects" => "Projekty",
 "Questions" => "Dotazy",
 "Work" => "Pracovní",
+"unnamed" => "nepojmenováno",
 "Does not repeat" => "Neopakuje se",
 "Daily" => "Denně",
 "Weekly" => "Týdně",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendáře",
 "There was a fail, while parsing the file." => "Chyba při převodu souboru",
 "Choose active calendars" => "Vybrat aktivní kalendář",
+"Your calendars" => "Vaše kalendáře",
 "CalDav Link" => "CalDav odkaz",
+"Shared calendars" => "Sdílené kalendáře",
+"No shared calendars" => "Žádné sdílené kalendáře",
+"Share Calendar" => "Sdílet kalendář",
 "Download" => "Stáhnout",
 "Edit" => "Editovat",
 "Delete" => "Odstranit",
+"shared with you by" => "sdíleno s vámi uživatelem",
 "New calendar" => "Nový kalendář",
 "Edit calendar" => "Editovat kalendář",
 "Displayname" => "Zobrazované jméno",
@@ -94,8 +103,15 @@
 "Cancel" => "Storno",
 "Edit an event" => "Editovat událost",
 "Export" => "Export",
+"Eventinfo" => "Informace o události",
+"Repeating" => "Opakující se",
+"Alarm" => "Alarm",
+"Attendees" => "Účastníci",
+"Share" => "Sdílet",
 "Title of the Event" => "Název události",
 "Category" => "Kategorie",
+"Separate categories with commas" => "Kategorie oddělené čárkami",
+"Edit categories" => "Upravit kategorie",
 "All Day Event" => "Celodenní událost",
 "From" => "od",
 "To" => "do",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Kalendář byl úspěšně importován",
 "Close Dialog" => "Zavřít dialog",
 "Create a new event" => "Vytvořit novou událost",
+"View an event" => "Zobrazit událost",
+"No categories selected" => "Žádné kategorie nevybrány",
 "Select category" => "Vyberte kategorii",
+"of" => "z",
+"at" => "v",
 "Timezone" => "Časové pásmo",
 "Check always for changes of the timezone" => "Vždy kontrolavat, zda nedošlo ke změně časového pásma",
 "Timeformat" => "Formát času",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Adresa pro synchronizaci kalendáře pomocí CalDAV:"
+"First day of the week" => "Týden začína v",
+"Calendar CalDAV syncing address:" => "Adresa pro synchronizaci kalendáře pomocí CalDAV:",
+"Users" => "Uživatelé",
+"select users" => "vybrat uživatele",
+"Editable" => "Upravovatelné",
+"Groups" => "Skupiny",
+"select groups" => "vybrat skupiny",
+"make public" => "zveřejnit"
 );
diff --git a/apps/calendar/l10n/de.php b/apps/calendar/l10n/de.php
index 47d8145e12dbdeda0bf8b976081c1b74cb1d6d0e..34e6f05f100473fd6b08c600dedbf96d8eb20913 100644
--- a/apps/calendar/l10n/de.php
+++ b/apps/calendar/l10n/de.php
@@ -1,4 +1,6 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Keine Kalender gefunden",
+"No events found." => "Keine Termine gefunden",
 "Wrong calendar" => "Falscher Kalender",
 "New Timezone:" => "Neue Zeitzone:",
 "Timezone changed" => "Zeitzone geändert",
@@ -19,6 +21,7 @@
 "Projects" => "Projekte",
 "Questions" => "Fragen",
 "Work" => "Arbeit",
+"unnamed" => "unbenannt",
 "Does not repeat" => "einmalig",
 "Daily" => "täglich",
 "Weekly" => "wöchentlich",
@@ -80,10 +83,15 @@
 "Calendars" => "Kalender",
 "There was a fail, while parsing the file." => "Fehler beim Einlesen der Datei.",
 "Choose active calendars" => "Aktive Kalender wählen",
+"Your calendars" => "Deine Kalender",
 "CalDav Link" => "CalDAV-Link",
+"Shared calendars" => "geteilte Kalender",
+"No shared calendars" => "Keine geteilten Kalender",
+"Share Calendar" => "Kalender teilen",
 "Download" => "Herunterladen",
 "Edit" => "Bearbeiten",
 "Delete" => "Löschen",
+"shared with you by" => "Von dir geteilt mit",
 "New calendar" => "Neuer Kalender",
 "Edit calendar" => "Kalender bearbeiten",
 "Displayname" => "Anzeigename",
@@ -94,8 +102,15 @@
 "Cancel" => "Abbrechen",
 "Edit an event" => "Ereignis bearbeiten",
 "Export" => "Exportieren",
+"Eventinfo" => "Termininfo",
+"Repeating" => "Wiederholen",
+"Alarm" => "Alarm",
+"Attendees" => "Teilnehmer",
+"Share" => "Teilen",
 "Title of the Event" => "Name",
 "Category" => "Kategorie",
+"Separate categories with commas" => "Kategorien trennen mittels Komma",
+"Edit categories" => "Kategorien ändern",
 "All Day Event" => "Ganztägiges Ereignis",
 "From" => "von",
 "To" => "bis",
@@ -125,11 +140,21 @@
 "Calendar imported successfully" => "Kalender erfolgreich importiert",
 "Close Dialog" => "Dialog schließen",
 "Create a new event" => "Neues Ereignis",
+"View an event" => "Termin öffnen",
+"No categories selected" => "Keine Kategorie ausgewählt",
 "Select category" => "Kategorie auswählen",
+"of" => "von",
 "Timezone" => "Zeitzone",
 "Check always for changes of the timezone" => "immer die Zeitzone überprüfen",
 "Timeformat" => "Zeitformat",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Kalender CalDAV Synchronisationsadresse:"
+"First day of the week" => "erster Wochentag",
+"Calendar CalDAV syncing address:" => "Kalender CalDAV Synchronisationsadresse:",
+"Users" => "Nutzer",
+"select users" => "gewählte Nutzer",
+"Editable" => "editierbar",
+"Groups" => "Gruppen",
+"select groups" => "Wähle Gruppen",
+"make public" => "Veröffentlichen"
 );
diff --git a/apps/calendar/l10n/el.php b/apps/calendar/l10n/el.php
index 53eaf452a4d754f03a099e32bfb62df376fcd7b3..0b289fbcf6848f8d6f6d00745050fe684da0cc72 100644
--- a/apps/calendar/l10n/el.php
+++ b/apps/calendar/l10n/el.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Δε βρέθηκαν ημερολόγια.",
+"No events found." => "Δε βρέθηκαν γεγονότα.",
 "Wrong calendar" => "Λάθος ημερολόγιο",
 "New Timezone:" => "Νέα ζώνη ώρας:",
 "Timezone changed" => "Η ζώνη ώρας άλλαξε",
 "Invalid request" => "Μη έγκυρο αίτημα",
 "Calendar" => "Ημερολόγιο",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Γενέθλια",
 "Business" => "Επιχείρηση",
 "Call" => "Κλήση",
@@ -19,6 +22,7 @@
 "Projects" => "Έργα",
 "Questions" => "Ερωτήσεις",
 "Work" => "Εργασία",
+"unnamed" => "ανώνυμο",
 "Does not repeat" => "Μη επαναλαμβανόμενο",
 "Daily" => "Καθημερινά",
 "Weekly" => "Εβδομαδιαία",
@@ -78,12 +82,17 @@
 "List" => "Λίστα",
 "Today" => "Σήμερα",
 "Calendars" => "Ημερολόγια",
-"There was a fail, while parsing the file." => "Υπήρξε μια αποτυχία, κατά την αξιολόγηση του αρχείου.",
+"There was a fail, while parsing the file." => "Υπήρξε μια αποτυχία, κατά την σάρωση του αρχείου.",
 "Choose active calendars" => "Επιλέξτε τα ενεργά ημερολόγια",
+"Your calendars" => "Τα ημερολόγια σου",
 "CalDav Link" => "Σύνδεση CalDAV",
+"Shared calendars" => "Κοινόχρηστα ημερολόγια",
+"No shared calendars" => "Δεν υπάρχουν κοινόχρηστα ημερολόγια",
+"Share Calendar" => "Διαμοίρασε ένα ημερολόγιο",
 "Download" => "Λήψη",
 "Edit" => "Επεξεργασία",
 "Delete" => "Διαγραφή",
+"shared with you by" => "μοιράστηκε μαζί σας από ",
 "New calendar" => "Νέο ημερολόγιο",
 "Edit calendar" => "Επεξεργασία ημερολογίου",
 "Displayname" => "Προβολή ονόματος",
@@ -94,8 +103,15 @@
 "Cancel" => "Ακύρωση",
 "Edit an event" => "Επεξεργασία ενός γεγονότος",
 "Export" => "Εξαγωγή",
+"Eventinfo" => "Πληροφορίες γεγονότος",
+"Repeating" => "Επαναλαμβανόμενο",
+"Alarm" => "Ειδοποίηση",
+"Attendees" => "Συμμετέχοντες",
+"Share" => "Διαμοίρασε",
 "Title of the Event" => "Τίτλος συμβάντος",
 "Category" => "Κατηγορία",
+"Separate categories with commas" => "Διαχώρισε τις κατηγορίες με κόμμα",
+"Edit categories" => "Επεξεργασία κατηγοριών",
 "All Day Event" => "Ολοήμερο συμβάν",
 "From" => "Από",
 "To" => "Έως",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Το ημερολόγιο εισήχθει επιτυχώς",
 "Close Dialog" => "Κλείσιμο Διαλόγου",
 "Create a new event" => "Δημιουργήστε ένα νέο συμβάν",
+"View an event" => "Εμφάνισε ένα γεγονός",
+"No categories selected" => "Δεν επελέγησαν  κατηγορίες",
 "Select category" => "Επιλέξτε κατηγορία",
+"of" => "του",
+"at" => "στο",
 "Timezone" => "Ζώνη ώρας",
 "Check always for changes of the timezone" => "Έλεγχος πάντα για τις αλλαγές της ζώνης ώρας",
 "Timeformat" => "Μορφή ώρας",
 "24h" => "24ω",
 "12h" => "12ω",
-"Calendar CalDAV syncing address:" => "Διεύθυνση για το συγχρονισμού του ημερολογίου CalDAV:"
+"First day of the week" => "Πρώτη μέρα της εβδομάδας",
+"Calendar CalDAV syncing address:" => "Διεύθυνση για το συγχρονισμού του ημερολογίου CalDAV:",
+"Users" => "Χρήστες",
+"select users" => "επέλεξε χρήστες",
+"Editable" => "Επεξεργάσιμο",
+"Groups" => "Ομάδες",
+"select groups" => "Επέλεξε ομάδες",
+"make public" => "κάνε το δημόσιο"
 );
diff --git a/apps/calendar/l10n/eo.php b/apps/calendar/l10n/eo.php
index 3b65ef63dd061c7e3336f7b66d45645277776fea..b1127d59ca99ede55d0d64bce1bcba7d644e874f 100644
--- a/apps/calendar/l10n/eo.php
+++ b/apps/calendar/l10n/eo.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Neniu kalendaro troviĝis.",
+"No events found." => "Neniu okazaĵo troviĝis.",
 "Wrong calendar" => "Malĝusta kalendaro",
 "New Timezone:" => "Nova horzono:",
 "Timezone changed" => "La horozono estas ŝanĝita",
 "Invalid request" => "Nevalida peto",
 "Calendar" => "Kalendaro",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '&#8212;'d[ MMM] yyyy}",
 "Birthday" => "Naskiĝotago",
 "Business" => "Negoco",
 "Call" => "Voko",
@@ -19,10 +22,11 @@
 "Projects" => "Projektoj",
 "Questions" => "Demandoj",
 "Work" => "Laboro",
+"unnamed" => "nenomita",
 "Does not repeat" => "Ĉi tio ne ripetiĝas",
 "Daily" => "Tage",
 "Weekly" => "Semajne",
-"Every Weekday" => "Tage",
+"Every Weekday" => "Labortage",
 "Bi-Weekly" => "Semajnduope",
 "Monthly" => "Monate",
 "Yearly" => "Jare",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendaroj",
 "There was a fail, while parsing the file." => "Malsukceso okazis dum analizo de la dosiero.",
 "Choose active calendars" => "Elektu aktivajn kalendarojn",
+"Your calendars" => "Viaj kalendaroj",
 "CalDav Link" => "CalDav-a ligilo",
+"Shared calendars" => "Kunhavigitaj kalendaroj",
+"No shared calendars" => "Neniu kunhavigita kalendaro",
+"Share Calendar" => "Kunhavigi kalendaron",
 "Download" => "Elŝuti",
 "Edit" => "Redakti",
 "Delete" => "Forigi",
+"shared with you by" => "kunhavigita kun vi fare de",
 "New calendar" => "Nova kalendaro",
 "Edit calendar" => "Redakti la kalendaron",
 "Displayname" => "Montrota nomo",
@@ -94,14 +103,21 @@
 "Cancel" => "Nuligi",
 "Edit an event" => "Redakti okazaĵon",
 "Export" => "Elporti",
+"Eventinfo" => "Informo de okazaĵo",
+"Repeating" => "Ripetata",
+"Alarm" => "Alarmo",
+"Attendees" => "Ĉeestontoj",
+"Share" => "Kunhavigi",
 "Title of the Event" => "Okazaĵotitolo",
 "Category" => "Kategorio",
+"Separate categories with commas" => "Disigi kategoriojn per komoj",
+"Edit categories" => "Redakti kategoriojn",
 "All Day Event" => "La tuta tago",
 "From" => "Ekde",
 "To" => "Ĝis",
 "Advanced options" => "Altnivela agordo",
 "Location" => "Loko",
-"Location of the Event" => "Okazaĵoloko",
+"Location of the Event" => "Loko de okazaĵo",
 "Description" => "Priskribo",
 "Description of the Event" => "Okazaĵopriskribo",
 "Repeat" => "Ripeti",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "La kalendaro enportiĝis sukcese",
 "Close Dialog" => "Fermi la dialogon",
 "Create a new event" => "Krei okazaĵon",
+"View an event" => "Vidi okazaĵon",
+"No categories selected" => "Neniu kategorio elektita",
 "Select category" => "Elekti kategorion",
+"of" => "de",
+"at" => "ĉe",
 "Timezone" => "Horozono",
 "Check always for changes of the timezone" => "Ĉiam kontroli ĉu la horzono ŝanĝiĝis",
 "Timeformat" => "Tempoformo",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Adreso de kalendarosinkronigo per CalDAV:"
+"First day of the week" => "Unua tago de la semajno",
+"Calendar CalDAV syncing address:" => "Adreso de kalendarosinkronigo per CalDAV:",
+"Users" => "Uzantoj",
+"select users" => "elekti uzantojn",
+"Editable" => "Redaktebla",
+"Groups" => "Grupoj",
+"select groups" => "elekti grupojn",
+"make public" => "publikigi"
 );
diff --git a/apps/calendar/l10n/es.php b/apps/calendar/l10n/es.php
index e667ee10b8196bb2ede1ad4c32a605ac562784b9..4cd9e3202bf36b6619cbb1ee18638ca85b9d8905 100644
--- a/apps/calendar/l10n/es.php
+++ b/apps/calendar/l10n/es.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "No se encontraron calendarios.",
+"No events found." => "No se encontraron eventos.",
 "Wrong calendar" => "Calendario incorrecto",
 "New Timezone:" => "Nueva zona horaria:",
 "Timezone changed" => "Zona horaria cambiada",
 "Invalid request" => "Petición no válida",
 "Calendar" => "Calendario",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Cumpleaños",
 "Business" => "Negocios",
 "Call" => "Llamada",
@@ -19,6 +22,7 @@
 "Projects" => "Proyectos",
 "Questions" => "Preguntas",
 "Work" => "Trabajo",
+"unnamed" => "Sin nombre",
 "Does not repeat" => "No se repite",
 "Daily" => "Diariamente",
 "Weekly" => "Semanalmente",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendarios",
 "There was a fail, while parsing the file." => "Se ha producido un fallo al analizar el archivo.",
 "Choose active calendars" => "Elige los calendarios activos",
+"Your calendars" => "Tus calendarios",
 "CalDav Link" => "Enlace a CalDav",
+"Shared calendars" => "Calendarios compartidos",
+"No shared calendars" => "Calendarios no compartidos",
+"Share Calendar" => "Compartir calendario",
 "Download" => "Descargar",
 "Edit" => "Editar",
 "Delete" => "Eliminar",
+"shared with you by" => "compartido contigo por",
 "New calendar" => "Nuevo calendario",
 "Edit calendar" => "Editar calendario",
 "Displayname" => "Nombre",
@@ -94,8 +103,15 @@
 "Cancel" => "Cancelar",
 "Edit an event" => "Editar un evento",
 "Export" => "Exportar",
+"Eventinfo" => "Información del evento",
+"Repeating" => "Repetición",
+"Alarm" => "Alarma",
+"Attendees" => "Asistentes",
+"Share" => "Compartir",
 "Title of the Event" => "Título del evento",
 "Category" => "Categoría",
+"Separate categories with commas" => "Separar categorías con comas",
+"Edit categories" => "Editar categorías",
 "All Day Event" => "Todo el día",
 "From" => "Desde",
 "To" => "Hasta",
@@ -117,7 +133,7 @@
 "End" => "Fin",
 "occurrences" => "ocurrencias",
 "Import a calendar file" => "Importar un archivo de calendario",
-"Please choose the calendar" => "Elija el calendario",
+"Please choose the calendar" => "Por favor elige el calendario",
 "create a new calendar" => "Crear un nuevo calendario",
 "Name of new calendar" => "Nombre del nuevo calendario",
 "Import" => "Importar",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Calendario importado exitosamente",
 "Close Dialog" => "Cerrar diálogo",
 "Create a new event" => "Crear un nuevo evento",
+"View an event" => "Ver un evento",
+"No categories selected" => "Ninguna categoría seleccionada",
 "Select category" => "Seleccionar categoría",
+"of" => "de",
+"at" => "a las",
 "Timezone" => "Zona horaria",
 "Check always for changes of the timezone" => "Comprobar siempre por cambios en la zona horaria",
 "Timeformat" => "Formato de hora",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Dirección de sincronización de calendario CalDAV:"
+"First day of the week" => "Primer día de la semana",
+"Calendar CalDAV syncing address:" => "Dirección de sincronización de calendario CalDAV:",
+"Users" => "Usuarios",
+"select users" => "seleccionar usuarios",
+"Editable" => "Editable",
+"Groups" => "Grupos",
+"select groups" => "seleccionar grupos",
+"make public" => "hacerlo público"
 );
diff --git a/apps/calendar/l10n/et_EE.php b/apps/calendar/l10n/et_EE.php
index d80bf9edef8d4b3bb3ab7ed336820c546ebd345f..931ca56f5fdbcad0b4ff39f6ef6b846865240d7f 100644
--- a/apps/calendar/l10n/et_EE.php
+++ b/apps/calendar/l10n/et_EE.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Kalendreid ei leitud.",
+"No events found." => "Üritusi ei leitud.",
 "Wrong calendar" => "Vale kalender",
 "New Timezone:" => "Uus ajavöönd:",
 "Timezone changed" => "Ajavöönd on muudetud",
 "Invalid request" => "Vigane päring",
 "Calendar" => "Kalender",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Sünnipäev",
 "Business" => "Äri",
 "Call" => "Helista",
@@ -19,6 +22,7 @@
 "Projects" => "Projektid",
 "Questions" => "Küsimused",
 "Work" => "Töö",
+"unnamed" => "nimetu",
 "Does not repeat" => "Ei kordu",
 "Daily" => "Iga päev",
 "Weekly" => "Iga nädal",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendrid",
 "There was a fail, while parsing the file." => "Faili parsimisel tekkis viga.",
 "Choose active calendars" => "Vali aktiivsed kalendrid",
+"Your calendars" => "Sinu kalendrid",
 "CalDav Link" => "CalDav Link",
+"Shared calendars" => "Jagatud kalendrid",
+"No shared calendars" => "Jagatud kalendreid pole",
+"Share Calendar" => "Jaga kalendrit",
 "Download" => "Lae alla",
 "Edit" => "Muuda",
 "Delete" => "Kustuta",
+"shared with you by" => "jagas sinuga",
 "New calendar" => "Uus kalender",
 "Edit calendar" => "Muuda kalendrit",
 "Displayname" => "Näidatav nimi",
@@ -94,8 +103,15 @@
 "Cancel" => "Loobu",
 "Edit an event" => "Muuda sündmust",
 "Export" => "Ekspordi",
+"Eventinfo" => "Ürituse info",
+"Repeating" => "Kordamine",
+"Alarm" => "Alarm",
+"Attendees" => "Osalejad",
+"Share" => "Jaga",
 "Title of the Event" => "Sündmuse pealkiri",
 "Category" => "Kategooria",
+"Separate categories with commas" => "Eralda kategooriad komadega",
+"Edit categories" => "Muuda kategooriaid",
 "All Day Event" => "Kogu päeva sündmus",
 "From" => "Alates",
 "To" => "Kuni",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Kalender on imporditud",
 "Close Dialog" => "Sulge dialoogiaken",
 "Create a new event" => "Loo sündmus",
+"View an event" => "Vaata üritust",
+"No categories selected" => "Ühtegi kategooriat pole valitud",
 "Select category" => "Salvesta kategooria",
+"of" => "/",
+"at" => "kell",
 "Timezone" => "Ajavöönd",
 "Check always for changes of the timezone" => "Kontrolli alati muudatusi ajavööndis",
 "Timeformat" => "Aja vorming",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Kalendri CalDAV sünkroniseerimise aadress:"
+"First day of the week" => "Nädala esimene päev",
+"Calendar CalDAV syncing address:" => "Kalendri CalDAV sünkroniseerimise aadress:",
+"Users" => "Kasutajad",
+"select users" => "valitud kasutajad",
+"Editable" => "Muudetav",
+"Groups" => "Grupid",
+"select groups" => "valitud grupid",
+"make public" => "tee avalikuks"
 );
diff --git a/apps/calendar/l10n/eu.php b/apps/calendar/l10n/eu.php
index 2cfcbcdb3473ce28adf94ea88a8493157ee49d20..9e1300032f8cf04a771a5f9a4c21da6f728b6ff0 100644
--- a/apps/calendar/l10n/eu.php
+++ b/apps/calendar/l10n/eu.php
@@ -1,4 +1,6 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Ez da egutegirik aurkitu.",
+"No events found." => "Ez da gertaerarik aurkitu.",
 "Wrong calendar" => "Egutegi okerra",
 "New Timezone:" => "Ordu-zonalde berria",
 "Timezone changed" => "Ordu-zonaldea aldatuta",
@@ -19,6 +21,7 @@
 "Projects" => "Proiektuak",
 "Questions" => "Galderak",
 "Work" => "Lana",
+"unnamed" => "izengabea",
 "Does not repeat" => "Ez da errepikatzen",
 "Daily" => "Egunero",
 "Weekly" => "Astero",
@@ -27,6 +30,7 @@
 "Monthly" => "Hilabetero",
 "Yearly" => "Urtero",
 "never" => "inoiz",
+"by occurrences" => "errepikapen kopuruagatik",
 "by date" => "dataren arabera",
 "by monthday" => "hileko egunaren arabera",
 "by weekday" => "asteko egunaren arabera",
@@ -79,10 +83,15 @@
 "Calendars" => "Egutegiak",
 "There was a fail, while parsing the file." => "Huts bat egon da, fitxategia aztertzen zen bitartea.",
 "Choose active calendars" => "Aukeratu egutegi aktiboak",
+"Your calendars" => "Zure egutegiak",
 "CalDav Link" => "CalDav lotura",
+"Shared calendars" => "Elkarbanatutako egutegiak",
+"No shared calendars" => "Ez dago elkarbanatutako egutegirik",
+"Share Calendar" => "Elkarbanatu egutegia",
 "Download" => "Deskargatu",
 "Edit" => "Editatu",
 "Delete" => "Ezabatu",
+"shared with you by" => "honek zurekin elkarbanatu du",
 "New calendar" => "Egutegi berria",
 "Edit calendar" => "Editatu egutegia",
 "Displayname" => "Bistaratzeko izena",
@@ -93,8 +102,15 @@
 "Cancel" => "Ezeztatu",
 "Edit an event" => "Editatu gertaera",
 "Export" => "Exportatu",
+"Eventinfo" => "Gertaeraren informazioa",
+"Repeating" => "Errepikapena",
+"Alarm" => "Alarma",
+"Attendees" => "Partaideak",
+"Share" => "Elkarbanatu",
 "Title of the Event" => "Gertaeraren izenburua",
 "Category" => "Kategoria",
+"Separate categories with commas" => "Banatu kategoriak komekin",
+"Edit categories" => "Editatu kategoriak",
 "All Day Event" => "Egun osoko gertaera",
 "From" => "Hasiera",
 "To" => "Bukaera",
@@ -124,11 +140,20 @@
 "Calendar imported successfully" => "Egutegia ongi inportatu da",
 "Close Dialog" => "Itxi lehioa",
 "Create a new event" => "Sortu gertaera berria",
+"View an event" => "Ikusi gertaera bat",
+"No categories selected" => "Ez da kategoriarik hautatu",
 "Select category" => "Aukeratu kategoria",
 "Timezone" => "Ordu-zonaldea",
 "Check always for changes of the timezone" => "Egiaztatu beti ordu-zonalde aldaketen bila",
 "Timeformat" => "Ordu formatua",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Egutegiaren CalDAV sinkronizazio helbidea"
+"First day of the week" => "Asteko lehenego eguna",
+"Calendar CalDAV syncing address:" => "Egutegiaren CalDAV sinkronizazio helbidea",
+"Users" => "Erabiltzaileak",
+"select users" => "hautatutako erabiltzaileak",
+"Editable" => "Editagarria",
+"Groups" => "Taldeak",
+"select groups" => "hautatutako taldeak",
+"make public" => "publikoa egin"
 );
diff --git a/apps/calendar/l10n/fa.php b/apps/calendar/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd2bb9c2e5ad7069103c1516ae4b6e0b9d8e4448
--- /dev/null
+++ b/apps/calendar/l10n/fa.php
@@ -0,0 +1,162 @@
+<?php $TRANSLATIONS = array(
+"No calendars found." => "هیچ تقویمی پیدا نشد",
+"No events found." => "هیچ رویدادی پیدا نشد",
+"Wrong calendar" => "تقویم اشتباه",
+"New Timezone:" => "زمان محلی جدید",
+"Timezone changed" => "زمان محلی تغییر یافت",
+"Invalid request" => "درخواست نامعتبر",
+"Calendar" => "تقویم",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "DDD m[ yyyy]{ '&#8212;'[ DDD] m yyyy}",
+"Birthday" => "روزتولد",
+"Business" => "تجارت",
+"Call" => "تماس گرفتن",
+"Clients" => "مشتریان",
+"Deliverer" => "نجات",
+"Holidays" => "روزهای تعطیل",
+"Ideas" => "ایده ها",
+"Journey" => "سفر",
+"Jubilee" => "سالگرد",
+"Meeting" => "ملاقات",
+"Other" => "دیگر",
+"Personal" => "شخصی",
+"Projects" => "پروژه ها",
+"Questions" => "سوالات",
+"Work" => "کار",
+"unnamed" => "نام گذاری نشده",
+"Does not repeat" => "تکرار نکنید",
+"Daily" => "روزانه",
+"Weekly" => "هفتهگی",
+"Every Weekday" => "هرروز هفته",
+"Bi-Weekly" => "دوهفته",
+"Monthly" => "ماهانه",
+"Yearly" => "سالانه",
+"never" => "هرگز",
+"by occurrences" => "به وسیله ظهور",
+"by date" => "به وسیله تاریخ",
+"by monthday" => "به وسیله روزهای ماه",
+"by weekday" => "به وسیله روز های هفته",
+"Monday" => "دوشنبه",
+"Tuesday" => "سه شنبه",
+"Wednesday" => "چهارشنبه",
+"Thursday" => "پنجشنبه",
+"Friday" => "جمعه",
+"Saturday" => "شنبه",
+"Sunday" => "یکشنبه",
+"events week of month" => "رویداد های  هفته هایی از ماه",
+"first" => "اولین",
+"second" => "دومین",
+"third" => "سومین",
+"fourth" => "چهارمین",
+"fifth" => "پنجمین",
+"last" => "آخرین",
+"January" => "ژانویه",
+"February" => "فبریه",
+"March" => "مارس",
+"April" => "آوریل",
+"May" => "می",
+"June" => "ژوءن",
+"July" => "جولای",
+"August" => "آگوست",
+"September" => "سپتامبر",
+"October" => "اکتبر",
+"November" => "نوامبر",
+"December" => "دسامبر",
+"by events date" => "به وسیله رویداد های روزانه",
+"by yearday(s)" => "به وسیله روز های سال(ها)",
+"by weeknumber(s)" => "به وسیله شماره هفته(ها)",
+"by day and month" => "به وسیله روز و ماه",
+"Date" => "تاریخ",
+"Cal." => "تقویم.",
+"All day" => "هرروز",
+"New Calendar" => "تقویم جدید",
+"Missing fields" => "فیلد های گم شده",
+"Title" => "عنوان",
+"From Date" => "از تاریخ",
+"From Time" => "از ساعت",
+"To Date" => "به تاریخ",
+"To Time" => "به ساعت",
+"The event ends before it starts" => "رویداد قبل از شروع شدن تمام شده!",
+"There was a database fail" => "یک پایگاه داده فرو مانده است",
+"Week" => "هفته",
+"Month" => "ماه",
+"List" => "فهرست",
+"Today" => "امروز",
+"Calendars" => "تقویم ها",
+"There was a fail, while parsing the file." => "ناتوان در تجزیه پرونده",
+"Choose active calendars" => "تقویم فعال را انتخاب کنید",
+"Your calendars" => "تقویم های شما",
+"CalDav Link" => "CalDav Link",
+"Shared calendars" => "تقویمهای به اشترک گذاری شده",
+"No shared calendars" => "هیچ تقویمی به  اشتراک گذارده نشده",
+"Share Calendar" => "تقویم را به اشتراک بگذارید",
+"Download" => "بارگیری",
+"Edit" => "ویرایش",
+"Delete" => "پاک کردن",
+"shared with you by" => "به اشتراک گذارده شده به وسیله",
+"New calendar" => "تقویم جدید",
+"Edit calendar" => "ویرایش تقویم",
+"Displayname" => "نام برای نمایش",
+"Active" => "فعال",
+"Calendar color" => "رنگ تقویم",
+"Save" => "ذخیره سازی",
+"Submit" => "ارسال",
+"Cancel" => "انصراف",
+"Edit an event" => "ویرایش رویداد",
+"Export" => "خروجی گرفتن",
+"Eventinfo" => "اطلاعات رویداد",
+"Repeating" => "در حال تکرار کردن",
+"Alarm" => "هشدار",
+"Attendees" => "شرکت کنندگان",
+"Share" => "به اشتراک گذاردن",
+"Title of the Event" => "عنوان رویداد",
+"Category" => "نوع",
+"Separate categories with commas" => "گروه ها را به وسیله درنگ نما از هم جدا کنید",
+"Edit categories" => "ویرایش گروه",
+"All Day Event" => "رویداد های روزانه",
+"From" => "از",
+"To" => "به",
+"Advanced options" => "تنظیمات حرفه ای",
+"Location" => "منطقه",
+"Location of the Event" => "منطقه رویداد",
+"Description" => "توضیحات",
+"Description of the Event" => "توضیحات درباره رویداد",
+"Repeat" => "تکرار",
+"Advanced" => "پیشرفته",
+"Select weekdays" => "انتخاب روز های هفته ",
+"Select days" => "انتخاب روز ها",
+"and the events day of year." => "و رویداد های روز از سال",
+"and the events day of month." => "و رویداد های روز از ماه",
+"Select months" => "انتخاب ماه ها",
+"Select weeks" => "انتخاب هفته ها",
+"and the events week of year." => "و رویداد هفته ها از سال",
+"Interval" => "فاصله",
+"End" => "پایان",
+"occurrences" => "ظهور",
+"Import a calendar file" => "یک پرونده حاوی تقویم وارد کنید",
+"Please choose the calendar" => "لطفا تقویم را انتخاب کنید",
+"create a new calendar" => "یک تقویم جدید ایجاد کنید",
+"Name of new calendar" => "نام تقویم جدید",
+"Import" => "ورودی دادن",
+"Importing calendar" => "درحال افزودن تقویم",
+"Calendar imported successfully" => "افزودن تقویم موفقیت آمیز بود",
+"Close Dialog" => "بستن دیالوگ",
+"Create a new event" => "یک رویداد ایجاد کنید",
+"View an event" => "دیدن یک رویداد",
+"No categories selected" => "هیچ گروهی انتخاب نشده",
+"Select category" => "انتخاب گروه",
+"of" => "از",
+"at" => "در",
+"Timezone" => "زمان محلی",
+"Check always for changes of the timezone" => "همیشه بررسی کنید برای تغییر زمان محلی",
+"Timeformat" => "نوع زمان",
+"24h" => "24 ساعت",
+"12h" => "12 ساعت",
+"First day of the week" => "یکمین روز هفته",
+"Calendar CalDAV syncing address:" => "Calendar CalDAV syncing address :",
+"Users" => "کاربرها",
+"select users" => "انتخاب شناسه ها",
+"Editable" => "قابل ویرایش",
+"Groups" => "گروه ها",
+"select groups" => "انتخاب گروه ها",
+"make public" => "عمومی سازی"
+);
diff --git a/apps/calendar/l10n/fr.php b/apps/calendar/l10n/fr.php
index 29cd978068c1f33adf982710812ff7100084d736..506453af428001ad65d15417a9841b8310aae246 100644
--- a/apps/calendar/l10n/fr.php
+++ b/apps/calendar/l10n/fr.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Aucun calendrier n'a été trouvé.",
+"No events found." => "Aucun événement n'a été trouvé.",
 "Wrong calendar" => "Mauvais calendrier",
 "New Timezone:" => "Nouveau fuseau horaire :",
 "Timezone changed" => "Fuseau horaire modifié",
 "Invalid request" => "Requête invalide",
 "Calendar" => "Calendrier",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Anniversaire",
 "Business" => "Professionnel",
 "Call" => "Appel",
@@ -19,6 +22,7 @@
 "Projects" => "Projets",
 "Questions" => "Questions",
 "Work" => "Travail",
+"unnamed" => "sans-nom",
 "Does not repeat" => "Pas de répétition",
 "Daily" => "Tous les jours",
 "Weekly" => "Hebdomadaire",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendriers",
 "There was a fail, while parsing the file." => "Une erreur est survenue pendant la lecture du fichier.",
 "Choose active calendars" => "Choix des calendriers actifs",
+"Your calendars" => "Vos calendriers",
 "CalDav Link" => "Lien CalDav",
+"Shared calendars" => "Calendriers partagés",
+"No shared calendars" => "Aucun calendrier partagé",
+"Share Calendar" => "Partager le calendrier",
 "Download" => "Télécharger",
 "Edit" => "Éditer",
 "Delete" => "Supprimer",
+"shared with you by" => "partagé avec vous par",
 "New calendar" => "Nouveau calendrier",
 "Edit calendar" => "Éditer le calendrier",
 "Displayname" => "Nom d'affichage",
@@ -94,8 +103,15 @@
 "Cancel" => "Annuler",
 "Edit an event" => "Éditer un événement",
 "Export" => "Exporter",
+"Eventinfo" => "Événement",
+"Repeating" => "Occurences",
+"Alarm" => "Alarmes",
+"Attendees" => "Participants",
+"Share" => "Partage",
 "Title of the Event" => "Titre de l'événement",
 "Category" => "Catégorie",
+"Separate categories with commas" => "Séparer les catégories par des virgules",
+"Edit categories" => "Modifier les catégories",
 "All Day Event" => "Journée entière",
 "From" => "De",
 "To" => "À",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Calendrier importé avec succès",
 "Close Dialog" => "Fermer la fenêtre",
 "Create a new event" => "Créer un nouvel événement",
+"View an event" => "Voir un événement",
+"No categories selected" => "Aucune catégorie sélectionnée",
 "Select category" => "Sélectionner une catégorie",
+"of" => "de",
+"at" => "à",
 "Timezone" => "Fuseau horaire",
 "Check always for changes of the timezone" => "Toujours vérifier d'éventuels changements de fuseau horaire",
 "Timeformat" => "Format de l'heure",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Adresse de synchronisation du calendrier CalDAV :"
+"First day of the week" => "Premier jour de la semaine",
+"Calendar CalDAV syncing address:" => "Adresse de synchronisation du calendrier CalDAV :",
+"Users" => "Utilisateurs",
+"select users" => "sélectionner les utilisateurs",
+"Editable" => "Modifiable",
+"Groups" => "Groupes",
+"select groups" => "sélectionner les groupes",
+"make public" => "rendre public"
 );
diff --git a/apps/calendar/l10n/hu_HU.php b/apps/calendar/l10n/hu_HU.php
index 5afc24305e7b327e3b0d9f53ac4e9577ba876ecc..d97887aac7a23098812e5a38f07b20500b2a5610 100644
--- a/apps/calendar/l10n/hu_HU.php
+++ b/apps/calendar/l10n/hu_HU.php
@@ -1,8 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Nem található naptár",
+"No events found." => "Nem található esemény",
 "Wrong calendar" => "Hibás naptár",
+"New Timezone:" => "Új időzóna",
 "Timezone changed" => "Időzóna megváltozott",
 "Invalid request" => "Érvénytelen kérés",
 "Calendar" => "Naptár",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Születésap",
 "Business" => "Üzlet",
 "Call" => "Hívás",
@@ -18,6 +22,7 @@
 "Projects" => "Projektek",
 "Questions" => "Kérdések",
 "Work" => "Munka",
+"unnamed" => "névtelen",
 "Does not repeat" => "Nem ismétlődik",
 "Daily" => "Napi",
 "Weekly" => "Heti",
@@ -25,6 +30,43 @@
 "Bi-Weekly" => "Kéthetente",
 "Monthly" => "Havi",
 "Yearly" => "Évi",
+"never" => "soha",
+"by occurrences" => "előfordulás szerint",
+"by date" => "dátum szerint",
+"by monthday" => "hónap napja szerint",
+"by weekday" => "hét napja szerint",
+"Monday" => "Hétfő",
+"Tuesday" => "Kedd",
+"Wednesday" => "Szerda",
+"Thursday" => "Csütörtök",
+"Friday" => "Péntek",
+"Saturday" => "Szombat",
+"Sunday" => "Vasárnap",
+"events week of month" => "hónap heteinek sorszáma",
+"first" => "első",
+"second" => "második",
+"third" => "harmadik",
+"fourth" => "negyedik",
+"fifth" => "ötödik",
+"last" => "utolsó",
+"January" => "Január",
+"February" => "Február",
+"March" => "Március",
+"April" => "Április",
+"May" => "Május",
+"June" => "Június",
+"July" => "Július",
+"August" => "Augusztus",
+"September" => "Szeptember",
+"October" => "Október",
+"November" => "November",
+"December" => "December",
+"by events date" => "az esemény napja szerint",
+"by yearday(s)" => "az év napja(i) szerint",
+"by weeknumber(s)" => "a hét sorszáma szerint",
+"by day and month" => "nap és hónap szerint",
+"Date" => "Dátum",
+"Cal." => "Naptár",
 "All day" => "Egész nap",
 "New Calendar" => "Új naptár",
 "Missing fields" => "Hiányzó mezők",
@@ -42,10 +84,15 @@
 "Calendars" => "Naptárak",
 "There was a fail, while parsing the file." => "Probléma volt a fájl elemzése közben.",
 "Choose active calendars" => "Aktív naptár kiválasztása",
+"Your calendars" => "Naptárjaid",
 "CalDav Link" => "CalDAV link",
+"Shared calendars" => "Megosztott naptárak",
+"No shared calendars" => "Nincs megosztott naptár",
+"Share Calendar" => "Naptármegosztás",
 "Download" => "Letöltés",
 "Edit" => "Szerkesztés",
 "Delete" => "Törlés",
+"shared with you by" => "megosztotta veled: ",
 "New calendar" => "Új naptár",
 "Edit calendar" => "Naptár szerkesztése",
 "Displayname" => "Megjelenítési név",
@@ -56,22 +103,60 @@
 "Cancel" => "Mégse",
 "Edit an event" => "Esemény szerkesztése",
 "Export" => "Export",
+"Eventinfo" => "Eseményinfó",
+"Repeating" => "Ismétlődő",
+"Alarm" => "Riasztás",
+"Attendees" => "Résztvevők",
+"Share" => "Megosztás",
 "Title of the Event" => "Az esemény címe",
 "Category" => "Kategória",
+"Separate categories with commas" => "Vesszővel válaszd el a kategóriákat",
+"Edit categories" => "Kategóriák szerkesztése",
 "All Day Event" => "Egész napos esemény",
+"From" => "Ettől",
+"To" => "Eddig",
 "Advanced options" => "Haladó beállítások",
 "Location" => "Hely",
 "Location of the Event" => "Az esemény helyszíne",
 "Description" => "Leírás",
 "Description of the Event" => "Az esemény leírása",
 "Repeat" => "Ismétlés",
+"Advanced" => "Haladó",
+"Select weekdays" => "Hétköznapok kiválasztása",
+"Select days" => "Napok kiválasztása",
+"and the events day of year." => "és az éves esemény napja.",
+"and the events day of month." => "és a havi esemény napja.",
+"Select months" => "Hónapok kiválasztása",
+"Select weeks" => "Hetek kiválasztása",
+"and the events week of year." => "és az heti esemény napja.",
+"Interval" => "Időköz",
+"End" => "Vége",
+"occurrences" => "előfordulások",
+"Import a calendar file" => "Naptár-fájl importálása",
 "Please choose the calendar" => "Válassz naptárat",
+"create a new calendar" => "új naptár létrehozása",
+"Name of new calendar" => "Új naptár neve",
 "Import" => "Importálás",
+"Importing calendar" => "Naptár importálása",
+"Calendar imported successfully" => "Naptár sikeresen importálva",
+"Close Dialog" => "Párbeszédablak bezárása",
 "Create a new event" => "Új esemény létrehozása",
+"View an event" => "Esemény megtekintése",
+"No categories selected" => "Nincs kiválasztott kategória",
 "Select category" => "Kategória kiválasztása",
+"of" => ", tulaj ",
+"at" => ", ",
 "Timezone" => "Időzóna",
+"Check always for changes of the timezone" => "Mindig ellenőrizze az időzóna-változásokat",
 "Timeformat" => "Időformátum",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Naptár CalDAV szinkronizálási cím:"
+"First day of the week" => "A hét első napja",
+"Calendar CalDAV syncing address:" => "Naptár CalDAV szinkronizálási cím:",
+"Users" => "Felhasználók",
+"select users" => "válassz felhasználókat",
+"Editable" => "Szerkeszthető",
+"Groups" => "Csoportok",
+"select groups" => "válassz csoportokat",
+"make public" => "nyilvánossá tétel"
 );
diff --git a/apps/calendar/l10n/ia.php b/apps/calendar/l10n/ia.php
index 89f8ad203420ca1237a0b0ca3058f39ca317fe4f..a346e4de5b7e7aabfe0aef0fbe67763ff163ca45 100644
--- a/apps/calendar/l10n/ia.php
+++ b/apps/calendar/l10n/ia.php
@@ -1,14 +1,27 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Necun calendarios trovate.",
+"No events found." => "Nulle eventos trovate.",
 "New Timezone:" => "Nove fuso horari",
 "Invalid request" => "Requesta invalide.",
 "Calendar" => "Calendario",
+"Birthday" => "Anniversario de nativitate",
+"Business" => "Affaires",
 "Call" => "Appello",
+"Clients" => "Clientes",
+"Holidays" => "Dies feriate",
 "Meeting" => "Incontro",
 "Other" => "Altere",
 "Personal" => "Personal",
 "Projects" => "Projectos",
 "Questions" => "Demandas",
 "Work" => "Travalio",
+"unnamed" => "sin nomine",
+"Does not repeat" => "Non repite",
+"Daily" => "Quotidian",
+"Weekly" => "Septimanal",
+"Every Weekday" => "Cata die",
+"Monthly" => "Mensual",
+"Yearly" => "Cata anno",
 "never" => "nunquam",
 "by date" => "per data",
 "Monday" => "Lunedi",
@@ -34,9 +47,12 @@
 "October" => "Octobre",
 "November" => "Novembre",
 "December" => "Decembre",
+"by events date" => "per data de eventos",
+"by day and month" => "per dia e mense",
 "Date" => "Data",
 "All day" => "Omne die",
 "New Calendar" => "Nove calendario",
+"Missing fields" => "Campos incomplete",
 "Title" => "Titulo",
 "From Date" => "Data de initio",
 "From Time" => "Hora de initio",
@@ -48,6 +64,7 @@
 "Today" => "Hodie",
 "Calendars" => "Calendarios",
 "Choose active calendars" => "Selectionar calendarios active",
+"Your calendars" => "Tu calendarios",
 "Download" => "Discarga",
 "Edit" => "Modificar",
 "Delete" => "Deler",
@@ -60,8 +77,10 @@
 "Cancel" => "Cancellar",
 "Edit an event" => "Modificar evento",
 "Export" => "Exportar",
+"Share" => "Compartir",
 "Title of the Event" => "Titulo del evento.",
 "Category" => "Categoria",
+"Edit categories" => "Modificar categorias",
 "From" => "Ab",
 "To" => "A",
 "Advanced options" => "Optiones avantiate",
@@ -71,16 +90,26 @@
 "Description of the Event" => "Description del evento",
 "Repeat" => "Repeter",
 "Advanced" => "Avantiate",
+"Select weekdays" => "Seliger dies del septimana",
+"Select days" => "Seliger dies",
 "Select months" => "Seliger menses",
 "Select weeks" => "Seliger septimanas",
 "Interval" => "Intervallo",
 "End" => "Fin",
 "Import a calendar file" => "Importar un file de calendario",
 "Please choose the calendar" => "Selige el calendario",
+"create a new calendar" => "crear un nove calendario",
 "Name of new calendar" => "Nomine del calendario",
 "Import" => "Importar",
 "Close Dialog" => "Clauder dialogo",
 "Create a new event" => "Crear un nove evento",
+"View an event" => "Vide un evento",
+"No categories selected" => "Nulle categorias seligite",
 "Select category" => "Selectionar categoria",
-"Timezone" => "Fuso horari"
+"of" => "de",
+"at" => "in",
+"Timezone" => "Fuso horari",
+"First day of the week" => "Prime die del septimana",
+"Users" => "Usatores",
+"Groups" => "Gruppos"
 );
diff --git a/apps/calendar/l10n/it.php b/apps/calendar/l10n/it.php
index fc43d5faed39acf0ce887fdf47c8c6eff8e0d72b..cdb2d99c82e96b4677b83a5a7904b24c139475f4 100644
--- a/apps/calendar/l10n/it.php
+++ b/apps/calendar/l10n/it.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Nessun calendario trovato.",
+"No events found." => "Nessun evento trovato.",
 "Wrong calendar" => "Calendario sbagliato",
 "New Timezone:" => "Nuovo fuso orario:",
 "Timezone changed" => "Fuso orario cambiato",
 "Invalid request" => "Richiesta non valida",
 "Calendar" => "Calendario",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Compleanno",
 "Business" => "Azienda",
 "Call" => "Chiama",
@@ -19,6 +22,7 @@
 "Projects" => "Progetti",
 "Questions" => "Domande",
 "Work" => "Lavoro",
+"unnamed" => "senza nome",
 "Does not repeat" => "Non ripetere",
 "Daily" => "Giornaliero",
 "Weekly" => "Settimanale",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendari",
 "There was a fail, while parsing the file." => "Si è verificato un errore durante l'analisi del file.",
 "Choose active calendars" => "Scegli i calendari attivi",
+"Your calendars" => "I tuoi calendari",
 "CalDav Link" => "Collegamento CalDav",
+"Shared calendars" => "Calendari condivisi",
+"No shared calendars" => "Nessun calendario condiviso",
+"Share Calendar" => "Condividi calendario",
 "Download" => "Scarica",
 "Edit" => "Modifica",
 "Delete" => "Elimina",
+"shared with you by" => "condiviso con te da",
 "New calendar" => "Nuovo calendario",
 "Edit calendar" => "Modifica calendario",
 "Displayname" => "Nome visualizzato",
@@ -94,8 +103,15 @@
 "Cancel" => "Annulla",
 "Edit an event" => "Modifica un evento",
 "Export" => "Esporta",
+"Eventinfo" => "Informazioni evento",
+"Repeating" => "Ripetizione",
+"Alarm" => "Avviso",
+"Attendees" => "Partecipanti",
+"Share" => "Condividi",
 "Title of the Event" => "Titolo dell'evento",
 "Category" => "Categoria",
+"Separate categories with commas" => "Categorie separate con virgole",
+"Edit categories" => "Modifica le categorie",
 "All Day Event" => "Evento che occupa tutta la giornata",
 "From" => "Da",
 "To" => "A",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Calendario importato correttamente",
 "Close Dialog" => "Chiudi la finestra di dialogo",
 "Create a new event" => "Crea un nuovo evento",
+"View an event" => "Visualizza un evento",
+"No categories selected" => "Nessuna categoria selezionata",
 "Select category" => "Seleziona una categoria",
+"of" => "di",
+"at" => "alle",
 "Timezone" => "Fuso orario",
 "Check always for changes of the timezone" => "Controlla sempre i cambiamenti di fuso orario",
 "Timeformat" => "Formato orario",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Indirizzo sincronizzazione calendario CalDAV:"
+"First day of the week" => "Primo giorno della settimana",
+"Calendar CalDAV syncing address:" => "Indirizzo sincronizzazione calendario CalDAV:",
+"Users" => "Utenti",
+"select users" => "seleziona utenti",
+"Editable" => "Modificabile",
+"Groups" => "Gruppi",
+"select groups" => "seleziona gruppi",
+"make public" => "rendi pubblico"
 );
diff --git a/apps/calendar/l10n/ko.php b/apps/calendar/l10n/ko.php
index 5b22ef0156a5615b996e7f520dd21bc3b051ba86..181bfa4378fb82ec21eb36bd43f06e6eb0be47ec 100644
--- a/apps/calendar/l10n/ko.php
+++ b/apps/calendar/l10n/ko.php
@@ -1,4 +1,6 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "달력이 없습니다",
+"No events found." => "일정이 없습니다",
 "Wrong calendar" => "잘못된 달력",
 "New Timezone:" => "새로운 시간대 설정",
 "Timezone changed" => "시간대 변경됨",
@@ -19,6 +21,7 @@
 "Projects" => "프로젝트",
 "Questions" => "질문",
 "Work" => "작업",
+"unnamed" => "익명의",
 "Does not repeat" => "반복 없음",
 "Daily" => "매일",
 "Weekly" => "매주",
@@ -80,10 +83,15 @@
 "Calendars" => "달력",
 "There was a fail, while parsing the file." => "파일을 처리하는 중 오류가 발생하였습니다.",
 "Choose active calendars" => "활성 달력 선택",
+"Your calendars" => "내 달력",
 "CalDav Link" => "CalDav 링크",
+"Shared calendars" => "공유 달력",
+"No shared calendars" => "달력 공유하지 않음",
+"Share Calendar" => "달력 공유",
 "Download" => "다운로드",
 "Edit" => "편집",
 "Delete" => "삭제",
+"shared with you by" => "로 인해 당신과 함께 공유",
 "New calendar" => "새로운 달력",
 "Edit calendar" => "달력 편집",
 "Displayname" => "표시 이름",
@@ -94,8 +102,15 @@
 "Cancel" => "취소",
 "Edit an event" => "이벤트 편집",
 "Export" => "출력",
+"Eventinfo" => "일정 정보",
+"Repeating" => "반복",
+"Alarm" => "알람",
+"Attendees" => "참석자",
+"Share" => "공유",
 "Title of the Event" => "이벤트 제목",
 "Category" => "분류",
+"Separate categories with commas" => "쉼표로 카테고리 구분",
+"Edit categories" => "카테고리 수정",
 "All Day Event" => "종일 이벤트",
 "From" => "시작",
 "To" => "끝",
@@ -125,11 +140,22 @@
 "Calendar imported successfully" => "달력 입력을 성공적으로 마쳤습니다.",
 "Close Dialog" => "대화 마침",
 "Create a new event" => "새 이벤트 만들기",
+"View an event" => "일정 보기",
+"No categories selected" => "선택된 카테고리 없음",
 "Select category" => "선택 카테고리",
+"of" => "의",
+"at" => "에서",
 "Timezone" => "시간대",
 "Check always for changes of the timezone" => "항상 시간대 변경 확인하기",
 "Timeformat" => "시간 형식 설정",
 "24h" => "24시간",
 "12h" => "12시간",
-"Calendar CalDAV syncing address:" => "달력 CalDav 동기화 주소"
+"First day of the week" => "그 주의 첫째날",
+"Calendar CalDAV syncing address:" => "달력 CalDav 동기화 주소",
+"Users" => "사용자",
+"select users" => "사용자 선택",
+"Editable" => "편집 가능",
+"Groups" => "그룹",
+"select groups" => "선택 그룹",
+"make public" => "공개"
 );
diff --git a/apps/calendar/l10n/mk.php b/apps/calendar/l10n/mk.php
index 784adfc8f24ce73685d7a08c0a98d4f1950e171e..41df376dfa6da79a9c973c5750feb036b839132a 100644
--- a/apps/calendar/l10n/mk.php
+++ b/apps/calendar/l10n/mk.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Не се најдени календари.",
+"No events found." => "Не се најдени настани.",
 "Wrong calendar" => "Погрешен календар",
 "New Timezone:" => "Нова временска зона:",
 "Timezone changed" => "Временската зона е променета",
 "Invalid request" => "Неправилно барање",
 "Calendar" => "Календар",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Роденден",
 "Business" => "Деловно",
 "Call" => "Повикај",
@@ -19,6 +22,7 @@
 "Projects" => "Проекти",
 "Questions" => "Прашања",
 "Work" => "Работа",
+"unnamed" => "неименувано",
 "Does not repeat" => "Не се повторува",
 "Daily" => "Дневно",
 "Weekly" => "Седмично",
@@ -38,6 +42,7 @@
 "Friday" => "Петок",
 "Saturday" => "Сабота",
 "Sunday" => "Недела",
+"events week of month" => "седмични настани од месец",
 "first" => "прв",
 "second" => "втор",
 "third" => "трет",
@@ -79,10 +84,15 @@
 "Calendars" => "Календари",
 "There was a fail, while parsing the file." => "Имаше проблем при парсирање на датотеката.",
 "Choose active calendars" => "Избери активни календари",
+"Your calendars" => "Ваши календари",
 "CalDav Link" => "Врска за CalDav",
+"Shared calendars" => "Споделени календари",
+"No shared calendars" => "Нема споделени календари",
+"Share Calendar" => "Сподели календар",
 "Download" => "Преземи",
 "Edit" => "Уреди",
 "Delete" => "Избриши",
+"shared with you by" => "Споделен со вас од",
 "New calendar" => "Нов календар",
 "Edit calendar" => "Уреди календар",
 "Displayname" => "Име за приказ",
@@ -93,8 +103,15 @@
 "Cancel" => "Откажи",
 "Edit an event" => "Уреди настан",
 "Export" => "Извези",
+"Eventinfo" => "Инфо за настан",
+"Repeating" => "Повторување",
+"Alarm" => "Аларм",
+"Attendees" => "Присутни",
+"Share" => "Сподели",
 "Title of the Event" => "Наслов на настанот",
 "Category" => "Категорија",
+"Separate categories with commas" => "Одвоете ги категориите со запирка",
+"Edit categories" => "Уреди категории",
 "All Day Event" => "Целодневен настан",
 "From" => "Од",
 "To" => "До",
@@ -107,8 +124,11 @@
 "Advanced" => "Напредно",
 "Select weekdays" => "Избери работни денови",
 "Select days" => "Избери денови",
+"and the events day of year." => "и настаните ден од година.",
+"and the events day of month." => "и настаните ден од месец.",
 "Select months" => "Избери месеци",
 "Select weeks" => "Избери седмици",
+"and the events week of year." => "и настаните седмица од година.",
 "Interval" => "интервал",
 "End" => "Крај",
 "occurrences" => "повторувања",
@@ -121,11 +141,22 @@
 "Calendar imported successfully" => "Календарот беше успешно увезен",
 "Close Dialog" => "Затвори дијалог",
 "Create a new event" => "Создади нов настан",
+"View an event" => "Погледај настан",
+"No categories selected" => "Нема избрано категории",
 "Select category" => "Избери категорија",
+"of" => "од",
+"at" => "на",
 "Timezone" => "Временска зона",
 "Check always for changes of the timezone" => "Секогаш провери за промени на временската зона",
 "Timeformat" => "Формат на времето",
 "24h" => "24ч",
 "12h" => "12ч",
-"Calendar CalDAV syncing address:" => "CalDAV календар адресата за синхронизација:"
+"First day of the week" => "Прв ден од седмицата",
+"Calendar CalDAV syncing address:" => "CalDAV календар адресата за синхронизација:",
+"Users" => "Корисници",
+"select users" => "избери корисници",
+"Editable" => "Изменливо",
+"Groups" => "Групи",
+"select groups" => "избери групи",
+"make public" => "направи јавно"
 );
diff --git a/apps/calendar/l10n/nb_NO.php b/apps/calendar/l10n/nb_NO.php
index 216794f43042e6c16842a9081bf7195a310bba8b..b9a7bf4cb17b334447396b1682382f80f26f7599 100644
--- a/apps/calendar/l10n/nb_NO.php
+++ b/apps/calendar/l10n/nb_NO.php
@@ -1,4 +1,6 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Ingen kalendere funnet",
+"No events found." => "Ingen hendelser funnet",
 "Wrong calendar" => "Feil kalender",
 "New Timezone:" => "Ny tidssone:",
 "Timezone changed" => "Tidssone endret",
@@ -17,6 +19,7 @@
 "Projects" => "Prosjekter",
 "Questions" => "Spørsmål",
 "Work" => "Arbeid",
+"unnamed" => "uten navn",
 "Does not repeat" => "Gjentas ikke",
 "Daily" => "Daglig",
 "Weekly" => "Ukentlig",
@@ -78,10 +81,15 @@
 "Calendars" => "Kalendre",
 "There was a fail, while parsing the file." => "Det oppstod en feil under åpningen av filen.",
 "Choose active calendars" => "Velg en aktiv kalender",
+"Your calendars" => "Dine kalendere",
 "CalDav Link" => "CalDav-lenke",
+"Shared calendars" => "Delte kalendere",
+"No shared calendars" => "Ingen delte kalendere",
+"Share Calendar" => "Del Kalender",
 "Download" => "Last ned",
 "Edit" => "Endre",
 "Delete" => "Slett",
+"shared with you by" => "delt med deg",
 "New calendar" => "Ny kalender",
 "Edit calendar" => "Rediger kalender",
 "Displayname" => "Visningsnavn",
@@ -92,8 +100,15 @@
 "Cancel" => "Avbryt",
 "Edit an event" => "Rediger en hendelse",
 "Export" => "Eksporter",
+"Eventinfo" => "Hendelsesinformasjon",
+"Repeating" => "Gjentas",
+"Alarm" => "Alarm",
+"Attendees" => "Deltakere",
+"Share" => "Del",
 "Title of the Event" => "Hendelsestittel",
 "Category" => "Kategori",
+"Separate categories with commas" => "Separer kategorier med komma",
+"Edit categories" => "Rediger kategorier",
 "All Day Event" => "Hele dagen-hendelse",
 "From" => "Fra",
 "To" => "Til",
@@ -123,11 +138,20 @@
 "Calendar imported successfully" => "Kalenderen ble importert uten feil",
 "Close Dialog" => "Lukk dialog",
 "Create a new event" => "Opprett en ny hendelse",
+"View an event" => "Se på hendelse",
+"No categories selected" => "Ingen kategorier valgt",
 "Select category" => "Velg kategori",
 "Timezone" => "Tidssone",
 "Check always for changes of the timezone" => "Se alltid etter endringer i tidssone",
 "Timeformat" => "Tidsformat:",
 "24h" => "24 t",
 "12h" => "12 t",
-"Calendar CalDAV syncing address:" => "Kalender CalDAV synkroniseringsadresse"
+"First day of the week" => "Ukens første dag",
+"Calendar CalDAV syncing address:" => "Kalender CalDAV synkroniseringsadresse",
+"Users" => "Brukere",
+"select users" => "valgte brukere",
+"Editable" => "Redigerbar",
+"Groups" => "Grupper",
+"select groups" => "velg grupper",
+"make public" => "gjør offentlig"
 );
diff --git a/apps/calendar/l10n/nl.php b/apps/calendar/l10n/nl.php
index 948dcf13c60f9c86985a07c659a3f034b49c77b7..d141a1cc08c48c2f6c3d1d4f18a86151efd2d6d2 100644
--- a/apps/calendar/l10n/nl.php
+++ b/apps/calendar/l10n/nl.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Geen kalenders gevonden.",
+"No events found." => "Geen gebeurtenissen gevonden.",
 "Wrong calendar" => "Verkeerde kalender",
 "New Timezone:" => "Nieuwe tijdszone:",
 "Timezone changed" => "Tijdzone is veranderd",
 "Invalid request" => "Ongeldige aanvraag",
 "Calendar" => "Kalender",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '&#8212;' d[ MMM] yyyy}",
 "Birthday" => "Verjaardag",
 "Business" => "Zakelijk",
 "Call" => "Bellen",
@@ -19,6 +22,7 @@
 "Projects" => "Projecten",
 "Questions" => "Vragen",
 "Work" => "Werk",
+"unnamed" => "onbekend",
 "Does not repeat" => "Wordt niet herhaald",
 "Daily" => "Dagelijks",
 "Weekly" => "Wekelijks",
@@ -38,6 +42,7 @@
 "Friday" => "Vrijdag",
 "Saturday" => "Zaterdag",
 "Sunday" => "Zondag",
+"events week of month" => "gebeurtenissen week van maand",
 "first" => "eerste",
 "second" => "tweede",
 "third" => "derde",
@@ -79,10 +84,15 @@
 "Calendars" => "Kalenders",
 "There was a fail, while parsing the file." => "Er is een fout opgetreden bij het verwerken van het bestand.",
 "Choose active calendars" => "Kies actieve kalenders",
+"Your calendars" => "Je kalenders",
 "CalDav Link" => "CalDav Link",
+"Shared calendars" => "Gedeelde kalenders",
+"No shared calendars" => "Geen gedeelde kalenders",
+"Share Calendar" => "Deel kalender",
 "Download" => "Download",
 "Edit" => "Bewerken",
 "Delete" => "Verwijderen",
+"shared with you by" => "gedeeld met jou door",
 "New calendar" => "Nieuwe kalender",
 "Edit calendar" => "Bewerk kalender",
 "Displayname" => "Weergavenaam",
@@ -93,8 +103,15 @@
 "Cancel" => "Annuleren",
 "Edit an event" => "Bewerken van een afspraak",
 "Export" => "Exporteren",
+"Eventinfo" => "Geberurtenisinformatie",
+"Repeating" => "Herhalend",
+"Alarm" => "Alarm",
+"Attendees" => "Deelnemers",
+"Share" => "Delen",
 "Title of the Event" => "Titel van de afspraak",
 "Category" => "Categorie",
+"Separate categories with commas" => "Gescheiden door komma's",
+"Edit categories" => "Wijzig categorieën",
 "All Day Event" => "Hele dag",
 "From" => "Van",
 "To" => "Aan",
@@ -107,8 +124,11 @@
 "Advanced" => "Geavanceerd",
 "Select weekdays" => "Selecteer weekdagen",
 "Select days" => "Selecteer dagen",
+"and the events day of year." => "en de gebeurtenissen dag van het jaar",
+"and the events day of month." => "en de gebeurtenissen dag van de maand",
 "Select months" => "Selecteer maanden",
 "Select weeks" => "Selecteer weken",
+"and the events week of year." => "en de gebeurtenissen week van het jaar",
 "Interval" => "Interval",
 "End" => "Einde",
 "occurrences" => "gebeurtenissen",
@@ -121,11 +141,22 @@
 "Calendar imported successfully" => "Agenda succesvol geïmporteerd",
 "Close Dialog" => "Sluit venster",
 "Create a new event" => "Maak een nieuwe afspraak",
+"View an event" => "Bekijk een gebeurtenis",
+"No categories selected" => "Geen categorieën geselecteerd",
 "Select category" => "Kies een categorie",
+"of" => "van",
+"at" => "op",
 "Timezone" => "Tijdzone",
 "Check always for changes of the timezone" => "Controleer altijd op aanpassingen van de tijdszone",
 "Timeformat" => "Tijdformaat",
 "24h" => "24uur",
 "12h" => "12uur",
-"Calendar CalDAV syncing address:" => "CalDAV kalender synchronisatie adres:"
+"First day of the week" => "Eerste dag van de week",
+"Calendar CalDAV syncing address:" => "CalDAV kalender synchronisatie adres:",
+"Users" => "Gebruikers",
+"select users" => "kies gebruikers",
+"Editable" => "Te wijzigen",
+"Groups" => "Groepen",
+"select groups" => "kies groep",
+"make public" => "maak publiek"
 );
diff --git a/apps/calendar/l10n/pt_BR.php b/apps/calendar/l10n/pt_BR.php
index c89c1a9ffe2e6f862b99c31ed51430cbc28a846e..95317eea0f73c6b512939ce920b4823816bd2809 100644
--- a/apps/calendar/l10n/pt_BR.php
+++ b/apps/calendar/l10n/pt_BR.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Nenhum calendário encontrado.",
+"No events found." => "Nenhum evento encontrado.",
 "Wrong calendar" => "Calendário incorreto",
 "New Timezone:" => "Novo fuso horário",
 "Timezone changed" => "Fuso horário alterado",
 "Invalid request" => "Pedido inválido",
 "Calendar" => "Calendário",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Aniversário",
 "Business" => "Negócio",
 "Call" => "Chamada",
@@ -19,6 +22,7 @@
 "Projects" => "Projetos",
 "Questions" => "Perguntas",
 "Work" => "Trabalho",
+"unnamed" => "sem nome",
 "Does not repeat" => "Não repetir",
 "Daily" => "Diariamente",
 "Weekly" => "Semanal",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendários",
 "There was a fail, while parsing the file." => "Houve uma falha, ao analisar o arquivo.",
 "Choose active calendars" => "Escolha calendários ativos",
+"Your calendars" => "Meus Calendários",
 "CalDav Link" => "Link para CalDav",
+"Shared calendars" => "Calendários Compartilhados",
+"No shared calendars" => "Nenhum Calendário Compartilhado",
+"Share Calendar" => "Compartilhar Calendário",
 "Download" => "Baixar",
 "Edit" => "Editar",
 "Delete" => "Excluir",
+"shared with you by" => "compartilhado com você por",
 "New calendar" => "Novo calendário",
 "Edit calendar" => "Editar calendário",
 "Displayname" => "Mostrar Nome",
@@ -94,8 +103,15 @@
 "Cancel" => "Cancelar",
 "Edit an event" => "Editar um evento",
 "Export" => "Exportar",
+"Eventinfo" => "Info de Evento",
+"Repeating" => "Repetindo",
+"Alarm" => "Alarme",
+"Attendees" => "Participantes",
+"Share" => "Compartilhar",
 "Title of the Event" => "Título do evento",
 "Category" => "Categoria",
+"Separate categories with commas" => "Separe as categorias por vírgulas",
+"Edit categories" => "Editar categorias",
 "All Day Event" => "Evento de dia inteiro",
 "From" => "De",
 "To" => "Para",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Calendário importado com sucesso",
 "Close Dialog" => "Fechar caixa de diálogo",
 "Create a new event" => "Criar um novo evento",
+"View an event" => "Visualizar evento",
+"No categories selected" => "Nenhuma categoria selecionada",
 "Select category" => "Selecionar categoria",
+"of" => "de",
+"at" => "para",
 "Timezone" => "Fuso horário",
 "Check always for changes of the timezone" => "Verificar sempre mudanças no fuso horário",
 "Timeformat" => "Formato da Hora",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Sincronização de endereço do calendário CalDAV :"
+"First day of the week" => "Primeiro dia da semana",
+"Calendar CalDAV syncing address:" => "Sincronização de endereço do calendário CalDAV :",
+"Users" => "Usuários",
+"select users" => "Selecione usuários",
+"Editable" => "Editável",
+"Groups" => "Grupos",
+"select groups" => "Selecione grupos",
+"make public" => "Tornar público"
 );
diff --git a/apps/calendar/l10n/sk_SK.php b/apps/calendar/l10n/sk_SK.php
index 3455c2bc75f6173c52c6ef2ad1acb559f28a3d91..e182a9d3ea435d826821e30a875dad194049cca8 100644
--- a/apps/calendar/l10n/sk_SK.php
+++ b/apps/calendar/l10n/sk_SK.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Nenašiel sa žiadny kalendár.",
+"No events found." => "Nenašla sa žiadna udalosť.",
 "Wrong calendar" => "Zlý kalendár",
 "New Timezone:" => "Nová časová zóna:",
 "Timezone changed" => "Časové pásmo zmenené",
 "Invalid request" => "Neplatná požiadavka",
 "Calendar" => "Kalendár",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "d. MMM[ yyyy]{ '&#8212;' d.[ MMM] yyyy}",
 "Birthday" => "Narodeniny",
 "Business" => "Podnikanie",
 "Call" => "Hovor",
@@ -19,6 +22,7 @@
 "Projects" => "Projekty",
 "Questions" => "Otázky",
 "Work" => "Práca",
+"unnamed" => "nepomenovaný",
 "Does not repeat" => "Neopakovať",
 "Daily" => "Denne",
 "Weekly" => "Týždenne",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendáre",
 "There was a fail, while parsing the file." => "Nastala chyba počas parsovania súboru.",
 "Choose active calendars" => "Zvoľte aktívne kalendáre",
+"Your calendars" => "Vaše kalendáre",
 "CalDav Link" => "CalDav odkaz",
+"Shared calendars" => "Zdielané kalendáre",
+"No shared calendars" => "Žiadne zdielané kalendáre",
+"Share Calendar" => "Zdielať kalendár",
 "Download" => "Stiahnuť",
 "Edit" => "Upraviť",
 "Delete" => "Odstrániť",
+"shared with you by" => "zdielané s vami používateľom",
 "New calendar" => "Nový kalendár",
 "Edit calendar" => "Upraviť kalendár",
 "Displayname" => "Zobrazené meno",
@@ -94,8 +103,15 @@
 "Cancel" => "Zrušiť",
 "Edit an event" => "Upraviť udalosť",
 "Export" => "Exportovať",
+"Eventinfo" => "Informácie o udalosti",
+"Repeating" => "Opakovanie",
+"Alarm" => "Alarm",
+"Attendees" => "Účastníci",
+"Share" => "Zdielať",
 "Title of the Event" => "Nadpis udalosti",
 "Category" => "Kategória",
+"Separate categories with commas" => "Kategórie oddelené čiarkami",
+"Edit categories" => "Úprava kategórií",
 "All Day Event" => "Celodenná udalosť",
 "From" => "Od",
 "To" => "Do",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Kalendár úspešne importovaný",
 "Close Dialog" => "Zatvoriť dialóg",
 "Create a new event" => "Vytvoriť udalosť",
+"View an event" => "Zobraziť udalosť",
+"No categories selected" => "Žiadne vybraté kategórie",
 "Select category" => "Vybrať kategóriu",
+"of" => "z",
+"at" => "v",
 "Timezone" => "Časová zóna",
 "Check always for changes of the timezone" => "Vždy kontroluj zmeny časového pásma",
 "Timeformat" => "Formát času",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Synchronizačná adresa kalendára CalDAV: "
+"First day of the week" => "Prvý deň v týždni",
+"Calendar CalDAV syncing address:" => "Synchronizačná adresa kalendára CalDAV: ",
+"Users" => "Používatelia",
+"select users" => "vybrať používateľov",
+"Editable" => "Upravovateľné",
+"Groups" => "Skupiny",
+"select groups" => "vybrať skupiny",
+"make public" => "zverejniť"
 );
diff --git a/apps/calendar/l10n/sl.php b/apps/calendar/l10n/sl.php
index f20f5026dc549bd1210109ea95bfa3e3a2a6fa89..3bf03ede1271e9d5140dd665b4bb1a24c0d12f5e 100644
--- a/apps/calendar/l10n/sl.php
+++ b/apps/calendar/l10n/sl.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Ni bilo najdenih koledarjev.",
+"No events found." => "Ni bilo najdenih dogodkov.",
 "Wrong calendar" => "Napačen koledar",
 "New Timezone:" => "Nov časovni pas:",
 "Timezone changed" => "Časovni pas je bil spremenjen",
 "Invalid request" => "Neveljaven zahtevek",
 "Calendar" => "Koledar",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "Rojstni dan",
 "Business" => "Poslovno",
 "Call" => "Pokliči",
@@ -19,6 +22,7 @@
 "Projects" => "Projekt",
 "Questions" => "Vprašanja",
 "Work" => "Delo",
+"unnamed" => "neimenovan",
 "Does not repeat" => "Se ne ponavlja",
 "Daily" => "Dnevno",
 "Weekly" => "Tedensko",
@@ -80,10 +84,15 @@
 "Calendars" => "Koledarji",
 "There was a fail, while parsing the file." => "Pri razčlenjevanju datoteke je prišlo do napake.",
 "Choose active calendars" => "Izberite aktivne koledarje",
+"Your calendars" => "Vaši koledarji",
 "CalDav Link" => "CalDav povezava",
+"Shared calendars" => "Koledarji v souporabi",
+"No shared calendars" => "Ni koledarjev v souporabi",
+"Share Calendar" => "Daj koledar v souporabo",
 "Download" => "Prenesi",
 "Edit" => "Uredi",
 "Delete" => "Izbriši",
+"shared with you by" => "z vami souporablja",
 "New calendar" => "Nov koledar",
 "Edit calendar" => "Uredi koledar",
 "Displayname" => "Ime za prikaz",
@@ -94,8 +103,15 @@
 "Cancel" => "Prekliči",
 "Edit an event" => "Uredi dogodek",
 "Export" => "Izvozi",
+"Eventinfo" => "Informacije od dogodku",
+"Repeating" => "Ponavljanja",
+"Alarm" => "Alarm",
+"Attendees" => "Udeleženci",
+"Share" => "Souporaba",
 "Title of the Event" => "Naslov dogodka",
 "Category" => "Kategorija",
+"Separate categories with commas" => "Kategorije ločite z vejico",
+"Edit categories" => "Uredi kategorije",
 "All Day Event" => "Celodnevni dogodek",
 "From" => "Od",
 "To" => "Do",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Koledar je bil uspešno uvožen",
 "Close Dialog" => "Zapri dialog",
 "Create a new event" => "Ustvari nov dogodek",
+"View an event" => "Poglej dogodek",
+"No categories selected" => "Nobena kategorija ni izbrana",
 "Select category" => "Izberi kategorijo",
+"of" => "od",
+"at" => "pri",
 "Timezone" => "Časovni pas",
 "Check always for changes of the timezone" => "Vedno preveri za spremembe časovnega pasu",
 "Timeformat" => "Zapis časa",
 "24h" => "24ur",
 "12h" => "12ur",
-"Calendar CalDAV syncing address:" => "CalDAV sinhronizacijski naslov koledarja:"
+"First day of the week" => "Prvi dan v tednu",
+"Calendar CalDAV syncing address:" => "CalDAV sinhronizacijski naslov koledarja:",
+"Users" => "Uporabniki",
+"select users" => "izberite uporabnike",
+"Editable" => "Možno urejanje",
+"Groups" => "Skupine",
+"select groups" => "izberite skupine",
+"make public" => "objavi"
 );
diff --git a/apps/calendar/l10n/th_TH.php b/apps/calendar/l10n/th_TH.php
index 7dda3943b6f278a23df29fd99bbcea44e15545d1..8aaa7ae756aa91c80798ace6ed3af0d388ceee51 100644
--- a/apps/calendar/l10n/th_TH.php
+++ b/apps/calendar/l10n/th_TH.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "ไม่พบปฏิทินที่ต้องการ",
+"No events found." => "ไม่พบกิจกรรมที่ต้องการ",
 "Wrong calendar" => "ปฏิทินไม่ถูกต้อง",
 "New Timezone:" => "สร้างโซนเวลาใหม่:",
 "Timezone changed" => "โซนเวลาถูกเปลี่ยนแล้ว",
 "Invalid request" => "คำร้องขอไม่ถูกต้อง",
 "Calendar" => "ปฏิทิน",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
 "Birthday" => "วันเกิด",
 "Business" => "ธุรกิจ",
 "Call" => "โทรติดต่อ",
@@ -19,6 +22,7 @@
 "Projects" => "โครงการ",
 "Questions" => "คำถาม",
 "Work" => "งาน",
+"unnamed" => "ไม่มีชื่อ",
 "Does not repeat" => "ไม่ต้องทำซ้ำ",
 "Daily" => "รายวัน",
 "Weekly" => "รายสัปดาห์",
@@ -80,10 +84,15 @@
 "Calendars" => "ปฏิทิน",
 "There was a fail, while parsing the file." => "เกิดความล้มเหลวในการแยกไฟล์",
 "Choose active calendars" => "เลือกปฏิทินที่ต้องการใช้งาน",
+"Your calendars" => "ปฏิทินของคุณ",
 "CalDav Link" => "ลิงค์ CalDav",
+"Shared calendars" => "ปฏิทินที่เปิดแชร์",
+"No shared calendars" => "ไม่มีปฏิทินที่เปิดแชร์ไว้",
+"Share Calendar" => "เปิดแชร์ปฏิทิน",
 "Download" => "ดาวน์โหลด",
 "Edit" => "แก้ไข",
 "Delete" => "ลบ",
+"shared with you by" => "แชร์ให้คุณโดย",
 "New calendar" => "สร้างปฏิทินใหม่",
 "Edit calendar" => "แก้ไขปฏิทิน",
 "Displayname" => "ชื่อที่ต้องการให้แสดง",
@@ -94,8 +103,15 @@
 "Cancel" => "ยกเลิก",
 "Edit an event" => "แก้ไขกิจกรรม",
 "Export" => "ส่งออกข้อมูล",
+"Eventinfo" => "ข้อมูลเกี่ยวกับกิจกรรม",
+"Repeating" => "ทำซ้ำ",
+"Alarm" => "แจ้งเตือน",
+"Attendees" => "ผู้เข้าร่วมกิจกรรม",
+"Share" => "แชร์",
 "Title of the Event" => "ชื่อของกิจกรรม",
 "Category" => "หมวดหมู่",
+"Separate categories with commas" => "คั่นระหว่างรายการหมวดหมู่ด้วยเครื่องหมายจุลภาคหรือคอมม่า",
+"Edit categories" => "แก้ไขหมวดหมู่",
 "All Day Event" => "เป็นกิจกรรมตลอดทั้งวัน",
 "From" => "จาก",
 "To" => "ถึง",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "ปฏิทินถูกนำเข้าข้อมูลเรียบร้อยแล้ว",
 "Close Dialog" => "ปิดกล่องข้อความโต้ตอบ",
 "Create a new event" => "สร้างกิจกรรมใหม่",
+"View an event" => "ดูกิจกรรม",
+"No categories selected" => "ยังไม่ได้เลือกหมวดหมู่",
 "Select category" => "เลือกหมวดหมู่",
+"of" => "ของ",
+"at" => "ที่",
 "Timezone" => "โซนเวลา",
 "Check always for changes of the timezone" => "ตรวจสอบการเปลี่ยนแปลงโซนเวลาอยู่เสมอ",
 "Timeformat" => "รูปแบบการแสดงเวลา",
 "24h" => "24 ช.ม.",
 "12h" => "12 ช.ม.",
-"Calendar CalDAV syncing address:" => "ที่อยู่ในการเชื่อมข้อมูลกับปฏิทิน CalDav:"
+"First day of the week" => "วันแรกของสัปดาห์",
+"Calendar CalDAV syncing address:" => "ที่อยู่ในการเชื่อมข้อมูลกับปฏิทิน CalDav:",
+"Users" => "ผู้ใช้งาน",
+"select users" => "เลือกผู้ใช้งาน",
+"Editable" => "สามารถแก้ไขได้",
+"Groups" => "กลุ่ม",
+"select groups" => "เลือกกลุ่ม",
+"make public" => "กำหนดเป็นสาธารณะ"
 );
diff --git a/apps/calendar/l10n/tr.php b/apps/calendar/l10n/tr.php
index aa72c76ebab4771bad5fd4b3f3dbd50eca0d3470..a72e4c39f6d114670d576b6fb5b1fdaa0dd977fc 100644
--- a/apps/calendar/l10n/tr.php
+++ b/apps/calendar/l10n/tr.php
@@ -1,9 +1,12 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "Takvim yok.",
+"No events found." => "Etkinlik yok.",
 "Wrong calendar" => "Yanlış takvim",
 "New Timezone:" => "Yeni Zamandilimi:",
 "Timezone changed" => "Zaman dilimi değiştirildi",
 "Invalid request" => "Geçersiz istek",
 "Calendar" => "Takvim",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "AAA g[ yyyy]{ '&#8212;'[ AAA] g yyyy}",
 "Birthday" => "Doğum günü",
 "Business" => "İş",
 "Call" => "Arama",
@@ -19,6 +22,7 @@
 "Projects" => "Projeler",
 "Questions" => "Sorular",
 "Work" => "İş",
+"unnamed" => "isimsiz",
 "Does not repeat" => "Tekrar etmiyor",
 "Daily" => "Günlük",
 "Weekly" => "Haftalı",
@@ -38,6 +42,7 @@
 "Friday" => "Cuma",
 "Saturday" => "Cumartesi",
 "Sunday" => "Pazar",
+"events week of month" => "ayın etkinlikler haftası",
 "first" => "birinci",
 "second" => "ikinci",
 "third" => "üçüncü",
@@ -79,10 +84,15 @@
 "Calendars" => "Takvimler",
 "There was a fail, while parsing the file." => "Dosya okunurken başarısızlık oldu.",
 "Choose active calendars" => "Aktif takvimleri seçin",
+"Your calendars" => "Takvimleriniz",
 "CalDav Link" => "CalDav Bağlantısı",
+"Shared calendars" => "Paylaşılan",
+"No shared calendars" => "Paylaşılan takvim yok",
+"Share Calendar" => "Takvimi paylaş",
 "Download" => "İndir",
 "Edit" => "Düzenle",
 "Delete" => "Sil",
+"shared with you by" => "sizinle paylaşılmış",
 "New calendar" => "Yeni takvim",
 "Edit calendar" => "Takvimi düzenle",
 "Displayname" => "Görünüm adı",
@@ -93,8 +103,15 @@
 "Cancel" => "İptal",
 "Edit an event" => "Bir olay düzenle",
 "Export" => "Dışa aktar",
+"Eventinfo" => "Etkinlik bilgisi",
+"Repeating" => "Tekrarlama",
+"Alarm" => "Alarm",
+"Attendees" => "Katılanlar",
+"Share" => "Paylaş",
 "Title of the Event" => "Olayın Başlığı",
 "Category" => "Kategori",
+"Separate categories with commas" => "Kategorileri virgülle ayırın",
+"Edit categories" => "Kategorileri düzenle",
 "All Day Event" => "Tüm Gün Olay",
 "From" => "Kimden",
 "To" => "Kime",
@@ -107,18 +124,39 @@
 "Advanced" => "Gelişmiş",
 "Select weekdays" => "Hafta günlerini seçin",
 "Select days" => "Günleri seçin",
+"and the events day of year." => "ve yılın etkinlikler günü.",
+"and the events day of month." => "ve ayın etkinlikler günü.",
 "Select months" => "Ayları seç",
 "Select weeks" => "Haftaları seç",
+"and the events week of year." => "ve yılın etkinkinlikler haftası.",
 "Interval" => "Aralık",
 "End" => "Son",
+"occurrences" => "olaylar",
+"Import a calendar file" => "Takvim dosyasını içeri aktar",
 "Please choose the calendar" => "Lütfen takvimi seçin",
+"create a new calendar" => "Yeni bir takvim oluştur",
 "Name of new calendar" => "Yeni takvimin adı",
 "Import" => "İçe Al",
+"Importing calendar" => "Takvim içe aktarılıyor",
+"Calendar imported successfully" => "Takvim başarıyla içe aktarıldı",
+"Close Dialog" => "Diyalogu kapat",
 "Create a new event" => "Yeni olay oluştur",
+"View an event" => "Bir olay görüntüle",
+"No categories selected" => "Kategori seçilmedi",
 "Select category" => "Kategori seçin",
+"of" => "nın",
+"at" => "üzerinde",
 "Timezone" => "Zaman dilimi",
+"Check always for changes of the timezone" => "Sürekli zaman dilimi değişikliklerini kontrol et",
 "Timeformat" => "Saat biçimi",
 "24h" => "24s",
 "12h" => "12s",
-"Calendar CalDAV syncing address:" => "CalDAV Takvim senkron adresi:"
+"First day of the week" => "Haftanın ilk günü",
+"Calendar CalDAV syncing address:" => "CalDAV Takvim eşzamanlama adresi:",
+"Users" => "Kullanıcılar",
+"select users" => "kullanıcıları seç",
+"Editable" => "Düzenlenebilir",
+"Groups" => "Gruplar",
+"select groups" => "grupları seç",
+"make public" => "kamuyla paylaş"
 );
diff --git a/apps/calendar/l10n/zh_CN.php b/apps/calendar/l10n/zh_CN.php
index 8cd909cc7f80fef459a2a713fc9b772b8d404518..129aa8d8e86e4cfb3fa2b34387c84e03898fefce 100644
--- a/apps/calendar/l10n/zh_CN.php
+++ b/apps/calendar/l10n/zh_CN.php
@@ -1,4 +1,6 @@
 <?php $TRANSLATIONS = array(
+"No calendars found." => "无法找到日历。",
+"No events found." => "无法找到事件。",
 "Wrong calendar" => "错误的日历",
 "New Timezone:" => "新时区:",
 "Timezone changed" => "时区已修改",
@@ -19,6 +21,7 @@
 "Projects" => "项目",
 "Questions" => "问题",
 "Work" => "工作",
+"unnamed" => "未命名",
 "Does not repeat" => "不重复",
 "Daily" => "每天",
 "Weekly" => "每周",
@@ -80,10 +83,15 @@
 "Calendars" => "日历",
 "There was a fail, while parsing the file." => "解析文件失败",
 "Choose active calendars" => "选择活动日历",
+"Your calendars" => "您的日历",
 "CalDav Link" => "CalDav 链接",
+"Shared calendars" => "共享的日历",
+"No shared calendars" => "无共享的日历",
+"Share Calendar" => "共享日历",
 "Download" => "下载",
 "Edit" => "编辑",
 "Delete" => "删除",
+"shared with you by" => "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ",
 "New calendar" => "新日历",
 "Edit calendar" => "编辑日历",
 "Displayname" => "显示名称",
@@ -94,8 +102,14 @@
 "Cancel" => "取消",
 "Edit an event" => "编辑事件",
 "Export" => "导出",
+"Eventinfo" => "事件信息",
+"Repeating" => "重复",
+"Attendees" => "参加者",
+"Share" => "共享",
 "Title of the Event" => "事件标题",
 "Category" => "分类",
+"Separate categories with commas" => "用逗号分隔分类",
+"Edit categories" => "编辑分类",
 "All Day Event" => "全天事件",
 "From" => "自",
 "To" => "至",
@@ -125,11 +139,20 @@
 "Calendar imported successfully" => "导入日历成功",
 "Close Dialog" => "关闭对话框",
 "Create a new event" => "创建新事件",
+"View an event" => "查看事件",
+"No categories selected" => "无选中分类",
 "Select category" => "选择分类",
 "Timezone" => "时区",
 "Check always for changes of the timezone" => "选中则总是按照时区变化",
 "Timeformat" => "时间格式",
 "24h" => "24小时",
 "12h" => "12小时",
-"Calendar CalDAV syncing address:" => "日历CalDAV 同步地址:"
+"First day of the week" => "每周的第一天",
+"Calendar CalDAV syncing address:" => "日历CalDAV 同步地址:",
+"Users" => "用户",
+"select users" => "选中用户",
+"Editable" => "可编辑",
+"Groups" => "分组",
+"select groups" => "选中分组",
+"make public" => "公开"
 );
diff --git a/apps/calendar/l10n/zh_TW.php b/apps/calendar/l10n/zh_TW.php
index 2b8fc790cca878858c44c776603c02db0241de12..b4f1d4e9b87cce06f2fc2fe886cdd5f524a38fb7 100644
--- a/apps/calendar/l10n/zh_TW.php
+++ b/apps/calendar/l10n/zh_TW.php
@@ -90,6 +90,9 @@
 "Cancel" => "取消",
 "Edit an event" => "編輯事件",
 "Export" => "匯出",
+"Alarm" => "鬧鐘",
+"Attendees" => "出席者",
+"Share" => "分享",
 "Title of the Event" => "事件標題",
 "Category" => "分類",
 "All Day Event" => "全天事件",
@@ -124,5 +127,10 @@
 "Timeformat" => "日期格式",
 "24h" => "24小時制",
 "12h" => "12小時制",
-"Calendar CalDAV syncing address:" => "CalDAV 的日曆同步地址:"
+"Calendar CalDAV syncing address:" => "CalDAV 的日曆同步地址:",
+"Users" => "使用者",
+"select users" => "選擇使用者",
+"Editable" => "可編輯",
+"Groups" => "群組",
+"select groups" => "選擇群組"
 );
diff --git a/apps/calendar/lib/app.php b/apps/calendar/lib/app.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/lib/hooks.php b/apps/calendar/lib/hooks.php
index 22e8d8e20f28257bc1c6e7c31401546b2a9d693a..328d2951d231cde4669accd7da609c5b730a1449 100644
--- a/apps/calendar/lib/hooks.php
+++ b/apps/calendar/lib/hooks.php
@@ -22,6 +22,8 @@ class OC_Calendar_Hooks{
 			OC_Calendar_Calendar::deleteCalendar($calendar['id']);
 		}
 
+		OC_Calendar_Share::post_userdelete($parameters['uid']);
+
 		return true;
 	}
 }
diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/lib/share.php b/apps/calendar/lib/share.php
old mode 100755
new mode 100644
index 488495aefc424e02b6138d1eaa5ec7771585e547..54c531892f05b3c095b83022a6619fbab2fc91fb
--- a/apps/calendar/lib/share.php
+++ b/apps/calendar/lib/share.php
@@ -256,4 +256,21 @@ class OC_Calendar_Share{
 			$stmt = OCP\DB::prepare("UPDATE *PREFIX*calendar_share_calendar SET active = ? WHERE share = ? AND sharetype = 'user' AND calendarid = ?");
 			$stmt->execute(array($active, $share, $id));
 		}
+
+		/*
+		 * @brief delete all shared calendars / events after a user was deleted
+		 * @param (string) $userid
+		 * @return (bool)
+		 */
+		public static function post_userdelete($userid){			
+			$stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE owner = ?');
+			$stmt->execute(array($userid));
+			$stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE owner = ?');
+			$stmt->execute(array($userid));
+			$stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_calendar WHERE share = ? AND sharetype = 'user'");
+			$stmt->execute(array($userid));
+			$stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_event WHERE share = ? AND sharetype = 'user'");
+			$stmt->execute(array($userid));
+			return true;
+		}
 }
\ No newline at end of file
diff --git a/apps/calendar/settings.php b/apps/calendar/settings.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/part.choosecalendar.php b/apps/calendar/templates/part.choosecalendar.php
old mode 100755
new mode 100644
index a140316ea07863ab96c7173ed0d22a998cdfaba1..8d621cc3630a5e1b6ca554f4ed85acd82cd2cf09
--- a/apps/calendar/templates/part.choosecalendar.php
+++ b/apps/calendar/templates/part.choosecalendar.php
@@ -24,7 +24,7 @@ for($i = 0; $i < count($option_calendars); $i++){
 </tr>
 <tr>
 	<td colspan="6">
-		<p style="margin: 0 auto;width: 90%;"><input style="display:none;width: 90%;float: left;" type="text" id="caldav_url" onmouseover="$('#caldav_url').select();" title="<?php echo $l->t("CalDav Link"); ?>"><img id="caldav_url_close" style="height: 20px;vertical-align: middle;display: none;" src="../../core/img/actions/delete.svg" alt="close" onclick="$('#caldav_url').hide();$('#caldav_url_close').hide();"/></p>
+		<p style="margin: 0 auto;width: 90%;"><input style="display:none;width: 90%;float: left;" type="text" id="caldav_url" onmouseover="$('#caldav_url').select();" title="<?php echo $l->t("CalDav Link"); ?>"><img id="caldav_url_close" style="height: 20px;vertical-align: middle;display: none;" src="<?php echo OCP\Util::imagePath('core', 'actions/delete.svg') ?>" alt="close" onclick="$('#caldav_url').hide();$('#caldav_url_close').hide();"/></p>
 	</td>
 </tr>
 </table><br>
diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.php b/apps/calendar/templates/part.choosecalendar.rowfields.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/part.eventform.php b/apps/calendar/templates/part.eventform.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/part.import.php b/apps/calendar/templates/part.import.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/part.showevent.php b/apps/calendar/templates/part.showevent.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/calendar/templates/share.dropdown.php b/apps/calendar/templates/share.dropdown.php
old mode 100755
new mode 100644
index 20d4c19bc19ea1c4fa9d0a301186b7837ed9f657..07b4c4bced5811b04473a09df0239064d6418ea2
--- a/apps/calendar/templates/share.dropdown.php
+++ b/apps/calendar/templates/share.dropdown.php
@@ -63,7 +63,7 @@ echo OCP\html_select_options($allgroups, array());
 	<script>
 		$('#sharewithgroup_<?php echo $group['share']; ?> > img').click(function(){
 			$('#share_group option[value="<?php echo $group['share']; ?>"]').removeAttr('disabled');
-			Calendar.UI.Share.unshare(<?php echo $id; ?>, '<?php echo (array_key_exists('calid', $_)?'calendar':'event');?>, '<?php echo $group['share']; ?>', 'group'); ?>
+			Calendar.UI.Share.unshare(<?php echo $id; ?>, '<?php echo (array_key_exists('calid', $_)?'calendar':'event');?>', '<?php echo $group['share']; ?>', 'group');
 			$('#sharewithgroup_<?php echo $group['share']; ?>').remove();
 			$("#share_group").trigger("liszt:updated");
 		});
diff --git a/apps/contacts/ajax/activation.php b/apps/contacts/ajax/activation.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/addbook.php b/apps/contacts/ajax/addbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/addcontact.php b/apps/contacts/ajax/addcontact.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/categories/categoriesfor.php b/apps/contacts/ajax/categories/categoriesfor.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/categories/delete.php b/apps/contacts/ajax/categories/delete.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/categories/list.php b/apps/contacts/ajax/categories/list.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/categories/rescan.php b/apps/contacts/ajax/categories/rescan.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/chooseaddressbook.php b/apps/contacts/ajax/chooseaddressbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/contactdetails.php b/apps/contacts/ajax/contactdetails.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/contacts.php b/apps/contacts/ajax/contacts.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/cropphoto.php b/apps/contacts/ajax/cropphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/currentphoto.php b/apps/contacts/ajax/currentphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/deletebook.php b/apps/contacts/ajax/deletebook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/deletecard.php b/apps/contacts/ajax/deletecard.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/deleteproperty.php b/apps/contacts/ajax/deleteproperty.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/editaddress.php b/apps/contacts/ajax/editaddress.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/editaddressbook.php b/apps/contacts/ajax/editaddressbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/editname.php b/apps/contacts/ajax/editname.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/importaddressbook.php b/apps/contacts/ajax/importaddressbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/importdialog.php b/apps/contacts/ajax/importdialog.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/loadcard.php b/apps/contacts/ajax/loadcard.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/loadintro.php b/apps/contacts/ajax/loadintro.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/loadphoto.php b/apps/contacts/ajax/loadphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/oc_photo.php b/apps/contacts/ajax/oc_photo.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/savecrop.php b/apps/contacts/ajax/savecrop.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/saveproperty.php b/apps/contacts/ajax/saveproperty.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/updateaddressbook.php b/apps/contacts/ajax/updateaddressbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/uploadimport.php b/apps/contacts/ajax/uploadimport.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/ajax/uploadphoto.php b/apps/contacts/ajax/uploadphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php
old mode 100755
new mode 100644
index e5e1d572f2dde32d9b3da4aa5c4c13cb0b43e112..20d97697bf43975798281f4e362c3241f8c18a93
--- a/apps/contacts/appinfo/app.php
+++ b/apps/contacts/appinfo/app.php
@@ -19,7 +19,7 @@ OCP\App::addNavigationEntry( array(
   'order' => 10,
   'href' => OCP\Util::linkTo( 'contacts', 'index.php' ),
   'icon' => OCP\Util::imagePath( 'settings', 'users.svg' ),
-  'name' => OC_L10N::get('contact')->t('Contacts') ));
+  'name' => OC_L10N::get('contacts')->t('Contacts') ));
 
 
 OCP\App::registerPersonal('contacts','settings');
diff --git a/apps/contacts/appinfo/migrate.php b/apps/contacts/appinfo/migrate.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/appinfo/remote.php b/apps/contacts/appinfo/remote.php
old mode 100755
new mode 100644
index 67006b77f97c1c3c4ddfe85e6e9d21eb434b9409..ef50e4ad39ffe9040a7db755c906d2725202c5fa
--- a/apps/contacts/appinfo/remote.php
+++ b/apps/contacts/appinfo/remote.php
@@ -22,6 +22,14 @@
 
 OCP\App::checkAppEnabled('contacts');
 
+if(substr($_SERVER["REQUEST_URI"],0,strlen(OC::$APPSWEBROOT . '/apps/contacts/carddav.php')) == OC::$APPSWEBROOT . '/apps/contacts/carddav.php'){
+	$baseuri = OC::$APPSWEBROOT . '/apps/contacts/carddav.php';
+}
+
+// only need authentication apps
+$RUNTIME_APPTYPES=array('authentication');
+OC_App::loadApps($RUNTIME_APPTYPES);
+
 // Backends
 $authBackend = new OC_Connector_Sabre_Auth();
 $principalBackend = new OC_Connector_Sabre_Principal();
diff --git a/apps/contacts/carddav.php b/apps/contacts/carddav.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0579e625d7d6f4603017fd0c91c6a422c75e4fb
--- /dev/null
+++ b/apps/contacts/carddav.php
@@ -0,0 +1,6 @@
+<?php
+if(!file_exists('../../lib/base.php')){
+	die('Please update the path to /lib/base.php in carddav.php or make use of /remote.php/carddav/');
+}
+require_once('../../lib/base.php');
+require_once('appinfo/remote.php');
\ No newline at end of file
diff --git a/apps/contacts/css/contacts.css b/apps/contacts/css/contacts.css
index 2553b43a8734de6f441b0d487dd70c62285a432a..94a0db4f77e5bdb825e9eade6bb7240028b6a369 100644
--- a/apps/contacts/css/contacts.css
+++ b/apps/contacts/css/contacts.css
@@ -4,8 +4,7 @@
 #leftcontent { top: 3.5em !important; padding: 0; margin: 0; }
 #rightcontent { top: 3.5em !important; padding-top: 5px; }
 #contacts { background: #fff; width: 20em; left: 12.5em; top: 3.7em; bottom:3em; position: fixed; overflow: auto; padding: 0; margin: 0; }
-#contacts li { height: 28px; display: block; margin: 0 0 0 5px; padding: 0 0 0 25px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; -webkit-transition:background-color 200ms; -moz-transition:background-color 200ms; -o-transition:background-color 200ms; transition:background-color 200ms; }
-#contacts li:hover { background-color: #eee }
+#contacts a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; }
 #bottomcontrols { padding: 0; bottom:0px; height:2.8em; width: 20em; margin:0; background:#eee; border-top:1px solid #ccc; position:fixed; -moz-box-shadow: 0 -3px 3px -3px #000; -webkit-box-shadow: 0 -3px 3px -3px #000; box-shadow: 0 -3px 3px -3px #000;}
 #contacts_newcontact { float: left; margin: 0.2em 0 0 1em; }
 #chooseaddressbook { float: right; margin: 0.2em 1em 0 0; }
@@ -92,7 +91,8 @@ dl.addresscard .action { float: right; }
 
 #file_upload_form { width: 0; height: 0; }
 #file_upload_target, #import_upload_target, #crop_target { display:none; }
-#file_upload_start, #import_upload_start { opacity:0; filter:alpha(opacity=0); z-index:1; /*position:absolute; left:0; top:0;*/ width:0; height:0;}
+#file_upload_start, #import_upload_start { opacity:0; filter:alpha(opacity=0); z-index:1001; /*position:absolute; left:0; top:0;*/ width:0; height:0;}
+#import_upload_start { width: 16px; height: 16px; margin: 0 0 0 0; }
 input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; }
 .big { font-weight:bold; font-size:1.2em; }
 .huge { font-weight:bold; font-size:1.5em; }
diff --git a/apps/contacts/dynphoto.php b/apps/contacts/dynphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/export.php b/apps/contacts/export.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/import.php b/apps/contacts/import.php
old mode 100755
new mode 100644
index 2386a1cff980d6f7bf579dfe7c5a15cce1a19dd5..7c1c98d9f5d0cc41b691152e4c4e7713e4427651
--- a/apps/contacts/import.php
+++ b/apps/contacts/import.php
@@ -12,11 +12,15 @@ OCP\JSON::checkLoggedIn();
 OCP\App::checkAppEnabled('contacts');
 $nl = "\n";
 $progressfile = 'import_tmp/' . md5(session_id()) . '.txt';
-if(is_writable('import_tmp/')){
-	$progressfopen = fopen($progressfile, 'w');
-	fwrite($progressfopen, '10');
-	fclose($progressfopen);
+
+function writeProgress($pct) {
+	if(is_writable('import_tmp/')){
+		$progressfopen = fopen($progressfile, 'w');
+		fwrite($progressfopen, $pct);
+		fclose($progressfopen);
+	}
 }
+writeProgress('10');
 $view = $file = null;
 if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') {
 	$view = OCP\App::getStorage('contacts');
@@ -28,20 +32,23 @@ if(!$file) {
 	OCP\JSON::error(array('message' => 'Import file was empty.'));
 	exit();
 }
-
 if(isset($_POST['method']) && $_POST['method'] == 'new'){
 	$id = OC_Contacts_Addressbook::add(OCP\USER::getUser(), $_POST['addressbookname']);
+	if(!$id) {
+		OCP\JSON::error(array('message' => 'Error creating address book.'));
+		exit();
+	}
 	OC_Contacts_Addressbook::setActive($id, 1);
 }else{
 	$id = $_POST['id'];
+	if(!$id) {
+		OCP\JSON::error(array('message' => 'Error getting the ID of the address book.'));
+		exit();
+	}
 	OC_Contacts_App::getAddressbook($id); // is owner access check
 }
 //analyse the contacts file
-if(is_writable('import_tmp/')){
-	$progressfopen = fopen($progressfile, 'w');
-	fwrite($progressfopen, '20');
-	fclose($progressfopen);
-}
+writeProgress('20');
 $searchfor = array('VCARD');
 $parts = $searchfor;
 $filearr = explode($nl, $file);
@@ -65,11 +72,7 @@ foreach($filearr as $line){
 	$i++;
 }
 //import the contacts
-if(is_writable('import_tmp/')){
-	$progressfopen = fopen($progressfile, 'w');
-	fwrite($progressfopen, '40');
-	fclose($progressfopen);
-}
+writeProgress('40');
 $start = '';
 for ($i = 0; $i < $parts[0]['begin']; $i++) { 
 	if($i == 0){
@@ -86,11 +89,7 @@ for($i = $parts[count($parts) - 1]['end'] + 1;$i <= count($filearr) - 1; $i++){
 		$end .= $nl . $filearr[$i];
 	}
 }
-if(is_writable('import_tmp/')){
-	$progressfopen = fopen($progressfile, 'w');
-	fwrite($progressfopen, '50');
-	fclose($progressfopen);
-}
+writeProgress('50');
 $importready = array();
 foreach($parts as $part){
 	for($i = $part['begin']; $i <= $part['end'];$i++){
@@ -102,16 +101,16 @@ foreach($parts as $part){
 	}
 	$importready[] = $start . $nl . $content . $nl . $end;
 }
-if(is_writable('import_tmp/')){
-	$progressfopen = fopen($progressfile, 'w');
-	fwrite($progressfopen, '70');
-	fclose($progressfopen);
-}
+writeProgress('70');
 if(count($parts) == 1){
 	$importready = array($file);
 }
 $imported = 0;
 $failed = 0;
+if(!count($importready) > 0) {
+	OCP\JSON::error(array('message' => 'No contacts to import in .'.$_POST['file'].' Please check if the file is corrupted.'));
+	exit();
+}
 foreach($importready as $import){
 	$card = OC_VObject::parse($import);
 	if (!$card) {
@@ -123,11 +122,7 @@ foreach($importready as $import){
 	OC_Contacts_VCard::add($id, $card);
 }
 //done the import
-if(is_writable('import_tmp/')){
-	$progressfopen = fopen($progressfile, 'w');
-	fwrite($progressfopen, '100');
-	fclose($progressfopen);
-}
+writeProgress('100');
 sleep(3);
 if(is_writable('import_tmp/')){
 	unlink($progressfile);
diff --git a/apps/contacts/index.php b/apps/contacts/index.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js
index 171dc5e58a2975510e71062a601054f9c9db96b4..256b5ad6d0a670aad01579cafc1530c62042d574 100644
--- a/apps/contacts/js/contacts.js
+++ b/apps/contacts/js/contacts.js
@@ -148,13 +148,20 @@ Contacts={
 					click: function() { $(this).dialog('close'); }
 				}
 			] );
-
+			
+			/*$('#fn').blur(function(){
+				if($('#fn').val() == '') {
+					OC.dialogs.alert(t('contacts','The name field cannot be empty. Please enter a name for this contact.'), t('contacts','Name is empty'), function() { $('#fn').focus(); });
+					$('#fn').focus();
+					return false;
+				}
+			});*/
+			
 			// Name has changed. Update it and reorder.
 			$('#fn').change(function(){
 				var name = $('#fn').val();
-				var item = $('#contacts [data-id="'+Contacts.UI.Card.id+'"]').clone();
-				$('#contacts [data-id="'+Contacts.UI.Card.id+'"]').remove();
-				$(item).html(name);
+				var item = $('#contacts [data-id="'+Contacts.UI.Card.id+'"]');
+				$(item).find('a').html(name);
 				var added = false;
 				$('#contacts li').each(function(){
 					if ($(this).text().toLowerCase() > name.toLowerCase()) {
@@ -166,6 +173,7 @@ Contacts={
 				if(!added) {
 					$('#leftcontent ul').append(item);
 				}
+				Contacts.UI.Contacts.scrollTo(Contacts.UI.Card.id);
 			});
 
 			$('#contacts_deletecard').click( function() { Contacts.UI.Card.doDelete();return false;} );
@@ -184,6 +192,28 @@ Contacts={
 				return false;
 			});
 
+			// Profile picture upload handling
+			// New profile picture selected
+			$('#file_upload_start').change(function(){
+				Contacts.UI.Card.uploadPhoto(this.files);
+			});
+			$('#contacts_details_photo_wrapper').bind('dragover',function(event){
+				$(event.target).addClass('droppable');
+				event.stopPropagation();
+				event.preventDefault();  
+			});
+			$('#contacts_details_photo_wrapper').bind('dragleave',function(event){
+				$(event.target).removeClass('droppable');
+				//event.stopPropagation();
+				//event.preventDefault();  
+			});
+			$('#contacts_details_photo_wrapper').bind('drop',function(event){
+				event.stopPropagation();
+				event.preventDefault();
+				$(event.target).removeClass('droppable');
+				$.fileUpload(event.originalEvent.dataTransfer.files);
+			});
+
 			$('#categories').multiple_autocomplete({source: categories});
 			$('#contacts_deletecard').tipsy({gravity: 'ne'});
 			$('#contacts_downloadcard').tipsy({gravity: 'ne'});
@@ -203,31 +233,38 @@ Contacts={
 			data:undefined,
 			update:function(id) {
 				var newid;
-				if(id == undefined) {
+				if(!id) {
 					newid = $('#contacts li:first-child').data('id');
 				} else {
 					newid = id;
 				}
+				var localLoadContact = function(id) {
+					if($('#contacts li').length > 0) {
+						$('#leftcontent li[data-id="'+newid+'"]').addClass('active');
+						$.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':newid},function(jsondata){
+							if(jsondata.status == 'success'){
+								Contacts.UI.Card.loadContact(jsondata.data);
+							} else {
+								OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
+							}
+						});
+					}
+				}
+				
 				// Make sure proper DOM is loaded.
-				if(!$('#card')) {
+				if(!$('#card')[0]) {
 					$.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{},function(jsondata){
 						if(jsondata.status == 'success'){
-							$('#rightcontent').html(jsondata.data.page);
+							$('#rightcontent').html(jsondata.data.page).ready(function() {
+								Contacts.UI.loadHandlers();
+								localLoadContact(newid);
+							});
 						} else {
 							OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
 						}
 					});
 				}
-				if($('#contacts li').length > 0) {
-					$('#leftcontent li[data-id="'+newid+'"]').addClass('active');
-					$.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':newid},function(jsondata){
-						if(jsondata.status == 'success'){
-							Contacts.UI.Card.loadContact(jsondata.data);
-						} else {
-							OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
-						}
-					});
-				} else if($('#contacts li').length == 0) {
+				else if($('#contacts li').length == 0) {
 					// load intro page
 					$.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){
 						if(jsondata.status == 'success'){
@@ -239,6 +276,9 @@ Contacts={
 						}
 					});
 				}
+				else {
+					localLoadContact();
+				}
 			},
 			doExport:function() {
 				document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id;
@@ -253,62 +293,62 @@ Contacts={
 				return false;
 			},
 			add:function(n, fn, aid, isnew){ // add a new contact
+				var localAddcontact = function(n, fn, aid, isnew) {
+					$.post(OC.filePath('contacts', 'ajax', 'addcontact.php'), { n: n, fn: fn, aid: aid, isnew: isnew },
+					function(jsondata) {
+						if (jsondata.status == 'success'){
+							$('#rightcontent').data('id',jsondata.data.id);
+							var id = jsondata.data.id;
+							$.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){
+								if(jsondata.status == 'success'){
+									Contacts.UI.Card.loadContact(jsondata.data);
+									$('#leftcontent .active').removeClass('active');
+									var item = $('<li data-id="'+jsondata.data.id+'" class="active"><a href="index.php?id='+jsondata.data.id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+jsondata.data.id+') no-repeat scroll 0% 0% transparent;">'+Contacts.UI.Card.fn+'</a></li>');
+									var added = false;
+									$('#leftcontent ul li').each(function(){
+										if ($(this).text().toLowerCase() > Contacts.UI.Card.fn.toLowerCase()) {
+											$(this).before(item).fadeIn('fast');
+											added = true;
+											return false;
+										}
+									});
+									if(!added) {
+										$('#leftcontent ul').append(item);
+									}
+									if(isnew) { // add some default properties
+										Contacts.UI.Card.addProperty('EMAIL');
+										Contacts.UI.Card.addProperty('TEL');
+										$('#fn').focus();
+									}
+								}
+								else{
+									OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
+								}
+							});
+							$('#contact_identity').show();
+							$('#actionbar').show();
+						}
+						else{
+							OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
+						}
+					});
+				}
+			
 				var card = $('#card')[0];
-				//if(!card) {
+				if(!card) {
 					$.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{},function(jsondata){
 						if(jsondata.status == 'success'){
-							$('#rightcontent').html(jsondata.data.page);
-							Contacts.UI.loadHandlers();
+							$('#rightcontent').html(jsondata.data.page).ready(function() {
+								Contacts.UI.loadHandlers();
+								localAddcontact(n, fn, aid, isnew);
+							});
 						} else{
 							OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
 						}
 					});
-				//}
-				$.post(OC.filePath('contacts', 'ajax', 'addcontact.php'), { n: n, fn: fn, aid: aid, isnew: isnew },
-				  function(jsondata) {
-					if (jsondata.status == 'success'){
-						$('#rightcontent').data('id',jsondata.data.id);
-						var id = jsondata.data.id;
-						$.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){
-							if(jsondata.status == 'success'){
-								Contacts.UI.Card.loadContact(jsondata.data);
-								$('#leftcontent .active').removeClass('active');
-								var item = $('<li role="botton" data-id="'+jsondata.data.id+'" class="active" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+jsondata.data.id+') no-repeat scroll 0% 0% transparent;">'+Contacts.UI.Card.fn+'</li>');
-								var added = false;
-								$('#leftcontent ul li').each(function(){
-									if ($(this).text().toLowerCase() > Contacts.UI.Card.fn.toLowerCase()) {
-										$(this).before(item).fadeIn('fast');
-										added = true;
-										return false;
-									}
-								});
-								if(!added) {
-									$('#leftcontent ul').append(item);
-								}
-
-								if(isnew) { // add some default properties
-									Contacts.UI.Card.addProperty('EMAIL');
-									Contacts.UI.Card.addProperty('TEL');
-									//Contacts.UI.Card.addProperty('NICKNAME');
-									//Contacts.UI.Card.addProperty('ORG');
-									//Contacts.UI.Card.addProperty('CATEGORIES');
-									$('#fn').focus();
-									//$('#fn').val('');
-								}
-							}
-							else{
-								OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
-							}
-						});
-						$('#contact_identity').show();
-						$('#actionbar').show();
-						// TODO: Add to contacts list.
-					}
-					else{
-						OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
-						//alert(jsondata.data.message);
-					}
-				});
+				} else {
+					localAddcontact(n, fn, aid, isnew);
+				}
 			},
 			doDelete:function() {
 				$('#contacts_deletecard').tipsy('hide');
@@ -474,9 +514,9 @@ Contacts={
 				if(this.honsuf.length > 0) {
 					this.fullname += ', ' + this.honsuf;
 				}
-				$('#n').html(this.fullname);
+				$('#n').val(narray.join(';'));
 				$('#fn_select option').remove();
-				var names = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
+				var names = [this.fn, this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
 				if(this.data.ORG) {
 					names[names.length]=this.data.ORG[0].value;
 				}
@@ -586,7 +626,7 @@ Contacts={
 				q = q + '&id=' + this.id + '&name=' + name;
 				if(checksum != undefined && checksum != '') { // save
 					q = q + '&checksum=' + checksum;
-					console.log('Saving: ' + q);
+					//console.log('Saving: ' + q);
 					$(obj).attr('disabled', 'disabled');
 					$.post(OC.filePath('contacts', 'ajax', 'saveproperty.php'),q,function(jsondata){
 						if(jsondata.status == 'success'){
@@ -604,7 +644,7 @@ Contacts={
 						}
 					},'json');
 				} else { // add
-					console.log('Adding: ' + q);
+					//console.log('Adding: ' + q);
 					$(obj).attr('disabled', 'disabled');
 					$.post(OC.filePath('contacts', 'ajax', 'addproperty.php'),q,function(jsondata){
 						if(jsondata.status == 'success'){
@@ -1247,7 +1287,7 @@ Contacts={
 								close : function(event, ui) {
 									$(this).dialog('destroy').remove();
 								}
-							});
+							}).css('overflow','visible');
 						} else {
 							alert(jsondata.data.message);
 						}
@@ -1298,7 +1338,8 @@ Contacts={
 				$('#importaddressbook_dialog').find('.upload').click(function() {
 					Contacts.UI.Addressbooks.droptarget.html(t('contacts', 'Uploading...'));
 					Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, true);
-					$('#import_upload_start').trigger('click');
+					//$('#import_upload_start').trigger('click');
+					//return false;
 				});
 				$('#importaddressbook_dialog').find('.upload').tipsy();
 				this.droptarget = $('#import_drop_target');
@@ -1316,10 +1357,10 @@ Contacts={
 					$(event.target).removeClass('droppable');
 					$(event.target).html(t('contacts', 'Uploading...'));
 					Contacts.UI.loading(event.target, true);
-					$.fileUpload(event.originalEvent.dataTransfer.files);
+					$.importUpload(event.originalEvent.dataTransfer.files);
 				});
 
-				$.fileUpload = function(files){
+				$.importUpload = function(files){
 					var file = files[0];
 					if(file.size > $('#max_upload').val()){
 						OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large'));
@@ -1338,7 +1379,7 @@ Contacts={
 					if (!xhr.upload) {
 						OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please upload the contacts file to ownCloud and import that way.'), t('contacts', 'Error'))
 					}
-					fileUpload = xhr.upload,
+					importUpload = xhr.upload,
 					xhr.onreadystatechange = function() {
 						if (xhr.readyState == 4){
 							response = $.parseJSON(xhr.responseText);
@@ -1455,20 +1496,33 @@ Contacts={
 						OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
 					}
 				});
+				setTimeout(function() {
+					$('#contacts li').unbind('inview');
+					$('#contacts li').bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
+						if (isInView) {
+							if (!$(this).find('a').attr('style')) {
+								$(this).find('a').css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat');
+							}
+						}
+					})}, 500);
 				setTimeout(Contacts.UI.Contacts.lazyupdate, 500);
 			},
 			// Add thumbnails to the contact list as they become visible in the viewport.
 			lazyupdate:function(){
 				$('#contacts li').live('inview', function(){
-					if (!$(this).attr('style')) {
-						$(this).css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat');
+					if (!$(this).find('a').attr('style')) {
+						$(this).find('a').css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat');
 					}
 				});
 			},
 			refreshThumbnail:function(id){
-				var item = $('#contacts [data-id="'+id+'"]');
+				var item = $('#contacts [data-id="'+id+'"]').find('a');
 				item.html(Contacts.UI.Card.fn);
 				item.css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+id+'&refresh=1'+Math.random()+') no-repeat');
+			},
+			scrollTo:function(id){
+				$('#contacts').animate({
+					scrollTop: $('#leftcontent li[data-id="'+id+'"]').offset().top-20}, 'slow','swing');
 			}
 		}
 	}
@@ -1496,9 +1550,10 @@ $(document).ready(function(){
 	});
 	$('#contacts').click(function(event){
 		var $tgt = $(event.target);
-		if ($tgt.is('li')) {
-			var id = $($tgt).data('id');
-			$($tgt).addClass('active');
+		if ($tgt.is('li') || $tgt.is('a')) {
+			var item = $tgt.is('li')?$($tgt):($tgt).parent();
+			var id = item.data('id');
+			item.addClass('active');
 			var oldid = $('#rightcontent').data('id');
 			if(oldid != 0){
 				$('#contacts li[data-id="'+oldid+'"]').removeClass('active');
@@ -1524,9 +1579,9 @@ $(document).ready(function(){
 				// bottom part of element is visible
 			} else {
 				// whole part of element is visible
-				if (!$(this).attr('style')) {
+				if (!$(this).find('a').attr('style')) {
 					//alert($(this).data('id') + ' has background: ' + $(this).attr('style'));
-					$(this).css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat');
+					$(this).find('a').css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat');
 				}/* else {
 					alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url'));
 				}*/
@@ -1540,28 +1595,6 @@ $(document).ready(function(){
 		Contacts.UI.Card.saveProperty(this);
 	});
 
-	// Profile picture upload handling
-	// New profile picture selected
-	$('#file_upload_start').change(function(){
-		Contacts.UI.Card.uploadPhoto(this.files);
-	});
-	$('#contacts_details_photo_wrapper').bind('dragover',function(event){
-		$(event.target).addClass('droppable');
-		event.stopPropagation();
-		event.preventDefault();  
-	});
-	$('#contacts_details_photo_wrapper').bind('dragleave',function(event){
-		$(event.target).removeClass('droppable');
-		//event.stopPropagation();
-		//event.preventDefault();  
-	});
-	$('#contacts_details_photo_wrapper').bind('drop',function(event){
-		event.stopPropagation();
-		event.preventDefault();
-		$(event.target).removeClass('droppable');
-		$.fileUpload(event.originalEvent.dataTransfer.files);
-	});
-
 	/**
 	 * Upload function for dropped files. Should go in the Contacts class/object.
 	 */
diff --git a/apps/contacts/js/loader.js b/apps/contacts/js/loader.js
index 95fd7dc94eadab603fcb3281ee11fc1241196056..8c79ea8a1d676b9ea155d0a9c2c583b926db8379 100644
--- a/apps/contacts/js/loader.js
+++ b/apps/contacts/js/loader.js
@@ -1,83 +1,86 @@
-/**
- * Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-Contacts_Import={
-	importdialog: function(filename){
-		var path = $('#dir').val();
-		$('body').append('<div id="contacts_import"></div>');
-		$('#contacts_import').load(OC.filePath('contacts', 'ajax', 'importdialog.php'), {filename:filename, path:path},	function(){Contacts_Import.initdialog(filename);});
-	},
-	initdialog: function(filename){
-		$('#contacts_import_dialog').dialog({
-			width : 500,
-			close : function() {
-				$(this).dialog('destroy').remove();
-				$('#contacts_import').remove();
-			}
-		});
-		$('#import_done_button').click(function(){
-			$('#contacts_import_dialog').dialog('destroy').remove();
-			$('#contacts_import').remove();
-		});
-		$('#progressbar').progressbar({value: 0});
-		$('#startimport').click(function(){
-			var filename = $('#filename').val();
-			var path = $('#path').val();
-			var addressbookid = $('#contacts option:selected').val();
-			if($('#contacts option:selected').val() == 'newaddressbook'){
-				var method = 'new';
-				var addressbookname = $('#newaddressbook').val();
-				var addressbookname = $.trim(addressbookname);
-				if(newaddressbook == ''){
-					$('#newaddressbook').css('background-color', '#FF2626');
-					$('#newaddressbook').focus(function(){
-						$('#newaddressbook').css('background-color', '#F8F8F8');
-					});
-					return false;
-				}
-			}else{
-				var method = 'old';
-			}
-			$('#newaddressbook').attr('readonly', 'readonly');
-			$('#contacts').attr('disabled', 'disabled');
-			var progressfile = $('#progressfile').val();
-			$.post(OC.filePath('contacts', '', 'import.php'), {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(data){
-				if(data.status == 'success'){
-					$('#progressbar').progressbar('option', 'value', 100);
-					$('#import_done').css('display', 'block');
-				}
-			});
-			$('#form_container').css('display', 'none');
-			$('#progressbar_container').css('display', 'block');
-			window.setTimeout('Contacts_Import.getimportstatus(\'' + progressfile + '\')', 500);
-		});
-		$('#contacts').change(function(){
-			if($('#contacts option:selected').val() == 'newaddressbook'){
-				$('#newaddressbookform').slideDown('slow');
-			}else{
-				$('#newaddressbookform').slideUp('slow');
-			}
-		});
-	},
-	getimportstatus: function(progressfile){
-		$.get(OC.filePath('contacts', 'import_tmp', progressfile), function(percent){
-			$('#progressbar').progressbar('option', 'value', parseInt(percent));
-			if(percent < 100){
-				window.setTimeout('Contacts_Import.getimportstatus(\'' + progressfile + '\')', 500);
-			}else{
+/**
+ * Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+Contacts_Import={
+	importdialog: function(filename){
+		var path = $('#dir').val();
+		$('body').append('<div id="contacts_import"></div>');
+		$('#contacts_import').load(OC.filePath('contacts', 'ajax', 'importdialog.php'), {filename:filename, path:path},	function(){Contacts_Import.initdialog(filename);});
+	},
+	initdialog: function(filename){
+		$('#contacts_import_dialog').dialog({
+			width : 500,
+			close : function() {
+				$(this).dialog('destroy').remove();
+				$('#contacts_import').remove();
+			}
+		});
+		$('#import_done_button').click(function(){
+			$('#contacts_import_dialog').dialog('destroy').remove();
+			$('#contacts_import').remove();
+		});
+		$('#progressbar').progressbar({value: 0});
+		$('#startimport').click(function(){
+			var filename = $('#filename').val();
+			var path = $('#path').val();
+			var method = 'old';
+			var addressbookid = $('#contacts option:selected').val();
+			if($('#contacts option:selected').val() == 'newaddressbook'){
+				var method = 'new';
+				var addressbookname = $('#newaddressbook').val();
+				var addressbookname = $.trim(addressbookname);
+				if(addressbookname == ''){
+					$('#newaddressbook').css('background-color', '#FF2626');
+					$('#newaddressbook').focus(function(){
+						$('#newaddressbook').css('background-color', '#F8F8F8');
+					});
+					return false;
+				}
+			}
+			$('#newaddressbook').attr('readonly', 'readonly');
+			$('#contacts').attr('disabled', 'disabled');
+			var progressfile = $('#progressfile').val();
+			$.post(OC.filePath('contacts', '', 'import.php'), {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(jsondata){
+				if(jsondata.status == 'success'){
+					$('#progressbar').progressbar('option', 'value', 100);
+					$('#import_done').find('p').html(t('contacts', 'Result: ') + jsondata.data.imported + t('contacts', ' imported, ') + jsondata.data.failed + t('contacts', ' failed.'));
+				} else {
+					$('#import_done').find('p').html(jsondata.data.message);
+				}
+				$('#import_done').show().find('p').addClass('bold');
+				$('#progressbar').fadeOut('slow');
+			});
+			$('#form_container').css('display', 'none');
+			$('#progressbar_container').css('display', 'block');
+			window.setTimeout('Contacts_Import.getimportstatus(\'' + progressfile + '\')', 500);
+		});
+		$('#contacts').change(function(){
+			if($('#contacts option:selected').val() == 'newaddressbook'){
+				$('#newaddressbookform').slideDown('slow');
+			}else{
+				$('#newaddressbookform').slideUp('slow');
+			}
+		});
+	},
+	getimportstatus: function(progressfile){
+		$.get(OC.filePath('contacts', 'import_tmp', progressfile), function(percent){
+			$('#progressbar').progressbar('option', 'value', parseInt(percent));
+			if(percent < 100){
+				window.setTimeout('Contacts_Import.getimportstatus(\'' + progressfile + '\')', 500);
+			}else{
 				$('#import_done').css('display', 'block');
-			}
-		});
-	}
-}
-$(document).ready(function(){
-	if(typeof FileActions !== 'undefined'){
-		FileActions.register('text/vcard','importaddressbook', '', Contacts_Import.importdialog); 
-		FileActions.setDefault('text/vcard','importaddressbook');
-		FileActions.register('text/x-vcard','importaddressbook', '', Contacts_Import.importdialog); 
-		FileActions.setDefault('text/x-vcard','importaddressbook');
-	};
+			}
+		});
+	}
+}
+$(document).ready(function(){
+	if(typeof FileActions !== 'undefined'){
+		FileActions.register('text/vcard','importaddressbook', '', Contacts_Import.importdialog); 
+		FileActions.setDefault('text/vcard','importaddressbook');
+		FileActions.register('text/x-vcard','importaddressbook', '', Contacts_Import.importdialog); 
+		FileActions.setDefault('text/x-vcard','importaddressbook');
+	};
 });
\ No newline at end of file
diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php
index 950823bc650b1660fbc0bd8225b3748115c87238..d2d96dfbac179770dc663e5f0b9ad319fb2b6e24 100644
--- a/apps/contacts/l10n/ca.php
+++ b/apps/contacts/l10n/ca.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "S'ha produït un error en afegir el contacte.",
 "Cannot add empty property." => "No es pot afegir una propietat buida.",
 "At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.",
+"Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:",
 "Error adding contact property." => "Error en afegir la propietat del contacte.",
+"No ID provided" => "No heu facilitat cap ID",
+"Error setting checksum." => "Error en establir la suma de verificació.",
+"No categories selected for deletion." => "No heu seleccionat les categories a eliminar.",
+"No address books found." => "No s'han trobat llibretes d'adreces.",
+"No contacts found." => "No s'han trobat contactes.",
+"Missing ID" => "Falta la ID",
+"Error parsing VCard for ID: \"" => "Error en analitzar la ID de la VCard: \"",
+"Cannot add addressbook with an empty name." => "No es pot afegir una llibreta d'adreces amb un nom buit.",
 "Error adding addressbook." => "Error en afegir la llibreta d'adreces.",
 "Error activating addressbook." => "Error en activar la llibreta d'adreces.",
+"No contact ID was submitted." => "No s'ha tramès cap ID de contacte.",
+"Error loading image." => "Error en carregar la imatge.",
+"Error reading contact photo." => "Error en llegir la foto del contacte.",
+"Error saving temporary file." => "Error en desar el fitxer temporal.",
+"The loading photo is not valid." => "La foto carregada no és vàlida.",
+"id is not set." => "no s'ha establert la id.",
 "Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.",
 "Error deleting contact property." => "Error en eliminar la propietat del contacte.",
+"Contact ID is missing." => "falta la ID del contacte.",
+"Missing contact id." => "Falta la id del contacte.",
+"No photo path was submitted." => "No heu tramès el camí de la foto.",
+"File doesn't exist:" => "El fitxer no existeix:",
+"element name is not set." => "no s'ha establert el nom de l'element.",
+"checksum is not set." => "no s'ha establert la suma de verificació.",
+"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:",
+"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.",
 "Error updating contact property." => "Error en actualitzar la propietat del contacte.",
+"Cannot update addressbook with an empty name." => "No es pot actualitzar la llibreta d'adreces amb un nom buit",
 "Error updating addressbook." => "Error en actualitzar la llibreta d'adreces.",
+"Error uploading contacts to storage." => "Error en carregar contactes a l'emmagatzemament.",
+"There is no error, the file uploaded with success" => "No hi ha errors, el fitxer s'ha carregat correctament",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El fitxer carregat supera la directiva upload_max_filesize de php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML",
+"The uploaded file was only partially uploaded" => "El fitxer només s'ha carregat parcialment",
+"No file was uploaded" => "No s'ha carregat cap fitxer",
+"Missing a temporary folder" => "Falta un fitxer temporal",
 "Contacts" => "Contactes",
+"Addressbook not found." => "No s'ha trobat la llibreta d'adreces.",
 "This is not your addressbook." => "Aquesta no és la vostra llibreta d'adreces",
 "Contact could not be found." => "No s'ha trobat el contacte.",
 "Address" => "Adreça",
@@ -22,22 +54,53 @@
 "Mobile" => "Mòbil",
 "Text" => "Text",
 "Voice" => "Veu",
+"Message" => "Missatge",
 "Fax" => "Fax",
 "Video" => "Vídeo",
 "Pager" => "Paginador",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Aniversari de {name}",
 "Contact" => "Contacte",
 "Add Contact" => "Afegeix un contacte",
 "Addressbooks" => "Llibretes d'adreces",
+"Configure Address Books" => "Configura les llibretes d'adreces",
 "New Address Book" => "Nova llibreta d'adreces",
+"Import from VCF" => "Importa de VFC",
 "CardDav Link" => "Enllaç CardDav",
 "Download" => "Baixa",
 "Edit" => "Edita",
 "Delete" => "Suprimeix",
 "Download contact" => "Baixa el contacte",
 "Delete contact" => "Suprimeix el contacte",
+"Drop photo to upload" => "Elimina la foto a carregar",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma",
+"Edit name details" => "Edita detalls del nom",
+"Nickname" => "Sobrenom",
+"Enter nickname" => "Escriviu el sobrenom",
 "Birthday" => "Aniversari",
+"dd-mm-yyyy" => "dd-mm-yyyy",
+"Groups" => "Grups",
+"Separate groups with commas" => "Separeu els grups amb comes",
+"Edit groups" => "Edita els grups",
 "Preferred" => "Preferit",
+"Please specify a valid email address." => "Especifiqueu una adreça de correu electrònic correcta",
+"Enter email address" => "Escriviu una adreça de correu electrònic",
+"Mail to address" => "Envia per correu electrònic a l'adreça",
+"Delete email address" => "Elimina l'adreça de correu electrònic",
+"Enter phone number" => "Escriviu el número de telèfon",
+"Delete phone number" => "Elimina el número de telèfon",
+"View on map" => "Visualitza al mapa",
+"Edit address details" => "Edita els detalls de l'adreça",
+"Add notes here." => "Afegiu notes aquí.",
+"Add field" => "Afegeix un camp",
+"Profile picture" => "Foto de perfil",
 "Phone" => "Telèfon",
+"Note" => "Nota",
+"Delete current photo" => "Elimina la foto actual",
+"Edit current photo" => "Edita la foto actual",
+"Upload new photo" => "Carrega una foto nova",
+"Select photo from ownCloud" => "Selecciona una foto de ownCloud",
+"Edit address" => "Edita l'adreça",
 "Type" => "Tipus",
 "PO Box" => "Adreça postal",
 "Extended" => "Addicional",
@@ -46,13 +109,52 @@
 "Region" => "Comarca",
 "Zipcode" => "Codi postal",
 "Country" => "País",
+"Edit categories" => "Edita categories",
 "Add" => "Afegeix",
 "Addressbook" => "Llibreta d'adreces",
+"Hon. prefixes" => "Prefix honorífic:",
+"Miss" => "Srta",
+"Ms" => "Sra",
+"Mr" => "Sr",
+"Sir" => "Senyor",
+"Mrs" => "Sra",
+"Dr" => "Dr",
+"Given name" => "Nom específic",
+"Additional names" => "Noms addicionals",
+"Family name" => "Nom de familia",
+"Hon. suffixes" => "Sufix honorífic:",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
 "New Addressbook" => "Nova llibreta d'adreces",
 "Edit Addressbook" => "Edita la llibreta d'adreces",
 "Displayname" => "Nom a mostrar",
 "Active" => "Actiu",
 "Save" => "Desa",
 "Submit" => "Envia",
-"Cancel" => "Cancel·la"
+"Cancel" => "Cancel·la",
+"Import a contacts file" => "Importa un fitxer de contactes",
+"Please choose the addressbook" => "Escolliu la llibreta d'adreces",
+"create a new addressbook" => "crea una llibreta d'adreces nova",
+"Name of new addressbook" => "Nom de la nova llibreta d'adreces",
+"Import" => "Importa",
+"Importing contacts" => "S'estan important contactes",
+"Contacts imported successfully" => "Els contactes s'han importat correctament",
+"Close Dialog" => "Tanca el diàleg",
+"Import Addressbook" => "Importa la llibreta d'adreces",
+"Select address book to import to:" => "Seleccioneu la llibreta d'adreces a la que voleu importar:",
+"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.",
+"Select from HD" => "Selecciona de HD",
+"You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.",
+"Add contact" => "Afegeix un contacte",
+"Configure addressbooks" => "Configura les llibretes d'adreces",
+"CardDAV syncing addresses" => "Adreces de sincronització CardDAV",
+"more info" => "més informació",
+"Primary address (Kontact et al)" => "Adreça primària (Kontact i al)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/cs_CZ.php b/apps/contacts/l10n/cs_CZ.php
index c3bcd5cea39aad1c288b67226fe3c06c3ceaeedb..b510f68c1c60514be69a26badf6739ac698e96b7 100644
--- a/apps/contacts/l10n/cs_CZ.php
+++ b/apps/contacts/l10n/cs_CZ.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Během přidávání kontaktu nastala chyba.",
 "Cannot add empty property." => "Nelze přidat prazdný údaj.",
 "At least one of the address fields has to be filled out." => "Musí být uveden nejméně jeden z adresních údajů",
+"Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní atribut: ",
 "Error adding contact property." => "Chyba během přdávání údaje kontaktu.",
+"No ID provided" => "ID nezadáno",
+"Error setting checksum." => "Chyba při nastavování kontrolního součtu.",
+"No categories selected for deletion." => "Žádné kategorie nebyly vybrány k smazání.",
+"No address books found." => "Žádný adresář nenalezen.",
+"No contacts found." => "Žádné kontakty nenalezeny.",
+"Missing ID" => "Chybí ID",
+"Error parsing VCard for ID: \"" => "Chyba při parsování VCard pro ID: \"",
+"Cannot add addressbook with an empty name." => "Nelze přidat adresář s prázdným jménem.",
 "Error adding addressbook." => "Chyba při přidávání adresáře.",
 "Error activating addressbook." => "Chyba při aktivaci adresáře.",
+"No contact ID was submitted." => "Nebylo nastaveno ID kontaktu.",
+"Error loading image." => "Chyba při načítání obrázku.",
+"Error reading contact photo." => "Chyba při načítání fotky kontaktu.",
+"Error saving temporary file." => "Chyba při ukládání dočasného souboru.",
+"The loading photo is not valid." => "Načítaná fotka je vadná.",
+"id is not set." => "id neni nastaveno.",
 "Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.",
 "Error deleting contact property." => "Chyba při odstraňování údaje kontaktu.",
+"Contact ID is missing." => "Chybí ID kontaktu.",
+"Missing contact id." => "Chybí id kontaktu.",
+"No photo path was submitted." => "Žádná fotka nebyla nahrána.",
+"File doesn't exist:" => "Soubor neexistuje:",
+"element name is not set." => "jméno elementu není nastaveno.",
+"checksum is not set." => "kontrolní součet není nastaven.",
+"Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je nesprávná. Obnovte stránku, prosím.",
+"Something went FUBAR. " => "Něco se pokazilo. ",
 "Error updating contact property." => "Chyba při aktualizaci údaje kontaktu.",
+"Cannot update addressbook with an empty name." => "Nelze aktualizovat adresář s prázdným jménem.",
 "Error updating addressbook." => "Chyba při aktualizaci adresáře.",
+"Error uploading contacts to storage." => "Chyba při nahrávání kontaktů do úložiště.",
+"There is no error, the file uploaded with success" => "Nevyskytla se žádná chyba, soubor byl úspěšně nahrán",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Nahrávaný soubor překračuje nastavení upload_max_filesize directive v php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Nahrávaný soubor překračuje nastavení MAX_FILE_SIZE z voleb HTML formuláře",
+"The uploaded file was only partially uploaded" => "Nahrávaný soubor se nahrál pouze z části",
+"No file was uploaded" => "Žádný soubor nebyl nahrán",
+"Missing a temporary folder" => "Chybí dočasný adresář",
 "Contacts" => "Kontakty",
+"Addressbook not found." => "Adresář nenalezen.",
 "This is not your addressbook." => "Toto není Váš adresář.",
 "Contact could not be found." => "Kontakt nebyl nalezen.",
 "Address" => "Adresa",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobil",
 "Text" => "Text",
 "Voice" => "Hlas",
+"Message" => "Zpráva",
 "Fax" => "Fax",
 "Video" => "Video",
 "Pager" => "Pager",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Narozeniny {name}",
 "Contact" => "Kontakt",
 "Add Contact" => "Přidat kontakt",
 "Addressbooks" => "Adresáře",
+"Configure Address Books" => "Nastavit adresáře",
 "New Address Book" => "Nový adresář",
+"Import from VCF" => "Importovat z VCF",
 "CardDav Link" => "CardDav odkaz",
 "Download" => "Stažení",
 "Edit" => "Editovat",
 "Delete" => "Odstranit",
 "Download contact" => "Stáhnout kontakt",
 "Delete contact" => "Odstranit kontakt",
+"Drop photo to upload" => "Přetáhněte sem fotku pro její nahrání",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně oddelené čárkami",
+"Edit name details" => "Upravit podrobnosti jména",
+"Nickname" => "Přezdívka",
+"Enter nickname" => "Zadejte přezdívku",
 "Birthday" => "Narozeniny",
+"dd-mm-yyyy" => "dd. mm. yyyy",
+"Groups" => "Skupiny",
+"Separate groups with commas" => "Oddělte skupiny čárkami",
+"Edit groups" => "Upravit skupiny",
 "Preferred" => "Preferovaný",
+"Please specify a valid email address." => "Prosím zadejte platnou e-mailovou adresu",
+"Enter email address" => "Zadat e-mailovou adresu",
+"Mail to address" => "Odeslat na adresu",
+"Delete email address" => "Smazat e-mail",
+"Enter phone number" => "Zadat telefoní číslo",
+"Delete phone number" => "Smazat telefoní číslo",
+"View on map" => "Zobrazit na mapě",
+"Edit address details" => "Upravit podrobnosti adresy",
+"Add notes here." => "Zde můžete připsat poznámky.",
+"Add field" => "Přidat políčko",
+"Profile picture" => "Profilová fotka",
 "Phone" => "Telefon",
+"Note" => "Poznámka",
+"Delete current photo" => "Smazat současnou fotku",
+"Edit current photo" => "Upravit současnou fotku",
+"Upload new photo" => "Nahrát novou fotku",
+"Select photo from ownCloud" => "Vybrat fotku z ownCloudu",
+"Edit address" => "Upravit adresu",
 "Type" => "Typ",
 "PO Box" => "PO box",
 "Extended" => "Rozšířené",
@@ -46,13 +109,49 @@
 "Region" => "Kraj",
 "Zipcode" => "PSČ",
 "Country" => "Země",
+"Edit categories" => "Upravit kategorie",
 "Add" => "Přidat",
 "Addressbook" => "Adresář",
+"Hon. prefixes" => "Tituly před",
+"Miss" => "Slečna",
+"Mr" => "Pan",
+"Sir" => "Sir",
+"Mrs" => "Paní",
+"Dr" => "Dr",
+"Given name" => "Křestní jméno",
+"Additional names" => "Další jména",
+"Family name" => "Příjmení",
+"Hon. suffixes" => "Tituly za",
+"J.D." => "JUDr.",
+"M.D." => "MUDr.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "ml.",
+"Sn." => "st.",
 "New Addressbook" => "Nový adresář",
 "Edit Addressbook" => "Editace adresáře",
 "Displayname" => "Zobrazené jméno",
 "Active" => "Aktivní",
 "Save" => "Uložit",
 "Submit" => "Potvrdit",
-"Cancel" => "Storno"
+"Cancel" => "Storno",
+"Import a contacts file" => "Importovat soubor kontaktů",
+"Please choose the addressbook" => "Prosím zvolte adresář",
+"create a new addressbook" => "vytvořit nový adresář",
+"Name of new addressbook" => "Jméno nového adresáře",
+"Import" => "Import",
+"Importing contacts" => "Importování kontaktů",
+"Contacts imported successfully" => "Kontakty úspěšně importovány",
+"Close Dialog" => "Zavírací dialog",
+"Import Addressbook" => "Importovat adresář",
+"Select address book to import to:" => "Vyberte adresář do kterého chcete importovat:",
+"Drop a VCF file to import contacts." => "Pro import kontaktů sem přetáhněte soubor VCF",
+"Select from HD" => "Vybrat z disku",
+"You have no contacts in your addressbook." => "Nemáte žádné kontakty v adresáři.",
+"Add contact" => "Přidat kontakt",
+"Configure addressbooks" => "Nastavit adresář",
+"CardDAV syncing addresses" => "Adresa pro synchronizaci pomocí CardDAV:",
+"more info" => "víc informací",
+"Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php
index 616fe062dc3d09b1d31d9a1a4bab947a471a5c88..222d8560908099effca3230435f5b56ad159ece9 100644
--- a/apps/contacts/l10n/de.php
+++ b/apps/contacts/l10n/de.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Erstellen des Kontakts fehlgeschlagen",
 "Cannot add empty property." => "Feld darf nicht leer sein.",
 "At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.",
+"Trying to add duplicate property: " => "Versuche, doppelte Eigenschaft hinzuzufügen: ",
 "Error adding contact property." => "Kontakt ändern fehlgeschlagen",
+"No ID provided" => "Keine ID angegeben",
+"Error setting checksum." => "Fehler beim Setzen der Prüfsumme.",
+"No categories selected for deletion." => "Keine Kategorien zum Löschen ausgewählt.",
+"No address books found." => "Keine Adressbücher gefunden.",
+"No contacts found." => "Keine Kontakte gefunden.",
+"Missing ID" => "Fehlende ID",
+"Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"",
+"Cannot add addressbook with an empty name." => "Bitte einen Namen für das Adressbuch angeben.",
 "Error adding addressbook." => "Adressbuch hinzufügen fehlgeschlagen",
 "Error activating addressbook." => "Adressbuchaktivierung fehlgeschlagen",
+"No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.",
+"Error loading image." => "Fehler beim Laden des Bildes.",
+"Error reading contact photo." => "Fehler beim auslesen des Kontaktfotos.",
+"Error saving temporary file." => "Fehler beim Speichern der temporären Datei.",
+"The loading photo is not valid." => "Das Kontaktfoto ist fehlerhaft.",
+"id is not set." => "ID ist nicht angegeben.",
 "Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.",
 "Error deleting contact property." => "Kontakteigenschaft löschen fehlgeschlagen",
+"Contact ID is missing." => "Keine Kontakt-ID angegeben.",
+"Missing contact id." => "Fehlende Kontakt-ID.",
+"No photo path was submitted." => "Kein Foto-Pfad übermittelt.",
+"File doesn't exist:" => "Datei existiert nicht: ",
+"element name is not set." => "Kein Name für das Element angegeben.",
+"checksum is not set." => "Keine Prüfsumme angegeben.",
+"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ",
+"Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ",
 "Error updating contact property." => "Kontakteigenschaft aktualisieren fehlgeschlagen",
+"Cannot update addressbook with an empty name." => "Adressbuch kann nicht mir leeren Namen aktualisiert werden.",
 "Error updating addressbook." => "Adressbuch aktualisieren fehlgeschlagen",
+"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen",
+"There is no error, the file uploaded with success" => "Alles bestens, Datei erfolgreich übertragen.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Datei größer als durch die upload_max_filesize Direktive in php.ini erlaubt",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Datei größer als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist",
+"The uploaded file was only partially uploaded" => "Datei konnte nur teilweise übertragen werden",
+"No file was uploaded" => "Keine Datei konnte übertragen werden.",
+"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
 "Contacts" => "Kontakte",
+"Addressbook not found." => "Adressbuch nicht gefunden.",
 "This is not your addressbook." => "Dies ist nicht dein Adressbuch.",
 "Contact could not be found." => "Kontakt konnte nicht gefunden werden.",
 "Address" => "Adresse",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobil",
 "Text" => "Text",
 "Voice" => "Anruf",
+"Message" => "Mitteilung",
 "Fax" => "Fax",
 "Video" => "Video",
 "Pager" => "Pager",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Geburtstag von {name}",
 "Contact" => "Kontakt",
 "Add Contact" => "Kontakt hinzufügen",
 "Addressbooks" => "Adressbücher",
+"Configure Address Books" => "Adressbücher konfigurieren",
 "New Address Book" => "Neues Adressbuch",
+"Import from VCF" => "Import von VCF Datei",
 "CardDav Link" => "CardDav Link",
 "Download" => "Herunterladen",
 "Edit" => "Bearbeiten",
 "Delete" => "Löschen",
 "Download contact" => "Kontakt herunterladen",
 "Delete contact" => "Kontakt löschen",
+"Drop photo to upload" => "Zieh' ein Foto hierher zum hochladen",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts order Rückwärts mit Komma",
+"Edit name details" => "Namen ändern",
+"Nickname" => "Spitzname",
+"Enter nickname" => "Spitznamen angeben",
 "Birthday" => "Geburtstag",
+"dd-mm-yyyy" => "TT-MM-JJJJ",
+"Groups" => "Gruppen",
+"Separate groups with commas" => "Gruppen mit Komma trennen",
+"Edit groups" => "Gruppen editieren",
 "Preferred" => "Bevorzugt",
+"Please specify a valid email address." => "Bitte eine gültige E-Mail-Adresse angeben.",
+"Enter email address" => "E-Mail-Adresse angeben.",
+"Mail to address" => "E-Mail an diese Adresse schreiben",
+"Delete email address" => "E-Mail-Adresse löschen",
+"Enter phone number" => "Telefonnummer angeben",
+"Delete phone number" => "Telefonnummer löschen",
+"View on map" => "Auf Karte anzeigen",
+"Edit address details" => "Adressinformationen ändern",
+"Add notes here." => "Füge hier Notizen ein.",
+"Add field" => "Feld hinzufügen",
+"Profile picture" => "Profil Bild",
 "Phone" => "Telefon",
+"Note" => "Notiz",
+"Delete current photo" => "Derzeitiges Foto löschen",
+"Edit current photo" => "Foto ändern",
+"Upload new photo" => "Neues Foto hochladen",
+"Select photo from ownCloud" => "Foto aus ownCloud auswählen",
+"Edit address" => "Adresse ändern",
 "Type" => "Typ",
 "PO Box" => "Postfach",
 "Extended" => "Erweitert",
@@ -46,13 +109,43 @@
 "Region" => "Region",
 "Zipcode" => "Postleitzahl",
 "Country" => "Land",
+"Edit categories" => "Kategorie ändern",
 "Add" => "Hinzufügen",
 "Addressbook" => "Adressbuch",
+"Hon. prefixes" => "Höflichkeitspräfixe",
+"Miss" => "Frau",
+"Ms" => "Frau",
+"Mr" => "Herr",
+"Sir" => "Herr",
+"Mrs" => "Frau",
+"Dr" => "Dr",
+"Given name" => "Vorname",
+"Additional names" => "Zusätzliche Namen",
+"Family name" => "Familienname",
+"Hon. suffixes" => "Höflichkeitssuffixe",
 "New Addressbook" => "Neues Adressbuch",
 "Edit Addressbook" => "Adressbuch editieren",
 "Displayname" => "Anzeigename",
 "Active" => "Aktiv",
 "Save" => "Speichern",
 "Submit" => "Eintragen",
-"Cancel" => "Abbrechen"
+"Cancel" => "Abbrechen",
+"Import a contacts file" => "Kontaktdatei importieren",
+"Please choose the addressbook" => "Bitte Adressbuch auswählen",
+"create a new addressbook" => "Neues Adressbuch erstellen",
+"Name of new addressbook" => "Name des neuen Adressbuchs",
+"Import" => "Importieren",
+"Importing contacts" => "Kontakte werden importiert",
+"Contacts imported successfully" => "Kontaktimport erfolgreich",
+"Close Dialog" => "Dialog schließen",
+"Import Addressbook" => "Adressbuch importieren",
+"Select address book to import to:" => "Adressbuch, in das importiert werden soll",
+"Drop a VCF file to import contacts." => "Zieh' eine VCF Datei hierher zum Kontaktimport",
+"You have no contacts in your addressbook." => "Du hast keine Kontakte im Adressbuch.",
+"Add contact" => "Kontakt hinzufügen",
+"Configure addressbooks" => "Adressbücher konfigurieren",
+"CardDAV syncing addresses" => "CardDAV Sync-Adressen",
+"more info" => "mehr Info",
+"Primary address (Kontact et al)" => "primäre Adresse (für Kontact o.ä. Programme)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php
index 3b8a9738bde16dec51ff698565169df2810f2c3b..fb115a0d4a39c929dd093e41b712aa940358d9a3 100644
--- a/apps/contacts/l10n/el.php
+++ b/apps/contacts/l10n/el.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Σφάλμα κατά την προσθήκη επαφής.",
 "Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.",
 "At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.",
+"Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:",
 "Error adding contact property." => "Σφάλμα προσθήκης ιδιότητας επαφής.",
+"No ID provided" => "Δε δώθηκε ID",
+"Error setting checksum." => "Λάθος κατά τον ορισμό checksum ",
+"No categories selected for deletion." => "Δε επελέγησαν κατηγορίες για διαγραφή",
+"No address books found." => "Δε βρέθηκε βιβλίο διευθύνσεων",
+"No contacts found." => "Δεν βρέθηκαν επαφές",
+"Missing ID" => "Λείπει ID",
+"Error parsing VCard for ID: \"" => "Σφάλμα κατά την ανάγνωση του VCard για το ID:\"",
+"Cannot add addressbook with an empty name." => "Δε μπορεί να προστεθεί βιβλίο διευθύνσεων με κενό όνομα",
 "Error adding addressbook." => "Σφάλμα προσθήκης βιβλίου διευθύνσεων.",
 "Error activating addressbook." => "Σφάλμα ενεργοποίησης βιβλίου διευθύνσεων",
+"No contact ID was submitted." => "Δε υπεβλήθει ID επαφής",
+"Error loading image." => "Σφάλμα φόρτωσης εικόνας",
+"Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής",
+"Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου",
+"The loading photo is not valid." => "Η φορτωμένη φωτογραφία δεν είναι έγκυρη",
+"id is not set." => "δεν ορίστηκε id",
 "Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.",
 "Error deleting contact property." => "Σφάλμα διαγραφής ιδιότητας επαφής.",
+"Contact ID is missing." => "Λείπει ID επαφής",
+"Missing contact id." => "Απουσιαζει ID επαφής",
+"No photo path was submitted." => "Δε δόθηκε διαδρομή εικόνας",
+"File doesn't exist:" => "Το αρχείο δεν υπάρχει:",
+"element name is not set." => "δεν ορίστηκε όνομα στοιχείου",
+"checksum is not set." => "δε ορίστηκε checksum ",
+"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα:",
+"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο",
 "Error updating contact property." => "Σφάλμα ενημέρωσης ιδιότητας επαφής.",
+"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα",
 "Error updating addressbook." => "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.",
+"Error uploading contacts to storage." => "Σφάλμα κατά την αποθήκευση επαφών",
+"There is no error, the file uploaded with success" => "Δεν υπάρχει σφάλμα, το αρχείο ανέβηκε με επιτυχία ",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Το μέγεθος του αρχείου ξεπερνάει το upload_max_filesize του php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Το ανεβασμένο αρχείο υπερβαίνει το MAX_FILE_SIZE που ορίζεται στην  HTML φόρμα",
+"The uploaded file was only partially uploaded" => "Το αρχείο ανέβηκε μερικώς",
+"No file was uploaded" => "Δεν ανέβηκε κάποιο αρχείο",
+"Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος",
 "Contacts" => "Επαφές",
+"Addressbook not found." => "Δε βρέθηκε βιβλίο διευθύνσεων",
 "This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.",
 "Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.",
 "Address" => "Διεύθυνση",
@@ -22,22 +54,53 @@
 "Mobile" => "Κινητό",
 "Text" => "Κείμενο",
 "Voice" => "Ομιλία",
+"Message" => "Μήνυμα ",
 "Fax" => "Φαξ",
 "Video" => "Βίντεο",
 "Pager" => "Βομβητής",
+"Internet" => "Διαδίκτυο",
+"{name}'s Birthday" => "{name} έχει Γενέθλια",
 "Contact" => "Επαφή",
 "Add Contact" => "Προσθήκη επαφής",
 "Addressbooks" => "Βιβλία διευθύνσεων",
+"Configure Address Books" => "Ρυθμίστε το βιβλίο διευθύνσεων ",
 "New Address Book" => "Νέο βιβλίο διευθύνσεων",
+"Import from VCF" => "Εισαγωγή από VCF αρχείο",
 "CardDav Link" => "Σύνδεσμος CardDav",
 "Download" => "Λήψη",
 "Edit" => "Επεξεργασία",
 "Delete" => "Διαγραφή",
 "Download contact" => "Λήψη επαφής",
 "Delete contact" => "Διαγραφή επαφής",
+"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα",
+"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος",
+"Nickname" => "Παρατσούκλι",
+"Enter nickname" => "Εισάγεται παρατσούκλι",
 "Birthday" => "Γενέθλια",
+"dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ",
+"Groups" => "Ομάδες",
+"Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ",
+"Edit groups" => "Επεξεργασία ομάδων",
 "Preferred" => "Προτιμώμενο",
+"Please specify a valid email address." => "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+"Enter email address" => "Εισήγαγε  διεύθυνση ηλεκτρονικού ταχυδρομείου",
+"Mail to address" => "Αποστολή σε διεύθυνση",
+"Delete email address" => "Διαγραφή διεύθυνση email",
+"Enter phone number" => "Εισήγαγε αριθμό τηλεφώνου",
+"Delete phone number" => "Διέγραψε αριθμό τηλεφώνου",
+"View on map" => "Προβολή στο χάρτη",
+"Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης",
+"Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ",
+"Add field" => "Προσθήκη πεδίου",
+"Profile picture" => "Φωτογραφία προφίλ",
 "Phone" => "Τηλέφωνο",
+"Note" => "Σημείωση",
+"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας",
+"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας",
+"Upload new photo" => "Ανέβασε νέα φωτογραφία",
+"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud",
+"Edit address" => "Επεξεργασία διεύθυνσης",
 "Type" => "Τύπος",
 "PO Box" => "Ταχ. Θυρίδα",
 "Extended" => "Εκτεταμένη",
@@ -46,13 +109,52 @@
 "Region" => "Περιοχή",
 "Zipcode" => "Τ.Κ.",
 "Country" => "Χώρα",
+"Edit categories" => "Επεξεργασία κατηγορίας",
 "Add" => "Προσθήκη",
 "Addressbook" => "Βιβλίο διευθύνσεων",
+"Hon. prefixes" => "προθέματα",
+"Miss" => "Δις",
+"Ms" => "Κα",
+"Mr" => "Κα",
+"Sir" => "Σερ",
+"Mrs" => "Κα",
+"Dr" => "Δρ.",
+"Given name" => "Όνομα",
+"Additional names" => "Επιπλέον ονόματα",
+"Family name" => "Επώνυμο",
+"Hon. suffixes" => "καταλήξεις",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
 "New Addressbook" => "Νέο βιβλίο διευθύνσεων",
 "Edit Addressbook" => "Επεξεργασία βιβλίου διευθύνσεων",
 "Displayname" => "Προβαλόμενο όνομα",
 "Active" => "Ενεργό",
 "Save" => "Αποθήκευση",
 "Submit" => "Καταχώρηση",
-"Cancel" => "Ακύρωση"
+"Cancel" => "Ακύρωση",
+"Import a contacts file" => "Εισαγωγή αρχείου επαφών",
+"Please choose the addressbook" => "Παρακαλώ επέλεξε βιβλίο διευθύνσεων",
+"create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων",
+"Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων",
+"Import" => "Εισαγωγή",
+"Importing contacts" => "Εισαγωγή επαφών",
+"Contacts imported successfully" => "Οι επαφές εισήχθησαν επιτυχώς",
+"Close Dialog" => "Κλείσιμο διαλόγου",
+"Import Addressbook" => "Εισαγωγή βιβλίου διευθύνσεων",
+"Select address book to import to:" => "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:",
+"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών",
+"Select from HD" => "Επιλογή από HD",
+"You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων",
+"Add contact" => "Προσθήκη επαφής",
+"Configure addressbooks" => "Ρύθμισε το βιβλίο διευθύνσεων",
+"CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ",
+"more info" => "περισσότερες πληροφορίες",
+"Primary address (Kontact et al)" => "Κύρια διεύθυνση",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/eo.php b/apps/contacts/l10n/eo.php
index d4d9bf8e480cd1d0edcc8ff0ec04c2dc8f6cfc4a..faba03468100030c19b970bf0aefb4c01e43d579 100644
--- a/apps/contacts/l10n/eo.php
+++ b/apps/contacts/l10n/eo.php
@@ -3,14 +3,40 @@
 "There was an error adding the contact." => "Eraro okazis dum aldono de kontakto.",
 "Cannot add empty property." => "Ne eblas aldoni malplenan propraĵon.",
 "At least one of the address fields has to be filled out." => "Almenaŭ unu el la adreskampoj necesas pleniĝi.",
+"Trying to add duplicate property: " => "Provante aldoni duobligitan propraĵon:",
 "Error adding contact property." => "Eraro dum aldono de kontaktopropraĵo.",
+"No ID provided" => "Neniu identigilo proviziĝis.",
+"No categories selected for deletion." => "Neniu kategorio elektiĝis por forigi.",
+"No address books found." => "Neniu adresaro troviĝis.",
+"No contacts found." => "Neniu kontakto troviĝis.",
+"Missing ID" => "Mankas identigilo",
+"Error parsing VCard for ID: \"" => "Eraro dum analizo de VCard por identigilo:",
+"Cannot add addressbook with an empty name." => "Ne eblas aldoni adresaron kun malplena nomo.",
 "Error adding addressbook." => "Eraro dum aldono de adresaro.",
 "Error activating addressbook." => "Eraro dum aktivigo de adresaro.",
+"No contact ID was submitted." => "Neniu kontaktidentigilo sendiĝis.",
+"Error loading image." => "Eraro dum ŝargado de bildo.",
+"Error reading contact photo." => "Eraro dum lego de kontakta foto.",
+"Error saving temporary file." => "Eraro dum konservado de provizora dosiero.",
+"The loading photo is not valid." => "La alŝutata foto ne validas.",
+"id is not set." => "identigilo ne agordiĝis.",
 "Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.",
 "Error deleting contact property." => "Eraro dum forigo de kontaktopropraĵo.",
+"Contact ID is missing." => "Kontaktidentigilo mankas.",
+"Missing contact id." => "Mankas kontaktidentigilo.",
+"No photo path was submitted." => "Neniu vojo al foto sendiĝis.",
+"File doesn't exist:" => "Dosiero ne ekzistas:",
+"element name is not set." => "eronomo ne agordiĝis.",
+"Something went FUBAR. " => "Io FUBAR-is.",
 "Error updating contact property." => "Eraro dum ĝisdatigo de kontaktopropraĵo.",
+"Cannot update addressbook with an empty name." => "Ne eblas ĝisdatigi adresaron kun malplena nomo.",
 "Error updating addressbook." => "Eraro dum ĝisdatigo de adresaro.",
+"There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.",
+"The uploaded file was only partially uploaded" => "la alŝutita dosiero nur parte alŝutiĝis",
+"No file was uploaded" => "Neniu dosiero alŝutiĝis.",
+"Missing a temporary folder" => "Mankas provizora dosierujo.",
 "Contacts" => "Kontaktoj",
+"Addressbook not found." => "Adresaro ne troviĝis.",
 "This is not your addressbook." => "Ĉi tiu ne estas via adresaro.",
 "Contact could not be found." => "Ne eblis trovi la kontakton.",
 "Address" => "Adreso",
@@ -22,22 +48,52 @@
 "Mobile" => "Poŝtelefono",
 "Text" => "Teksto",
 "Voice" => "Voĉo",
+"Message" => "Mesaĝo",
 "Fax" => "Fakso",
 "Video" => "Videaĵo",
 "Pager" => "Televokilo",
+"Internet" => "Interreto",
+"{name}'s Birthday" => "Naskiĝtago de {name}",
 "Contact" => "Kontakto",
 "Add Contact" => "Aldoni kontakton",
 "Addressbooks" => "Adresaroj",
+"Configure Address Books" => "Agordi adresarojn",
 "New Address Book" => "Nova adresaro",
+"Import from VCF" => "Enporti el VCF",
 "CardDav Link" => "CardDav-ligilo",
 "Download" => "Elŝuti",
 "Edit" => "Redakti",
 "Delete" => "Forigi",
 "Download contact" => "Elŝuti kontakton",
 "Delete contact" => "Forigi kontakton",
+"Drop photo to upload" => "Demeti foton por alŝuti",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo",
+"Edit name details" => "Redakti detalojn de nomo",
+"Nickname" => "Kromnomo",
+"Enter nickname" => "Enigu kromnomon",
 "Birthday" => "Naskiĝotago",
+"dd-mm-yyyy" => "yyyy-mm-dd",
+"Groups" => "Grupoj",
+"Separate groups with commas" => "Disigi grupojn per komoj",
+"Edit groups" => "Redakti grupojn",
 "Preferred" => "Preferata",
+"Please specify a valid email address." => "Bonvolu specifi validan retpoŝtadreson.",
+"Enter email address" => "Enigi retpoŝtadreson",
+"Mail to address" => "Retpoŝtmesaĝo al adreso",
+"Delete email address" => "Forigi retpoŝþadreson",
+"Enter phone number" => "Enigi telefonnumeron",
+"Delete phone number" => "Forigi telefonnumeron",
+"View on map" => "Vidi en mapo",
+"Edit address details" => "Redakti detalojn de adreso",
+"Add notes here." => "Aldoni notojn ĉi tie.",
+"Add field" => "Aldoni kampon",
 "Phone" => "Telefono",
+"Note" => "Noto",
+"Delete current photo" => "Forigi nunan foton",
+"Edit current photo" => "Redakti nunan foton",
+"Upload new photo" => "Alŝuti novan foton",
+"Select photo from ownCloud" => "Elekti foton el ownCloud",
+"Edit address" => "Redakti adreson",
 "Type" => "Tipo",
 "PO Box" => "Abonkesto",
 "Extended" => "Etendita",
@@ -46,13 +102,25 @@
 "Region" => "Regiono",
 "Zipcode" => "Poŝtokodo",
 "Country" => "Lando",
+"Edit categories" => "Redakti kategoriojn",
 "Add" => "Aldoni",
 "Addressbook" => "Adresaro",
+"Given name" => "Persona nomo",
+"Family name" => "Familia nomo",
 "New Addressbook" => "Nova adresaro",
 "Edit Addressbook" => "Redakti adresaron",
 "Displayname" => "Montronomo",
 "Active" => "Aktiva",
 "Save" => "Konservi",
 "Submit" => "Sendi",
-"Cancel" => "Nuligi"
+"Cancel" => "Nuligi",
+"Import a contacts file" => "Enporti kontaktodosieron",
+"Please choose the addressbook" => "Bonvolu elekti adresaron",
+"create a new addressbook" => "krei novan adresaron",
+"Name of new addressbook" => "Nomo de nova adresaro",
+"Import" => "Enporti",
+"Importing contacts" => "Enportante kontaktojn",
+"Contacts imported successfully" => "Kontaktoj enportiĝis sukcese",
+"Close Dialog" => "Fermi dialogon",
+"Import Addressbook" => "Enporti adresaron"
 );
diff --git a/apps/contacts/l10n/es.php b/apps/contacts/l10n/es.php
index f5d2fff6177421bc70dc2888f942978363d573a8..98b6aaa803f92a1fd4b798c32875713c819915b1 100644
--- a/apps/contacts/l10n/es.php
+++ b/apps/contacts/l10n/es.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Se ha producido un error al añadir el contacto.",
 "Cannot add empty property." => "No se puede añadir una propiedad vacía.",
 "At least one of the address fields has to be filled out." => "Al menos uno de los campos de direcciones se tiene que rellenar.",
+"Trying to add duplicate property: " => "Intentando añadir una propiedad duplicada: ",
 "Error adding contact property." => "Error al añadir una propiedad del contacto.",
+"No ID provided" => "No se ha proporcionado una ID",
+"Error setting checksum." => "Error al establecer la suma de verificación.",
+"No categories selected for deletion." => "No se seleccionaron categorías para borrar.",
+"No address books found." => "No se encontraron libretas de direcciones.",
+"No contacts found." => "No se encontraron contactos.",
+"Missing ID" => "Falta la ID",
+"Error parsing VCard for ID: \"" => "Error al analizar el VCard para la ID: \"",
+"Cannot add addressbook with an empty name." => "No se puede añadir una libreta de direcciones sin nombre",
 "Error adding addressbook." => "Error al añadir la libreta de direcciones.",
 "Error activating addressbook." => "Error al activar la libreta de direcciones.",
+"No contact ID was submitted." => "No se ha mandado ninguna ID de contacto.",
+"Error loading image." => "Error cargando imagen.",
+"Error reading contact photo." => "Error leyendo fotografía del contacto.",
+"Error saving temporary file." => "Error al guardar archivo temporal.",
+"The loading photo is not valid." => "La foto que se estaba cargando no es válida.",
+"id is not set." => "no se ha puesto ninguna ID.",
 "Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.",
 "Error deleting contact property." => "Error al borrar una propiedad del contacto.",
+"Contact ID is missing." => "Falta la ID del contacto.",
+"Missing contact id." => "Falta la id del contacto.",
+"No photo path was submitted." => "No se ha introducido la ruta de la foto.",
+"File doesn't exist:" => "Archivo inexistente:",
+"element name is not set." => "no se ha puesto ningún nombre de elemento.",
+"checksum is not set." => "no se ha puesto ninguna suma de comprobación.",
+"Information about vCard is incorrect. Please reload the page: " => "La información sobre la vCard es incorrecta. Por favor, recarga la página:",
+"Something went FUBAR. " => "Plof. Algo ha fallado.",
 "Error updating contact property." => "Error al actualizar una propiedad del contacto.",
+"Cannot update addressbook with an empty name." => "No se puede actualizar una libreta de direcciones sin nombre.",
 "Error updating addressbook." => "Error al actualizar la libreta de direcciones.",
+"Error uploading contacts to storage." => "Error al subir contactos al almacenamiento.",
+"There is no error, the file uploaded with success" => "No hay ningún error, el archivo se ha subido con éxito",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo subido sobrepasa la directiva upload_max_filesize de php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo subido sobrepasa la directiva MAX_FILE_SIZE especificada en el formulario HTML",
+"The uploaded file was only partially uploaded" => "El archivo se ha subido parcialmente",
+"No file was uploaded" => "No se ha subido ningún archivo",
+"Missing a temporary folder" => "Falta la carpeta temporal",
 "Contacts" => "Contactos",
+"Addressbook not found." => "Libreta de direcciones no encontrada.",
 "This is not your addressbook." => "Esta no es tu agenda de contactos.",
 "Contact could not be found." => "No se ha podido encontrar el contacto.",
 "Address" => "Dirección",
@@ -22,22 +54,53 @@
 "Mobile" => "Móvil",
 "Text" => "Texto",
 "Voice" => "Voz",
+"Message" => "Mensaje",
 "Fax" => "Fax",
 "Video" => "Vídeo",
 "Pager" => "Localizador",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Cumpleaños de {name}",
 "Contact" => "Contacto",
 "Add Contact" => "Añadir contacto",
 "Addressbooks" => "Libretas de direcciones",
+"Configure Address Books" => "Configurar libretas de direcciones",
 "New Address Book" => "Nueva libreta de direcciones",
+"Import from VCF" => "Importar desde VCF",
 "CardDav Link" => "Enlace CardDav",
 "Download" => "Descargar",
 "Edit" => "Editar",
 "Delete" => "Borrar",
 "Download contact" => "Descargar contacto",
 "Delete contact" => "Eliminar contacto",
+"Drop photo to upload" => "Suelta una foto para subirla",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, al revés o al revés con coma",
+"Edit name details" => "Editar los detalles del nombre",
+"Nickname" => "Alias",
+"Enter nickname" => "Introduce un alias",
 "Birthday" => "Cumpleaños",
+"dd-mm-yyyy" => "dd-mm-yyyy",
+"Groups" => "Grupos",
+"Separate groups with commas" => "Separa los grupos con comas",
+"Edit groups" => "Editar grupos",
 "Preferred" => "Preferido",
+"Please specify a valid email address." => "Por favor especifica una dirección de correo electrónico válida.",
+"Enter email address" => "Introduce una dirección de correo electrónico",
+"Mail to address" => "Enviar por correo a la dirección",
+"Delete email address" => "Eliminar dirección de correo electrónico",
+"Enter phone number" => "Introduce un número de teléfono",
+"Delete phone number" => "Eliminar número de teléfono",
+"View on map" => "Ver en el mapa",
+"Edit address details" => "Editar detalles de la dirección",
+"Add notes here." => "Añade notas aquí.",
+"Add field" => "Añadir campo",
+"Profile picture" => "Foto del perfil",
 "Phone" => "Teléfono",
+"Note" => "Nota",
+"Delete current photo" => "Eliminar fotografía actual",
+"Edit current photo" => "Editar fotografía actual",
+"Upload new photo" => "Subir nueva fotografía",
+"Select photo from ownCloud" => "Seleccionar fotografía desde ownCloud",
+"Edit address" => "Editar dirección",
 "Type" => "Tipo",
 "PO Box" => "Código postal",
 "Extended" => "Extendido",
@@ -46,13 +109,52 @@
 "Region" => "Región",
 "Zipcode" => "Código postal",
 "Country" => "País",
+"Edit categories" => "Editar categorías",
 "Add" => "Añadir",
 "Addressbook" => "Libreta de direcciones",
+"Hon. prefixes" => "Prefijos honoríficos",
+"Miss" => "Srta",
+"Ms" => "Sra.",
+"Mr" => "Sr.",
+"Sir" => "Señor",
+"Mrs" => "Sra",
+"Dr" => "Dr",
+"Given name" => "Nombre",
+"Additional names" => "Nombres adicionales",
+"Family name" => "Apellido",
+"Hon. suffixes" => "Sufijos honoríficos",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Dr",
+"Esq." => "Don",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
 "New Addressbook" => "Nueva libreta de direcciones",
 "Edit Addressbook" => "Editar libreta de direcciones",
 "Displayname" => "Nombre a mostrar",
 "Active" => "Activo",
 "Save" => "Guardar",
 "Submit" => "Aceptar",
-"Cancel" => "Cancelar"
+"Cancel" => "Cancelar",
+"Import a contacts file" => "Importar archivo de contactos",
+"Please choose the addressbook" => "Por favor escoge la agenda",
+"create a new addressbook" => "crear una nueva agenda",
+"Name of new addressbook" => "Nombre de la nueva agenda",
+"Import" => "Importar",
+"Importing contacts" => "Importando contactos",
+"Contacts imported successfully" => "Contactos importados correctamente",
+"Close Dialog" => "Cerrar Diálogo",
+"Import Addressbook" => "Importar agenda",
+"Select address book to import to:" => "Selecciona una agenda para importar a:",
+"Drop a VCF file to import contacts." => "Suelta un archivo VCF para importar contactos.",
+"Select from HD" => "Seleccionar del disco duro",
+"You have no contacts in your addressbook." => "No hay contactos en tu agenda.",
+"Add contact" => "Añadir contacto",
+"Configure addressbooks" => "Configurar agenda",
+"CardDAV syncing addresses" => "Sincronizando direcciones",
+"more info" => "más información",
+"Primary address (Kontact et al)" => "Dirección primaria (Kontact et al)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/et_EE.php b/apps/contacts/l10n/et_EE.php
index d2112584ed287cfed49aba1d755367b99e8279b1..2baad895211a456566120bcfe7bd36bd0a6f4d21 100644
--- a/apps/contacts/l10n/et_EE.php
+++ b/apps/contacts/l10n/et_EE.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Konktakti lisamisel tekkis viga.",
 "Cannot add empty property." => "Tühja omadust ei saa lisada.",
 "At least one of the address fields has to be filled out." => "Vähemalt üks aadressiväljadest peab olema täidetud.",
+"Trying to add duplicate property: " => "Proovitakse lisada topeltomadust: ",
 "Error adding contact property." => "Viga konktakti korralikul lisamisel.",
+"No ID provided" => "ID-d pole sisestatud",
+"Error setting checksum." => "Viga kontrollsumma määramisel.",
+"No categories selected for deletion." => "Kustutamiseks pole valitud ühtegi kategooriat.",
+"No address books found." => "Ei leitud ühtegi aadressiraamatut.",
+"No contacts found." => "Ühtegi kontakti ei leitud.",
+"Missing ID" => "Puudub ID",
+"Error parsing VCard for ID: \"" => "Viga VCard-ist ID parsimisel: \"",
+"Cannot add addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa lisada.",
 "Error adding addressbook." => "Viga aadressiraamatu lisamisel.",
 "Error activating addressbook." => "Viga aadressiraamatu aktiveerimisel.",
+"No contact ID was submitted." => "Kontakti ID-d pole sisestatud.",
+"Error loading image." => "Viga pildi laadimisel.",
+"Error reading contact photo." => "Viga kontakti foto lugemisel.",
+"Error saving temporary file." => "Viga ajutise faili salvestamisel.",
+"The loading photo is not valid." => "Laetav pilt pole korrektne pildifail.",
+"id is not set." => "ID on määramata.",
 "Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.",
 "Error deleting contact property." => "Viga konktaki korralikul kustutamisel.",
+"Contact ID is missing." => "Kontakti ID puudub.",
+"Missing contact id." => "Puuduv kontakti ID.",
+"No photo path was submitted." => "Foto asukohta pole määratud.",
+"File doesn't exist:" => "Faili pole olemas:",
+"element name is not set." => "elemendi nime pole määratud.",
+"checksum is not set." => "kontrollsummat pole määratud.",
+"Information about vCard is incorrect. Please reload the page: " => "vCard info pole korrektne. Palun lae lehekülg uuesti: ",
+"Something went FUBAR. " => "Midagi läks tõsiselt metsa.",
 "Error updating contact property." => "Viga konktaki korralikul uuendamisel.",
+"Cannot update addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa uuendada.",
 "Error updating addressbook." => "Viga aadressiraamatu uuendamisel.",
+"Error uploading contacts to storage." => "Viga kontaktide üleslaadimisel kettale.",
+"There is no error, the file uploaded with success" => "Ühtegi tõrget polnud, fail on üles laetud",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Üleslaetud fail ületab php.ini failis määratud upload_max_filesize suuruse",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Üleslaetud fail ületab MAX_FILE_SIZE suuruse, mis on HTML vormi jaoks määratud",
+"The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt",
+"No file was uploaded" => "Ühtegi faili ei laetud üles",
+"Missing a temporary folder" => "Ajutiste failide kaust puudub",
 "Contacts" => "Kontaktid",
+"Addressbook not found." => "Aadressiraamatut ei leitud",
 "This is not your addressbook." => "See pole sinu aadressiraamat.",
 "Contact could not be found." => "Kontakti ei leitud.",
 "Address" => "Aadress",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobiil",
 "Text" => "Tekst",
 "Voice" => "Hääl",
+"Message" => "Sõnum",
 "Fax" => "Faks",
 "Video" => "Video",
 "Pager" => "Piipar",
+"Internet" => "Internet",
+"{name}'s Birthday" => "{name} sünnipäev",
 "Contact" => "Kontakt",
 "Add Contact" => "Lisa kontakt",
 "Addressbooks" => "Aadressiraamatud",
+"Configure Address Books" => "Seadista aadressiraamatut",
 "New Address Book" => "Uus aadressiraamat",
+"Import from VCF" => "Impordi VCF-ist",
 "CardDav Link" => "CardDav link",
 "Download" => "Lae alla",
 "Edit" => "Muuda",
 "Delete" => "Kustuta",
 "Download contact" => "Lae kontakt alla",
 "Delete contact" => "Kustuta kontakt",
+"Drop photo to upload" => "Lohista üleslaetav foto siia",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega",
+"Edit name details" => "Muuda nime üksikasju",
+"Nickname" => "Hüüdnimi",
+"Enter nickname" => "Sisesta hüüdnimi",
 "Birthday" => "Sünnipäev",
+"dd-mm-yyyy" => "dd.mm.yyyy",
+"Groups" => "Grupid",
+"Separate groups with commas" => "Eralda grupid komadega",
+"Edit groups" => "Muuda gruppe",
 "Preferred" => "Eelistatud",
+"Please specify a valid email address." => "Palun sisesta korrektne e-posti aadress.",
+"Enter email address" => "Sisesta e-posti aadress",
+"Mail to address" => "Kiri aadressile",
+"Delete email address" => "Kustuta e-posti aadress",
+"Enter phone number" => "Sisesta telefoninumber",
+"Delete phone number" => "Kustuta telefoninumber",
+"View on map" => "Vaata kaardil",
+"Edit address details" => "Muuda aaressi infot",
+"Add notes here." => "Lisa märkmed siia.",
+"Add field" => "Lisa väli",
+"Profile picture" => "Profiili pilt",
 "Phone" => "Telefon",
+"Note" => "Märkus",
+"Delete current photo" => "Kustuta praegune foto",
+"Edit current photo" => "Muuda praegust pilti",
+"Upload new photo" => "Lae üles uus foto",
+"Select photo from ownCloud" => "Vali foto ownCloudist",
+"Edit address" => "Muuda aadressi",
 "Type" => "Tüüp",
 "PO Box" => "Postkontori postkast",
 "Extended" => "Laiendatud",
@@ -46,13 +109,52 @@
 "Region" => "Piirkond",
 "Zipcode" => "Postiindeks",
 "Country" => "Riik",
+"Edit categories" => "Muuda kategooriat",
 "Add" => "Lisa",
 "Addressbook" => "Aadressiraamat",
+"Hon. prefixes" => "Eesliited",
+"Miss" => "Preili",
+"Ms" => "Pr",
+"Mr" => "Hr",
+"Sir" => "Härra",
+"Mrs" => "Proua",
+"Dr" => "Dr",
+"Given name" => "Eesnimi",
+"Additional names" => "Lisanimed",
+"Family name" => "Perekonnanimi",
+"Hon. suffixes" => "Järelliited",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Senior.",
 "New Addressbook" => "Uus aadressiraamat",
 "Edit Addressbook" => "Muuda aadressiraamatut",
 "Displayname" => "Näidatav nimi",
 "Active" => "Aktiivne",
 "Save" => "Salvesta",
 "Submit" => "Saada",
-"Cancel" => "Loobu"
+"Cancel" => "Loobu",
+"Import a contacts file" => "Impordi kontaktifail",
+"Please choose the addressbook" => "Palun vali aadressiraamat",
+"create a new addressbook" => "loo uus aadressiraamat",
+"Name of new addressbook" => "Uue aadressiraamatu nimi",
+"Import" => "Impordi",
+"Importing contacts" => "Kontaktide importimine",
+"Contacts imported successfully" => "Kontaktid on imporditud",
+"Close Dialog" => "Sulge dialoog",
+"Import Addressbook" => "Impordi aadressiraamat",
+"Select address book to import to:" => "Vali aadressiraamat, millesse importida:",
+"Drop a VCF file to import contacts." => "Lohista siia VCF-fail, millest kontakte importida.",
+"Select from HD" => "Vali kõvakettalt",
+"You have no contacts in your addressbook." => "Sinu aadressiraamatus pole ühtegi kontakti.",
+"Add contact" => "Lisa kontakt",
+"Configure addressbooks" => "Seadista aadressiraamatuid",
+"CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid",
+"more info" => "lisainfo",
+"Primary address (Kontact et al)" => "Peamine aadress",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/eu.php b/apps/contacts/l10n/eu.php
index fbac3b803d9a0045b022b2a49abbb0920736d17d..8366c2b4b5aca14fe1d018d537be2b83ce52261e 100644
--- a/apps/contacts/l10n/eu.php
+++ b/apps/contacts/l10n/eu.php
@@ -4,13 +4,32 @@
 "Cannot add empty property." => "Ezin da propieta hutsa gehitu.",
 "At least one of the address fields has to be filled out." => "Behintzat helbide eremuetako bat bete behar da.",
 "Error adding contact property." => "Errorea kontaktu propietatea gehitzean.",
+"No ID provided" => "Ez da IDrik eman",
+"No categories selected for deletion." => "Ez dira ezabatzeko kategoriak hautatu.",
+"No address books found." => "Ez da helbide libururik aurkitu.",
+"No contacts found." => "Ez da kontakturik aurkitu.",
+"Missing ID" => "ID falta da",
 "Error adding addressbook." => "Errore bat egon da helbide liburua gehitzean.",
 "Error activating addressbook." => "Errore bat egon da helbide-liburua aktibatzen.",
+"Error loading image." => "Errore bat izan da irudia kargatzearkoan.",
+"Error reading contact photo." => "Errore bat izan da kontaktuaren argazkia igotzerakoan.",
+"The loading photo is not valid." => "Kargatzen ari den argazkia ez da egokia.",
+"id is not set." => "IDa ez da ezarri.",
 "Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.",
 "Error deleting contact property." => "Errorea kontaktu propietatea ezabatzean.",
+"Contact ID is missing." => "Kontaktuaren IDa falta da.",
+"Missing contact id." => "Kontaktuaren IDa falta da.",
+"File doesn't exist:" => "Fitxategia ez da existitzen:",
+"element name is not set." => "elementuaren izena ez da ezarri.",
 "Error updating contact property." => "Errorea kontaktu propietatea eguneratzean.",
+"Cannot update addressbook with an empty name." => "Ezin da helbide liburua eguneratu izen huts batekin.",
 "Error updating addressbook." => "Errore bat egon da helbide liburua eguneratzen.",
+"Error uploading contacts to storage." => "Errore bat egon da kontaktuak biltegira igotzerakoan.",
+"There is no error, the file uploaded with success" => "Ez da errorerik egon, fitxategia ongi igo da",
+"The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat bakarrik igo da",
+"No file was uploaded" => "Ez da fitxategirik igo",
 "Contacts" => "Kontaktuak",
+"Addressbook not found." => "Helbide liburua ez da aurkitu",
 "This is not your addressbook." => "Hau ez da zure helbide liburua.",
 "Contact could not be found." => "Ezin izan da kontaktua aurkitu.",
 "Address" => "Helbidea",
@@ -22,22 +41,52 @@
 "Mobile" => "Mugikorra",
 "Text" => "Testua",
 "Voice" => "Ahotsa",
+"Message" => "Mezua",
 "Fax" => "Fax-a",
 "Video" => "Bideoa",
 "Pager" => "Bilagailua",
+"Internet" => "Internet",
+"{name}'s Birthday" => "{name}ren jaioteguna",
 "Contact" => "Kontaktua",
 "Add Contact" => "Gehitu kontaktua",
 "Addressbooks" => "Helbide Liburuak",
+"Configure Address Books" => "Konfiguratu Helbide Liburuak",
 "New Address Book" => "Helbide-liburu berria",
+"Import from VCF" => "VCFtik inportatu",
 "CardDav Link" => "CardDav lotura",
 "Download" => "Deskargatu",
 "Edit" => "Editatu",
 "Delete" => "Ezabatu",
 "Download contact" => "Deskargatu kontaktua",
 "Delete contact" => "Ezabatu kontaktua",
+"Drop photo to upload" => "Askatu argazkia igotzeko",
+"Edit name details" => "Editatu izenaren zehaztasunak",
+"Nickname" => "Ezizena",
+"Enter nickname" => "Sartu ezizena",
 "Birthday" => "Jaioteguna",
+"dd-mm-yyyy" => "yyyy-mm-dd",
+"Groups" => "Taldeak",
+"Separate groups with commas" => "Banatu taldeak komekin",
+"Edit groups" => "Editatu taldeak",
 "Preferred" => "Hobetsia",
+"Please specify a valid email address." => "Mesedez sartu eposta helbide egoki bat",
+"Enter email address" => "Sartu eposta helbidea",
+"Mail to address" => "Bidali helbidera",
+"Delete email address" => "Ezabatu eposta helbidea",
+"Enter phone number" => "Sartu telefono zenbakia",
+"Delete phone number" => "Ezabatu telefono zenbakia",
+"View on map" => "Ikusi mapan",
+"Edit address details" => "Editatu helbidearen zehaztasunak",
+"Add notes here." => "Gehitu oharrak hemen.",
+"Add field" => "Gehitu eremua",
+"Profile picture" => "Profilaren irudia",
 "Phone" => "Telefonoa",
+"Note" => "Oharra",
+"Delete current photo" => "Ezabatu oraingo argazkia",
+"Edit current photo" => "Editatu oraingo argazkia",
+"Upload new photo" => "Igo argazki berria",
+"Select photo from ownCloud" => "Hautatu argazki bat ownCloudetik",
+"Edit address" => "Editatu helbidea",
 "Type" => "Mota",
 "PO Box" => "Posta kutxa",
 "Extended" => "Hedatua",
@@ -46,6 +95,7 @@
 "Region" => "Eskualdea",
 "Zipcode" => "Posta kodea",
 "Country" => "Herrialdea",
+"Edit categories" => "Editatu kategoriak",
 "Add" => "Gehitu",
 "Addressbook" => "Helbide-liburua",
 "New Addressbook" => "Helbide-liburu berria",
@@ -54,5 +104,24 @@
 "Active" => "Aktibo",
 "Save" => "Gorde",
 "Submit" => "Bidali",
-"Cancel" => "Ezeztatu"
+"Cancel" => "Ezeztatu",
+"Import a contacts file" => "Inporatu kontaktuen fitxategia",
+"Please choose the addressbook" => "Mesedez, aukeratu helbide liburua",
+"create a new addressbook" => "sortu helbide liburu berria",
+"Name of new addressbook" => "Helbide liburuaren izena",
+"Import" => "Inportatu",
+"Importing contacts" => "Kontaktuak inportatzen",
+"Contacts imported successfully" => "Kontaktuak ongi inportatu dira",
+"Close Dialog" => "Dialogoa itxi",
+"Import Addressbook" => "Inporatu helbide liburua",
+"Select address book to import to:" => "Hautau helburuko helbide liburua:",
+"Drop a VCF file to import contacts." => "Askatu VCF fitxategia kontaktuak inportatzeko.",
+"Select from HD" => "Hautatu disko gogorretik",
+"You have no contacts in your addressbook." => "Ez duzu kontakturik zure helbide liburuan.",
+"Add contact" => "Gehitu kontaktua",
+"Configure addressbooks" => "Konfiguratu helbide liburuak",
+"CardDAV syncing addresses" => "CardDAV sinkronizazio helbideak",
+"more info" => "informazio gehiago",
+"Primary address (Kontact et al)" => "Helbide nagusia",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/fa.php b/apps/contacts/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a50742b66064af8c2ad7fa13c7176a362b55248
--- /dev/null
+++ b/apps/contacts/l10n/fa.php
@@ -0,0 +1,160 @@
+<?php $TRANSLATIONS = array(
+"Error (de)activating addressbook." => "خطا در (غیر) فعال سازی کتابچه نشانه ها",
+"There was an error adding the contact." => "یک خطا در افزودن اطلاعات شخص مورد نظر",
+"Cannot add empty property." => "نمیتوان یک  خاصیت خالی ایجاد کرد",
+"At least one of the address fields has to be filled out." => "At least one of the address fields has to be filled out. ",
+"Trying to add duplicate property: " => "امتحان کردن برای وارد کردن مشخصات تکراری",
+"Error adding contact property." => "خطا درهنگام افزودن ویژگی",
+"No ID provided" => "هیچ شناسه ای ارائه نشده",
+"Error setting checksum." => "خطا در تنظیم checksum",
+"No categories selected for deletion." => "هیچ گروهی برای حذف شدن در نظر گرفته نشده",
+"No address books found." => "هیچ کتابچه نشانی پیدا نشد",
+"No contacts found." => "هیچ شخصی پیدا نشد",
+"Missing ID" => "نشانی گم شده",
+"Error parsing VCard for ID: \"" => "خطا در تجزیه کارت ویزا برای شناسه:",
+"Cannot add addressbook with an empty name." => "نمیتوانید یک نام خالی را به کتابچه نشانی ها افزود",
+"Error adding addressbook." => "خطا درهنگام افزودن کتابچه نشانی ها",
+"Error activating addressbook." => "خطا درهنگام فعال سازیکتابچه نشانی ها",
+"No contact ID was submitted." => "هیچ اطلاعاتی راجع به شناسه ارسال نشده",
+"Error loading image." => "خطا در بارگزاری تصویر",
+"Error reading contact photo." => "خطا در خواندن اطلاعات تصویر",
+"Error saving temporary file." => "خطا در ذخیره پرونده موقت",
+"The loading photo is not valid." => "بارگزاری تصویر امکان پذیر نیست",
+"id is not set." => "شناسه تعیین نشده",
+"Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید",
+"Error deleting contact property." => "خطا در هنگام پاک کرد ویژگی",
+"Contact ID is missing." => "اطلاعات شناسه گم شده",
+"Missing contact id." => "شما اطلاعات شناسه را فراموش کرده اید",
+"No photo path was submitted." => "هیچ نشانی از تصویرارسال نشده",
+"File doesn't exist:" => "پرونده وجود ندارد",
+"element name is not set." => "نام اصلی تنظیم نشده است",
+"checksum is not set." => "checksum تنظیم شده نیست",
+"Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید",
+"Something went FUBAR. " => "چند چیز به FUBAR رفتند",
+"Error updating contact property." => "خطا در هنگام بروزرسانی  اطلاعات شخص مورد نظر",
+"Cannot update addressbook with an empty name." => "نمی توانید کتابچه نشانی ها را با یک نام خالی بروزرسانی کنید",
+"Error updating addressbook." => "خطا در هنگام بروزرسانی کتابچه نشانی ها",
+"Error uploading contacts to storage." => "خطا در هنگام بارگذاری و ذخیره سازی",
+"There is no error, the file uploaded with success" => "هیچ خطایی نیست بارگذاری پرونده موفقیت آمیز بود",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حجم آپلود از طریق Php.ini تعیین می شود",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حداکثر حجم قابل بار گذاری از طریق HTML MAX_FILE_SIZE است",
+"The uploaded file was only partially uploaded" => "پرونده بارگذاری شده فقط تاحدودی بارگذاری شده",
+"No file was uploaded" => "هیچ پروندهای بارگذاری نشده",
+"Missing a temporary folder" => "یک پوشه موقت گم شده",
+"Contacts" => "اشخاص",
+"Addressbook not found." => "کتابچه نشانی ها یافت نشد",
+"This is not your addressbook." => "این کتابچه ی نشانه های شما نیست",
+"Contact could not be found." => "اتصال ویا تماسی یافت نشد",
+"Address" => "نشانی",
+"Telephone" => "تلفن",
+"Email" => "نشانی پست الکترنیک",
+"Organization" => "نهاد(ارگان)",
+"Work" => "کار",
+"Home" => "خانه",
+"Mobile" => "موبایل",
+"Text" => "متن",
+"Voice" => "صدا",
+"Message" => "پیغام",
+"Fax" => "دورنگار:",
+"Video" => "رسانه تصویری",
+"Pager" => "صفحه",
+"Internet" => "اینترنت",
+"{name}'s Birthday" => "روز تولد {name} است",
+"Contact" => "اشخاص",
+"Add Contact" => "افزودن اطلاعات شخص مورد نظر",
+"Addressbooks" => "کتابچه ی نشانی ها",
+"Configure Address Books" => "پیکر بندی کتابچه نشانی ها",
+"New Address Book" => "کتابچه نشانه های جدید",
+"Import from VCF" => "وارد شده از VCF",
+"CardDav Link" => "CardDav Link",
+"Download" => "بارگیری",
+"Edit" => "ویرایش",
+"Delete" => "پاک کردن",
+"Download contact" => "دانلود مشخصات اشخاص",
+"Delete contact" => "پاک کردن  اطلاعات شخص مورد نظر",
+"Drop photo to upload" => "تصویر را به اینجا بکشید تا بار گذازی شود",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma",
+"Edit name details" => "ویرایش نام جزئیات",
+"Nickname" => "نام مستعار",
+"Enter nickname" => "یک نام مستعار وارد کنید",
+"Birthday" => "روزتولد",
+"dd-mm-yyyy" => "dd-mm-yyyy",
+"Groups" => "گروه ها",
+"Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما",
+"Edit groups" => "ویرایش گروه ها",
+"Preferred" => "مقدم",
+"Please specify a valid email address." => "لطفا یک پست الکترونیکی معتبر وارد کنید",
+"Enter email address" => "یک  پست الکترونیکی وارد کنید",
+"Mail to address" => "به نشانی  ارسال شد",
+"Delete email address" => "پاک کردن نشانی پست الکترونیکی",
+"Enter phone number" => "شماره تلفن راوارد کنید",
+"Delete phone number" => "پاک کردن شماره تلفن",
+"View on map" => "دیدن روی نقشه",
+"Edit address details" => "ویرایش جزئیات نشانی ها",
+"Add notes here." => "اینجا یادداشت ها را بیافزایید",
+"Add field" => "اضافه کردن فیلد",
+"Profile picture" => "تصویر پروفایل",
+"Phone" => "شماره تلفن",
+"Note" => "یادداشت",
+"Delete current photo" => "پاک کردن تصویر کنونی",
+"Edit current photo" => "ویرایش تصویر کنونی",
+"Upload new photo" => "بار گذاری یک تصویر جدید",
+"Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما",
+"Edit address" => "ویرایش نشانی",
+"Type" => "نوع",
+"PO Box" => "صندوق پستی",
+"Extended" => "تمدید شده",
+"Street" => "خیابان",
+"City" => "شهر",
+"Region" => "ناحیه",
+"Zipcode" => "کد پستی",
+"Country" => "کشور",
+"Edit categories" => "ویرایش گروه",
+"Add" => "افزودن",
+"Addressbook" => "کتابچه ی نشانی ها",
+"Hon. prefixes" => "پیشوند های محترمانه",
+"Miss" => "خانم",
+"Ms" => "خانم",
+"Mr" => "آقا",
+"Sir" => "آقا",
+"Mrs" => "خانم",
+"Dr" => "دکتر",
+"Given name" => "نام معلوم",
+"Additional names" => "نام های دیگر",
+"Family name" => "نام خانوادگی",
+"Hon. suffixes" => "پسوند های محترم",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "دکتری",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
+"New Addressbook" => "کتابچه نشانی جدید",
+"Edit Addressbook" => "ویرایش کتابچه نشانی",
+"Displayname" => "نام برای نمایش",
+"Active" => "فعال",
+"Save" => "ذخیره سازی",
+"Submit" => "ارسال",
+"Cancel" => "انصراف",
+"Import a contacts file" => "وارد کردن پرونده حاوی اطلاعات",
+"Please choose the addressbook" => "لطفا یک کتابچه نشانی انتخاب کنید",
+"create a new addressbook" => "یک کتابچه نشانی بسازید",
+"Name of new addressbook" => "نام کتابچه نشانی جدید",
+"Import" => "وارد کردن",
+"Importing contacts" => "وارد کردن اشخاص",
+"Contacts imported successfully" => "اشخاص با موفقیت افزوده شدند",
+"Close Dialog" => "بستن دیالوگ",
+"Import Addressbook" => "وارد کردن کتابچه نشانی",
+"Select address book to import to:" => "یک کتابچه نشانی انتخاب کنید تا وارد شود",
+"Drop a VCF file to import contacts." => "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند",
+"Select from HD" => "انتخاب از دیسک سخت",
+"You have no contacts in your addressbook." => "شماهیچ شخصی در  کتابچه نشانی خود ندارید",
+"Add contact" => "افزودن اطلاعات شخص مورد نظر",
+"Configure addressbooks" => "پیکربندی کتابچه ی نشانی ها",
+"CardDAV syncing addresses" => "CardDAV syncing addresses ",
+"more info" => "اطلاعات بیشتر",
+"Primary address (Kontact et al)" => "نشانی اولیه",
+"iOS/OS X" => "iOS/OS X "
+);
diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php
index 864c7a6ea40ab4e1a1b89bee5545b49506f0cdcb..6b753dcec97c5f79971b92d92d1b47cc563116ee 100644
--- a/apps/contacts/l10n/fr.php
+++ b/apps/contacts/l10n/fr.php
@@ -3,16 +3,48 @@
 "There was an error adding the contact." => "Une erreur s'est produite lors de l'ajout du contact.",
 "Cannot add empty property." => "Impossible d'ajouter un champ vide.",
 "At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.",
+"Trying to add duplicate property: " => "Ajout d'une propriété en double:",
 "Error adding contact property." => "Erreur lors de l'ajout du champ.",
+"No ID provided" => "Aucun ID fourni",
+"Error setting checksum." => "Erreur lors du paramétrage du hachage.",
+"No categories selected for deletion." => "Pas de catégories sélectionnées pour la suppression.",
+"No address books found." => "Pas de carnet d'adresses trouvé.",
+"No contacts found." => "Aucun contact trouvé.",
+"Missing ID" => "ID manquant",
+"Error parsing VCard for ID: \"" => "Erreur lors de l'analyse du VCard pour l'ID: \"",
+"Cannot add addressbook with an empty name." => "Ne peut être ajouté avec un nom vide.",
 "Error adding addressbook." => "Erreur lors de l'ajout du carnet d'adresses.",
 "Error activating addressbook." => "Erreur lors de l'activation du carnet d'adresses.",
+"No contact ID was submitted." => "Aucun ID de contact envoyé",
+"Error loading image." => "Erreur lors du chargement de l'image.",
+"Error reading contact photo." => "Erreur de lecture de la photo du contact.",
+"Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.",
+"The loading photo is not valid." => "La photo chargée est invalide.",
+"id is not set." => "L'ID n'est pas défini.",
 "Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.",
 "Error deleting contact property." => "Erreur lors de la suppression du champ.",
+"Contact ID is missing." => "L'ID du contact est manquant.",
+"Missing contact id." => "ID contact manquant.",
+"No photo path was submitted." => "Le chemin de la photo n'a pas été envoyé.",
+"File doesn't exist:" => "Fichier inexistant:",
+"element name is not set." => "Le champ Nom n'est pas défini.",
+"checksum is not set." => "L'hachage n'est pas défini.",
+"Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:",
+"Something went FUBAR. " => "Quelque chose est FUBAR.",
 "Error updating contact property." => "Erreur lors de la mise à jour du champ.",
+"Cannot update addressbook with an empty name." => "Impossible de mettre à jour le carnet d'adresses avec un nom vide.",
 "Error updating addressbook." => "Erreur lors de la mise à jour du carnet d'adresses.",
+"Error uploading contacts to storage." => "Erreur lors de l'envoi des contacts vers le stockage.",
+"There is no error, the file uploaded with success" => "Il n'y a pas d'erreur, le fichier a été envoyé avec succes.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Le fichier envoyé dépasse la directive upload_max_filesize dans php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse la directive MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.",
+"The uploaded file was only partially uploaded" => "Le fichier envoyé n'a été que partiellement envoyé.",
+"No file was uploaded" => "Pas de fichier envoyé.",
+"Missing a temporary folder" => "Absence de dossier temporaire.",
 "Contacts" => "Contacts",
+"Addressbook not found." => "Carnet d'adresses introuvable.",
 "This is not your addressbook." => "Ce n'est pas votre carnet d'adresses.",
-"Contact could not be found." => "Ce contact n'a pas été trouvé.",
+"Contact could not be found." => "Ce contact n'a pu être trouvé.",
 "Address" => "Adresse",
 "Telephone" => "Téléphone",
 "Email" => "E-mail",
@@ -22,22 +54,52 @@
 "Mobile" => "Mobile",
 "Text" => "Texte",
 "Voice" => "Voix",
+"Message" => "Message",
 "Fax" => "Fax",
 "Video" => "Vidéo",
 "Pager" => "Bipeur",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Anniversaire de {name}",
 "Contact" => "Contact",
 "Add Contact" => "Ajouter un Contact",
 "Addressbooks" => "Carnets d'adresses",
+"Configure Address Books" => "Paramétrer carnet d'adresses",
 "New Address Book" => "Nouveau Carnet d'adresses",
+"Import from VCF" => "Importer depuis VCF",
 "CardDav Link" => "Lien CardDav",
 "Download" => "Télécharger",
 "Edit" => "Modifier",
 "Delete" => "Supprimer",
 "Download contact" => "Télécharger le contact",
 "Delete contact" => "Supprimer le contact",
+"Drop photo to upload" => "Glisser une photo pour l'envoi",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule",
+"Edit name details" => "Editer les noms",
+"Nickname" => "Surnom",
+"Enter nickname" => "Entrer un surnom",
 "Birthday" => "Anniversaire",
+"dd-mm-yyyy" => "jj-mm-aaaa",
+"Groups" => "Groupes",
+"Separate groups with commas" => "Séparer les groupes avec des virgules",
+"Edit groups" => "Editer les groupes",
 "Preferred" => "Préféré",
+"Please specify a valid email address." => "Merci d'entrer une adresse e-mail valide.",
+"Enter email address" => "Entrer une adresse e-mail",
+"Delete email address" => "Supprimer l'adresse e-mail",
+"Enter phone number" => "Entrer un numéro de téléphone",
+"Delete phone number" => "Supprimer le numéro de téléphone",
+"View on map" => "Voir sur une carte",
+"Edit address details" => "Editer les adresses",
+"Add notes here." => "Ajouter des notes ici.",
+"Add field" => "Ajouter un champ.",
+"Profile picture" => "Photo de profil",
 "Phone" => "Téléphone",
+"Note" => "Note",
+"Delete current photo" => "Supprimer la photo actuelle",
+"Edit current photo" => "Editer la photo actuelle",
+"Upload new photo" => "Envoyer une nouvelle photo",
+"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud",
+"Edit address" => "Editer l'adresse",
 "Type" => "Type",
 "PO Box" => "Boîte postale",
 "Extended" => "Étendu",
@@ -46,13 +108,44 @@
 "Region" => "Région",
 "Zipcode" => "Code postal",
 "Country" => "Pays",
+"Edit categories" => "Editer les catégories",
 "Add" => "Ajouter",
 "Addressbook" => "Carnet d'adresses",
+"Hon. prefixes" => "Préfixe hon.",
+"Miss" => "Mlle",
+"Ms" => "Mme",
+"Mr" => "M.",
+"Sir" => "Sir",
+"Mrs" => "Mme",
+"Dr" => "Dr",
+"Given name" => "Prénom",
+"Additional names" => "Nom supplémentaires",
+"Family name" => "Nom de famille",
+"Hon. suffixes" => "Suffixes hon.",
 "New Addressbook" => "Nouveau carnet d'adresses",
 "Edit Addressbook" => "Éditer le carnet d'adresses",
 "Displayname" => "Nom",
 "Active" => "Carnet actif",
 "Save" => "Sauvegarder",
 "Submit" => "Envoyer",
-"Cancel" => "Annuler"
+"Cancel" => "Annuler",
+"Import a contacts file" => "Importer un fichier de contacts",
+"Please choose the addressbook" => "Choisissez le carnet d'adresses SVP",
+"create a new addressbook" => "Créer un nouveau carnet d'adresses",
+"Name of new addressbook" => "Nom du nouveau carnet d'adresses",
+"Import" => "Importer",
+"Importing contacts" => "Importation des contacts",
+"Contacts imported successfully" => "Contacts importés avec succes",
+"Close Dialog" => "Fermer la boite de dialogue",
+"Import Addressbook" => "Importer un carnet d'adresses.",
+"Select address book to import to:" => "Selectionner le carnet d'adresses à importer vers:",
+"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.",
+"Select from HD" => "Selectionner depuis le disque dur",
+"You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.",
+"Add contact" => "Ajouter un contact",
+"Configure addressbooks" => "Paramétrer carnet d'adresses",
+"CardDAV syncing addresses" => "Synchronisation des contacts CardDAV",
+"more info" => "Plus d'infos",
+"Primary address (Kontact et al)" => "Adresse principale",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/hu_HU.php b/apps/contacts/l10n/hu_HU.php
index d9e26ebd7b78bbb8298dee56bc67f1eda82ec9d4..9f392bc8a58b2caf9c321b955e45eadbf8ef778c 100644
--- a/apps/contacts/l10n/hu_HU.php
+++ b/apps/contacts/l10n/hu_HU.php
@@ -1,29 +1,160 @@
 <?php $TRANSLATIONS = array(
+"Error (de)activating addressbook." => "Címlista (de)aktiválása sikertelen",
+"There was an error adding the contact." => "Hiba a kontakt hozzáadásakor",
+"Cannot add empty property." => "Nem adható hozzá üres tulajdonság",
+"At least one of the address fields has to be filled out." => "Legalább egy címmező kitöltendő",
+"Trying to add duplicate property: " => "Kísérlet dupla tulajdonság hozzáadására: ",
+"Error adding contact property." => "Hiba a kontakt-tulajdonság hozzáadásakor",
+"No ID provided" => "Nincs ID megadva",
+"Error setting checksum." => "Hiba az ellenőrzőösszeg beállításakor",
+"No categories selected for deletion." => "Nincs kiválasztva törlendő kategória",
+"No address books found." => "Nem található címlista",
+"No contacts found." => "Nem található kontakt",
+"Missing ID" => "Hiányzó ID",
+"Error parsing VCard for ID: \"" => "VCard elemzése sikertelen a következő ID-hoz: \"",
+"Cannot add addressbook with an empty name." => "Nem adható hozzá névtelen címlista",
+"Error adding addressbook." => "Hiba a címlista hozzáadásakor",
+"Error activating addressbook." => "Címlista aktiválása sikertelen",
+"No contact ID was submitted." => "Nincs ID megadva a kontakthoz",
+"Error loading image." => "Kép betöltése sikertelen",
+"Error reading contact photo." => "A kontakt képének beolvasása sikertelen",
+"Error saving temporary file." => "Ideiglenes fájl mentése sikertelen",
+"The loading photo is not valid." => "A kép érvénytelen",
+"id is not set." => "ID nincs beállítva",
 "Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.",
+"Error deleting contact property." => "Hiba a kontakt-tulajdonság törlésekor",
+"Contact ID is missing." => "Hiányzik a kontakt ID",
+"Missing contact id." => "Hiányzik a kontakt ID",
+"No photo path was submitted." => "Nincs fénykép-útvonal megadva",
+"File doesn't exist:" => "A fájl nem létezik:",
+"element name is not set." => "az elem neve nincs beállítva",
+"checksum is not set." => "az ellenőrzőösszeg nincs beállítva",
+"Information about vCard is incorrect. Please reload the page: " => "Helytelen információ a vCardról. Töltse újra az oldalt: ",
+"Something went FUBAR. " => "Valami balul sült el.",
+"Error updating contact property." => "Hiba a kontakt-tulajdonság frissítésekor",
+"Cannot update addressbook with an empty name." => "Üres névvel nem frissíthető a címlista",
+"Error updating addressbook." => "Hiba a címlista frissítésekor",
+"Error uploading contacts to storage." => "Hiba a kontaktok feltöltésekor",
+"There is no error, the file uploaded with success" => "Nincs hiba, a fájl sikeresen feltöltődött",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "A feltöltött fájl mérete meghaladja az upload_max_filesize értéket a php.ini-ben",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "A feltöltött fájl mérete meghaladja a HTML form-ban megadott MAX_FILE_SIZE értéket",
+"The uploaded file was only partially uploaded" => "A fájl csak részlegesen lett feltöltve",
+"No file was uploaded" => "Nincs feltöltött fájl",
+"Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár",
+"Contacts" => "Kontaktok",
+"Addressbook not found." => "Címlista nem található",
 "This is not your addressbook." => "Ez nem a te címjegyzéked.",
 "Contact could not be found." => "Kapcsolat nem található.",
 "Address" => "Cím",
 "Telephone" => "Telefonszám",
 "Email" => "E-mail",
-"Organization" => "Organizáció",
-"Work" => "Munka",
-"Home" => "Otthon",
+"Organization" => "Szervezet",
+"Work" => "Munkahelyi",
+"Home" => "Otthoni",
 "Mobile" => "Mobiltelefonszám",
 "Text" => "Szöveg",
 "Voice" => "Hang",
+"Message" => "Üzenet",
 "Fax" => "Fax",
 "Video" => "Video",
-"Pager" => "Lapozó",
+"Pager" => "Személyhívó",
+"Internet" => "Internet",
+"{name}'s Birthday" => "{name} születésnapja",
+"Contact" => "Kontakt",
 "Add Contact" => "Kontakt hozzáadása",
+"Addressbooks" => "Címlisták",
+"Configure Address Books" => "Címlisták beállítása",
+"New Address Book" => "Új címlista",
+"Import from VCF" => "Importálás VCF-ből",
+"CardDav Link" => "CardDav hivatkozás",
+"Download" => "Letöltés",
 "Edit" => "Szerkesztés",
 "Delete" => "Törlés",
+"Download contact" => "Kontakt letöltése",
+"Delete contact" => "Kontakt törlése",
+"Drop photo to upload" => "Húzza ide a feltöltendő képet",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel",
+"Edit name details" => "Név részleteinek szerkesztése",
+"Nickname" => "Becenév",
+"Enter nickname" => "Becenév megadása",
 "Birthday" => "Születésnap",
+"dd-mm-yyyy" => "yyyy-mm-dd",
+"Groups" => "Csoportok",
+"Separate groups with commas" => "Vesszővel válassza el a csoportokat",
+"Edit groups" => "Csoportok szerkesztése",
+"Preferred" => "Előnyben részesített",
+"Please specify a valid email address." => "Adjon meg érvényes email címet",
+"Enter email address" => "Adja meg az email címet",
+"Mail to address" => "Postai cím",
+"Delete email address" => "Email cím törlése",
+"Enter phone number" => "Adja meg a telefonszámot",
+"Delete phone number" => "Telefonszám törlése",
+"View on map" => "Megtekintés a térképen",
+"Edit address details" => "Cím részleteinek szerkesztése",
+"Add notes here." => "Megjegyzések",
+"Add field" => "Mező hozzáadása",
+"Profile picture" => "Profilkép",
 "Phone" => "Telefonszám",
+"Note" => "Jegyzet",
+"Delete current photo" => "Aktuális kép törlése",
+"Edit current photo" => "Aktuális kép szerkesztése",
+"Upload new photo" => "Új kép feltöltése",
+"Select photo from ownCloud" => "Kép kiválasztása ownCloud-ból",
+"Edit address" => "Cím szerkesztése",
+"Type" => "Típus",
 "PO Box" => "Postafiók",
 "Extended" => "Kiterjesztett",
 "Street" => "Utca",
-"City" => "Helység",
+"City" => "Város",
 "Region" => "Megye",
 "Zipcode" => "Irányítószám",
-"Country" => "Ország"
+"Country" => "Ország",
+"Edit categories" => "Kategóriák szerkesztése",
+"Add" => "Hozzáad",
+"Addressbook" => "Címlista",
+"Hon. prefixes" => "Előtag",
+"Miss" => "Miss",
+"Ms" => "Ms",
+"Mr" => "Mr",
+"Sir" => "Sir",
+"Mrs" => "Mrs",
+"Dr" => "Dr",
+"Given name" => "Teljes név",
+"Additional names" => "További nevek",
+"Family name" => "Családnév",
+"Hon. suffixes" => "Utótag",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "Ifj.",
+"Sn." => "Id.",
+"New Addressbook" => "Új Címlista",
+"Edit Addressbook" => "Címlista szerkesztése",
+"Displayname" => "Megjelenített név",
+"Active" => "Aktív",
+"Save" => "Mentés",
+"Submit" => "Elküld",
+"Cancel" => "Mégsem",
+"Import a contacts file" => "Kontakt-fájl importálása",
+"Please choose the addressbook" => "Válassza ki a címlistát",
+"create a new addressbook" => "Címlista létrehozása",
+"Name of new addressbook" => "Új címlista neve",
+"Import" => "Import",
+"Importing contacts" => "Kontaktok importálása",
+"Contacts imported successfully" => "Kontaktok importálása sikeres",
+"Close Dialog" => "Párbeszédablak bezárása",
+"Import Addressbook" => "Címlista importálása",
+"Select address book to import to:" => "Melyik címlistába történjen az importálás:",
+"Drop a VCF file to import contacts." => "Húzza ide a VCF fájlt a kontaktok importálásához",
+"Select from HD" => "Kiválasztás merevlemezről",
+"You have no contacts in your addressbook." => "Nincs kontakt a címlistában",
+"Add contact" => "Kontakt hozzáadása",
+"Configure addressbooks" => "Címlisták beállítása",
+"CardDAV syncing addresses" => "CardDAV szinkronizációs címek",
+"more info" => "további infó",
+"Primary address (Kontact et al)" => "Elsődleges cím",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/ia.php b/apps/contacts/l10n/ia.php
index ad1bdf337e1ccc9de3b9d5e5b56742b061afc439..be4f8267a946bec8caaa8f89e39a71c92f929865 100644
--- a/apps/contacts/l10n/ia.php
+++ b/apps/contacts/l10n/ia.php
@@ -1,5 +1,15 @@
 <?php $TRANSLATIONS = array(
+"Cannot add empty property." => "Non pote adder proprietate vacue.",
+"No address books found." => "Nulle adressario trovate",
+"No contacts found." => "Nulle contactos trovate.",
+"Error adding addressbook." => "Error durante que il addeva le adressario.",
+"Error activating addressbook." => "Error in activar adressario",
+"Error loading image." => "Il habeva un error durante le cargamento del imagine.",
+"Error saving temporary file." => "Error durante le scriptura in le file temporari",
+"No file was uploaded" => "Nulle file esseva incargate.",
+"Missing a temporary folder" => "Manca un dossier temporari",
 "Contacts" => "Contactos",
+"Addressbook not found." => "Adressario non trovate.",
 "This is not your addressbook." => "Iste non es tu libro de adresses",
 "Contact could not be found." => "Contacto non poterea esser legite",
 "Address" => "Adresse",
@@ -11,21 +21,42 @@
 "Mobile" => "Mobile",
 "Text" => "Texto",
 "Voice" => "Voce",
+"Message" => "Message",
 "Fax" => "Fax",
 "Video" => "Video",
 "Pager" => "Pager",
+"Internet" => "Internet",
 "Contact" => "Contacto",
 "Add Contact" => "Adder contacto",
 "Addressbooks" => "Adressarios",
 "New Address Book" => "Nove adressario",
+"CardDav Link" => "Ligamine CardDav",
 "Download" => "Discargar",
 "Edit" => "Modificar",
 "Delete" => "Deler",
 "Download contact" => "Discargar contacto",
 "Delete contact" => "Deler contacto",
+"Nickname" => "Pseudonymo",
+"Enter nickname" => "Inserer pseudonymo",
 "Birthday" => "Anniversario",
+"Groups" => "Gruppos",
+"Edit groups" => "Modificar gruppos",
 "Preferred" => "Preferite",
+"Enter email address" => "Entrar un adresse de e-posta",
+"Delete email address" => "Deler adresse de E-posta",
+"Enter phone number" => "Entrar un numero de telephono",
+"Delete phone number" => "Deler numero de telephono",
+"View on map" => "Vider in un carta",
+"Add notes here." => "Adder notas hic",
+"Add field" => "Adder campo",
+"Profile picture" => "Imagine de profilo",
 "Phone" => "Phono",
+"Note" => "Nota",
+"Delete current photo" => "Deler photo currente",
+"Edit current photo" => "Modificar photo currente",
+"Upload new photo" => "Incargar nove photo",
+"Select photo from ownCloud" => "Seliger photo ex ownCloud",
+"Edit address" => "Modificar adresses",
 "Type" => "Typo",
 "PO Box" => "Cassa postal",
 "Extended" => "Extendite",
@@ -34,12 +65,33 @@
 "Region" => "Region",
 "Zipcode" => "Codice postal",
 "Country" => "Pais",
+"Edit categories" => "Modificar categorias",
 "Add" => "Adder",
 "Addressbook" => "Adressario",
+"Hon. prefixes" => "Prefixos honorific",
+"Miss" => "Senioretta",
+"Mr" => "Sr.",
+"Mrs" => "Sra.",
+"Dr" => "Dr.",
+"Given name" => "Nomine date",
+"Additional names" => "Nomines additional",
+"Family name" => "Nomine de familia",
+"Hon. suffixes" => "Suffixos honorific",
 "New Addressbook" => "Nove adressario",
 "Edit Addressbook" => "Modificar adressario",
 "Active" => "Active",
 "Save" => "Salveguardar",
 "Submit" => "Submitter",
-"Cancel" => "Cancellar"
+"Cancel" => "Cancellar",
+"Import a contacts file" => "Importar un file de contactos",
+"Please choose the addressbook" => "Per favor selige le adressario",
+"create a new addressbook" => "Crear un nove adressario",
+"Name of new addressbook" => "Nomine del nove gruppo:",
+"Import" => "Importar",
+"Contacts imported successfully" => "Contactos importate con successo.",
+"Close Dialog" => "Clauder dialogo",
+"Import Addressbook" => "Importar adressario.",
+"Add contact" => "Adder adressario",
+"more info" => "plus info",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php
index 7f3f4c6da2fda8fe440a28b2b3a2400176e74a87..ce016063ea79f02ccca83be642deb7d0d4ee9e1f 100644
--- a/apps/contacts/l10n/it.php
+++ b/apps/contacts/l10n/it.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Si è verificato un errore nell'aggiunta del contatto.",
 "Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.",
 "At least one of the address fields has to be filled out." => "Deve essere riempito almeno un indirizzo.",
+"Trying to add duplicate property: " => "P",
 "Error adding contact property." => "Errore durante l'aggiunta della proprietà del contatto.",
+"No ID provided" => "Nessun ID fornito",
+"Error setting checksum." => "Errore di impostazione del codice di controllo.",
+"No categories selected for deletion." => "Nessuna categoria selezionata per l'eliminazione.",
+"No address books found." => "Nessuna rubrica trovata.",
+"No contacts found." => "Nessun contatto trovato.",
+"Missing ID" => "ID mancante",
+"Error parsing VCard for ID: \"" => "Errore in fase di elaborazione del file VCard per l'ID: \"",
+"Cannot add addressbook with an empty name." => "Impossibile aggiungere una rubrica senza nome.",
 "Error adding addressbook." => "Errore durante l'aggiunta della rubrica.",
 "Error activating addressbook." => "Errore durante l'attivazione della rubrica.",
+"No contact ID was submitted." => "Nessun ID di contatto inviato.",
+"Error loading image." => "Errore di caricamento immagine.",
+"Error reading contact photo." => "Errore di lettura della foto del contatto.",
+"Error saving temporary file." => "Errore di salvataggio del file temporaneo.",
+"The loading photo is not valid." => "La foto caricata non è valida.",
+"id is not set." => "ID non impostato.",
 "Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.",
 "Error deleting contact property." => "Errore durante l'eliminazione della proprietà del contatto.",
+"Contact ID is missing." => "Manca l'ID del contatto.",
+"Missing contact id." => "ID di contatto mancante.",
+"No photo path was submitted." => "Non è stato inviato alcun percorso a una foto.",
+"File doesn't exist:" => "Il file non esiste:",
+"element name is not set." => "il nome dell'elemento non è impostato.",
+"checksum is not set." => "il codice di controllo non è impostato.",
+"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ",
+"Something went FUBAR. " => "Qualcosa è andato storto. ",
 "Error updating contact property." => "Errore durante l'aggiornamento della proprietà del contatto.",
+"Cannot update addressbook with an empty name." => "Impossibile aggiornare una rubrica senza nome.",
 "Error updating addressbook." => "Errore durante l'aggiornamento della rubrica.",
+"Error uploading contacts to storage." => "Errore di invio dei contatti in archivio.",
+"There is no error, the file uploaded with success" => "Non ci sono errori, il file è stato inviato correttamente",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Il file inviato supera la direttiva upload_max_filesize nel php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Il file inviato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML",
+"The uploaded file was only partially uploaded" => "Il file è stato inviato solo parzialmente",
+"No file was uploaded" => "Nessun file è stato inviato",
+"Missing a temporary folder" => "Manca una cartella temporanea",
 "Contacts" => "Contatti",
+"Addressbook not found." => "Rubrica non trovata.",
 "This is not your addressbook." => "Questa non è la tua rubrica.",
 "Contact could not be found." => "Il contatto non può essere trovato.",
 "Address" => "Indirizzo",
@@ -22,22 +54,53 @@
 "Mobile" => "Cellulare",
 "Text" => "Testo",
 "Voice" => "Voce",
+"Message" => "Messaggio",
 "Fax" => "Fax",
 "Video" => "Video",
 "Pager" => "Cercapersone",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Data di nascita di {name}",
 "Contact" => "Contatto",
 "Add Contact" => "Aggiungi contatto",
 "Addressbooks" => "Rubriche",
+"Configure Address Books" => "Configura rubrica",
 "New Address Book" => "Nuova rubrica",
+"Import from VCF" => "Importa da VCF",
 "CardDav Link" => "Link CardDav",
 "Download" => "Scarica",
 "Edit" => "Modifica",
 "Delete" => "Elimina",
 "Download contact" => "Scarica contatto",
 "Delete contact" => "Elimina contatto",
+"Drop photo to upload" => "Rilascia una foto da inviare",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola",
+"Edit name details" => "Modifica dettagli del nome",
+"Nickname" => "Pseudonimo",
+"Enter nickname" => "Inserisci pseudonimo",
 "Birthday" => "Compleanno",
+"dd-mm-yyyy" => "gg-mm-aaaa",
+"Groups" => "Gruppi",
+"Separate groups with commas" => "Separa i gruppi con virgole",
+"Edit groups" => "Modifica gruppi",
 "Preferred" => "Preferito",
+"Please specify a valid email address." => "Specifica un indirizzo email valido",
+"Enter email address" => "Inserisci indirizzo email",
+"Mail to address" => "Invia per email",
+"Delete email address" => "Elimina l'indirizzo email",
+"Enter phone number" => "Inserisci il numero di telefono",
+"Delete phone number" => "Elimina il numero di telefono",
+"View on map" => "Visualizza sulla mappa",
+"Edit address details" => "Modifica dettagli dell'indirizzo",
+"Add notes here." => "Aggiungi qui le note.",
+"Add field" => "Aggiungi campo",
+"Profile picture" => "Immagine del profilo",
 "Phone" => "Telefono",
+"Note" => "Nota",
+"Delete current photo" => "Elimina la foto corrente",
+"Edit current photo" => "Modifica la foto corrente",
+"Upload new photo" => "Invia una nuova foto",
+"Select photo from ownCloud" => "Seleziona la foto da ownCloud",
+"Edit address" => "Modifica indirizzo",
 "Type" => "Tipo",
 "PO Box" => "Casella postale",
 "Extended" => "Esteso",
@@ -46,13 +109,52 @@
 "Region" => "Regione",
 "Zipcode" => "CAP",
 "Country" => "Stato",
+"Edit categories" => "Modifica categorie",
 "Add" => "Aggiungi",
 "Addressbook" => "Rubrica",
+"Hon. prefixes" => "Prefissi onorifici",
+"Miss" => "Sig.na",
+"Ms" => "Sig.ra",
+"Mr" => "Sig.",
+"Sir" => "Sig.",
+"Mrs" => "Sig.ra",
+"Dr" => "Dott.",
+"Given name" => "Nome",
+"Additional names" => "Nomi aggiuntivi",
+"Family name" => "Cognome",
+"Hon. suffixes" => "Suffissi onorifici",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
 "New Addressbook" => "Nuova rubrica",
 "Edit Addressbook" => "Modifica rubrica",
 "Displayname" => "Nome visualizzato",
 "Active" => "Attiva",
 "Save" => "Salva",
 "Submit" => "Invia",
-"Cancel" => "Annulla"
+"Cancel" => "Annulla",
+"Import a contacts file" => "Importa un file di contatti",
+"Please choose the addressbook" => "Scegli la rubrica",
+"create a new addressbook" => "crea una nuova rubrica",
+"Name of new addressbook" => "Nome della nuova rubrica",
+"Import" => "Importa",
+"Importing contacts" => "Importazione contatti",
+"Contacts imported successfully" => "Contatti importati correttamente",
+"Close Dialog" => "Chiudi finestra",
+"Import Addressbook" => "Importa rubrica",
+"Select address book to import to:" => "Seleziona la rubrica di destinazione:",
+"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.",
+"Select from HD" => "Seleziona da disco",
+"You have no contacts in your addressbook." => "Non hai contatti nella rubrica.",
+"Add contact" => "Aggiungi contatto",
+"Configure addressbooks" => "Configura rubriche",
+"CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV",
+"more info" => "altre informazioni",
+"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/ko.php b/apps/contacts/l10n/ko.php
index f17c20678e4aeee8bbf834ba247aa7b098a22db0..bba3e29d2ec459764d0411b31ae136d87eaa72e6 100644
--- a/apps/contacts/l10n/ko.php
+++ b/apps/contacts/l10n/ko.php
@@ -4,13 +4,32 @@
 "Cannot add empty property." => "빈 속성을 추가할 수 없습니다.",
 "At least one of the address fields has to be filled out." => "최소한 하나의 주소록 항목을 입력해야 합니다.",
 "Error adding contact property." => "연락처 속성을 추가할 수 없습니다.",
+"No ID provided" => "제공되는 아이디 없음",
+"Error setting checksum." => "오류 검사합계 설정",
+"No categories selected for deletion." => "삭제 카테고리를 선택하지 않았습니다. ",
+"No address books found." => "주소록을 찾을 수 없습니다.",
+"No contacts found." => "연락처를 찾을 수 없습니다.",
+"Missing ID" => "아이디 분실",
+"Cannot add addressbook with an empty name." => "성명란이 비어 주소록에 추가 할 수 없습니다.",
 "Error adding addressbook." => "주소록을 추가할 수 없습니다.",
 "Error activating addressbook." => "주소록을 활성화할 수 없습니다.",
+"No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.",
+"Error loading image." => "로딩 이미지 오류입니다.",
+"Error reading contact photo." => "사진 읽기 오류",
+"Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ",
+"The loading photo is not valid." => "로딩 사진이 유효하지 않습니다. ",
+"id is not set." => "아이디가 설정되어 있지 않습니다. ",
 "Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.",
 "Error deleting contact property." => "연락처 속성을 삭제할 수 없습니다.",
+"Contact ID is missing." => "접속 아이디가 없습니다. ",
+"Missing contact id." => "접속 아이디 분실",
+"File doesn't exist:" => "파일이 존재하지 않습니다. ",
 "Error updating contact property." => "연락처 속성을 업데이트할 수 없습니다.",
 "Error updating addressbook." => "주소록을 업데이트할 수 없습니다.",
+"No file was uploaded" => "파일이 업로드 되어있지 않습니다",
+"Missing a temporary folder" => "임시 폴더 분실",
 "Contacts" => "연락처",
+"Addressbook not found." => "주소록을 찾을 수 없습니다.",
 "This is not your addressbook." => "내 주소록이 아닙니다.",
 "Contact could not be found." => "연락처를 찾을 수 없습니다.",
 "Address" => "주소",
@@ -22,21 +41,36 @@
 "Mobile" => "휴대폰",
 "Text" => "문자 번호",
 "Voice" => "음성 번호",
+"Message" => "메세지",
 "Fax" => "팩스 번호",
 "Video" => "영상 번호",
 "Pager" => "호출기",
+"Internet" => "인터넷",
+"{name}'s Birthday" => "{이름}의 생일",
 "Contact" => "연락처",
 "Add Contact" => "연락처 추가",
 "Addressbooks" => "주소록",
+"Configure Address Books" => "주소록 구성",
 "New Address Book" => "새 주소록",
+"Import from VCF" => "VCF에서 가져오기",
 "CardDav Link" => "CardDav 링크",
 "Download" => "다운로드",
 "Edit" => "편집",
 "Delete" => "삭제",
 "Download contact" => "연락처 다운로드",
 "Delete contact" => "연락처 삭제",
+"Drop photo to upload" => "Drop photo to upload",
+"Edit name details" => "이름 세부사항을 편집합니다. ",
+"Nickname" => "별명",
+"Enter nickname" => "별명 입력",
 "Birthday" => "생일",
+"dd-mm-yyyy" => "일-월-년",
+"Groups" => "그룹",
+"Separate groups with commas" => "쉼표로 그룹 구분",
+"Edit groups" => "그룹 편집",
 "Preferred" => "선호함",
+"Please specify a valid email address." => "올바른 이메일 주소를 입력하세요.",
+"Enter email address" => "이메일 주소 입력",
 "Phone" => "전화 번호",
 "Type" => "종류",
 "PO Box" => "사서함",
diff --git a/apps/contacts/l10n/mk.php b/apps/contacts/l10n/mk.php
index 4ca8b3f6eea3d0aa74decc06b3a01e7c2f30fedf..4e9b2cc0d785868c317d63000771d17d99818ffe 100644
--- a/apps/contacts/l10n/mk.php
+++ b/apps/contacts/l10n/mk.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Имаше грешка при додавање на контактот.",
 "Cannot add empty property." => "Неможе да се додаде празна вредност.",
 "At least one of the address fields has to be filled out." => "Барем една од полињата за адреса треба да биде пополнето.",
+"Trying to add duplicate property: " => "Се обидовте да внесете дупликат вредност:",
 "Error adding contact property." => "Грешка при додавање на вредност за контактот.",
+"No ID provided" => "Нема доставено ИД",
+"Error setting checksum." => "Грешка во поставување сума за проверка.",
+"No categories selected for deletion." => "Нема избрано категории за бришење.",
+"No address books found." => "Не се најдени адресари.",
+"No contacts found." => "Не се најдени контакти.",
+"Missing ID" => "Недостасува ИД",
+"Error parsing VCard for ID: \"" => "Грешка при парсирање VCard за ИД: \"",
+"Cannot add addressbook with an empty name." => "Неможе да се внесе адресар со празно име.",
 "Error adding addressbook." => "Грешки при додавање на адресарот.",
 "Error activating addressbook." => "Грешка при активирање на адресарот.",
+"No contact ID was submitted." => "Не беше доставено ИД за контакт.",
+"Error loading image." => "Грешка во вчитување на слика.",
+"Error reading contact photo." => "Грешка во читање на контакт фотографија.",
+"Error saving temporary file." => "Грешка во снимање на привремена датотека.",
+"The loading photo is not valid." => "Фотографијата која се вчитува е невалидна.",
+"id is not set." => "ид не е поставено.",
 "Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.",
 "Error deleting contact property." => "Греш при бришење на вредноста за контакт.",
+"Contact ID is missing." => "ИД за контакт недостасува.",
+"Missing contact id." => "Недостасува ид за контакт.",
+"No photo path was submitted." => "Не беше поднесена патека за фотографија.",
+"File doesn't exist:" => "Не постои датотеката:",
+"element name is not set." => "име за елементот не е поставена.",
+"checksum is not set." => "сумата за проверка не е поставена.",
+"Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:",
+"Something went FUBAR. " => "Нешто се расипа.",
 "Error updating contact property." => "Грешка при ажурирање на вредноста за контакт.",
+"Cannot update addressbook with an empty name." => "Неможе да се ажурира адресар со празно име.",
 "Error updating addressbook." => "Грешка при ажурирање на адресарот.",
+"Error uploading contacts to storage." => "Грешка во снимање на контактите на диск.",
+"There is no error, the file uploaded with success" => "Датотеката беше успешно подигната.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Големината на датотеката ја надминува upload_max_filesize директивата во php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
+"The uploaded file was only partially uploaded" => "Датотеката беше само делумно подигната.",
+"No file was uploaded" => "Не беше подигната датотека.",
+"Missing a temporary folder" => "Недостасува привремена папка",
 "Contacts" => "Контакти",
+"Addressbook not found." => "Адресарот не е најден.",
 "This is not your addressbook." => "Ова не е во Вашиот адресар.",
 "Contact could not be found." => "Контактот неможе да биде најден.",
 "Address" => "Адреса",
@@ -22,22 +54,53 @@
 "Mobile" => "Мобилен",
 "Text" => "Текст",
 "Voice" => "Глас",
+"Message" => "Порака",
 "Fax" => "Факс",
 "Video" => "Видео",
 "Pager" => "Пејџер",
+"Internet" => "Интернет",
+"{name}'s Birthday" => "Роденден на {name}",
 "Contact" => "Контакт",
 "Add Contact" => "Додади контакт",
 "Addressbooks" => "Адресари",
+"Configure Address Books" => "Конфигурирај адресар",
 "New Address Book" => "Нов адресар",
+"Import from VCF" => "Внеси од VCF",
 "CardDav Link" => "Врска за CardDav",
 "Download" => "Преземи",
 "Edit" => "Уреди",
 "Delete" => "Избриши",
 "Download contact" => "Преземи го контактот",
 "Delete contact" => "Избриши го контактот",
+"Drop photo to upload" => "Довлечкај фотографија за да се подигне",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка",
+"Edit name details" => "Уреди детали за име",
+"Nickname" => "Прекар",
+"Enter nickname" => "Внеси прекар",
 "Birthday" => "Роденден",
+"dd-mm-yyyy" => "dd-mm-yyyy",
+"Groups" => "Групи",
+"Separate groups with commas" => "Одвоете ги групите со запирка",
+"Edit groups" => "Уреди групи",
 "Preferred" => "Претпочитано",
+"Please specify a valid email address." => "Ве молам внесете правилна адреса за е-пошта.",
+"Enter email address" => "Внесете е-пошта",
+"Mail to address" => "Прати порака до адреса",
+"Delete email address" => "Избриши адреса за е-пошта",
+"Enter phone number" => "Внесете телефонски број",
+"Delete phone number" => "Избриши телефонски број",
+"View on map" => "Погледајте на мапа",
+"Edit address details" => "Уреди детали за адреса",
+"Add notes here." => "Внесете забелешки тука.",
+"Add field" => "Додади поле",
+"Profile picture" => "Фотографија за профил",
 "Phone" => "Телефон",
+"Note" => "Забелешка",
+"Delete current photo" => "Избриши моментална фотографија",
+"Edit current photo" => "Уреди моментална фотографија",
+"Upload new photo" => "Подигни нова фотографија",
+"Select photo from ownCloud" => "Изберете фотографија од ownCloud",
+"Edit address" => "Уреди адреса",
 "Type" => "Тип",
 "PO Box" => "Поштенски фах",
 "Extended" => "Дополнително",
@@ -46,13 +109,52 @@
 "Region" => "Регион",
 "Zipcode" => "Поштенски код",
 "Country" => "Држава",
+"Edit categories" => "Уреди категории",
 "Add" => "Додади",
 "Addressbook" => "Адресар",
+"Hon. prefixes" => "Префикси за титула",
+"Miss" => "Г-ца",
+"Ms" => "Г-ѓа",
+"Mr" => "Г-дин",
+"Sir" => "Сер",
+"Mrs" => "Г-ѓа",
+"Dr" => "Др",
+"Given name" => "Лично име",
+"Additional names" => "Дополнителни имиња",
+"Family name" => "Презиме",
+"Hon. suffixes" => "Суфикси за титула",
+"J.D." => "J.D.",
+"M.D." => "Д.М.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Д-р",
+"Esq." => "Esq.",
+"Jr." => "Помлад.",
+"Sn." => "Постар.",
 "New Addressbook" => "Нов адресар",
 "Edit Addressbook" => "Уреди адресар",
 "Displayname" => "Прикажано име",
 "Active" => "Активно",
 "Save" => "Сними",
 "Submit" => "Прати",
-"Cancel" => "Откажи"
+"Cancel" => "Откажи",
+"Import a contacts file" => "Внеси датотека со контакти",
+"Please choose the addressbook" => "Ве молам изберете адресар",
+"create a new addressbook" => "креирај нов адресар",
+"Name of new addressbook" => "Име на новиот адресар",
+"Import" => "Внеси",
+"Importing contacts" => "Внесување контакти",
+"Contacts imported successfully" => "Контаките беа внесени успешно",
+"Close Dialog" => "Дијалог за затварање",
+"Import Addressbook" => "Внеси адресар",
+"Select address book to import to:" => "Изберете адресар да се внесе:",
+"Drop a VCF file to import contacts." => "Довлечкај VCF датотека да се внесат контакти.",
+"Select from HD" => "Изберете од хард диск",
+"You have no contacts in your addressbook." => "Немате контакти во Вашиот адресар.",
+"Add contact" => "Додади контакт",
+"Configure addressbooks" => "Уреди адресари",
+"CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV",
+"more info" => "повеќе информации",
+"Primary address (Kontact et al)" => "Примарна адреса",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/nb_NO.php b/apps/contacts/l10n/nb_NO.php
index 7624c9b8c27d6cde6e273b89728e3250ec82a343..7b78456feff612f82346fb3b56c89443c33a9f2e 100644
--- a/apps/contacts/l10n/nb_NO.php
+++ b/apps/contacts/l10n/nb_NO.php
@@ -4,13 +4,33 @@
 "Cannot add empty property." => "Kan ikke legge til tomt felt.",
 "At least one of the address fields has to be filled out." => "Minst en av adressefeltene må oppgis.",
 "Error adding contact property." => "Et problem oppsto med å legge til kontaktfeltet.",
+"No categories selected for deletion." => "Ingen kategorier valgt for sletting.",
+"No address books found." => "Ingen adressebok funnet.",
+"No contacts found." => "Ingen kontakter funnet.",
+"Missing ID" => "Manglende ID",
+"Cannot add addressbook with an empty name." => "Kan ikke legge til en adressebok uten navn.",
 "Error adding addressbook." => "Et problem oppsto med å legge til adresseboken.",
 "Error activating addressbook." => "Et problem oppsto med å aktivere adresseboken.",
+"Error loading image." => "Klarte ikke å laste bilde.",
+"Error reading contact photo." => "Klarte ikke å lese kontaktbilde.",
+"Error saving temporary file." => "Klarte ikke å lagre midlertidig fil.",
 "Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt.",
 "Error deleting contact property." => "Et problem oppsto med å fjerne kontaktfeltet.",
+"Missing contact id." => "Mangler kontakt-id.",
+"No photo path was submitted." => "Ingen filsti ble lagt inn.",
+"File doesn't exist:" => "Filen eksisterer ikke:",
+"Something went FUBAR. " => "Noe gikk fryktelig galt.",
 "Error updating contact property." => "Et problem oppsto med å legge til kontaktfeltet.",
+"Cannot update addressbook with an empty name." => "Kan ikke oppdatere adressebøker uten navn.",
 "Error updating addressbook." => "Et problem oppsto med å oppdatere adresseboken.",
+"There is no error, the file uploaded with success" => "Pust ut, ingen feil. Filen ble lastet opp problemfritt",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Filen du prøvde å laste opp var større enn grensen upload_max_filesize i php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Filen du prøvde å laste opp var større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet.",
+"The uploaded file was only partially uploaded" => "Filen du prøvde å laste opp ble kun delvis lastet opp",
+"No file was uploaded" => "Ingen filer ble lastet opp",
+"Missing a temporary folder" => "Mangler midlertidig mappe",
 "Contacts" => "Kontakter",
+"Addressbook not found." => "Adresseboken ble ikke funnet.",
 "This is not your addressbook." => "Dette er ikke dine adressebok.",
 "Contact could not be found." => "Kontakten ble ikke funnet.",
 "Address" => "Adresse",
@@ -22,22 +42,49 @@
 "Mobile" => "Mobil",
 "Text" => "Tekst",
 "Voice" => "Svarer",
+"Message" => "Melding",
 "Fax" => "Faks",
 "Video" => "Video",
 "Pager" => "Pager",
+"Internet" => "Internett",
+"{name}'s Birthday" => "bursdagen til {name}",
 "Contact" => "Kontakt",
 "Add Contact" => "Ny kontakt",
 "Addressbooks" => "Adressebøker",
+"Configure Address Books" => "Konfigurer adressebok",
 "New Address Book" => "Ny adressebok",
+"Import from VCF" => "Importer fra VDF",
 "CardDav Link" => "CardDAV-lenke",
 "Download" => "Hent ned",
 "Edit" => "Rediger",
 "Delete" => "Slett",
 "Download contact" => "Hend ned kontakten",
 "Delete contact" => "Slett kontakt",
+"Drop photo to upload" => "Dra bilder hit for å laste opp",
+"Edit name details" => "Endre detaljer rundt navn",
+"Nickname" => "Kallenavn",
+"Enter nickname" => "Skriv inn kallenavn",
 "Birthday" => "Bursdag",
+"dd-mm-yyyy" => "dd-mm-åååå",
+"Groups" => "Grupper",
+"Separate groups with commas" => "Skill gruppene med komma",
+"Edit groups" => "Endre grupper",
 "Preferred" => "Foretrukket",
+"Enter email address" => "Skriv inn e-postadresse",
+"Delete email address" => "Fjern e-postadresse",
+"Enter phone number" => "Skriv inn telefonnummer",
+"Delete phone number" => "Fjern telefonnummer",
+"View on map" => "Se på kart",
+"Edit address details" => "Endre detaljer rundt adresse",
+"Add notes here." => "Legg inn notater her.",
+"Add field" => "Legg til felt",
+"Profile picture" => "Profilbilde",
 "Phone" => "Telefon",
+"Delete current photo" => "Fjern nåværende bilde",
+"Edit current photo" => "Rediger nåværende bilde",
+"Upload new photo" => "Last opp nytt bilde",
+"Select photo from ownCloud" => "Velg bilde fra ownCloud",
+"Edit address" => "Endre adresse",
 "Type" => "Type",
 "PO Box" => "Postboks",
 "Extended" => "Utvidet",
@@ -46,13 +93,35 @@
 "Region" => "Området",
 "Zipcode" => "Postnummer",
 "Country" => "Land",
+"Edit categories" => "Endre kategorier",
 "Add" => "Ny",
 "Addressbook" => "Adressebok",
+"Miss" => "Frøken",
+"Mr" => "Herr",
+"Mrs" => "Fru",
+"Dr" => "Dr",
+"Given name" => "Fornavn",
+"Additional names" => "Ev. mellomnavn",
+"Family name" => "Etternavn",
+"Hon. suffixes" => "Titler",
+"Jr." => "Jr.",
+"Sn." => "Sr.",
 "New Addressbook" => "Ny adressebok",
 "Edit Addressbook" => "Endre adressebok",
 "Displayname" => "Visningsnavn",
 "Active" => "Aktiv",
 "Save" => "Lagre",
 "Submit" => "Send inn",
-"Cancel" => "Avbryt"
+"Cancel" => "Avbryt",
+"Import a contacts file" => "Importer en fil med kontakter.",
+"Please choose the addressbook" => "Vennligst velg adressebok",
+"create a new addressbook" => "Lag ny adressebok",
+"Name of new addressbook" => "Navn på ny adressebok",
+"Import" => "Importer",
+"Importing contacts" => "Importerer kontakter",
+"Contacts imported successfully" => "Kontaktene ble importert uten feil",
+"Close Dialog" => "Lukk dialog",
+"Import Addressbook" => "Importer adressebok",
+"Add contact" => "Ny kontakt",
+"more info" => "mer info"
 );
diff --git a/apps/contacts/l10n/nl.php b/apps/contacts/l10n/nl.php
index a3fb78085371ff8c792e58ae8c969afad805586f..f0b603e583be1b279d32023866fb1b6ccd5772bb 100644
--- a/apps/contacts/l10n/nl.php
+++ b/apps/contacts/l10n/nl.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Er was een fout bij het toevoegen van het contact.",
 "Cannot add empty property." => "Kan geen lege eigenschap toevoegen.",
 "At least one of the address fields has to be filled out." => "Minstens één van de adresvelden moet ingevuld worden.",
+"Trying to add duplicate property: " => "Eigenschap bestaat al: ",
 "Error adding contact property." => "Fout bij het toevoegen van de contacteigenschap.",
+"No ID provided" => "Geen ID opgegeven",
+"Error setting checksum." => "Instellen controlegetal mislukt",
+"No categories selected for deletion." => "Geen categorieën geselecteerd om te verwijderen.",
+"No address books found." => "Geen adresboek gevonden",
+"No contacts found." => "Geen contracten gevonden",
+"Missing ID" => "Ontbrekend ID",
+"Error parsing VCard for ID: \"" => "Fout bij inlezen VCard voor ID: \"",
+"Cannot add addressbook with an empty name." => "Kan geen adresboek toevoegen zonder naam.",
 "Error adding addressbook." => "Fout bij het toevoegen van het adresboek.",
 "Error activating addressbook." => "Fout bij het activeren van het adresboek.",
+"No contact ID was submitted." => "Geen contact ID opgestuurd.",
+"Error loading image." => "Fout bij laden plaatje.",
+"Error reading contact photo." => "Lezen van contact foto mislukt.",
+"Error saving temporary file." => "Tijdelijk bestand opslaan mislukt.",
+"The loading photo is not valid." => "De geladen foto is niet goed.",
+"id is not set." => "id is niet ingesteld.",
 "Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.",
 "Error deleting contact property." => "Fout bij het verwijderen van de contacteigenschap.",
+"Contact ID is missing." => "Contact ID ontbreekt.",
+"Missing contact id." => "Ontbrekende contact id.",
+"No photo path was submitted." => "Geen fotopad opgestuurd.",
+"File doesn't exist:" => "Bestand bestaat niet:",
+"element name is not set." => "onderdeel naam is niet opgegeven.",
+"checksum is not set." => "controlegetal is niet opgegeven.",
+"Information about vCard is incorrect. Please reload the page: " => "Informatie over vCard is fout. Herlaad de pagina: ",
+"Something went FUBAR. " => "Er ging iets totaal verkeerd. ",
 "Error updating contact property." => "Fout bij het updaten van de contacteigenschap.",
+"Cannot update addressbook with an empty name." => "Kan adresboek zonder naam niet wijzigen",
 "Error updating addressbook." => "Fout bij het updaten van het adresboek.",
+"Error uploading contacts to storage." => "Fout bij opslaan van contacten.",
+"There is no error, the file uploaded with success" => "De upload van het bestand is goedgegaan.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het bestand overschrijdt de upload_max_filesize instelling in php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Het bestand overschrijdt de MAX_FILE_SIZE instelling dat is opgegeven in het HTML formulier",
+"The uploaded file was only partially uploaded" => "Het bestand is gedeeltelijk geüpload",
+"No file was uploaded" => "Er is geen bestand geüpload",
+"Missing a temporary folder" => "Er ontbreekt een tijdelijke map",
 "Contacts" => "Contacten",
+"Addressbook not found." => "Adresboek niet gevonden.",
 "This is not your addressbook." => "Dit is niet uw adresboek.",
 "Contact could not be found." => "Contact kon niet worden gevonden.",
 "Address" => "Adres",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobiel",
 "Text" => "Tekst",
 "Voice" => "Stem",
+"Message" => "Bericht",
 "Fax" => "Fax",
 "Video" => "Video",
 "Pager" => "Pieper",
+"Internet" => "Internet",
+"{name}'s Birthday" => "{name}'s verjaardag",
 "Contact" => "Contact",
 "Add Contact" => "Contact toevoegen",
 "Addressbooks" => "Adresboeken",
+"Configure Address Books" => "Instellen adresboeken",
 "New Address Book" => "Nieuw Adresboek",
+"Import from VCF" => "Importeer uit VCF",
 "CardDav Link" => "CardDav Link",
 "Download" => "Download",
 "Edit" => "Bewerken",
 "Delete" => "Verwijderen",
 "Download contact" => "Download contact",
 "Delete contact" => "Verwijder contact",
+"Drop photo to upload" => "Verwijder foto uit upload",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma",
+"Edit name details" => "Wijzig naam gegevens",
+"Nickname" => "Roepnaam",
+"Enter nickname" => "Voer roepnaam in",
 "Birthday" => "Verjaardag",
+"dd-mm-yyyy" => "dd-mm-yyyy",
+"Groups" => "Groepen",
+"Separate groups with commas" => "Gebruik komma bij meerder groepen",
+"Edit groups" => "Wijzig groepen",
 "Preferred" => "Voorkeur",
+"Please specify a valid email address." => "Geef een geldig email adres op.",
+"Enter email address" => "Voer email adres in",
+"Mail to address" => "Mail naar adres",
+"Delete email address" => "Verwijder email adres",
+"Enter phone number" => "Voer telefoonnummer in",
+"Delete phone number" => "Verwijdere telefoonnummer",
+"View on map" => "Bekijk op een kaart",
+"Edit address details" => "Wijzig adres gegevens",
+"Add notes here." => "Voeg notitie toe",
+"Add field" => "Voeg veld toe",
+"Profile picture" => "Profiel foto",
 "Phone" => "Telefoon",
+"Note" => "Notitie",
+"Delete current photo" => "Verwijdere huidige foto",
+"Edit current photo" => "Wijzig huidige foto",
+"Upload new photo" => "Upload nieuwe foto",
+"Select photo from ownCloud" => "Selecteer foto uit ownCloud",
+"Edit address" => "Wijzig adres",
 "Type" => "Type",
 "PO Box" => "Postbus",
 "Extended" => "Uitgebreide",
@@ -46,13 +109,37 @@
 "Region" => "Regio",
 "Zipcode" => "Postcode",
 "Country" => "Land",
+"Edit categories" => "Wijzig categorieën",
 "Add" => "Voeg toe",
 "Addressbook" => "Adresboek",
+"Hon. prefixes" => "Hon. prefixes",
+"Given name" => "Voornaam",
+"Additional names" => "Extra namen",
+"Family name" => "Achternaam",
 "New Addressbook" => "Nieuw adresboek",
 "Edit Addressbook" => "Wijzig adresboek",
 "Displayname" => "Weergavenaam",
 "Active" => "Actief",
 "Save" => "Opslaan",
 "Submit" => "Opslaan",
-"Cancel" => "Anuleren"
+"Cancel" => "Anuleren",
+"Import a contacts file" => "Importeer een contacten bestand",
+"Please choose the addressbook" => "Kies een adresboek",
+"create a new addressbook" => "Maak een nieuw adresboek",
+"Name of new addressbook" => "Naam van nieuw adresboek",
+"Import" => "Importeer",
+"Importing contacts" => "Importeren van contacten",
+"Contacts imported successfully" => "Contacten zijn geïmporteerd",
+"Close Dialog" => "Sluit venster",
+"Import Addressbook" => "Importeer adresboek",
+"Select address book to import to:" => "Selecteer adresboek voor import:",
+"Drop a VCF file to import contacts." => "Sleep een VCF bestand om de contacten te importeren.",
+"Select from HD" => "Selecteer van schijf",
+"You have no contacts in your addressbook." => "Je hebt geen contacten in je adresboek",
+"Add contact" => "Contactpersoon toevoegen",
+"Configure addressbooks" => "Bewerken adresboeken",
+"CardDAV syncing addresses" => "CardDAV synchroniseert de adressen",
+"more info" => "meer informatie",
+"Primary address (Kontact et al)" => "Standaardadres",
+"iOS/OS X" => "IOS/OS X"
 );
diff --git a/apps/contacts/l10n/pt_BR.php b/apps/contacts/l10n/pt_BR.php
index 23a8672ff993a0816e23554195122e2b7908aa18..7890ebf0b7d036309a072668f826873d42769567 100644
--- a/apps/contacts/l10n/pt_BR.php
+++ b/apps/contacts/l10n/pt_BR.php
@@ -3,13 +3,40 @@
 "There was an error adding the contact." => "Ocorreu um erro ao adicionar o contato.",
 "Cannot add empty property." => "Não é possível adicionar propriedade vazia.",
 "At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço tem que ser preenchido.",
+"Trying to add duplicate property: " => "Tentando adiciona propriedade duplicada:",
 "Error adding contact property." => "Erro ao adicionar propriedade de contato.",
+"No ID provided" => "Nenhum ID fornecido",
+"Error setting checksum." => "Erro ajustando checksum.",
+"No categories selected for deletion." => "Nenhum categoria selecionada para remoção.",
+"No address books found." => "Nenhuma agenda de endereços encontrada.",
+"No contacts found." => "Nenhum contato encontrado.",
+"Missing ID" => "Faltando ID",
+"Error parsing VCard for ID: \"" => "Erro de identificação VCard para ID:",
+"Cannot add addressbook with an empty name." => "Não é possivel adicionar uma agenda de endereços com o nome em branco.",
 "Error adding addressbook." => "Erro ao adicionar agenda.",
 "Error activating addressbook." => "Erro ao ativar agenda.",
+"No contact ID was submitted." => "Nenhum ID do contato foi submetido.",
+"Error loading image." => "Erro ao carregar imagem.",
+"Error reading contact photo." => "Erro de leitura na foto do contato.",
+"Error saving temporary file." => "Erro ao salvar arquivo temporário.",
+"The loading photo is not valid." => "Foto carregada não é válida.",
+"id is not set." => "ID não definido.",
 "Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.",
 "Error deleting contact property." => "Erro ao excluir propriedade de contato.",
+"Contact ID is missing." => "ID do contato está faltando.",
+"Missing contact id." => "Faltando ID do contato.",
+"No photo path was submitted." => "Nenhum caminho para foto foi submetido.",
+"File doesn't exist:" => "Arquivo não existe:",
+"element name is not set." => "nome do elemento não definido.",
+"checksum is not set." => "checksum não definido.",
+"Information about vCard is incorrect. Please reload the page: " => "Informação sobre vCard incorreto. Por favor, recarregue a página:",
+"Something went FUBAR. " => "Something went FUBAR. ",
 "Error updating contact property." => "Erro ao atualizar propriedades do contato.",
+"Cannot update addressbook with an empty name." => "Não é possível atualizar sua agenda com um nome em branco.",
 "Error updating addressbook." => "Erro ao atualizar agenda.",
+"Error uploading contacts to storage." => "Erro enviando contatos para armazenamento.",
+"There is no error, the file uploaded with success" => "Arquivo enviado com sucesso",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O arquivo enviado excede a diretiva upload_max_filesize em php.ini",
 "Contacts" => "Contatos",
 "This is not your addressbook." => "Esta não é a sua agenda de endereços.",
 "Contact could not be found." => "Contato não pôde ser encontrado.",
diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php
index 7637cae4d9f927bb60164b886f24ea7042c1ef09..c43a7e7767c3a4f2324497588d6184c887afff11 100644
--- a/apps/contacts/l10n/sk_SK.php
+++ b/apps/contacts/l10n/sk_SK.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Vyskytla sa chyba pri pridávaní kontaktu.",
 "Cannot add empty property." => "Nemôžem pridať prázdny údaj.",
 "At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.",
+"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:",
 "Error adding contact property." => "Chyba pridania údaju kontaktu",
+"No ID provided" => "ID nezadané",
+"Error setting checksum." => "Chyba pri nastavovaní kontrolného súčtu.",
+"No categories selected for deletion." => "Žiadne kategórie neboli vybraté na odstránenie.",
+"No address books found." => "Žiadny adresár nenájdený.",
+"No contacts found." => "Žiadne kontakty nenájdené.",
+"Missing ID" => "Chýba ID",
+"Error parsing VCard for ID: \"" => "Chyba pri vyňatí ID z VCard:",
+"Cannot add addressbook with an empty name." => "Nedá sa pridať adresár s prázdnym menom.",
 "Error adding addressbook." => "Chyba počas pridávania adresára.",
 "Error activating addressbook." => "Chyba aktivovania adresára.",
+"No contact ID was submitted." => "Nebolo nastavené ID kontaktu.",
+"Error loading image." => "Chyba pri nahrávaní obrázka.",
+"Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.",
+"Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.",
+"The loading photo is not valid." => "Načítaná fotka je vadná.",
+"id is not set." => "ID nie je nastavené.",
 "Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.",
 "Error deleting contact property." => "Chyba odstránenia údaju kontaktu.",
+"Contact ID is missing." => "Chýba ID kontaktu.",
+"Missing contact id." => "Chýba ID kontaktu.",
+"No photo path was submitted." => "Žiadna fotka nebola poslaná.",
+"File doesn't exist:" => "Súbor neexistuje:",
+"element name is not set." => "meno elementu nie je nastavené.",
+"checksum is not set." => "kontrolný súčet nie je nastavený.",
+"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.",
+"Something went FUBAR. " => "Niečo sa pokazilo.",
 "Error updating contact property." => "Chyba aktualizovania údaju kontaktu.",
+"Cannot update addressbook with an empty name." => "Nedá sa upraviť adresár s prázdnym menom.",
 "Error updating addressbook." => "Chyba aktualizácie adresára.",
+"Error uploading contacts to storage." => "Chyba pri ukladaní kontaktov na úložisko.",
+"There is no error, the file uploaded with success" => "Nevyskytla sa žiadna chyba, súbor úspešne uložené.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Ukladaný súbor prekračuje nastavenie upload_max_filesize v php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.",
+"The uploaded file was only partially uploaded" => "Ukladaný súbor sa nahral len čiastočne",
+"No file was uploaded" => "Žiadny súbor nebol uložený",
+"Missing a temporary folder" => "Chýba dočasný priečinok",
 "Contacts" => "Kontakty",
+"Addressbook not found." => "Adresár sa nenašiel.",
 "This is not your addressbook." => "Toto nie je váš adresár.",
 "Contact could not be found." => "Kontakt nebol nájdený.",
 "Address" => "Adresa",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobil",
 "Text" => "SMS",
 "Voice" => "Odkazová schránka",
+"Message" => "Správa",
 "Fax" => "Fax",
 "Video" => "Video",
 "Pager" => "Pager",
+"Internet" => "Internet",
+"{name}'s Birthday" => "Narodeniny {name}",
 "Contact" => "Kontakt",
 "Add Contact" => "Pridať Kontakt.",
 "Addressbooks" => "Adresáre",
+"Configure Address Books" => "Nastaviť adresáre",
 "New Address Book" => "Nový adresár",
+"Import from VCF" => "Importovať z VCF",
 "CardDav Link" => "CardDav odkaz",
 "Download" => "Stiahnuť",
 "Edit" => "Upraviť",
 "Delete" => "Odstrániť",
 "Download contact" => "Stiahnuť kontakt",
 "Delete contact" => "Odstrániť kontakt",
+"Drop photo to upload" => "Pretiahnite sem fotku pre nahratie",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami",
+"Edit name details" => "Upraviť podrobnosti mena",
+"Nickname" => "Prezývka",
+"Enter nickname" => "Zadajte prezývku",
 "Birthday" => "Narodeniny",
+"dd-mm-yyyy" => "dd. mm. yyyy",
+"Groups" => "Skupiny",
+"Separate groups with commas" => "Oddelte skupiny čiarkami",
+"Edit groups" => "Úprava skupín",
 "Preferred" => "Uprednostňované",
+"Please specify a valid email address." => "Prosím zadajte platnú e-mailovú adresu.",
+"Enter email address" => "Zadajte e-mailové adresy",
+"Mail to address" => "Odoslať na adresu",
+"Delete email address" => "Odstrániť e-mailové adresy",
+"Enter phone number" => "Zadajte telefónne číslo",
+"Delete phone number" => "Odstrániť telefónne číslo",
+"View on map" => "Zobraziť na mape",
+"Edit address details" => "Upraviť podrobnosti adresy",
+"Add notes here." => "Tu môžete pridať poznámky.",
+"Add field" => "Pridať pole",
+"Profile picture" => "Profilová fotka",
 "Phone" => "Telefón",
+"Note" => "Poznámka",
+"Delete current photo" => "Odstrániť súčasnú fotku",
+"Edit current photo" => "Upraviť súčasnú fotku",
+"Upload new photo" => "Nahrať novú fotku",
+"Select photo from ownCloud" => "Vybrať fotku z ownCloud",
+"Edit address" => "Upraviť adresu",
 "Type" => "Typ",
 "PO Box" => "PO Box",
 "Extended" => "Rozšírené",
@@ -46,13 +109,50 @@
 "Region" => "Región",
 "Zipcode" => "PSČ",
 "Country" => "Krajina",
+"Edit categories" => "Upraviť kategórie",
 "Add" => "Pridať",
 "Addressbook" => "Adresár",
+"Hon. prefixes" => "Tituly pred",
+"Miss" => "Slečna",
+"Ms" => "Pani",
+"Mr" => "Pán",
+"Sir" => "Sir",
+"Mrs" => "Pani",
+"Dr" => "Dr.",
+"Given name" => "Krstné meno",
+"Additional names" => "Ďalšie mená",
+"Family name" => "Priezvisko",
+"Hon. suffixes" => "Tituly za",
+"J.D." => "JUDr.",
+"M.D." => "MUDr.",
+"Ph.D." => "Ph.D.",
+"Esq." => "Esq.",
+"Jr." => "ml.",
+"Sn." => "st.",
 "New Addressbook" => "Nový Adresár",
 "Edit Addressbook" => "Upraviť Adresár",
 "Displayname" => "Zobrazené meno",
 "Active" => "Aktívny",
 "Save" => "Uložiť",
 "Submit" => "Odoslať",
-"Cancel" => "Zrušiť"
+"Cancel" => "Zrušiť",
+"Import a contacts file" => "Importovať súbor kontaktu",
+"Please choose the addressbook" => "Prosím zvolte adresár",
+"create a new addressbook" => "vytvoriť nový adresár",
+"Name of new addressbook" => "Meno nového adresára",
+"Import" => "Importovať",
+"Importing contacts" => "Importovanie kontaktov",
+"Contacts imported successfully" => "Kontakty úspešne importované",
+"Close Dialog" => "Zatvoriť ponuku",
+"Import Addressbook" => "Importovanie adresára",
+"Select address book to import to:" => "Vyberte adresár, do ktorého chcete importovať:",
+"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.",
+"Select from HD" => "Vyberte z pevného disku",
+"You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.",
+"Add contact" => "Pridať kontakt",
+"Configure addressbooks" => "Nastaviť adresáre",
+"CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV",
+"more info" => "viac informácií",
+"Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/sl.php b/apps/contacts/l10n/sl.php
index 9709698fb45a8f7abddaf16f14b610a719ee64a3..ceb26967e557addc454cff26e50112fc5736f05f 100644
--- a/apps/contacts/l10n/sl.php
+++ b/apps/contacts/l10n/sl.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Med dodajanjem stika je prišlo do napake",
 "Cannot add empty property." => "Ne morem dodati prazne lastnosti.",
 "At least one of the address fields has to be filled out." => "Vsaj eno izmed polj je še potrebno izpolniti.",
+"Trying to add duplicate property: " => "Poskušam dodati podvojeno lastnost:",
 "Error adding contact property." => "Napaka pri dodajanju informacije o stiku.",
+"No ID provided" => "ID ni bil podan",
+"Error setting checksum." => "Napaka pri nastavljanju nadzorne vsote.",
+"No categories selected for deletion." => "Nobena kategorija ni bila izbrana za izbris.",
+"No address books found." => "Ni bilo najdenih imenikov.",
+"No contacts found." => "Ni bilo najdenih stikov.",
+"Missing ID" => "Manjkajoč ID",
+"Error parsing VCard for ID: \"" => "Napaka pri razčlenjevanju VCard za ID: \"",
+"Cannot add addressbook with an empty name." => "Ne morem dodati imenika s praznim imenom.",
 "Error adding addressbook." => "Napaka pri dodajanju imenika.",
 "Error activating addressbook." => "Napaka pri aktiviranju imenika.",
+"No contact ID was submitted." => "ID stika ni bil poslan.",
+"Error loading image." => "Napaka pri nalaganju slike.",
+"Error reading contact photo." => "Napaka pri branju slike stika.",
+"Error saving temporary file." => "Napaka pri shranjevanju začasne datoteke.",
+"The loading photo is not valid." => "Slika, ki se nalaga ni veljavna.",
+"id is not set." => "id ni nastavljen.",
 "Information about vCard is incorrect. Please reload the page." => "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran.",
 "Error deleting contact property." => "Napaka pri brisanju lastnosti stika.",
+"Contact ID is missing." => "Manjka ID stika.",
+"Missing contact id." => "Manjka id stika.",
+"No photo path was submitted." => "Pot slike ni bila poslana.",
+"File doesn't exist:" => "Datoteka ne obstaja:",
+"element name is not set." => "ime elementa ni nastavljeno.",
+"checksum is not set." => "nadzorna vsota ni nastavljena.",
+"Information about vCard is incorrect. Please reload the page: " => "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: ",
+"Something went FUBAR. " => "Nekaj je šlo v franže. ",
 "Error updating contact property." => "Napaka pri posodabljanju lastnosti stika.",
+"Cannot update addressbook with an empty name." => "Ne morem posodobiti imenika s praznim imenom.",
 "Error updating addressbook." => "Napaka pri posodabljanju imenika.",
+"Error uploading contacts to storage." => "Napaka pri nalaganju stikov v hrambo.",
+"There is no error, the file uploaded with success" => "Datoteka je bila uspešno naložena.",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu",
+"The uploaded file was only partially uploaded" => "Datoteka je bila le delno naložena",
+"No file was uploaded" => "Nobena datoteka ni bila naložena",
+"Missing a temporary folder" => "Manjka začasna mapa",
 "Contacts" => "Stiki",
+"Addressbook not found." => "Imenik ni bil najden.",
 "This is not your addressbook." => "To ni vaš imenik.",
 "Contact could not be found." => "Stika ni bilo mogoče najti.",
 "Address" => "Naslov",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobilni telefon",
 "Text" => "Besedilo",
 "Voice" => "Glas",
+"Message" => "Sporočilo",
 "Fax" => "Faks",
 "Video" => "Video",
 "Pager" => "Pozivnik",
+"Internet" => "Internet",
+"{name}'s Birthday" => "{name} - rojstni dan",
 "Contact" => "Stik",
 "Add Contact" => "Dodaj stik",
 "Addressbooks" => "Imeniki",
+"Configure Address Books" => "Nastavi imenike",
 "New Address Book" => "Nov imenik",
+"Import from VCF" => "Uvozi iz VCF",
 "CardDav Link" => "CardDav povezava",
 "Download" => "Prenesi",
 "Edit" => "Uredi",
 "Delete" => "Izbriši",
 "Download contact" => "Prenesi stik",
 "Delete contact" => "Izbriši stik",
+"Drop photo to upload" => "Spustite sliko tukaj, da bi jo naložili",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico",
+"Edit name details" => "Uredite podrobnosti imena",
+"Nickname" => "Vzdevek",
+"Enter nickname" => "Vnesite vzdevek",
 "Birthday" => "Rojstni dan",
+"dd-mm-yyyy" => "dd. mm. yyyy",
+"Groups" => "Skupine",
+"Separate groups with commas" => "Skupine ločite z vejicami",
+"Edit groups" => "Uredi skupine",
 "Preferred" => "Prednosten",
+"Please specify a valid email address." => "Prosimo, če navedete veljaven e-poštni naslov.",
+"Enter email address" => "Vnesite e-poštni naslov",
+"Mail to address" => "E-pošta naslovnika",
+"Delete email address" => "Izbriši e-poštni naslov",
+"Enter phone number" => "Vpiši telefonsko številko",
+"Delete phone number" => "Izbriši telefonsko številko",
+"View on map" => "Prikaz na zemljevidu",
+"Edit address details" => "Uredi podrobnosti",
+"Add notes here." => "Opombe dodajte tukaj.",
+"Add field" => "Dodaj polje",
+"Profile picture" => "Slika profila",
 "Phone" => "Telefon",
+"Note" => "Opomba",
+"Delete current photo" => "Izbriši trenutno sliko",
+"Edit current photo" => "Uredi trenutno sliko",
+"Upload new photo" => "Naloži novo sliko",
+"Select photo from ownCloud" => "Izberi sliko iz ownCloud",
+"Edit address" => "Uredi naslov",
 "Type" => "Vrsta",
 "PO Box" => "Poštni predal",
 "Extended" => "Razširjeno",
@@ -46,13 +109,52 @@
 "Region" => "Regija",
 "Zipcode" => "Poštna št.",
 "Country" => "Dežela",
+"Edit categories" => "Uredi kategorije",
 "Add" => "Dodaj",
 "Addressbook" => "Imenik",
+"Hon. prefixes" => "Predpone",
+"Miss" => "gdč.",
+"Ms" => "ga.",
+"Mr" => "g.",
+"Sir" => "g.",
+"Mrs" => "ga.",
+"Dr" => "dr.",
+"Given name" => "Ime",
+"Additional names" => "Dodatna imena",
+"Family name" => "Priimek",
+"Hon. suffixes" => "Pripone",
+"J.D." => "univ. dipl. prav.",
+"M.D." => "dr. med.",
+"D.O." => "dr. med., spec. spl. med.",
+"D.C." => "dr. med., spec. kiropraktike",
+"Ph.D." => "dr.",
+"Esq." => "Esq.",
+"Jr." => "mlajši",
+"Sn." => "starejši",
 "New Addressbook" => "Nov imenik",
 "Edit Addressbook" => "Uredi imenik",
 "Displayname" => "Ime za prikaz",
 "Active" => "Aktiven",
 "Save" => "Shrani",
 "Submit" => "Potrdi",
-"Cancel" => "Prekliči"
+"Cancel" => "Prekliči",
+"Import a contacts file" => "Uvozi datoteko s stiki",
+"Please choose the addressbook" => "Prosimo, če izberete imenik",
+"create a new addressbook" => "Ustvari nov imenik",
+"Name of new addressbook" => "Ime novega imenika",
+"Import" => "Uvozi",
+"Importing contacts" => "Uvažam stike",
+"Contacts imported successfully" => "Stiki so bili uspešno uvoženi",
+"Close Dialog" => "Zapri dialog",
+"Import Addressbook" => "Uvozi imenik",
+"Select address book to import to:" => "Izberite imenik v katerega boste uvažali:",
+"Drop a VCF file to import contacts." => "Za uvoz stikov spustite VCF datoteko tukaj.",
+"Select from HD" => "Izberi iz HD",
+"You have no contacts in your addressbook." => "V vašem imeniku ni stikov.",
+"Add contact" => "Dodaj stik",
+"Configure addressbooks" => "Nastavi imenike",
+"CardDAV syncing addresses" => "CardDAV naslovi za sinhronizacijo",
+"more info" => "več informacij",
+"Primary address (Kontact et al)" => "Primarni naslov (za kontakt et al)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/th_TH.php b/apps/contacts/l10n/th_TH.php
index 47cfa3f6cdb9985ce9d5843da8dd757b547386ff..cb1beb10443f7fcd0af1639cbb9aa6ac8890916e 100644
--- a/apps/contacts/l10n/th_TH.php
+++ b/apps/contacts/l10n/th_TH.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "เกิดข้อผิดพลาดในการเพิ่มรายชื่อผู้ติดต่อใหม่",
 "Cannot add empty property." => "ไม่สามารถเพิ่มรายละเอียดที่ไม่มีข้อมูลได้",
 "At least one of the address fields has to be filled out." => "อย่างน้อยที่สุดช่องข้อมูลที่อยู่จะต้องถูกกรอกลงไป",
+"Trying to add duplicate property: " => "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: ",
 "Error adding contact property." => "เกิดข้อผิดพลาดในการเพิ่มรายละเอียดการติดต่อ",
+"No ID provided" => "ยังไม่ได้ใส่รหัส",
+"Error setting checksum." => "เกิดข้อผิดพลาดในการตั้งค่า checksum",
+"No categories selected for deletion." => "ยังไม่ได้เลือกหมวดหมู่ที่ต้องการลบ",
+"No address books found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ",
+"No contacts found." => "ไม่พบข้อมูลการติดต่อที่ต้องการ",
+"Missing ID" => "รหัสสูญหาย",
+"Error parsing VCard for ID: \"" => "พบข้อผิดพลาดในการแยกรหัส VCard:\"",
+"Cannot add addressbook with an empty name." => "ไม่สามารถเพิ่มสมุดบันทึกที่อยู่โดยไม่มีชื่อได้",
 "Error adding addressbook." => "เกิดข้อผิดพลาดในการเพิ่มสมุดบันทึกที่อยู่ใหม่",
 "Error activating addressbook." => "เกิดข้อผิดพลาดในการเปิดใช้งานสมุดบันทึกที่อยู่",
+"No contact ID was submitted." => "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา",
+"Error loading image." => "เกิดข้อผิดพลาดในการโหลดรูปภาพ",
+"Error reading contact photo." => "เกิดข้อผิดพลาดในการอ่านรูปภาพของข้อมูลการติดต่อ",
+"Error saving temporary file." => "เกิดข้อผิดพลาดในการบันทึกไฟล์ชั่วคราว",
+"The loading photo is not valid." => "โหลดรูปภาพไม่ถูกต้อง",
+"id is not set." => "ยังไม่ได้กำหนดรหัส",
 "Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง",
 "Error deleting contact property." => "เกิดข้อผิดพลาดในการลบรายละเอียดการติดต่อ",
+"Contact ID is missing." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย",
+"Missing contact id." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย",
+"No photo path was submitted." => "ไม่พบตำแหน่งพาธของรูปภาพ",
+"File doesn't exist:" => "ไม่มีไฟล์ดังกล่าว",
+"element name is not set." => "ยังไม่ได้กำหนดชื่อ",
+"checksum is not set." => "ยังไม่ได้กำหนดค่า checksum",
+"Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ",
+"Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ",
 "Error updating contact property." => "เกิดข้อผิดพลาดในการอัพเดทข้อมูลการติดต่อ",
+"Cannot update addressbook with an empty name." => "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้",
 "Error updating addressbook." => "เกิดข้อผิดพลาดในการอัพเดทสมุดบันทึกที่อยู่",
+"Error uploading contacts to storage." => "เกิดข้อผิดพลาดในการอัพโหลดข้อมูลการติดต่อไปยังพื้นที่จัดเก็บข้อมูล",
+"There is no error, the file uploaded with success" => "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง upload_max_filesize ที่อยู่ในไฟล์ php.ini",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง MAX_FILE_SIZE ที่ถูกระบุไว้ในรูปแบบของ HTML",
+"The uploaded file was only partially uploaded" => "ไฟล์ถูกอัพโหลดได้เพียงบางส่วนเท่านั้น",
+"No file was uploaded" => "ไม่มีไฟล์ที่ถูกอัพโหลด",
+"Missing a temporary folder" => "โฟลเดอร์ชั่วคราวเกิดการสูญหาย",
 "Contacts" => "ข้อมูลการติดต่อ",
+"Addressbook not found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ",
 "This is not your addressbook." => "นี่ไม่ใช่สมุดบันทึกที่อยู่ของคุณ",
 "Contact could not be found." => "ไม่พบข้อมูลการติดต่อ",
 "Address" => "ที่อยู่",
@@ -22,22 +54,53 @@
 "Mobile" => "มือถือ",
 "Text" => "ข้อความ",
 "Voice" => "เสียงพูด",
+"Message" => "ข้อความ",
 "Fax" => "โทรสาร",
 "Video" => "วีดีโอ",
 "Pager" => "เพจเจอร์",
+"Internet" => "อินเทอร์เน็ต",
+"{name}'s Birthday" => "วันเกิดของ {name}",
 "Contact" => "ข้อมูลการติดต่อ",
 "Add Contact" => "เพิ่มรายชื่อผู้ติดต่อใหม่",
 "Addressbooks" => "สมุดบันทึกที่อยู่",
+"Configure Address Books" => "กำหนดค่าสมุดบันทึกที่อยู่",
 "New Address Book" => "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่",
+"Import from VCF" => "นำเข้าจาก VCF",
 "CardDav Link" => "ลิงค์ CardDav",
 "Download" => "ดาวน์โหลด",
 "Edit" => "แก้ไข",
 "Delete" => "ลบ",
 "Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ",
 "Delete contact" => "ลบข้อมูลการติดต่อ",
+"Drop photo to upload" => "วางรูปภาพที่ต้องการอัพโหลด",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง",
+"Edit name details" => "แก้ไขรายละเอียดของชื่อ",
+"Nickname" => "ชื่อเล่น",
+"Enter nickname" => "กรอกชื่อเล่น",
 "Birthday" => "วันเกิด",
+"dd-mm-yyyy" => "dd-mm-yyyy",
+"Groups" => "กลุ่ม",
+"Separate groups with commas" => "คั่นระหว่างรายชื่อกลุ่มด้วยเครื่องหมายจุลภาีคหรือคอมม่า",
+"Edit groups" => "แก้ไขกลุ่ม",
 "Preferred" => "พิเศษ",
+"Please specify a valid email address." => "กรุณาระบุที่อยู่อีเมลที่ถูกต้อง",
+"Enter email address" => "กรอกที่อยู่อีเมล",
+"Mail to address" => "ส่งอีเมลไปที่",
+"Delete email address" => "ลบที่อยู่อีเมล",
+"Enter phone number" => "กรอกหมายเลขโทรศัพท์",
+"Delete phone number" => "ลบหมายเลขโทรศัพท์",
+"View on map" => "ดูบนแผนที่",
+"Edit address details" => "แก้ไขรายละเอียดที่อยู่",
+"Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่",
+"Add field" => "เพิ่มช่องรับข้อมูล",
+"Profile picture" => "รูปภาพโปรไฟล์",
 "Phone" => "โทรศัพท์",
+"Note" => "หมายเหตุ",
+"Delete current photo" => "ลบรูปภาพปัจจุบัน",
+"Edit current photo" => "แก้ไขรูปภาพปัจจุบัน",
+"Upload new photo" => "อัพโหลดรูปภาพใหม่",
+"Select photo from ownCloud" => "เลือกรูปภาพจาก ownCloud",
+"Edit address" => "แก้ไขที่อยู่",
 "Type" => "ประเภท",
 "PO Box" => "ตู้ ปณ.",
 "Extended" => "เพิ่ม",
@@ -46,13 +109,52 @@
 "Region" => "ภูมิภาค",
 "Zipcode" => "รหัสไปรษณีย์",
 "Country" => "ประเทศ",
+"Edit categories" => "แก้ไขหมวดหมู่",
 "Add" => "เพิ่ม",
 "Addressbook" => "สมุดบันทึกที่อยู่",
+"Hon. prefixes" => "คำนำหน้าชื่อคนรัก",
+"Miss" => "นางสาว",
+"Ms" => "น.ส.",
+"Mr" => "นาย",
+"Sir" => "คุณ",
+"Mrs" => "นาง",
+"Dr" => "ดร.",
+"Given name" => "ชื่อที่ใช้",
+"Additional names" => "ชื่ออื่นๆ",
+"Family name" => "ชื่อครอบครัว",
+"Hon. suffixes" => "คำแนบท้ายชื่อคนรัก",
+"J.D." => "J.D.",
+"M.D." => "M.D.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "ปริญญาเอก",
+"Esq." => "Esq.",
+"Jr." => "จูเนียร์",
+"Sn." => "ซีเนียร์",
 "New Addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่",
 "Edit Addressbook" => "แก้ไขสมุดบันทึกที่อยู่",
 "Displayname" => "ชื่อที่ต้องการให้แสดง",
 "Active" => "เปิดใช้",
 "Save" => "บันทึก",
 "Submit" => "ส่งข้อมูล",
-"Cancel" => "ยกเลิก"
+"Cancel" => "ยกเลิก",
+"Import a contacts file" => "นำเข้าไฟล์ข้อมูลการติดต่อ",
+"Please choose the addressbook" => "กรุณาเลือกสมุดบันทึกที่อยู่",
+"create a new addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่",
+"Name of new addressbook" => "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่",
+"Import" => "นำเข้า",
+"Importing contacts" => "นำเข้าข้อมูลการติดต่อ",
+"Contacts imported successfully" => "ข้อมูลการติดต่อถูกนำเข้าข้อมูลเรียบร้อยแล้ว",
+"Close Dialog" => "ปิดกล่องข้อความ",
+"Import Addressbook" => "นำเข้าข้อมูลสมุดบันทึกที่อยู่",
+"Select address book to import to:" => "เลือกสมุดบันทึกที่อยู่ที่ต้องการนำเข้า:",
+"Drop a VCF file to import contacts." => "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ",
+"Select from HD" => "เลือกจากฮาร์ดดิส",
+"You have no contacts in your addressbook." => "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ",
+"Add contact" => "เพิ่มชื่อผู้ติดต่อ",
+"Configure addressbooks" => "กำหนดค่าสมุดบันทึกที่อยู่",
+"CardDAV syncing addresses" => "ที่อยู่ที่ใช้เชื่อมข้อมูลกับ CardDAV",
+"more info" => "ข้อมูลเพิ่มเติม",
+"Primary address (Kontact et al)" => "ที่อยู่หลัก (สำหรับติดต่อ)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/tr.php b/apps/contacts/l10n/tr.php
index 71d3c42ff682a4148199aa5eddbda80fe2185da4..298477c6817e1c83193470a58960bf5152e70ca1 100644
--- a/apps/contacts/l10n/tr.php
+++ b/apps/contacts/l10n/tr.php
@@ -3,14 +3,46 @@
 "There was an error adding the contact." => "Kişi eklenirken hata oluştu.",
 "Cannot add empty property." => "Boş özellik eklenemiyor.",
 "At least one of the address fields has to be filled out." => "En az bir adres alanı doldurulmalı.",
+"Trying to add duplicate property: " => "Yinelenen özellik eklenmeye çalışılıyor: ",
 "Error adding contact property." => "Kişi özelliği eklenirken hata oluştu.",
+"No ID provided" => "ID verilmedi",
+"Error setting checksum." => "İmza oluşturulurken hata.",
+"No categories selected for deletion." => "Silmek için bir kategori seçilmedi.",
+"No address books found." => "Adres defteri bulunamadı.",
+"No contacts found." => "Bağlantı bulunamadı.",
+"Missing ID" => "Eksik ID",
+"Error parsing VCard for ID: \"" => "ID için VCard ayrıştırılamadı:\"",
+"Cannot add addressbook with an empty name." => "Adres defterini isimsiz ekleyemezsiniz.",
 "Error adding addressbook." => "Adres defteri eklenirken hata oluştu.",
 "Error activating addressbook." => "Adres defteri etkinleştirilirken hata oluştu.",
+"No contact ID was submitted." => "Bağlantı ID'si girilmedi.",
+"Error loading image." => "İmaj yükleme hatası.",
+"Error reading contact photo." => "Bağlantı fotoğrafı okunamadı.",
+"Error saving temporary file." => "Geçici dosya kaydetme hatası.",
+"The loading photo is not valid." => "Yüklenecek fotograf geçerli değil.",
+"id is not set." => "id atanmamış.",
 "Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin.",
 "Error deleting contact property." => "Kişi özelliği silinirken hata oluştu.",
+"Contact ID is missing." => "Bağlantı ID'si eksik.",
+"Missing contact id." => "Eksik bağlantı id'si.",
+"No photo path was submitted." => "Fotoğraf girilmedi.",
+"File doesn't exist:" => "Dosya mevcut değil:",
+"element name is not set." => "eleman ismi atanmamış.",
+"checksum is not set." => "checksum atanmamış.",
+"Information about vCard is incorrect. Please reload the page: " => "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: ",
+"Something went FUBAR. " => "Bir şey FUBAR gitti.",
 "Error updating contact property." => "Kişi özelliği güncellenirken hata oluştu.",
+"Cannot update addressbook with an empty name." => "Adres defterini boş bir isimle güncelleyemezsiniz.",
 "Error updating addressbook." => "Adres defteri güncellenirken hata oluştu.",
+"Error uploading contacts to storage." => "Bağlantıları depoya yükleme hatası",
+"There is no error, the file uploaded with success" => "Dosya başarıyla yüklendi, hata oluşmadı",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Dosyanın boyutu php.ini dosyasındaki upload_max_filesize limitini aşıyor",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Yüklenecek dosyanın boyutu HTML formunda belirtilen MAX_FILE_SIZE limitini aşıyor",
+"The uploaded file was only partially uploaded" => "Dosya kısmen karşıya yüklenebildi",
+"No file was uploaded" => "Hiç dosya gönderilmedi",
+"Missing a temporary folder" => "Geçici dizin eksik",
 "Contacts" => "Kişiler",
+"Addressbook not found." => "Adres defteri bulunamadı.",
 "This is not your addressbook." => "Bu sizin adres defteriniz değil.",
 "Contact could not be found." => "Kişi bulunamadı.",
 "Address" => "Adres",
@@ -22,22 +54,53 @@
 "Mobile" => "Mobil",
 "Text" => "Metin",
 "Voice" => "Ses",
+"Message" => "mesaj",
 "Fax" => "Faks",
 "Video" => "Video",
 "Pager" => "Sayfalayıcı",
+"Internet" => "İnternet",
+"{name}'s Birthday" => "{name}'nin Doğumgünü",
 "Contact" => "Kişi",
 "Add Contact" => "Kişi Ekle",
 "Addressbooks" => "Adres defterleri",
+"Configure Address Books" => "Adres Defterlerini Yapılandır",
 "New Address Book" => "Yeni Adres Defteri",
+"Import from VCF" => "VCF'den içeri aktar",
 "CardDav Link" => "CardDav Bağlantısı",
 "Download" => "İndir",
 "Edit" => "Düzenle",
 "Delete" => "Sil",
 "Download contact" => "Kişiyi indir",
 "Delete contact" => "Kişiyi sil",
+"Drop photo to upload" => "Fotoğrafı yüklenmesi için bırakın",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters",
+"Edit name details" => "İsim detaylarını düzenle",
+"Nickname" => "Takma ad",
+"Enter nickname" => "Takma adı girin",
 "Birthday" => "Doğum günü",
+"dd-mm-yyyy" => "gg-aa-yyyy",
+"Groups" => "Gruplar",
+"Separate groups with commas" => "Grupları birbirinden virgülle ayırın",
+"Edit groups" => "Grupları düzenle",
 "Preferred" => "Tercih edilen",
+"Please specify a valid email address." => "Lütfen geçerli bir eposta adresi belirtin.",
+"Enter email address" => "Eposta adresini girin",
+"Mail to address" => "Eposta adresi",
+"Delete email address" => "Eposta adresini sil",
+"Enter phone number" => "Telefon numarasını gir",
+"Delete phone number" => "Telefon numarasını sil",
+"View on map" => "Haritada gör",
+"Edit address details" => "Adres detaylarını düzenle",
+"Add notes here." => "Notları buraya ekleyin.",
+"Add field" => "Alan ekle",
+"Profile picture" => "Profil resmi",
 "Phone" => "Telefon",
+"Note" => "Not",
+"Delete current photo" => "Mevcut fotoğrafı sil",
+"Edit current photo" => "Mevcut fotoğrafı düzenle",
+"Upload new photo" => "Yeni fotoğraf yükle",
+"Select photo from ownCloud" => "ownCloud'dan bir fotoğraf seç",
+"Edit address" => "Adresi düzenle",
 "Type" => "Tür",
 "PO Box" => "Posta Kutusu",
 "Extended" => "Uzatılmış",
@@ -46,13 +109,52 @@
 "Region" => "Bölge",
 "Zipcode" => "Posta kodu",
 "Country" => "Ülke",
+"Edit categories" => "Kategorileri düzenle",
 "Add" => "Ekle",
 "Addressbook" => "Adres defteri",
+"Hon. prefixes" => "Kısaltmalar",
+"Miss" => "Bayan",
+"Ms" => "Bayan",
+"Mr" => "Bay",
+"Sir" => "Bay",
+"Mrs" => "Bayan",
+"Dr" => "Dr",
+"Given name" => "Verilen isim",
+"Additional names" => "İlave isimler",
+"Family name" => "Soyad",
+"Hon. suffixes" => "Kısaltmalar",
+"J.D." => "J.D.",
+"M.D." => "Dr.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
+"Ph.D." => "Dr.",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
 "New Addressbook" => "Yeni Adres defteri",
 "Edit Addressbook" => "Adres Defterini Düzenle",
 "Displayname" => "Görünen adı",
 "Active" => "Aktif",
 "Save" => "Kaydet",
 "Submit" => "Gönder",
-"Cancel" => "İptal"
+"Cancel" => "İptal",
+"Import a contacts file" => "Bağlantı dosyasını içeri aktar",
+"Please choose the addressbook" => "Yeni adres defterini seç",
+"create a new addressbook" => "Yeni adres defteri oluştur",
+"Name of new addressbook" => "Yeni adres defteri için isim",
+"Import" => "İçe aktar",
+"Importing contacts" => "Bağlantıları içe aktar",
+"Contacts imported successfully" => "Bağlantılar başarıyla içe aktarıldı",
+"Close Dialog" => "Diyaloğu kapat",
+"Import Addressbook" => "Adres defterini içeri aktar",
+"Select address book to import to:" => "İçe aktarılacak adres defterini seçin:",
+"Drop a VCF file to import contacts." => "Bağlantıları içe aktarmak için bir VCF dosyası bırakın.",
+"Select from HD" => "HD'den seç",
+"You have no contacts in your addressbook." => "Adres defterinizde hiç bağlantı yok.",
+"Add contact" => "Bağlatı ekle",
+"Configure addressbooks" => "Adres defterini yapılandır",
+"CardDAV syncing addresses" => "CardDAV adresleri eşzamanlıyor",
+"more info" => "daha fazla bilgi",
+"Primary address (Kontact et al)" => "Birincil adres (Bağlantı ve arkadaşları)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/zh_CN.php b/apps/contacts/l10n/zh_CN.php
index 2f1c0aa1772c7fe413e3509ea707d744ef7ec7c6..d2cbf5570e7e206ad19607aa4242f15ade0af680 100644
--- a/apps/contacts/l10n/zh_CN.php
+++ b/apps/contacts/l10n/zh_CN.php
@@ -4,13 +4,28 @@
 "Cannot add empty property." => "无法添加空属性。",
 "At least one of the address fields has to be filled out." => "至少需要填写一项地址。",
 "Error adding contact property." => "添加联系人属性错误。",
+"Error setting checksum." => "设置校验值错误。",
+"No address books found." => "找不到地址簿。",
+"No contacts found." => "找不到联系人。",
+"Missing ID" => "缺少 ID",
 "Error adding addressbook." => "添加地址簿错误。",
 "Error activating addressbook." => "激活地址簿错误。",
+"Error loading image." => "加载图片错误。",
+"Error reading contact photo." => "读取联系人照片错误。",
+"Error saving temporary file." => "保存临时文件错误。",
+"id is not set." => "没有设置 id。",
 "Information about vCard is incorrect. Please reload the page." => "vCard 的信息不正确。请重新加载页面。",
 "Error deleting contact property." => "删除联系人属性错误。",
+"Contact ID is missing." => "缺少联系人 ID。",
+"Missing contact id." => "缺少联系人 ID。",
+"File doesn't exist:" => "文件不存在:",
+"checksum is not set." => "未设置校验值。",
 "Error updating contact property." => "更新联系人属性错误。",
 "Error updating addressbook." => "更新地址簿错误",
+"The uploaded file was only partially uploaded" => "已上传文件只上传了部分",
+"No file was uploaded" => "没有文件被上传",
 "Contacts" => "联系人",
+"Addressbook not found." => "未找到地址簿。",
 "This is not your addressbook." => "这不是您的地址簿。",
 "Contact could not be found." => "无法找到联系人。",
 "Address" => "地址",
@@ -25,19 +40,42 @@
 "Fax" => "传真",
 "Video" => "视频",
 "Pager" => "传呼机",
+"Internet" => "互联网",
+"{name}'s Birthday" => "{name} 的生日",
 "Contact" => "联系人",
 "Add Contact" => "添加联系人",
 "Addressbooks" => "地址簿",
+"Configure Address Books" => "配置地址簿",
 "New Address Book" => "新建地址簿",
+"Import from VCF" => "从 VCF 导入",
 "CardDav Link" => "CardDav 链接",
 "Download" => "下载",
 "Edit" => "编辑",
 "Delete" => "删除",
 "Download contact" => "下载联系人",
 "Delete contact" => "删除联系人",
+"Nickname" => "昵称",
+"Enter nickname" => "输入昵称",
 "Birthday" => "生日",
+"dd-mm-yyyy" => "yyyy-mm-dd",
+"Groups" => "分组",
+"Separate groups with commas" => "用逗号隔开分组",
+"Edit groups" => "编辑分组",
 "Preferred" => "偏好",
+"Please specify a valid email address." => "请指定合法的电子邮件地址",
+"Enter email address" => "输入电子邮件地址",
+"Mail to address" => "发送邮件到地址",
+"Delete email address" => "删除电子邮件地址",
+"Enter phone number" => "输入电话号码",
+"Delete phone number" => "删除电话号码",
+"View on map" => "在地图上显示",
+"Edit address details" => "编辑地址细节。",
 "Phone" => "电话",
+"Delete current photo" => "删除当前照片",
+"Edit current photo" => "编辑当前照片",
+"Upload new photo" => "上传新照片",
+"Select photo from ownCloud" => "从 ownCloud 选择照片",
+"Edit address" => "编辑地址",
 "Type" => "类型",
 "PO Box" => "邮箱",
 "Extended" => "扩展",
@@ -46,13 +84,27 @@
 "Region" => "地区",
 "Zipcode" => "邮编",
 "Country" => "国家",
+"Edit categories" => "编辑分类",
 "Add" => "添加",
 "Addressbook" => "地址簿",
+"Given name" => "名",
+"Family name" => "姓",
 "New Addressbook" => "新建地址簿",
 "Edit Addressbook" => "编辑地址簿",
 "Displayname" => "显示名称",
 "Active" => "激活",
 "Save" => "保存",
 "Submit" => "提交",
-"Cancel" => "取消"
+"Cancel" => "取消",
+"Import a contacts file" => "导入联系人文件",
+"Please choose the addressbook" => "请选择地址簿",
+"create a new addressbook" => "创建新地址簿",
+"Name of new addressbook" => "新地址簿名称",
+"Import" => "导入",
+"Importing contacts" => "导入联系人",
+"Contacts imported successfully" => "联系人导入成功",
+"Close Dialog" => "关闭对话框",
+"more info" => "更多信息",
+"Primary address (Kontact et al)" => "首选地址 (Kontact 等)",
+"iOS/OS X" => "iOS/OS X"
 );
diff --git a/apps/contacts/l10n/zh_TW.php b/apps/contacts/l10n/zh_TW.php
index 645072a70f648fe650c1676793cb630d3aadb999..da2d0b46f532f691ff75e8b3076444e40115465e 100644
--- a/apps/contacts/l10n/zh_TW.php
+++ b/apps/contacts/l10n/zh_TW.php
@@ -4,6 +4,7 @@
 "Cannot add empty property." => "不可添加空白內容",
 "At least one of the address fields has to be filled out." => "至少必須填寫一欄地址",
 "Error adding contact property." => "添加通訊錄內容中發生錯誤",
+"No ID provided" => "未提供 ID",
 "Error adding addressbook." => "添加電話簿中發生錯誤",
 "Error activating addressbook." => "啟用電話簿中發生錯誤",
 "Information about vCard is incorrect. Please reload the page." => "有關 vCard 的資訊不正確,請重新載入此頁。",
@@ -22,9 +23,11 @@
 "Mobile" => "行動電話",
 "Text" => "文字",
 "Voice" => "語音",
+"Message" => "訊息",
 "Fax" => "傳真",
 "Video" => "影片",
 "Pager" => "呼叫器",
+"Internet" => "網際網路",
 "Contact" => "通訊錄",
 "Add Contact" => "添加通訊錄",
 "Addressbooks" => "電話簿",
@@ -35,8 +38,13 @@
 "Delete" => "刪除",
 "Download contact" => "下載通訊錄",
 "Delete contact" => "刪除通訊錄",
+"Nickname" => "綽號",
+"Enter nickname" => "輸入綽號",
 "Birthday" => "生日",
+"Groups" => "群組",
+"Edit groups" => "編輯群組",
 "Preferred" => "首選",
+"Enter email address" => "輸入電子郵件地址",
 "Phone" => "電話",
 "Type" => "類型",
 "PO Box" => "通訊地址",
diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php
old mode 100755
new mode 100644
index 78e94762f2e90dd8b54e849683c8b9494b25b30d..79445ceeee1dabcc6f59d77002181e3d70ee8041
--- a/apps/contacts/lib/addressbook.php
+++ b/apps/contacts/lib/addressbook.php
@@ -84,7 +84,7 @@ class OC_Contacts_Addressbook{
 	 * @param string $description
 	 * @return insertid
 	 */
-	public static function add($userid,$name,$description){
+	public static function add($userid,$name,$description=''){
 		$all = self::all($userid);
 		$uris = array();
 		foreach($all as $i){
diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php
old mode 100755
new mode 100644
index 330d5b21b7986c07f053aec5af5e06bc054d5970..29428763d60b538796dff255a16bb10704755ec8
--- a/apps/contacts/lib/app.php
+++ b/apps/contacts/lib/app.php
@@ -12,8 +12,15 @@
 OC_Contacts_App::$l10n = OC_L10N::get('contacts');
 OC_Contacts_App::$categories = new OC_VCategories('contacts');
 class OC_Contacts_App {
+	/*
+	 * @brief language object for calendar app
+	 */
+
 	public static $l10n;
-	public static $categories;
+	/*
+	 * @brief categories of the user
+	 */
+	public static $categories = null;
 
 	public static function getAddressbook($id) {
 		$addressbook = OC_Contacts_Addressbook::find( $id );
@@ -130,6 +137,21 @@ class OC_Contacts_App {
 		}
 	}
 
+	/*
+	 * @brief returns the vcategories object of the user
+	 * @return (object) $vcategories
+	 */
+	protected static function getVCategories() {
+		if (is_null(self::$categories)) {
+			self::$categories = new OC_VCategories('contacts');
+		}
+		return self::$categories;
+	}
+	
+	/*
+	 * @brief returns the categories for the user
+	 * @return (Array) $categories
+	 */
 	public static function getCategories() {
 		$categories = self::$categories->categories();
 		if(count($categories) == 0) {
@@ -169,7 +191,7 @@ class OC_Contacts_App {
 	 * @see OC_VCategories::loadFromVObject
 	 */
 	public static function loadCategoriesFromVCard(OC_VObject $contact) {
-		self::$categories->loadFromVObject($contact, true);
+		self::getVCategories()->loadFromVObject($contact, true);
 	}
 
 	public static function setLastModifiedHeader($contact) {
diff --git a/apps/contacts/lib/hooks.php b/apps/contacts/lib/hooks.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/settings.php b/apps/contacts/settings.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.chooseaddressbook.php b/apps/contacts/templates/part.chooseaddressbook.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.chooseaddressbook.rowfields.php b/apps/contacts/templates/part.chooseaddressbook.rowfields.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.contactphoto.php b/apps/contacts/templates/part.contactphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.contacts.php b/apps/contacts/templates/part.contacts.php
index 225a1ef0cf35f86a375b032d6ec5d61041d14fc0..00a61f72fdd9ce578db6146e9db3e8d58cc4b794 100644
--- a/apps/contacts/templates/part.contacts.php
+++ b/apps/contacts/templates/part.contacts.php
@@ -8,5 +8,5 @@
 		}
 	}
 ?>
-	<li role="button" book-id="<?php echo $contact['addressbookid']; ?>" data-id="<?php echo $contact['id']; ?>"><?php echo $display; ?></li>
+	<li role="button" book-id="<?php echo $contact['addressbookid']; ?>" data-id="<?php echo $contact['id']; ?>"><a href="index.php?id=<?php echo $contact['id']; ?>"><?php echo $display; ?></a></li>
 <?php endforeach; ?>
diff --git a/apps/contacts/templates/part.cropphoto.php b/apps/contacts/templates/part.cropphoto.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.edit_address_dialog.php b/apps/contacts/templates/part.edit_address_dialog.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.edit_name_dialog.php b/apps/contacts/templates/part.edit_name_dialog.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/templates/part.import.php b/apps/contacts/templates/part.import.php
old mode 100755
new mode 100644
index 2dac7dd0ca14fdd171c50a48f86fc80801996227..b8793042997ce94c646d34c96cb74397360c4185
--- a/apps/contacts/templates/part.import.php
+++ b/apps/contacts/templates/part.import.php
@@ -1,27 +1,27 @@
 <div id="contacts_import_dialog" title="<?php echo $l->t("Import a contacts file"); ?>">
-<div id="form_container">
-<input type="hidden" id="filename" value="<?php echo $_['filename'];?>">
-<input type="hidden" id="path" value="<?php echo $_['path'];?>">
-<input type="hidden" id="progressfile" value="<?php echo md5(session_id()) . '.txt';?>">
-<p style="text-align:center;"><b><?php echo $l->t('Please choose the addressbook'); ?></b>
-<select style="width:100%;" id="contacts" name="contacts">
-<?php
-$contacts_options = OC_Contacts_Addressbook::all(OCP\USER::getUser());
-$contacts_options[] = array('id'=>'newaddressbook', 'displayname'=>$l->t('create a new addressbook'));
-echo OCP\html_select_options($contacts_options, $contacts_options[0]['id'], array('value'=>'id', 'label'=>'displayname'));
-?>
-</select>
-<div id="newaddressbookform" style="display: none;">
-	<input type="text" style="width: 97%;" placeholder="<?php echo $l->t('Name of new addressbook'); ?>" id="newaddressbook" name="newaddressbook">
-</div>
-<input type="button" value="<?php echo $l->t("Import");?>!" id="startimport">
-</div>
+	<div id="form_container">
+		<input type="hidden" id="filename" value="<?php echo $_['filename'];?>">
+		<input type="hidden" id="path" value="<?php echo $_['path'];?>">
+		<input type="hidden" id="progressfile" value="<?php echo md5(session_id()) . '.txt';?>">
+		<p class="bold" style="text-align:center;"><?php echo $l->t('Please choose the addressbook'); ?></p>
+		<select style="width:100%;" id="contacts" name="contacts">
+		<?php
+		$contacts_options = OC_Contacts_Addressbook::all(OCP\USER::getUser());
+		$contacts_options[] = array('id'=>'newaddressbook', 'displayname'=>$l->t('create a new addressbook'));
+		echo OCP\html_select_options($contacts_options, $contacts_options[0]['id'], array('value'=>'id', 'label'=>'displayname'));
+		?>
+		</select>
+		<div id="newaddressbookform" style="display: none;">
+			<input type="text" style="width: 97%;" placeholder="<?php echo $l->t('Name of new addressbook'); ?>" id="newaddressbook" name="newaddressbook">
+		</div>
+		<input type="button" value="<?php echo $l->t("Import");?>!" id="startimport">
+	</div>
 <div id="progressbar_container" style="display: none">
-<p style="text-align:center;"><b><?php echo $l->t('Importing contacts'); ?></b>
-<div id="progressbar"></div>
-<div id="import_done" style="display: none;">
-<p style="text-align:center;"><b><?php echo $l->t('Contacts imported successfully'); ?></b></p>
-<input type="button" value="<?php echo $l->t('Close Dialog'); ?>" id="import_done_button">
-</div>
-</div>
+	<p style="text-align:center;"><?php echo $l->t('Importing contacts'); ?></p>
+	<div id="progressbar"></div>
+		<div id="import_done" style="display: none;">
+			<p style="text-align:center;"></p>
+			<input type="button" value="<?php echo $l->t('Close'); ?>" id="import_done_button">
+		</div>
+	</div>
 </div>
\ No newline at end of file
diff --git a/apps/contacts/templates/part.importaddressbook.php b/apps/contacts/templates/part.importaddressbook.php
old mode 100755
new mode 100644
index a055dd6035603ecacc04dc2e25bc201e667ce9fa..6702262f231625e39e4ff61bebbf9cea917e4f8e
--- a/apps/contacts/templates/part.importaddressbook.php
+++ b/apps/contacts/templates/part.importaddressbook.php
@@ -6,28 +6,34 @@
  * See the COPYING-README file.
  */
 ?>
-<td id="importaddressbook_dialog" title="<?php echo $l->t("Import Addressbook"); ?>" colspan="6">
+<td id="importaddressbook_dialog" colspan="6">
+<?php 
+if(OCP\App::isEnabled('files_encryption')) { 
+	echo '<strong>'.$l->t('Currently this import function doesn\'t work while encryption is enabled.<br />Please upload your VCF file with the file manager and click on it to import.').'</strong>';
+} else { ?>
 <table>
 <tr>
 	<th><?php echo $l->t('Select address book to import to:') ?></th>
 	<td>
-		<select id="book" name="book" class="float">
-		<?php
-		$contacts_options = OC_Contacts_Addressbook::all(OCP\USER::getUser());
-		echo OCP\html_select_options($contacts_options, $contacts_options[0]['id'], array('value'=>'id', 'label'=>'displayname'));
-		?>
-		</select>
-		<span id="import_drop_target" class="droptarget float"><?php echo $l->t("Drop a VCF file to import contacts."); ?> (Max. <?php echo  $_['uploadMaxHumanFilesize']; ?>)</span>
-		<a class="svg upload float" title="<?php echo $l->t('Select from HD'); ?>"></a>
+		<form id="import_upload_form" action="<?php echo OCP\Util::linkTo('contacts', 'ajax/uploadimport.php'); ?>" method="post" enctype="multipart/form-data" target="import_upload_target">
+			<select id="book" name="book" class="float">
+			<?php
+			$contacts_options = OC_Contacts_Addressbook::all(OCP\USER::getUser());
+			echo OCP\html_select_options($contacts_options, $contacts_options[0]['id'], array('value'=>'id', 'label'=>'displayname'));
+			?>
+			</select>
+			<span id="import_drop_target" class="droptarget float"><?php echo $l->t("Drop a VCF file to import contacts."); ?> (Max. <?php echo  $_['uploadMaxHumanFilesize']; ?>)</span>
+			<a class="svg upload float" title="<?php echo $l->t('Select from HD'); ?>">
+			<input class="float" id="import_upload_start" type="file" accept="text/*" name="importfile" /></a>
+			<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
+		</form>
 	</td>
 </tr>
 </table>
-<form id="import_upload_form" action="<?php echo OCP\Util::linkTo('contacts', 'ajax/uploadimport.php'); ?>" method="post" enctype="multipart/form-data" target="import_upload_target">
-<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
-<input id="import_upload_start" type="file" accept="text/*" name="importfile" />
+
 <input id="close_button" style="float: left;" type="button" onclick="Contacts.UI.Addressbooks.cancel(this);" value="<?php echo $l->t("Cancel"); ?>">
 <iframe name="import_upload_target" id='import_upload_target' src=""></iframe>
-</form>
+<?php } ?>
 </td>
 <script type="text/javascript">
 Contacts.UI.Addressbooks.loadImportHandlers();
diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php
old mode 100755
new mode 100644
diff --git a/apps/external/ajax/setsites.php b/apps/external/ajax/setsites.php
old mode 100755
new mode 100644
diff --git a/apps/external/appinfo/app.php b/apps/external/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/external/index.php b/apps/external/index.php
old mode 100755
new mode 100644
diff --git a/apps/external/lib/external.php b/apps/external/lib/external.php
old mode 100755
new mode 100644
diff --git a/apps/external/settings.php b/apps/external/settings.php
old mode 100755
new mode 100644
diff --git a/apps/external/templates/settings.php b/apps/external/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/files/admin.php b/apps/files/admin.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/autocomplete.php b/apps/files/ajax/autocomplete.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/download.php b/apps/files/ajax/download.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/move.php b/apps/files/ajax/move.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php
old mode 100755
new mode 100644
diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
old mode 100755
new mode 100644
diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index 76a06a0cb4bd8179cdc8921b6d4e43317e2bc2d8..92d0a50814eb040d355ea3ea41a619e6fed2abdc 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -8,6 +8,9 @@
 	<require>2</require>
 	<standalone/>
 	<default_enable/>
+	<types>
+		<filesystem/>
+	</types>
 	<remote>
 		<files>appinfo/remote.php</files>
 		<webdav>appinfo/remote.php</webdav>
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index 465e0c0a93556d7ff6035a5d0ba2324951dc533e..b66843556bb694e267ae69eed2c0be54a298895b 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -24,6 +24,7 @@
  */
 // only need filesystem apps
 $RUNTIME_APPTYPES=array('filesystem','authentication');
+OC_App::loadApps($RUNTIME_APPTYPES);
 
 // Backends
 $authBackend = new OC_Connector_Sabre_Auth();
diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
new file mode 100644
index 0000000000000000000000000000000000000000..f9953ba4de5e4efbc6d57532d25d37ea2ab6bdba
--- /dev/null
+++ b/apps/files/appinfo/update.php
@@ -0,0 +1,34 @@
+<?php
+
+//update from OC 3
+
+//try to remove remaining files.
+//Give a warning if not possible
+
+$filesToRemove = array(
+	'ajax',
+	'appinfo',
+	'css',
+	'js',
+	'l10n',
+	'templates',
+	'admin.php',
+	'download.php',
+	'index.php',
+	'settings.php'
+);
+
+foreach($filesToRemove as $file) {
+	$filepath = OC::$SERVERROOT . '/files/' . $file;
+	if(!file_exists($filepath)) {
+		continue;
+	}
+    $success = OCP\Files::rmdirr($filepath);
+    if($success === false) {
+		//probably not sufficient privileges, give up and give a message.
+		OCP\Util::writeLog('files','Could not clean /files/ directory. Please remove everything except webdav.php from ' . OC::$SERVERROOT . '/files/', OCP\Util::ERROR);
+		break;
+    }
+}
+
+
diff --git a/apps/files/appinfo/version b/apps/files/appinfo/version
index b123147e2a162f34cf377f8b63d99b0e6f8887c2..8cfbc905b39f65131ba18e561d236557fbdc52cc 100644
--- a/apps/files/appinfo/version
+++ b/apps/files/appinfo/version
@@ -1 +1 @@
-1.1
\ No newline at end of file
+1.1.1
\ No newline at end of file
diff --git a/apps/files/download.php b/apps/files/download.php
old mode 100755
new mode 100644
diff --git a/apps/files/index.php b/apps/files/index.php
old mode 100755
new mode 100644
index 7ead3ce8f862812a8f0e1dfa2b275933225e1b5d..a2fae12d945e82f04720aaaf5b870ed3d2a5c4f2
--- a/apps/files/index.php
+++ b/apps/files/index.php
@@ -92,7 +92,7 @@ $tmpl = new OCP\Template( 'files', 'index', 'user' );
 $tmpl->assign( 'fileList', $list->fetchPage() );
 $tmpl->assign( 'breadcrumb', $breadcrumbNav->fetchPage() );
 $tmpl->assign( 'dir', $dir);
-$tmpl->assign( 'readonly', !OC_Filesystem::is_writable($dir));
+$tmpl->assign( 'readonly', !OC_Filesystem::is_writable($dir.'/'));
 $tmpl->assign( 'files', $files );
 $tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize);
 $tmpl->assign( 'uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize));
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 918fcb62ee2702f320accbd70cf5cf0153a6061d..35d80b3cff22ac81d1145fe3ff12d648d0fcfd07 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -40,7 +40,7 @@ $(document).ready(function() {
 	$('#file_action_panel').attr('activeAction', false);
 
 	//drag/drop of files
-	$('#fileList tr td.filename').draggable(dragOptions);
+	$('#fileList tr[data-write="true"] td.filename').draggable(dragOptions);
 	$('#fileList tr[data-type="dir"][data-write="true"] td.filename').droppable(folderDropOptions);
 	$('div.crumb:not(.last)').droppable(crumbDropOptions);
 	$('ul#apps>li:first-child').data('dir','');
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index ab4115cf1592f4f982e6016f10570e02d82827be..9cbc6060210d5fae5bed02bc107a6ae5831a138b 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "El fitxer només s'ha pujat parcialment",
 "No file was uploaded" => "El fitxer no s'ha pujat",
 "Missing a temporary folder" => "S'ha perdut un fitxer temporal",
+"Failed to write to disk" => "Ha fallat en escriure al disc",
 "Files" => "Fitxers",
+"File handling" => "Gestió de fitxers",
 "Maximum upload size" => "Mida màxima de pujada",
+"max. possible: " => "màxim possible:",
+"Needed for multi-file and folder downloads." => "Necessari per fitxers múltiples i baixada de carpetes",
+"Enable ZIP-download" => "Activa la baixada ZIP",
+"0 is unlimited" => "0 és sense límit",
+"Maximum input size for ZIP files" => "Mida màxima d'entrada per fitxers ZIP",
 "New" => "Nou",
 "Text file" => "Fitxer de text",
 "Folder" => "Carpeta",
+"From url" => "Des de la url",
 "Upload" => "Puja",
+"Cancel upload" => "Cancel·la la pujada",
 "Nothing in here. Upload something!" => "Res per aquí. Pugeu alguna cosa!",
 "Name" => "Nom",
+"Share" => "Comparteix",
 "Download" => "Baixa",
 "Size" => "Mida",
 "Modified" => "Modificat",
+"Delete all" => "Esborra-ho tot",
 "Delete" => "Suprimeix",
 "Upload too large" => "La pujada és massa gran",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor"
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
+"Files are being scanned, please wait." => "S'estan escanejant els fitxers, espereu",
+"Current scanning" => "Actualment escanejant"
 );
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index fff9bcb56952280f1dc8df18c8a483d3e5e7fe2b..033fbfca1145dc00a6c316d1837988d750909d2b 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Soubor byl odeslán pouze částečně",
 "No file was uploaded" => "Soubor nebyl odeslán",
 "Missing a temporary folder" => "Chybí adresář pro sočasné soubory",
+"Failed to write to disk" => "Zápis na disk se nezdařil",
 "Files" => "Soubory",
+"File handling" => "Nastavení chování k souborům",
 "Maximum upload size" => "Maximální velikost ukládaných souborů",
+"max. possible: " => "největší možná:",
+"Needed for multi-file and folder downloads." => "Potřeba pro vícesoborvé stahování a stahování adresářů",
+"Enable ZIP-download" => "Povolit ZIP-stahování",
+"0 is unlimited" => "0 znamená bez omezení",
+"Maximum input size for ZIP files" => "Maximální velikost vstupu pro ZIP soubory",
 "New" => "Nový",
 "Text file" => "Textový soubor",
 "Folder" => "Adresář",
+"From url" => "Z url",
 "Upload" => "Uložit",
+"Cancel upload" => "Zrušit upload",
 "Nothing in here. Upload something!" => "Žádný obsah. Uložte si něco!",
 "Name" => "Název",
+"Share" => "Sdílet",
 "Download" => "Stáhnout",
 "Size" => "Velikost",
 "Modified" => "Změněno",
+"Delete all" => "Smazat vše",
 "Delete" => "Vymazat",
 "Upload too large" => "Příliš velký soubor",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte uložit, překračují maximální velikosti uploadu na tomto serveru."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte uložit, překračují maximální velikosti uploadu na tomto serveru.",
+"Files are being scanned, please wait." => "Soubory se prohledávají, prosím čekejte.",
+"Current scanning" => "Aktuální prohledávání"
 );
diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php
index 2b0d1af4fd57a945a8dfd7e96147eadcc11104bf..078cb8e902df96ca269f52c22c8d9c18c897854e 100644
--- a/apps/files/l10n/de.php
+++ b/apps/files/l10n/de.php
@@ -5,18 +5,30 @@
 "The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.",
 "No file was uploaded" => "Es wurde keine Datei hochgeladen.",
 "Missing a temporary folder" => "Temporärer Ordner fehlt.",
+"Failed to write to disk" => "Fehler beim Schreiben auf Festplatte",
 "Files" => "Dateien",
 "Maximum upload size" => "Maximale Größe",
+"max. possible: " => "maximal möglich:",
+"Needed for multi-file and folder downloads." => "Für Mehrfachdateien- und Ordnerupload benötigt:",
+"Enable ZIP-download" => "ZIP-Download aktivieren",
+"0 is unlimited" => "0 bedeutet unbegrenzt",
+"Maximum input size for ZIP files" => "Maximale Größe für ZIP Dateien",
 "New" => "Neu",
 "Text file" => "Text Datei",
 "Folder" => "Ordner",
+"From url" => "Von der URL",
 "Upload" => "Hochladen",
+"Cancel upload" => "Upload abbrechen",
 "Nothing in here. Upload something!" => "Alles leer. Lad’ was hoch!",
 "Name" => "Name",
+"Share" => "Teilen",
 "Download" => "Herunterladen",
 "Size" => "Größe",
 "Modified" => "Bearbeitet",
+"Delete all" => "Alle löschen",
 "Delete" => "Löschen",
 "Upload too large" => "Upload zu groß",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
+"Files are being scanned, please wait." => "Daten werden gescannt, bitte warten.",
+"Current scanning" => "Scannen"
 );
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index 2d75fd904d1155f160ff7a558349ac4d2a0e2a92..de16f97eed6b150021f371011a95ad1609cb3a8b 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Το αρχείο μεταφορώθηκε μόνο εν μέρει",
 "No file was uploaded" => "Το αρχείο δεν μεταφορτώθηκε",
 "Missing a temporary folder" => "Λείπει ένας προσωρινός φάκελος",
+"Failed to write to disk" => "Η εγγραφή στο δίσκο απέτυχε",
 "Files" => "Αρχεία",
+"File handling" => "Διαχείριση αρχείων",
 "Maximum upload size" => "Μέγιστο μέγεθος μεταφόρτωσης",
+"max. possible: " => "μέγιστο δυνατό:",
+"Needed for multi-file and folder downloads." => "Απαραίτητο για κατέβασμα πολλαπλών αρχείων και φακέλων",
+"Enable ZIP-download" => "Ενεργοποίηση κατεβάσματος ZIP",
+"0 is unlimited" => "0 για απεριόριστο",
+"Maximum input size for ZIP files" => "Μέγιστο μέγεθος για αρχεία ZIP",
 "New" => "Νέο",
 "Text file" => "Αρχείο κειμένου",
 "Folder" => "Φάκελος",
+"From url" => "Από την διεύθυνση",
 "Upload" => "Μεταφόρτωση",
+"Cancel upload" => "Ακύρωση ανεβάσματος",
 "Nothing in here. Upload something!" => "Δεν υπάρχει τίποτα εδώ. Ανέβασε κάτι!",
 "Name" => "Όνομα",
+"Share" => "Διαμοίρασε",
 "Download" => "Λήψη",
 "Size" => "Μέγεθος",
 "Modified" => "Τροποποιήθηκε",
+"Delete all" => "Διαγραφή όλων",
 "Delete" => "Διαγραφή",
 "Upload too large" => "Πολύ μεγάλο το αρχείο προς μεταφόρτωση",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν το διακομιστή."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν το διακομιστή.",
+"Files are being scanned, please wait." => "Τα αρχεία ανιχνεύονται, παρακαλώ περιμένετε",
+"Current scanning" => "Τρέχουσα αναζήτηση "
 );
diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php
index 15b3209734bae5b37202f780f953cf8f7b5df59d..b38bd9df0f199cf92bdd78e1481bfef93050c9fc 100644
--- a/apps/files/l10n/eo.php
+++ b/apps/files/l10n/eo.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "La alŝutita dosiero nur parte alŝutiĝis",
 "No file was uploaded" => "Neniu dosiero estas alŝutita",
 "Missing a temporary folder" => "Mankas tempa dosierujo",
+"Failed to write to disk" => "Malsukcesis skribo al disko",
 "Files" => "Dosieroj",
+"File handling" => "Dosieradministro",
 "Maximum upload size" => "Maksimuma alŝutogrando",
+"max. possible: " => "maks. ebla: ",
+"Needed for multi-file and folder downloads." => "Necesa por elŝuto de pluraj dosieroj kaj dosierujoj.",
+"Enable ZIP-download" => "Kapabligi ZIP-elŝuton",
+"0 is unlimited" => "0 signifas senlime",
+"Maximum input size for ZIP files" => "Maksimuma enirgrando por ZIP-dosieroj",
 "New" => "Nova",
 "Text file" => "Tekstodosiero",
 "Folder" => "Dosierujo",
+"From url" => "El URL",
 "Upload" => "Alŝuti",
+"Cancel upload" => "Nuligi alŝuton",
 "Nothing in here. Upload something!" => "Nenio estas ĉi tie. Alŝutu ion!",
 "Name" => "Nomo",
+"Share" => "Kunhavigi",
 "Download" => "Elŝuti",
 "Size" => "Grando",
 "Modified" => "Modifita",
+"Delete all" => "Forigi ĉion",
 "Delete" => "Forigi",
 "Upload too large" => "Elŝuto tro larĝa",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
+"Files are being scanned, please wait." => "Dosieroj estas skanataj, bonvolu atendi.",
+"Current scanning" => "Nuna skano"
 );
diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php
index fa94b44c2ac9979cc51d67319fa82ab39810a3da..e51a9f325b43b24125a2602a9a309e7b42249ee9 100644
--- a/apps/files/l10n/es.php
+++ b/apps/files/l10n/es.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "El archivo que intentas subir solo se subió parcialmente",
 "No file was uploaded" => "No se ha subido ningún archivo",
 "Missing a temporary folder" => "Falta un directorio temporal",
+"Failed to write to disk" => "La escritura en disco ha fallado",
 "Files" => "Archivos",
+"File handling" => "Tratamiento de archivos",
 "Maximum upload size" => "Tamaño máximo de subida",
+"max. possible: " => "máx. posible:",
+"Needed for multi-file and folder downloads." => "Se necesita para descargas multi-archivo y de carpetas",
+"Enable ZIP-download" => "Habilitar descarga en ZIP",
+"0 is unlimited" => "0 es ilimitado",
+"Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada",
 "New" => "Nuevo",
 "Text file" => "Archivo de texto",
 "Folder" => "Carpeta",
+"From url" => "Desde la URL",
 "Upload" => "Subir",
+"Cancel upload" => "Cancelar subida",
 "Nothing in here. Upload something!" => "Aquí no hay nada. ¡Sube algo!",
 "Name" => "Nombre",
+"Share" => "Compartir",
 "Download" => "Descargar",
 "Size" => "Tamaño",
 "Modified" => "Modificado",
+"Delete all" => "Eliminar todo",
 "Delete" => "Eliminado",
 "Upload too large" => "El archivo es demasiado grande",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor.",
+"Files are being scanned, please wait." => "Se están escaneando los archivos, por favor espere.",
+"Current scanning" => "Escaneo actual"
 );
diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php
index 05186cc6d9eb1b740c492c9c00d0e5e5fe0c050f..cdac89e66ed06dba0f2baca787c3862417aadab8 100644
--- a/apps/files/l10n/et_EE.php
+++ b/apps/files/l10n/et_EE.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt",
 "No file was uploaded" => "Ühtegi faili ei laetud üles",
 "Missing a temporary folder" => "Ajutiste failide kaust puudub",
+"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
 "Files" => "Failid",
+"File handling" => "Failide käsitlemine",
 "Maximum upload size" => "Maksimaalne üleslaadimise suurus",
+"max. possible: " => "maks. võimalik: ",
+"Needed for multi-file and folder downloads." => "Vajalik mitme faili ja kausta allalaadimiste jaoks.",
+"Enable ZIP-download" => "Luba ZIP-ina allalaadimine",
+"0 is unlimited" => "0 tähendab piiramatut",
+"Maximum input size for ZIP files" => "Maksimaalne ZIP-faili sisestatava faili suurus",
 "New" => "Uus",
 "Text file" => "Tekstifail",
 "Folder" => "Kaust",
+"From url" => "URL-ilt",
 "Upload" => "Lae üles",
+"Cancel upload" => "Tühista üleslaadimine",
 "Nothing in here. Upload something!" => "Siin pole midagi. Lae midagi üles!",
 "Name" => "Nimi",
+"Share" => "Jaga",
 "Download" => "Lae alla",
 "Size" => "Suurus",
 "Modified" => "Muudetud",
+"Delete all" => "Kustuta kõik",
 "Delete" => "Kustuta",
 "Upload too large" => "Üleslaadimine on liiga suur",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
+"Files are being scanned, please wait." => "Faile skannitakse, palun oota",
+"Current scanning" => "Praegune skannimine"
 );
diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php
index 348ed6fa6d2bbd31162ad5f7186183e1297b99c2..1f780b9d9061678c191160e1b27fe381d0c57cae 100644
--- a/apps/files/l10n/eu.php
+++ b/apps/files/l10n/eu.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat baino gehiago ez da igo",
 "No file was uploaded" => "Ez da fitxategirik igo",
 "Missing a temporary folder" => "Aldi baterako karpeta falta da",
+"Failed to write to disk" => "Errore bat izan da diskoan idazterakoan",
 "Files" => "Fitxategiak",
+"File handling" => "Fitxategien kudeaketa",
 "Maximum upload size" => "Igo daitekeen gehienezko tamaina",
+"max. possible: " => "max, posiblea:",
+"Needed for multi-file and folder downloads." => "Beharrezkoa fitxategi-anitz eta karpeten deskargarako.",
+"Enable ZIP-download" => "Gaitu ZIP-deskarga",
+"0 is unlimited" => "0 mugarik gabe esan nahi du",
+"Maximum input size for ZIP files" => "ZIP fitxategien gehienezko tamaina",
 "New" => "Berria",
 "Text file" => "Testu fitxategia",
 "Folder" => "Karpeta",
+"From url" => "URLtik",
 "Upload" => "Igo",
+"Cancel upload" => "Ezeztatu igoera",
 "Nothing in here. Upload something!" => "Ez dago ezer. Igo zerbait!",
 "Name" => "Izena",
+"Share" => "Elkarbanatu",
 "Download" => "Deskargatu",
 "Size" => "Tamaina",
 "Modified" => "Aldatuta",
+"Delete all" => "Ezabatu dena",
 "Delete" => "Ezabatu",
 "Upload too large" => "Igotakoa handiegia da",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
+"Files are being scanned, please wait." => "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
+"Current scanning" => "Orain eskaneatzen ari da"
 );
diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c5c32c0eb16ee3e4d331a42c60af69f26af57ec
--- /dev/null
+++ b/apps/files/l10n/fa.php
@@ -0,0 +1,35 @@
+<?php $TRANSLATIONS = array(
+"There is no error, the file uploaded with success" => "هیچ خطایی وجود ندارد فایل با موفقیت بار گذاری شد",
+"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حداکثر حجم تعیین شده برای بارگذاری در php.ini قابل ویرایش است",
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حداکثر حجم مجاز برای بارگذاری از طریق HTML \nMAX_FILE_SIZE",
+"The uploaded file was only partially uploaded" => "مقدار کمی از فایل بارگذاری شده",
+"No file was uploaded" => "هیچ فایلی بارگذاری نشده",
+"Missing a temporary folder" => "یک پوشه موقت گم شده است",
+"Failed to write to disk" => "نوشتن بر روی دیسک سخت ناموفق بود",
+"Files" => "فایل ها",
+"File handling" => "اداره پرونده ها",
+"Maximum upload size" => "حداکثر اندازه بارگزاری",
+"max. possible: " => "حداکثرمقدارممکن:",
+"Needed for multi-file and folder downloads." => "احتیاج پیدا خواهد شد برای چند پوشه و پرونده",
+"Enable ZIP-download" => "فعال سازی بارگیری پرونده های فشرده",
+"0 is unlimited" => "0 نامحدود است",
+"Maximum input size for ZIP files" => "حداکثرمقدار برای بار گزاری پرونده های فشرده",
+"New" => "جدید",
+"Text file" => "فایل متنی",
+"Folder" => "پوشه",
+"From url" => "از نشانی",
+"Upload" => "بارگذاری",
+"Cancel upload" => "متوقف کردن بار گذاری",
+"Nothing in here. Upload something!" => "اینجا هیچ چیز نیست.",
+"Name" => "نام",
+"Share" => "به اشتراک گذاری",
+"Download" => "بارگیری",
+"Size" => "اندازه",
+"Modified" => "تغییر یافته",
+"Delete all" => "پاک کردن همه",
+"Delete" => "پاک کردن",
+"Upload too large" => "حجم بارگذاری بسیار زیاد است",
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
+"Files are being scanned, please wait." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید",
+"Current scanning" => "بازرسی کنونی"
+);
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index 8d2a35bd9eb5b008e1336b595f6b36d341aa42f8..6b16e8ac138b4d4478fbc09511bc230c3e419ff2 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Le fichier n'a été que partiellement téléversé",
 "No file was uploaded" => "Aucun fichier n'a été téléversé",
 "Missing a temporary folder" => "Il manque un répertoire temporaire",
+"Failed to write to disk" => "Erreur d'écriture sur le disque",
 "Files" => "Fichiers",
+"File handling" => "Gestion des fichiers",
 "Maximum upload size" => "Taille max. d'envoi",
+"max. possible: " => "Max. possible :",
+"Needed for multi-file and folder downloads." => "Nécessaire pour le téléchargement de plusieurs fichiers et de dossiers.",
+"Enable ZIP-download" => "Activer le téléchargement ZIP",
+"0 is unlimited" => "0 est illimité",
+"Maximum input size for ZIP files" => "Taille maximale pour les fichiers ZIP",
 "New" => "Nouveau",
 "Text file" => "Fichier texte",
 "Folder" => "Dossier",
+"From url" => "Depuis URL",
 "Upload" => "Envoyer",
+"Cancel upload" => "Annuler envoi",
 "Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)",
 "Name" => "Nom",
+"Share" => "Partager",
 "Download" => "Téléchargement",
 "Size" => "Taille",
 "Modified" => "Modifié",
+"Delete all" => "Supprimer tout",
 "Delete" => "Supprimer",
 "Upload too large" => "Fichier trop volumineux",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.",
+"Files are being scanned, please wait." => "Les fichiers sont analysés, patientez svp.",
+"Current scanning" => "Analyse en cours"
 );
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index a176ffce6478a20758c9a5a55cbb6f87e6bdd413..6d9e67794b2ffea73d71949cabf52189d87d2a48 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -5,15 +5,31 @@
 "The uploaded file was only partially uploaded" => "Az eredeti fájl csak részlegesen van feltöltve.",
 "No file was uploaded" => "Nem lett fájl feltöltve.",
 "Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár",
+"Failed to write to disk" => "Nem írható lemezre",
 "Files" => "Fájlok",
+"File handling" => "Fájlkezelés",
 "Maximum upload size" => "Maximális feltölthető fájlméret",
+"max. possible: " => "max. lehetséges",
+"Needed for multi-file and folder downloads." => "Kötegelt file- vagy mappaletöltéshez szükséges",
+"Enable ZIP-download" => "ZIP-letöltés engedélyezése",
+"0 is unlimited" => "0 = korlátlan",
+"Maximum input size for ZIP files" => "ZIP file-ok maximum mérete",
+"New" => "Új",
+"Text file" => "Szövegfájl",
+"Folder" => "Mappa",
+"From url" => "URL-ből",
 "Upload" => "Feltöltés",
+"Cancel upload" => "Feltöltés megszakítása",
 "Nothing in here. Upload something!" => "Töltsön fel egy fájlt.",
 "Name" => "Név",
+"Share" => "Megosztás",
 "Download" => "Letöltés",
 "Size" => "Méret",
 "Modified" => "Módosítva",
+"Delete all" => "Mindent töröl",
 "Delete" => "Törlés",
 "Upload too large" => "Feltöltés túl nagy",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren.",
+"Files are being scanned, please wait." => "File-ok vizsgálata, kis türelmet",
+"Current scanning" => "Aktuális vizsgálat"
 );
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index cec574ad5592f1064160e2a0f1ce0277fe5ba899..53642636ed3f40a53d300ee5a734283f1737d93f 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Il file è stato parzialmente caricato",
 "No file was uploaded" => "Nessun file è stato caricato",
 "Missing a temporary folder" => "Cartella temporanea mancante",
+"Failed to write to disk" => "Scrittura su disco non riuscita",
 "Files" => "File",
+"File handling" => "Gestione file",
 "Maximum upload size" => "Dimensione massima upload",
+"max. possible: " => "numero mass.: ",
+"Needed for multi-file and folder downloads." => "Necessario per lo scaricamento di file multipli e cartelle.",
+"Enable ZIP-download" => "Abilita scaricamento ZIP",
+"0 is unlimited" => "0 è illimitato",
+"Maximum input size for ZIP files" => "Dimensione massima per i file ZIP",
 "New" => "Nuovo",
 "Text file" => "File di testo",
 "Folder" => "Cartella",
+"From url" => "Da URL",
 "Upload" => "Carica",
+"Cancel upload" => "Annulla invio",
 "Nothing in here. Upload something!" => "Non c'è niente qui. Carica qualcosa!",
 "Name" => "Nome",
+"Share" => "Condividi",
 "Download" => "Scarica",
 "Size" => "Dimensione",
 "Modified" => "Modificato",
+"Delete all" => "Elimina tutto",
 "Delete" => "Elimina",
 "Upload too large" => "Il file caricato è troppo grande",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
+"Files are being scanned, please wait." => "Scansione dei file in corso, attendi",
+"Current scanning" => "Scansione corrente"
 );
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index 1e2867b4f22a5f8ee49170110842bf39aacebeae..d519df714e9676dd427a43c645bef0dee28d21fd 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "파일이 부분적으로 업로드됨",
 "No file was uploaded" => "업로드된 파일 없음",
 "Missing a temporary folder" => "임시 폴더가 사라짐",
+"Failed to write to disk" => "디스크에 쓰지 못했습니다",
 "Files" => "파일",
+"File handling" => "파일 처리",
 "Maximum upload size" => "최대 업로드 크기",
+"max. possible: " => "최대. 가능한:",
+"Needed for multi-file and folder downloads." => "멀티 파일 및 폴더 다운로드에 필요.",
+"Enable ZIP-download" => "ZIP- 다운로드 허용",
+"0 is unlimited" => "0은 무제한 입니다",
+"Maximum input size for ZIP files" => "ZIP 파일에 대한 최대 입력 크기",
 "New" => "새로 만들기",
 "Text file" => "텍스트 파일",
 "Folder" => "폴더",
+"From url" => "URL 에서",
 "Upload" => "업로드",
+"Cancel upload" => "업로드 취소",
 "Nothing in here. Upload something!" => "내용이 없습니다. 업로드할 수 있습니다!",
 "Name" => "이름",
+"Share" => "공유",
 "Download" => "다운로드",
 "Size" => "크기",
 "Modified" => "수정됨",
+"Delete all" => "모두 삭제",
 "Delete" => "삭제",
 "Upload too large" => "업로드 용량 초과",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
+"Files are being scanned, please wait." => "파일을 검색중입니다, 기다려 주십시오.",
+"Current scanning" => "커런트 스캐닝"
 );
diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php
index e4d39565b32ea502a4f7dc99883bc91fca5adaa8..f32d6a237e09e311559322c9db248ac15d93a071 100644
--- a/apps/files/l10n/mk.php
+++ b/apps/files/l10n/mk.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Датотеката беше само делумно подигната.",
 "No file was uploaded" => "Не беше подигната датотека",
 "Missing a temporary folder" => "Не постои привремена папка",
+"Failed to write to disk" => "Неуспеав да запишам на диск",
 "Files" => "Датотеки",
+"File handling" => "Ракување со датотеки",
 "Maximum upload size" => "Максимална големина за подигање",
+"max. possible: " => "макс. можно:",
+"Needed for multi-file and folder downloads." => "Потребно за симнување повеќе-датотеки и папки.",
+"Enable ZIP-download" => "Овозможи ZIP симнување ",
+"0 is unlimited" => "0 е неограничено",
+"Maximum input size for ZIP files" => "Максимална големина за внес на ZIP датотеки",
 "New" => "Ново",
 "Text file" => "Текстуална датотека",
 "Folder" => "Папка",
+"From url" => "Од адреса",
 "Upload" => "Подигни",
+"Cancel upload" => "Откажи прикачување",
 "Nothing in here. Upload something!" => "Тука нема ништо. Снимете нешто!",
 "Name" => "Име",
+"Share" => "Сподели",
 "Download" => "Преземи",
 "Size" => "Големина",
 "Modified" => "Променето",
+"Delete all" => "Избриши сѐ",
 "Delete" => "Избриши",
 "Upload too large" => "Датотеката е премногу голема",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
+"Files are being scanned, please wait." => "Се скенираат датотеки, ве молам почекајте.",
+"Current scanning" => "Моментално скенирам"
 );
diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php
index 801a5de37dbc1b9ebb70f7f9a4aaea0a1d5cee4e..70ed95019b125d222227983a6258840c1392781d 100644
--- a/apps/files/l10n/nb_NO.php
+++ b/apps/files/l10n/nb_NO.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Filopplastningen ble bare delvis gjennomført",
 "No file was uploaded" => "Ingen fil ble lastet opp",
 "Missing a temporary folder" => "Mangler en midlertidig mappe",
+"Failed to write to disk" => "Klarte ikke å skrive til disk",
 "Files" => "Filer",
+"File handling" => "Filhåndtering",
 "Maximum upload size" => "Maksimum opplastingsstørrelse",
+"max. possible: " => "max. mulige:",
+"Needed for multi-file and folder downloads." => "Nødvendig for å laste ned mapper og mer enn én fil om gangen.",
+"Enable ZIP-download" => "Aktiver nedlasting av ZIP",
+"0 is unlimited" => "0 er ubegrenset",
+"Maximum input size for ZIP files" => "Maksimal størrelse på ZIP-filer",
 "New" => "Ny",
 "Text file" => "Tekstfil",
 "Folder" => "Mappe",
+"From url" => "Fra url",
 "Upload" => "Last opp",
+"Cancel upload" => "Avbryt opplasting",
 "Nothing in here. Upload something!" => "Ingenting her. Last opp noe!",
 "Name" => "Navn",
+"Share" => "Del",
 "Download" => "Last ned",
 "Size" => "Størrelse",
 "Modified" => "Endret",
+"Delete all" => "Slett alle",
 "Delete" => "Slett",
 "Upload too large" => "Opplasting for stor",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren.",
+"Files are being scanned, please wait." => "Skanner etter filer, vennligst vent.",
+"Current scanning" => "Pågående skanning"
 );
diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php
index d04dec0987d609da57135147c09747e4157f46d7..e7f32b835b0841ab245b13533f1e8299b3a81a55 100644
--- a/apps/files/l10n/nl.php
+++ b/apps/files/l10n/nl.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Het bestand is slechts gedeeltelijk geupload",
 "No file was uploaded" => "Geen bestand geüpload",
 "Missing a temporary folder" => "Een tijdelijke map mist",
+"Failed to write to disk" => "Schrijven naar schijf mislukt",
 "Files" => "Bestanden",
+"File handling" => "Bestand",
 "Maximum upload size" => "Maximale bestandsgrootte voor uploads",
+"max. possible: " => "max. mogelijk: ",
+"Needed for multi-file and folder downloads." => "Nodig voor meerdere bestanden en mappen downloads.",
+"Enable ZIP-download" => "Zet ZIP-download aan",
+"0 is unlimited" => "0 is ongelimiteerd",
+"Maximum input size for ZIP files" => "Maximale grootte voor ZIP bestanden",
 "New" => "Nieuw",
 "Text file" => "Tekstbestand",
 "Folder" => "Map",
+"From url" => "Van hyperlink",
 "Upload" => "Upload",
+"Cancel upload" => "Upload afbreken",
 "Nothing in here. Upload something!" => "Er bevindt zich hier niets. Upload een bestand!",
 "Name" => "Naam",
+"Share" => "Delen",
 "Download" => "Download",
 "Size" => "Bestandsgrootte",
 "Modified" => "Laatst aangepast",
+"Delete all" => "Alles verwijderen",
 "Delete" => "Verwijder",
 "Upload too large" => "Bestanden te groot",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane  bestandsgrootte voor deze server."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane  bestandsgrootte voor deze server.",
+"Files are being scanned, please wait." => "Bestanden worden gescand, even wachten.",
+"Current scanning" => "Er wordt gescand"
 );
diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php
index cd8f36904690a3643671d861e1527cdb83b9e5f4..e4bb5e1f26bc67f06da1df473246b22900e5447d 100644
--- a/apps/files/l10n/pt_BR.php
+++ b/apps/files/l10n/pt_BR.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "O arquivo foi transferido parcialmente",
 "No file was uploaded" => "Nenhum arquivo foi transferido",
 "Missing a temporary folder" => "Pasta temporária não encontrada",
+"Failed to write to disk" => "Falha ao escrever no disco",
 "Files" => "Arquivos",
+"File handling" => "Tratamento de Arquivo",
 "Maximum upload size" => "Tamanho máximo para carregar",
+"max. possible: " => "max. possível:",
+"Needed for multi-file and folder downloads." => "Necessário para multiplos arquivos e diretório de downloads.",
+"Enable ZIP-download" => "Habilitar ZIP-download",
+"0 is unlimited" => "0 para ilimitado",
+"Maximum input size for ZIP files" => "Tamanho máximo para arquivo ZIP",
 "New" => "Novo",
 "Text file" => "Arquivo texto",
 "Folder" => "Pasta",
+"From url" => "URL de origem",
 "Upload" => "Carregar",
-"Nothing in here. Upload something!" => "Nada aqui.Carregar alguma coisa!",
+"Cancel upload" => "Cancelar upload",
+"Nothing in here. Upload something!" => "Nada aqui.Carrege alguma coisa!",
 "Name" => "Nome",
+"Share" => "Compartilhar",
 "Download" => "Baixar",
 "Size" => "Tamanho",
 "Modified" => "Modificado",
+"Delete all" => "Deletar Tudo",
 "Delete" => "Excluir",
 "Upload too large" => "Arquivo muito grande",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.",
+"Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.",
+"Current scanning" => "Scanning atual"
 );
diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php
index c87457609e458efae854415d78a9e1cf1c8dd5e7..a4e14e6bb8f72b6b0f409fbd4ae1ba61c0bf261b 100644
--- a/apps/files/l10n/sk_SK.php
+++ b/apps/files/l10n/sk_SK.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Nahrávaný súbor bol iba čiastočne nahraný",
 "No file was uploaded" => "Žiaden súbor nebol nahraný",
 "Missing a temporary folder" => "Chýbajúci dočasný priečinok",
+"Failed to write to disk" => "Zápis na disk sa nepodaril",
 "Files" => "Súbory",
+"File handling" => "Nastavenie správanie k súborom",
 "Maximum upload size" => "Maximálna veľkosť nahratia",
+"max. possible: " => "najväčšie možné:",
+"Needed for multi-file and folder downloads." => "Vyžadované pre sťahovanie viacerých súborov a adresárov.",
+"Enable ZIP-download" => "Povoliť sťahovanie ZIP súborov",
+"0 is unlimited" => "0 znamená neobmedzené",
+"Maximum input size for ZIP files" => "Najväčšia veľkosť ZIP súborov",
 "New" => "Nový",
 "Text file" => "Textový súbor",
 "Folder" => "Priečinok",
+"From url" => "Z url",
 "Upload" => "Nahrať",
+"Cancel upload" => "Zrušiť odosielanie",
 "Nothing in here. Upload something!" => "Nič tu nie je. Nahrajte niečo!",
 "Name" => "Meno",
+"Share" => "Zdielať",
 "Download" => "Stiahnuť",
 "Size" => "Veľkosť",
 "Modified" => "Upravené",
+"Delete all" => "Odstrániť všetko",
 "Delete" => "Odstrániť",
 "Upload too large" => "Nahrávanie príliš veľké",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory ktoré sa snažíte nahrať presahujú maximálnu veľkosť pre nahratie súborov na tento server."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory ktoré sa snažíte nahrať presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
+"Files are being scanned, please wait." => "Súbory sa práve prehľadávajú, prosím čakajte.",
+"Current scanning" => "Práve prehliadané"
 );
diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php
index 60743be6d8bb165e7f0636e1dae42411186c3761..8969a3f092874141cbbb11565caf2e28427bad2e 100644
--- a/apps/files/l10n/sl.php
+++ b/apps/files/l10n/sl.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Datoteka je bila le delno naložena",
 "No file was uploaded" => "Nobena datoteka ni bila naložena",
 "Missing a temporary folder" => "Manjka začasna mapa",
+"Failed to write to disk" => "Pisanje na disk je spodletelo",
 "Files" => "Datoteke",
+"File handling" => "Rokovanje z datotekami",
 "Maximum upload size" => "Največja velikost za nalaganje",
+"max. possible: " => "največ mogoče:",
+"Needed for multi-file and folder downloads." => "Potrebno za prenose večih datotek in map.",
+"Enable ZIP-download" => "Omogoči ZIP-prejemanje",
+"0 is unlimited" => "0 je neskončno",
+"Maximum input size for ZIP files" => "Največja vhodna velikost za ZIP datoteke",
 "New" => "Nova",
 "Text file" => "Besedilna datoteka",
 "Folder" => "Mapa",
+"From url" => "Iz url naslova",
 "Upload" => "Naloži",
+"Cancel upload" => "Prekliči nalaganje",
 "Nothing in here. Upload something!" => "Tukaj ni ničesar. Naložite kaj!",
 "Name" => "Ime",
+"Share" => "Souporaba",
 "Download" => "Prejmi",
 "Size" => "Velikost",
 "Modified" => "Spremenjeno",
+"Delete all" => "Izbriši vse",
 "Delete" => "Izbriši",
 "Upload too large" => "Nalaganje ni mogoče, ker je preveliko",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku.",
+"Files are being scanned, please wait." => "Preiskujem datoteke, prosimo počakajte.",
+"Current scanning" => "Trenutno preiskujem"
 );
diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php
index e02d3a4bb4053abbf5fcda312ba3fd0cb9b09bd6..9b446125a3e43a70e05fce515020bc612e21edb7 100644
--- a/apps/files/l10n/th_TH.php
+++ b/apps/files/l10n/th_TH.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "ไฟล์ที่อัพโหลดยังไม่ได้ถูกอัพโหลดอย่างสมบูรณ์",
 "No file was uploaded" => "ยังไม่มีไฟล์ที่ถูกอัพโหลด",
 "Missing a temporary folder" => "แฟ้มเอกสารชั่วคราวเกิดการสูญหาย",
+"Failed to write to disk" => "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว",
 "Files" => "ไฟล์",
+"File handling" => "การจัดกาไฟล์",
 "Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้",
+"max. possible: " => "จำนวนสูงสุดที่สามารถทำได้: ",
+"Needed for multi-file and folder downloads." => "จำเป็นต้องใช้สำหรับการดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์หรือดาวน์โหลดทั้งโฟลเดอร์",
+"Enable ZIP-download" => "อนุญาตให้ดาวน์โหลดเป็นไฟล์ ZIP ได้",
+"0 is unlimited" => "0 หมายถึงไม่จำกัด",
+"Maximum input size for ZIP files" => "ขนาดไฟล์ ZIP สูงสุด",
 "New" => "อัพโหลดไฟล์ใหม่",
 "Text file" => "ไฟล์ข้อความ",
 "Folder" => "แฟ้มเอกสาร",
+"From url" => "จาก url",
 "Upload" => "อัพโหลด",
+"Cancel upload" => "ยกเลิกการอัพโหลด",
 "Nothing in here. Upload something!" => "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!",
 "Name" => "ชื่อ",
+"Share" => "แชร์",
 "Download" => "ดาวน์โหลด",
 "Size" => "ขนาด",
 "Modified" => "ปรับปรุงล่าสุด",
+"Delete all" => "ลบทั้งหมด",
 "Delete" => "ลบ",
 "Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้"
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
+"Files are being scanned, please wait." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
+"Current scanning" => "ไฟล์ที่กำลังสแกนอยู่ขณะนี้"
 );
diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php
index d02a739a695e832115246f19a84e98a80b95c8ee..d8d32e226c3df01c09283a9fb9974ba7dfe4dcea 100644
--- a/apps/files/l10n/tr.php
+++ b/apps/files/l10n/tr.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "Yüklenen dosyanın sadece bir kısmı yüklendi",
 "No file was uploaded" => "Hiç dosya yüklenmedi",
 "Missing a temporary folder" => "Geçici bir klasör eksik",
+"Failed to write to disk" => "Diske yazılamadı",
 "Files" => "Dosyalar",
+"File handling" => "Dosya taşıma",
 "Maximum upload size" => "Maksimum yükleme boyutu",
+"max. possible: " => "mümkün olan en fazla: ",
+"Needed for multi-file and folder downloads." => "Çoklu dosya ve dizin indirmesi için gerekli.",
+"Enable ZIP-download" => "ZIP indirmeyi aktif et",
+"0 is unlimited" => "0 limitsiz demektir",
+"Maximum input size for ZIP files" => "ZIP dosyaları için en fazla girdi sayısı",
 "New" => "Yeni",
 "Text file" => "Metin dosyası",
 "Folder" => "Klasör",
+"From url" => "Url'den",
 "Upload" => "Yükle",
+"Cancel upload" => "Yüklemeyi iptal et",
 "Nothing in here. Upload something!" => "Burada hiçbir şey yok. Birşeyler yükleyin!",
 "Name" => "Ad",
+"Share" => "Paylaş",
 "Download" => "İndir",
 "Size" => "Boyut",
 "Modified" => "Değiştirilme",
+"Delete all" => "Hepsini sil",
 "Delete" => "Sil",
 "Upload too large" => "Yüklemeniz çok büyük",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor."
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor.",
+"Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.",
+"Current scanning" => "Güncel tarama"
 );
diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php
index 4bd249566aadc6743ef28ee67184b0f39643dd89..748c7897994f91a3cb3b21b412525e862963b1ec 100644
--- a/apps/files/l10n/zh_CN.php
+++ b/apps/files/l10n/zh_CN.php
@@ -5,18 +5,31 @@
 "The uploaded file was only partially uploaded" => "只上传了文件的一部分",
 "No file was uploaded" => "文件没有上传",
 "Missing a temporary folder" => "缺少临时目录",
+"Failed to write to disk" => "写入磁盘失败",
 "Files" => "文件",
+"File handling" => "文件处理",
 "Maximum upload size" => "最大上传大小",
+"max. possible: " => "最大可能: ",
+"Needed for multi-file and folder downloads." => "多文件和文件夹下载需要此项。",
+"Enable ZIP-download" => "启用 ZIP 下载",
+"0 is unlimited" => "0 为无限制",
+"Maximum input size for ZIP files" => "ZIP 文件的最大输入大小",
 "New" => "新建",
 "Text file" => "文本文件",
 "Folder" => "文件夹",
+"From url" => "来自地址",
 "Upload" => "上传",
+"Cancel upload" => "取消上传",
 "Nothing in here. Upload something!" => "这里还什么都没有。上传些东西吧!",
 "Name" => "名称",
+"Share" => "共享",
 "Download" => "下载",
 "Size" => "大小",
 "Modified" => "修改日期",
+"Delete all" => "删除所有",
 "Delete" => "删除",
 "Upload too large" => "上传文件过大",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大大小"
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大大小",
+"Files are being scanned, please wait." => "文件正在被扫描,请稍候。",
+"Current scanning" => "当前扫描"
 );
diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php
index 495b304d9bd83ce56d5827ab10be14a3ecf506b5..2ff343b0f31d1f747c359a609b7a4a0f912dfe10 100644
--- a/apps/files/l10n/zh_TW.php
+++ b/apps/files/l10n/zh_TW.php
@@ -5,17 +5,22 @@
 "The uploaded file was only partially uploaded" => "只有部分檔案被上傳",
 "No file was uploaded" => "無已上傳檔案",
 "Missing a temporary folder" => "遺失暫存資料夾",
+"Failed to write to disk" => "寫入硬碟失敗",
 "Files" => "檔案",
 "Maximum upload size" => "最大上傳容量",
 "New" => "新增",
 "Text file" => "文字檔",
 "Folder" => "資料夾",
+"From url" => "由 url ",
 "Upload" => "上傳",
+"Cancel upload" => "取消上傳",
 "Nothing in here. Upload something!" => "沒有任何東西。請上傳內容!",
 "Name" => "名稱",
+"Share" => "分享",
 "Download" => "下載",
 "Size" => "大小",
 "Modified" => "修改",
+"Delete all" => "全部刪除",
 "Delete" => "刪除",
 "Upload too large" => "上傳過大",
 "The files you are trying to upload exceed the maximum size for file uploads on this server." => "你試圖上傳的檔案已超過伺服器的最大容量限制。 "
diff --git a/apps/files/settings.php b/apps/files/settings.php
old mode 100755
new mode 100644
diff --git a/apps/files/templates/admin.php b/apps/files/templates/admin.php
old mode 100755
new mode 100644
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
old mode 100755
new mode 100644
index 8b3ae632036b4e2a310fc4db96ee3c92518458f6..c0a40081fe3ed562d28c4769497c587b92c89251
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -15,7 +15,7 @@
 				<form data-upload-id='1' class="file_upload_form" action="<?php echo OCP\Util::linkTo('files', 'ajax/upload.php'); ?>" method="post" enctype="multipart/form-data" target="file_upload_target_1">
 					<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload">
 					<input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)">
-					<input type="hidden" name="dir" value="<?php echo htmlentities($_['dir']) ?>" id="dir">
+					<input type="hidden" name="dir" value="<?php echo htmlentities($_['dir'],ENT_COMPAT,'utf-8') ?>" id="dir">
 					<button class="file_upload_filename">&nbsp;<img class='svg action' alt="Upload" src="<?php echo OCP\image_path("core", "actions/upload-white.svg"); ?>" /></button>
 					<input class="file_upload_start" type="file" name='files[]'/>
 						<a href="#" class="file_upload_button_wrapper" onclick="return false;" title="<?php echo $l->t('Upload'); echo  ' max. '.$_['uploadMaxHumanFilesize'] ?>"></a>
@@ -46,7 +46,7 @@
 				<?php if(!isset($_['readonly']) || !$_['readonly']) { ?><input type="checkbox" id="select_all" /><?php } ?>
 				<span class='name'><?php echo $l->t( 'Name' ); ?></span>
 				<span class='selectedActions'>
-					<a href="" class="share"><img class='svg' alt="Share" src="<?php echo OCP\image_path("core", "actions/share.svg"); ?>" /> <?php echo $l->t('Share')?></a>
+<!-- 					<a href="" class="share"><img class='svg' alt="Share" src="<?php echo OCP\image_path("core", "actions/share.svg"); ?>" /> <?php echo $l->t('Share')?></a> -->
 					<?php if($_['allowZipDownload']) : ?>
 						<a href="" class="download"><img class='svg' alt="Download" src="<?php echo OCP\image_path("core", "actions/download.svg"); ?>" /> <?php echo $l->t('Download')?></a>
 					<?php endif; ?>
diff --git a/apps/files/templates/part.breadcrumb.php b/apps/files/templates/part.breadcrumb.php
old mode 100755
new mode 100644
index 41d2c5c8e765a6d62348235d88d4614a90e5e108..43fe2d1fa95cedd52368a9d231f2e4c1ca3c5ee4
--- a/apps/files/templates/part.breadcrumb.php
+++ b/apps/files/templates/part.breadcrumb.php
@@ -1,6 +1,6 @@
 	<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
         $crumb = $_["breadcrumb"][$i]; ?>
 		<div class="crumb <?php if($i == count($_["breadcrumb"])-1) echo 'last';?> svg" data-dir='<?php echo $crumb["dir"];?>' style='background-image:url("<?php echo OCP\image_path('core','breadcrumb.png');?>")'>
-    		<a href="<?php echo $_['baseURL'].$crumb["dir"]; ?>"><?php echo htmlentities($crumb["name"]); ?></a>
+    		<a href="<?php echo $_['baseURL'].$crumb["dir"]; ?>"><?php echo htmlentities($crumb["name"],ENT_COMPAT,'utf-8'); ?></a>
 		</div>
-	<?php endfor;?>
\ No newline at end of file
+	<?php endfor;?>
diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php
old mode 100755
new mode 100644
diff --git a/apps/files_archive/appinfo/app.php b/apps/files_archive/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files_archive/appinfo/version b/apps/files_archive/appinfo/version
index ceab6e11ece0bcec917c12e11d350946f085d549..2f4536184bcac31936bd15a5f9cf931dd526c022 100644
--- a/apps/files_archive/appinfo/version
+++ b/apps/files_archive/appinfo/version
@@ -1 +1 @@
-0.1
\ No newline at end of file
+0.2
\ No newline at end of file
diff --git a/apps/files_archive/lib/storage.php b/apps/files_archive/lib/storage.php
old mode 100755
new mode 100644
diff --git a/apps/files_archive/tests/storage.php b/apps/files_archive/tests/storage.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/appinfo/version b/apps/files_encryption/appinfo/version
index ceab6e11ece0bcec917c12e11d350946f085d549..2f4536184bcac31936bd15a5f9cf931dd526c022 100644
--- a/apps/files_encryption/appinfo/version
+++ b/apps/files_encryption/appinfo/version
@@ -1 +1 @@
-0.1
\ No newline at end of file
+0.2
\ No newline at end of file
diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/lib/cryptstream.php b/apps/files_encryption/lib/cryptstream.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/settings.php b/apps/files_encryption/settings.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/tests/encryption.php b/apps/files_encryption/tests/encryption.php
old mode 100755
new mode 100644
diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php
old mode 100755
new mode 100644
diff --git a/apps/files_external/appinfo/version b/apps/files_external/appinfo/version
index ceab6e11ece0bcec917c12e11d350946f085d549..2f4536184bcac31936bd15a5f9cf931dd526c022 100644
--- a/apps/files_external/appinfo/version
+++ b/apps/files_external/appinfo/version
@@ -1 +1 @@
-0.1
\ No newline at end of file
+0.2
\ No newline at end of file
diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/ftp.php
old mode 100755
new mode 100644
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
old mode 100755
new mode 100644
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php
old mode 100755
new mode 100644
diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php
old mode 100755
new mode 100644
diff --git a/apps/files_external/tests/ftp.php b/apps/files_external/tests/ftp.php
old mode 100755
new mode 100644
diff --git a/apps/files_imageviewer/appinfo/app.php b/apps/files_imageviewer/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files_pdfviewer/appinfo/app.php b/apps/files_pdfviewer/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files_pdfviewer/js/pdfjs/README b/apps/files_pdfviewer/js/pdfjs/README
new file mode 100644
index 0000000000000000000000000000000000000000..ec6a1e1ab1ab2d2684c461d704b4b9cdf4455ba9
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/README
@@ -0,0 +1,7 @@
+Upstream (http://mozilla.github.com/pdf.js/) does not yet provide releases.
+The latest version of git master can be taken from http://mozilla.github.com/pdf.js/build/pdf.js
+
+Please update pdf.js from time to time and test it!
+
+
+
diff --git a/apps/files_pdfviewer/js/pdfjs/src/bidi.js b/apps/files_pdfviewer/js/pdfjs/src/bidi.js
deleted file mode 100644
index 5f18e53030df5347c7662b2a23ca951c60d8979a..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/bidi.js
+++ /dev/null
@@ -1,432 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var bidi = PDFJS.bidi = (function bidiClosure() {
-  // Character types for symbols from 0000 to 00FF.
-  var baseTypes = [
-    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
-    'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
-    'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
-    'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
-    'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
-    'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
-    'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
-    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
-    'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
-    'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
-    'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
-    'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
-    'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
-  ];
-
-  // Character types for symbols from 0600 to 06FF
-  var arabicTypes = [
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
-    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
-    'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
-    'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
-    'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
-    'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
-  ];
-
-  function isOdd(i) {
-    return (i & 1) != 0;
-  }
-
-  function isEven(i) {
-    return (i & 1) == 0;
-  }
-
-  function findUnequal(arr, start, value) {
-    var j;
-    for (var j = start, jj = arr.length; j < jj; ++j) {
-      if (arr[j] != value)
-        return j;
-    }
-    return j;
-  }
-
-  function setValues(arr, start, end, value) {
-    for (var j = start; j < end; ++j) {
-      arr[j] = value;
-    }
-  }
-
-  function reverseValues(arr, start, end) {
-    for (var i = start, j = end - 1; i < j; ++i, --j) {
-      var temp = arr[i];
-      arr[i] = arr[j];
-      arr[j] = temp;
-    }
-  }
-
-  function mirrorGlyphs(c) {
-    /*
-     # BidiMirroring-1.txt
-     0028; 0029 # LEFT PARENTHESIS
-     0029; 0028 # RIGHT PARENTHESIS
-     003C; 003E # LESS-THAN SIGN
-     003E; 003C # GREATER-THAN SIGN
-     005B; 005D # LEFT SQUARE BRACKET
-     005D; 005B # RIGHT SQUARE BRACKET
-     007B; 007D # LEFT CURLY BRACKET
-     007D; 007B # RIGHT CURLY BRACKET
-     00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
-     00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
-     */
-    switch (c) {
-      case '(':
-        return ')';
-      case ')':
-        return '(';
-      case '<':
-        return '>';
-      case '>':
-        return '<';
-      case ']':
-        return '[';
-      case '[':
-        return ']';
-      case '}':
-        return '{';
-      case '{':
-        return '}';
-      case '\u00AB':
-        return '\u00BB';
-      case '\u00BB':
-        return '\u00AB';
-      default:
-        return c;
-    }
-  }
-
-  function bidi(text, startLevel) {
-    var str = text.str;
-    var strLength = str.length;
-    if (strLength == 0)
-      return str;
-
-    // get types, fill arrays
-
-    var chars = [];
-    var types = [];
-    var oldtypes = [];
-    var numBidi = 0;
-
-    for (var i = 0; i < strLength; ++i) {
-      chars[i] = str.charAt(i);
-
-      var charCode = str.charCodeAt(i);
-      var charType = 'L';
-      if (charCode <= 0x00ff)
-        charType = baseTypes[charCode];
-      else if (0x0590 <= charCode && charCode <= 0x05f4)
-        charType = 'R';
-      else if (0x0600 <= charCode && charCode <= 0x06ff)
-        charType = arabicTypes[charCode & 0xff];
-      else if (0x0700 <= charCode && charCode <= 0x08AC)
-        charType = 'AL';
-
-      if (charType == 'R' || charType == 'AL' || charType == 'AN')
-        numBidi++;
-
-      oldtypes[i] = types[i] = charType;
-    }
-
-    // detect the bidi method
-    //  if there are no rtl characters then no bidi needed
-    //  if less than 30% chars are rtl then string is primarily ltr
-    //  if more than 30% chars are rtl then string is primarily rtl
-    if (numBidi == 0) {
-      text.direction = 'ltr';
-      return str;
-    }
-
-    if (startLevel == -1) {
-      if ((strLength / numBidi) < 0.3) {
-        text.direction = 'ltr';
-        startLevel = 0;
-      } else {
-        text.direction = 'rtl';
-        startLevel = 1;
-      }
-    }
-
-    var levels = [];
-
-    for (var i = 0; i < strLength; ++i) {
-      levels[i] = startLevel;
-    }
-
-    /*
-     X1-X10: skip most of this, since we are NOT doing the embeddings.
-     */
-
-    var e = isOdd(startLevel) ? 'R' : 'L';
-    var sor = e;
-    var eor = sor;
-
-    /*
-     W1. Examine each non-spacing mark (NSM) in the level run, and change the
-     type of the NSM to the type of the previous character. If the NSM is at the
-     start of the level run, it will get the type of sor.
-     */
-
-    var lastType = sor;
-    for (var i = 0; i < strLength; ++i) {
-      if (types[i] == 'NSM')
-        types[i] = lastType;
-      else
-        lastType = types[i];
-    }
-
-    /*
-     W2. Search backwards from each instance of a European number until the
-     first strong type (R, L, AL, or sor) is found.  If an AL is found, change
-     the type of the European number to Arabic number.
-     */
-
-    var lastType = sor;
-    for (var i = 0; i < strLength; ++i) {
-      var t = types[i];
-      if (t == 'EN')
-        types[i] = (lastType == 'AL') ? 'AN' : 'EN';
-      else if (t == 'R' || t == 'L' || t == 'AL')
-        lastType = t;
-    }
-
-    /*
-     W3. Change all ALs to R.
-     */
-
-    for (var i = 0; i < strLength; ++i) {
-      var t = types[i];
-      if (t == 'AL')
-        types[i] = 'R';
-    }
-
-    /*
-     W4. A single European separator between two European numbers changes to a
-     European number. A single common separator between two numbers of the same
-     type changes to that type:
-     */
-
-    for (var i = 1; i < strLength - 1; ++i) {
-      if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
-        types[i] = 'EN';
-      if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
-          types[i + 1] == types[i - 1])
-        types[i] = types[i - 1];
-    }
-
-    /*
-     W5. A sequence of European terminators adjacent to European numbers changes
-     to all European numbers:
-     */
-
-    for (var i = 0; i < strLength; ++i) {
-      if (types[i] == 'EN') {
-        // do before
-        for (var j = i - 1; j >= 0; --j) {
-          if (types[j] != 'ET')
-            break;
-          types[j] = 'EN';
-        }
-        // do after
-        for (var j = i + 1; j < strLength; --j) {
-          if (types[j] != 'ET')
-            break;
-          types[j] = 'EN';
-        }
-      }
-    }
-
-    /*
-     W6. Otherwise, separators and terminators change to Other Neutral:
-     */
-
-    for (var i = 0; i < strLength; ++i) {
-      var t = types[i];
-      if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
-        types[i] = 'ON';
-    }
-
-    /*
-     W7. Search backwards from each instance of a European number until the
-     first strong type (R, L, or sor) is found. If an L is found,  then change
-     the type of the European number to L.
-     */
-
-    var lastType = sor;
-    for (var i = 0; i < strLength; ++i) {
-      var t = types[i];
-      if (t == 'EN')
-        types[i] = (lastType == 'L') ? 'L' : 'EN';
-      else if (t == 'R' || t == 'L')
-        lastType = t;
-    }
-
-    /*
-     N1. A sequence of neutrals takes the direction of the surrounding strong
-     text if the text on both sides has the same direction. European and Arabic
-     numbers are treated as though they were R. Start-of-level-run (sor) and
-     end-of-level-run (eor) are used at level run boundaries.
-     */
-
-    for (var i = 0; i < strLength; ++i) {
-      if (types[i] == 'ON') {
-        var end = findUnequal(types, i + 1, 'ON');
-        var before = sor;
-        if (i > 0)
-          before = types[i - 1];
-        var after = eor;
-        if (end + 1 < strLength)
-          after = types[end + 1];
-        if (before != 'L')
-          before = 'R';
-        if (after != 'L')
-          after = 'R';
-        if (before == after)
-          setValues(types, i, end, before);
-        i = end - 1; // reset to end (-1 so next iteration is ok)
-      }
-    }
-
-    /*
-     N2. Any remaining neutrals take the embedding direction.
-     */
-
-    for (var i = 0; i < strLength; ++i) {
-      if (types[i] == 'ON')
-        types[i] = e;
-    }
-
-    /*
-     I1. For all characters with an even (left-to-right) embedding direction,
-     those of type R go up one level and those of type AN or EN go up two
-     levels.
-     I2. For all characters with an odd (right-to-left) embedding direction,
-     those of type L, EN or AN go up one level.
-     */
-
-    for (var i = 0; i < strLength; ++i) {
-      var t = types[i];
-      if (isEven(levels[i])) {
-        if (t == 'R') {
-          levels[i] += 1;
-        } else if (t == 'AN' || t == 'EN') {
-          levels[i] += 2;
-        }
-      } else { // isOdd, so
-        if (t == 'L' || t == 'AN' || t == 'EN') {
-          levels[i] += 1;
-        }
-      }
-    }
-
-    /*
-     L1. On each line, reset the embedding level of the following characters to
-     the paragraph embedding level:
-
-     segment separators,
-     paragraph separators,
-     any sequence of whitespace characters preceding a segment separator or
-     paragraph separator, and any sequence of white space characters at the end
-     of the line.
-     */
-
-    // don't bother as text is only single line
-
-    /*
-     L2. From the highest level found in the text to the lowest odd level on
-     each line, reverse any contiguous sequence of characters that are at that
-     level or higher.
-     */
-
-    // find highest level & lowest odd level
-
-    var highestLevel = -1;
-    var lowestOddLevel = 99;
-    for (var i = 0, ii = levels.length; i < ii; ++i) {
-      var level = levels[i];
-      if (highestLevel < level)
-        highestLevel = level;
-      if (lowestOddLevel > level && isOdd(level))
-        lowestOddLevel = level;
-    }
-
-    // now reverse between those limits
-
-    for (var level = highestLevel; level >= lowestOddLevel; --level) {
-      // find segments to reverse
-      var start = -1;
-      for (var i = 0, ii = levels.length; i < ii; ++i) {
-        if (levels[i] < level) {
-          if (start >= 0) {
-            reverseValues(chars, start, i);
-            start = -1;
-          }
-        } else if (start < 0) {
-          start = i;
-        }
-      }
-      if (start >= 0) {
-        reverseValues(chars, start, levels.length);
-      }
-    }
-
-    /*
-     L3. Combining marks applied to a right-to-left base character will at this
-     point precede their base character. If the rendering engine expects them to
-     follow the base characters in the final display process, then the ordering
-     of the marks and the base character must be reversed.
-     */
-
-    // don't bother for now
-
-    /*
-     L4. A character that possesses the mirrored property as specified by
-     Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
-     directionality of that character is R.
-     */
-
-    // don't mirror as characters are already mirrored in the pdf
-
-    // Finally, return string
-
-    var result = '';
-    for (var i = 0, ii = chars.length; i < ii; ++i) {
-      var ch = chars[i];
-      if (ch != '<' && ch != '>')
-        result += ch;
-    }
-    return result;
-  }
-
-  return bidi;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/canvas.js b/apps/files_pdfviewer/js/pdfjs/src/canvas.js
deleted file mode 100644
index 8f29051fdad1d43d9702c620d224ed1bb3260ab8..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/canvas.js
+++ /dev/null
@@ -1,1263 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-// <canvas> contexts store most of the state we need natively.
-// However, PDF needs a bit more state, which we store here.
-
-var TextRenderingMode = {
-  FILL: 0,
-  STROKE: 1,
-  FILL_STROKE: 2,
-  INVISIBLE: 3,
-  FILL_ADD_TO_PATH: 4,
-  STROKE_ADD_TO_PATH: 5,
-  FILL_STROKE_ADD_TO_PATH: 6,
-  ADD_TO_PATH: 7
-};
-
-// Minimal font size that would be used during canvas fillText operations.
-var MIN_FONT_SIZE = 1;
-
-function createScratchCanvas(width, height) {
-  var canvas = document.createElement('canvas');
-  canvas.width = width;
-  canvas.height = height;
-  return canvas;
-}
-
-function addContextCurrentTransform(ctx) {
-  // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
-  if (!ctx.mozCurrentTransform) {
-    // Store the original context
-    ctx._originalSave = ctx.save;
-    ctx._originalRestore = ctx.restore;
-    ctx._originalRotate = ctx.rotate;
-    ctx._originalScale = ctx.scale;
-    ctx._originalTranslate = ctx.translate;
-    ctx._originalTransform = ctx.transform;
-
-    ctx._transformMatrix = [1, 0, 0, 1, 0, 0];
-    ctx._transformStack = [];
-
-    Object.defineProperty(ctx, 'mozCurrentTransform', {
-      get: function getCurrentTransform() {
-        return this._transformMatrix;
-      }
-    });
-
-    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
-      get: function getCurrentTransformInverse() {
-        // Calculation done using WolframAlpha:
-        // http://www.wolframalpha.com/input/?
-        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
-
-        var m = this._transformMatrix;
-        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
-
-        var ad_bc = a * d - b * c;
-        var bc_ad = b * c - a * d;
-
-        return [
-          d / ad_bc,
-          b / bc_ad,
-          c / bc_ad,
-          a / ad_bc,
-          (d * e - c * f) / bc_ad,
-          (b * e - a * f) / ad_bc
-        ];
-      }
-    });
-
-    ctx.save = function ctxSave() {
-      var old = this._transformMatrix;
-      this._transformStack.push(old);
-      this._transformMatrix = old.slice(0, 6);
-
-      this._originalSave();
-    };
-
-    ctx.restore = function ctxRestore() {
-      var prev = this._transformStack.pop();
-      if (prev) {
-        this._transformMatrix = prev;
-        this._originalRestore();
-      }
-    };
-
-    ctx.translate = function ctxTranslate(x, y) {
-      var m = this._transformMatrix;
-      m[4] = m[0] * x + m[2] * y + m[4];
-      m[5] = m[1] * x + m[3] * y + m[5];
-
-      this._originalTranslate(x, y);
-    };
-
-    ctx.scale = function ctxScale(x, y) {
-      var m = this._transformMatrix;
-      m[0] = m[0] * x;
-      m[1] = m[1] * x;
-      m[2] = m[2] * y;
-      m[3] = m[3] * y;
-
-      this._originalScale(x, y);
-    };
-
-    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
-      var m = this._transformMatrix;
-      this._transformMatrix = [
-        m[0] * a + m[2] * b,
-        m[1] * a + m[3] * b,
-        m[0] * c + m[2] * d,
-        m[1] * c + m[3] * d,
-        m[0] * e + m[2] * f + m[4],
-        m[1] * e + m[3] * f + m[5]
-      ];
-
-      ctx._originalTransform(a, b, c, d, e, f);
-    };
-
-    ctx.rotate = function ctxRotate(angle) {
-      var cosValue = Math.cos(angle);
-      var sinValue = Math.sin(angle);
-
-      var m = this._transformMatrix;
-      this._transformMatrix = [
-        m[0] * cosValue + m[2] * sinValue,
-        m[1] * cosValue + m[3] * sinValue,
-        m[0] * (-sinValue) + m[2] * cosValue,
-        m[1] * (-sinValue) + m[3] * cosValue,
-        m[4],
-        m[5]
-      ];
-
-      this._originalRotate(angle);
-    };
-  }
-}
-
-var CanvasExtraState = (function CanvasExtraStateClosure() {
-  function CanvasExtraState(old) {
-    // Are soft masks and alpha values shapes or opacities?
-    this.alphaIsShape = false;
-    this.fontSize = 0;
-    this.fontSizeScale = 1;
-    this.textMatrix = IDENTITY_MATRIX;
-    this.fontMatrix = IDENTITY_MATRIX;
-    this.leading = 0;
-    // Current point (in user coordinates)
-    this.x = 0;
-    this.y = 0;
-    // Start of text line (in text coordinates)
-    this.lineX = 0;
-    this.lineY = 0;
-    // Character and word spacing
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.textHScale = 1;
-    this.textRenderingMode = TextRenderingMode.FILL;
-    // Color spaces
-    this.fillColorSpace = new DeviceGrayCS();
-    this.fillColorSpaceObj = null;
-    this.strokeColorSpace = new DeviceGrayCS();
-    this.strokeColorSpaceObj = null;
-    this.fillColorObj = null;
-    this.strokeColorObj = null;
-    // Default fore and background colors
-    this.fillColor = '#000000';
-    this.strokeColor = '#000000';
-    // Note: fill alpha applies to all non-stroking operations
-    this.fillAlpha = 1;
-    this.strokeAlpha = 1;
-    this.lineWidth = 1;
-
-    this.old = old;
-  }
-
-  CanvasExtraState.prototype = {
-    clone: function CanvasExtraState_clone() {
-      return Object.create(this);
-    },
-    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
-      this.x = x;
-      this.y = y;
-    }
-  };
-  return CanvasExtraState;
-})();
-
-var CanvasGraphics = (function CanvasGraphicsClosure() {
-  // Defines the time the executeOperatorList is going to be executing
-  // before it stops and shedules a continue of execution.
-  var kExecutionTime = 15;
-
-  function CanvasGraphics(canvasCtx, objs, textLayer) {
-    this.ctx = canvasCtx;
-    this.current = new CanvasExtraState();
-    this.stateStack = [];
-    this.pendingClip = null;
-    this.res = null;
-    this.xobjs = null;
-    this.objs = objs;
-    this.textLayer = textLayer;
-    if (canvasCtx) {
-      addContextCurrentTransform(canvasCtx);
-    }
-  }
-
-  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
-  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
-  var NORMAL_CLIP = {};
-  var EO_CLIP = {};
-
-  CanvasGraphics.prototype = {
-    slowCommands: {
-      'stroke': true,
-      'closeStroke': true,
-      'fill': true,
-      'eoFill': true,
-      'fillStroke': true,
-      'eoFillStroke': true,
-      'closeFillStroke': true,
-      'closeEOFillStroke': true,
-      'showText': true,
-      'showSpacedText': true,
-      'setStrokeColorSpace': true,
-      'setFillColorSpace': true,
-      'setStrokeColor': true,
-      'setStrokeColorN': true,
-      'setFillColor': true,
-      'setFillColorN': true,
-      'setStrokeGray': true,
-      'setFillGray': true,
-      'setStrokeRGBColor': true,
-      'setFillRGBColor': true,
-      'setStrokeCMYKColor': true,
-      'setFillCMYKColor': true,
-      'paintJpegXObject': true,
-      'paintImageXObject': true,
-      'paintImageMaskXObject': true,
-      'shadingFill': true
-    },
-
-    beginDrawing: function CanvasGraphics_beginDrawing(mediaBox) {
-      var cw = this.ctx.canvas.width, ch = this.ctx.canvas.height;
-      this.ctx.save();
-      switch (mediaBox.rotate) {
-        case 0:
-          this.ctx.transform(1, 0, 0, -1, 0, ch);
-          break;
-        case 90:
-          this.ctx.transform(0, 1, 1, 0, 0, 0);
-          break;
-        case 180:
-          this.ctx.transform(-1, 0, 0, 1, cw, 0);
-          break;
-        case 270:
-          this.ctx.transform(0, -1, -1, 0, cw, ch);
-          break;
-      }
-      // Scale so that canvas units are the same as PDF user space units
-      this.ctx.scale(cw / mediaBox.width, ch / mediaBox.height);
-      // Move the media left-top corner to the (0,0) canvas position
-      this.ctx.translate(-mediaBox.x, -mediaBox.y);
-
-      if (this.textLayer)
-        this.textLayer.beginLayout();
-    },
-
-    executeOperatorList: function CanvasGraphics_executeOperatorList(
-                                    operatorList,
-                                    executionStartIdx, continueCallback,
-                                    stepper) {
-      var argsArray = operatorList.argsArray;
-      var fnArray = operatorList.fnArray;
-      var i = executionStartIdx || 0;
-      var argsArrayLen = argsArray.length;
-
-      // Sometimes the OperatorList to execute is empty.
-      if (argsArrayLen == i) {
-        return i;
-      }
-
-      var executionEndIdx;
-      var endTime = Date.now() + kExecutionTime;
-
-      var objs = this.objs;
-      var fnName;
-      var slowCommands = this.slowCommands;
-
-      while (true) {
-        if (stepper && i === stepper.nextBreakPoint) {
-          stepper.breakIt(i, continueCallback);
-          return i;
-        }
-
-        fnName = fnArray[i];
-
-        if (fnName !== 'dependency') {
-          this[fnName].apply(this, argsArray[i]);
-        } else {
-          var deps = argsArray[i];
-          for (var n = 0, nn = deps.length; n < nn; n++) {
-            var depObjId = deps[n];
-
-            // If the promise isn't resolved yet, add the continueCallback
-            // to the promise and bail out.
-            if (!objs.isResolved(depObjId)) {
-              objs.get(depObjId, continueCallback);
-              return i;
-            }
-          }
-        }
-
-        i++;
-
-        // If the entire operatorList was executed, stop as were done.
-        if (i == argsArrayLen) {
-          return i;
-        }
-
-        // If the execution took longer then a certain amount of time, shedule
-        // to continue exeution after a short delay.
-        // However, this is only possible if a 'continueCallback' is passed in.
-        if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
-          setTimeout(continueCallback, 0);
-          return i;
-        }
-
-        // If the operatorList isn't executed completely yet OR the execution
-        // time was short enough, do another execution round.
-      }
-    },
-
-    endDrawing: function CanvasGraphics_endDrawing() {
-      this.ctx.restore();
-
-      if (this.textLayer)
-        this.textLayer.endLayout();
-    },
-
-    // Graphics state
-    setLineWidth: function CanvasGraphics_setLineWidth(width) {
-      this.current.lineWidth = width;
-      this.ctx.lineWidth = width;
-    },
-    setLineCap: function CanvasGraphics_setLineCap(style) {
-      this.ctx.lineCap = LINE_CAP_STYLES[style];
-    },
-    setLineJoin: function CanvasGraphics_setLineJoin(style) {
-      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
-    },
-    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
-      this.ctx.miterLimit = limit;
-    },
-    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
-      this.ctx.mozDash = dashArray;
-      this.ctx.mozDashOffset = dashPhase;
-      this.ctx.webkitLineDash = dashArray;
-      this.ctx.webkitLineDashOffset = dashPhase;
-    },
-    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
-      TODO('set rendering intent: ' + intent);
-    },
-    setFlatness: function CanvasGraphics_setFlatness(flatness) {
-      TODO('set flatness: ' + flatness);
-    },
-    setGState: function CanvasGraphics_setGState(states) {
-      for (var i = 0, ii = states.length; i < ii; i++) {
-        var state = states[i];
-        var key = state[0];
-        var value = state[1];
-
-        switch (key) {
-          case 'LW':
-            this.setLineWidth(value);
-            break;
-          case 'LC':
-            this.setLineCap(value);
-            break;
-          case 'LJ':
-            this.setLineJoin(value);
-            break;
-          case 'ML':
-            this.setMiterLimit(value);
-            break;
-          case 'D':
-            this.setDash(value[0], value[1]);
-            break;
-          case 'RI':
-            this.setRenderingIntent(value);
-            break;
-          case 'FL':
-            this.setFlatness(value);
-            break;
-          case 'Font':
-            this.setFont(state[1], state[2]);
-            break;
-          case 'CA':
-            this.current.strokeAlpha = state[1];
-            break;
-          case 'ca':
-            this.current.fillAlpha = state[1];
-            this.ctx.globalAlpha = state[1];
-            break;
-        }
-      }
-    },
-    save: function CanvasGraphics_save() {
-      this.ctx.save();
-      var old = this.current;
-      this.stateStack.push(old);
-      this.current = old.clone();
-    },
-    restore: function CanvasGraphics_restore() {
-      var prev = this.stateStack.pop();
-      if (prev) {
-        this.current = prev;
-        this.ctx.restore();
-      }
-    },
-    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
-      this.ctx.transform(a, b, c, d, e, f);
-    },
-
-    // Path
-    moveTo: function CanvasGraphics_moveTo(x, y) {
-      this.ctx.moveTo(x, y);
-      this.current.setCurrentPoint(x, y);
-    },
-    lineTo: function CanvasGraphics_lineTo(x, y) {
-      this.ctx.lineTo(x, y);
-      this.current.setCurrentPoint(x, y);
-    },
-    curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
-      this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
-      this.current.setCurrentPoint(x3, y3);
-    },
-    curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
-      var current = this.current;
-      this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
-      current.setCurrentPoint(x3, y3);
-    },
-    curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
-      this.curveTo(x1, y1, x3, y3, x3, y3);
-      this.current.setCurrentPoint(x3, y3);
-    },
-    closePath: function CanvasGraphics_closePath() {
-      this.ctx.closePath();
-    },
-    rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
-      this.ctx.rect(x, y, width, height);
-    },
-    stroke: function CanvasGraphics_stroke(consumePath) {
-      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
-      var ctx = this.ctx;
-      var strokeColor = this.current.strokeColor;
-      if (this.current.lineWidth === 0)
-        ctx.lineWidth = this.getSinglePixelWidth();
-      // For stroke we want to temporarily change the global alpha to the
-      // stroking alpha.
-      ctx.globalAlpha = this.current.strokeAlpha;
-      if (strokeColor && strokeColor.hasOwnProperty('type') &&
-          strokeColor.type === 'Pattern') {
-        // for patterns, we transform to pattern space, calculate
-        // the pattern, call stroke, and restore to user space
-        ctx.save();
-        ctx.strokeStyle = strokeColor.getPattern(ctx);
-        ctx.stroke();
-        ctx.restore();
-      } else {
-        ctx.stroke();
-      }
-      if (consumePath)
-        this.consumePath();
-      // Restore the global alpha to the fill alpha
-      ctx.globalAlpha = this.current.fillAlpha;
-    },
-    closeStroke: function CanvasGraphics_closeStroke() {
-      this.closePath();
-      this.stroke();
-    },
-    fill: function CanvasGraphics_fill(consumePath) {
-      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
-      var ctx = this.ctx;
-      var fillColor = this.current.fillColor;
-
-      if (fillColor && fillColor.hasOwnProperty('type') &&
-          fillColor.type === 'Pattern') {
-        ctx.save();
-        ctx.fillStyle = fillColor.getPattern(ctx);
-        ctx.fill();
-        ctx.restore();
-      } else {
-        ctx.fill();
-      }
-      if (consumePath)
-        this.consumePath();
-    },
-    eoFill: function CanvasGraphics_eoFill() {
-      var savedFillRule = this.setEOFillRule();
-      this.fill();
-      this.restoreFillRule(savedFillRule);
-    },
-    fillStroke: function CanvasGraphics_fillStroke() {
-      this.fill(false);
-      this.stroke(false);
-
-      this.consumePath();
-    },
-    eoFillStroke: function CanvasGraphics_eoFillStroke() {
-      var savedFillRule = this.setEOFillRule();
-      this.fillStroke();
-      this.restoreFillRule(savedFillRule);
-    },
-    closeFillStroke: function CanvasGraphics_closeFillStroke() {
-      this.closePath();
-      this.fillStroke();
-    },
-    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
-      var savedFillRule = this.setEOFillRule();
-      this.closePath();
-      this.fillStroke();
-      this.restoreFillRule(savedFillRule);
-    },
-    endPath: function CanvasGraphics_endPath() {
-      this.consumePath();
-    },
-
-    // Clipping
-    clip: function CanvasGraphics_clip() {
-      this.pendingClip = NORMAL_CLIP;
-    },
-    eoClip: function CanvasGraphics_eoClip() {
-      this.pendingClip = EO_CLIP;
-    },
-
-    // Text
-    beginText: function CanvasGraphics_beginText() {
-      this.current.textMatrix = IDENTITY_MATRIX;
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    endText: function CanvasGraphics_endText() {
-    },
-    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
-      this.current.charSpacing = spacing;
-    },
-    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
-      this.current.wordSpacing = spacing;
-    },
-    setHScale: function CanvasGraphics_setHScale(scale) {
-      this.current.textHScale = scale / 100;
-    },
-    setLeading: function CanvasGraphics_setLeading(leading) {
-      this.current.leading = -leading;
-    },
-    setFont: function CanvasGraphics_setFont(fontRefName, size) {
-      var fontObj = this.objs.get(fontRefName);
-      var current = this.current;
-
-      if (!fontObj)
-        error('Can\'t find font for ' + fontRefName);
-
-      // Slice-clone matrix so we can manipulate it without affecting original
-      if (fontObj.fontMatrix)
-        current.fontMatrix = fontObj.fontMatrix.slice(0);
-      else
-        current.fontMatrix = IDENTITY_MATRIX.slice(0);
-
-      // A valid matrix needs all main diagonal elements to be non-zero
-      // This also ensures we bypass FF bugzilla bug #719844.
-      if (current.fontMatrix[0] === 0 ||
-          current.fontMatrix[3] === 0) {
-        warn('Invalid font matrix for font ' + fontRefName);
-      }
-
-      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
-      // and in some docs this can be negative (inverted x-y axes).
-      // We implement this condition with fontMatrix.
-      if (size < 0) {
-        size = -size;
-        current.fontMatrix[0] *= -1;
-        current.fontMatrix[3] *= -1;
-      }
-
-      this.current.font = fontObj;
-      this.current.fontSize = size;
-
-      if (fontObj.coded)
-        return; // we don't need ctx.font for Type3 fonts
-
-      var name = fontObj.loadedName || 'sans-serif';
-      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
-                                 (fontObj.bold ? 'bold' : 'normal');
-
-      var italic = fontObj.italic ? 'italic' : 'normal';
-      var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
-      var typeface = '"' + name + '", ' + serif;
-
-      // Some font backends cannot handle fonts below certain size.
-      // Keeping the font at minimal size and using the fontSizeScale to change
-      // the current transformation matrix before the fillText/strokeText.
-      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
-      var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
-      this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
-                                   size / MIN_FONT_SIZE;
-
-      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
-      this.ctx.font = rule;
-    },
-    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
-      if (mode >= TextRenderingMode.FILL_ADD_TO_PATH)
-        TODO('unsupported text rendering mode: ' + mode);
-      this.current.textRenderingMode = mode;
-    },
-    setTextRise: function CanvasGraphics_setTextRise(rise) {
-      TODO('text rise: ' + rise);
-    },
-    moveText: function CanvasGraphics_moveText(x, y) {
-      this.current.x = this.current.lineX += x;
-      this.current.y = this.current.lineY += y;
-    },
-    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
-      this.setLeading(-y);
-      this.moveText(x, y);
-    },
-    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
-      this.current.textMatrix = [a, b, c, d, e, f];
-
-      this.current.x = this.current.lineX = 0;
-      this.current.y = this.current.lineY = 0;
-    },
-    nextLine: function CanvasGraphics_nextLine() {
-      this.moveText(0, this.current.leading);
-    },
-    applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
-      var ctx = this.ctx;
-      var current = this.current;
-      var textHScale = current.textHScale;
-      var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
-
-      ctx.transform.apply(ctx, current.textMatrix);
-      ctx.scale(1, -1);
-      ctx.translate(current.x, -1 * current.y);
-      ctx.transform.apply(ctx, fontMatrix);
-      ctx.scale(textHScale, 1);
-    },
-    getTextGeometry: function CanvasGraphics_getTextGeometry() {
-      var geometry = {};
-      var ctx = this.ctx;
-      var font = this.current.font;
-      var ctxMatrix = ctx.mozCurrentTransform;
-      if (ctxMatrix) {
-        var bl = Util.applyTransform([0, 0], ctxMatrix);
-        var tr = Util.applyTransform([1, 1], ctxMatrix);
-        geometry.x = bl[0];
-        geometry.y = bl[1];
-        geometry.hScale = tr[0] - bl[0];
-        geometry.vScale = tr[1] - bl[1];
-      }
-      geometry.spaceWidth = font.spaceWidth;
-      return geometry;
-    },
-
-    showText: function CanvasGraphics_showText(str, skipTextSelection) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var glyphs = font.charsToGlyphs(str);
-      var fontSize = current.fontSize;
-      var fontSizeScale = current.fontSizeScale;
-      var charSpacing = current.charSpacing;
-      var wordSpacing = current.wordSpacing;
-      var textHScale = current.textHScale;
-      var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
-      var textHScale2 = textHScale * fontMatrix[0];
-      var glyphsLength = glyphs.length;
-      var textLayer = this.textLayer;
-      var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
-      var textSelection = textLayer && !skipTextSelection ? true : false;
-      var textRenderingMode = current.textRenderingMode;
-
-      // Type3 fonts - each glyph is a "mini-PDF"
-      if (font.coded) {
-        ctx.save();
-        ctx.transform.apply(ctx, current.textMatrix);
-        ctx.translate(current.x, current.y);
-
-        ctx.scale(textHScale, 1);
-
-        if (textSelection) {
-          this.save();
-          ctx.scale(1, -1);
-          text.geom = this.getTextGeometry();
-          this.restore();
-        }
-        for (var i = 0; i < glyphsLength; ++i) {
-
-          var glyph = glyphs[i];
-          if (glyph === null) {
-            // word break
-            this.ctx.translate(wordSpacing, 0);
-            continue;
-          }
-
-          this.save();
-          ctx.scale(fontSize, fontSize);
-          ctx.transform.apply(ctx, fontMatrix);
-          this.executeOperatorList(glyph.operatorList);
-          this.restore();
-
-          var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
-          var width = transformed[0] * fontSize +
-              Util.sign(current.fontMatrix[0]) * charSpacing;
-
-          ctx.translate(width, 0);
-          current.x += width * textHScale;
-
-          text.str += glyph.unicode;
-          text.length++;
-          text.canvasWidth += width;
-        }
-        ctx.restore();
-      } else {
-        ctx.save();
-        this.applyTextTransforms();
-
-        var lineWidth = current.lineWidth;
-        var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]);
-        if (scale == 0 || lineWidth == 0)
-          lineWidth = this.getSinglePixelWidth();
-        else
-          lineWidth /= scale;
-
-        if (textSelection)
-          text.geom = this.getTextGeometry();
-
-        if (fontSizeScale != 1.0) {
-          ctx.scale(fontSizeScale, fontSizeScale);
-          lineWidth /= fontSizeScale;
-        }
-
-        ctx.lineWidth = lineWidth;
-
-        var x = 0;
-        for (var i = 0; i < glyphsLength; ++i) {
-          var glyph = glyphs[i];
-          if (glyph === null) {
-            // word break
-            x += Util.sign(current.fontMatrix[0]) * wordSpacing;
-            continue;
-          }
-
-          var character = glyph.fontChar;
-          var charWidth = glyph.width * fontSize * 0.001 +
-              Util.sign(current.fontMatrix[0]) * charSpacing;
-
-          if (!glyph.disabled) {
-            var scaledX = x / fontSizeScale;
-            switch (textRenderingMode) {
-              default: // other unsupported rendering modes
-              case TextRenderingMode.FILL:
-              case TextRenderingMode.FILL_ADD_TO_PATH:
-                ctx.fillText(character, scaledX, 0);
-                break;
-              case TextRenderingMode.STROKE:
-              case TextRenderingMode.STROKE_ADD_TO_PATH:
-                ctx.strokeText(character, scaledX, 0);
-                break;
-              case TextRenderingMode.FILL_STROKE:
-              case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
-                ctx.fillText(character, scaledX, 0);
-                ctx.strokeText(character, scaledX, 0);
-                break;
-              case TextRenderingMode.INVISIBLE:
-                break;
-            }
-          }
-
-          x += charWidth;
-
-          var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode;
-          var glyphUnicodeLength = glyphUnicode.length;
-          //reverse an arabic ligature
-          if (glyphUnicodeLength > 1 &&
-              isRTLRangeFor(glyphUnicode.charCodeAt(0))) {
-            for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--)
-              text.str += glyphUnicode[ii];
-          } else
-            text.str += glyphUnicode;
-          text.length += glyphUnicodeLength;
-          text.canvasWidth += charWidth;
-        }
-        current.x += x * textHScale2;
-        ctx.restore();
-      }
-
-      if (textSelection)
-        this.textLayer.appendText(text, font.loadedName, fontSize);
-
-      return text;
-    },
-    showSpacedText: function CanvasGraphics_showSpacedText(arr) {
-      var ctx = this.ctx;
-      var current = this.current;
-      var font = current.font;
-      var fontSize = current.fontSize;
-      var textHScale = current.textHScale;
-      if (!font.coded)
-        textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0];
-      var arrLength = arr.length;
-      var textLayer = this.textLayer;
-      var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
-      var textSelection = textLayer ? true : false;
-
-      if (textSelection) {
-        ctx.save();
-        // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
-        if (font.coded) {
-          ctx.transform.apply(ctx, current.textMatrix);
-          ctx.scale(1, -1);
-          ctx.translate(current.x, -1 * current.y);
-          ctx.scale(textHScale, 1);
-        } else
-          this.applyTextTransforms();
-        text.geom = this.getTextGeometry();
-        ctx.restore();
-      }
-
-      for (var i = 0; i < arrLength; ++i) {
-        var e = arr[i];
-        if (isNum(e)) {
-          var spacingLength = -e * 0.001 * fontSize * textHScale;
-          current.x += spacingLength;
-
-          if (textSelection) {
-            // Emulate precise spacing via HTML spaces
-            text.canvasWidth += spacingLength;
-            if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero
-              var numFakeSpaces = Math.round(-e / text.geom.spaceWidth);
-              if (numFakeSpaces > 0) {
-                text.str += '\u00A0';
-                text.length++;
-              }
-            }
-          }
-        } else if (isString(e)) {
-          var shownText = this.showText(e, true);
-
-          if (textSelection) {
-            if (shownText.str === ' ') {
-              text.str += '\u00A0';
-            } else {
-              text.str += shownText.str;
-            }
-            text.canvasWidth += shownText.canvasWidth;
-            text.length += shownText.length;
-          }
-        } else {
-          malformed('TJ array element ' + e + ' is not string or num');
-        }
-      }
-
-      if (textSelection)
-        this.textLayer.appendText(text, font.loadedName, fontSize);
-    },
-    nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
-      this.nextLine();
-      this.showText(text);
-    },
-    nextLineSetSpacingShowText:
-      function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
-                                                         charSpacing,
-                                                         text) {
-      this.setWordSpacing(wordSpacing);
-      this.setCharSpacing(charSpacing);
-      this.nextLineShowText(text);
-    },
-
-    // Type3 fonts
-    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
-      // We can safely ignore this since the width should be the same
-      // as the width in the Widths array.
-    },
-    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
-                                                                        yWidth,
-                                                                        llx,
-                                                                        lly,
-                                                                        urx,
-                                                                        ury) {
-      // TODO According to the spec we're also suppose to ignore any operators
-      // that set color or include images while processing this type3 font.
-      this.rectangle(llx, lly, urx - llx, ury - lly);
-      this.clip();
-      this.endPath();
-    },
-
-    // Color
-    setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
-      this.current.strokeColorSpace = ColorSpace.fromIR(raw);
-    },
-    setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
-      this.current.fillColorSpace = ColorSpace.fromIR(raw);
-    },
-    setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
-      var cs = this.current.strokeColorSpace;
-      var rgbColor = cs.getRgb(arguments);
-      var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
-      if (IR[0] == 'TilingPattern') {
-        var args = IR[1];
-        var base = cs.base;
-        var color;
-        if (base) {
-          var baseComps = base.numComps;
-
-          color = [];
-          for (var i = 0; i < baseComps; ++i)
-            color.push(args[i]);
-
-          color = base.getRgb(color);
-        }
-        var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
-      } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
-        var pattern = Pattern.shadingFromIR(IR);
-      } else {
-        error('Unkown IR type ' + IR[0]);
-      }
-      return pattern;
-    },
-    setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
-      var cs = this.current.strokeColorSpace;
-
-      if (cs.name == 'Pattern') {
-        this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
-      } else {
-        this.setStrokeColor.apply(this, arguments);
-      }
-    },
-    setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
-      var cs = this.current.fillColorSpace;
-      var rgbColor = cs.getRgb(arguments);
-      var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-    setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
-      var cs = this.current.fillColorSpace;
-
-      if (cs.name == 'Pattern') {
-        this.current.fillColor = this.getColorN_Pattern(arguments, cs);
-      } else {
-        this.setFillColor.apply(this, arguments);
-      }
-    },
-    setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
-      if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
-        this.current.strokeColorSpace = new DeviceGrayCS();
-
-      var color = Util.makeCssRgb(gray, gray, gray);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillGray: function CanvasGraphics_setFillGray(gray) {
-      if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
-        this.current.fillColorSpace = new DeviceGrayCS();
-
-      var color = Util.makeCssRgb(gray, gray, gray);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
-      if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
-        this.current.strokeColorSpace = new DeviceRgbCS();
-
-      var color = Util.makeCssRgb(r, g, b);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
-      if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
-        this.current.fillColorSpace = new DeviceRgbCS();
-
-      var color = Util.makeCssRgb(r, g, b);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-    setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
-      if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
-        this.current.strokeColorSpace = new DeviceCmykCS();
-
-      var color = Util.makeCssCmyk(c, m, y, k);
-      this.ctx.strokeStyle = color;
-      this.current.strokeColor = color;
-    },
-    setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
-      if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
-        this.current.fillColorSpace = new DeviceCmykCS();
-
-      var color = Util.makeCssCmyk(c, m, y, k);
-      this.ctx.fillStyle = color;
-      this.current.fillColor = color;
-    },
-
-    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
-      var ctx = this.ctx;
-
-      this.save();
-      var pattern = Pattern.shadingFromIR(patternIR);
-      ctx.fillStyle = pattern.getPattern(ctx);
-
-      var inv = ctx.mozCurrentTransformInverse;
-      if (inv) {
-        var canvas = ctx.canvas;
-        var width = canvas.width;
-        var height = canvas.height;
-
-        var bl = Util.applyTransform([0, 0], inv);
-        var br = Util.applyTransform([0, height], inv);
-        var ul = Util.applyTransform([width, 0], inv);
-        var ur = Util.applyTransform([width, height], inv);
-
-        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
-        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
-        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
-        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
-
-        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
-      } else {
-        // HACK to draw the gradient onto an infinite rectangle.
-        // PDF gradients are drawn across the entire image while
-        // Canvas only allows gradients to be drawn in a rectangle
-        // The following bug should allow us to remove this.
-        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
-
-        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
-      }
-
-      this.restore();
-    },
-
-    // Images
-    beginInlineImage: function CanvasGraphics_beginInlineImage() {
-      error('Should not call beginInlineImage');
-    },
-    beginImageData: function CanvasGraphics_beginImageData() {
-      error('Should not call beginImageData');
-    },
-
-    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
-                                                                        bbox) {
-      this.save();
-
-      if (matrix && isArray(matrix) && 6 == matrix.length)
-        this.transform.apply(this, matrix);
-
-      if (bbox && isArray(bbox) && 4 == bbox.length) {
-        var width = bbox[2] - bbox[0];
-        var height = bbox[3] - bbox[1];
-        this.rectangle(bbox[0], bbox[1], width, height);
-        this.clip();
-        this.endPath();
-      }
-    },
-
-    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
-      this.restore();
-    },
-
-    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
-      var domImage = this.objs.get(objId);
-      if (!domImage) {
-        error('Dependent image isn\'t ready yet');
-      }
-
-      this.save();
-
-      var ctx = this.ctx;
-      // scale the image to the unit square
-      ctx.scale(1 / w, -1 / h);
-
-      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
-                    0, -h, w, h);
-
-      this.restore();
-    },
-
-    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(
-                             imgArray, inverseDecode, width, height) {
-      function applyStencilMask(buffer, inverseDecode) {
-        var imgArrayPos = 0;
-        var i, j, mask, buf;
-        // removing making non-masked pixels transparent
-        var bufferPos = 3; // alpha component offset
-        for (i = 0; i < height; i++) {
-          mask = 0;
-          for (j = 0; j < width; j++) {
-            if (!mask) {
-              buf = imgArray[imgArrayPos++];
-              mask = 128;
-            }
-            if (!(buf & mask) == inverseDecode) {
-              buffer[bufferPos] = 0;
-            }
-            bufferPos += 4;
-            mask >>= 1;
-          }
-        }
-      }
-
-      this.save();
-
-      var ctx = this.ctx;
-      var w = width, h = height;
-      // scale the image to the unit square
-      ctx.scale(1 / w, -1 / h);
-
-      var tmpCanvas = createScratchCanvas(w, h);
-      var tmpCtx = tmpCanvas.getContext('2d');
-
-      var fillColor = this.current.fillColor;
-      tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
-                          fillColor.type === 'Pattern') ?
-                          fillColor.getPattern(tmpCtx) : fillColor;
-      tmpCtx.fillRect(0, 0, w, h);
-
-      var imgData = tmpCtx.getImageData(0, 0, w, h);
-      var pixels = imgData.data;
-
-      applyStencilMask(pixels, inverseDecode);
-
-      tmpCtx.putImageData(imgData, 0, 0);
-      ctx.drawImage(tmpCanvas, 0, -h);
-      this.restore();
-    },
-
-    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
-      var imgData = this.objs.get(objId);
-      if (!imgData)
-        error('Dependent image isn\'t ready yet');
-
-      this.save();
-      var ctx = this.ctx;
-      var w = imgData.width;
-      var h = imgData.height;
-      // scale the image to the unit square
-      ctx.scale(1 / w, -1 / h);
-
-      var tmpCanvas = createScratchCanvas(w, h);
-      var tmpCtx = tmpCanvas.getContext('2d');
-      this.putBinaryImageData(tmpCtx, imgData, w, h);
-
-      ctx.drawImage(tmpCanvas, 0, -h);
-      this.restore();
-    },
-
-    putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
-      //
-    },
-
-    // Marked content
-
-    markPoint: function CanvasGraphics_markPoint(tag) {
-      TODO('Marked content');
-    },
-    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
-      TODO('Marked content');
-    },
-    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
-      TODO('Marked content');
-    },
-    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
-                                        tag, properties) {
-      TODO('Marked content');
-    },
-    endMarkedContent: function CanvasGraphics_endMarkedContent() {
-      TODO('Marked content');
-    },
-
-    // Compatibility
-
-    beginCompat: function CanvasGraphics_beginCompat() {
-      TODO('ignore undefined operators (should we do that anyway?)');
-    },
-    endCompat: function CanvasGraphics_endCompat() {
-      TODO('stop ignoring undefined operators');
-    },
-
-    // Helper functions
-
-    consumePath: function CanvasGraphics_consumePath() {
-      if (this.pendingClip) {
-        var savedFillRule = null;
-        if (this.pendingClip == EO_CLIP)
-          savedFillRule = this.setEOFillRule();
-
-        this.ctx.clip();
-
-        this.pendingClip = null;
-        if (savedFillRule !== null)
-          this.restoreFillRule(savedFillRule);
-      }
-      this.ctx.beginPath();
-    },
-    // We generally keep the canvas context set for
-    // nonzero-winding, and just set evenodd for the operations
-    // that need them.
-    setEOFillRule: function CanvasGraphics_setEOFillRule() {
-      var savedFillRule = this.ctx.mozFillRule;
-      this.ctx.mozFillRule = 'evenodd';
-      return savedFillRule;
-    },
-    restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
-      this.ctx.mozFillRule = rule;
-    },
-    getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
-      var inverse = this.ctx.mozCurrentTransformInverse;
-      return Math.abs(inverse[0] + inverse[2]);
-    }
-  };
-
-  return CanvasGraphics;
-})();
-
-if (!isWorker) {
-  // Feature detection if the browser can use an Uint8Array directly as imgData.
-  var canvas = document.createElement('canvas');
-  canvas.width = 1;
-  canvas.height = 1;
-  var ctx = canvas.getContext('2d');
-
-  try {
-    ctx.putImageData({
-      width: 1,
-      height: 1,
-      data: new Uint8Array(4)
-    }, 0, 0);
-
-    CanvasGraphics.prototype.putBinaryImageData =
-      function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
-        ctx.putImageData(imgData, 0, 0);
-      };
-  } catch (e) {
-    CanvasGraphics.prototype.putBinaryImageData =
-      function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) {
-        var tmpImgData = ctx.getImageData(0, 0, w, h);
-
-        // Copy over the imageData pixel by pixel.
-        var tmpImgDataPixels = tmpImgData.data;
-        var len = tmpImgDataPixels.length;
-
-        while (len--) {
-          tmpImgDataPixels[len] = imgData.data[len];
-        }
-
-        ctx.putImageData(tmpImgData, 0, 0);
-      };
-  }
-}
diff --git a/apps/files_pdfviewer/js/pdfjs/src/charsets.js b/apps/files_pdfviewer/js/pdfjs/src/charsets.js
deleted file mode 100644
index 7f54ab32753156dffacc855c9c4a00b87646db1f..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/charsets.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var ISOAdobeCharset = [
-  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
-  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
-  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
-  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
-  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
-  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
-  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
-  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
-  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
-  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
-  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
-  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
-  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
-  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
-  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
-  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
-  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
-  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
-  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
-  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
-  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
-  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
-  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
-  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
-  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
-  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
-  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
-  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
-  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
-  'ugrave', 'yacute', 'ydieresis', 'zcaron'
-];
-
-var ExpertCharset = [
-  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
-  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
-  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
-  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
-  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
-  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
-  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
-  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
-  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
-  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
-  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
-  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
-  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
-  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
-  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
-  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
-  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
-  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
-  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
-  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
-  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
-  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
-  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
-  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
-  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
-  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
-  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
-  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
-  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
-  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
-  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
-  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
-  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
-  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
-  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
-  'Ydieresissmall'
-];
-
-var ExpertSubsetCharset = [
-  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
-  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
-  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
-  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
-  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
-  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
-  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
-  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
-  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
-  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
-  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
-  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
-  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
-  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
-  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
-  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
-  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
-  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
-  'periodinferior', 'commainferior'
-];
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/cidmaps.js b/apps/files_pdfviewer/js/pdfjs/src/cidmaps.js
deleted file mode 100644
index 226843b713510f0eb3216c6648bbd7d847b403bd..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/cidmaps.js
+++ /dev/null
@@ -1,6933 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var CIDToUnicodeMaps = {
-  'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
-    {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
-    [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
-    0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
-    [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
-    [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
-    198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
-    174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
-    {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
-    {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
-    {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
-    {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
-    {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
-    {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
-    65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
-    {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
-    [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
-    8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
-    {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
-    9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
-    8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
-    {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
-    8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
-    8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
-    {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
-    {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
-    {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
-    {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
-    21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
-    28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
-    22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
-    24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
-    20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
-    26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
-    [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
-    37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
-    39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
-    32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
-    [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
-    [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
-    28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
-    21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
-    29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
-    30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
-    22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
-    28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
-    40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
-    25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
-    [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
-    29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
-    19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
-    22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
-    [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
-    33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
-    38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
-    34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
-    22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
-    39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
-    38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
-    24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
-    39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
-    25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
-    [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
-    23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
-    28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
-    36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
-    33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
-    33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
-    24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
-    24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
-    27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
-    31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
-    35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
-    39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
-    32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
-    22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
-    26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
-    27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
-    36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
-    20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
-    31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
-    21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
-    33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
-    [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
-    31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
-    23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
-    28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
-    20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
-    23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
-    29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
-    39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
-    [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
-    [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
-    33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
-    20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
-    39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
-    20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
-    31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
-    34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
-    21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
-    24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
-    31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
-    35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
-    25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
-    [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
-    20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
-    25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
-    30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
-    36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
-    24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
-    35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
-    [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
-    31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
-    38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
-    23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
-    35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
-    20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
-    22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
-    24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
-    25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
-    28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
-    32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
-    [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
-    37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
-    21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
-    21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
-    33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
-    20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
-    26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
-    21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
-    35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
-    22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
-    29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
-    21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
-    32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
-    26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
-    21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
-    38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
-    20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
-    29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
-    27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
-    [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
-    24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
-    [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
-    32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
-    35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
-    20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
-    29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
-    [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
-    31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
-    24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
-    33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
-    29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
-    20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
-    23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
-    29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
-    21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
-    23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
-    32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
-    36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
-    24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
-    22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
-    36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
-    26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
-    37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
-    32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
-    24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
-    21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
-    [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
-    25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
-    27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
-    30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
-    33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
-    37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
-    20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
-    26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
-    22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
-    35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
-    23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
-    27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
-    [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
-    36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
-    29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
-    37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
-    28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
-    29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
-    26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
-    28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
-    25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
-    [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
-    35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
-    33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
-    31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
-    20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
-    32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
-    23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
-    26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
-    33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
-    37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
-    32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
-    29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
-    35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
-    21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
-    25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
-    29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
-    33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
-    38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
-    20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
-    20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
-    23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
-    21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
-    39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
-    25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
-    36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
-    38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
-    27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
-    21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
-    36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
-    22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
-    31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
-    24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
-    24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
-    39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
-    33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
-    27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
-    29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
-    24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
-    28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
-    36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
-    25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
-    26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
-    20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
-    22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
-    20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
-    24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
-    31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
-    [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
-    37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
-    22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
-    20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
-    22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
-    36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
-    24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
-    22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
-    26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
-    31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
-    35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
-    38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
-    31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
-    28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
-    20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
-    22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
-    37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
-    37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
-    [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
-    24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
-    22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
-    24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
-    22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
-    24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
-    32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
-    30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
-    26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
-    30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
-    31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
-    39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
-    24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
-    39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
-    38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
-    27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
-    31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
-    30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
-    25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
-    30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
-    [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
-    27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
-    [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
-    31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
-    27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
-    30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
-    25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
-    22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
-    26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
-    36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
-    33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
-    21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
-    25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
-    25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
-    19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
-    38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
-    21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
-    36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
-    37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
-    24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
-    21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
-    25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
-    33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
-    40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
-    {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
-    33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
-    [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
-    27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
-    30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
-    27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
-    [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
-    24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
-    23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
-    [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
-    40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
-    37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
-    [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
-    29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
-    [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
-    24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
-    37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
-    38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
-    21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
-    26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
-    36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
-    19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
-    25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
-    31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
-    38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
-    32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
-    37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
-    21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
-    [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
-    30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
-    [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
-    20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
-    31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
-    32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
-    40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
-    20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
-    38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
-    24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
-    21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
-    24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
-    [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
-    35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
-    20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
-    24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
-    20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
-    20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
-    20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
-    20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
-    20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
-    20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
-    20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
-    20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
-    20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
-    20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
-    20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
-    20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
-    31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
-    20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
-    {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
-    20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
-    [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
-    21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
-    21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
-    36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
-    21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
-    21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
-    21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
-    21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
-    [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
-    21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
-    21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
-    21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
-    21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
-    21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
-    {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
-    21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
-    21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
-    21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
-    21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
-    22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
-    22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
-    22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
-    22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
-    22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
-    22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
-    22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
-    {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
-    22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
-    22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
-    22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
-    {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
-    22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
-    22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
-    20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
-    23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
-    {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
-    23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
-    23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
-    {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
-    [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
-    23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
-    {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
-    [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
-    23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
-    23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
-    23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
-    23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
-    23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
-    23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
-    [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
-    {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
-    24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
-    [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
-    24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
-    24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
-    24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
-    24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
-    [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
-    24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
-    24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
-    24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
-    24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
-    24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
-    24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
-    24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
-    24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
-    {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
-    24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
-    24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
-    25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
-    25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
-    25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
-    25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
-    {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
-    25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
-    25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
-    25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
-    25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
-    25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
-    25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
-    25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
-    25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
-    25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
-    {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
-    25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
-    [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
-    25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
-    26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
-    [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
-    {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
-    26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
-    26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
-    26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
-    26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
-    26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
-    26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
-    26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
-    26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
-    26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
-    26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
-    26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
-    26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
-    26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
-    26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
-    26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
-    27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
-    27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
-    27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
-    27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
-    27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
-    27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
-    27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
-    27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
-    27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
-    27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
-    27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
-    [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
-    27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
-    27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
-    27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
-    27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
-    27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
-    27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
-    28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
-    28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
-    28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
-    28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
-    28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
-    28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
-    28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
-    28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
-    28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
-    28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
-    28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
-    28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
-    28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
-    28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
-    29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
-    29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
-    29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
-    29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
-    29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
-    29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
-    {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
-    29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
-    29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
-    29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
-    29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
-    29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
-    29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
-    29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
-    29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
-    30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
-    30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
-    30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
-    30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
-    30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
-    30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
-    {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
-    30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
-    30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
-    30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
-    {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
-    30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
-    30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
-    30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
-    30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
-    30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
-    30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
-    31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
-    31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
-    31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
-    31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
-    31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
-    31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
-    31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
-    31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
-    31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
-    31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
-    31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
-    31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
-    31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
-    31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
-    31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
-    31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
-    31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
-    31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
-    32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
-    32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
-    32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
-    32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
-    32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
-    32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
-    32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
-    32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
-    {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
-    {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
-    [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
-    32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
-    32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
-    {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
-    39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
-    32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
-    32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
-    32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
-    32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
-    33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
-    33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
-    33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
-    33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
-    33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
-    33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
-    33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
-    {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
-    33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
-    33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
-    33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
-    33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
-    33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
-    33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
-    33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
-    33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
-    33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
-    33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
-    34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
-    34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
-    34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
-    34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
-    34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
-    34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
-    34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
-    34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
-    34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
-    34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
-    34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
-    34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
-    34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
-    34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
-    34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
-    34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
-    34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
-    34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
-    35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
-    35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
-    35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
-    35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
-    35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
-    {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
-    35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
-    35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
-    35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
-    35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
-    35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
-    35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
-    35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
-    35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
-    [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
-    35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
-    {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
-    {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
-    40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
-    36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
-    {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
-    {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
-    36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
-    36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
-    36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
-    36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
-    36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
-    36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
-    36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
-    36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
-    36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
-    36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
-    36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
-    37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
-    37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
-    37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
-    37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
-    37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
-    37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
-    37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
-    37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
-    37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
-    37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
-    37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
-    37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
-    37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
-    38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
-    38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
-    38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
-    {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
-    38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
-    {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
-    38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
-    38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
-    38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
-    38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
-    38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
-    {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
-    [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
-    38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
-    39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
-    39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
-    39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
-    {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
-    39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
-    {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
-    39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
-    39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
-    39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
-    {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
-    39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
-    {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
-    39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
-    {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
-    39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
-    39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
-    39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
-    39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
-    40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
-    40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
-    {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
-    40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
-    40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
-    40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
-    {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
-    40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
-    40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
-    {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
-    40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
-    {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
-    40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
-    {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
-    13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
-    {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
-    13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
-    8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
-    0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
-    194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
-    0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
-    {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
-    64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
-    39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
-    28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
-    63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
-    {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
-    194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
-    {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
-    {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
-    {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
-    65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
-    9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
-    13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
-    13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
-    13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
-    {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
-    {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
-    12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
-    12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
-    12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
-    13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
-    8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
-    9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
-    9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
-    9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
-    9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
-    20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
-    8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
-    12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
-    37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
-    [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
-    20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
-    20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
-    21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
-    21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
-    64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
-    23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
-    23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
-    24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
-    24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
-    26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
-    26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
-    64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
-    27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
-    28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
-    28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
-    28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
-    29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
-    29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
-    30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
-    31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
-    31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
-    33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
-    64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
-    35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
-    64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
-    37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
-    37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
-    37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
-    37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
-    37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
-    38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
-    {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
-    39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
-    8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
-    298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
-    {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
-    467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
-    8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
-    331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
-    {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
-    {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
-    {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
-    12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
-    {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
-    0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
-    {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
-    13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
-    {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
-    {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
-    13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
-    {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
-    {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
-    {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
-    {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
-    {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
-    {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
-    9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
-    {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
-    8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
-    9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
-    {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
-    64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
-    64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
-    64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
-    64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
-    24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
-    64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
-    64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
-    37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
-    37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
-    11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
-    171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
-    11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
-    23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
-    29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
-    0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
-    {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
-    [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
-    131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
-    {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
-    [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
-    {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
-    194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
-    20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
-    13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
-    0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
-    63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
-    194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
-    23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
-    26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
-    {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
-    30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
-    11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
-    [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
-    34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
-    0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
-    {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
-    19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
-    20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
-    20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
-    20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
-    20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
-    20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
-    [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
-    {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
-    21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
-    21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
-    21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
-    22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
-    22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
-    22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
-    22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
-    22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
-    23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
-    23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
-    {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
-    23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
-    23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
-    24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
-    24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
-    [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
-    [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
-    24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
-    24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
-    25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
-    25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
-    25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
-    {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
-    25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
-    26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
-    26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
-    26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
-    26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
-    26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
-    27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
-    27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
-    27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
-    [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
-    27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
-    27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
-    28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
-    28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
-    28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
-    [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
-    28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
-    29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
-    29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
-    29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
-    29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
-    29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
-    29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
-    29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
-    29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
-    [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
-    30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
-    30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
-    {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
-    30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
-    30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
-    31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
-    31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
-    31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
-    31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
-    31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
-    31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
-    31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
-    32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
-    32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
-    32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
-    32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
-    32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
-    32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
-    33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
-    33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
-    33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
-    33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
-    34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
-    34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
-    34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
-    34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
-    [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
-    {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
-    35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
-    35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
-    35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
-    36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
-    36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
-    36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
-    36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
-    37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
-    37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
-    37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
-    {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
-    37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
-    37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
-    38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
-    38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
-    38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
-    38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
-    39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
-    39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
-    {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
-    39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
-    39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
-    40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
-    40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
-    40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
-    40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
-    40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
-    28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
-    20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
-    29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
-    0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
-    13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
-    {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
-    {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
-    {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
-    474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
-    351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
-    344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
-    369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
-    625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
-    626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
-    608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
-    673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
-    0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
-    820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
-    {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
-    704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
-    {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
-    {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
-    {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
-    9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
-    {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
-    {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
-    20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
-    20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
-    21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
-    22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
-    22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
-    23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
-    138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
-    24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
-    24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
-    25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
-    26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
-    26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
-    144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
-    27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
-    27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
-    27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
-    28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
-    28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
-    29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
-    29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
-    30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
-    30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
-    152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
-    31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
-    31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
-    31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
-    32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
-    {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
-    33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
-    33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
-    33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
-    34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
-    34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
-    34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
-    35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
-    36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
-    36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
-    {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
-    37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
-    37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
-    18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
-    38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
-    39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
-    39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
-    40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
-    40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
-    13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
-    20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
-    20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
-    20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
-    131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
-    131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
-    20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
-    21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
-    133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
-    133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
-    {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
-    21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
-    21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
-    13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
-    21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
-    135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
-    22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
-    22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
-    22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
-    22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
-    22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
-    136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
-    22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
-    {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
-    158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
-    22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
-    23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
-    23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
-    23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
-    {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
-    23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
-    138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
-    23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
-    23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
-    23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
-    24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
-    {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
-    24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
-    24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
-    24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
-    24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
-    141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
-    141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
-    142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
-    {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
-    25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
-    {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
-    25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
-    25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
-    25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
-    26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
-    143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
-    26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
-    144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
-    26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
-    26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
-    26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
-    26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
-    26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
-    {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
-    26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
-    27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
-    27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
-    27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
-    27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
-    145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
-    27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
-    {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
-    27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
-    27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
-    {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
-    {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
-    146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
-    28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
-    {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
-    28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
-    28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
-    15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
-    28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
-    28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
-    28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
-    29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
-    29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
-    29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
-    29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
-    29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
-    29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
-    29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
-    150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
-    29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
-    150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
-    {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
-    {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
-    30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
-    {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
-    151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
-    30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
-    151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
-    30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
-    30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
-    30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
-    30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
-    31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
-    16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
-    31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
-    31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
-    31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
-    31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
-    31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
-    31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
-    155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
-    155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
-    155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
-    32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
-    32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
-    32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
-    32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
-    {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
-    32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
-    32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
-    157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
-    17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
-    33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
-    157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
-    33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
-    158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
-    33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
-    33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
-    {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
-    33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
-    33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
-    17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
-    34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
-    {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
-    34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
-    34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
-    160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
-    {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
-    34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
-    34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
-    160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
-    34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
-    34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
-    34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
-    35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
-    35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
-    35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
-    35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
-    35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
-    162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
-    35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
-    36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
-    {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
-    36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
-    36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
-    64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
-    165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
-    37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
-    37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
-    {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
-    {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
-    37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
-    37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
-    {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
-    166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
-    37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
-    37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
-    37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
-    167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
-    167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
-    38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
-    38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
-    38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
-    169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
-    39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
-    {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
-    {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
-    39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
-    39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
-    39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
-    39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
-    39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
-    {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
-    39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
-    {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
-    171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
-    {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
-    40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
-    40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
-    40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
-    40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
-    40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
-    40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
-    40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
-    19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
-    20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
-    20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
-    {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
-    20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
-    {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
-    21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
-    21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
-    21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
-    21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
-    21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
-    21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
-    22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
-    22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
-    22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
-    22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
-    22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
-    22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
-    23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
-    23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
-    23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
-    24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
-    24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
-    24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
-    25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
-    25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
-    25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
-    {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
-    25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
-    25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
-    26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
-    26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
-    26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
-    27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
-    27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
-    27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
-    28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
-    {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
-    28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
-    29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
-    29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
-    29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
-    30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
-    30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
-    30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
-    30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
-    {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
-    30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
-    30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
-    31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
-    31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
-    31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
-    {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
-    32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
-    32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
-    32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
-    {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
-    33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
-    33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
-    33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
-    33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
-    33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
-    34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
-    34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
-    34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
-    34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
-    35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
-    35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
-    35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
-    35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
-    36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
-    36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
-    36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
-    36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
-    36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
-    36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
-    36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
-    37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
-    37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
-    {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
-    37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
-    37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
-    38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
-    38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
-    38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
-    38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
-    39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
-    39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
-    39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
-    39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
-    40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
-    40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
-    {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
-    151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
-    {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
-    {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
-    0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
-    15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
-    162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
-    63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
-    38315, 38741, 171581, 173594],
-  'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
-    {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
-    8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
-    {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
-    {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
-    8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
-    9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
-    {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
-    {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
-    {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
-    730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
-    9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
-    9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
-    9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
-    8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
-    13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
-    {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
-    {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
-    9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
-    9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
-    9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
-    9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
-    {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
-    {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
-    {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
-    13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
-    {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
-    8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
-    13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
-    198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
-    {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
-    {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
-    312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
-    {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
-    {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
-    1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
-    {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
-    {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
-    44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
-    44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
-    {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
-    {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
-    44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
-    44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
-    44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
-    {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
-    44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
-    {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
-    {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
-    {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
-    44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
-    44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
-    {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
-    44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
-    44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
-    {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
-    {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
-    {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
-    {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
-    {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
-    {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
-    {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
-    {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
-    45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
-    45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
-    45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
-    {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
-    {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
-    {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
-    {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
-    {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
-    {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
-    {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
-    45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
-    45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
-    45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
-    {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
-    45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
-    {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
-    {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
-    {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
-    45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
-    {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
-    {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
-    {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
-    {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
-    45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
-    {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
-    46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
-    {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
-    {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
-    46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
-    {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
-    46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
-    {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
-    {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
-    {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
-    {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
-    {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
-    46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
-    46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
-    {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
-    {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
-    46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
-    46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
-    {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
-    {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
-    {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
-    {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
-    47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
-    47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
-    {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
-    {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
-    47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
-    {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
-    {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
-    {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
-    47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
-    {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
-    {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
-    47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
-    47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
-    47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
-    47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
-    {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
-    47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
-    {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
-    47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
-    48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
-    {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
-    {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
-    {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
-    {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
-    48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
-    {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
-    48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
-    {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
-    48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
-    {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
-    {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
-    48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
-    48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
-    {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
-    {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
-    {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
-    {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
-    {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
-    {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
-    {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
-    49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
-    {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
-    49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
-    {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
-    {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
-    {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
-    {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
-    {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
-    {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
-    {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
-    49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
-    49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
-    49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
-    {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
-    {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
-    {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
-    49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
-    49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
-    49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
-    49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
-    {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
-    {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
-    50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
-    {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
-    {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
-    {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
-    50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
-    50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
-    {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
-    {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
-    {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
-    {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
-    {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
-    50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
-    {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
-    {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
-    {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
-    {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
-    {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
-    {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
-    {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
-    50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
-    {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
-    {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
-    {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
-    {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
-    50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
-    50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
-    51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
-    51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
-    {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
-    {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
-    {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
-    51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
-    {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
-    {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
-    {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
-    {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
-    51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
-    {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
-    {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
-    51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
-    51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
-    {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
-    51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
-    {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
-    {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
-    {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
-    {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
-    {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
-    {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
-    {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
-    52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
-    {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
-    {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
-    {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
-    52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
-    {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
-    {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
-    {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
-    52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
-    52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
-    52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
-    52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
-    52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
-    {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
-    52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
-    {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
-    {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
-    {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
-    53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
-    {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
-    {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
-    53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
-    53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
-    {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
-    {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
-    53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
-    {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
-    53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
-    {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
-    {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
-    53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
-    {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
-    53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
-    53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
-    {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
-    {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
-    53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
-    {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
-    {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
-    {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
-    54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
-    54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
-    {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
-    {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
-    54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
-    54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
-    54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
-    54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
-    {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
-    {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
-    {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
-    54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
-    54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
-    {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
-    54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
-    {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
-    54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
-    54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
-    {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
-    55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
-    {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
-    {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
-    55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
-    55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
-    {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
-    21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
-    29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
-    36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
-    29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
-    23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
-    30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
-    35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
-    34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
-    26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
-    {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
-    22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
-    30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
-    37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
-    24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
-    33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
-    21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
-    36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
-    24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
-    26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
-    24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
-    35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
-    [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
-    32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
-    20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
-    24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
-    28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
-    32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
-    38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
-    23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
-    31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
-    21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
-    25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
-    32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
-    35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
-    26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
-    26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
-    20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
-    25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
-    [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
-    36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
-    23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
-    35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
-    21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
-    37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
-    25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
-    21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
-    30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
-    39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
-    [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
-    24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
-    27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
-    32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
-    36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
-    [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
-    21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
-    23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
-    21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
-    36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
-    36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
-    31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
-    30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
-    26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
-    29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
-    25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
-    37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
-    30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
-    22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
-    24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
-    27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
-    30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
-    32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
-    37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
-    21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
-    [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
-    25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
-    20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
-    [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
-    25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
-    [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
-    [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
-    [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
-    [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
-    27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
-    37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
-    26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
-    35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
-    22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
-    20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
-    25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
-    24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
-    23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
-    26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
-    31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
-    37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
-    31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
-    28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
-    21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
-    31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
-    31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
-    36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
-    37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
-    [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
-    [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
-    [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
-    [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
-    [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
-    27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
-    [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
-    [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
-    [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
-    [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
-    [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
-    [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
-    [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
-    [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
-    [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
-    [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
-    [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
-    [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
-    [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
-    [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
-    [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
-    28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
-    [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
-    31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
-    [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
-    28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
-    25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
-    [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
-    [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
-    [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
-    [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
-    [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
-    [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
-    [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
-    [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
-    [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
-    [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
-    [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
-    [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
-    [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
-    [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
-    [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
-    [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
-    32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
-    [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
-    [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
-    [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
-    [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
-    [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
-    [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
-    [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
-    [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
-    [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
-    38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
-    29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
-    24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
-    24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
-    34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
-    38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
-    33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
-    27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
-    39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
-    35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
-    [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
-    26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
-    40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
-    26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
-    [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
-    27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
-    26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
-    29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
-    25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
-    32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
-    20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
-    34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
-    23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
-    [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
-    24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
-    38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
-    27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
-    36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
-    26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
-    [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
-    25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
-    20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
-    [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
-    33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
-    20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
-    32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
-    20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
-    29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
-    38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
-    27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
-    34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
-    30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
-    26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
-    20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
-    29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
-    [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
-    35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
-    22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
-    34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
-    21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
-    24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
-    [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
-    36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
-    40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
-    24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
-    36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
-    32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
-    24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
-    {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
-    32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
-    36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
-    24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
-    36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
-    20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
-    [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
-    24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
-    28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
-    32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
-    36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
-    21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
-    37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
-    26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
-    20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
-    24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
-    [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
-    36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
-    [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
-    24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
-    26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
-    34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
-    [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
-    28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
-    21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
-    29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
-    34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
-    23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
-    [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
-    36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
-    24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
-    32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
-    31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
-    24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
-    28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
-    32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
-    39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
-    23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
-    24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
-    37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
-    23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
-    25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
-    29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
-    32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
-    35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
-    {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
-    22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
-    33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
-    27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
-    34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
-    36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
-    [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
-    25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
-    [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
-    26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
-    35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
-    24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
-    36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
-    24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
-    33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
-    22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
-    28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
-    [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
-    [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
-    40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
-    [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
-    23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
-    26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
-    33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
-    27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
-    30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
-    38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
-    25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
-    33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
-    26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
-    [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
-    28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
-    25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
-    23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
-    20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
-    33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
-    32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
-    25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
-    28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
-    36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
-    28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
-    [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
-    27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
-    29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
-    20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
-    34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
-    20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
-    23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
-    28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
-    29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
-    20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
-    28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
-    23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
-    32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
-    24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
-    23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
-    23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
-    31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
-    36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
-    20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
-    28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
-    37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
-    23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
-    30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
-    36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
-    26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
-    28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
-    39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
-    23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
-    29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
-    [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
-    23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
-    33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
-    20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
-    24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
-    {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
-    30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
-    36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
-    [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
-    37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
-    24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
-    38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
-    33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
-    27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
-    35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
-    24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
-    [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
-    28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
-    21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
-    33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
-    [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
-    24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
-    33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
-    23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
-    30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
-    38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
-    33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
-    26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
-    22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
-    27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
-    33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
-    [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
-    26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
-    29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
-    25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
-    32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
-    38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
-    30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
-    [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
-    20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
-    24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
-    [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
-    35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
-    39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
-    21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
-    25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
-    24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
-    26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
-    28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
-    31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
-    37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
-    21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
-    33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
-    [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
-    25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
-    28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
-    31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
-    35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
-    26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
-    20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
-    32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
-    24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
-    21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
-    27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
-    32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
-    36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
-    20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
-    30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
-    34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
-    25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
-    21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
-    26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
-    31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
-    35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
-    21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
-    28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
-    32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
-    [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
-    23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
-    36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
-    38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
-    24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
-    25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
-    29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
-    39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
-    22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
-    21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
-    27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
-    20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
-    37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
-    20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
-    30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
-    25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
-    36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
-    28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
-    30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
-    30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
-    35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
-    36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
-    26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
-    32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
-    37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
-    26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
-    34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
-    27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
-    37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
-    30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
-    36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
-    34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
-    23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
-    40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
-    23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
-    31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
-    [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
-    23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
-    31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
-    25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
-    22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
-    37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
-    35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
-    23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
-    27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
-    25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
-    31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
-    22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
-    24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
-    32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
-    36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
-    25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
-    28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
-    31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
-    33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
-    38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
-    24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
-    33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
-    [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
-    27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
-    31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
-    [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
-    29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
-    20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
-    36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
-    24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
-    38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
-    28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
-    38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
-    26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
-    21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
-    35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
-    26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
-    38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
-    27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
-    [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
-    [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
-    34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
-    [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
-    33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
-    27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
-    34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
-    26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
-    22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
-    28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
-    29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
-    34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
-    23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
-    24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
-    21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
-    33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
-    20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
-    28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
-    29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
-    {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
-    31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
-    24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
-    28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
-    23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
-    28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
-    21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
-    21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
-    [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
-    24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
-    28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
-    33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
-    35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
-    20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
-    25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
-    35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
-    {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
-    {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
-    {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
-    8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
-    8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
-    0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
-    {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
-    {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
-    8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
-    0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
-    {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
-    9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
-    {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
-    8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
-    {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
-    8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
-    {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
-    0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
-    {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
-    {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
-    44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
-    {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
-    {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
-    {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
-    {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
-    {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
-    44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
-    {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
-    {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
-    {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
-    {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
-    44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
-    {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
-    {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
-    {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
-    {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
-    {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
-    {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
-    {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
-    {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
-    {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
-    44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
-    {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
-    {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
-    {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
-    {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
-    {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
-    {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
-    {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
-    {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
-    {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
-    {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
-    {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
-    {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
-    {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
-    {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
-    {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
-    {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
-    {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
-    {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
-    {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
-    {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
-    45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
-    {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
-    {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
-    {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
-    {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
-    {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
-    {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
-    {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
-    {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
-    {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
-    45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
-    {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
-    {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
-    {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
-    45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
-    {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
-    {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
-    {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
-    {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
-    {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
-    {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
-    {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
-    {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
-    {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
-    {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
-    46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
-    {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
-    {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
-    {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
-    46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
-    {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
-    {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
-    {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
-    {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
-    {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
-    {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
-    {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
-    {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
-    {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
-    {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
-    {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
-    {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
-    {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
-    {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
-    {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
-    {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
-    {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
-    {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
-    {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
-    {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
-    {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
-    {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
-    47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
-    {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
-    47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
-    {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
-    {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
-    {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
-    {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
-    {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
-    {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
-    47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
-    {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
-    {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
-    {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
-    {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
-    {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
-    47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
-    {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
-    {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
-    {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
-    {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
-    {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
-    {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
-    47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
-    {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
-    {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
-    {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
-    {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
-    {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
-    {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
-    {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
-    {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
-    {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
-    {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
-    {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
-    {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
-    {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
-    {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
-    {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
-    {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
-    {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
-    {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
-    {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
-    {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
-    {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
-    48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
-    {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
-    {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
-    {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
-    {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
-    {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
-    {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
-    {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
-    {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
-    {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
-    {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
-    {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
-    {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
-    {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
-    {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
-    {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
-    {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
-    {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
-    {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
-    {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
-    {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
-    {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
-    {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
-    {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
-    49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
-    49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
-    {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
-    {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
-    {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
-    {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
-    {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
-    {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
-    {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
-    {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
-    {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
-    49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
-    {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
-    {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
-    {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
-    {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
-    49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
-    {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
-    {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
-    {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
-    {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
-    {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
-    {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
-    {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
-    49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
-    {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
-    {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
-    {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
-    {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
-    {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
-    {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
-    {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
-    {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
-    {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
-    {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
-    {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
-    {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
-    50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
-    {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
-    {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
-    {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
-    {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
-    {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
-    {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
-    {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
-    50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
-    {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
-    {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
-    {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
-    {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
-    {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
-    {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
-    {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
-    {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
-    50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
-    {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
-    {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
-    {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
-    {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
-    {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
-    {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
-    {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
-    {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
-    {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
-    {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
-    51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
-    {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
-    {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
-    {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
-    {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
-    {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
-    {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
-    51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
-    {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
-    {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
-    {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
-    {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
-    {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
-    {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
-    {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
-    {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
-    {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
-    {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
-    {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
-    {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
-    {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
-    51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
-    {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
-    {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
-    {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
-    {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
-    {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
-    51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
-    {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
-    {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
-    {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
-    {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
-    {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
-    {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
-    {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
-    {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
-    {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
-    {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
-    {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
-    52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
-    {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
-    {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
-    {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
-    52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
-    {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
-    {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
-    {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
-    52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
-    {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
-    {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
-    {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
-    {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
-    {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
-    52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
-    {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
-    {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
-    {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
-    {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
-    {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
-    {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
-    {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
-    {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
-    {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
-    {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
-    {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
-    53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
-    {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
-    {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
-    {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
-    {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
-    {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
-    {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
-    {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
-    {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
-    {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
-    {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
-    {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
-    {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
-    {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
-    {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
-    {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
-    53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
-    {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
-    {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
-    {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
-    {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
-    {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
-    {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
-    {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
-    {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
-    {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
-    {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
-    54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
-    {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
-    {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
-    {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
-    {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
-    54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
-    {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
-    {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
-    {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
-    {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
-    {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
-    {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
-    {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
-    54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
-    {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
-    {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
-    {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
-    54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
-    {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
-    {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
-    {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
-    {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
-    {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
-    {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
-    {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
-    {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
-    {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
-    {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
-    {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
-    54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
-    {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
-    {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
-    55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
-    {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
-    {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
-    {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
-    {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
-    55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
-    55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
-    {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
-    {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
-    {f: 6, c: 55198}],
-  'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
-    8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
-    183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
-    {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
-    {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
-    {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
-    {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
-    {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
-    65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
-    9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
-    {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
-    65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
-    8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
-    8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
-    9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
-    0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
-    8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
-    {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
-    [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
-    [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
-    9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
-    9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
-    9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
-    {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
-    {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
-    {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
-    [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
-    [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
-    [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
-    [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
-    [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
-    [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
-    [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
-    [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
-    [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
-    [12057, 21353, 63192], [12059, 21430, 63193],
-    [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
-    [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
-    [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
-    [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
-    [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
-    9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
-    [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
-    [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
-    [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
-    19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
-    20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
-    [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
-    [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
-    [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
-    [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
-    [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
-    19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
-    20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
-    {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
-    20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
-    21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
-    22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
-    24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
-    [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
-    [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
-    [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
-    [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
-    [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
-    [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
-    [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
-    20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
-    {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
-    {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
-    21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
-    21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
-    21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
-    22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
-    24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
-    {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
-    {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
-    27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
-    [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
-    [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
-    [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
-    [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
-    [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
-    20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
-    {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
-    20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
-    {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
-    {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
-    21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
-    22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
-    {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
-    {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
-    24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
-    {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
-    {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
-    27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
-    27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
-    [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
-    [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
-    [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
-    {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
-    [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
-    [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
-    [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
-    20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
-    20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
-    20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
-    {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
-    {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
-    21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
-    21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
-    21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
-    22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
-    22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
-    22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
-    {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
-    24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
-    24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
-    25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
-    25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
-    25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
-    26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
-    27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
-    27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
-    27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
-    28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
-    {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
-    32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
-    33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
-    [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
-    [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
-    [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
-    24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
-    [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
-    20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
-    20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
-    20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
-    20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
-    21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
-    21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
-    21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
-    21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
-    22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
-    {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
-    22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
-    23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
-    23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
-    24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
-    {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
-    24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
-    24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
-    25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
-    25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
-    [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
-    {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
-    26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
-    26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
-    26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
-    26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
-    27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
-    27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
-    27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
-    27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
-    29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
-    29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
-    30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
-    31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
-    32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
-    33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
-    33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
-    34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
-    [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
-    38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
-    [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
-    20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
-    20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
-    20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
-    21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
-    21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
-    21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
-    22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
-    22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
-    23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
-    23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
-    24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
-    24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
-    24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
-    24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
-    25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
-    25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
-    26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
-    26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
-    26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
-    26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
-    27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
-    {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
-    27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
-    28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
-    29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
-    30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
-    {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
-    30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
-    31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
-    31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
-    32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
-    32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
-    33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
-    33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
-    33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
-    35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
-    36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
-    36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
-    {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
-    [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
-    [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
-    20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
-    20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
-    20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
-    20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
-    20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
-    21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
-    21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
-    21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
-    22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
-    23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
-    23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
-    23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
-    24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
-    24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
-    24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
-    25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
-    25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
-    26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
-    26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
-    26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
-    26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
-    27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
-    28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
-    28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
-    28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
-    29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
-    30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
-    30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
-    {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
-    30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
-    31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
-    31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
-    32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
-    32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
-    32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
-    33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
-    33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
-    33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
-    33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
-    34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
-    34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
-    35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
-    36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
-    36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
-    37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
-    38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
-    [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
-    [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
-    20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
-    20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
-    21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
-    21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
-    21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
-    21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
-    22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
-    23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
-    23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
-    {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
-    23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
-    {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
-    24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
-    24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
-    24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
-    {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
-    25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
-    25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
-    25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
-    25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
-    26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
-    26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
-    26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
-    27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
-    28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
-    28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
-    28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
-    28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
-    29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
-    29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
-    {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
-    30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
-    30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
-    31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
-    31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
-    32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
-    32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
-    33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
-    33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
-    {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
-    34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
-    34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
-    35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
-    36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
-    36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
-    36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
-    37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
-    38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
-    31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
-    [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
-    20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
-    21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
-    21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
-    21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
-    21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
-    22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
-    [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
-    23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
-    24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
-    24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
-    24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
-    24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
-    25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
-    {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
-    25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
-    26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
-    26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
-    26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
-    26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
-    {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
-    28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
-    28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
-    28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
-    {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
-    29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
-    29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
-    {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
-    30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
-    30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
-    31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
-    31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
-    32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
-    32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
-    33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
-    33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
-    33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
-    33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
-    34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
-    35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
-    35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
-    36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
-    36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
-    36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
-    37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
-    37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
-    38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
-    38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
-    38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
-    [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
-    {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
-    21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
-    21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
-    21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
-    22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
-    22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
-    23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
-    24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
-    24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
-    {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
-    25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
-    26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
-    26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
-    26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
-    27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
-    28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
-    28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
-    29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
-    29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
-    29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
-    30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
-    {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
-    30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
-    30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
-    31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
-    31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
-    32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
-    32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
-    {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
-    33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
-    33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
-    34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
-    35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
-    {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
-    35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
-    35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
-    36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
-    36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
-    36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
-    36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
-    37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
-    37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
-    {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
-    {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
-    {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
-    [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
-    20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
-    21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
-    22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
-    22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
-    22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
-    23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
-    23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
-    24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
-    24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
-    25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
-    25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
-    27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
-    27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
-    28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
-    28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
-    28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
-    29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
-    29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
-    30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
-    30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
-    31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
-    [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
-    {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
-    32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
-    32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
-    33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
-    33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
-    33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
-    34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
-    35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
-    35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
-    36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
-    36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
-    36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
-    37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
-    38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
-    38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
-    39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
-    40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
-    20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
-    {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
-    22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
-    22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
-    23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
-    {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
-    24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
-    24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
-    24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
-    25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
-    25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
-    {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
-    27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
-    27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
-    28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
-    28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
-    29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
-    30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
-    30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
-    30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
-    31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
-    31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
-    32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
-    32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
-    34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
-    34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
-    34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
-    35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
-    35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
-    35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
-    {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
-    36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
-    36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
-    36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
-    37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
-    37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
-    38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
-    39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
-    {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
-    40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
-    20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
-    22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
-    22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
-    23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
-    25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
-    25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
-    26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
-    27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
-    27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
-    28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
-    29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
-    29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
-    30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
-    31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
-    31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
-    32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
-    {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
-    {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
-    34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
-    35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
-    35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
-    35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
-    36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
-    36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
-    37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
-    37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
-    38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
-    38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
-    39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
-    39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
-    [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
-    22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
-    23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
-    24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
-    25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
-    {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
-    27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
-    28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
-    28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
-    29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
-    29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
-    30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
-    31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
-    31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
-    32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
-    32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
-    33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
-    33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
-    34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
-    34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
-    35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
-    35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
-    36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
-    36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
-    37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
-    37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
-    38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
-    39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
-    40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
-    25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
-    26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
-    27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
-    {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
-    30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
-    {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
-    31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
-    32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
-    34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
-    35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
-    36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
-    37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
-    37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
-    38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
-    38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
-    39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
-    39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
-    22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
-    25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
-    28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
-    29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
-    31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
-    32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
-    33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
-    34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
-    35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
-    36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
-    37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
-    37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
-    38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
-    39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
-    40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
-    22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
-    25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
-    29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
-    31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
-    33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
-    {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
-    35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
-    37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
-    39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
-    40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
-    25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
-    29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
-    34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
-    35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
-    37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
-    38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
-    39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
-    40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
-    23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
-    29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
-    33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
-    37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
-    39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
-    40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
-    25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
-    32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
-    37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
-    39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
-    28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
-    35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
-    38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
-    {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
-    34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
-    40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
-    36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
-    38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
-    [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
-    [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
-    20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
-    22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
-    [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
-    21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
-    23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
-    27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
-    32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
-    20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
-    21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
-    22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
-    22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
-    [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
-    25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
-    26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
-    27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
-    28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
-    [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
-    37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
-    20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
-    20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
-    21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
-    21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
-    21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
-    22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
-    22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
-    23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
-    24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
-    24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
-    24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
-    {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
-    25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
-    26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
-    {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
-    27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
-    27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
-    29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
-    {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
-    33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
-    [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
-    38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
-    20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
-    20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
-    20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
-    21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
-    21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
-    21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
-    22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
-    {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
-    22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
-    22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
-    23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
-    23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
-    24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
-    24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
-    24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
-    24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
-    25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
-    26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
-    26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
-    26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
-    26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
-    27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
-    27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
-    27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
-    27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
-    28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
-    29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
-    29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
-    30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
-    30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
-    31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
-    33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
-    33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
-    34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
-    36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
-    38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
-    20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
-    20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
-    21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
-    21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
-    21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
-    22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
-    22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
-    23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
-    23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
-    23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
-    23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
-    24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
-    24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
-    24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
-    25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
-    25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
-    25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
-    26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
-    26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
-    26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
-    26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
-    26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
-    27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
-    27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
-    27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
-    27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
-    28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
-    {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
-    29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
-    29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
-    29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
-    30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
-    30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
-    30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
-    31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
-    {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
-    {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
-    32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
-    32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
-    33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
-    33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
-    34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
-    35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
-    37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
-    38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
-    20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
-    20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
-    20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
-    {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
-    21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
-    21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
-    {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
-    22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
-    23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
-    23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
-    23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
-    24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
-    24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
-    25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
-    25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
-    25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
-    25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
-    {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
-    26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
-    26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
-    26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
-    27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
-    27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
-    28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
-    28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
-    28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
-    28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
-    28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
-    29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
-    29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
-    29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
-    30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
-    30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
-    30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
-    30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
-    31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
-    31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
-    31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
-    31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
-    32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
-    32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
-    33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
-    33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
-    33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
-    33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
-    33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
-    34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
-    34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
-    34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
-    34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
-    36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
-    36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
-    37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
-    37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
-    20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
-    20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
-    {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
-    21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
-    21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
-    21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
-    21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
-    22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
-    22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
-    22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
-    [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
-    23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
-    23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
-    23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
-    23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
-    23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
-    24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
-    {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
-    24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
-    25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
-    25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
-    25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
-    26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
-    {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
-    26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
-    26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
-    26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
-    {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
-    28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
-    28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
-    28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
-    28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
-    28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
-    28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
-    29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
-    29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
-    29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
-    30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
-    30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
-    30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
-    31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
-    31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
-    31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
-    31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
-    32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
-    {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
-    32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
-    33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
-    33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
-    33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
-    33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
-    33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
-    33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
-    34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
-    {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
-    34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
-    34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
-    35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
-    36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
-    {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
-    37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
-    37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
-    37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
-    38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
-    20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
-    20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
-    21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
-    21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
-    21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
-    22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
-    22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
-    23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
-    23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
-    23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
-    23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
-    23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
-    23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
-    24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
-    24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
-    24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
-    25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
-    25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
-    25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
-    25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
-    26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
-    26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
-    26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
-    26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
-    26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
-    {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
-    26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
-    27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
-    28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
-    28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
-    28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
-    28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
-    {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
-    28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
-    {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
-    29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
-    29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
-    29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
-    30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
-    30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
-    {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
-    30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
-    31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
-    31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
-    32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
-    32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
-    {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
-    33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
-    {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
-    [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
-    33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
-    33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
-    [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
-    33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
-    33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
-    34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
-    34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
-    34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
-    {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
-    {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
-    35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
-    36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
-    36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
-    {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
-    36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
-    37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
-    37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
-    37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
-    37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
-    38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
-    38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
-    20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
-    20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
-    {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
-    [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
-    21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
-    22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
-    22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
-    23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
-    23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
-    23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
-    24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
-    24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
-    24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
-    25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
-    25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
-    25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
-    25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
-    26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
-    26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
-    26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
-    26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
-    26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
-    26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
-    27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
-    28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
-    28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
-    28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
-    28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
-    29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
-    28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
-    29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
-    29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
-    29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
-    29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
-    30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
-    30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
-    30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
-    30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
-    30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
-    31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
-    31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
-    31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
-    32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
-    32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
-    {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
-    33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
-    33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
-    33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
-    33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
-    33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
-    33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
-    33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
-    33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
-    34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
-    35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
-    35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
-    35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
-    35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
-    {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
-    36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
-    36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
-    {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
-    37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
-    37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
-    37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
-    37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
-    37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
-    38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
-    {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
-    39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
-    20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
-    20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
-    22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
-    22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
-    22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
-    22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
-    23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
-    23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
-    23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
-    23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
-    24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
-    24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
-    24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
-    25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
-    25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
-    25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
-    26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
-    27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
-    27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
-    27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
-    27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
-    {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
-    28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
-    28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
-    28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
-    28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
-    29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
-    29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
-    29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
-    30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
-    30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
-    30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
-    {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
-    31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
-    31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
-    31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
-    32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
-    32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
-    32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
-    32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
-    33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
-    33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
-    33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
-    34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
-    33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
-    34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
-    34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
-    34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
-    35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
-    35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
-    35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
-    36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
-    {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
-    37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
-    37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
-    37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
-    37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
-    37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
-    38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
-    {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
-    39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
-    {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
-    20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
-    20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
-    22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
-    22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
-    22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
-    23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
-    23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
-    24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
-    24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
-    25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
-    25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
-    25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
-    {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
-    27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
-    27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
-    27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
-    27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
-    27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
-    28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
-    28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
-    28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
-    28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
-    29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
-    29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
-    29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
-    29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
-    30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
-    30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
-    30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
-    31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
-    31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
-    31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
-    32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
-    32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
-    33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
-    33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
-    34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
-    34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
-    34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
-    {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
-    34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
-    34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
-    34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
-    34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
-    {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
-    35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
-    35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
-    35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
-    36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
-    36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
-    36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
-    {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
-    {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
-    {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
-    37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
-    37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
-    37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
-    38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
-    38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
-    38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
-    {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
-    39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
-    39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
-    39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
-    40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
-    {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
-    22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
-    22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
-    23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
-    23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
-    23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
-    24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
-    25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
-    24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
-    25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
-    {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
-    27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
-    27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
-    27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
-    27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
-    27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
-    28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
-    28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
-    29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
-    29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
-    {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
-    29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
-    30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
-    30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
-    30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
-    {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
-    31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
-    31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
-    {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
-    32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
-    32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
-    32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
-    33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
-    34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
-    34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
-    34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
-    34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
-    34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
-    34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
-    35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
-    {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
-    35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
-    36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
-    36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
-    36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
-    37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
-    37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
-    37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
-    37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
-    37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
-    38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
-    38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
-    38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
-    39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
-    39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
-    39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
-    40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
-    40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
-    40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
-    {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
-    22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
-    23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
-    25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
-    25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
-    27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
-    27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
-    27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
-    28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
-    29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
-    29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
-    29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
-    30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
-    {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
-    31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
-    31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
-    31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
-    31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
-    32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
-    32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
-    33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
-    34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
-    34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
-    34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
-    34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
-    34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
-    34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
-    35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
-    {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
-    35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
-    35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
-    36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
-    37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
-    37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
-    37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
-    37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
-    38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
-    38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
-    38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
-    39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
-    39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
-    39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
-    39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
-    40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
-    {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
-    40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
-    [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
-    22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
-    25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
-    25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
-    26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
-    27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
-    28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
-    [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
-    29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
-    30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
-    {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
-    31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
-    31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
-    32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
-    33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
-    34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
-    34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
-    34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
-    34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
-    35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
-    35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
-    35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
-    35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
-    36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
-    {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
-    37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
-    37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
-    37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
-    38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
-    38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
-    38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
-    39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
-    39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
-    39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
-    39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
-    40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
-    40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
-    40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
-    {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
-    {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
-    25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
-    27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
-    27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
-    28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
-    29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
-    {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
-    31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
-    32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
-    32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
-    33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
-    34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
-    34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
-    34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
-    {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
-    35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
-    35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
-    {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
-    36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
-    37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
-    37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
-    37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
-    38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
-    {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
-    39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
-    39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
-    39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
-    39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
-    39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
-    {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
-    40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
-    40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
-    22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
-    {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
-    {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
-    {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
-    28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
-    29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
-    {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
-    31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
-    31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
-    33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
-    34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
-    34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
-    35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
-    36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
-    37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
-    37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
-    37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
-    38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
-    39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
-    39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
-    39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
-    39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
-    39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
-    40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
-    40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
-    40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
-    40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
-    24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
-    {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
-    29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
-    31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
-    32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
-    34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
-    34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
-    35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
-    36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
-    37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
-    38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
-    39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
-    39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
-    39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
-    40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
-    40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
-    40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
-    40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
-    24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
-    {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
-    29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
-    31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
-    {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
-    34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
-    35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
-    36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
-    {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
-    39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
-    39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
-    39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
-    40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
-    40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
-    40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
-    24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
-    {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
-    30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
-    34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
-    35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
-    37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
-    39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
-    40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
-    40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
-    40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
-    40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
-    23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
-    29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
-    33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
-    {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
-    38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
-    40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
-    40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
-    {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
-    28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
-    32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
-    35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
-    37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
-    40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
-    40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
-    38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
-    40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
-    34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
-    39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
-    25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
-    40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
-    {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
-    65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
-    [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
-    [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
-    [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
-    [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
-    [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
-    [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
-    [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
-    [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
-    [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
-    [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
-    [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
-    [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
-    [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
-    [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
-    [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
-    [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
-    [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
-    [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
-    [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
-    [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
-    [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
-    [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
-    [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
-    [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
-    [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
-    [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
-    [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
-    [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
-    [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
-    [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
-    [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
-    [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
-    [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
-    [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
-    [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
-    [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
-    [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
-    [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
-    [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
-    [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
-    [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
-    [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
-    [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
-    [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
-    [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
-    [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
-    [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
-    [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
-    [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
-    [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
-    [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
-    [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
-    [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
-    [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
-    [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
-    [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
-    [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
-    [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
-    [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
-    [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
-    [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
-    {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
-    [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
-    [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
-    9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
-    9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
-    {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
-    [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
-    [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
-    [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
-    [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
-    [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
-    [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
-    [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
-    [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
-    [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
-    [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
-    [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
-    [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
-    [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
-    [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
-    [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
-    [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
-    [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
-    [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
-    [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
-    [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
-    [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
-    [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
-    [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
-    [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
-    [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
-    [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
-    [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
-    [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
-    [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
-    [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
-    [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
-    [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
-    [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
-    [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
-    [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
-    [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
-    [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
-    [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
-    [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
-    [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
-    [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
-    [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
-    [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
-    [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
-    [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
-    [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
-    [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
-    [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
-    [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
-    [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
-    [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
-    [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
-    [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
-    [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
-    [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
-    [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
-    [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
-    [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
-    [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
-    [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
-    [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
-    [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
-    [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
-    [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
-    [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
-    [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
-    [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
-    [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
-    [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
-    [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
-    [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
-    [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
-    [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
-    [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
-    [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
-    [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
-    [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
-    [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
-    [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
-    [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
-    [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
-    [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
-    [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
-    [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
-    [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
-    [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
-    [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
-    [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
-    [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
-    [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
-    [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
-    [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
-    [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
-    [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
-    [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
-    [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
-    [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
-    [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
-    [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
-    [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
-    [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
-    [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
-    [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
-    [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
-    [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
-    [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
-    [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
-    [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
-    [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
-    [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
-    [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
-    [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
-    [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
-    [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
-    [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
-    [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
-    [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
-    [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
-    [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
-    [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
-    [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
-    [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
-    [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
-    [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
-    [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
-    [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
-    [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
-    [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
-    [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
-    [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
-    [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
-    [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
-    [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
-    [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
-    [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
-    [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
-    [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
-    [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
-    [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
-    [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
-    [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
-    [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
-    [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
-    [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
-    [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
-    [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
-    [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
-    [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
-    [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
-    [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
-    [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
-    [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
-    [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
-    [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
-    [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
-    [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
-    [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
-    [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
-    [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
-    [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
-    [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
-    [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
-    [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
-    [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
-    [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
-    [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
-    [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
-    [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
-    [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
-    [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
-    [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
-    [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
-    [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
-    [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
-    [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
-    [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
-    [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
-    [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
-    [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
-    [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
-    [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
-    [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
-    [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
-    [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
-    [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
-    [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
-    [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
-    [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
-    [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
-    [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
-    [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
-    [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
-    [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
-    [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
-    [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
-    [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
-    [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
-    [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
-    [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
-    [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
-    [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
-    [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
-    [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
-    [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
-    [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
-    [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
-    [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
-    [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
-    [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
-    [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
-    [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
-    [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
-    [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
-    [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
-    [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
-    [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
-    [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
-    [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
-    [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
-    [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
-    [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
-    [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
-    [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
-    [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
-    [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
-    [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
-    [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
-    [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
-    [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
-    [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
-    [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
-    [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
-    [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
-    [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
-    [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
-    [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
-    [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
-    [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
-    [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
-    [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
-    [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
-    [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
-    [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
-    [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
-    [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
-    [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
-    [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
-    [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
-    [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
-    [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
-    [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
-    [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
-    [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
-    [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
-    [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
-    [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
-    [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
-    [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
-    [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
-    [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
-    [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
-    [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
-    [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
-    [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
-    [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
-    [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
-    [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
-    [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
-    [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
-    [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
-    [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
-    [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
-    [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
-    [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
-    [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
-    [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
-    [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
-    [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
-    [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
-    [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
-    [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
-    [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
-    [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
-    [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
-    [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
-    [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
-    [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
-    [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
-    [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
-    [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
-    [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
-    [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
-    [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
-    [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
-    [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
-    [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
-    [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
-    [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
-    [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
-    [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
-    [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
-    [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
-    [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
-    [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
-    [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
-    [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
-    [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
-    [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
-    [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
-    [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
-    [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
-    [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
-    [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
-    [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
-    [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
-    [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
-    [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
-    [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
-    [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
-    [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
-    [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
-    [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
-    [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
-    [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
-    [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
-    [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
-    [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
-    [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
-    [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
-    [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
-    [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
-    [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
-    [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
-    [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
-    [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
-    [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
-    [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
-    [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
-    [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
-    [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
-    [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
-    [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
-    [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
-    [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
-    [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
-    [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
-    [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
-    [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
-    [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
-    [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
-    [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
-    [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
-    [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
-    [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
-    [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
-    [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
-    [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
-    [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
-    [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
-    [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
-    [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
-    [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
-    [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
-    [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
-    [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
-    [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
-    [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
-    [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
-    [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
-    [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
-    [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
-    [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
-    [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
-    [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
-    [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
-    [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
-    [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
-    [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
-    [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
-    [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
-    [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
-    [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
-    [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
-    [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
-    [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
-    [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
-    [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
-    [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
-    [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
-    [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
-    [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
-    [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
-    [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
-    [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
-    [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
-    [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
-    [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
-    [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
-    [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
-    [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
-    [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
-    [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
-    [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
-    [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
-    [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
-    [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
-    [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
-    [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
-    [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
-    [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
-    [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
-    [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
-    [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
-    [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
-    [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
-    [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
-    [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
-    [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
-    [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
-    [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
-    [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
-    [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
-    [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
-    [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
-    [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
-    [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
-    [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
-    [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
-    [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
-    [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
-    [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
-    [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
-    [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
-    [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
-    [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
-    [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
-    [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
-    [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
-    [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
-    [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
-    [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
-    [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
-    [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
-    [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
-    [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
-    [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
-    [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
-    [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
-    [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
-    [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
-    [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
-    [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
-    [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
-    [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
-    [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
-    [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
-    [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
-    [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
-    [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
-    [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
-    [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
-    [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
-    [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
-    [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
-    [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
-    [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
-    [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
-    [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
-    [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
-    [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
-    [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
-    [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
-    [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
-    [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
-    [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
-    [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
-    [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
-    [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
-    [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
-    [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
-    [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
-    [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
-    [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
-    [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
-    [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
-    [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
-    [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
-    [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
-    [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
-    [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
-    [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
-    [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
-    [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
-    [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
-    [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
-    [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
-    [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
-    [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
-    60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
-    [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
-    [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
-    [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
-    [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
-    [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
-    [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
-    [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
-    [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
-    [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
-    [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
-    60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
-    60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
-    [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
-    [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
-    [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
-    [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
-    [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
-    [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
-    [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
-    [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
-    [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
-    [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
-    [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
-    [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
-    [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
-    [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
-    [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
-    [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
-    [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
-    [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
-    [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
-    [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
-    [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
-    [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
-    [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
-    [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
-    [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
-    [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
-    [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
-    [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
-    [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
-    [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
-    [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
-    [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
-    [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
-    [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
-    [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
-    [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
-    [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
-    [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
-    [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
-    [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
-    [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
-    [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
-    [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
-    [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
-    [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
-    [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
-    [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
-    [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
-    [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
-    [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
-    [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
-    [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
-    [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
-    [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
-    [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
-    [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
-    [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
-    [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
-    [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
-    [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
-    [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
-    [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
-    [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
-    [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
-    [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
-    [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
-    [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
-    [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
-    [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
-    [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
-    [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
-    [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
-    [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
-    [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
-    [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
-    [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
-    [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
-    [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
-    [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
-    [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
-    [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
-    [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
-    [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
-    [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
-    [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
-    [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
-    [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
-    [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
-    [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
-    [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
-    [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
-    [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
-    [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
-    [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
-    [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
-    [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
-    [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
-    [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
-    [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
-    [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
-    [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
-    [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
-    [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
-    [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
-    [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
-    [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
-    [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
-    [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
-    [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
-    [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
-    [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
-    [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
-    [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
-    [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
-    [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
-    [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
-    [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
-    [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
-    [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
-    [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
-    [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
-    [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
-    [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
-    [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
-    [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
-    [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
-    [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
-    [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
-    [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
-    [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
-    [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
-    [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
-    [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
-    [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
-    [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
-    [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
-    [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
-    [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
-    [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
-    [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
-    [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
-    [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
-    [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
-    [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
-    [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
-    [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
-    [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
-    [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
-    [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
-    [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
-    [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
-    [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
-    [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
-    [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
-    [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
-    [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
-    [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
-    [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
-    [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
-    [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
-    [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
-    [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
-    [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
-    [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
-    [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
-    [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
-    [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
-    [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
-    [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
-    [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
-    [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
-    [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
-    [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
-    [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
-    [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
-    [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
-    [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
-    [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
-    [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
-    [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
-    [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
-    [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
-    [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
-    [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
-    [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
-    [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
-    [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
-    [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
-    [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
-    [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
-    [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
-    [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
-    [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
-    [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
-    [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
-    [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
-    [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
-    [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
-    [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
-    [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
-    [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
-    [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
-    [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
-    [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
-    [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
-    [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
-    [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
-    [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
-    [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
-    [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
-    [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
-    [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
-    [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
-    [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
-    [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
-    [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
-    [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
-    [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
-    [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
-    [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
-    [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
-    [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
-    [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
-    [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
-    [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
-    [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
-    [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
-    [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
-    [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
-    [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
-    [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
-    [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
-    [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
-    [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
-    [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
-    [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
-    [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
-    [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
-    [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
-    [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
-    [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
-    [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
-    [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
-    [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
-    [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
-    [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
-    [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
-    [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
-    0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
-    [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
-    [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
-    [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
-    [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
-    [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
-    [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
-    [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
-    [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
-    [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
-    [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
-    [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
-    [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
-    [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
-    [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
-    {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
-    {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
-    {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
-    {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
-    [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
-    [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
-    [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
-    [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
-    [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
-    [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
-    [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
-    [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
-    [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
-    [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
-    [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
-    [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
-    [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
-    [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
-    [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
-    [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
-    [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
-    [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
-    [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
-    [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
-    [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
-    [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
-    [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
-    [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
-    [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
-    [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
-    [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
-    [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
-    [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
-    [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
-    [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
-    [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
-    [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
-    [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
-    [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
-    [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
-    [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
-    [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
-    [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
-    [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
-    [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
-    [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
-    [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
-    [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
-    [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
-    [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
-    [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
-    [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
-    [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
-    [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
-    [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
-    [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
-    [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
-    [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
-    [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
-    [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
-    [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
-    [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
-    [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
-    [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
-    [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
-    [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
-    [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
-    [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
-    [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
-    [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
-    [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
-    [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
-    [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
-    [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
-    [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
-    [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
-    [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
-    [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
-    [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
-    [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
-    [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
-    [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
-    [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
-    [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
-    [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
-    [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
-    [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
-    [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
-    [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
-    [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
-    [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
-    [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
-    [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
-    [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
-    [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
-    [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
-    [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
-    [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
-    [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
-    [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
-    [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
-    [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
-    [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
-    [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
-    [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
-    [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
-    [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
-    [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
-    [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
-    [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
-    [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
-    [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
-    [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
-    [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
-    [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
-    [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
-    [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
-    [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
-    [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
-    [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
-    [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
-    [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
-    [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
-    [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
-    [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
-    [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
-    [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
-    [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
-    [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
-    [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
-    [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
-    [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
-    [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
-    [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
-    [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
-    [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
-    [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
-    [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
-    [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
-    [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
-    [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
-    [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
-    [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
-    [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
-    [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
-    [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
-    [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
-    [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
-    [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
-    [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
-    [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
-    [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
-    [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
-    [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
-    [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
-    [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
-    [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
-    [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
-    [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
-    [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
-    [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
-    [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
-    [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
-    [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
-    [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
-    [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
-    [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
-    [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
-    [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
-    [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
-    [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
-    [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
-    [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
-    [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
-    [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
-    [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
-    [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
-    [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
-    [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
-    [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
-    [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
-    [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
-    [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
-    [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
-    [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
-    [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
-    [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
-    [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
-    [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
-    [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
-    [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
-    [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
-    [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
-    [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
-    [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
-    [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
-    [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
-    [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
-    [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
-    [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
-    [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
-    [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
-    [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
-    [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
-    [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
-    [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
-    [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
-    [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
-    [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
-    [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
-    [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
-    [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
-    [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
-    [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
-    [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
-    [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
-    [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
-    [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
-    [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
-    [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
-    [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
-    [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
-    [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
-    [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
-    [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
-    [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
-    [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
-    [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
-    [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
-    [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
-    [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
-    [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
-    [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
-    [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
-    [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
-    [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
-    [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
-    [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
-    [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
-    [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
-    [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
-    [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
-    [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
-    [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
-    [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
-    [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
-    [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
-    [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
-    [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
-    [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
-    [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
-    [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
-    [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
-    [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
-    [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
-    [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
-    [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
-    [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
-    [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
-    [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
-    [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
-    [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
-    [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
-    [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
-    [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
-    [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
-    [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
-    [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
-    [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
-    [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
-    [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
-    [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
-    [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
-    [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
-    [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
-    [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
-    [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
-    [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
-    [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
-    [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
-    [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
-    [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
-    [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
-    [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
-    [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
-    [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
-    [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
-    [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
-    [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
-    [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
-    [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
-    [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
-    [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
-    [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
-    [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
-    [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
-    [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
-    [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
-    [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
-    [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
-    [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
-    [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
-    [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
-    [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
-    [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
-    [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
-    [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
-    36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
-    [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
-    [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
-    34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
-    [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
-    20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
-    24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
-    [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
-    [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
-    31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
-    62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
-    [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
-    34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
-    [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
-    23446, 62959, 32347],
-  'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
-    12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
-    {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
-    {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
-    8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
-    8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
-    8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
-    8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
-    9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
-    {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
-    {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
-    {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
-    {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
-    {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
-    {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
-    {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
-    462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
-    250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
-    {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
-    25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
-    29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
-    26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
-    22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
-    [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
-    38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
-    25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
-    25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
-    27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
-    32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
-    25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
-    21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
-    34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
-    36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
-    34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
-    24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
-    36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
-    24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
-    28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
-    30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
-    25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
-    39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
-    31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
-    36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
-    24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
-    26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
-    21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
-    25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
-    20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
-    32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
-    26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
-    24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
-    27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
-    20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
-    30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
-    23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
-    23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
-    32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
-    38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
-    25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
-    24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
-    26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
-    30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
-    32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
-    20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
-    28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
-    25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
-    [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
-    36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
-    27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
-    33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
-    21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
-    30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
-    31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
-    24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
-    38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
-    30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
-    29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
-    39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
-    25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
-    [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
-    29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
-    28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
-    38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
-    36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
-    21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
-    24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
-    [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
-    21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
-    30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
-    33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
-    25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
-    21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
-    33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
-    22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
-    38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
-    20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
-    27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
-    29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
-    36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
-    [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
-    22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
-    [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
-    36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
-    31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
-    21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
-    [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
-    32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
-    [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
-    [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
-    33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
-    20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
-    [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
-    21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
-    20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
-    [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
-    36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
-    36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
-    39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
-    38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
-    26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
-    22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
-    33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
-    38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
-    30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
-    21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
-    29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
-    33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
-    20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
-    21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
-    36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
-    24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
-    29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
-    34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
-    20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
-    27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
-    38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
-    31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
-    21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
-    21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
-    25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
-    35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
-    22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
-    31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
-    38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
-    30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
-    37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
-    39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
-    30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
-    30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
-    38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
-    21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
-    31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
-    31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
-    20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
-    [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
-    38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
-    33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
-    35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
-    31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
-    [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
-    [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
-    23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
-    25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
-    21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
-    25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
-    38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
-    21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
-    21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
-    28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
-    39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
-    32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
-    25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
-    24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
-    24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
-    20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
-    24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
-    22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
-    34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
-    35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
-    26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
-    28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
-    22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
-    29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
-    40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
-    21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
-    [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
-    38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
-    32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
-    20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
-    20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
-    29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
-    21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
-    28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
-    39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
-    31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
-    28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
-    40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
-    24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
-    32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
-    28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
-    32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
-    33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
-    39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
-    30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
-    33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
-    [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
-    29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
-    27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
-    33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
-    31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
-    23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
-    [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
-    34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
-    34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
-    33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
-    28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
-    27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
-    30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
-    27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
-    33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
-    38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
-    34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
-    23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
-    29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
-    33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
-    34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
-    34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
-    25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
-    30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
-    21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
-    36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
-    28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
-    30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
-    33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
-    20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
-    25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
-    20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
-    36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
-    22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
-    26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
-    22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
-    36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
-    36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
-    38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
-    38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
-    27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
-    38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
-    32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
-    20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
-    38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
-    39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
-    22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
-    28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
-    27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
-    30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
-    20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
-    24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
-    20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
-    33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
-    [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
-    [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
-    33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
-    21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
-    29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
-    27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
-    [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
-    21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
-    23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
-    21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
-    25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
-    [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
-    32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
-    30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
-    35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
-    20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
-    23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
-    20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
-    20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
-    25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
-    30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
-    28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
-    34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
-    25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
-    34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
-    [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
-    26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
-    32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
-    24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
-    33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
-    35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
-    30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
-    26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
-    22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
-    27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
-    22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
-    25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
-    31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
-    33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
-    30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
-    20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
-    [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
-    36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
-    20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
-    24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
-    36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
-    [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
-    35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
-    39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
-    23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
-    39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
-    23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
-    26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
-    26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
-    20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
-    39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
-    [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
-    29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
-    24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
-    26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
-    20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
-    35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
-    38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
-    29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
-    21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
-    38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
-    25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
-    38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
-    39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
-    [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
-    21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
-    38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
-    [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
-    27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
-    20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
-    33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
-    34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
-    [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
-    21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
-    31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
-    35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
-    32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
-    30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
-    [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
-    27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
-    21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
-    21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
-    30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
-    22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
-    38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
-    31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
-    20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
-    23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
-    26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
-    21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
-    38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
-    33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
-    [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
-    20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
-    24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
-    32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
-    21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
-    27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
-    36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
-    33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
-    24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
-    37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
-    20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
-    27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
-    28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
-    35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
-    21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
-    35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
-    21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
-    33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
-    23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
-    38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
-    26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
-    26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
-    26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
-    25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
-    21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
-    20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
-    27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
-    26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
-    24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
-    38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
-    21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
-    27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
-    26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
-    24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
-    37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
-    33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
-    20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
-    25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
-    31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
-    24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
-    [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
-    21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
-    35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
-    20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
-    31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
-    36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
-    38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
-    26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
-    36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
-    [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
-    32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
-    [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
-    22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
-    20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
-    19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
-    [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
-    22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
-    20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
-    21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
-    21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
-    {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
-    21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
-    20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
-    20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
-    20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
-    20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
-    20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
-    20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
-    20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
-    20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
-    [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
-    [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
-    20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
-    32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
-    20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
-    {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
-    {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
-    35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
-    35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
-    35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
-    {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
-    38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
-    38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
-    37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
-    37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
-    37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
-    37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
-    21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
-    20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
-    22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
-    {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
-    22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
-    22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
-    22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
-    22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
-    39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
-    33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
-    33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
-    33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
-    33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
-    33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
-    33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
-    33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
-    33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
-    {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
-    33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
-    33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
-    33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
-    33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
-    {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
-    33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
-    33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
-    29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
-    34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
-    34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
-    34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
-    [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
-    [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
-    25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
-    25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
-    25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
-    25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
-    25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
-    25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
-    21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
-    {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
-    21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
-    21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
-    21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
-    {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
-    21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
-    21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
-    {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
-    21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
-    21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
-    21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
-    21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
-    22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
-    22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
-    22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
-    22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
-    24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
-    23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
-    23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
-    23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
-    23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
-    23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
-    23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
-    24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
-    29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
-    29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
-    29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
-    29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
-    [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
-    {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
-    {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
-    24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
-    24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
-    24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
-    24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
-    24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
-    24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
-    24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
-    24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
-    38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
-    38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
-    {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
-    27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
-    27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
-    27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
-    27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
-    27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
-    27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
-    28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
-    28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
-    {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
-    28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
-    28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
-    28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
-    28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
-    28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
-    [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
-    23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
-    36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
-    36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
-    {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
-    36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
-    21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
-    33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
-    22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
-    22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
-    23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
-    23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
-    23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
-    23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
-    23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
-    {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
-    39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
-    32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
-    {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
-    {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
-    32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
-    {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
-    32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
-    [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
-    29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
-    29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
-    29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
-    29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
-    {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
-    29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
-    26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
-    26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
-    26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
-    26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
-    26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
-    26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
-    {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
-    26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
-    26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
-    27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
-    27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
-    27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
-    27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
-    27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
-    36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
-    {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
-    {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
-    25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
-    29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
-    26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
-    26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
-    26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
-    36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
-    36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
-    29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
-    25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
-    27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
-    27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
-    34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
-    32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
-    32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
-    33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
-    33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
-    {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
-    33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
-    27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
-    [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
-    26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
-    28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
-    28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
-    29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
-    29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
-    31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
-    31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
-    24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
-    24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
-    27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
-    26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
-    30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
-    30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
-    30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
-    31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
-    30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
-    30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
-    30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
-    30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
-    32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
-    30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
-    {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
-    38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
-    {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
-    {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
-    38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
-    {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
-    38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
-    {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
-    38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
-    {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
-    {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
-    {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
-    {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
-    31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
-    39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
-    40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
-    {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
-    {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
-    40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
-    30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
-    30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
-    30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
-    30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
-    30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
-    30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
-    31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
-    34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
-    35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
-    35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
-    [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
-    32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
-    32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
-    39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
-    {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
-    34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
-    34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
-    34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
-    34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
-    34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
-    34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
-    {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
-    34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
-    34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
-    34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
-    34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
-    {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
-    31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
-    31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
-    31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
-    31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
-    31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
-    31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
-    33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
-    33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
-    33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
-    35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
-    31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
-    {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
-    32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
-    32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
-    36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
-    37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
-    37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
-    {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
-    36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
-    36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
-    36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
-    36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
-    {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
-    36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
-    35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
-    35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
-    38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
-    {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
-    {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
-    37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
-    40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
-    {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
-    {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
-    {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
-    38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
-    39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
-    {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
-    39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
-    39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
-    {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
-    40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
-    40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
-    12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
-    25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
-    23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
-    32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
-    36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
-    25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
-    24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
-    35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
-    39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
-    [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
-    36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
-    31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
-    30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
-    24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
-    37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
-    27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
-    32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
-    38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
-    29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
-    38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
-    29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
-    36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
-    22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
-    39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
-    36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
-    23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
-    20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
-    39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
-    [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
-    22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
-    40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
-    25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
-    31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
-    36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
-    26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
-    38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
-    27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
-    25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
-    [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
-    28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
-    25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
-    31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
-    30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
-    31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
-    32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
-    27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
-    23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
-    34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
-    34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
-    21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
-    39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
-    32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
-    25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
-    29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
-    39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
-    27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
-    28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
-    24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
-    20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
-    39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
-    21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
-    35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
-    22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
-    40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
-    24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
-    22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
-    33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
-    30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
-    24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
-    [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
-    36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
-    22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
-    27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
-    31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
-    30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
-    32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
-    21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
-    36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
-    35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
-    24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
-    36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
-    36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
-    35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
-    35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
-    25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
-    30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
-    35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
-    32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
-    39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
-    [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
-    32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
-    31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
-    35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
-    23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
-    39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
-    35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
-    33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
-    38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
-    21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
-    21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
-    30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
-    27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
-    37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
-    35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
-    23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
-    31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
-    29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
-    39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
-    22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
-    38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
-    36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
-    36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
-    36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
-    36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
-    38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
-    25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
-    35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
-    36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
-    35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
-    28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
-    21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
-    21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
-    20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
-    33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
-    35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
-    35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
-    35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
-    35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
-    35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
-    38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
-    24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
-    22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
-    34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
-    34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
-    40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
-    34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
-    25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
-    22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
-    22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
-    22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
-    23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
-    24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
-    39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
-    39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
-    25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
-    24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
-    38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
-    38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
-    28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
-    28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
-    28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
-    23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
-    23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
-    39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
-    39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
-    {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
-    32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
-    32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
-    32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
-    32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
-    32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
-    32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
-    29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
-    27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
-    27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
-    27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
-    36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
-    36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
-    36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
-    36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
-    36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
-    35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
-    33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
-    36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
-    31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
-    30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
-    30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
-    37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
-    37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
-    37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
-    37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
-    37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
-    37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
-    37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
-    {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
-    37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
-    37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
-    37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
-    {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
-    37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
-    37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
-    40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
-    40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
-    40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
-    40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
-    30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
-    30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
-    32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
-    38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
-    34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
-    34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
-    31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
-    31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
-    36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
-    36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
-    40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
-    40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
-    31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
-    39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
-    39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
-    39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
-    39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
-    39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
-    40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
-    40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
-    22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
-    39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
-    [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
-    38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
-    31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
-    38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
-    8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
-    {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
-    {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
-    {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
-    13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
-    12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
-    {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
-    12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
-    {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
-    20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
-    20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
-    {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
-    {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
-    20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
-    {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
-    {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
-    20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
-    {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
-    {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
-    20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
-    20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
-    {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
-    20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
-    {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
-    20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
-    {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
-    {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
-    20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
-    20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
-    {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
-    {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
-    {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
-    {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
-    {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
-    {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
-    {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
-    {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
-    {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
-    {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
-    20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
-    {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
-    {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
-    20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
-    {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
-    {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
-    {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
-    20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
-    {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
-    {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
-    {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
-    {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
-    {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
-    {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
-    21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
-    {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
-    {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
-    {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
-    21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
-    {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
-    {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
-    {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
-    {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
-    {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
-    {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
-    {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
-    {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
-    {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
-    21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
-    {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
-    {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
-    {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
-    {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
-    {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
-    21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
-    {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
-    21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
-    21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
-    21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
-    {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
-    {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
-    {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
-    21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
-    {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
-    {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
-    21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
-    {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
-    {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
-    {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
-    {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
-    {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
-    {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
-    {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
-    21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
-    21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
-    {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
-    {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
-    {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
-    {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
-    {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
-    {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
-    22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
-    22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
-    {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
-    {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
-    22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
-    {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
-    {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
-    22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
-    {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
-    {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
-    {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
-    {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
-    {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
-    {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
-    22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
-    {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
-    22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
-    {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
-    {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
-    {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
-    {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
-    {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
-    {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
-    {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
-    {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
-    {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
-    {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
-    {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
-    {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
-    22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
-    {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
-    {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
-    {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
-    {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
-    {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
-    22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
-    22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
-    22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
-    {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
-    {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
-    {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
-    {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
-    23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
-    {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
-    {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
-    {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
-    {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
-    {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
-    {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
-    {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
-    {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
-    23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
-    {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
-    {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
-    {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
-    {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
-    {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
-    {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
-    {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
-    {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
-    {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
-    {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
-    {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
-    {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
-    23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
-    {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
-    23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
-    {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
-    {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
-    23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
-    {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
-    {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
-    {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
-    {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
-    {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
-    23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
-    {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
-    {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
-    {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
-    {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
-    {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
-    {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
-    {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
-    {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
-    23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
-    24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
-    {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
-    24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
-    {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
-    {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
-    {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
-    {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
-    {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
-    24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
-    24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
-    {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
-    24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
-    {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
-    {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
-    {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
-    {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
-    24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
-    {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
-    24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
-    24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
-    {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
-    {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
-    {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
-    {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
-    {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
-    {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
-    {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
-    {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
-    {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
-    {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
-    {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
-    {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
-    {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
-    {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
-    {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
-    {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
-    {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
-    {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
-    {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
-    {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
-    {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
-    {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
-    {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
-    {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
-    {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
-    {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
-    {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
-    {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
-    {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
-    25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
-    25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
-    {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
-    {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
-    {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
-    25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
-    {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
-    {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
-    {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
-    {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
-    {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
-    {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
-    {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
-    {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
-    {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
-    {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
-    {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
-    25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
-    25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
-    25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
-    {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
-    {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
-    {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
-    {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
-    {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
-    {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
-    {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
-    {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
-    {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
-    25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
-    {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
-    25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
-    25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
-    {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
-    {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
-    {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
-    {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
-    {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
-    25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
-    {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
-    {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
-    26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
-    {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
-    {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
-    {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
-    {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
-    {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
-    {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
-    {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
-    {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
-    {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
-    26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
-    {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
-    {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
-    {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
-    {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
-    {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
-    {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
-    {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
-    26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
-    {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
-    {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
-    {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
-    26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
-    {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
-    {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
-    26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
-    {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
-    26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
-    {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
-    26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
-    {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
-    26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
-    {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
-    26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
-    {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
-    {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
-    {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
-    {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
-    26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
-    {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
-    {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
-    {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
-    {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
-    {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
-    {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
-    {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
-    {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
-    {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
-    {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
-    27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
-    {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
-    {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
-    {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
-    {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
-    {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
-    27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
-    {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
-    {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
-    {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
-    {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
-    {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
-    27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
-    {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
-    {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
-    {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
-    {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
-    27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
-    {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
-    {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
-    27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
-    {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
-    27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
-    {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
-    {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
-    {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
-    {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
-    27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
-    {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
-    27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
-    {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
-    {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
-    27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
-    27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
-    {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
-    {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
-    {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
-    {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
-    {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
-    {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
-    {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
-    {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
-    {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
-    27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
-    {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
-    {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
-    28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
-    28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
-    {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
-    {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
-    {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
-    28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
-    {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
-    {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
-    28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
-    {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
-    {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
-    {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
-    {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
-    {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
-    28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
-    {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
-    {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
-    {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
-    {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
-    {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
-    {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
-    {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
-    {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
-    {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
-    {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
-    {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
-    {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
-    {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
-    {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
-    {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
-    {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
-    {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
-    28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
-    {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
-    {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
-    {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
-    {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
-    {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
-    28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
-    {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
-    {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
-    {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
-    28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
-    {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
-    {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
-    29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
-    29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
-    29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
-    {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
-    {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
-    29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
-    {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
-    {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
-    {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
-    29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
-    {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
-    {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
-    {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
-    29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
-    {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
-    {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
-    {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
-    29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
-    {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
-    29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
-    {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
-    {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
-    {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
-    {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
-    {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
-    {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
-    29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
-    29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
-    {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
-    29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
-    {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
-    {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
-    {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
-    29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
-    {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
-    {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
-    {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
-    {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
-    {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
-    {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
-    {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
-    {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
-    {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
-    {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
-    {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
-    {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
-    30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
-    {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
-    {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
-    {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
-    {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
-    30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
-    {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
-    {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
-    {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
-    {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
-    {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
-    {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
-    {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
-    {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
-    {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
-    30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
-    {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
-    {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
-    30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
-    {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
-    {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
-    30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
-    {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
-    {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
-    {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
-    {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
-    30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
-    {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
-    {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
-    {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
-    {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
-    {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
-    {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
-    {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
-    {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
-    {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
-    30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
-    {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
-    {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
-    {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
-    {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
-    {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
-    {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
-    {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
-    {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
-    {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
-    {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
-    {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
-    {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
-    {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
-    {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
-    {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
-    {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
-    31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
-    {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
-    {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
-    31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
-    31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
-    {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
-    31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
-    {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
-    {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
-    31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
-    31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
-    {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
-    {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
-    31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
-    {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
-    {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
-    {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
-    {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
-    {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
-    {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
-    {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
-    31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
-    {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
-    {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
-    {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
-    {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
-    {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
-    31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
-    {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
-    31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
-    {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
-    {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
-    31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
-    {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
-    {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
-    31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
-    {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
-    {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
-    31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
-    31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
-    {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
-    {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
-    32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
-    {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
-    {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
-    {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
-    {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
-    {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
-    {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
-    32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
-    32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
-    {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
-    {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
-    {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
-    {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
-    {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
-    32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
-    {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
-    32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
-    {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
-    32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
-    {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
-    {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
-    {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
-    {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
-    {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
-    {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
-    32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
-    {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
-    {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
-    {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
-    {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
-    {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
-    {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
-    {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
-    {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
-    {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
-    32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
-    {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
-    {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
-    {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
-    33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
-    33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
-    33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
-    {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
-    {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
-    {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
-    {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
-    {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
-    {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
-    {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
-    {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
-    {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
-    {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
-    {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
-    {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
-    {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
-    33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
-    33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
-    {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
-    33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
-    {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
-    33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
-    {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
-    {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
-    {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
-    {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
-    {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
-    {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
-    {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
-    {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
-    {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
-    {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
-    {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
-    {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
-    {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
-    {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
-    33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
-    {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
-    {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
-    {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
-    {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
-    {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
-    {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
-    {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
-    {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
-    {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
-    {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
-    {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
-    {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
-    34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
-    {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
-    {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
-    34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
-    {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
-    {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
-    {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
-    34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
-    {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
-    {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
-    {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
-    34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
-    {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
-    {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
-    {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
-    {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
-    {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
-    {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
-    34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
-    {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
-    {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
-    34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
-    {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
-    {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
-    {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
-    {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
-    {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
-    {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
-    34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
-    {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
-    {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
-    {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
-    {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
-    {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
-    34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
-    {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
-    {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
-    {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
-    {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
-    {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
-    35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
-    {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
-    {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
-    {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
-    {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
-    {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
-    {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
-    {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
-    {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
-    {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
-    {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
-    {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
-    {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
-    {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
-    {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
-    {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
-    {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
-    {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
-    {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
-    {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
-    {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
-    {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
-    35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
-    {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
-    {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
-    {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
-    {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
-    35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
-    {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
-    {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
-    35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
-    35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
-    {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
-    {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
-    {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
-    {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
-    {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
-    35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
-    35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
-    {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
-    {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
-    {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
-    {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
-    {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
-    {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
-    {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
-    {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
-    36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
-    {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
-    {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
-    {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
-    {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
-    {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
-    {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
-    {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
-    36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
-    {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
-    {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
-    {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
-    {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
-    36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
-    36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
-    36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
-    {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
-    {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
-    {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
-    {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
-    {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
-    {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
-    {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
-    {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
-    36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
-    {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
-    {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
-    {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
-    36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
-    {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
-    36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
-    {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
-    {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
-    36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
-    36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
-    {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
-    {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
-    37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
-    {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
-    {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
-    37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
-    {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
-    37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
-    {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
-    {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
-    {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
-    37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
-    37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
-    {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
-    {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
-    {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
-    {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
-    {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
-    {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
-    {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
-    {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
-    37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
-    {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
-    37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
-    {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
-    {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
-    {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
-    {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
-    37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
-    37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
-    {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
-    {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
-    {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
-    {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
-    {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
-    {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
-    {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
-    {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
-    37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
-    {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
-    {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
-    {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
-    {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
-    {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
-    {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
-    37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
-    {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
-    {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
-    {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
-    38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
-    38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
-    {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
-    {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
-    {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
-    {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
-    {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
-    {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
-    {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
-    {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
-    38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
-    {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
-    38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
-    38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
-    {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
-    38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
-    {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
-    {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
-    {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
-    {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
-    {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
-    38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
-    {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
-    {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
-    {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
-    {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
-    {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
-    {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
-    {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
-    {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
-    {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
-    38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
-    {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
-    {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
-    {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
-    39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
-    {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
-    39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
-    {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
-    {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
-    {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
-    {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
-    {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
-    {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
-    {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
-    {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
-    39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
-    39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
-    {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
-    {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
-    {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
-    {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
-    39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
-    {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
-    {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
-    39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
-    {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
-    {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
-    {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
-    {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
-    {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
-    {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
-    39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
-    {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
-    {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
-    {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
-    {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
-    {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
-    {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
-    {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
-    {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
-    {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
-    39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
-    {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
-    {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
-    {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
-    40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
-    {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
-    {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
-    {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
-    40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
-    {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
-    {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
-    {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
-    {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
-    {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
-    {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
-    {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
-    {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
-    40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
-    {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
-    {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
-    {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
-    {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
-    {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
-    40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
-    {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
-    {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
-    {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
-    40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
-    {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
-    {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
-    {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
-    {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
-    {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
-    {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
-    {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
-    {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
-    [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
-    11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
-    59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
-    11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
-    {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
-    18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
-    18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
-    18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
-    19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
-    {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
-    {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
-    {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
-    {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
-    {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
-    {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
-    {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
-    {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
-    {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
-    {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
-    {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
-    {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
-    {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
-    {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
-    {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
-    {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
-    {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
-    {f: 7, c: 19887}]
-};
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/colorspace.js b/apps/files_pdfviewer/js/pdfjs/src/colorspace.js
deleted file mode 100644
index 8d8290109decd1ca1868c5852db7338161a27601..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/colorspace.js
+++ /dev/null
@@ -1,532 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var ColorSpace = (function ColorSpaceClosure() {
-  // Constructor should define this.numComps, this.defaultColor, this.name
-  function ColorSpace() {
-    error('should not call ColorSpace constructor');
-  }
-
-  ColorSpace.prototype = {
-    // Input: array of size numComps representing color component values
-    // Output: array of rgb values, each value ranging from [0.1]
-    getRgb: function ColorSpace_getRgb(color) {
-      error('Should not call ColorSpace.getRgb: ' + color);
-    },
-    // Input: Uint8Array of component values, each value scaled to [0,255]
-    // Output: Uint8Array of rgb values, each value scaled to [0,255]
-    getRgbBuffer: function ColorSpace_getRgbBuffer(input) {
-      error('Should not call ColorSpace.getRgbBuffer: ' + input);
-    }
-  };
-
-  ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
-    var IR = ColorSpace.parseToIR(cs, xref, res);
-    if (IR instanceof AlternateCS)
-      return IR;
-
-    return ColorSpace.fromIR(IR);
-  };
-
-  ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
-    var name = isArray(IR) ? IR[0] : IR;
-
-    switch (name) {
-      case 'DeviceGrayCS':
-        return new DeviceGrayCS();
-      case 'DeviceRgbCS':
-        return new DeviceRgbCS();
-      case 'DeviceCmykCS':
-        return new DeviceCmykCS();
-      case 'PatternCS':
-        var basePatternCS = IR[1];
-        if (basePatternCS)
-          basePatternCS = ColorSpace.fromIR(basePatternCS);
-        return new PatternCS(basePatternCS);
-      case 'IndexedCS':
-        var baseIndexedCS = IR[1];
-        var hiVal = IR[2];
-        var lookup = IR[3];
-        return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
-      case 'AlternateCS':
-        var numComps = IR[1];
-        var alt = IR[2];
-        var tintFnIR = IR[3];
-
-        return new AlternateCS(numComps, ColorSpace.fromIR(alt),
-                                PDFFunction.fromIR(tintFnIR));
-      case 'LabCS':
-        var whitePoint = IR[1].WhitePoint;
-        var blackPoint = IR[1].BlackPoint;
-        var range = IR[1].Range;
-        return new LabCS(whitePoint, blackPoint, range);
-      default:
-        error('Unkown name ' + name);
-    }
-    return null;
-  };
-
-  ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
-    if (isName(cs)) {
-      var colorSpaces = res.get('ColorSpace');
-      if (isDict(colorSpaces)) {
-        var refcs = colorSpaces.get(cs.name);
-        if (refcs)
-          cs = refcs;
-      }
-    }
-
-    cs = xref.fetchIfRef(cs);
-    var mode;
-
-    if (isName(cs)) {
-      mode = cs.name;
-      this.mode = mode;
-
-      switch (mode) {
-        case 'DeviceGray':
-        case 'G':
-          return 'DeviceGrayCS';
-        case 'DeviceRGB':
-        case 'RGB':
-          return 'DeviceRgbCS';
-        case 'DeviceCMYK':
-        case 'CMYK':
-          return 'DeviceCmykCS';
-        case 'Pattern':
-          return ['PatternCS', null];
-        default:
-          error('unrecognized colorspace ' + mode);
-      }
-    } else if (isArray(cs)) {
-      mode = cs[0].name;
-      this.mode = mode;
-
-      switch (mode) {
-        case 'DeviceGray':
-        case 'G':
-          return 'DeviceGrayCS';
-        case 'DeviceRGB':
-        case 'RGB':
-          return 'DeviceRgbCS';
-        case 'DeviceCMYK':
-        case 'CMYK':
-          return 'DeviceCmykCS';
-        case 'CalGray':
-          return 'DeviceGrayCS';
-        case 'CalRGB':
-          return 'DeviceRgbCS';
-        case 'ICCBased':
-          var stream = xref.fetchIfRef(cs[1]);
-          var dict = stream.dict;
-          var numComps = dict.get('N');
-          if (numComps == 1)
-            return 'DeviceGrayCS';
-          if (numComps == 3)
-            return 'DeviceRgbCS';
-          if (numComps == 4)
-            return 'DeviceCmykCS';
-          break;
-        case 'Pattern':
-          var basePatternCS = cs[1];
-          if (basePatternCS)
-            basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
-          return ['PatternCS', basePatternCS];
-        case 'Indexed':
-        case 'I':
-          var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
-          var hiVal = cs[2] + 1;
-          var lookup = xref.fetchIfRef(cs[3]);
-          return ['IndexedCS', baseIndexedCS, hiVal, lookup];
-        case 'Separation':
-        case 'DeviceN':
-          var name = cs[1];
-          var numComps = 1;
-          if (isName(name))
-            numComps = 1;
-          else if (isArray(name))
-            numComps = name.length;
-          var alt = ColorSpace.parseToIR(cs[2], xref, res);
-          var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
-          return ['AlternateCS', numComps, alt, tintFnIR];
-        case 'Lab':
-          var params = cs[1].getAll();
-          return ['LabCS', params];
-        default:
-          error('unimplemented color space object "' + mode + '"');
-      }
-    } else {
-      error('unrecognized color space object: "' + cs + '"');
-    }
-    return null;
-  };
-  /**
-   * Checks if a decode map matches the default decode map for a color space.
-   * This handles the general decode maps where there are two values per
-   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
-   * This does not handle Lab, Indexed, or Pattern decode maps since they are
-   * slightly different.
-   * @param {Array} decode Decode map (usually from an image).
-   * @param {Number} n Number of components the color space has.
-   */
-  ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
-    if (!decode)
-      return true;
-
-    if (n * 2 !== decode.length) {
-      warning('The decode map is not the correct length');
-      return true;
-    }
-    for (var i = 0, ii = decode.length; i < ii; i += 2) {
-      if (decode[i] != 0 || decode[i + 1] != 1)
-        return false;
-    }
-    return true;
-  };
-
-  return ColorSpace;
-})();
-
-/**
- * Alternate color space handles both Separation and DeviceN color spaces.  A
- * Separation color space is actually just a DeviceN with one color component.
- * Both color spaces use a tinting function to convert colors to a base color
- * space.
- */
-var AlternateCS = (function AlternateCSClosure() {
-  function AlternateCS(numComps, base, tintFn) {
-    this.name = 'Alternate';
-    this.numComps = numComps;
-    this.defaultColor = [];
-    for (var i = 0; i < numComps; ++i)
-      this.defaultColor.push(1);
-    this.base = base;
-    this.tintFn = tintFn;
-  }
-
-  AlternateCS.prototype = {
-    getRgb: function AlternateCS_getRgb(color) {
-      var tinted = this.tintFn(color);
-      return this.base.getRgb(tinted);
-    },
-    getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) {
-      var tintFn = this.tintFn;
-      var base = this.base;
-      var scale = 1 / ((1 << bits) - 1);
-      var length = input.length;
-      var pos = 0;
-      var baseNumComps = base.numComps;
-      var baseBuf = new Uint8Array(baseNumComps * length);
-      var numComps = this.numComps;
-      var scaled = [];
-
-      for (var i = 0; i < length; i += numComps) {
-        for (var z = 0; z < numComps; ++z)
-          scaled[z] = input[i + z] * scale;
-
-        var tinted = tintFn(scaled);
-        for (var j = 0; j < baseNumComps; ++j)
-          baseBuf[pos++] = 255 * tinted[j];
-      }
-      return base.getRgbBuffer(baseBuf, 8);
-    },
-    isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    }
-  };
-
-  return AlternateCS;
-})();
-
-var PatternCS = (function PatternCSClosure() {
-  function PatternCS(baseCS) {
-    this.name = 'Pattern';
-    this.base = baseCS;
-  }
-  PatternCS.prototype = {};
-
-  return PatternCS;
-})();
-
-var IndexedCS = (function IndexedCSClosure() {
-  function IndexedCS(base, highVal, lookup) {
-    this.name = 'Indexed';
-    this.numComps = 1;
-    this.defaultColor = [0];
-    this.base = base;
-    this.highVal = highVal;
-
-    var baseNumComps = base.numComps;
-    var length = baseNumComps * highVal;
-    var lookupArray = new Uint8Array(length);
-
-    if (isStream(lookup)) {
-      var bytes = lookup.getBytes(length);
-      lookupArray.set(bytes);
-    } else if (isString(lookup)) {
-      for (var i = 0; i < length; ++i)
-        lookupArray[i] = lookup.charCodeAt(i);
-    } else {
-      error('Unrecognized lookup table: ' + lookup);
-    }
-    this.lookup = lookupArray;
-  }
-
-  IndexedCS.prototype = {
-    getRgb: function IndexedCS_getRgb(color) {
-      var numComps = this.base.numComps;
-      var start = color[0] * numComps;
-      var c = [];
-
-      for (var i = start, ii = start + numComps; i < ii; ++i)
-        c.push(this.lookup[i]);
-
-      return this.base.getRgb(c);
-    },
-    getRgbBuffer: function IndexedCS_getRgbBuffer(input) {
-      var base = this.base;
-      var numComps = base.numComps;
-      var lookup = this.lookup;
-      var length = input.length;
-      var baseBuf = new Uint8Array(length * numComps);
-      var baseBufPos = 0;
-
-      for (var i = 0; i < length; ++i) {
-        var lookupPos = input[i] * numComps;
-        for (var j = 0; j < numComps; ++j) {
-          baseBuf[baseBufPos++] = lookup[lookupPos + j];
-        }
-      }
-
-      return base.getRgbBuffer(baseBuf, 8);
-    },
-    isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
-      // indexed color maps shouldn't be changed
-      return true;
-    }
-  };
-  return IndexedCS;
-})();
-
-var DeviceGrayCS = (function DeviceGrayCSClosure() {
-  function DeviceGrayCS() {
-    this.name = 'DeviceGray';
-    this.numComps = 1;
-    this.defaultColor = [0];
-  }
-
-  DeviceGrayCS.prototype = {
-    getRgb: function DeviceGrayCS_getRgb(color) {
-      var c = color[0];
-      return [c, c, c];
-    },
-    getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) {
-      var scale = 255 / ((1 << bits) - 1);
-      var length = input.length;
-      var rgbBuf = new Uint8Array(length * 3);
-      for (var i = 0, j = 0; i < length; ++i) {
-        var c = (scale * input[i]) | 0;
-        rgbBuf[j++] = c;
-        rgbBuf[j++] = c;
-        rgbBuf[j++] = c;
-      }
-      return rgbBuf;
-    },
-    isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    }
-  };
-  return DeviceGrayCS;
-})();
-
-var DeviceRgbCS = (function DeviceRgbCSClosure() {
-  function DeviceRgbCS() {
-    this.name = 'DeviceRGB';
-    this.numComps = 3;
-    this.defaultColor = [0, 0, 0];
-  }
-  DeviceRgbCS.prototype = {
-    getRgb: function DeviceRgbCS_getRgb(color) {
-      return color;
-    },
-    getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
-      if (bits == 8)
-        return input;
-      var scale = 255 / ((1 << bits) - 1);
-      var i, length = input.length;
-      var rgbBuf = new Uint8Array(length);
-      for (i = 0; i < length; ++i)
-        rgbBuf[i] = (scale * input[i]) | 0;
-      return rgbBuf;
-    },
-    isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    }
-  };
-  return DeviceRgbCS;
-})();
-
-var DeviceCmykCS = (function DeviceCmykCSClosure() {
-  function DeviceCmykCS() {
-    this.name = 'DeviceCMYK';
-    this.numComps = 4;
-    this.defaultColor = [0, 0, 0, 1];
-  }
-  DeviceCmykCS.prototype = {
-    getRgb: function DeviceCmykCS_getRgb(color) {
-      var c = color[0], m = color[1], y = color[2], k = color[3];
-
-      // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14
-      c = (c * (1 - k) + k);
-      m = (m * (1 - k) + k);
-      y = (y * (1 - k) + k);
-
-      // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12
-      var r = (1 - c);
-      var g = (1 - m);
-      var b = (1 - y);
-
-      return [r, g, b];
-    },
-    getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) {
-      var scale = 1 / ((1 << bits) - 1);
-      var length = colorBuf.length / 4;
-      var rgbBuf = new Uint8Array(length * 3);
-      var rgbBufPos = 0;
-      var colorBufPos = 0;
-
-      for (var i = 0; i < length; i++) {
-        var cmyk = [];
-        for (var j = 0; j < 4; ++j)
-          cmyk.push(scale * colorBuf[colorBufPos++]);
-
-        var rgb = this.getRgb(cmyk);
-        for (var j = 0; j < 3; ++j)
-          rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
-      }
-
-      return rgbBuf;
-    },
-    isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
-      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
-    }
-  };
-
-  return DeviceCmykCS;
-})();
-
-//
-// LabCS: Based on "PDF Reference, Sixth Ed", p.250
-//
-var LabCS = (function LabCSClosure() {
-  function LabCS(whitePoint, blackPoint, range) {
-    this.name = 'Lab';
-    this.numComps = 3;
-    this.defaultColor = [0, 0, 0];
-
-    if (!whitePoint)
-      error('WhitePoint missing - required for color space Lab');
-    blackPoint = blackPoint || [0, 0, 0];
-    range = range || [-100, 100, -100, 100];
-
-    // Translate args to spec variables
-    this.XW = whitePoint[0];
-    this.YW = whitePoint[1];
-    this.ZW = whitePoint[2];
-    this.amin = range[0];
-    this.amax = range[1];
-    this.bmin = range[2];
-    this.bmax = range[3];
-
-    // These are here just for completeness - the spec doesn't offer any
-    // formulas that use BlackPoint in Lab
-    this.XB = blackPoint[0];
-    this.YB = blackPoint[1];
-    this.ZB = blackPoint[2];
-
-    // Validate vars as per spec
-    if (this.XW < 0 || this.ZW < 0 || this.YW !== 1)
-      error('Invalid WhitePoint components, no fallback available');
-
-    if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
-      warn('Invalid BlackPoint, falling back to default');
-      this.XB = this.YB = this.ZB = 0;
-    }
-
-    if (this.amin > this.amax || this.bmin > this.bmax) {
-      warn('Invalid Range, falling back to defaults');
-      this.amin = -100;
-      this.amax = 100;
-      this.bmin = -100;
-      this.bmax = 100;
-    }
-  };
-
-  // Function g(x) from spec
-  function g(x) {
-    if (x >= 6 / 29)
-      return x * x * x;
-    else
-      return (108 / 841) * (x - 4 / 29);
-  }
-
-  LabCS.prototype = {
-    getRgb: function LabCS_getRgb(color) {
-      // Ls,as,bs <---> L*,a*,b* in the spec
-      var Ls = color[0], as = color[1], bs = color[2];
-
-      // Adjust limits of 'as' and 'bs'
-      as = as > this.amax ? this.amax : as;
-      as = as < this.amin ? this.amin : as;
-      bs = bs > this.bmax ? this.bmax : bs;
-      bs = bs < this.bmin ? this.bmin : bs;
-
-      // Computes intermediate variables X,Y,Z as per spec
-      var M = (Ls + 16) / 116;
-      var L = M + (as / 500);
-      var N = M - (bs / 200);
-      var X = this.XW * g(L);
-      var Y = this.YW * g(M);
-      var Z = this.ZW * g(N);
-
-      // XYZ to RGB 3x3 matrix, from:
-      // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18
-      var XYZtoRGB = [3.240479, -1.537150, -0.498535,
-                      -0.969256, 1.875992, 0.041556,
-                      0.055648, -0.204043, 1.057311];
-
-      return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]);
-    },
-    getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
-      if (bits == 8)
-        return input;
-      var scale = 255 / ((1 << bits) - 1);
-      var i, length = input.length / 3;
-      var rgbBuf = new Uint8Array(length);
-
-      var j = 0;
-      for (i = 0; i < length; ++i) {
-        // Convert L*, a*, s* into RGB
-        var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]);
-        rgbBuf[j++] = rgb[0];
-        rgbBuf[j++] = rgb[1];
-        rgbBuf[j++] = rgb[2];
-      }
-
-      return rgbBuf;
-    },
-    isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
-      // From Table 90 in Adobe's:
-      // "Document management - Portable document format", 1st ed, 2008
-      if (decodeMap[0] === 0 && decodeMap[1] === 100 &&
-          decodeMap[2] === this.amin && decodeMap[3] === this.amax &&
-          decodeMap[4] === this.bmin && decodeMap[5] === this.bmax)
-        return true;
-      else
-        return false;
-    }
-  };
-  return LabCS;
-})();
diff --git a/apps/files_pdfviewer/js/pdfjs/src/core.js b/apps/files_pdfviewer/js/pdfjs/src/core.js
deleted file mode 100644
index 15cd147e2c2938175278a48412c04ea224dab8c4..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/core.js
+++ /dev/null
@@ -1,880 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var globalScope = (typeof window === 'undefined') ? this : window;
-
-var isWorker = (typeof window == 'undefined');
-
-var ERRORS = 0, WARNINGS = 1, TODOS = 5;
-var verbosity = WARNINGS;
-
-// The global PDFJS object exposes the API
-// In production, it will be declared outside a global wrapper
-// In development, it will be declared here
-if (!globalScope.PDFJS) {
-  globalScope.PDFJS = {};
-}
-
-// getPdf()
-// Convenience function to perform binary Ajax GET
-// Usage: getPdf('http://...', callback)
-//        getPdf({
-//                 url:String ,
-//                 [,progress:Function, error:Function]
-//               },
-//               callback)
-function getPdf(arg, callback) {
-  var params = arg;
-  if (typeof arg === 'string')
-    params = { url: arg };
-
-  var xhr = new XMLHttpRequest();
-  xhr.open('GET', params.url);
-  xhr.mozResponseType = xhr.responseType = 'arraybuffer';
-  var protocol = params.url.indexOf(':') < 0 ? window.location.protocol :
-    params.url.substring(0, params.url.indexOf(':') + 1);
-  xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0;
-
-  if ('progress' in params)
-    xhr.onprogress = params.progress || undefined;
-
-  if ('error' in params)
-    xhr.onerror = params.error || undefined;
-
-  xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
-    if (xhr.readyState === 4) {
-      if (xhr.status === xhr.expected) {
-        var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
-                    xhr.responseArrayBuffer || xhr.response);
-        callback(data);
-      } else if (params.error) {
-        params.error(e);
-      }
-    }
-  };
-  xhr.send(null);
-}
-globalScope.PDFJS.getPdf = getPdf;
-globalScope.PDFJS.pdfBug = false;
-
-var Page = (function PageClosure() {
-  function Page(xref, pageNumber, pageDict, ref) {
-    this.pageNumber = pageNumber;
-    this.pageDict = pageDict;
-    this.stats = new StatTimer();
-    this.stats.enabled = !!globalScope.PDFJS.enableStats;
-    this.xref = xref;
-    this.ref = ref;
-
-    this.displayReadyPromise = null;
-  }
-
-  Page.prototype = {
-    getPageProp: function Page_getPageProp(key) {
-      return this.pageDict.get(key);
-    },
-    inheritPageProp: function Page_inheritPageProp(key) {
-      var dict = this.pageDict;
-      var obj = dict.get(key);
-      while (obj === undefined) {
-        dict = dict.get('Parent');
-        if (!dict)
-          break;
-        obj = dict.get(key);
-      }
-      return obj;
-    },
-    get content() {
-      return shadow(this, 'content', this.getPageProp('Contents'));
-    },
-    get resources() {
-      return shadow(this, 'resources', this.inheritPageProp('Resources'));
-    },
-    get mediaBox() {
-      var obj = this.inheritPageProp('MediaBox');
-      // Reset invalid media box to letter size.
-      if (!isArray(obj) || obj.length !== 4)
-        obj = [0, 0, 612, 792];
-      return shadow(this, 'mediaBox', obj);
-    },
-    get view() {
-      var cropBox = this.inheritPageProp('CropBox');
-      var view = {
-        x: 0,
-        y: 0,
-        width: this.width,
-        height: this.height
-      };
-      if (!isArray(cropBox) || cropBox.length !== 4)
-        return shadow(this, 'view', view);
-
-      var mediaBox = this.mediaBox;
-      var offsetX = mediaBox[0], offsetY = mediaBox[1];
-
-      // From the spec, 6th ed., p.963:
-      // "The crop, bleed, trim, and art boxes should not ordinarily
-      // extend beyond the boundaries of the media box. If they do, they are
-      // effectively reduced to their intersection with the media box."
-      cropBox = Util.intersect(cropBox, mediaBox);
-      if (!cropBox)
-        return shadow(this, 'view', view);
-
-      var tl = this.rotatePoint(cropBox[0] - offsetX, cropBox[1] - offsetY);
-      var br = this.rotatePoint(cropBox[2] - offsetX, cropBox[3] - offsetY);
-      view.x = Math.min(tl.x, br.x);
-      view.y = Math.min(tl.y, br.y);
-      view.width = Math.abs(tl.x - br.x);
-      view.height = Math.abs(tl.y - br.y);
-
-      return shadow(this, 'view', view);
-    },
-    get annotations() {
-      return shadow(this, 'annotations', this.inheritPageProp('Annots'));
-    },
-    get width() {
-      var mediaBox = this.mediaBox;
-      var rotate = this.rotate;
-      var width;
-      if (rotate == 0 || rotate == 180) {
-        width = (mediaBox[2] - mediaBox[0]);
-      } else {
-        width = (mediaBox[3] - mediaBox[1]);
-      }
-      return shadow(this, 'width', width);
-    },
-    get height() {
-      var mediaBox = this.mediaBox;
-      var rotate = this.rotate;
-      var height;
-      if (rotate == 0 || rotate == 180) {
-        height = (mediaBox[3] - mediaBox[1]);
-      } else {
-        height = (mediaBox[2] - mediaBox[0]);
-      }
-      return shadow(this, 'height', height);
-    },
-    get rotate() {
-      var rotate = this.inheritPageProp('Rotate') || 0;
-      // Normalize rotation so it's a multiple of 90 and between 0 and 270
-      if (rotate % 90 != 0) {
-        rotate = 0;
-      } else if (rotate >= 360) {
-        rotate = rotate % 360;
-      } else if (rotate < 0) {
-        // The spec doesn't cover negatives, assume its counterclockwise
-        // rotation. The following is the other implementation of modulo.
-        rotate = ((rotate % 360) + 360) % 360;
-      }
-      return shadow(this, 'rotate', rotate);
-    },
-
-    startRenderingFromOperatorList:
-      function Page_startRenderingFromOperatorList(operatorList, fonts) {
-      var self = this;
-      this.operatorList = operatorList;
-
-      var displayContinuation = function pageDisplayContinuation() {
-        // Always defer call to display() to work around bug in
-        // Firefox error reporting from XHR callbacks.
-        setTimeout(function pageSetTimeout() {
-          self.displayReadyPromise.resolve();
-        });
-      };
-
-      this.ensureFonts(fonts,
-        function pageStartRenderingFromOperatorListEnsureFonts() {
-          displayContinuation();
-        }
-      );
-    },
-
-    getOperatorList: function Page_getOperatorList(handler, dependency) {
-      if (this.operatorList) {
-        // content was compiled
-        return this.operatorList;
-      }
-
-      this.stats.time('Build IR Queue');
-
-      var xref = this.xref;
-      var content = this.content;
-      var resources = this.resources;
-      if (isArray(content)) {
-        // fetching items
-        var i, n = content.length;
-        for (i = 0; i < n; ++i)
-          content[i] = xref.fetchIfRef(content[i]);
-        content = new StreamsSequenceStream(content);
-      } else if (!content) {
-        // replacing non-existent page content with empty one
-        content = new Stream(new Uint8Array(0));
-      }
-
-      var pe = this.pe = new PartialEvaluator(
-                                xref, handler, 'p' + this.pageNumber + '_');
-
-      this.operatorList = pe.getOperatorList(content, resources, dependency);
-      this.stats.timeEnd('Build IR Queue');
-      return this.operatorList;
-    },
-
-    ensureFonts: function Page_ensureFonts(fonts, callback) {
-      this.stats.time('Font Loading');
-      // Convert the font names to the corresponding font obj.
-      for (var i = 0, ii = fonts.length; i < ii; i++) {
-        fonts[i] = this.objs.objs[fonts[i]].data;
-      }
-
-      // Load all the fonts
-      FontLoader.bind(
-        fonts,
-        function pageEnsureFontsFontObjs(fontObjs) {
-          this.stats.timeEnd('Font Loading');
-
-          callback.call(this);
-        }.bind(this)
-      );
-    },
-
-    display: function Page_display(gfx, callback) {
-      var stats = this.stats;
-      stats.time('Rendering');
-      var xref = this.xref;
-      var resources = this.resources;
-      var mediaBox = this.mediaBox;
-      assertWellFormed(isDict(resources), 'invalid page resources');
-
-      gfx.xref = xref;
-      gfx.res = resources;
-      gfx.beginDrawing({ x: mediaBox[0], y: mediaBox[1],
-            width: this.width,
-            height: this.height,
-            rotate: this.rotate });
-
-      var startIdx = 0;
-      var length = this.operatorList.fnArray.length;
-      var operatorList = this.operatorList;
-      var stepper = null;
-      if (PDFJS.pdfBug && StepperManager.enabled) {
-        stepper = StepperManager.create(this.pageNumber);
-        stepper.init(operatorList);
-        stepper.nextBreakPoint = stepper.getNextBreakPoint();
-      }
-
-      var self = this;
-      function next() {
-        startIdx =
-          gfx.executeOperatorList(operatorList, startIdx, next, stepper);
-        if (startIdx == length) {
-          gfx.endDrawing();
-          stats.timeEnd('Rendering');
-          stats.timeEnd('Overall');
-          if (callback) callback();
-        }
-      }
-      next();
-    },
-    rotatePoint: function Page_rotatePoint(x, y, reverse) {
-      var rotate = reverse ? (360 - this.rotate) : this.rotate;
-      switch (rotate) {
-        case 180:
-          return {x: this.width - x, y: y};
-        case 90:
-          return {x: this.width - y, y: this.height - x};
-        case 270:
-          return {x: y, y: x};
-        case 360:
-        case 0:
-        default:
-          return {x: x, y: this.height - y};
-      }
-    },
-    getLinks: function Page_getLinks() {
-      var links = [];
-      var annotations = pageGetAnnotations();
-      var i, n = annotations.length;
-      for (i = 0; i < n; ++i) {
-        if (annotations[i].type != 'Link')
-          continue;
-        links.push(annotations[i]);
-      }
-      return links;
-    },
-    getAnnotations: function Page_getAnnotations() {
-      var xref = this.xref;
-      function getInheritableProperty(annotation, name) {
-        var item = annotation;
-        while (item && !item.has(name)) {
-          item = item.get('Parent');
-        }
-        if (!item)
-          return null;
-        return item.get(name);
-      }
-      function isValidUrl(url) {
-        if (!url)
-          return false;
-        var colon = url.indexOf(':');
-        if (colon < 0)
-          return false;
-        var protocol = url.substr(0, colon);
-        switch (protocol) {
-          case 'http':
-          case 'https':
-          case 'ftp':
-            return true;
-          default:
-            return false;
-        }
-      }
-
-      var annotations = this.annotations || [];
-      var i, n = annotations.length;
-      var items = [];
-      for (i = 0; i < n; ++i) {
-        var annotationRef = annotations[i];
-        var annotation = xref.fetch(annotationRef);
-        if (!isDict(annotation))
-          continue;
-        var subtype = annotation.get('Subtype');
-        if (!isName(subtype))
-          continue;
-        var rect = annotation.get('Rect');
-        var topLeftCorner = this.rotatePoint(rect[0], rect[1]);
-        var bottomRightCorner = this.rotatePoint(rect[2], rect[3]);
-
-        var item = {};
-        item.type = subtype.name;
-        item.x = Math.min(topLeftCorner.x, bottomRightCorner.x);
-        item.y = Math.min(topLeftCorner.y, bottomRightCorner.y);
-        item.width = Math.abs(topLeftCorner.x - bottomRightCorner.x);
-        item.height = Math.abs(topLeftCorner.y - bottomRightCorner.y);
-        switch (subtype.name) {
-          case 'Link':
-            var a = annotation.get('A');
-            if (a) {
-              switch (a.get('S').name) {
-                case 'URI':
-                  var url = a.get('URI');
-                  // TODO: pdf spec mentions urls can be relative to a Base
-                  // entry in the dictionary.
-                  if (!isValidUrl(url))
-                    url = '';
-                  item.url = url;
-                  break;
-                case 'GoTo':
-                  item.dest = a.get('D');
-                  break;
-                default:
-                  TODO('other link types');
-              }
-            } else if (annotation.has('Dest')) {
-              // simple destination link
-              var dest = annotation.get('Dest');
-              item.dest = isName(dest) ? dest.name : dest;
-            }
-            break;
-          case 'Widget':
-            var fieldType = getInheritableProperty(annotation, 'FT');
-            if (!isName(fieldType))
-              break;
-            item.fieldType = fieldType.name;
-            // Building the full field name by collecting the field and
-            // its ancestors 'T' properties and joining them using '.'.
-            var fieldName = [];
-            var namedItem = annotation, ref = annotationRef;
-            while (namedItem) {
-              var parent = namedItem.get('Parent');
-              var parentRef = namedItem.getRaw('Parent');
-              var name = namedItem.get('T');
-              if (name) {
-                fieldName.unshift(stringToPDFString(name));
-              } else {
-                // The field name is absent, that means more than one field
-                // with the same name may exist. Replacing the empty name
-                // with the '`' plus index in the parent's 'Kids' array.
-                // This is not in the PDF spec but necessary to id the
-                // the input controls.
-                var kids = parent.get('Kids');
-                var j, jj;
-                for (j = 0, jj = kids.length; j < jj; j++) {
-                  var kidRef = kids[j];
-                  if (kidRef.num == ref.num && kidRef.gen == ref.gen)
-                    break;
-                }
-                fieldName.unshift('`' + j);
-              }
-              namedItem = parent;
-              ref = parentRef;
-            }
-            item.fullName = fieldName.join('.');
-            var alternativeText = stringToPDFString(annotation.get('TU') || '');
-            item.alternativeText = alternativeText;
-            var da = getInheritableProperty(annotation, 'DA') || '';
-            var m = /([\d\.]+)\sTf/.exec(da);
-            if (m)
-              item.fontSize = parseFloat(m[1]);
-            item.textAlignment = getInheritableProperty(annotation, 'Q');
-            item.flags = getInheritableProperty(annotation, 'Ff') || 0;
-            break;
-          case 'Text':
-            var content = annotation.get('Contents');
-            var title = annotation.get('T');
-            item.content = stringToPDFString(content || '');
-            item.title = stringToPDFString(title || '');
-            item.name = annotation.get('Name').name;
-            break;
-          default:
-            TODO('unimplemented annotation type: ' + subtype.name);
-            break;
-        }
-        items.push(item);
-      }
-      return items;
-    },
-    startRendering: function Page_startRendering(ctx, callback, textLayer)  {
-      var stats = this.stats;
-      stats.time('Overall');
-      // If there is no displayReadyPromise yet, then the operatorList was never
-      // requested before. Make the request and create the promise.
-      if (!this.displayReadyPromise) {
-        this.pdf.startRendering(this);
-        this.displayReadyPromise = new Promise();
-      }
-
-      // Once the operatorList and fonts are loaded, do the actual rendering.
-      this.displayReadyPromise.then(
-        function pageDisplayReadyPromise() {
-          var gfx = new CanvasGraphics(ctx, this.objs, textLayer);
-          try {
-            this.display(gfx, callback);
-          } catch (e) {
-            if (callback)
-              callback(e);
-            else
-              error(e);
-          }
-        }.bind(this),
-        function pageDisplayReadPromiseError(reason) {
-          if (callback)
-            callback(reason);
-          else
-            error(reason);
-        }
-      );
-    }
-  };
-
-  return Page;
-})();
-
-/**
- * The `PDFDocModel` holds all the data of the PDF file. Compared to the
- * `PDFDoc`, this one doesn't have any job management code.
- * Right now there exists one PDFDocModel on the main thread + one object
- * for each worker. If there is no worker support enabled, there are two
- * `PDFDocModel` objects on the main thread created.
- */
-var PDFDocModel = (function PDFDocModelClosure() {
-  function PDFDocModel(arg, callback) {
-    if (isStream(arg))
-      init.call(this, arg);
-    else if (isArrayBuffer(arg))
-      init.call(this, new Stream(arg));
-    else
-      error('PDFDocModel: Unknown argument type');
-  }
-
-  function init(stream) {
-    assertWellFormed(stream.length > 0, 'stream must have data');
-    this.stream = stream;
-    this.setup();
-    this.acroForm = this.catalog.catDict.get('AcroForm');
-  }
-
-  function find(stream, needle, limit, backwards) {
-    var pos = stream.pos;
-    var end = stream.end;
-    var str = '';
-    if (pos + limit > end)
-      limit = end - pos;
-    for (var n = 0; n < limit; ++n)
-      str += stream.getChar();
-    stream.pos = pos;
-    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
-    if (index == -1)
-      return false; /* not found */
-    stream.pos += index;
-    return true; /* found */
-  }
-
-  PDFDocModel.prototype = {
-    get linearization() {
-      var length = this.stream.length;
-      var linearization = false;
-      if (length) {
-        linearization = new Linearization(this.stream);
-        if (linearization.length != length)
-          linearization = false;
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'linearization', linearization);
-    },
-    get startXRef() {
-      var stream = this.stream;
-      var startXRef = 0;
-      var linearization = this.linearization;
-      if (linearization) {
-        // Find end of first obj.
-        stream.reset();
-        if (find(stream, 'endobj', 1024))
-          startXRef = stream.pos + 6;
-      } else {
-        // Find startxref by jumping backward from the end of the file.
-        var step = 1024;
-        var found = false, pos = stream.end;
-        while (!found && pos > 0) {
-          pos -= step - 'startxref'.length;
-          if (pos < 0)
-            pos = 0;
-          stream.pos = pos;
-          found = find(stream, 'startxref', step, true);
-        }
-        if (found) {
-          stream.skip(9);
-          var ch;
-          do {
-            ch = stream.getChar();
-          } while (Lexer.isSpace(ch));
-          var str = '';
-          while ((ch - '0') <= 9) {
-            str += ch;
-            ch = stream.getChar();
-          }
-          startXRef = parseInt(str, 10);
-          if (isNaN(startXRef))
-            startXRef = 0;
-        }
-      }
-      // shadow the prototype getter with a data property
-      return shadow(this, 'startXRef', startXRef);
-    },
-    get mainXRefEntriesOffset() {
-      var mainXRefEntriesOffset = 0;
-      var linearization = this.linearization;
-      if (linearization)
-        mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
-      // shadow the prototype getter with a data property
-      return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
-    },
-    // Find the header, remove leading garbage and setup the stream
-    // starting from the header.
-    checkHeader: function PDFDocModel_checkHeader() {
-      var stream = this.stream;
-      stream.reset();
-      if (find(stream, '%PDF-', 1024)) {
-        // Found the header, trim off any garbage before it.
-        stream.moveStart();
-        return;
-      }
-      // May not be a PDF file, continue anyway.
-    },
-    setup: function PDFDocModel_setup(ownerPassword, userPassword) {
-      this.checkHeader();
-      var xref = new XRef(this.stream,
-                          this.startXRef,
-                          this.mainXRefEntriesOffset);
-      this.xref = xref;
-      this.catalog = new Catalog(xref);
-    },
-    get numPages() {
-      var linearization = this.linearization;
-      var num = linearization ? linearization.numPages : this.catalog.numPages;
-      // shadow the prototype getter
-      return shadow(this, 'numPages', num);
-    },
-    getDocumentInfo: function PDFDocModel_getDocumentInfo() {
-      var info;
-      if (this.xref.trailer.has('Info')) {
-        var infoDict = this.xref.trailer.get('Info');
-
-        info = {};
-        infoDict.forEach(function(key, value) {
-          info[key] = typeof value !== 'string' ? value :
-            stringToPDFString(value);
-        });
-      }
-
-      return shadow(this, 'getDocumentInfo', info);
-    },
-    getFingerprint: function PDFDocModel_getFingerprint() {
-      var xref = this.xref, fileID;
-      if (xref.trailer.has('ID')) {
-        fileID = '';
-        var id = xref.trailer.get('ID')[0];
-        id.split('').forEach(function(el) {
-          fileID += Number(el.charCodeAt(0)).toString(16);
-        });
-      } else {
-        // If we got no fileID, then we generate one,
-        // from the first 100 bytes of PDF
-        var data = this.stream.bytes.subarray(0, 100);
-        var hash = calculateMD5(data, 0, data.length);
-        fileID = '';
-        for (var i = 0, length = hash.length; i < length; i++) {
-          fileID += Number(hash[i]).toString(16);
-        }
-      }
-
-      return shadow(this, 'getFingerprint', fileID);
-    },
-    getPage: function PDFDocModel_getPage(n) {
-      return this.catalog.getPage(n);
-    }
-  };
-
-  return PDFDocModel;
-})();
-
-var PDFDoc = (function PDFDocClosure() {
-  function PDFDoc(arg, callback) {
-    var stream = null;
-    var data = null;
-
-    if (isStream(arg)) {
-      stream = arg;
-      data = arg.bytes;
-    } else if (isArrayBuffer(arg)) {
-      stream = new Stream(arg);
-      data = arg;
-    } else {
-      error('PDFDoc: Unknown argument type');
-    }
-
-    this.data = data;
-    this.stream = stream;
-    this.pdfModel = new PDFDocModel(stream);
-    this.fingerprint = this.pdfModel.getFingerprint();
-    this.info = this.pdfModel.getDocumentInfo();
-    this.catalog = this.pdfModel.catalog;
-    this.objs = new PDFObjects();
-
-    this.pageCache = [];
-    this.fontsLoading = {};
-    this.workerReadyPromise = new Promise('workerReady');
-
-    // If worker support isn't disabled explicit and the browser has worker
-    // support, create a new web worker and test if it/the browser fullfills
-    // all requirements to run parts of pdf.js in a web worker.
-    // Right now, the requirement is, that an Uint8Array is still an Uint8Array
-    // as it arrives on the worker. Chrome added this with version 15.
-    if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
-      var workerSrc = PDFJS.workerSrc;
-      if (typeof workerSrc === 'undefined') {
-        error('No PDFJS.workerSrc specified');
-      }
-
-      try {
-        var worker;
-        if (PDFJS.isFirefoxExtension) {
-          // The firefox extension can't load the worker from the resource://
-          // url so we have to inline the script and then use the blob loader.
-          var bb = new MozBlobBuilder();
-          bb.append(document.querySelector('#PDFJS_SCRIPT_TAG').textContent);
-          var blobUrl = window.URL.createObjectURL(bb.getBlob());
-          worker = new Worker(blobUrl);
-        } else {
-          // Some versions of FF can't create a worker on localhost, see:
-          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
-          worker = new Worker(workerSrc);
-        }
-
-        var messageHandler = new MessageHandler('main', worker);
-
-        messageHandler.on('test', function pdfDocTest(supportTypedArray) {
-          if (supportTypedArray) {
-            this.worker = worker;
-            this.setupMessageHandler(messageHandler);
-          } else {
-            globalScope.PDFJS.disableWorker = true;
-            this.setupFakeWorker();
-          }
-        }.bind(this));
-
-        var testObj = new Uint8Array(1);
-        // Some versions of Opera throw a DATA_CLONE_ERR on
-        // serializing the typed array.
-        messageHandler.send('test', testObj);
-        return;
-      } catch (e) {
-        warn('The worker has been disabled.');
-      }
-    }
-    // Either workers are disabled, not supported or have thrown an exception.
-    // Thus, we fallback to a faked worker.
-    globalScope.PDFJS.disableWorker = true;
-    this.setupFakeWorker();
-  }
-
-  PDFDoc.prototype = {
-    setupFakeWorker: function PDFDoc_setupFakeWorker() {
-      // If we don't use a worker, just post/sendMessage to the main thread.
-      var fakeWorker = {
-        postMessage: function PDFDoc_postMessage(obj) {
-          fakeWorker.onmessage({data: obj});
-        },
-        terminate: function PDFDoc_terminate() {}
-      };
-
-      var messageHandler = new MessageHandler('main', fakeWorker);
-      this.setupMessageHandler(messageHandler);
-
-      // If the main thread is our worker, setup the handling for the messages
-      // the main thread sends to it self.
-      WorkerMessageHandler.setup(messageHandler);
-    },
-
-
-    setupMessageHandler: function PDFDoc_setupMessageHandler(messageHandler) {
-      this.messageHandler = messageHandler;
-
-      messageHandler.on('page', function pdfDocPage(data) {
-        var pageNum = data.pageNum;
-        var page = this.pageCache[pageNum];
-        var depFonts = data.depFonts;
-
-        page.stats.timeEnd('Page Request');
-        page.startRenderingFromOperatorList(data.operatorList, depFonts);
-      }, this);
-
-      messageHandler.on('obj', function pdfDocObj(data) {
-        var id = data[0];
-        var type = data[1];
-
-        switch (type) {
-          case 'JpegStream':
-            var imageData = data[2];
-            loadJpegStream(id, imageData, this.objs);
-            break;
-          case 'Image':
-            var imageData = data[2];
-            this.objs.resolve(id, imageData);
-            break;
-          case 'Font':
-            var name = data[2];
-            var file = data[3];
-            var properties = data[4];
-
-            if (file) {
-              // Rewrap the ArrayBuffer in a stream.
-              var fontFileDict = new Dict();
-              file = new Stream(file, 0, file.length, fontFileDict);
-            }
-
-            // At this point, only the font object is created but the font is
-            // not yet attached to the DOM. This is done in `FontLoader.bind`.
-            var font = new Font(name, file, properties);
-            this.objs.resolve(id, font);
-            break;
-          default:
-            error('Got unkown object type ' + type);
-        }
-      }, this);
-
-      messageHandler.on('page_error', function pdfDocError(data) {
-        var page = this.pageCache[data.pageNum];
-        if (page.displayReadyPromise)
-          page.displayReadyPromise.reject(data.error);
-        else
-          error(data.error);
-      }, this);
-
-      messageHandler.on('jpeg_decode', function(data, promise) {
-        var imageData = data[0];
-        var components = data[1];
-        if (components != 3 && components != 1)
-          error('Only 3 component or 1 component can be returned');
-
-        var img = new Image();
-        img.onload = (function messageHandler_onloadClosure() {
-          var width = img.width;
-          var height = img.height;
-          var size = width * height;
-          var rgbaLength = size * 4;
-          var buf = new Uint8Array(size * components);
-          var tmpCanvas = createScratchCanvas(width, height);
-          var tmpCtx = tmpCanvas.getContext('2d');
-          tmpCtx.drawImage(img, 0, 0);
-          var data = tmpCtx.getImageData(0, 0, width, height).data;
-
-          if (components == 3) {
-            for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
-              buf[j] = data[i];
-              buf[j + 1] = data[i + 1];
-              buf[j + 2] = data[i + 2];
-            }
-          } else if (components == 1) {
-            for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
-              buf[j] = data[i];
-            }
-          }
-          promise.resolve({ data: buf, width: width, height: height});
-        }).bind(this);
-        var src = 'data:image/jpeg;base64,' + window.btoa(imageData);
-        img.src = src;
-      });
-
-      setTimeout(function pdfDocFontReadySetTimeout() {
-        messageHandler.send('doc', this.data);
-        this.workerReadyPromise.resolve(true);
-      }.bind(this));
-    },
-
-    get numPages() {
-      return this.pdfModel.numPages;
-    },
-
-    startRendering: function PDFDoc_startRendering(page) {
-      // The worker might not be ready to receive the page request yet.
-      this.workerReadyPromise.then(function pdfDocStartRenderingThen() {
-        page.stats.time('Page Request');
-        this.messageHandler.send('page_request', page.pageNumber + 1);
-      }.bind(this));
-    },
-
-    getPage: function PDFDoc_getPage(n) {
-      if (this.pageCache[n])
-        return this.pageCache[n];
-
-      var page = this.pdfModel.getPage(n);
-      // Add a reference to the objects such that Page can forward the reference
-      // to the CanvasGraphics and so on.
-      page.objs = this.objs;
-      page.pdf = this;
-      return (this.pageCache[n] = page);
-    },
-
-    destroy: function PDFDoc_destroy() {
-      if (this.worker)
-        this.worker.terminate();
-
-      if (this.fontWorker)
-        this.fontWorker.terminate();
-
-      for (var n in this.pageCache)
-        delete this.pageCache[n];
-
-      delete this.data;
-      delete this.stream;
-      delete this.pdf;
-      delete this.catalog;
-    }
-  };
-
-  return PDFDoc;
-})();
-
-globalScope.PDFJS.PDFDoc = PDFDoc;
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/crypto.js b/apps/files_pdfviewer/js/pdfjs/src/crypto.js
deleted file mode 100644
index 038c0e3327fb77f66228eec9b19b8c9fb40cb5bd..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/crypto.js
+++ /dev/null
@@ -1,596 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var ARCFourCipher = (function ARCFourCipherClosure() {
-  function ARCFourCipher(key) {
-    this.a = 0;
-    this.b = 0;
-    var s = new Uint8Array(256);
-    var i, j = 0, tmp, keyLength = key.length;
-    for (i = 0; i < 256; ++i)
-      s[i] = i;
-    for (i = 0; i < 256; ++i) {
-      tmp = s[i];
-      j = (j + tmp + key[i % keyLength]) & 0xFF;
-      s[i] = s[j];
-      s[j] = tmp;
-    }
-    this.s = s;
-  }
-
-  ARCFourCipher.prototype = {
-    encryptBlock: function ARCFourCipher_encryptBlock(data) {
-      var i, n = data.length, tmp, tmp2;
-      var a = this.a, b = this.b, s = this.s;
-      var output = new Uint8Array(n);
-      for (i = 0; i < n; ++i) {
-        a = (a + 1) & 0xFF;
-        tmp = s[a];
-        b = (b + tmp) & 0xFF;
-        tmp2 = s[b];
-        s[a] = tmp2;
-        s[b] = tmp;
-        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
-      }
-      this.a = a;
-      this.b = b;
-      return output;
-    }
-  };
-  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
-
-  return ARCFourCipher;
-})();
-
-var calculateMD5 = (function calculateMD5Closure() {
-  var r = new Uint8Array([
-    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
-    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
-    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
-    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
-
-  var k = new Int32Array([
-    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
-    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
-    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
-    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
-    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
-    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
-    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
-    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
-    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
-    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
-    -145523070, -1120210379, 718787259, -343485551]);
-
-  function hash(data, offset, length) {
-    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
-    // pre-processing
-    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
-    var padded = new Uint8Array(paddedLength);
-    var i, j, n;
-    for (i = 0; i < length; ++i)
-      padded[i] = data[offset++];
-    padded[i++] = 0x80;
-    n = paddedLength - 8;
-    while (i < n)
-      padded[i++] = 0;
-    padded[i++] = (length << 3) & 0xFF;
-    padded[i++] = (length >> 5) & 0xFF;
-    padded[i++] = (length >> 13) & 0xFF;
-    padded[i++] = (length >> 21) & 0xFF;
-    padded[i++] = (length >>> 29) & 0xFF;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    padded[i++] = 0;
-    // chunking
-    // TODO ArrayBuffer ?
-    var w = new Int32Array(16);
-    for (i = 0; i < paddedLength;) {
-      for (j = 0; j < 16; ++j, i += 4) {
-        w[j] = (padded[i] | (padded[i + 1] << 8) |
-                (padded[i + 2] << 16) | (padded[i + 3] << 24));
-      }
-      var a = h0, b = h1, c = h2, d = h3, f, g;
-      for (j = 0; j < 64; ++j) {
-        if (j < 16) {
-          f = (b & c) | ((~b) & d);
-          g = j;
-        } else if (j < 32) {
-          f = (d & b) | ((~d) & c);
-          g = (5 * j + 1) & 15;
-        } else if (j < 48) {
-          f = b ^ c ^ d;
-          g = (3 * j + 5) & 15;
-        } else {
-          f = c ^ (b | (~d));
-          g = (7 * j) & 15;
-        }
-        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
-        d = c;
-        c = b;
-        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
-        a = tmp;
-      }
-      h0 = (h0 + a) | 0;
-      h1 = (h1 + b) | 0;
-      h2 = (h2 + c) | 0;
-      h3 = (h3 + d) | 0;
-    }
-    return new Uint8Array([
-        h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
-        h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
-        h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
-        h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
-    ]);
-  }
-  return hash;
-})();
-
-var NullCipher = (function NullCipherClosure() {
-  function NullCipher() {
-  }
-
-  NullCipher.prototype = {
-    decryptBlock: function NullCipher_decryptBlock(data) {
-      return data;
-    }
-  };
-
-  return NullCipher;
-})();
-
-var AES128Cipher = (function AES128CipherClosure() {
-  var rcon = new Uint8Array([
-    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
-    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
-    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-    0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
-    0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
-    0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
-    0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
-    0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
-    0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
-    0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
-    0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
-    0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
-    0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
-    0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
-    0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
-    0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
-    0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
-    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
-    0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
-    0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
-    0x74, 0xe8, 0xcb, 0x8d]);
-
-  var s = new Uint8Array([
-    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
-    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
-    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
-    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
-    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
-    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
-    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
-    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
-    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
-    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
-    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
-    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
-    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
-    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
-    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
-    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
-    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
-    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
-    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
-    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
-    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
-    0xb0, 0x54, 0xbb, 0x16]);
-
-  var inv_s = new Uint8Array([
-    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
-    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
-    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
-    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
-    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
-    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
-    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
-    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
-    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
-    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
-    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
-    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
-    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
-    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
-    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
-    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
-    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
-    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
-    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
-    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
-    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
-    0x55, 0x21, 0x0c, 0x7d]);
-
-  var mix = new Uint32Array([
-    0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
-    0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
-    0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
-    0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
-    0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
-    0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
-    0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
-    0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
-    0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
-    0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
-    0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
-    0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
-    0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
-    0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
-    0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
-    0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
-    0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
-    0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
-    0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
-    0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
-    0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
-    0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
-    0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
-    0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
-    0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
-    0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
-    0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
-    0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
-    0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
-    0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
-    0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
-    0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
-    0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
-    0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
-    0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
-    0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
-    0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
-    0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
-    0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
-    0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
-    0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
-    0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
-    0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
-
-  function expandKey128(cipherKey) {
-    var b = 176, result = new Uint8Array(b);
-    result.set(cipherKey);
-    for (var j = 16, i = 1; j < b; ++i) {
-      // RotWord
-      var t1 = result[j - 3], t2 = result[j - 2],
-          t3 = result[j - 1], t4 = result[j - 4];
-      // SubWord
-      t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
-      // Rcon
-      t1 = t1 ^ rcon[i];
-      for (var n = 0; n < 4; ++n) {
-        result[j] = (t1 ^= result[j - 16]); j++;
-        result[j] = (t2 ^= result[j - 16]); j++;
-        result[j] = (t3 ^= result[j - 16]); j++;
-        result[j] = (t4 ^= result[j - 16]); j++;
-      }
-    }
-    return result;
-  }
-
-  function decrypt128(input, key) {
-    var state = new Uint8Array(16);
-    state.set(input);
-    var i, j, k;
-    var t, u, v;
-    // AddRoundKey
-    for (j = 0, k = 160; j < 16; ++j, ++k)
-      state[j] ^= key[k];
-    for (i = 9; i >= 1; --i) {
-      // InvShiftRows
-      t = state[13]; state[13] = state[9]; state[9] = state[5];
-      state[5] = state[1]; state[1] = t;
-      t = state[14]; u = state[10]; state[14] = state[6];
-      state[10] = state[2]; state[6] = t; state[2] = u;
-      t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
-      state[11] = t; state[7] = u; state[3] = v;
-      // InvSubBytes
-      for (j = 0; j < 16; ++j)
-        state[j] = inv_s[state[j]];
-      // AddRoundKey
-      for (j = 0, k = i * 16; j < 16; ++j, ++k)
-        state[j] ^= key[k];
-      // InvMixColumns
-      for (j = 0; j < 16; j += 4) {
-        var s0 = mix[state[j]], s1 = mix[state[j + 1]],
-            s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
-        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
-            (s3 >>> 24) ^ (s3 << 8));
-        state[j] = (t >>> 24) & 0xFF;
-        state[j + 1] = (t >> 16) & 0xFF;
-        state[j + 2] = (t >> 8) & 0xFF;
-        state[j + 3] = t & 0xFF;
-      }
-    }
-    // InvShiftRows
-    t = state[13]; state[13] = state[9]; state[9] = state[5];
-    state[5] = state[1]; state[1] = t;
-    t = state[14]; u = state[10]; state[14] = state[6];
-    state[10] = state[2]; state[6] = t; state[2] = u;
-    t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
-    state[11] = t; state[7] = u; state[3] = v;
-    for (j = 0; j < 16; ++j) {
-      // InvSubBytes
-      state[j] = inv_s[state[j]];
-      // AddRoundKey
-      state[j] ^= key[j];
-    }
-    return state;
-  }
-
-  function AES128Cipher(key) {
-    this.key = expandKey128(key);
-    this.buffer = new Uint8Array(16);
-    this.bufferPosition = 0;
-  }
-
-  function decryptBlock2(data) {
-    var i, j, ii, sourceLength = data.length,
-        buffer = this.buffer, bufferLength = this.bufferPosition,
-        result = [], iv = this.iv;
-    for (i = 0; i < sourceLength; ++i) {
-      buffer[bufferLength] = data[i];
-      ++bufferLength;
-      if (bufferLength < 16)
-        continue;
-      // buffer is full, decrypting
-      var plain = decrypt128(buffer, this.key);
-      // xor-ing the IV vector to get plain text
-      for (j = 0; j < 16; ++j)
-        plain[j] ^= iv[j];
-      iv = buffer;
-      result.push(plain);
-      buffer = new Uint8Array(16);
-      bufferLength = 0;
-    }
-    // saving incomplete buffer
-    this.buffer = buffer;
-    this.bufferLength = bufferLength;
-    this.iv = iv;
-    if (result.length == 0)
-      return new Uint8Array([]);
-    if (result.length == 1)
-      return result[0];
-    // combining plain text blocks into one
-    var output = new Uint8Array(16 * result.length);
-    for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
-      output.set(result[i], j);
-    return output;
-  }
-
-  AES128Cipher.prototype = {
-    decryptBlock: function AES128Cipher_decryptBlock(data) {
-      var i, sourceLength = data.length;
-      var buffer = this.buffer, bufferLength = this.bufferPosition;
-      // waiting for IV values -- they are at the start of the stream
-      for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
-        buffer[bufferLength] = data[i];
-      if (bufferLength < 16) {
-        // need more data
-        this.bufferLength = bufferLength;
-        return new Uint8Array([]);
-      }
-      this.iv = buffer;
-      this.buffer = new Uint8Array(16);
-      this.bufferLength = 0;
-      // starting decryption
-      this.decryptBlock = decryptBlock2;
-      return this.decryptBlock(data.subarray(16));
-    }
-  };
-
-  return AES128Cipher;
-})();
-
-var CipherTransform = (function CipherTransformClosure() {
-  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
-    this.stringCipherConstructor = stringCipherConstructor;
-    this.streamCipherConstructor = streamCipherConstructor;
-  }
-  CipherTransform.prototype = {
-    createStream: function CipherTransform_createStream(stream) {
-      var cipher = new this.streamCipherConstructor();
-      return new DecryptStream(stream,
-        function cipherTransformDecryptStream(data) {
-          return cipher.decryptBlock(data);
-        }
-      );
-    },
-    decryptString: function CipherTransform_decryptString(s) {
-      var cipher = new this.stringCipherConstructor();
-      var data = stringToBytes(s);
-      data = cipher.decryptBlock(data);
-      return bytesToString(data);
-    }
-  };
-  return CipherTransform;
-})();
-
-var CipherTransformFactory = (function CipherTransformFactoryClosure() {
-  function prepareKeyData(fileId, password, ownerPassword, userPassword,
-                          flags, revision, keyLength, encryptMetadata) {
-    var defaultPasswordBytes = new Uint8Array([
-      0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
-      0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
-      0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
-      0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
-    var hashData = new Uint8Array(100), i = 0, j, n;
-    if (password) {
-      n = Math.min(32, password.length);
-      for (; i < n; ++i)
-        hashData[i] = password[i];
-    }
-    j = 0;
-    while (i < 32) {
-      hashData[i++] = defaultPasswordBytes[j++];
-    }
-    // as now the padded password in the hashData[0..i]
-    for (j = 0, n = ownerPassword.length; j < n; ++j)
-      hashData[i++] = ownerPassword[j];
-    hashData[i++] = flags & 0xFF;
-    hashData[i++] = (flags >> 8) & 0xFF;
-    hashData[i++] = (flags >> 16) & 0xFF;
-    hashData[i++] = (flags >>> 24) & 0xFF;
-    for (j = 0, n = fileId.length; j < n; ++j)
-      hashData[i++] = fileId[j];
-    if (revision >= 4 && !encryptMetadata) {
-      hashData[i++] = 0xFF;
-      hashData[i++] = 0xFF;
-      hashData[i++] = 0xFF;
-      hashData[i++] = 0xFF;
-    }
-    var hash = calculateMD5(hashData, 0, i);
-    var keyLengthInBytes = keyLength >> 3;
-    if (revision >= 3) {
-      for (j = 0; j < 50; ++j) {
-         hash = calculateMD5(hash, 0, keyLengthInBytes);
-      }
-    }
-    var encryptionKey = hash.subarray(0, keyLengthInBytes);
-    var cipher, checkData;
-
-    if (revision >= 3) {
-      // padded password in hashData, we can use this array for user
-      // password check
-      i = 32;
-      for (j = 0, n = fileId.length; j < n; ++j)
-        hashData[i++] = fileId[j];
-      cipher = new ARCFourCipher(encryptionKey);
-      var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
-      n = encryptionKey.length;
-      var derivedKey = new Uint8Array(n), k;
-      for (j = 1; j <= 19; ++j) {
-        for (k = 0; k < n; ++k)
-          derivedKey[k] = encryptionKey[k] ^ j;
-        cipher = new ARCFourCipher(derivedKey);
-        checkData = cipher.encryptBlock(checkData);
-      }
-    } else {
-      cipher = new ARCFourCipher(encryptionKey);
-      checkData = cipher.encryptBlock(hashData.subarray(0, 32));
-    }
-    for (j = 0, n = checkData.length; j < n; ++j) {
-      if (userPassword[j] != checkData[j])
-        error('incorrect password');
-    }
-    return encryptionKey;
-  }
-
-  var identityName = new Name('Identity');
-
-  function CipherTransformFactory(dict, fileId, password) {
-    var filter = dict.get('Filter');
-    if (!isName(filter) || filter.name != 'Standard')
-      error('unknown encryption method');
-    this.dict = dict;
-    var algorithm = dict.get('V');
-    if (!isInt(algorithm) ||
-      (algorithm != 1 && algorithm != 2 && algorithm != 4))
-      error('unsupported encryption algorithm');
-    this.algorithm = algorithm;
-    var keyLength = dict.get('Length') || 40;
-    if (!isInt(keyLength) ||
-      keyLength < 40 || (keyLength % 8) != 0)
-      error('invalid key length');
-    // prepare keys
-    var ownerPassword = stringToBytes(dict.get('O'));
-    var userPassword = stringToBytes(dict.get('U'));
-    var flags = dict.get('P');
-    var revision = dict.get('R');
-    var encryptMetadata =
-      dict.get('EncryptMetadata') !== false; // makes true as default value
-    var fileIdBytes = stringToBytes(fileId);
-    var passwordBytes;
-    if (password)
-      passwordBytes = stringToBytes(password);
-
-    this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
-                                        ownerPassword, userPassword,
-                                        flags, revision,
-                                        keyLength, encryptMetadata);
-    if (algorithm == 4) {
-      this.cf = dict.get('CF');
-      this.stmf = dict.get('StmF') || identityName;
-      this.strf = dict.get('StrF') || identityName;
-      this.eff = dict.get('EFF') || this.strf;
-    }
-  }
-
-  function buildObjectKey(num, gen, encryptionKey, isAes) {
-    var key = new Uint8Array(encryptionKey.length + 9), i, n;
-    for (i = 0, n = encryptionKey.length; i < n; ++i)
-      key[i] = encryptionKey[i];
-    key[i++] = num & 0xFF;
-    key[i++] = (num >> 8) & 0xFF;
-    key[i++] = (num >> 16) & 0xFF;
-    key[i++] = gen & 0xFF;
-    key[i++] = (gen >> 8) & 0xFF;
-    if (isAes) {
-      key[i++] = 0x73;
-      key[i++] = 0x41;
-      key[i++] = 0x6C;
-      key[i++] = 0x54;
-    }
-    var hash = calculateMD5(key, 0, i);
-    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
-  }
-
-  function buildCipherConstructor(cf, name, num, gen, key) {
-    var cryptFilter = cf.get(name.name);
-    var cfm;
-    if (cryptFilter != null)
-      cfm = cryptFilter.get('CFM');
-    if (!cfm || cfm.name == 'None') {
-      return function cipherTransformFactoryBuildCipherConstructorNone() {
-        return new NullCipher();
-      };
-    }
-    if ('V2' == cfm.name) {
-      return function cipherTransformFactoryBuildCipherConstructorV2() {
-        return new ARCFourCipher(
-          buildObjectKey(num, gen, key, false));
-      };
-    }
-    if ('AESV2' == cfm.name) {
-      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
-        return new AES128Cipher(
-          buildObjectKey(num, gen, key, true));
-      };
-    }
-    error('Unknown crypto method');
-  }
-
-  CipherTransformFactory.prototype = {
-    createCipherTransform:
-      function CipherTransformFactory_createCipherTransform(num, gen) {
-      if (this.algorithm == 4) {
-        return new CipherTransform(
-          buildCipherConstructor(this.cf, this.stmf,
-            num, gen, this.encryptionKey),
-          buildCipherConstructor(this.cf, this.strf,
-            num, gen, this.encryptionKey));
-      }
-      // algorithms 1 and 2
-      var key = buildObjectKey(num, gen, this.encryptionKey, false);
-      var cipherConstructor = function buildCipherCipherConstructor() {
-        return new ARCFourCipher(key);
-      };
-      return new CipherTransform(cipherConstructor, cipherConstructor);
-    }
-  };
-
-  return CipherTransformFactory;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/evaluator.js b/apps/files_pdfviewer/js/pdfjs/src/evaluator.js
deleted file mode 100644
index 350ab20b2c55a5f293dccca5ecf945a203d02246..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/evaluator.js
+++ /dev/null
@@ -1,908 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var PartialEvaluator = (function PartialEvaluatorClosure() {
-  function PartialEvaluator(xref, handler, uniquePrefix) {
-    this.state = new EvalState();
-    this.stateStack = [];
-
-    this.xref = xref;
-    this.handler = handler;
-    this.uniquePrefix = uniquePrefix;
-    this.objIdCounter = 0;
-  }
-
-  var OP_MAP = {
-    // Graphics state
-    w: 'setLineWidth',
-    J: 'setLineCap',
-    j: 'setLineJoin',
-    M: 'setMiterLimit',
-    d: 'setDash',
-    ri: 'setRenderingIntent',
-    i: 'setFlatness',
-    gs: 'setGState',
-    q: 'save',
-    Q: 'restore',
-    cm: 'transform',
-
-    // Path
-    m: 'moveTo',
-    l: 'lineTo',
-    c: 'curveTo',
-    v: 'curveTo2',
-    y: 'curveTo3',
-    h: 'closePath',
-    re: 'rectangle',
-    S: 'stroke',
-    s: 'closeStroke',
-    f: 'fill',
-    F: 'fill',
-    'f*': 'eoFill',
-    B: 'fillStroke',
-    'B*': 'eoFillStroke',
-    b: 'closeFillStroke',
-    'b*': 'closeEOFillStroke',
-    n: 'endPath',
-
-    // Clipping
-    W: 'clip',
-    'W*': 'eoClip',
-
-    // Text
-    BT: 'beginText',
-    ET: 'endText',
-    Tc: 'setCharSpacing',
-    Tw: 'setWordSpacing',
-    Tz: 'setHScale',
-    TL: 'setLeading',
-    Tf: 'setFont',
-    Tr: 'setTextRenderingMode',
-    Ts: 'setTextRise',
-    Td: 'moveText',
-    TD: 'setLeadingMoveText',
-    Tm: 'setTextMatrix',
-    'T*': 'nextLine',
-    Tj: 'showText',
-    TJ: 'showSpacedText',
-    "'": 'nextLineShowText',
-    '"': 'nextLineSetSpacingShowText',
-
-    // Type3 fonts
-    d0: 'setCharWidth',
-    d1: 'setCharWidthAndBounds',
-
-    // Color
-    CS: 'setStrokeColorSpace',
-    cs: 'setFillColorSpace',
-    SC: 'setStrokeColor',
-    SCN: 'setStrokeColorN',
-    sc: 'setFillColor',
-    scn: 'setFillColorN',
-    G: 'setStrokeGray',
-    g: 'setFillGray',
-    RG: 'setStrokeRGBColor',
-    rg: 'setFillRGBColor',
-    K: 'setStrokeCMYKColor',
-    k: 'setFillCMYKColor',
-
-    // Shading
-    sh: 'shadingFill',
-
-    // Images
-    BI: 'beginInlineImage',
-    ID: 'beginImageData',
-    EI: 'endInlineImage',
-
-    // XObjects
-    Do: 'paintXObject',
-
-    // Marked content
-    MP: 'markPoint',
-    DP: 'markPointProps',
-    BMC: 'beginMarkedContent',
-    BDC: 'beginMarkedContentProps',
-    EMC: 'endMarkedContent',
-
-    // Compatibility
-    BX: 'beginCompat',
-    EX: 'endCompat'
-  };
-
-  function splitCombinedOperations(operations) {
-    // Two operations can be combined together, trying to find which two
-    // operations were concatenated.
-    for (var i = operations.length - 1; i > 0; i--) {
-      var op1 = operations.substring(0, i), op2 = operations.substring(i);
-      if (op1 in OP_MAP && op2 in OP_MAP)
-        return [op1, op2]; // operations found
-    }
-    return null;
-  }
-
-  PartialEvaluator.prototype = {
-    getOperatorList: function PartialEvaluator_getOperatorList(stream,
-                                                               resources,
-                                                               dependency,
-                                                               queue) {
-
-      var self = this;
-      var xref = this.xref;
-      var handler = this.handler;
-      var uniquePrefix = this.uniquePrefix || '';
-
-      function insertDependency(depList) {
-        fnArray.push('dependency');
-        argsArray.push(depList);
-        for (var i = 0, ii = depList.length; i < ii; i++) {
-          var dep = depList[i];
-          if (dependency.indexOf(dep) == -1) {
-            dependency.push(depList[i]);
-          }
-        }
-      }
-
-      function handleSetFont(fontName, font) {
-        var loadedName = null;
-
-        var fontRes = resources.get('Font');
-
-        assert(fontRes, 'fontRes not available');
-
-        font = xref.fetchIfRef(font) || fontRes.get(fontName);
-        assertWellFormed(isDict(font));
-        if (!font.translated) {
-          font.translated = self.translateFont(font, xref, resources,
-                                               dependency);
-          if (font.translated) {
-            // keep track of each font we translated so the caller can
-            // load them asynchronously before calling display on a page
-            loadedName = 'font_' + uniquePrefix + (++self.objIdCounter);
-            font.translated.properties.loadedName = loadedName;
-            font.loadedName = loadedName;
-
-            var translated = font.translated;
-            // Convert the file to an ArrayBuffer which will be turned back into
-            // a Stream in the main thread.
-            if (translated.file)
-              translated.file = translated.file.getBytes();
-            if (translated.properties.file) {
-              translated.properties.file =
-                  translated.properties.file.getBytes();
-            }
-
-            handler.send('obj', [
-                loadedName,
-                'Font',
-                translated.name,
-                translated.file,
-                translated.properties
-            ]);
-          }
-        }
-        loadedName = loadedName || font.loadedName;
-
-        // Ensure the font is ready before the font is set
-        // and later on used for drawing.
-        // OPTIMIZE: This should get insert to the operatorList only once per
-        // page.
-        insertDependency([loadedName]);
-        return loadedName;
-      }
-
-      function buildPaintImageXObject(image, inline) {
-        var dict = image.dict;
-        var w = dict.get('Width', 'W');
-        var h = dict.get('Height', 'H');
-
-        var imageMask = dict.get('ImageMask', 'IM') || false;
-        if (imageMask) {
-          // This depends on a tmpCanvas beeing filled with the
-          // current fillStyle, such that processing the pixel
-          // data can't be done here. Instead of creating a
-          // complete PDFImage, only read the information needed
-          // for later.
-
-          var width = dict.get('Width', 'W');
-          var height = dict.get('Height', 'H');
-          var bitStrideLength = (width + 7) >> 3;
-          var imgArray = image.getBytes(bitStrideLength * height);
-          var decode = dict.get('Decode', 'D');
-          var inverseDecode = !!decode && decode[0] > 0;
-
-          fn = 'paintImageMaskXObject';
-          args = [imgArray, inverseDecode, width, height];
-          return;
-        }
-
-        // If there is no imageMask, create the PDFImage and a lot
-        // of image processing can be done here.
-        var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
-        insertDependency([objId]);
-        args = [objId, w, h];
-
-        var softMask = dict.get('SMask', 'IM') || false;
-        if (!softMask && image instanceof JpegStream &&
-            image.isNativelySupported(xref, resources)) {
-          // These JPEGs don't need any more processing so we can just send it.
-          fn = 'paintJpegXObject';
-          handler.send('obj', [objId, 'JpegStream', image.getIR()]);
-          return;
-        }
-
-        fn = 'paintImageXObject';
-
-        PDFImage.buildImage(function(imageObj) {
-            var drawWidth = imageObj.drawWidth;
-            var drawHeight = imageObj.drawHeight;
-            var imgData = {
-              width: drawWidth,
-              height: drawHeight,
-              data: new Uint8Array(drawWidth * drawHeight * 4)
-            };
-            var pixels = imgData.data;
-            imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
-            handler.send('obj', [objId, 'Image', imgData]);
-          }, handler, xref, resources, image, inline);
-      }
-
-      if (!queue)
-        queue = {};
-
-      if (!queue.argsArray) {
-        queue.argsArray = [];
-      }
-      if (!queue.fnArray) {
-        queue.fnArray = [];
-      }
-
-      var fnArray = queue.fnArray, argsArray = queue.argsArray;
-      var dependencyArray = dependency || [];
-
-      resources = resources || new Dict();
-      var xobjs = resources.get('XObject') || new Dict();
-      var patterns = resources.get('Pattern') || new Dict();
-      var parser = new Parser(new Lexer(stream), false, xref);
-      var res = resources;
-      var hasNextObj = false, nextObj;
-      var args = [], obj;
-      var TILING_PATTERN = 1, SHADING_PATTERN = 2;
-
-      while (true) {
-        if (hasNextObj) {
-          obj = nextObj;
-          hasNextObj = false;
-        } else {
-          obj = parser.getObj();
-          if (isEOF(obj))
-            break;
-        }
-
-        if (isCmd(obj)) {
-          var cmd = obj.cmd;
-          var fn = OP_MAP[cmd];
-          if (!fn) {
-            // invalid content command, trying to recover
-            var cmds = splitCombinedOperations(cmd);
-            if (cmds) {
-              cmd = cmds[0];
-              fn = OP_MAP[cmd];
-              // feeding other command on the next interation
-              hasNextObj = true;
-              nextObj = Cmd.get(cmds[1]);
-            }
-          }
-          assertWellFormed(fn, 'Unknown command "' + cmd + '"');
-          // TODO figure out how to type-check vararg functions
-
-          if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
-            // compile tiling patterns
-            var patternName = args[args.length - 1];
-            // SCN/scn applies patterns along with normal colors
-            if (isName(patternName)) {
-              var pattern = patterns.get(patternName.name);
-              if (pattern) {
-                var dict = isStream(pattern) ? pattern.dict : pattern;
-                var typeNum = dict.get('PatternType');
-
-                if (typeNum == TILING_PATTERN) {
-                  // Create an IR of the pattern code.
-                  var depIdx = dependencyArray.length;
-                  var operatorList = this.getOperatorList(pattern,
-                      dict.get('Resources') || resources, dependencyArray);
-
-                  // Add the dependencies that are required to execute the
-                  // operatorList.
-                  insertDependency(dependencyArray.slice(depIdx));
-
-                  args = TilingPattern.getIR(operatorList, dict, args);
-                }
-                else if (typeNum == SHADING_PATTERN) {
-                  var shading = dict.get('Shading');
-                  var matrix = dict.get('Matrix');
-                  var pattern = Pattern.parseShading(shading, matrix, xref,
-                                                     res);
-                  args = pattern.getIR();
-                } else {
-                  error('Unkown PatternType ' + typeNum);
-                }
-              }
-            }
-          } else if (cmd == 'Do' && !args[0].code) {
-            // eagerly compile XForm objects
-            var name = args[0].name;
-            var xobj = xobjs.get(name);
-            if (xobj) {
-              assertWellFormed(isStream(xobj), 'XObject should be a stream');
-
-              var type = xobj.dict.get('Subtype');
-              assertWellFormed(
-                isName(type),
-                'XObject should have a Name subtype'
-              );
-
-              if ('Form' == type.name) {
-                var matrix = xobj.dict.get('Matrix');
-                var bbox = xobj.dict.get('BBox');
-
-                fnArray.push('paintFormXObjectBegin');
-                argsArray.push([matrix, bbox]);
-
-                // This adds the operatorList of the xObj to the current queue.
-                var depIdx = dependencyArray.length;
-
-                // Pass in the current `queue` object. That means the `fnArray`
-                // and the `argsArray` in this scope is reused and new commands
-                // are added to them.
-                this.getOperatorList(xobj,
-                    xobj.dict.get('Resources') || resources,
-                    dependencyArray, queue);
-
-               // Add the dependencies that are required to execute the
-               // operatorList.
-               insertDependency(dependencyArray.slice(depIdx));
-
-                fn = 'paintFormXObjectEnd';
-                args = [];
-              } else if ('Image' == type.name) {
-                buildPaintImageXObject(xobj, false);
-              } else {
-                error('Unhandled XObject subtype ' + type.name);
-              }
-            }
-          } else if (cmd == 'Tf') { // eagerly collect all fonts
-            args[0] = handleSetFont(args[0].name);
-          } else if (cmd == 'EI') {
-            buildPaintImageXObject(args[0], true);
-          }
-
-          switch (fn) {
-            // Parse the ColorSpace data to a raw format.
-            case 'setFillColorSpace':
-            case 'setStrokeColorSpace':
-              args = [ColorSpace.parseToIR(args[0], xref, resources)];
-              break;
-            case 'shadingFill':
-              var shadingRes = res.get('Shading');
-              if (!shadingRes)
-                error('No shading resource found');
-
-              var shading = shadingRes.get(args[0].name);
-              if (!shading)
-                error('No shading object found');
-
-              var shadingFill = Pattern.parseShading(shading, null, xref, res);
-              var patternIR = shadingFill.getIR();
-              args = [patternIR];
-              fn = 'shadingFill';
-              break;
-            case 'setGState':
-              var dictName = args[0];
-              var extGState = resources.get('ExtGState');
-
-              if (!isDict(extGState) || !extGState.has(dictName.name))
-                break;
-
-              var gsState = extGState.get(dictName.name);
-
-              // This array holds the converted/processed state data.
-              var gsStateObj = [];
-
-              gsState.forEach(
-                function canvasGraphicsSetGStateForEach(key, value) {
-                  switch (key) {
-                    case 'Type':
-                      break;
-                    case 'LW':
-                    case 'LC':
-                    case 'LJ':
-                    case 'ML':
-                    case 'D':
-                    case 'RI':
-                    case 'FL':
-                    case 'CA':
-                    case 'ca':
-                      gsStateObj.push([key, value]);
-                      break;
-                    case 'Font':
-                      gsStateObj.push([
-                        'Font',
-                        handleSetFont(null, value[0]),
-                        value[1]
-                      ]);
-                      break;
-                    case 'OP':
-                    case 'op':
-                    case 'OPM':
-                    case 'BG':
-                    case 'BG2':
-                    case 'UCR':
-                    case 'UCR2':
-                    case 'TR':
-                    case 'TR2':
-                    case 'HT':
-                    case 'SM':
-                    case 'SA':
-                    case 'BM':
-                    case 'SMask':
-                    case 'AIS':
-                    case 'TK':
-                      TODO('graphic state operator ' + key);
-                      break;
-                    default:
-                      warn('Unknown graphic state operator ' + key);
-                      break;
-                  }
-                }
-              );
-              args = [gsStateObj];
-              break;
-          } // switch
-
-          fnArray.push(fn);
-          argsArray.push(args);
-          args = [];
-        } else if (obj != null) {
-          assertWellFormed(args.length <= 33, 'Too many arguments');
-          args.push(obj);
-        }
-      }
-
-      return queue;
-    },
-
-    extractDataStructures: function
-      partialEvaluatorExtractDataStructures(dict, baseDict,
-                                            xref, properties) {
-      // 9.10.2
-      var toUnicode = dict.get('ToUnicode') ||
-        baseDict.get('ToUnicode');
-      if (toUnicode)
-        properties.toUnicode = this.readToUnicode(toUnicode, xref);
-
-      if (properties.composite) {
-        // CIDSystemInfo helps to match CID to glyphs
-        var cidSystemInfo = dict.get('CIDSystemInfo');
-        if (isDict(cidSystemInfo)) {
-          properties.cidSystemInfo = {
-            registry: cidSystemInfo.get('Registry'),
-            ordering: cidSystemInfo.get('Ordering'),
-            supplement: cidSystemInfo.get('Supplement')
-          };
-        }
-
-        var cidToGidMap = dict.get('CIDToGIDMap');
-        if (isStream(cidToGidMap))
-          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
-      }
-
-      var flags = properties.flags;
-      var differences = [];
-      var baseEncoding = !!(flags & FontFlags.Symbolic) ?
-                         Encodings.symbolsEncoding : Encodings.StandardEncoding;
-      var hasEncoding = dict.has('Encoding');
-      if (hasEncoding) {
-        var encoding = dict.get('Encoding');
-        if (isDict(encoding)) {
-          var baseName = encoding.get('BaseEncoding');
-          if (baseName)
-            baseEncoding = Encodings[baseName.name];
-          else
-            hasEncoding = false; // base encoding was not provided
-
-          // Load the differences between the base and original
-          if (encoding.has('Differences')) {
-            var diffEncoding = encoding.get('Differences');
-            var index = 0;
-            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
-              var data = diffEncoding[j];
-              if (isNum(data))
-                index = data;
-              else
-                differences[index++] = data.name;
-            }
-          }
-        } else if (isName(encoding)) {
-          baseEncoding = Encodings[encoding.name];
-        } else {
-          error('Encoding is not a Name nor a Dict');
-        }
-      }
-
-      properties.differences = differences;
-      properties.baseEncoding = baseEncoding;
-      properties.hasEncoding = hasEncoding;
-    },
-
-    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref) {
-      var cmapObj = toUnicode;
-      var charToUnicode = [];
-      if (isName(cmapObj)) {
-        var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
-        if (!isIdentityMap)
-          error('ToUnicode file cmap translation not implemented');
-      } else if (isStream(cmapObj)) {
-        var tokens = [];
-        var token = '';
-        var beginArrayToken = {};
-
-        var cmap = cmapObj.getBytes(cmapObj.length);
-        for (var i = 0, ii = cmap.length; i < ii; i++) {
-          var octet = cmap[i];
-          if (octet == 0x20 || octet == 0x0D || octet == 0x0A ||
-              octet == 0x3C || octet == 0x5B || octet == 0x5D) {
-            switch (token) {
-              case 'usecmap':
-                error('usecmap is not implemented');
-                break;
-
-              case 'beginbfchar':
-              case 'beginbfrange':
-              case 'begincidchar':
-              case 'begincidrange':
-                token = '';
-                tokens = [];
-                break;
-
-              case 'endcidrange':
-              case 'endbfrange':
-                for (var j = 0, jj = tokens.length; j < jj; j += 3) {
-                  var startRange = tokens[j];
-                  var endRange = tokens[j + 1];
-                  var code = tokens[j + 2];
-                  if (code == 0xFFFF) {
-                    // CMap is broken, assuming code == startRange
-                    code = startRange;
-                  }
-                  if (isArray(code)) {
-                    var codeindex = 0;
-                    while (startRange <= endRange) {
-                      charToUnicode[startRange] = code[codeindex++];
-                      ++startRange;
-                    }
-                  } else {
-                    while (startRange <= endRange) {
-                      charToUnicode[startRange] = code++;
-                      ++startRange;
-                    }
-                  }
-                }
-                break;
-
-              case 'endcidchar':
-              case 'endbfchar':
-                for (var j = 0, jj = tokens.length; j < jj; j += 2) {
-                  var index = tokens[j];
-                  var code = tokens[j + 1];
-                  charToUnicode[index] = code;
-                }
-                break;
-
-              case '':
-                break;
-
-              default:
-                if (token[0] >= '0' && token[0] <= '9')
-                  token = parseInt(token, 10); // a number
-                tokens.push(token);
-                token = '';
-            }
-            switch (octet) {
-              case 0x5B:
-                // begin list parsing
-                tokens.push(beginArrayToken);
-                break;
-              case 0x5D:
-                // collect array items
-                var items = [], item;
-                while (tokens.length &&
-                       (item = tokens.pop()) != beginArrayToken)
-                  items.unshift(item);
-                tokens.push(items);
-                break;
-            }
-          } else if (octet == 0x3E) {
-            if (token.length) {
-              if (token.length <= 4) {
-                // parsing hex number
-                tokens.push(parseInt(token, 16));
-                token = '';
-              } else {
-                // parsing hex UTF-16BE numbers
-                var str = [];
-                for (var k = 0, kk = token.length; k < kk; k += 4) {
-                  var b = parseInt(token.substr(k, 4), 16);
-                  if (b <= 0x10) {
-                    k += 4;
-                    b = (b << 16) | parseInt(token.substr(k, 4), 16);
-                    b -= 0x10000;
-                    str.push(0xD800 | (b >> 10));
-                    str.push(0xDC00 | (b & 0x3FF));
-                    break;
-                  }
-                  str.push(b);
-                }
-                tokens.push(String.fromCharCode.apply(String, str));
-                token = '';
-              }
-            }
-          } else {
-            token += String.fromCharCode(octet);
-          }
-        }
-      }
-      return charToUnicode;
-    },
-    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
-      // Extract the encoding from the CIDToGIDMap
-      var glyphsData = cidToGidStream.getBytes();
-
-      // Set encoding 0 to later verify the font has an encoding
-      var result = [];
-      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
-        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
-        if (glyphID == 0)
-          continue;
-
-        var code = j >> 1;
-        result[code] = glyphID;
-      }
-      return result;
-    },
-
-    extractWidths: function PartialEvaluator_extractWidths(dict,
-                                                   xref,
-                                                   descriptor,
-                                                   properties) {
-      var glyphsWidths = [];
-      var defaultWidth = 0;
-      if (properties.composite) {
-        defaultWidth = dict.get('DW') || 1000;
-
-        var widths = dict.get('W');
-        if (widths) {
-          var start = 0, end = 0;
-          for (var i = 0, ii = widths.length; i < ii; i++) {
-            var code = widths[i];
-            if (isArray(code)) {
-              for (var j = 0, jj = code.length; j < jj; j++)
-                glyphsWidths[start++] = code[j];
-              start = 0;
-            } else if (start) {
-              var width = widths[++i];
-              for (var j = start; j <= code; j++)
-                glyphsWidths[j] = width;
-              start = 0;
-            } else {
-              start = code;
-            }
-          }
-        }
-      } else {
-        var firstChar = properties.firstChar;
-        var widths = dict.get('Widths');
-        if (widths) {
-          var j = firstChar;
-          for (var i = 0, ii = widths.length; i < ii; i++)
-            glyphsWidths[j++] = widths[i];
-          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
-        } else {
-          // Trying get the BaseFont metrics (see comment above).
-          var baseFontName = dict.get('BaseFont');
-          if (isName(baseFontName)) {
-            var metrics = this.getBaseFontMetrics(baseFontName.name);
-
-            glyphsWidths = metrics.widths;
-            defaultWidth = metrics.defaultWidth;
-          }
-        }
-      }
-
-      properties.defaultWidth = defaultWidth;
-      properties.widths = glyphsWidths;
-    },
-
-    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
-      var defaultWidth = 0, widths = [];
-      var glyphWidths = Metrics[stdFontMap[name] || name];
-      if (isNum(glyphWidths)) {
-        defaultWidth = glyphWidths;
-      } else {
-        widths = glyphWidths;
-      }
-
-      return {
-        defaultWidth: defaultWidth,
-        widths: widths
-      };
-    },
-
-    translateFont: function PartialEvaluator_translateFont(dict,
-                                                           xref,
-                                                           resources,
-                                                           dependency) {
-      var baseDict = dict;
-      var type = dict.get('Subtype');
-      assertWellFormed(isName(type), 'invalid font Subtype');
-
-      var composite = false;
-      if (type.name == 'Type0') {
-        // If font is a composite
-        //  - get the descendant font
-        //  - set the type according to the descendant font
-        //  - get the FontDescriptor from the descendant font
-        var df = dict.get('DescendantFonts');
-        if (!df)
-          return null;
-
-        dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
-
-        type = dict.get('Subtype');
-        assertWellFormed(isName(type), 'invalid font Subtype');
-        composite = true;
-      }
-      var maxCharIndex = composite ? 0xFFFF : 0xFF;
-
-      var descriptor = dict.get('FontDescriptor');
-      if (!descriptor) {
-        if (type.name == 'Type3') {
-          // FontDescriptor is only required for Type3 fonts when the document
-          // is a tagged pdf. Create a barbebones one to get by.
-          descriptor = new Dict();
-          descriptor.set('FontName', new Name(type.name));
-        } else {
-          // Before PDF 1.5 if the font was one of the base 14 fonts, having a
-          // FontDescriptor was not required.
-          // This case is here for compatibility.
-          var baseFontName = dict.get('BaseFont');
-          if (!isName(baseFontName))
-            return null;
-
-          // Using base font name as a font name.
-          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
-          var metrics = this.getBaseFontMetrics(baseFontName);
-
-          // Simulating descriptor flags attribute
-          var fontNameWoStyle = baseFontName.split('-')[0];
-          var flags = (serifFonts[fontNameWoStyle] ||
-            (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) |
-            (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
-            FontFlags.Nonsymbolic);
-
-          var properties = {
-            type: type.name,
-            widths: metrics.widths,
-            defaultWidth: metrics.defaultWidth,
-            flags: flags,
-            firstChar: 0,
-            lastChar: maxCharIndex
-          };
-          this.extractDataStructures(dict, dict, xref, properties);
-
-          return {
-            name: baseFontName,
-            dict: baseDict,
-            properties: properties
-          };
-        }
-      }
-
-      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
-      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
-      // to ignore this rule when a variant of a standart font is used.
-      // TODO Fill the width array depending on which of the base font this is
-      // a variant.
-      var firstChar = dict.get('FirstChar') || 0;
-      var lastChar = dict.get('LastChar') || maxCharIndex;
-      var fontName = descriptor.get('FontName');
-      // Some bad pdf's have a string as the font name.
-      if (isString(fontName))
-        fontName = new Name(fontName);
-      assertWellFormed(isName(fontName), 'invalid font name');
-
-      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
-      if (fontFile) {
-        if (fontFile.dict) {
-          var subtype = fontFile.dict.get('Subtype');
-          if (subtype)
-            subtype = subtype.name;
-
-          var length1 = fontFile.dict.get('Length1');
-
-          var length2 = fontFile.dict.get('Length2');
-        }
-      }
-
-      var properties = {
-        type: type.name,
-        subtype: subtype,
-        file: fontFile,
-        length1: length1,
-        length2: length2,
-        composite: composite,
-        fixedPitch: false,
-        fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
-        firstChar: firstChar || 0,
-        lastChar: lastChar || maxCharIndex,
-        bbox: descriptor.get('FontBBox'),
-        ascent: descriptor.get('Ascent'),
-        descent: descriptor.get('Descent'),
-        xHeight: descriptor.get('XHeight'),
-        capHeight: descriptor.get('CapHeight'),
-        flags: descriptor.get('Flags'),
-        italicAngle: descriptor.get('ItalicAngle'),
-        coded: false
-      };
-      this.extractWidths(dict, xref, descriptor, properties);
-      this.extractDataStructures(dict, baseDict, xref, properties);
-
-      if (type.name === 'Type3') {
-        properties.coded = true;
-        var charProcs = dict.get('CharProcs').getAll();
-        var fontResources = dict.get('Resources') || resources;
-        properties.resources = fontResources;
-        properties.charProcOperatorList = {};
-        for (var key in charProcs) {
-          var glyphStream = charProcs[key];
-          properties.charProcOperatorList[key] =
-            this.getOperatorList(glyphStream, fontResources, dependency);
-        }
-      }
-
-      return {
-        name: fontName.name,
-        dict: baseDict,
-        file: fontFile,
-        properties: properties
-      };
-    }
-  };
-
-  return PartialEvaluator;
-})();
-
-var EvalState = (function EvalStateClosure() {
-  function EvalState() {
-    // Are soft masks and alpha values shapes or opacities?
-    this.alphaIsShape = false;
-    this.fontSize = 0;
-    this.textMatrix = IDENTITY_MATRIX;
-    this.leading = 0;
-    // Start of text line (in text coordinates)
-    this.lineX = 0;
-    this.lineY = 0;
-    // Character and word spacing
-    this.charSpacing = 0;
-    this.wordSpacing = 0;
-    this.textHScale = 1;
-    // Color spaces
-    this.fillColorSpace = null;
-    this.strokeColorSpace = null;
-  }
-  EvalState.prototype = {
-  };
-  return EvalState;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/fonts.js b/apps/files_pdfviewer/js/pdfjs/src/fonts.js
deleted file mode 100644
index 7fdab8fbbf9f00740b40cd62b7f02bce75e07422..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/fonts.js
+++ /dev/null
@@ -1,4665 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-/**
- * Maximum time to wait for a font to be loaded by font-face rules.
- */
-var kMaxWaitForFontFace = 1000;
-
-// Unicode Private Use Area
-var kCmapGlyphOffset = 0xE000;
-var kSizeOfGlyphArea = 0x1900;
-var kSymbolicFontGlyphOffset = 0xF000;
-
-// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
-// except for Type 3 fonts
-var kPDFGlyphSpaceUnits = 1000;
-
-// Until hinting is fully supported this constant can be used
-var kHintingEnabled = false;
-
-var FontFlags = {
-  FixedPitch: 1,
-  Serif: 2,
-  Symbolic: 4,
-  Script: 8,
-  Nonsymbolic: 32,
-  Italic: 64,
-  AllCap: 65536,
-  SmallCap: 131072,
-  ForceBold: 262144
-};
-
-var Encodings = {
-  ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
-    'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
-    'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
-    'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
-    'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
-    'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
-    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
-    'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
-    'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
-    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
-    '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
-    'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
-    'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
-    'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
-    'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
-    'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
-    'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
-    '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
-    'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
-    'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
-    'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
-    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
-    'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
-    'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
-    'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
-    'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
-    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
-    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
-    'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
-    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
-    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
-    'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
-    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
-    'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
-    'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
-    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
-    'Ydieresissmall'],
-  MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
-    'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
-    'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
-    'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
-    'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
-    'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
-    'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
-    'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
-    'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
-    'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
-    'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
-    'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
-    'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
-    'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
-    'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
-    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
-    'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
-    'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
-    'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
-    'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
-    'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
-    'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
-    'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
-    'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
-    'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
-    'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
-    'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
-    'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
-    'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
-    'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
-    '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
-    'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
-    'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
-    'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
-    'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
-    '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
-    'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
-    'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
-  MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
-    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
-    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
-    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
-    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
-    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
-    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
-    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
-    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
-    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
-    'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
-    'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
-    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
-    'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
-    'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
-    'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
-    'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
-    'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
-    'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
-    'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
-    'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
-    'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE',
-    'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
-    'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
-    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
-    'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
-    'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
-    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
-    'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
-    'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
-    'ogonek', 'caron'],
-  StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-    'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
-    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
-    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
-    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
-    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
-    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
-    'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
-    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
-    'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
-    'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-    'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-    'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
-    'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
-    'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
-    'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
-    'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
-    '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
-    '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
-    '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
-  WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
-    'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
-    'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
-    'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
-    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
-    'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
-    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
-    'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
-    'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
-    'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
-    'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
-    'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
-    'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
-    'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
-    'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling',
-    'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
-    'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
-    'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
-    'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
-    'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
-    'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
-    'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
-    'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
-    'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
-    'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
-    'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
-    'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
-    'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
-    'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
-    'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
-    'ydieresis'],
-  symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
-    'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
-    'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
-    'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
-    'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
-    'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
-    'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
-    'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
-    'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
-    'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
-    'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
-    'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
-    'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
-    'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
-    'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
-    'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
-    'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
-    'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
-    'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
-    'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
-    'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
-    'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
-    'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
-    'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
-    'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
-    'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
-    'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
-    'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
-    '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
-    'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
-    'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
-    'bracerightbt'],
-  zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
-    'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
-    'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
-    'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
-    'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
-    'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
-    'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
-    'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
-    'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
-    'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
-    '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
-    'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
-    'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
-    'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
-    'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
-    'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
-    'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
-    'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
-    'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
-    'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
-    'a188', 'a189', 'a190', 'a191']
-};
-
-/**
- * Hold a map of decoded fonts and of the standard fourteen Type1
- * fonts and their acronyms.
- */
-var stdFontMap = {
-  'ArialNarrow': 'Helvetica',
-  'ArialNarrow-Bold': 'Helvetica-Bold',
-  'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
-  'ArialNarrow-Italic': 'Helvetica-Oblique',
-  'ArialBlack': 'Helvetica',
-  'ArialBlack-Bold': 'Helvetica-Bold',
-  'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
-  'ArialBlack-Italic': 'Helvetica-Oblique',
-  'Arial': 'Helvetica',
-  'Arial-Bold': 'Helvetica-Bold',
-  'Arial-BoldItalic': 'Helvetica-BoldOblique',
-  'Arial-Italic': 'Helvetica-Oblique',
-  'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
-  'Arial-BoldMT': 'Helvetica-Bold',
-  'Arial-ItalicMT': 'Helvetica-Oblique',
-  'ArialMT': 'Helvetica',
-  'Courier-Bold': 'Courier-Bold',
-  'Courier-BoldItalic': 'Courier-BoldOblique',
-  'Courier-Italic': 'Courier-Oblique',
-  'CourierNew': 'Courier',
-  'CourierNew-Bold': 'Courier-Bold',
-  'CourierNew-BoldItalic': 'Courier-BoldOblique',
-  'CourierNew-Italic': 'Courier-Oblique',
-  'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
-  'CourierNewPS-BoldMT': 'Courier-Bold',
-  'CourierNewPS-ItalicMT': 'Courier-Oblique',
-  'CourierNewPSMT': 'Courier',
-  'Helvetica-Bold': 'Helvetica-Bold',
-  'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
-  'Helvetica-Italic': 'Helvetica-Oblique',
-  'Symbol-Bold': 'Symbol',
-  'Symbol-BoldItalic': 'Symbol',
-  'Symbol-Italic': 'Symbol',
-  'TimesNewRoman': 'Times-Roman',
-  'TimesNewRoman-Bold': 'Times-Bold',
-  'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
-  'TimesNewRoman-Italic': 'Times-Italic',
-  'TimesNewRomanPS': 'Times-Roman',
-  'TimesNewRomanPS-Bold': 'Times-Bold',
-  'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
-  'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
-  'TimesNewRomanPS-BoldMT': 'Times-Bold',
-  'TimesNewRomanPS-Italic': 'Times-Italic',
-  'TimesNewRomanPS-ItalicMT': 'Times-Italic',
-  'TimesNewRomanPSMT': 'Times-Roman',
-  'TimesNewRomanPSMT-Bold': 'Times-Bold',
-  'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
-  'TimesNewRomanPSMT-Italic': 'Times-Italic'
-};
-
-/**
- * Holds the map of the non-standard fonts that might be included as a standard
- * fonts without glyph data.
- */
-var nonStdFontMap = {
-  'ComicSansMS': 'Comic Sans MS',
-  'ComicSansMS-Bold': 'Comic Sans MS-Bold',
-  'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
-  'ComicSansMS-Italic': 'Comic Sans MS-Italic',
-  'LucidaConsole': 'Courier',
-  'LucidaConsole-Bold': 'Courier-Bold',
-  'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
-  'LucidaConsole-Italic': 'Courier-Oblique'
-};
-
-var serifFonts = {
-  'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
-  'Aldus': true, 'Alexandria': true, 'Algerian': true,
-  'American Typewriter': true, 'Antiqua': true, 'Apex': true,
-  'Arno': true, 'Aster': true, 'Aurora': true,
-  'Baskerville': true, 'Bell': true, 'Bembo': true,
-  'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
-  'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
-  'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
-  'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
-  'Calvert': true, 'Capitals': true, 'Cambria': true,
-  'Cartier': true, 'Caslon': true, 'Catull': true,
-  'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
-  'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
-  'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
-  'Cochin': true, 'Colonna': true, 'Computer Modern': true,
-  'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
-  'Corona': true, 'Ecotype': true, 'Egyptienne': true,
-  'Elephant': true, 'Excelsior': true, 'Fairfield': true,
-  'FF Scala': true, 'Folkard': true, 'Footlight': true,
-  'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
-  'Gentium': true, 'Georgia': true, 'Gloucester': true,
-  'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
-  'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
-  'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
-  'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
-  'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
-  'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
-  'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
-  'Lucida Bright': true, 'Melior': true, 'Memphis': true,
-  'Miller': true, 'Minion': true, 'Modern': true,
-  'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
-  'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
-  'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
-  'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
-  'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
-  'Requiem': true, 'Rockwell': true, 'Roman': true,
-  'Rotis Serif': true, 'Sabon': true, 'Scala': true,
-  'Seagull': true, 'Sistina': true, 'Souvenir': true,
-  'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
-  'Sylfaen': true, 'Times': true, 'Trajan': true,
-  'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
-  'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
-  'Versailles': true, 'Wanted': true, 'Weiss': true,
-  'Wide Latin': true, 'Windsor': true, 'XITS': true
-};
-
-var symbolsFonts = {
-  'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
-};
-
-// Some characters, e.g. copyrightserif, mapped to the private use area and
-// might not be displayed using standard fonts. Mapping/hacking well-known chars
-// to the similar equivalents in the normal characters range.
-function mapPrivateUseChars(code) {
-  switch (code) {
-    case 0xF8E9: // copyrightsans
-    case 0xF6D9: // copyrightserif
-      return 0x00A9; // copyright
-    default:
-      return code;
-  }
-}
-
-var FontLoader = {
-  listeningForFontLoad: false,
-
-  bind: function fontLoaderBind(fonts, callback) {
-    function checkFontsLoaded() {
-      for (var i = 0, ii = fonts.length; i < ii; i++) {
-        var fontObj = fonts[i];
-        if (fontObj.loading) {
-          return false;
-        }
-      }
-
-      document.documentElement.removeEventListener(
-        'pdfjsFontLoad', checkFontsLoaded, false);
-
-      callback();
-      return true;
-    }
-
-    var rules = [], names = [], fontsToLoad = [];
-    var fontCreateTimer = 0;
-
-    for (var i = 0, ii = fonts.length; i < ii; i++) {
-      var font = fonts[i];
-
-      // Add the font to the DOM only once or skip if the font
-      // is already loaded.
-      if (font.attached || font.loading == false) {
-        continue;
-      }
-      font.attached = true;
-
-      fontsToLoad.push(font);
-
-      var str = '';
-      var data = font.data;
-      if (data) {
-        var length = data.length;
-        for (var j = 0; j < length; j++)
-          str += String.fromCharCode(data[j]);
-
-        var rule = font.bindDOM(str);
-        if (rule) {
-          rules.push(rule);
-          names.push(font.loadedName);
-        }
-      }
-    }
-
-    this.listeningForFontLoad = false;
-    if (!isWorker && rules.length) {
-      FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad);
-    }
-
-    if (!checkFontsLoaded()) {
-      document.documentElement.addEventListener(
-        'pdfjsFontLoad', checkFontsLoaded, false);
-    }
-  },
-  // Set things up so that at least one pdfjsFontLoad event is
-  // dispatched when all the @font-face |rules| for |names| have been
-  // loaded in a subdocument.  It's expected that the load of |rules|
-  // has already started in this (outer) document, so that they should
-  // be ordered before the load in the subdocument.
-  prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
-                                                                fonts) {
-      /** Hack begin */
-      // There's no event when a font has finished downloading so the
-      // following code is a dirty hack to 'guess' when a font is
-      // ready.  This code will be obsoleted by Mozilla bug 471915.
-      //
-      // The only reliable way to know if a font is loaded in Gecko
-      // (at the moment) is document.onload in a document with
-      // a @font-face rule defined in a "static" stylesheet.  We use a
-      // subdocument in an <iframe>, set up properly, to know when
-      // our @font-face rule was loaded.  However, the subdocument and
-      // outer document can't share CSS rules, so the inner document
-      // is only part of the puzzle.  The second piece is an invisible
-      // div created in order to force loading of the @font-face in
-      // the *outer* document.  (The font still needs to be loaded for
-      // its metrics, for reflow).  We create the div first for the
-      // outer document, then create the iframe.  Unless something
-      // goes really wonkily, we expect the @font-face for the outer
-      // document to be processed before the inner.  That's still
-      // fragile, but seems to work in practice.
-      //
-      // The postMessage() hackery was added to work around chrome bug
-      // 82402.
-
-      // Validate the names parameter -- the values can used to construct HTML.
-      if (!/^\w+$/.test(names.join(''))) {
-        error('Invalid font name(s): ' + names.join());
-
-        // Normally the error-function throws. But if a malicious code
-        // intercepts the function call then the return is needed.
-        return;
-      }
-
-      var div = document.createElement('div');
-      div.setAttribute('style',
-                       'visibility: hidden;' +
-                       'width: 10px; height: 10px;' +
-                       'position: absolute; top: 0px; left: 0px;');
-      var html = '';
-      for (var i = 0, ii = names.length; i < ii; ++i) {
-        html += '<span style="font-family:' + names[i] + '">Hi</span>';
-      }
-      div.innerHTML = html;
-      document.body.appendChild(div);
-
-      if (!this.listeningForFontLoad) {
-        window.addEventListener(
-          'message',
-          function fontLoaderMessage(e) {
-            var fontNames = JSON.parse(e.data);
-            for (var i = 0, ii = fonts.length; i < ii; ++i) {
-              var font = fonts[i];
-              font.loading = false;
-            }
-            var evt = document.createEvent('Events');
-            evt.initEvent('pdfjsFontLoad', true, false);
-            document.documentElement.dispatchEvent(evt);
-          },
-          false);
-        this.listeningForFontLoad = true;
-      }
-
-      // XXX we should have a time-out here too, and maybe fire
-      // pdfjsFontLoadFailed?
-      var src = '<!DOCTYPE HTML><html><head>';
-      src += '<style type="text/css">';
-      for (var i = 0, ii = rules.length; i < ii; ++i) {
-        src += rules[i];
-      }
-      src += '</style>';
-      src += '<script type="application/javascript">';
-      var fontNamesArray = '';
-      for (var i = 0, ii = names.length; i < ii; ++i) {
-        fontNamesArray += '"' + names[i] + '", ';
-      }
-      src += '  var fontNames=[' + fontNamesArray + '];\n';
-      src += '  window.onload = function fontLoaderOnload() {\n';
-      src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
-      src += '  }';
-      // Hack so the end script tag isn't counted if this is inline JS.
-      src += '</scr' + 'ipt></head><body>';
-      for (var i = 0, ii = names.length; i < ii; ++i) {
-        src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
-      }
-      src += '</body></html>';
-      var frame = document.createElement('iframe');
-      frame.src = 'data:text/html,' + src;
-      frame.setAttribute('style',
-                         'visibility: hidden;' +
-                         'width: 10px; height: 10px;' +
-                         'position: absolute; top: 0px; left: 0px;');
-      document.body.appendChild(frame);
-      /** Hack end */
-  }
-};
-
-var UnicodeRanges = [
-  { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
-  { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
-  { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
-  { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
-  { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
-  { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
-  { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
-  { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
-  { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
-  { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
-  { 'begin': 0x0530, 'end': 0x058F }, // Armenian
-  { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
-  { 'begin': 0xA500, 'end': 0xA63F }, // Vai
-  { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
-  { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
-  { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
-  { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
-  { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
-  { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
-  { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
-  { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
-  { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
-  { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
-  { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
-  { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
-  { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
-  { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
-  { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
-  { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
-  { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
-  { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
-  { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
-  { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
-  { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
-  { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
-  { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
-  { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
-  { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
-  { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
-  { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
-  { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
-  { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
-  { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
-  { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
-  { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
-  { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
-  { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
-  { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
-  { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
-  { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
-  { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
-  { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
-  { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
-  { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
-  { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
-  { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
-  { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
-  { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
-  { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
-  { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
-  { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
-  { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
-  { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
-  { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
-  { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
-  { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
-  { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
-  { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
-  { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
-  { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
-  { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
-  { 'begin': 0x0700, 'end': 0x074F }, // Syriac
-  { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
-  { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
-  { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
-  { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
-  { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
-  { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
-  { 'begin': 0x1680, 'end': 0x169F }, // Ogham
-  { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
-  { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
-  { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
-  { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
-  { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
-  { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
-  { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
-  { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
-  { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
-  { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
-  { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
-  { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
-  { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
-  { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
-  { 'begin': 0x1900, 'end': 0x194F }, // Limbu
-  { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
-  { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
-  { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
-  { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
-  { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
-  { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
-  { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
-  { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
-  { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
-  { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
-  { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
-  { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
-  { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
-  { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
-  { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
-  { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
-  { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
-  { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
-  { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
-  { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
-  { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
-  { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
-  { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
-  { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
-  { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
-  { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
-  { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
-  { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
-  { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles
-];
-
-var MacStandardGlyphOrdering = [
-  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
-  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
-  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
-  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
-  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
-  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
-  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
-  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
-  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
-  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
-  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
-  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
-  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
-  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
-  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
-  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
-  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
-  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
-  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
-  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
-  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
-  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
-  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
-  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
-  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
-  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
-  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
-  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
-  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
-  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
-  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
-  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
-  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
-  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
-  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
-  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
-
-function getUnicodeRangeFor(value) {
-  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
-    var range = UnicodeRanges[i];
-    if (value >= range.begin && value < range.end)
-      return i;
-  }
-  return -1;
-}
-
-function isRTLRangeFor(value) {
-  var range = UnicodeRanges[13];
-  if (value >= range.begin && value < range.end)
-    return true;
-  range = UnicodeRanges[11];
-  if (value >= range.begin && value < range.end)
-    return true;
-  return false;
-}
-
-function isSpecialUnicode(unicode) {
-  return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
-    (unicode >= kCmapGlyphOffset &&
-    unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
-}
-
-/**
- * 'Font' is the class the outside world should use, it encapsulate all the font
- * decoding logics whatever type it is (assuming the font type is supported).
- *
- * For example to read a Type1 font and to attach it to the document:
- *   var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
- *   type1Font.bind();
- */
-var Font = (function FontClosure() {
-  function Font(name, file, properties) {
-    this.name = name;
-    this.coded = properties.coded;
-    this.charProcOperatorList = properties.charProcOperatorList;
-    this.resources = properties.resources;
-    this.sizes = [];
-
-    var names = name.split('+');
-    names = names.length > 1 ? names[1] : names[0];
-    names = names.split(/[-,_]/g)[0];
-    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
-    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
-
-    var type = properties.type;
-    this.type = type;
-
-    // If the font is to be ignored, register it like an already loaded font
-    // to avoid the cost of waiting for it be be loaded by the platform.
-    if (properties.ignore) {
-      this.loadedName = this.isSerifFont ? 'serif' : 'sans-serif';
-      this.loading = false;
-      return;
-    }
-
-    this.differences = properties.differences;
-    this.widths = properties.widths;
-    this.defaultWidth = properties.defaultWidth;
-    this.composite = properties.composite;
-    this.hasEncoding = properties.hasEncoding;
-
-    this.fontMatrix = properties.fontMatrix;
-    this.widthMultiplier = 1.0;
-    if (properties.type == 'Type3') {
-      this.encoding = properties.baseEncoding;
-      return;
-    }
-
-    // Trying to fix encoding using glyph CIDSystemInfo.
-    this.loadCidToUnicode(properties);
-
-    if (properties.toUnicode)
-      this.toUnicode = properties.toUnicode;
-    else
-      this.rebuildToUnicode(properties);
-
-    this.toFontChar = this.buildToFontChar(this.toUnicode);
-
-    if (!file) {
-      // The file data is not specified. Trying to fix the font name
-      // to be used with the canvas.font.
-      var fontName = name.replace(/[,_]/g, '-');
-      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
-
-      this.bold = (fontName.search(/bold/gi) != -1);
-      this.italic = (fontName.search(/oblique/gi) != -1) ||
-                    (fontName.search(/italic/gi) != -1);
-
-      // Use 'name' instead of 'fontName' here because the original
-      // name ArialBlack for example will be replaced by Helvetica.
-      this.black = (name.search(/Black/g) != -1);
-
-      this.encoding = properties.baseEncoding;
-      this.noUnicodeAdaptation = true;
-      this.loadedName = fontName.split('-')[0];
-      this.loading = false;
-      return;
-    }
-
-    var data;
-    switch (type) {
-      case 'Type1':
-      case 'CIDFontType0':
-        this.mimetype = 'font/opentype';
-
-        var subtype = properties.subtype;
-        var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
-          new CFFFont(file, properties) : new Type1Font(name, file, properties);
-
-        // Wrap the CFF data inside an OTF font file
-        data = this.convert(name, cff, properties);
-        break;
-
-      case 'TrueType':
-      case 'CIDFontType2':
-        this.mimetype = 'font/opentype';
-
-        // Repair the TrueType file. It is can be damaged in the point of
-        // view of the sanitizer
-        data = this.checkAndRepair(name, file, properties);
-        break;
-
-      default:
-        warn('Font ' + properties.type + ' is not supported');
-        break;
-    }
-
-    this.data = data;
-    this.fontMatrix = properties.fontMatrix;
-    this.widthMultiplier = !properties.fontMatrix ? 1.0 :
-      1.0 / properties.fontMatrix[0];
-    this.encoding = properties.baseEncoding;
-    this.loadedName = properties.loadedName;
-    this.loading = true;
-  };
-
-  var numFonts = 0;
-  function getUniqueName() {
-    return 'pdfFont' + numFonts++;
-  }
-
-  function stringToArray(str) {
-    var array = [];
-    for (var i = 0, ii = str.length; i < ii; ++i)
-      array[i] = str.charCodeAt(i);
-
-    return array;
-  };
-
-  function arrayToString(arr) {
-    var str = '';
-    for (var i = 0, ii = arr.length; i < ii; ++i)
-      str += String.fromCharCode(arr[i]);
-
-    return str;
-  };
-
-  function int16(bytes) {
-    return (bytes[0] << 8) + (bytes[1] & 0xff);
-  };
-
-  function int32(bytes) {
-    return (bytes[0] << 24) + (bytes[1] << 16) +
-           (bytes[2] << 8) + (bytes[3] & 0xff);
-  };
-
-  function getMaxPower2(number) {
-    var maxPower = 0;
-    var value = number;
-    while (value >= 2) {
-      value /= 2;
-      maxPower++;
-    }
-
-    value = 2;
-    for (var i = 1; i < maxPower; i++)
-      value *= 2;
-    return value;
-  };
-
-  function string16(value) {
-    return String.fromCharCode((value >> 8) & 0xff) +
-           String.fromCharCode(value & 0xff);
-  };
-
-  function safeString16(value) {
-    // clamp value to the 16-bit int range
-    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
-    return String.fromCharCode((value >> 8) & 0xff) +
-           String.fromCharCode(value & 0xff);
-  };
-
-  function string32(value) {
-    return String.fromCharCode((value >> 24) & 0xff) +
-           String.fromCharCode((value >> 16) & 0xff) +
-           String.fromCharCode((value >> 8) & 0xff) +
-           String.fromCharCode(value & 0xff);
-  };
-
-  function createOpenTypeHeader(sfnt, file, numTables) {
-    // Windows hates the Mac TrueType sfnt version number
-    if (sfnt == 'true')
-      sfnt = string32(0x00010000);
-
-    // sfnt version (4 bytes)
-    var header = sfnt;
-
-    // numTables (2 bytes)
-    header += string16(numTables);
-
-    // searchRange (2 bytes)
-    var tablesMaxPower2 = getMaxPower2(numTables);
-    var searchRange = tablesMaxPower2 * 16;
-    header += string16(searchRange);
-
-    // entrySelector (2 bytes)
-    header += string16(Math.log(tablesMaxPower2) / Math.log(2));
-
-    // rangeShift (2 bytes)
-    header += string16(numTables * 16 - searchRange);
-
-    file.file += header;
-    file.virtualOffset += header.length;
-  };
-
-  function createTableEntry(file, tag, data) {
-    // offset
-    var offset = file.virtualOffset;
-
-    // length
-    var length = data.length;
-
-    // Per spec tables must be 4-bytes align so add padding as needed
-    while (data.length & 3)
-      data.push(0x00);
-
-    while (file.virtualOffset & 3)
-      file.virtualOffset++;
-
-    // checksum
-    var checksum = 0, n = data.length;
-    for (var i = 0; i < n; i += 4)
-      checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
-                                    data[i + 3]])) | 0;
-
-    var tableEntry = (tag + string32(checksum) +
-                      string32(offset) + string32(length));
-    file.file += tableEntry;
-    file.virtualOffset += data.length;
-  };
-
-  function getRanges(glyphs) {
-    // Array.sort() sorts by characters, not numerically, so convert to an
-    // array of characters.
-    var codes = [];
-    var length = glyphs.length;
-    for (var n = 0; n < length; ++n)
-      codes.push({ unicode: glyphs[n].unicode, code: n });
-    codes.sort(function fontGetRangesSort(a, b) {
-      return a.unicode - b.unicode;
-    });
-
-    // Split the sorted codes into ranges.
-    var ranges = [];
-    for (var n = 0; n < length; ) {
-      var start = codes[n].unicode;
-      var codeIndices = [codes[n].code];
-      ++n;
-      var end = start;
-      while (n < length && end + 1 == codes[n].unicode) {
-        codeIndices.push(codes[n].code);
-        ++end;
-        ++n;
-      }
-      ranges.push([start, end, codeIndices]);
-    }
-
-    return ranges;
-  };
-
-  function createCMapTable(glyphs, deltas) {
-    var ranges = getRanges(glyphs);
-
-    var numTables = 1;
-    var cmap = '\x00\x00' + // version
-               string16(numTables) +  // numTables
-               '\x00\x03' + // platformID
-               '\x00\x01' + // encodingID
-               string32(4 + numTables * 8); // start of the table record
-
-    var segCount = ranges.length + 1;
-    var segCount2 = segCount * 2;
-    var searchRange = getMaxPower2(segCount) * 2;
-    var searchEntry = Math.log(segCount) / Math.log(2);
-    var rangeShift = 2 * segCount - searchRange;
-
-    // Fill up the 4 parallel arrays describing the segments.
-    var startCount = '';
-    var endCount = '';
-    var idDeltas = '';
-    var idRangeOffsets = '';
-    var glyphsIds = '';
-    var bias = 0;
-
-    if (deltas) {
-      for (var i = 0; i < segCount - 1; i++) {
-        var range = ranges[i];
-        var start = range[0];
-        var end = range[1];
-        var offset = (segCount - i) * 2 + bias * 2;
-        bias += (end - start + 1);
-
-        startCount += string16(start);
-        endCount += string16(end);
-        idDeltas += string16(0);
-        idRangeOffsets += string16(offset);
-
-        var codes = range[2];
-        for (var j = 0, jj = codes.length; j < jj; ++j)
-          glyphsIds += string16(deltas[codes[j]]);
-      }
-    } else {
-      for (var i = 0; i < segCount - 1; i++) {
-        var range = ranges[i];
-        var start = range[0];
-        var end = range[1];
-        var startCode = range[2][0];
-
-        startCount += string16(start);
-        endCount += string16(end);
-        idDeltas += string16((startCode - start + 1) & 0xFFFF);
-        idRangeOffsets += string16(0);
-      }
-    }
-
-    endCount += '\xFF\xFF';
-    startCount += '\xFF\xFF';
-    idDeltas += '\x00\x01';
-    idRangeOffsets += '\x00\x00';
-
-    var format314 = '\x00\x00' + // language
-                    string16(segCount2) +
-                    string16(searchRange) +
-                    string16(searchEntry) +
-                    string16(rangeShift) +
-                    endCount + '\x00\x00' + startCount +
-                    idDeltas + idRangeOffsets + glyphsIds;
-
-    return stringToArray(cmap +
-                         '\x00\x04' + // format
-                         string16(format314.length + 4) + // length
-                         format314);
-  };
-
-  function createOS2Table(properties, charstrings, override) {
-    override = override || {
-      unitsPerEm: 0,
-      yMax: 0,
-      yMin: 0,
-      ascent: 0,
-      descent: 0
-    };
-
-    var ulUnicodeRange1 = 0;
-    var ulUnicodeRange2 = 0;
-    var ulUnicodeRange3 = 0;
-    var ulUnicodeRange4 = 0;
-
-    var firstCharIndex = null;
-    var lastCharIndex = 0;
-
-    if (charstrings) {
-      for (var i = 0; i < charstrings.length; ++i) {
-        var code = charstrings[i].unicode;
-        if (firstCharIndex > code || !firstCharIndex)
-          firstCharIndex = code;
-        if (lastCharIndex < code)
-          lastCharIndex = code;
-
-        var position = getUnicodeRangeFor(code);
-        if (position < 32) {
-          ulUnicodeRange1 |= 1 << position;
-        } else if (position < 64) {
-          ulUnicodeRange2 |= 1 << position - 32;
-        } else if (position < 96) {
-          ulUnicodeRange3 |= 1 << position - 64;
-        } else if (position < 123) {
-          ulUnicodeRange4 |= 1 << position - 96;
-        } else {
-          error('Unicode ranges Bits > 123 are reserved for internal usage');
-        }
-      }
-    } else {
-      // TODO
-      firstCharIndex = 0;
-      lastCharIndex = 255;
-    }
-
-    var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
-    var typoAscent = override.ascent || properties.ascent;
-    var typoDescent = override.descent || properties.descent;
-    var winAscent = override.yMax || typoAscent;
-    var winDescent = -override.yMin || -typoDescent;
-
-    // if there is a units per em value but no other override
-    // then scale the calculated ascent
-    if (unitsPerEm != kPDFGlyphSpaceUnits &&
-        'undefined' == typeof(override.ascent)) {
-      // if the font units differ to the PDF glyph space units
-      // then scale up the values
-      typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
-      typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
-      winAscent = typoAscent;
-      winDescent = -typoDescent;
-    }
-
-    return '\x00\x03' + // version
-           '\x02\x24' + // xAvgCharWidth
-           '\x01\xF4' + // usWeightClass
-           '\x00\x05' + // usWidthClass
-           '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
-           '\x02\x8A' + // ySubscriptXSize
-           '\x02\xBB' + // ySubscriptYSize
-           '\x00\x00' + // ySubscriptXOffset
-           '\x00\x8C' + // ySubscriptYOffset
-           '\x02\x8A' + // ySuperScriptXSize
-           '\x02\xBB' + // ySuperScriptYSize
-           '\x00\x00' + // ySuperScriptXOffset
-           '\x01\xDF' + // ySuperScriptYOffset
-           '\x00\x31' + // yStrikeOutSize
-           '\x01\x02' + // yStrikeOutPosition
-           '\x00\x00' + // sFamilyClass
-           '\x00\x00\x06' +
-           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
-           '\x00\x00\x00\x00\x00\x00' + // Panose
-           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
-           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
-           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
-           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
-           '\x2A\x32\x31\x2A' + // achVendID
-           string16(properties.italicAngle ? 1 : 0) + // fsSelection
-           string16(firstCharIndex ||
-                    properties.firstChar) + // usFirstCharIndex
-           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex
-           string16(typoAscent) + // sTypoAscender
-           string16(typoDescent) + // sTypoDescender
-           '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
-           string16(winAscent) + // usWinAscent
-           string16(winDescent) + // usWinDescent
-           '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
-           '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
-           string16(properties.xHeight) + // sxHeight
-           string16(properties.capHeight) + // sCapHeight
-           string16(0) + // usDefaultChar
-           string16(firstCharIndex || properties.firstChar) + // usBreakChar
-           '\x00\x03';  // usMaxContext
-  };
-
-  function createPostTable(properties) {
-    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
-    return '\x00\x03\x00\x00' + // Version number
-           string32(angle) + // italicAngle
-           '\x00\x00' + // underlinePosition
-           '\x00\x00' + // underlineThickness
-           string32(properties.fixedPitch) + // isFixedPitch
-           '\x00\x00\x00\x00' + // minMemType42
-           '\x00\x00\x00\x00' + // maxMemType42
-           '\x00\x00\x00\x00' + // minMemType1
-           '\x00\x00\x00\x00';  // maxMemType1
-  };
-
-  function createNameTable(name) {
-    var strings = [
-      'Original licence',  // 0.Copyright
-      name,                // 1.Font family
-      'Unknown',           // 2.Font subfamily (font weight)
-      'uniqueID',          // 3.Unique ID
-      name,                // 4.Full font name
-      'Version 0.11',      // 5.Version
-      '',                  // 6.Postscript name
-      'Unknown',           // 7.Trademark
-      'Unknown',           // 8.Manufacturer
-      'Unknown'            // 9.Designer
-    ];
-
-    // Mac want 1-byte per character strings while Windows want
-    // 2-bytes per character, so duplicate the names table
-    var stringsUnicode = [];
-    for (var i = 0, ii = strings.length; i < ii; i++) {
-      var str = strings[i];
-
-      var strUnicode = '';
-      for (var j = 0, jj = str.length; j < jj; j++)
-        strUnicode += string16(str.charCodeAt(j));
-      stringsUnicode.push(strUnicode);
-    }
-
-    var names = [strings, stringsUnicode];
-    var platforms = ['\x00\x01', '\x00\x03'];
-    var encodings = ['\x00\x00', '\x00\x01'];
-    var languages = ['\x00\x00', '\x04\x09'];
-
-    var namesRecordCount = strings.length * platforms.length;
-    var nameTable =
-      '\x00\x00' +                           // format
-      string16(namesRecordCount) +           // Number of names Record
-      string16(namesRecordCount * 12 + 6);   // Storage
-
-    // Build the name records field
-    var strOffset = 0;
-    for (var i = 0, ii = platforms.length; i < ii; i++) {
-      var strs = names[i];
-      for (var j = 0, jj = strs.length; j < jj; j++) {
-        var str = strs[j];
-        var nameRecord =
-          platforms[i] + // platform ID
-          encodings[i] + // encoding ID
-          languages[i] + // language ID
-          string16(j) + // name ID
-          string16(str.length) +
-          string16(strOffset);
-        nameTable += nameRecord;
-        strOffset += str.length;
-      }
-    }
-
-    nameTable += strings.join('') + stringsUnicode.join('');
-    return nameTable;
-  }
-
-  Font.prototype = {
-    name: null,
-    font: null,
-    mimetype: null,
-    encoding: null,
-
-    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
-      function readTableEntry(file) {
-        var tag = file.getBytes(4);
-        tag = String.fromCharCode(tag[0]) +
-              String.fromCharCode(tag[1]) +
-              String.fromCharCode(tag[2]) +
-              String.fromCharCode(tag[3]);
-
-        var checksum = int32(file.getBytes(4));
-        var offset = int32(file.getBytes(4));
-        var length = int32(file.getBytes(4));
-
-        // Read the table associated data
-        var previousPosition = file.pos;
-        file.pos = file.start ? file.start : 0;
-        file.skip(offset);
-        var data = file.getBytes(length);
-        file.pos = previousPosition;
-
-        if (tag == 'head') {
-          // clearing checksum adjustment
-          data[8] = data[9] = data[10] = data[11] = 0;
-          data[17] |= 0x20; //Set font optimized for cleartype flag
-        }
-
-        return {
-          tag: tag,
-          checksum: checksum,
-          length: length,
-          offset: offset,
-          data: data
-        };
-      };
-
-      function readOpenTypeHeader(ttf) {
-        return {
-          version: arrayToString(ttf.getBytes(4)),
-          numTables: int16(ttf.getBytes(2)),
-          searchRange: int16(ttf.getBytes(2)),
-          entrySelector: int16(ttf.getBytes(2)),
-          rangeShift: int16(ttf.getBytes(2))
-        };
-      };
-
-      function createGlyphNameMap(glyphs, ids, properties) {
-        var glyphNames = properties.glyphNames;
-        if (!glyphNames) {
-          properties.glyphNameMap = {};
-          return;
-        }
-        var glyphsLength = glyphs.length;
-        var glyphNameMap = {};
-        var encoding = [];
-        for (var i = 0; i < glyphsLength; ++i) {
-          var glyphName = glyphNames[ids[i]];
-          if (!glyphName)
-            continue;
-          var unicode = glyphs[i].unicode;
-          glyphNameMap[glyphName] = unicode;
-          var code = glyphs[i].code;
-          encoding[code] = glyphName;
-        }
-        properties.glyphNameMap = glyphNameMap;
-        if (!properties.hasEncoding)
-          properties.baseEncoding = encoding;
-      }
-
-      function readCMapTable(cmap, font) {
-        var start = (font.start ? font.start : 0) + cmap.offset;
-        font.pos = start;
-
-        var version = int16(font.getBytes(2));
-        var numRecords = int16(font.getBytes(2));
-
-        var records = [];
-        for (var i = 0; i < numRecords; i++) {
-          records.push({
-            platformID: int16(font.getBytes(2)),
-            encodingID: int16(font.getBytes(2)),
-            offset: int32(font.getBytes(4))
-          });
-        }
-
-        // Check that table are sorted by platformID then encodingID,
-        records.sort(function fontReadCMapTableSort(a, b) {
-          return ((a.platformID << 16) + a.encodingID) -
-                 ((b.platformID << 16) + b.encodingID);
-        });
-
-        var tables = [records[0]];
-        for (var i = 1; i < numRecords; i++) {
-          // The sanitizer will drop the font if 2 tables have the same
-          // platformID and the same encodingID, this will be correct for
-          // most cases but if the font has been made for Mac it could
-          // exist a few platformID: 1, encodingID: 0 but with a different
-          // language field and that's correct. But the sanitizer does not
-          // seem to support this case.
-          var current = records[i];
-          var previous = records[i - 1];
-          if (((current.platformID << 16) + current.encodingID) <=
-             ((previous.platformID << 16) + previous.encodingID))
-                continue;
-          tables.push(current);
-        }
-
-        var missing = numRecords - tables.length;
-        if (missing) {
-          numRecords = tables.length;
-          var data = string16(version) + string16(numRecords);
-
-          for (var i = 0; i < numRecords; i++) {
-            var table = tables[i];
-            data += string16(table.platformID) +
-                    string16(table.encodingID) +
-                    string32(table.offset);
-          }
-
-          for (var i = 0, ii = data.length; i < ii; i++)
-            cmap.data[i] = data.charCodeAt(i);
-        }
-
-        for (var i = 0; i < numRecords; i++) {
-          var table = tables[i];
-          font.pos = start + table.offset;
-
-          var format = int16(font.getBytes(2));
-          var length = int16(font.getBytes(2));
-          var language = int16(font.getBytes(2));
-
-          if (format == 0) {
-            // Characters below 0x20 are controls characters that are hardcoded
-            // into the platform so if some characters in the font are assigned
-            // under this limit they will not be displayed so let's rewrite the
-            // CMap.
-            var glyphs = [];
-            var ids = [];
-            for (var j = 0; j < 256; j++) {
-              var index = font.getByte();
-              if (index) {
-                glyphs.push({ unicode: j, code: j });
-                ids.push(index);
-              }
-            }
-            return {
-              glyphs: glyphs,
-              ids: ids,
-              hasShortCmap: true
-            };
-          } else if (format == 4) {
-            // re-creating the table in format 4 since the encoding
-            // might be changed
-            var segCount = (int16(font.getBytes(2)) >> 1);
-            font.getBytes(6); // skipping range fields
-            var segIndex, segments = [];
-            for (segIndex = 0; segIndex < segCount; segIndex++) {
-              segments.push({ end: int16(font.getBytes(2)) });
-            }
-            font.getBytes(2);
-            for (segIndex = 0; segIndex < segCount; segIndex++) {
-              segments[segIndex].start = int16(font.getBytes(2));
-            }
-
-            for (segIndex = 0; segIndex < segCount; segIndex++) {
-              segments[segIndex].delta = int16(font.getBytes(2));
-            }
-
-            var offsetsCount = 0;
-            for (segIndex = 0; segIndex < segCount; segIndex++) {
-              var segment = segments[segIndex];
-              var rangeOffset = int16(font.getBytes(2));
-              if (!rangeOffset) {
-                segment.offsetIndex = -1;
-                continue;
-              }
-
-              var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
-              segment.offsetIndex = offsetIndex;
-              offsetsCount = Math.max(offsetsCount, offsetIndex +
-                segment.end - segment.start + 1);
-            }
-
-            var offsets = [];
-            for (var j = 0; j < offsetsCount; j++)
-              offsets.push(int16(font.getBytes(2)));
-
-            var glyphs = [], ids = [];
-
-            for (segIndex = 0; segIndex < segCount; segIndex++) {
-              var segment = segments[segIndex];
-              var start = segment.start, end = segment.end;
-              var delta = segment.delta, offsetIndex = segment.offsetIndex;
-
-              for (var j = start; j <= end; j++) {
-                if (j == 0xFFFF)
-                  continue;
-
-                var glyphCode = offsetIndex < 0 ? j :
-                  offsets[offsetIndex + j - start];
-                glyphCode = (glyphCode + delta) & 0xFFFF;
-                if (glyphCode == 0)
-                  continue;
-
-                glyphs.push({ unicode: j, code: j });
-                ids.push(glyphCode);
-              }
-            }
-
-            return {
-              glyphs: glyphs,
-              ids: ids
-            };
-          } else if (format == 6) {
-            // Format 6 is a 2-bytes dense mapping, which means the font data
-            // lives glue together even if they are pretty far in the unicode
-            // table. (This looks weird, so I can have missed something), this
-            // works on Linux but seems to fails on Mac so let's rewrite the
-            // cmap table to a 3-1-4 style
-            var firstCode = int16(font.getBytes(2));
-            var entryCount = int16(font.getBytes(2));
-
-            var glyphs = [];
-            var ids = [];
-            for (var j = 0; j < entryCount; j++) {
-              var glyphCode = int16(font.getBytes(2));
-              var code = firstCode + j;
-
-              glyphs.push({ unicode: code, code: code });
-              ids.push(glyphCode);
-            }
-
-            return {
-              glyphs: glyphs,
-              ids: ids
-            };
-          }
-        }
-        error('Unsupported cmap table format');
-      };
-
-      function sanitizeMetrics(font, header, metrics, numGlyphs) {
-        if (!header && !metrics)
-          return;
-
-        // The vhea/vmtx tables are not required, so it happens that
-        // some fonts embed a vmtx table without a vhea table. In this
-        // situation the sanitizer assume numOfLongVerMetrics = 1. As
-        // a result it tries to read numGlyphs - 1 SHORT from the vmtx
-        // table, and if it is not possible, the font is rejected.
-        // So remove the vmtx table if there is no vhea table.
-        if (!header && metrics) {
-          metrics.data = null;
-          return;
-        }
-
-        font.pos = (font.start ? font.start : 0) + header.offset;
-        font.pos += header.length - 2;
-        var numOfMetrics = int16(font.getBytes(2));
-
-        var numOfSidebearings = numGlyphs - numOfMetrics;
-        var numMissing = numOfSidebearings -
-          ((hmtx.length - numOfMetrics * 4) >> 1);
-        if (numMissing > 0) {
-          font.pos = (font.start ? font.start : 0) + metrics.offset;
-          var entries = '';
-          for (var i = 0, ii = hmtx.length; i < ii; i++)
-            entries += String.fromCharCode(font.getByte());
-          for (var i = 0; i < numMissing; i++)
-            entries += '\x00\x00';
-          metrics.data = stringToArray(entries);
-        }
-      };
-
-      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
-        if (sourceEnd - sourceStart <= 12) {
-          // glyph with data less than 12 is invalid one
-          return 0;
-        }
-        var glyf = source.subarray(sourceStart, sourceEnd);
-        var contoursCount = (glyf[0] << 8) | glyf[1];
-        if (contoursCount & 0x8000) {
-          // complex glyph, writing as is
-          dest.set(glyf, destStart);
-          return glyf.length;
-        }
-
-        var j = 10, flagsCount = 0;
-        for (var i = 0; i < contoursCount; i++) {
-          var endPoint = (glyf[j] << 8) | glyf[j + 1];
-          flagsCount = endPoint + 1;
-          j += 2;
-        }
-        // skipping instructions
-        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
-        j += 2 + instructionsLength;
-        // validating flags
-        var coordinatesLength = 0;
-        for (var i = 0; i < flagsCount; i++) {
-          var flag = glyf[j++];
-          if (flag & 0xC0) {
-            // reserved flags must be zero, rejecting
-            return 0;
-          }
-          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
-                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
-          coordinatesLength += xyLength;
-          if (flag & 8) {
-            var repeat = glyf[j++];
-            i += repeat;
-            coordinatesLength += repeat * xyLength;
-          }
-        }
-        var glyphDataLength = j + coordinatesLength;
-        if (glyphDataLength > glyf.length) {
-          // not enough data for coordinates
-          return 0;
-        }
-        if (glyf.length - glyphDataLength > 3) {
-          // truncating and aligning to 4 bytes the long glyph data
-          glyphDataLength = (glyphDataLength + 3) & ~3;
-          dest.set(glyf.subarray(0, glyphDataLength), destStart);
-          return glyphDataLength;
-        }
-        // glyph data is fine
-        dest.set(glyf, destStart);
-        return glyf.length;
-      }
-
-      function sanitizeGlyphLocations(loca, glyf, numGlyphs,
-                                      isGlyphLocationsLong) {
-        var itemSize, itemDecode, itemEncode;
-        if (isGlyphLocationsLong) {
-          itemSize = 4;
-          itemDecode = function fontItemDecodeLong(data, offset) {
-            return (data[offset] << 24) | (data[offset + 1] << 16) |
-                   (data[offset + 2] << 8) | data[offset + 3];
-          };
-          itemEncode = function fontItemEncodeLong(data, offset, value) {
-            data[offset] = (value >>> 24) & 0xFF;
-            data[offset + 1] = (value >> 16) & 0xFF;
-            data[offset + 2] = (value >> 8) & 0xFF;
-            data[offset + 3] = value & 0xFF;
-          };
-        } else {
-          itemSize = 2;
-          itemDecode = function fontItemDecode(data, offset) {
-            return (data[offset] << 9) | (data[offset + 1] << 1);
-          };
-          itemEncode = function fontItemEncode(data, offset, value) {
-            data[offset] = (value >> 9) & 0xFF;
-            data[offset + 1] = (value >> 1) & 0xFF;
-          };
-        }
-        var locaData = loca.data;
-        // removing the invalid glyphs
-        var oldGlyfData = glyf.data;
-        var oldGlyfDataLength = oldGlyfData.length;
-        var newGlyfData = new Uint8Array(oldGlyfDataLength);
-        var startOffset = itemDecode(locaData, 0);
-        var writeOffset = 0;
-        itemEncode(locaData, 0, writeOffset);
-        for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
-          var endOffset = itemDecode(locaData, j);
-          if (endOffset > oldGlyfDataLength) {
-            // glyph end offset points outside glyf data, rejecting the glyph
-            itemEncode(locaData, j, writeOffset);
-            startOffset = endOffset;
-            continue;
-          }
-
-          var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
-                                        newGlyfData, writeOffset);
-          writeOffset += newLength;
-          itemEncode(locaData, j, writeOffset);
-          startOffset = endOffset;
-        }
-
-        if (writeOffset == 0) {
-          // glyf table cannot be empty -- redoing the glyf and loca tables
-          // to have single glyph with one point
-          var simpleGlyph = new Uint8Array(
-            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
-          for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize)
-            itemEncode(locaData, j, simpleGlyph.length);
-          glyf.data = simpleGlyph;
-          return;
-        }
-
-        glyf.data = newGlyfData.subarray(0, writeOffset);
-      }
-
-      function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
-        var itemSize, itemDecode;
-        if (isGlyphLocationsLong) {
-          itemSize = 4;
-          itemDecode = function fontItemDecodeLong(data, offset) {
-            return (data[offset] << 24) | (data[offset + 1] << 16) |
-                   (data[offset + 2] << 8) | data[offset + 3];
-          };
-        } else {
-          itemSize = 2;
-          itemDecode = function fontItemDecode(data, offset) {
-            return (data[offset] << 9) | (data[offset + 1] << 1);
-          };
-        }
-        var data = locaTable.data, length = data.length;
-        var lastOffset = itemDecode(data, 0);
-        for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
-          var offset = itemDecode(data, i);
-          if (offset == lastOffset)
-            emptyGlyphIds[j] = true;
-          lastOffset = offset;
-        }
-      }
-
-      function readGlyphNameMap(post, properties) {
-        var start = (font.start ? font.start : 0) + post.offset;
-        font.pos = start;
-
-        var length = post.length, end = start + length;
-        var version = int32(font.getBytes(4));
-        // skip rest to the tables
-        font.getBytes(28);
-
-        var glyphNames;
-        switch (version) {
-          case 0x00010000:
-            glyphNames = MacStandardGlyphOrdering;
-            break;
-          case 0x00020000:
-            var numGlyphs = int16(font.getBytes(2));
-            var glyphNameIndexes = [];
-            for (var i = 0; i < numGlyphs; ++i)
-              glyphNameIndexes.push(int16(font.getBytes(2)));
-            var customNames = [];
-            while (font.pos < end) {
-              var stringLength = font.getByte();
-              var string = '';
-              for (var i = 0; i < stringLength; ++i)
-                string += font.getChar();
-              customNames.push(string);
-            }
-            glyphNames = [];
-            for (var i = 0; i < numGlyphs; ++i) {
-              var j = glyphNameIndexes[i];
-              if (j < 258) {
-                glyphNames.push(MacStandardGlyphOrdering[j]);
-                continue;
-              }
-              glyphNames.push(customNames[j - 258]);
-            }
-            break;
-          case 0x00030000:
-            break;
-          default:
-            warn('Unknown/unsupported post table version ' + version);
-            break;
-        }
-        properties.glyphNames = glyphNames;
-      }
-
-      // Check that required tables are present
-      var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
-                             'hmtx', 'maxp', 'name', 'post'];
-
-      var header = readOpenTypeHeader(font);
-      var numTables = header.numTables;
-
-      var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf;
-      var tables = [];
-      for (var i = 0; i < numTables; i++) {
-        var table = readTableEntry(font);
-        var index = requiredTables.indexOf(table.tag);
-        if (index != -1) {
-          if (table.tag == 'cmap')
-            cmap = table;
-          else if (table.tag == 'post')
-            post = table;
-          else if (table.tag == 'maxp')
-            maxp = table;
-          else if (table.tag == 'hhea')
-            hhea = table;
-          else if (table.tag == 'hmtx')
-            hmtx = table;
-          else if (table.tag == 'head')
-            head = table;
-
-          requiredTables.splice(index, 1);
-        } else {
-          if (table.tag == 'vmtx')
-            vmtx = table;
-          else if (table.tag == 'vhea')
-            vhea = table;
-          else if (table.tag == 'loca')
-            loca = table;
-          else if (table.tag == 'glyf')
-            glyf = table;
-        }
-        tables.push(table);
-      }
-
-      var numTables = header.numTables + requiredTables.length;
-
-      // header and new offsets. Table entry information is appended to the
-      // end of file. The virtualOffset represents where to put the actual
-      // data of a particular table;
-      var ttf = {
-        file: '',
-        virtualOffset: numTables * (4 * 4)
-      };
-
-      // The new numbers of tables will be the last one plus the num
-      // of missing tables
-      createOpenTypeHeader(header.version, ttf, numTables);
-
-      if (requiredTables.indexOf('OS/2') != -1) {
-        // extract some more font properties from the OpenType head and
-        // hhea tables; yMin and descent value are always negative
-        var override = {
-          unitsPerEm: int16([head.data[18], head.data[19]]),
-          yMax: int16([head.data[42], head.data[43]]),
-          yMin: int16([head.data[38], head.data[39]]) - 0x10000,
-          ascent: int16([hhea.data[4], hhea.data[5]]),
-          descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
-        };
-
-        tables.push({
-          tag: 'OS/2',
-          data: stringToArray(createOS2Table(properties, null, override))
-        });
-      }
-
-      // Ensure the [h/v]mtx tables contains the advance width and
-      // sidebearings information for numGlyphs in the maxp table
-      font.pos = (font.start || 0) + maxp.offset;
-      var version = int16(font.getBytes(4));
-      var numGlyphs = int16(font.getBytes(2));
-
-      sanitizeMetrics(font, hhea, hmtx, numGlyphs);
-      sanitizeMetrics(font, vhea, vmtx, numGlyphs);
-
-      var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
-      if (head && loca && glyf) {
-        sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
-      }
-
-      var emptyGlyphIds = [];
-      if (glyf)
-        findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
-
-      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
-      // Sometimes it's 0. That needs to be fixed
-      if (hhea.data[10] == 0 && hhea.data[11] == 0) {
-        hhea.data[10] = 0xFF;
-        hhea.data[11] = 0xFF;
-      }
-
-      // The 'post' table has glyphs names.
-      if (post) {
-        readGlyphNameMap(post, properties);
-      }
-
-      var glyphs, ids;
-      if (properties.type == 'CIDFontType2') {
-        // Replace the old CMAP table with a shiny new one
-        // Type2 composite fonts map characters directly to glyphs so the cmap
-        // table must be replaced.
-        // canvas fillText will reencode some characters even if the font has a
-        // glyph at that position - e.g. newline is converted to a space and
-        // U+00AD (soft hyphen) is not drawn.
-        // So, offset all the glyphs by 0xFF to avoid these cases and use
-        // the encoding to map incoming characters to the new glyph positions
-        if (!cmap) {
-          cmap = {
-            tag: 'cmap',
-            data: null
-          };
-          tables.push(cmap);
-        }
-
-        var cidToGidMap = properties.cidToGidMap || [];
-        var gidToCidMap = [0];
-        if (cidToGidMap.length > 0) {
-          for (var j = cidToGidMap.length - 1; j >= 0; j--) {
-            var gid = cidToGidMap[j];
-            if (gid)
-              gidToCidMap[gid] = j;
-          }
-          // filling the gaps using CID above the CIDs currently used in font
-          var nextCid = cidToGidMap.length;
-          for (var i = 1; i < numGlyphs; i++) {
-            if (!gidToCidMap[i])
-              gidToCidMap[i] = nextCid++;
-          }
-        }
-
-        glyphs = [];
-        ids = [];
-
-        var usedUnicodes = [];
-        var unassignedUnicodeItems = [];
-        for (var i = 1; i < numGlyphs; i++) {
-          var cid = gidToCidMap[i] || i;
-          var unicode = this.toFontChar[cid];
-          if (!unicode || typeof unicode !== 'number' ||
-              isSpecialUnicode(unicode) || unicode in usedUnicodes) {
-            unassignedUnicodeItems.push(i);
-            continue;
-          }
-          usedUnicodes[unicode] = true;
-          glyphs.push({ unicode: unicode, code: cid });
-          ids.push(i);
-        }
-        // trying to fit as many unassigned symbols as we can
-        // in the range allocated for the user defined symbols
-        var unusedUnicode = kCmapGlyphOffset;
-        for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
-          var i = unassignedUnicodeItems[j];
-          var cid = gidToCidMap[i] || i;
-          while (unusedUnicode in usedUnicodes)
-            unusedUnicode++;
-          if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
-            break;
-          var unicode = unusedUnicode++;
-          this.toFontChar[cid] = unicode;
-          usedUnicodes[unicode] = true;
-          glyphs.push({ unicode: unicode, code: cid });
-          ids.push(i);
-        }
-      } else {
-        var cmapTable = readCMapTable(cmap, font);
-
-        glyphs = cmapTable.glyphs;
-        ids = cmapTable.ids;
-
-        var hasShortCmap = !!cmapTable.hasShortCmap;
-        var toFontChar = this.toFontChar;
-
-        if (hasShortCmap && ids.length == numGlyphs) {
-          // Fixes the short cmap tables -- some generators use incorrect
-          // glyph id.
-          for (var i = 0, ii = ids.length; i < ii; i++)
-            ids[i] = i;
-        }
-
-        var unusedUnicode = kCmapGlyphOffset;
-        var glyphNames = properties.glyphNames || [];
-        var encoding = properties.baseEncoding;
-        var differences = properties.differences;
-        if (toFontChar && toFontChar.length > 0) {
-          // checking if cmap is just identity map
-          var isIdentity = true;
-          for (var i = 0, ii = glyphs.length; i < ii; i++) {
-            if (glyphs[i].unicode != i + 1) {
-              isIdentity = false;
-              break;
-            }
-          }
-          // if it is, replacing with meaningful toUnicode values
-          if (isIdentity && !this.isSymbolicFont) {
-            var usedUnicodes = [], unassignedUnicodeItems = [];
-            for (var i = 0, ii = glyphs.length; i < ii; i++) {
-              var unicode = toFontChar[i + 1];
-              if (!unicode || typeof unicode !== 'number' ||
-                  unicode in usedUnicodes) {
-                unassignedUnicodeItems.push(i);
-                continue;
-              }
-              glyphs[i].unicode = unicode;
-              usedUnicodes[unicode] = true;
-            }
-            for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
-              var i = unassignedUnicodeItems[j];
-              while (unusedUnicode in usedUnicodes)
-                unusedUnicode++;
-              var cid = i + 1;
-              // override only if unicode mapping is not specified
-              if (!(cid in toFontChar))
-                toFontChar[cid] = unusedUnicode;
-              glyphs[i].unicode = unusedUnicode++;
-            }
-            this.useToFontChar = true;
-          }
-        }
-
-        // remove glyph references outside range of avaialable glyphs or empty
-        var glyphsRemoved = 0;
-        for (var i = ids.length - 1; i >= 0; i--) {
-          if (ids[i] < numGlyphs &&
-              (!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
-            continue;
-          ids.splice(i, 1);
-          glyphs.splice(i, 1);
-          glyphsRemoved++;
-        }
-
-        // checking if it's a "true" symbolic font
-        if (this.isSymbolicFont) {
-          var minUnicode = 0xFFFF, maxUnicode = 0;
-          for (var i = 0, ii = glyphs.length; i < ii; i++) {
-            var unicode = glyphs[i].unicode;
-            minUnicode = Math.min(minUnicode, unicode);
-            maxUnicode = Math.max(maxUnicode, unicode);
-          }
-          // high byte must be the same for min and max unicodes
-          if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
-            this.isSymbolicFont = false;
-        }
-
-        // heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding
-        // does not set properly
-        if (glyphsRemoved > 2) {
-          warn('Switching TrueType encoding to MacRomanEncoding for ' +
-               this.name + ' font');
-          encoding = Encodings.MacRomanEncoding;
-        }
-
-        if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
-          // Re-encode short map encoding to unicode -- that simplifies the
-          // resolution of MacRoman encoded glyphs logic for TrueType fonts:
-          // copying all characters to private use area, all mapping all known
-          // glyphs to the unicodes. The glyphs and ids arrays will grow.
-          var usedUnicodes = [];
-          for (var i = 0, ii = glyphs.length; i < ii; i++) {
-            var code = glyphs[i].unicode;
-            var gid = ids[i];
-            glyphs[i].unicode += kCmapGlyphOffset;
-            toFontChar[code] = glyphs[i].unicode;
-
-            var glyphName = glyphNames[gid] || encoding[code];
-            if (glyphName in GlyphsUnicode) {
-              var unicode = GlyphsUnicode[glyphName];
-              if (unicode in usedUnicodes)
-                continue;
-
-              usedUnicodes[unicode] = true;
-              glyphs.push({
-                unicode: unicode,
-                code: glyphs[i].code
-              });
-              ids.push(gid);
-              toFontChar[code] = unicode;
-            }
-          }
-          this.useToFontChar = true;
-        } else if (!this.isSymbolicFont && (this.hasEncoding ||
-                    properties.glyphNames || differences.length > 0)) {
-          // Re-encode cmap encoding to unicode, based on the 'post' table data
-          // diffrence array or base encoding
-          var reverseMap = [];
-          for (var i = 0, ii = glyphs.length; i < ii; i++)
-            reverseMap[glyphs[i].unicode] = i;
-
-          var newGlyphUnicodes = [];
-          for (var i = 0, ii = glyphs.length; i < ii; i++) {
-            var code = glyphs[i].unicode;
-            var changeCode = false;
-            var gid = ids[i];
-
-            var glyphName = glyphNames[gid];
-            if (!glyphName) {
-              glyphName = differences[code] || encoding[code];
-              changeCode = true;
-            }
-            if (glyphName in GlyphsUnicode) {
-              var unicode = GlyphsUnicode[glyphName];
-              if (!unicode || reverseMap[unicode] === i)
-                continue; // unknown glyph name or in its own place
-
-              newGlyphUnicodes[i] = unicode;
-              if (changeCode)
-                toFontChar[code] = unicode;
-              delete reverseMap[code];
-            }
-          }
-          for (var index in newGlyphUnicodes) {
-            var unicode = newGlyphUnicodes[index];
-            if (reverseMap[unicode]) {
-              // avoiding assigning to the same unicode
-              glyphs[index].unicode = unusedUnicode++;
-              continue;
-            }
-            glyphs[index].unicode = unicode;
-            reverseMap[unicode] = index;
-          }
-          this.useToFontChar = true;
-        }
-
-        // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
-        if (this.isSymbolicFont) {
-          for (var i = 0, ii = glyphs.length; i < ii; i++) {
-            var code = glyphs[i].unicode & 0xFF;
-            var fontCharCode = kSymbolicFontGlyphOffset | code;
-            glyphs[i].unicode = toFontChar[code] = fontCharCode;
-          }
-          this.useToFontChar = true;
-        }
-
-        createGlyphNameMap(glyphs, ids, properties);
-        this.glyphNameMap = properties.glyphNameMap;
-      }
-
-      // Converting glyphs and ids into font's cmap table
-      cmap.data = createCMapTable(glyphs, ids);
-      var unicodeIsEnabled = [];
-      for (var i = 0, ii = glyphs.length; i < ii; i++) {
-        unicodeIsEnabled[glyphs[i].unicode] = true;
-      }
-      this.unicodeIsEnabled = unicodeIsEnabled;
-
-      // Rewrite the 'post' table if needed
-      if (requiredTables.indexOf('post') != -1) {
-        tables.push({
-          tag: 'post',
-          data: stringToArray(createPostTable(properties))
-        });
-      }
-
-      // Rewrite the 'name' table if needed
-      if (requiredTables.indexOf('name') != -1) {
-        tables.push({
-          tag: 'name',
-          data: stringToArray(createNameTable(this.name))
-        });
-      }
-
-      // Tables needs to be written by ascendant alphabetic order
-      tables.sort(function tables_sort(a, b) {
-        return (a.tag > b.tag) - (a.tag < b.tag);
-      });
-
-      // rewrite the tables but tweak offsets
-      for (var i = 0, ii = tables.length; i < ii; i++) {
-        var table = tables[i];
-        var data = [];
-
-        var tableData = table.data;
-        for (var j = 0, jj = tableData.length; j < jj; j++)
-          data.push(tableData[j]);
-        createTableEntry(ttf, table.tag, data);
-      }
-
-      // Add the table datas
-      for (var i = 0, ii = tables.length; i < ii; i++) {
-        var table = tables[i];
-        var tableData = table.data;
-        ttf.file += arrayToString(tableData);
-
-        // 4-byte aligned data
-        while (ttf.file.length & 3)
-          ttf.file += String.fromCharCode(0);
-      }
-
-      return stringToArray(ttf.file);
-    },
-
-    convert: function Font_convert(fontName, font, properties) {
-      function isFixedPitch(glyphs) {
-        for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
-          if (glyphs[i] != glyphs[i + 1])
-            return false;
-        }
-        return true;
-      }
-
-      // The offsets object holds at the same time a representation of where
-      // to write the table entry information about a table and another offset
-      // representing the offset where to draw the actual data of a particular
-      // table
-      var kRequiredTablesCount = 9;
-
-      var otf = {
-        file: '',
-        virtualOffset: 9 * (4 * 4)
-      };
-
-      createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
-
-      var charstrings = font.charstrings;
-      properties.fixedPitch = isFixedPitch(charstrings);
-
-      var glyphNameMap = {};
-      for (var i = 0; i < charstrings.length; ++i) {
-        var charstring = charstrings[i];
-        glyphNameMap[charstring.glyph] = charstring.unicode;
-      }
-      this.glyphNameMap = glyphNameMap;
-
-      if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
-          properties.subtype == 'CIDFontType0C')) {
-        var encoding = [];
-        for (var i = 0; i < charstrings.length; ++i) {
-          var charstring = charstrings[i];
-          encoding[charstring.code] = charstring.glyph;
-        }
-        properties.baseEncoding = encoding;
-      }
-      if (properties.subtype == 'CIDFontType0C') {
-        var toFontChar = [];
-        for (var i = 0; i < charstrings.length; ++i) {
-          var charstring = charstrings[i];
-          toFontChar[charstring.code] = charstring.unicode;
-        }
-        this.toFontChar = toFontChar;
-      }
-
-      var fields = {
-        // PostScript Font Program
-        'CFF ': font.data,
-
-        // OS/2 and Windows Specific metrics
-        'OS/2': stringToArray(createOS2Table(properties, charstrings)),
-
-        // Character to glyphs mapping
-        'cmap': createCMapTable(charstrings.slice(),
-                                ('glyphIds' in font) ? font.glyphIds : null),
-
-        // Font header
-        'head': (function fontFieldsHead() {
-          return stringToArray(
-              '\x00\x01\x00\x00' + // Version number
-              '\x00\x00\x10\x00' + // fontRevision
-              '\x00\x00\x00\x00' + // checksumAdjustement
-              '\x5F\x0F\x3C\xF5' + // magicNumber
-              '\x00\x00' + // Flags
-              '\x03\xE8' + // unitsPerEM (defaulting to 1000)
-              '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
-              '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
-              '\x00\x00' + // xMin
-              safeString16(properties.descent) + // yMin
-              '\x0F\xFF' + // xMax
-              safeString16(properties.ascent) + // yMax
-              string16(properties.italicAngle ? 2 : 0) + // macStyle
-              '\x00\x11' + // lowestRecPPEM
-              '\x00\x00' + // fontDirectionHint
-              '\x00\x00' + // indexToLocFormat
-              '\x00\x00');  // glyphDataFormat
-        })(),
-
-        // Horizontal header
-        'hhea': (function fontFieldsHhea() {
-          return stringToArray(
-              '\x00\x01\x00\x00' + // Version number
-              safeString16(properties.ascent) + // Typographic Ascent
-              safeString16(properties.descent) + // Typographic Descent
-              '\x00\x00' + // Line Gap
-              '\xFF\xFF' + // advanceWidthMax
-              '\x00\x00' + // minLeftSidebearing
-              '\x00\x00' + // minRightSidebearing
-              '\x00\x00' + // xMaxExtent
-              safeString16(properties.capHeight) + // caretSlopeRise
-              safeString16(Math.tan(properties.italicAngle) *
-                       properties.xHeight) + // caretSlopeRun
-              '\x00\x00' + // caretOffset
-              '\x00\x00' + // -reserved-
-              '\x00\x00' + // -reserved-
-              '\x00\x00' + // -reserved-
-              '\x00\x00' + // -reserved-
-              '\x00\x00' + // metricDataFormat
-              string16(charstrings.length + 1)); // Number of HMetrics
-        })(),
-
-        // Horizontal metrics
-        'hmtx': (function fontFieldsHmtx() {
-          var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
-          for (var i = 0, ii = charstrings.length; i < ii; i++) {
-            var charstring = charstrings[i];
-            var width = 'width' in charstring ? charstring.width : 0;
-            hmtx += string16(width) + string16(0);
-          }
-          return stringToArray(hmtx);
-        })(),
-
-        // Maximum profile
-        'maxp': (function fontFieldsMaxp() {
-          return stringToArray(
-              '\x00\x00\x50\x00' + // Version number
-             string16(charstrings.length + 1)); // Num of glyphs
-        })(),
-
-        // Naming tables
-        'name': stringToArray(createNameTable(fontName)),
-
-        // PostScript informations
-        'post': stringToArray(createPostTable(properties))
-      };
-
-      for (var field in fields)
-        createTableEntry(otf, field, fields[field]);
-
-      for (var field in fields) {
-        var table = fields[field];
-        otf.file += arrayToString(table);
-      }
-
-      return stringToArray(otf.file);
-    },
-
-    buildToFontChar: function Font_buildToFontChar(toUnicode) {
-      var result = [];
-      var unusedUnicode = kCmapGlyphOffset;
-      for (var i = 0, ii = toUnicode.length; i < ii; i++) {
-        var unicode = toUnicode[i];
-        var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ :
-          unicode;
-        if (typeof unicode !== 'undefined')
-          result[i] = fontCharCode;
-      }
-      return result;
-    },
-
-    rebuildToUnicode: function Font_rebuildToUnicode(properties) {
-      var firstChar = properties.firstChar, lastChar = properties.lastChar;
-      var map = [];
-      if (properties.composite) {
-        var isIdentityMap = this.cidToUnicode.length == 0;
-        for (var i = firstChar, ii = lastChar; i <= ii; i++) {
-          // TODO missing map the character according font's CMap
-          var cid = i;
-          map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
-        }
-      } else {
-        for (var i = firstChar, ii = lastChar; i <= ii; i++) {
-          var glyph = properties.differences[i];
-          if (!glyph)
-            glyph = properties.baseEncoding[i];
-          if (!!glyph && (glyph in GlyphsUnicode))
-            map[i] = GlyphsUnicode[glyph];
-        }
-      }
-      this.toUnicode = map;
-    },
-
-    loadCidToUnicode: function Font_loadCidToUnicode(properties) {
-      if (!properties.cidSystemInfo)
-        return;
-
-      var cidToUnicodeMap = [], unicodeToCIDMap = [];
-      this.cidToUnicode = cidToUnicodeMap;
-      this.unicodeToCID = unicodeToCIDMap;
-
-      var cidSystemInfo = properties.cidSystemInfo;
-      var cidToUnicode;
-      if (cidSystemInfo) {
-        cidToUnicode = CIDToUnicodeMaps[
-          cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
-      }
-
-      if (!cidToUnicode)
-        return; // identity encoding
-
-      var cid = 1, i, j, k, ii;
-      for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
-        var unicode = cidToUnicode[i];
-        if (isArray(unicode)) {
-          var length = unicode.length;
-          for (j = 0; j < length; j++) {
-            cidToUnicodeMap[cid] = unicode[j];
-            unicodeToCIDMap[unicode[j]] = cid;
-          }
-          cid++;
-        } else if (typeof unicode === 'object') {
-          var fillLength = unicode.f;
-          if (fillLength) {
-            k = unicode.c;
-            for (j = 0; j < fillLength; ++j) {
-              cidToUnicodeMap[cid] = k;
-              unicodeToCIDMap[k] = cid;
-              cid++;
-              k++;
-            }
-          } else
-            cid += unicode.s;
-        } else if (unicode) {
-          cidToUnicodeMap[cid] = unicode;
-          unicodeToCIDMap[unicode] = cid;
-          cid++;
-        } else
-          cid++;
-      }
-    },
-
-    bindDOM: function Font_bindDOM(data) {
-      var fontName = this.loadedName;
-
-      // Add the font-face rule to the document
-      var url = ('url(data:' + this.mimetype + ';base64,' +
-                 window.btoa(data) + ');');
-      var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
-
-      var styleElement = document.createElement('style');
-      document.documentElement.getElementsByTagName('head')[0].appendChild(
-        styleElement);
-
-      var styleSheet = styleElement.sheet;
-      styleSheet.insertRule(rule, styleSheet.cssRules.length);
-
-      if (PDFJS.pdfBug && FontInspector.enabled)
-        FontInspector.fontAdded(this, url);
-
-      return rule;
-    },
-
-    get spaceWidth() {
-      // trying to estimate space character width
-      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
-      var width;
-      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
-        var glyphName = possibleSpaceReplacements[i];
-        // if possible, getting width by glyph name
-        if (glyphName in this.widths) {
-          width = this.widths[glyphName];
-          break;
-        }
-        var glyphUnicode = GlyphsUnicode[glyphName];
-        // finding the charcode via unicodeToCID map
-        var charcode = 0;
-        if (this.composite)
-          charcode = this.unicodeToCID[glyphUnicode];
-        // ... via toUnicode map
-        if (!charcode && 'toUnicode' in this)
-          charcode = this.toUnicode.indexOf(glyphUnicode);
-        // setting it to unicode if negative or undefined
-        if (!(charcode > 0))
-          charcode = glyphUnicode;
-        // trying to get width via charcode
-        width = this.widths[charcode];
-        if (width)
-          break; // the non-zero width found
-      }
-      width = (width || this.defaultWidth) * this.widthMultiplier;
-      return shadow(this, 'spaceWidth', width);
-    },
-
-    charToGlyph: function Font_charToGlyph(charcode) {
-      var fontCharCode, width, operatorList, disabled;
-
-      var width = this.widths[charcode];
-
-      switch (this.type) {
-        case 'CIDFontType0':
-          if (this.noUnicodeAdaptation) {
-            width = this.widths[this.unicodeToCID[charcode] || charcode];
-            fontCharCode = mapPrivateUseChars(charcode);
-            break;
-          }
-          fontCharCode = this.toFontChar[charcode] || charcode;
-          break;
-        case 'CIDFontType2':
-          if (this.noUnicodeAdaptation) {
-            width = this.widths[this.unicodeToCID[charcode] || charcode];
-            fontCharCode = mapPrivateUseChars(charcode);
-            break;
-          }
-          fontCharCode = this.toFontChar[charcode] || charcode;
-          break;
-        case 'Type1':
-          var glyphName = this.differences[charcode] || this.encoding[charcode];
-          if (!isNum(width))
-            width = this.widths[glyphName];
-          if (this.noUnicodeAdaptation) {
-            fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
-              charcode);
-            break;
-          }
-          fontCharCode = this.glyphNameMap[glyphName] ||
-            GlyphsUnicode[glyphName] || charcode;
-          break;
-        case 'Type3':
-          var glyphName = this.differences[charcode] || this.encoding[charcode];
-          operatorList = this.charProcOperatorList[glyphName];
-          fontCharCode = charcode;
-          break;
-        case 'TrueType':
-          if (this.useToFontChar) {
-            fontCharCode = this.toFontChar[charcode] || charcode;
-            break;
-          }
-          var glyphName = this.differences[charcode] || this.encoding[charcode];
-          if (!glyphName)
-            glyphName = Encodings.StandardEncoding[charcode];
-          if (!isNum(width))
-            width = this.widths[glyphName];
-          if (this.noUnicodeAdaptation) {
-            fontCharCode = GlyphsUnicode[glyphName] || charcode;
-            break;
-          }
-          if (!this.hasEncoding || this.isSymbolicFont) {
-            fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
-              charcode;
-            break;
-          }
-
-          // MacRoman encoding address by re-encoding the cmap table
-          fontCharCode = glyphName in this.glyphNameMap ?
-            this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
-          break;
-        default:
-          warn('Unsupported font type: ' + this.type);
-          break;
-      }
-
-      var unicodeChars = !('toUnicode' in this) ? charcode :
-        this.toUnicode[charcode] || charcode;
-      if (typeof unicodeChars === 'number')
-        unicodeChars = String.fromCharCode(unicodeChars);
-
-      width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
-      disabled = this.unicodeIsEnabled ?
-        !this.unicodeIsEnabled[fontCharCode] : false;
-
-      return {
-        fontChar: String.fromCharCode(fontCharCode),
-        unicode: unicodeChars,
-        width: width,
-        disabled: disabled,
-        operatorList: operatorList
-      };
-    },
-
-    charsToGlyphs: function Font_charsToGlyphs(chars) {
-      var charsCache = this.charsCache;
-      var glyphs;
-
-      // if we translated this string before, just grab it from the cache
-      if (charsCache) {
-        glyphs = charsCache[chars];
-        if (glyphs)
-          return glyphs;
-      }
-
-      // lazily create the translation cache
-      if (!charsCache)
-        charsCache = this.charsCache = Object.create(null);
-
-      glyphs = [];
-
-      if (this.composite) {
-        // composite fonts have multi-byte strings convert the string from
-        // single-byte to multi-byte
-        // XXX assuming CIDFonts are two-byte - later need to extract the
-        // correct byte encoding according to the PDF spec
-        var length = chars.length - 1; // looping over two bytes at a time so
-                                       // loop should never end on the last byte
-        for (var i = 0; i < length; i++) {
-          var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
-          var glyph = this.charToGlyph(charcode);
-          glyphs.push(glyph);
-          // placing null after each word break charcode (ASCII SPACE)
-          if (charcode == 0x20)
-            glyphs.push(null);
-        }
-      }
-      else {
-        for (var i = 0, ii = chars.length; i < ii; ++i) {
-          var charcode = chars.charCodeAt(i);
-          var glyph = this.charToGlyph(charcode);
-          glyphs.push(glyph);
-          if (charcode == 0x20)
-            glyphs.push(null);
-        }
-      }
-
-      // Enter the translated string into the cache
-      return (charsCache[chars] = glyphs);
-    }
-  };
-
-  return Font;
-})();
-
-/*
- * Type1Parser encapsulate the needed code for parsing a Type1 font
- * program. Some of its logic depends on the Type2 charstrings
- * structure.
- */
-var Type1Parser = function type1Parser() {
-  /*
-   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
-   * of Plaintext Bytes. The function took a key as a parameter which can be
-   * for decrypting the eexec block of for decoding charStrings.
-   */
-  var kEexecEncryptionKey = 55665;
-  var kCharStringsEncryptionKey = 4330;
-
-  function decrypt(stream, key, discardNumber) {
-    var r = key, c1 = 52845, c2 = 22719;
-    var decryptedString = [];
-
-    var value = '';
-    var count = stream.length;
-    for (var i = 0; i < count; i++) {
-      value = stream[i];
-      decryptedString[i] = value ^ (r >> 8);
-      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
-    }
-    return decryptedString.slice(discardNumber);
-  }
-
-  /*
-   * CharStrings are encoded following the the CharString Encoding sequence
-   * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
-   * The value in a byte indicates a command, a number, or subsequent bytes
-   * that are to be interpreted in a special way.
-   *
-   * CharString Number Encoding:
-   *  A CharString byte containing the values from 32 through 255 inclusive
-   *  indicate an integer. These values are decoded in four ranges.
-   *
-   * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
-   * indicate the integer v - 139. Thus, the integer values from -107 through
-   * 107 inclusive may be encoded in single byte.
-   *
-   * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
-   * indicates an integer involving the next byte, w, according to the formula:
-   * [(v - 247) x 256] + w + 108
-   *
-   * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
-   * indicates an integer involving the next byte, w, according to the formula:
-   * -[(v - 251) * 256] - w - 108
-   *
-   * 4. A CharString containing the value 255 indicates that the next 4 bytes
-   * are a two complement signed integer. The first of these bytes contains the
-   * highest order bits, the second byte contains the next higher order bits
-   * and the fourth byte contain the lowest order bits.
-   *
-   *
-   * CharString Command Encoding:
-   *  CharStrings commands are encoded in 1 or 2 bytes.
-   *
-   *  Single byte commands are encoded in 1 byte that contains a value between
-   *  0 and 31 inclusive.
-   *  If a command byte contains the value 12, then the value in the next byte
-   *  indicates a command. This "escape" mechanism allows many extra commands
-   * to be encoded and this encoding technique helps to minimize the length of
-   * the charStrings.
-   */
-  var charStringDictionary = {
-    '1': 'hstem',
-    '3': 'vstem',
-    '4': 'vmoveto',
-    '5': 'rlineto',
-    '6': 'hlineto',
-    '7': 'vlineto',
-    '8': 'rrcurveto',
-
-    // closepath is a Type1 command that do not take argument and is useless
-    // in Type2 and it can simply be ignored.
-    '9': null, // closepath
-
-    '10': 'callsubr',
-
-    // return is normally used inside sub-routines to tells to the execution
-    // flow that it can be back to normal.
-    // During the translation process Type1 charstrings will be flattened and
-    // sub-routines will be embedded directly into the charstring directly, so
-    // this can be ignored safely.
-    '11': 'return',
-
-    '12': {
-      // dotsection is a Type1 command to specify some hinting feature for dots
-      // that do not take a parameter and it can safely be ignored for Type2.
-      '0': null, // dotsection
-
-      // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
-      // parameters, so instead of returning [vh]stem3 take a shortcut and
-      // return [vhstem] instead.
-      '1': 'vstem',
-      '2': 'hstem',
-
-      // Type1 only command with command not (yet) built-in ,throw an error
-      '6': -1, // seac
-      '7': -1, // sbw
-
-      '11': 'sub',
-      '12': 'div',
-
-      // callothersubr is a mechanism to make calls on the postscript
-      // interpreter, this is not supported by Type2 charstring but hopefully
-      // most of the default commands can be ignored safely.
-      '16': 'callothersubr',
-
-      '17': 'pop',
-
-      // setcurrentpoint sets the current point to x, y without performing a
-      // moveto (this is a one shot positionning command). This is used only
-      // with the return of an OtherSubrs call.
-      // TODO Implement the OtherSubrs charstring embedding and replace this
-      // call by a no-op, like 2 'pop' commands for example.
-      '33': null // setcurrentpoint
-    },
-    '13': 'hsbw',
-    '14': 'endchar',
-    '21': 'rmoveto',
-    '22': 'hmoveto',
-    '30': 'vhcurveto',
-    '31': 'hvcurveto'
-  };
-
-  var kEscapeCommand = 12;
-
-  function decodeCharString(array) {
-    var charstring = [];
-    var lsb = 0;
-    var width = 0;
-    var flexState = 0;
-
-    var value = '';
-    var count = array.length;
-    for (var i = 0; i < count; i++) {
-      value = array[i];
-
-      if (value < 32) {
-        var command = null;
-        if (value == kEscapeCommand) {
-          var escape = array[++i];
-
-          // TODO Clean this code
-          if (escape == 16) {
-            var index = charstring.pop();
-            var argc = charstring.pop();
-            for (var j = 0; j < argc; j++)
-              charstring.push('drop');
-
-            // If the flex mechanism is not used in a font program, Adobe
-            // states that entries 0, 1 and 2 can simply be replaced by
-            // {}, which means that we can simply ignore them.
-            if (index < 3) {
-              continue;
-            }
-
-            // This is the same things about hint replacement, if it is not used
-            // entry 3 can be replaced by {3}
-            // TODO support hint replacment
-            if (index == 3) {
-              charstring.push(3);
-              i++;
-              continue;
-            }
-          } else if (escape == 17 || escape == 33) {
-            // pop or setcurrentpoint commands can be ignored
-            // since we are not doing callothersubr
-            continue;
-          } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
-            charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
-            continue;
-          }
-
-          command = charStringDictionary['12'][escape];
-        } else {
-          // TODO Clean this code
-          if (value == 13) { // hsbw
-            if (charstring.length == 2) {
-              lsb = charstring[0];
-              width = charstring[1];
-              charstring.splice(0, 1);
-            } else if (charstring.length == 4 && charstring[3] == 'div') {
-              lsb = charstring[0];
-              width = charstring[1] / charstring[2];
-              charstring.splice(0, 1);
-            } else if (charstring.length == 4 && charstring[2] == 'div') {
-              lsb = charstring[0] / charstring[1];
-              width = charstring[3];
-              charstring.splice(0, 3);
-            } else {
-              error('Unsupported hsbw format: ' + charstring);
-            }
-
-            charstring.push(lsb, 'hmoveto');
-            continue;
-          } else if (value == 10) { // callsubr
-            if (charstring[charstring.length - 1] < 3) { // subr #0..2
-              var subrNumber = charstring.pop();
-              switch (subrNumber) {
-                case 1:
-                  flexState = 1; // prepare for flex coordinates
-                  break;
-                case 2:
-                  flexState = 2; // flex in progress
-                  break;
-                case 0:
-                  // type2 flex command does not need final coords
-                  charstring.push('exch', 'drop', 'exch', 'drop');
-                  charstring.push('flex');
-                  flexState = 0;
-                  break;
-              }
-              continue;
-            }
-          } else if (value == 21 && flexState > 0) {
-            if (flexState > 1)
-              continue; // ignoring rmoveto
-            value = 5; // first segment replacing with rlineto
-          } else if (!kHintingEnabled && (value == 1 || value == 3)) {
-            charstring.push('drop', 'drop');
-            continue;
-          }
-          command = charStringDictionary[value];
-        }
-
-        // Some charstring commands are meaningless in Type2 and will return
-        // a null, let's just ignored them
-        if (!command && i < count) {
-          continue;
-        } else if (!command) {
-          break;
-        } else if (command == -1) {
-          warn('Support for Type1 command ' + value +
-                ' (' + escape + ') is not implemented in charstring: ' +
-                charstring);
-          if (value == 12) {
-            // we know how to ignore only some the Type1 commands
-            switch (escape) {
-              case 7:
-                charstring.push('drop', 'drop', 'drop', 'drop');
-                continue;
-              case 8:
-                charstring.push('drop');
-                continue;
-            }
-          }
-        }
-
-        value = command;
-      } else if (value <= 246) {
-        value = value - 139;
-      } else if (value <= 250) {
-        value = ((value - 247) * 256) + array[++i] + 108;
-      } else if (value <= 254) {
-        value = -((value - 251) * 256) - array[++i] - 108;
-      } else {
-        value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
-                (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
-      }
-
-      charstring.push(value);
-    }
-
-    return { charstring: charstring, width: width, lsb: lsb };
-  }
-
-  /*
-   * Returns an object containing a Subrs array and a CharStrings
-   * array extracted from and eexec encrypted block of data
-   */
-  function readNumberArray(str, index) {
-    var start = index;
-    while (str[index++] != '[')
-      start++;
-    start++;
-
-    var count = 0;
-    while (str[index++] != ']')
-      count++;
-
-    str = str.substr(start, count);
-
-    str = str.trim();
-    // Remove adjacent spaces
-    str = str.replace(/\s+/g, ' ');
-
-    var array = str.split(' ');
-    for (var i = 0, ii = array.length; i < ii; i++)
-      array[i] = parseFloat(array[i] || 0);
-    return array;
-  }
-
-  function readNumber(str, index) {
-    while (str[index] == ' ')
-      index++;
-
-    var start = index;
-
-    var count = 0;
-    while (str[index++] != ' ')
-      count++;
-
-    return parseFloat(str.substr(start, count) || 0);
-  }
-
-  function isSeparator(c) {
-    return c == ' ' || c == '\n' || c == '\x0d';
-  }
-
-  this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
-    var eexec = decrypt(stream, kEexecEncryptionKey, 4);
-    var eexecStr = '';
-    for (var i = 0, ii = eexec.length; i < ii; i++)
-      eexecStr += String.fromCharCode(eexec[i]);
-
-    var glyphsSection = false, subrsSection = false;
-    var program = {
-      subrs: [],
-      charstrings: [],
-      properties: {
-        'privateData': {
-          'lenIV': 4
-        }
-      }
-    };
-
-    var glyph = '';
-    var token = '';
-    var length = 0;
-
-    var c = '';
-    var count = eexecStr.length;
-    for (var i = 0; i < count; i++) {
-      var getToken = function getToken() {
-        while (i < count && isSeparator(eexecStr[i]))
-          ++i;
-
-        var token = '';
-        while (i < count && !isSeparator(eexecStr[i]))
-          token += eexecStr[i++];
-
-        return token;
-      };
-      var c = eexecStr[i];
-
-      if ((glyphsSection || subrsSection) &&
-          (token == 'RD' || token == '-|')) {
-        i++;
-        var data = eexec.slice(i, i + length);
-        var lenIV = program.properties.privateData['lenIV'];
-        var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
-        var str = decodeCharString(encoded);
-
-        if (glyphsSection) {
-          program.charstrings.push({
-            glyph: glyph,
-            data: str.charstring,
-            lsb: str.lsb,
-            width: str.width
-          });
-        } else {
-          program.subrs.push(str.charstring);
-        }
-        i += length;
-        token = '';
-      } else if (isSeparator(c)) {
-        length = parseInt(token, 10);
-        token = '';
-      } else {
-        token += c;
-        if (!glyphsSection) {
-          switch (token) {
-            case '/CharString':
-              glyphsSection = true;
-              break;
-            case '/Subrs':
-              ++i;
-              var num = parseInt(getToken(), 10);
-              getToken(); // read in 'array'
-              for (var j = 0; j < num; ++j) {
-                var t = getToken(); // read in 'dup'
-                if (t == 'ND' || t == '|-' || t == 'noaccess')
-                  break;
-                var index = parseInt(getToken(), 10);
-                if (index > j)
-                  j = index;
-                var length = parseInt(getToken(), 10);
-                getToken(); // read in 'RD'
-                var data = eexec.slice(i + 1, i + 1 + length);
-                var lenIV = program.properties.privateData['lenIV'];
-                var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
-                var str = decodeCharString(encoded);
-                i = i + 1 + length;
-                t = getToken(); // read in 'NP'
-                if (t == 'noaccess')
-                  getToken(); // read in 'put'
-                program.subrs[index] = str.charstring;
-              }
-              break;
-            case '/BlueValues':
-            case '/OtherBlues':
-            case '/FamilyBlues':
-            case '/FamilyOtherBlues':
-            case '/StemSnapH':
-            case '/StemSnapV':
-              program.properties.privateData[token.substring(1)] =
-                readNumberArray(eexecStr, i + 1);
-              break;
-            case '/StdHW':
-            case '/StdVW':
-              program.properties.privateData[token.substring(1)] =
-                readNumberArray(eexecStr, i + 2)[0];
-              break;
-            case '/BlueShift':
-            case '/lenIV':
-            case '/BlueFuzz':
-            case '/BlueScale':
-            case '/LanguageGroup':
-            case '/ExpansionFactor':
-              program.properties.privateData[token.substring(1)] =
-                readNumber(eexecStr, i + 1);
-              break;
-          }
-        } else if (c == '/') {
-          token = glyph = '';
-          while ((c = eexecStr[++i]) != ' ')
-            glyph += c;
-        }
-      }
-    }
-
-    return program;
-  };
-
-  this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
-                                                                  properties) {
-    var headerString = '';
-    for (var i = 0, ii = stream.length; i < ii; i++)
-      headerString += String.fromCharCode(stream[i]);
-
-    var token = '';
-    var count = headerString.length;
-    for (var i = 0; i < count; i++) {
-      var getToken = function getToken() {
-        var character = headerString[i];
-        while (i < count && (isSeparator(character) || character == '/'))
-          character = headerString[++i];
-
-        var token = '';
-        while (i < count && !(isSeparator(character) || character == '/')) {
-          token += character;
-          character = headerString[++i];
-        }
-
-        return token;
-      };
-
-      var c = headerString[i];
-      if (isSeparator(c)) {
-        switch (token) {
-          case '/FontMatrix':
-            var matrix = readNumberArray(headerString, i + 1);
-
-            // The FontMatrix is in unitPerEm, so make it pixels
-            for (var j = 0, jj = matrix.length; j < jj; j++)
-              matrix[j] *= 1000;
-
-            // Make the angle into the right direction
-            matrix[2] *= -1;
-
-            properties.fontMatrix = matrix;
-            break;
-          case '/Encoding':
-            var encodingArg = getToken();
-            var encoding;
-            if (!/^\d+$/.test(encodingArg)) {
-              // encoding name is specified
-              encoding = Encodings[encodingArg];
-            } else {
-              encoding = [];
-              var size = parseInt(encodingArg, 10);
-              getToken(); // read in 'array'
-
-              for (var j = 0; j < size; j++) {
-                var token = getToken();
-                if (token == 'dup') {
-                  var index = parseInt(getToken(), 10);
-                  var glyph = getToken();
-                  encoding[index] = glyph;
-                  getToken(); // read the in 'put'
-                }
-              }
-            }
-            if (!properties.hasEncoding && encoding) {
-              properties.baseEncoding = encoding;
-              break;
-            }
-            break;
-        }
-        token = '';
-      } else {
-        token += c;
-      }
-    }
-  };
-};
-
-/**
- * The CFF class takes a Type1 file and wrap it into a
- * 'Compact Font Format' which itself embed Type2 charstrings.
- */
-var CFFStandardStrings = [
-  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
-  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
-  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
-  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
-  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
-  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
-  'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
-  'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
-  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
-  'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
-  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
-  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
-  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
-  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
-  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
-  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
-  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
-  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
-  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
-  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
-  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
-  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
-  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
-  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
-  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
-  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
-  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
-  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
-  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
-  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
-  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
-  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
-  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
-  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
-  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
-  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
-  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
-  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
-  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
-  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
-  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
-  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
-  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
-  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
-  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
-  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
-  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
-  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
-  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
-  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
-  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
-  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
-  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
-  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
-  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
-  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
-  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
-  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
-  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
-  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
-  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
-  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
-  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
-  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
-  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
-];
-
-var type1Parser = new Type1Parser();
-
-// Type1Font is also a CIDFontType0.
-var Type1Font = function Type1Font(name, file, properties) {
-  // Get the data block containing glyphs and subrs informations
-  var headerBlock = file.getBytes(properties.length1);
-  type1Parser.extractFontHeader(headerBlock, properties);
-
-  // Decrypt the data blocks and retrieve it's content
-  var eexecBlock = file.getBytes(properties.length2);
-  var data = type1Parser.extractFontProgram(eexecBlock);
-  for (var info in data.properties)
-    properties[info] = data.properties[info];
-
-  var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
-  var type2Charstrings = this.getType2Charstrings(charstrings);
-  var subrs = this.getType2Subrs(data.subrs);
-
-  this.charstrings = charstrings;
-  this.data = this.wrap(name, type2Charstrings, this.charstrings,
-                        subrs, properties);
-};
-
-Type1Font.prototype = {
-  createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects,
-                                                                isByte) {
-    // First 2 bytes contains the number of objects contained into this index
-    var count = objects.length;
-
-    // If there is no object, just create an array saying that with another
-    // offset byte.
-    if (count == 0)
-      return '\x00\x00\x00';
-
-    var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
-
-    // Next byte contains the offset size use to reference object in the file
-    // Actually we're using 0x04 to be sure to be able to store everything
-    // without thinking of it while coding.
-    data += '\x04';
-
-    // Add another offset after this one because we need a new offset
-    var relativeOffset = 1;
-    for (var i = 0; i < count + 1; i++) {
-      data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
-                                  (relativeOffset >> 16) & 0xFF,
-                                  (relativeOffset >> 8) & 0xFF,
-                                  relativeOffset & 0xFF);
-
-      if (objects[i])
-        relativeOffset += objects[i].length;
-    }
-
-    for (var i = 0; i < count; i++) {
-      for (var j = 0, jj = objects[i].length; j < jj; j++)
-        data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
-                objects[i][j];
-    }
-    return data;
-  },
-
-  encodeNumber: function Type1Font_encodeNumber(value) {
-    // some of the fonts has ouf-of-range values
-    // they are just arithmetic overflows
-    // make sanitizer happy
-    value |= 0;
-    if (value >= -32768 && value <= 32767) {
-      return '\x1c' +
-             String.fromCharCode((value >> 8) & 0xFF) +
-             String.fromCharCode(value & 0xFF);
-    } else {
-      return '\x1d' +
-             String.fromCharCode((value >> 24) & 0xFF) +
-             String.fromCharCode((value >> 16) & 0xFF) +
-             String.fromCharCode((value >> 8) & 0xFF) +
-             String.fromCharCode(value & 0xFF);
-    }
-  },
-
-  getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
-                                                            properties) {
-    var charstrings = [];
-    var i, length, glyphName;
-    var unusedUnicode = kCmapGlyphOffset;
-    for (i = 0, length = glyphs.length; i < length; i++) {
-      var item = glyphs[i];
-      var glyphName = item.glyph;
-      var unicode = glyphName in GlyphsUnicode ?
-        GlyphsUnicode[glyphName] : unusedUnicode++;
-      charstrings.push({
-        glyph: glyphName,
-        unicode: unicode,
-        gid: i,
-        charstring: item.data,
-        width: item.width,
-        lsb: item.lsb
-      });
-    }
-
-    charstrings.sort(function charstrings_sort(a, b) {
-      return a.unicode - b.unicode;
-    });
-    return charstrings;
-  },
-
-  getType2Charstrings: function Type1Font_getType2Charstrings(
-                                  type1Charstrings) {
-    var type2Charstrings = [];
-    var count = type1Charstrings.length;
-    for (var i = 0; i < count; i++) {
-      var charstring = type1Charstrings[i].charstring;
-      type2Charstrings.push(this.flattenCharstring(charstring.slice(),
-                                                   this.commandsMap));
-    }
-    return type2Charstrings;
-  },
-
-  getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
-    var bias = 0;
-    var count = type1Subrs.length;
-    if (count < 1240)
-      bias = 107;
-    else if (count < 33900)
-      bias = 1131;
-    else
-      bias = 32768;
-
-    // Add a bunch of empty subrs to deal with the Type2 bias
-    var type2Subrs = [];
-    for (var i = 0; i < bias; i++)
-      type2Subrs.push([0x0B]);
-
-    for (var i = 0; i < count; i++) {
-      var subr = type1Subrs[i];
-      if (!subr)
-        subr = [0x0B];
-
-      type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
-    }
-
-    return type2Subrs;
-  },
-
-  /*
-   * Flatten the commands by interpreting the postscript code and replacing
-   * every 'callsubr', 'callothersubr' by the real commands.
-   */
-  commandsMap: {
-    'hstem': 1,
-    'vstem': 3,
-    'vmoveto': 4,
-    'rlineto': 5,
-    'hlineto': 6,
-    'vlineto': 7,
-    'rrcurveto': 8,
-    'callsubr': 10,
-    'return': 11,
-    'sub': [12, 11],
-    'div': [12, 12],
-    'exch': [12, 28],
-    'flex': [12, 35],
-    'drop' : [12, 18],
-    'endchar': 14,
-    'rmoveto': 21,
-    'hmoveto': 22,
-    'vhcurveto': 30,
-    'hvcurveto': 31
-  },
-
-  flattenCharstring: function Type1Font_flattenCharstring(charstring, map) {
-    // charstring changes size - can't cache .length in loop
-    for (var i = 0; i < charstring.length; i++) {
-      var command = charstring[i];
-      if (command.charAt) {
-        var cmd = map[command];
-        assert(cmd, 'Unknow command: ' + command);
-
-        if (isArray(cmd))
-          charstring.splice(i++, 1, cmd[0], cmd[1]);
-        else
-          charstring[i] = cmd;
-      } else {
-        // Type1 charstring use a division for number above 32000
-        if (command > 32000) {
-          var divisor = charstring[i + 1];
-          command /= divisor;
-          charstring.splice(i, 3, 28, command >> 8, command & 0xff);
-        } else {
-          charstring.splice(i, 1, 28, command >> 8, command & 0xff);
-        }
-        i += 2;
-      }
-    }
-    return charstring;
-  },
-
-  wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
-    var fields = {
-      // major version, minor version, header size, offset size
-      'header': '\x01\x00\x04\x04',
-
-      'names': this.createCFFIndexHeader([name]),
-
-      'topDict': (function topDict(self) {
-        return function cffWrapTopDict() {
-          var header = '\x00\x01\x01\x01';
-          var dict =
-              '\xf8\x1b\x00' + // version
-              '\xf8\x1c\x01' + // Notice
-              '\xf8\x1d\x02' + // FullName
-              '\xf8\x1e\x03' + // FamilyName
-              '\xf8\x1f\x04' +  // Weight
-              '\x1c\x00\x00\x10'; // Encoding
-
-          var boundingBox = properties.bbox;
-          for (var i = 0, ii = boundingBox.length; i < ii; i++)
-            dict += self.encodeNumber(boundingBox[i]);
-          dict += '\x05'; // FontBBox;
-
-          var offset = fields.header.length +
-                       fields.names.length +
-                       (header.length + 1) +
-                       (dict.length + (4 + 4)) +
-                       fields.strings.length +
-                       fields.globalSubrs.length;
-
-          // If the offset if over 32767, encodeNumber is going to return
-          // 5 bytes to encode the position instead of 3.
-          if ((offset + fields.charstrings.length) > 32767) {
-            offset += 9;
-          } else {
-            offset += 7;
-          }
-
-          dict += self.encodeNumber(offset) + '\x0f'; // Charset
-
-          offset = offset + (glyphs.length * 2) + 1;
-          dict += self.encodeNumber(offset) + '\x11'; // Charstrings
-
-          offset = offset + fields.charstrings.length;
-          dict += self.encodeNumber(fields.privateData.length);
-          dict += self.encodeNumber(offset) + '\x12'; // Private
-
-          return header + String.fromCharCode(dict.length + 1) + dict;
-        };
-      })(this),
-
-      'strings': (function strings(self) {
-        var strings = [
-          'Version 0.11',         // Version
-          'See original notice',  // Notice
-          name,                   // FullName
-          name,                   // FamilyName
-          'Medium'                // Weight
-        ];
-        return self.createCFFIndexHeader(strings);
-      })(this),
-
-      'globalSubrs': this.createCFFIndexHeader([]),
-
-      'charset': (function charset(self) {
-        var charsetString = '\x00'; // Encoding
-
-        var count = glyphs.length;
-        for (var i = 0; i < count; i++) {
-          var index = CFFStandardStrings.indexOf(charstrings[i].glyph);
-          // Some characters like asterikmath && circlecopyrt are
-          // missing from the original strings, for the moment let's
-          // map them to .notdef and see later if it cause any
-          // problems
-          if (index == -1)
-            index = 0;
-
-          charsetString += String.fromCharCode(index >> 8, index & 0xff);
-        }
-        return charsetString;
-      })(this),
-
-      'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
-                                               true),
-
-      'privateData': (function cffWrapPrivate(self) {
-        var data =
-            '\x8b\x14' + // defaultWidth
-            '\x8b\x15';  // nominalWidth
-        var fieldMap = {
-          BlueValues: '\x06',
-          OtherBlues: '\x07',
-          FamilyBlues: '\x08',
-          FamilyOtherBlues: '\x09',
-          StemSnapH: '\x0c\x0c',
-          StemSnapV: '\x0c\x0d',
-          BlueShift: '\x0c\x0a',
-          BlueFuzz: '\x0c\x0b',
-          BlueScale: '\x0c\x09',
-          LanguageGroup: '\x0c\x11',
-          ExpansionFactor: '\x0c\x18'
-        };
-        for (var field in fieldMap) {
-          if (!properties.privateData.hasOwnProperty(field))
-            continue;
-          var value = properties.privateData[field];
-
-          if (isArray(value)) {
-            data += self.encodeNumber(value[0]);
-            for (var i = 1, ii = value.length; i < ii; i++)
-              data += self.encodeNumber(value[i] - value[i - 1]);
-          } else {
-            data += self.encodeNumber(value);
-          }
-          data += fieldMap[field];
-        }
-
-        data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
-
-        return data;
-      })(this),
-
-      'localSubrs': this.createCFFIndexHeader(subrs, true)
-    };
-    fields.topDict = fields.topDict();
-
-
-    var cff = [];
-    for (var index in fields) {
-      var field = fields[index];
-      for (var i = 0, ii = field.length; i < ii; i++)
-        cff.push(field.charCodeAt(i));
-    }
-
-    return cff;
-  }
-};
-
-var CFFFont = (function CFFFontClosure() {
-  function CFFFont(file, properties) {
-    this.properties = properties;
-
-    var parser = new CFFParser(file, properties);
-    var cff = parser.parse();
-    var compiler = new CFFCompiler(cff);
-    this.readExtra(cff);
-    try {
-      this.data = compiler.compile();
-    } catch (e) {
-      warn('Failed to compile font ' + properties.loadedName);
-      // There may have just been an issue with the compiler, set the data
-      // anyway and hope the font loaded.
-      this.data = file;
-    }
-  }
-
-  CFFFont.prototype = {
-    readExtra: function CFFFont_readExtra(cff) {
-      // charstrings contains info about glyphs (one element per glyph
-      // containing mappings for {unicode, width})
-      var charset = cff.charset.charset;
-      var encoding = cff.encoding ? cff.encoding.encoding : null;
-      var charstrings = this.getCharStrings(charset, encoding);
-
-      // create the mapping between charstring and glyph id
-      var glyphIds = [];
-      for (var i = 0, ii = charstrings.length; i < ii; i++)
-        glyphIds.push(charstrings[i].gid);
-
-      this.charstrings = charstrings;
-      this.glyphIds = glyphIds;
-    },
-    getCharStrings: function CFFFont_getCharStrings(charsets, encoding) {
-      var charstrings = [];
-      var unicodeUsed = [];
-      var unassignedUnicodeItems = [];
-      var inverseEncoding = [];
-      // CID fonts don't have an encoding.
-      if (encoding !== null)
-        for (var charcode in encoding)
-          inverseEncoding[encoding[charcode]] = charcode | 0;
-      else
-        inverseEncoding = charsets;
-      for (var i = 0, ii = charsets.length; i < ii; i++) {
-        var glyph = charsets[i];
-        if (glyph == '.notdef')
-          continue;
-
-        var code = inverseEncoding[i];
-        if (!code || isSpecialUnicode(code)) {
-          unassignedUnicodeItems.push(i);
-          continue;
-        }
-        charstrings.push({
-          unicode: code,
-          code: code,
-          gid: i,
-          glyph: glyph
-        });
-        unicodeUsed[code] = true;
-      }
-
-      var nextUnusedUnicode = kCmapGlyphOffset;
-      for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
-        var i = unassignedUnicodeItems[j];
-        // giving unicode value anyway
-        while (nextUnusedUnicode in unicodeUsed)
-          nextUnusedUnicode++;
-        var unicode = nextUnusedUnicode++;
-        charstrings.push({
-          unicode: unicode,
-          code: inverseEncoding[i] || 0,
-          gid: i,
-          glyph: charsets[i]
-        });
-      }
-
-      // sort the array by the unicode value (again)
-      charstrings.sort(function getCharStringsSort(a, b) {
-        return a.unicode - b.unicode;
-      });
-      return charstrings;
-    }
-  };
-
-  return CFFFont;
-})();
-
-var CFFParser = (function CFFParserClosure() {
-  function CFFParser(file, properties) {
-    this.bytes = file.getBytes();
-    this.properties = properties;
-  }
-  CFFParser.prototype = {
-    parse: function CFFParser_parse() {
-      var properties = this.properties;
-      var cff = new CFF();
-      this.cff = cff;
-
-      // The first five sections must be in order, all the others are reached
-      // via offsets contained in one of the below.
-      var header = this.parseHeader();
-      var nameIndex = this.parseIndex(header.endPos);
-      var topDictIndex = this.parseIndex(nameIndex.endPos);
-      var stringIndex = this.parseIndex(topDictIndex.endPos);
-      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
-
-      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
-      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
-
-      cff.header = header.obj;
-      cff.names = this.parseNameIndex(nameIndex.obj);
-      cff.strings = this.parseStringIndex(stringIndex.obj);
-      cff.topDict = topDict;
-      cff.globalSubrIndex = globalSubrIndex.obj;
-
-      this.parsePrivateDict(cff.topDict);
-
-      cff.isCIDFont = topDict.hasName('ROS');
-
-      var charStringOffset = topDict.getByName('CharStrings');
-      cff.charStrings = this.parseCharStrings(charStringOffset);
-
-      var charset, encoding;
-      if (cff.isCIDFont) {
-        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
-        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
-          var dictRaw = fdArrayIndex.get(i);
-          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
-                                         cff.strings);
-          this.parsePrivateDict(fontDict);
-          cff.fdArray.push(fontDict);
-        }
-        // cid fonts don't have an encoding
-        encoding = null;
-        charset = this.parseCharsets(topDict.getByName('charset'),
-                                     cff.charStrings.count, cff.strings, true);
-        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
-                                             cff.charStrings.count);
-      } else {
-        charset = this.parseCharsets(topDict.getByName('charset'),
-                                     cff.charStrings.count, cff.strings, false);
-        encoding = this.parseEncoding(topDict.getByName('Encoding'),
-                                      properties,
-                                      cff.strings, charset.charset);
-      }
-      cff.charset = charset;
-      cff.encoding = encoding;
-
-      return cff;
-    },
-    parseHeader: function CFFParser_parseHeader() {
-      var bytes = this.bytes;
-      var offset = 0;
-
-      while (bytes[offset] != 1)
-        ++offset;
-
-      if (offset != 0) {
-        warn('cff data is shifted');
-        bytes = bytes.subarray(offset);
-        this.bytes = bytes;
-      }
-      var major = bytes[0];
-      var minor = bytes[1];
-      var hdrSize = bytes[2];
-      var offSize = bytes[3];
-      var header = new CFFHeader(major, minor, hdrSize, offSize);
-      return {obj: header, endPos: hdrSize};
-    },
-    parseDict: function CFFParser_parseDict(dict) {
-      var pos = 0;
-
-      function parseOperand() {
-        var value = dict[pos++];
-        if (value === 30) {
-          return parseFloatOperand(pos);
-        } else if (value === 28) {
-          value = dict[pos++];
-          value = (value << 8) | dict[pos++];
-          return value;
-        } else if (value === 29) {
-          value = dict[pos++];
-          value = (value << 8) | dict[pos++];
-          value = (value << 8) | dict[pos++];
-          value = (value << 8) | dict[pos++];
-          return value;
-        } else if (value >= 32 && value <= 246) {
-          return value - 139;
-        } else if (value >= 247 && value <= 250) {
-          return ((value - 247) * 256) + dict[pos++] + 108;
-        } else if (value >= 251 && value <= 254) {
-          return -((value - 251) * 256) - dict[pos++] - 108;
-        } else {
-          error('255 is not a valid DICT command');
-        }
-        return -1;
-      }
-
-      function parseFloatOperand() {
-        var str = '';
-        var eof = 15;
-        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
-            '9', '.', 'E', 'E-', null, '-'];
-        var length = dict.length;
-        while (pos < length) {
-          var b = dict[pos++];
-          var b1 = b >> 4;
-          var b2 = b & 15;
-
-          if (b1 == eof)
-            break;
-          str += lookup[b1];
-
-          if (b2 == eof)
-            break;
-          str += lookup[b2];
-        }
-        return parseFloat(str);
-      }
-
-      var operands = [];
-      var entries = [];
-
-      var pos = 0;
-      var end = dict.length;
-      while (pos < end) {
-        var b = dict[pos];
-        if (b <= 21) {
-          if (b === 12)
-            b = (b << 8) | dict[++pos];
-          entries.push([b, operands]);
-          operands = [];
-          ++pos;
-        } else {
-          operands.push(parseOperand());
-        }
-      }
-      return entries;
-    },
-    parseIndex: function CFFParser_parseIndex(pos) {
-      var cffIndex = new CFFIndex();
-      var bytes = this.bytes;
-      var count = (bytes[pos++] << 8) | bytes[pos++];
-      var offsets = [];
-      var start = pos;
-      var end = pos;
-
-      if (count != 0) {
-        var offsetSize = bytes[pos++];
-        // add 1 for offset to determine size of last object
-        var startPos = pos + ((count + 1) * offsetSize) - 1;
-
-        for (var i = 0, ii = count + 1; i < ii; ++i) {
-          var offset = 0;
-          for (var j = 0; j < offsetSize; ++j) {
-            offset <<= 8;
-            offset += bytes[pos++];
-          }
-          offsets.push(startPos + offset);
-        }
-        end = offsets[count];
-      }
-      for (var i = 0, ii = offsets.length - 1; i < ii; ++i) {
-        var offsetStart = offsets[i];
-        var offsetEnd = offsets[i + 1];
-        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
-      }
-      return {obj: cffIndex, endPos: end};
-    },
-    parseNameIndex: function CFFParser_parseNameIndex(index) {
-      var names = [];
-      for (var i = 0, ii = index.count; i < ii; ++i) {
-        var name = index.get(i);
-        // OTS doesn't allow names to be over 127 characters.
-        var length = Math.min(name.length, 127);
-        var data = [];
-        // OTS also only permits certain characters in the name.
-        for (var j = 0; j < length; ++j) {
-          var c = name[j];
-          if (j === 0 && c === 0) {
-            data[j] = c;
-            continue;
-          }
-          if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
-              c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
-              c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
-              c === 47 /* / */ || c === 37 /* % */) {
-            data[j] = 95;
-            continue;
-          }
-          data[j] = c;
-        }
-        names.push(String.fromCharCode.apply(null, data));
-      }
-      return names;
-    },
-    parseStringIndex: function CFFParser_parseStringIndex(index) {
-      var strings = new CFFStrings();
-      for (var i = 0, ii = index.count; i < ii; ++i) {
-        var data = index.get(i);
-        strings.add(String.fromCharCode.apply(null, data));
-      }
-      return strings;
-    },
-    createDict: function CFFParser_createDict(type, dict, strings) {
-      var cffDict = new type(strings);
-      var types = cffDict.types;
-
-      for (var i = 0, ii = dict.length; i < ii; ++i) {
-        var pair = dict[i];
-        var key = pair[0];
-        var value = pair[1];
-        cffDict.setByKey(key, value);
-      }
-      return cffDict;
-    },
-    parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
-      var charStrings = this.parseIndex(charStringOffset).obj;
-      // The CFF specification state that the 'dotsection' command
-      // (12, 0) is deprecated and treated as a no-op, but all Type2
-      // charstrings processors should support them. Unfortunately
-      // the font sanitizer don't. As a workaround the sequence (12, 0)
-      // is replaced by a useless (0, hmoveto).
-      var count = charStrings.count;
-      for (var i = 0; i < count; i++) {
-        var charstring = charStrings.get(i);
-
-        var data = charstring;
-        var length = data.length;
-        for (var j = 0; j <= length; j) {
-          var value = data[j++];
-          if (value == 12 && data[j++] == 0) {
-              data[j - 2] = 139;
-              data[j - 1] = 22;
-          } else if (value === 28) {
-            j += 2;
-          } else if (value >= 247 && value <= 254) {
-            j++;
-          } else if (value == 255) {
-            j += 4;
-          }
-        }
-      }
-      return charStrings;
-    },
-    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
-      // no private dict, do nothing
-      if (!parentDict.hasName('Private'))
-        return;
-      var privateOffset = parentDict.getByName('Private');
-      // make sure the params are formatted correctly
-      if (!isArray(privateOffset) || privateOffset.length !== 2) {
-        parentDict.removeByName('Private');
-        return;
-      }
-      var size = privateOffset[0];
-      var offset = privateOffset[1];
-      // remove empty dicts or ones that refer to invalid location
-      if (size === 0 || offset >= this.bytes.length) {
-        parentDict.removeByName('Private');
-        return;
-      }
-
-      var privateDictEnd = offset + size;
-      var dictData = this.bytes.subarray(offset, privateDictEnd);
-      var dict = this.parseDict(dictData);
-      var privateDict = this.createDict(CFFPrivateDict, dict,
-                                        parentDict.strings);
-      parentDict.privateDict = privateDict;
-
-      // Parse the Subrs index also since it's relative to the private dict.
-      if (!privateDict.getByName('Subrs'))
-        return;
-      var subrsOffset = privateDict.getByName('Subrs');
-      var relativeOffset = offset + subrsOffset;
-      // Validate the offset.
-      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
-        privateDict.removeByName('Subrs');
-        return;
-      }
-      var subrsIndex = this.parseIndex(relativeOffset);
-      privateDict.subrsIndex = subrsIndex.obj;
-    },
-    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
-      if (pos == 0) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
-                              ISOAdobeCharset);
-      } else if (pos == 1) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
-                              ExpertCharset);
-      } else if (pos == 2) {
-        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
-                              ExpertSubsetCharset);
-      }
-
-      var bytes = this.bytes;
-      var start = pos;
-      var format = bytes[pos++];
-      var charset = ['.notdef'];
-
-      // subtract 1 for the .notdef glyph
-      length -= 1;
-
-      switch (format) {
-        case 0:
-          for (var i = 0; i < length; i++) {
-            var id = (bytes[pos++] << 8) | bytes[pos++];
-            charset.push(cid ? id : strings.get(id));
-          }
-          break;
-        case 1:
-          while (charset.length <= length) {
-            var id = (bytes[pos++] << 8) | bytes[pos++];
-            var count = bytes[pos++];
-            for (var i = 0; i <= count; i++)
-              charset.push(cid ? id++ : strings.get(id++));
-          }
-          break;
-        case 2:
-          while (charset.length <= length) {
-            var id = (bytes[pos++] << 8) | bytes[pos++];
-            var count = (bytes[pos++] << 8) | bytes[pos++];
-            for (var i = 0; i <= count; i++)
-              charset.push(cid ? id++ : strings.get(id++));
-          }
-          break;
-        default:
-          error('Unknown charset format');
-      }
-      // Raw won't be needed if we actually compile the charset.
-      var end = pos;
-      var raw = bytes.subarray(start, end);
-
-      return new CFFCharset(false, format, charset, raw);
-    },
-    parseEncoding: function CFFParser_parseEncoding(pos,
-                                                    properties,
-                                                    strings,
-                                                    charset) {
-      var encoding = {};
-      var bytes = this.bytes;
-      var predefined = false;
-      var hasSupplement = false;
-      var format;
-      var raw = null;
-
-      function readSupplement() {
-        var supplementsCount = bytes[pos++];
-        for (var i = 0; i < supplementsCount; i++) {
-          var code = bytes[pos++];
-          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
-          encoding[code] = properties.differences.indexOf(strings.get(sid));
-        }
-      }
-
-      if (pos == 0 || pos == 1) {
-        predefined = true;
-        format = pos;
-        var gid = 1;
-        var baseEncoding = pos ? Encodings.ExpertEncoding :
-                                 Encodings.StandardEncoding;
-        for (var i = 0, ii = charset.length; i < ii; i++) {
-          var index = baseEncoding.indexOf(charset[i]);
-          if (index != -1)
-            encoding[index] = gid++;
-        }
-      } else {
-        var dataStart = pos;
-        var format = bytes[pos++];
-        switch (format & 0x7f) {
-          case 0:
-            var glyphsCount = bytes[pos++];
-            for (var i = 1; i <= glyphsCount; i++)
-              encoding[bytes[pos++]] = i;
-            break;
-
-          case 1:
-            var rangesCount = bytes[pos++];
-            var gid = 1;
-            for (var i = 0; i < rangesCount; i++) {
-              var start = bytes[pos++];
-              var left = bytes[pos++];
-              for (var j = start; j <= start + left; j++)
-                encoding[j] = gid++;
-            }
-            break;
-
-          default:
-            error('Unknow encoding format: ' + format + ' in CFF');
-            break;
-        }
-        var dataEnd = pos;
-        if (format & 0x80) {
-          // The font sanitizer does not support CFF encoding with a
-          // supplement, since the encoding is not really used to map
-          // between gid to glyph, let's overwrite what is declared in
-          // the top dictionary to let the sanitizer think the font use
-          // StandardEncoding, that's a lie but that's ok.
-          bytes[dataStart] &= 0x7f;
-          readSupplement();
-          hasSupplement = true;
-        }
-        raw = bytes.subarray(dataStart, dataEnd);
-      }
-      format = format & 0x7f;
-      return new CFFEncoding(predefined, format, encoding, raw);
-    },
-    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
-      var start = pos;
-      var bytes = this.bytes;
-      var format = bytes[pos++];
-      var fdSelect = [];
-      switch (format) {
-        case 0:
-          for (var i = 0; i < length; ++i) {
-            var id = bytes[pos++];
-            fdSelect.push(id);
-          }
-          break;
-        case 3:
-          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
-          for (var i = 0; i < rangesCount; ++i) {
-            var first = (bytes[pos++] << 8) | bytes[pos++];
-            var fdIndex = bytes[pos++];
-            var next = (bytes[pos] << 8) | bytes[pos + 1];
-            for (var j = first; j < next; ++j)
-              fdSelect.push(fdIndex);
-          }
-          // Advance past the sentinel(next).
-          pos += 2;
-          break;
-        default:
-          error('Unknown fdselect format ' + format);
-          break;
-      }
-      var end = pos;
-      return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
-    }
-  };
-  return CFFParser;
-})();
-
-// Compact Font Format
-var CFF = (function CFFClosure() {
-  function CFF() {
-    this.header = null;
-    this.names = [];
-    this.topDict = null;
-    this.strings = new CFFStrings();
-    this.globalSubrIndex = null;
-
-    // The following could really be per font, but since we only have one font
-    // store them here.
-    this.encoding = null;
-    this.charset = null;
-    this.charStrings = null;
-    this.fdArray = [];
-    this.fdSelect = null;
-
-    this.isCIDFont = false;
-  }
-  return CFF;
-})();
-
-var CFFHeader = (function CFFHeaderClosure() {
-  function CFFHeader(major, minor, hdrSize, offSize) {
-    this.major = major;
-    this.minor = minor;
-    this.hdrSize = hdrSize;
-    this.offSize = offSize;
-  }
-  return CFFHeader;
-})();
-
-var CFFStrings = (function CFFStringsClosure() {
-  function CFFStrings() {
-    this.strings = [];
-  }
-  CFFStrings.prototype = {
-    get: function CFFStrings_get(index) {
-      if (index >= 0 && index <= 390)
-        return CFFStandardStrings[index];
-      if (index - 391 <= this.strings.length)
-        return this.strings[index - 391];
-      return CFFStandardStrings[0];
-    },
-    add: function CFFStrings_add(value) {
-      this.strings.push(value);
-    },
-    get count() {
-      return this.strings.length;
-    }
-  };
-  return CFFStrings;
-})();
-
-var CFFIndex = (function CFFIndexClosure() {
-  function CFFIndex() {
-    this.objects = [];
-    this.length = 0;
-  }
-  CFFIndex.prototype = {
-    add: function CFFIndex_add(data) {
-      this.length += data.length;
-      this.objects.push(data);
-    },
-    get: function CFFIndex_get(index) {
-      return this.objects[index];
-    },
-    get count() {
-      return this.objects.length;
-    }
-  };
-  return CFFIndex;
-})();
-
-var CFFDict = (function CFFDictClosure() {
-  function CFFDict(tables, strings) {
-    this.keyToNameMap = tables.keyToNameMap;
-    this.nameToKeyMap = tables.nameToKeyMap;
-    this.defaults = tables.defaults;
-    this.types = tables.types;
-    this.opcodes = tables.opcodes;
-    this.order = tables.order;
-    this.strings = strings;
-    this.values = {};
-  }
-  CFFDict.prototype = {
-    // value should always be an array
-    setByKey: function CFFDict_setByKey(key, value) {
-      if (!(key in this.keyToNameMap))
-        return false;
-      // ignore empty values
-      if (value.length === 0)
-        return true;
-      var type = this.types[key];
-      // remove the array wrapping these types of values
-      if (type === 'num' || type === 'sid' || type === 'offset')
-        value = value[0];
-      this.values[key] = value;
-      return true;
-    },
-    hasName: function CFFDict_hasName(name) {
-      return this.nameToKeyMap[name] in this.values;
-    },
-    getByName: function CFFDict_getByName(name) {
-      if (!(name in this.nameToKeyMap))
-        error('Invalid dictionary name "' + name + '"');
-      var key = this.nameToKeyMap[name];
-      if (!(key in this.values))
-        return this.defaults[key];
-      return this.values[key];
-    },
-    removeByName: function CFFDict_removeByName(name) {
-      delete this.values[this.nameToKeyMap[name]];
-    }
-  };
-  CFFDict.createTables = function CFFDict_createTables(layout) {
-    var tables = {
-      keyToNameMap: {},
-      nameToKeyMap: {},
-      defaults: {},
-      types: {},
-      opcodes: {},
-      order: []
-    };
-    for (var i = 0, ii = layout.length; i < ii; ++i) {
-      var entry = layout[i];
-      var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
-      tables.keyToNameMap[key] = entry[1];
-      tables.nameToKeyMap[entry[1]] = key;
-      tables.types[key] = entry[2];
-      tables.defaults[key] = entry[3];
-      tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
-      tables.order.push(key);
-    }
-    return tables;
-  };
-  return CFFDict;
-})();
-
-var CFFTopDict = (function CFFTopDictClosure() {
-  var layout = [
-    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
-    [[12, 20], 'SyntheticBase', 'num', null],
-    [0, 'version', 'sid', null],
-    [1, 'Notice', 'sid', null],
-    [[12, 0], 'Copyright', 'sid', null],
-    [2, 'FullName', 'sid', null],
-    [3, 'FamilyName', 'sid', null],
-    [4, 'Weight', 'sid', null],
-    [[12, 1], 'isFixedPitch', 'num', 0],
-    [[12, 2], 'ItalicAngle', 'num', 0],
-    [[12, 3], 'UnderlinePosition', 'num', -100],
-    [[12, 4], 'UnderlineThickness', 'num', 50],
-    [[12, 5], 'PaintType', 'num', 0],
-    [[12, 6], 'CharstringType', 'num', 2],
-    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
-                            [.001, 0, 0, .001, 0, 0]],
-    [13, 'UniqueID', 'num', null],
-    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
-    [[12, 8], 'StrokeWidth', 'num', 0],
-    [14, 'XUID', 'array', null],
-    [15, 'charset', 'offset', 0],
-    [16, 'Encoding', 'offset', 0],
-    [17, 'CharStrings', 'offset', 0],
-    [18, 'Private', ['offset', 'offset'], null],
-    [[12, 21], 'PostScript', 'sid', null],
-    [[12, 22], 'BaseFontName', 'sid', null],
-    [[12, 23], 'BaseFontBlend', 'delta', null],
-    [[12, 31], 'CIDFontVersion', 'num', 0],
-    [[12, 32], 'CIDFontRevision', 'num', 0],
-    [[12, 33], 'CIDFontType', 'num', 0],
-    [[12, 34], 'CIDCount', 'num', 8720],
-    [[12, 35], 'UIDBase', 'num', null],
-    [[12, 36], 'FDArray', 'offset', null],
-    [[12, 37], 'FDSelect', 'offset', null],
-    [[12, 38], 'FontName', 'sid', null]];
-  var tables = null;
-  function CFFTopDict(strings) {
-    if (tables === null)
-      tables = CFFDict.createTables(layout);
-    CFFDict.call(this, tables, strings);
-    this.privateDict = null;
-  }
-  CFFTopDict.prototype = Object.create(CFFDict.prototype);
-  return CFFTopDict;
-})();
-
-var CFFPrivateDict = (function CFFPrivateDictClosure() {
-  var layout = [
-    [6, 'BlueValues', 'delta', null],
-    [7, 'OtherBlues', 'delta', null],
-    [8, 'FamilyBlues', 'delta', null],
-    [9, 'FamilyOtherBlues', 'delta', null],
-    [[12, 9], 'BlueScale', 'num', 0.039625],
-    [[12, 10], 'BlueShift', 'num', 7],
-    [[12, 11], 'BlueFuzz', 'num', 1],
-    [10, 'StdHW', 'num', null],
-    [11, 'StdVW', 'num', null],
-    [[12, 12], 'StemSnapH', 'delta', null],
-    [[12, 13], 'StemSnapV', 'delta', null],
-    [[12, 14], 'ForceBold', 'num', 0],
-    [[12, 17], 'LanguageGroup', 'num', 0],
-    [[12, 18], 'ExpansionFactor', 'num', 0.06],
-    [[12, 19], 'initialRandomSeed', 'num', 0],
-    [19, 'Subrs', 'offset', null],
-    [20, 'defaultWidthX', 'num', 0],
-    [21, 'nominalWidthX', 'num', 0]
-  ];
-  var tables = null;
-  function CFFPrivateDict(strings) {
-    if (tables === null)
-      tables = CFFDict.createTables(layout);
-    CFFDict.call(this, tables, strings);
-    this.subrsIndex = null;
-  }
-  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
-  return CFFPrivateDict;
-})();
-
-var CFFCharsetPredefinedTypes = {
-  ISO_ADOBE: 0,
-  EXPERT: 1,
-  EXPERT_SUBSET: 2
-};
-var CFFCharsetEmbeddedTypes = {
-  FORMAT0: 0,
-  FORMAT1: 1,
-  FORMAT2: 2
-};
-var CFFCharset = (function CFFCharsetClosure() {
-  function CFFCharset(predefined, format, charset, raw) {
-    this.predefined = predefined;
-    this.format = format;
-    this.charset = charset;
-    this.raw = raw;
-  }
-  return CFFCharset;
-})();
-
-var CFFEncodingPredefinedTypes = {
-  STANDARD: 0,
-  EXPERT: 1
-};
-var CFFCharsetEmbeddedTypes = {
-  FORMAT0: 0,
-  FORMAT1: 1
-};
-var CFFEncoding = (function CFFEncodingClosure() {
-  function CFFEncoding(predefined, format, encoding, raw) {
-    this.predefined = predefined;
-    this.format = format;
-    this.encoding = encoding;
-    this.raw = raw;
-  }
-  return CFFEncoding;
-})();
-
-var CFFFDSelect = (function CFFFDSelectClosure() {
-  function CFFFDSelect(fdSelect, raw) {
-    this.fdSelect = fdSelect;
-    this.raw = raw;
-  }
-  return CFFFDSelect;
-})();
-
-// Helper class to keep track of where an offset is within the data and helps
-// filling in that offset once it's known.
-var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
-  function CFFOffsetTracker() {
-    this.offsets = {};
-  }
-  CFFOffsetTracker.prototype = {
-    isTracking: function CFFOffsetTracker_isTracking(key) {
-      return key in this.offsets;
-    },
-    track: function CFFOffsetTracker_track(key, location) {
-      if (key in this.offsets)
-        error('Already tracking location of ' + key);
-      this.offsets[key] = location;
-    },
-    offset: function CFFOffsetTracker_offset(value) {
-      for (var key in this.offsets) {
-        this.offsets[key] += value;
-      }
-    },
-    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
-                                                                 values,
-                                                                 output) {
-      if (!(key in this.offsets))
-        error('Not tracking location of ' + key);
-      var data = output.data;
-      var dataOffset = this.offsets[key];
-      var size = 5;
-      for (var i = 0, ii = values.length; i < ii; ++i) {
-        var offset0 = i * size + dataOffset;
-        var offset1 = offset0 + 1;
-        var offset2 = offset0 + 2;
-        var offset3 = offset0 + 3;
-        var offset4 = offset0 + 4;
-        // It's easy to screw up offsets so perform this sanity check.
-        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
-            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0)
-          error('writing to an offset that is not empty');
-        var value = values[i];
-        data[offset0] = 0x1d;
-        data[offset1] = (value >> 24) & 0xFF;
-        data[offset2] = (value >> 16) & 0xFF;
-        data[offset3] = (value >> 8) & 0xFF;
-        data[offset4] = value & 0xFF;
-      }
-    }
-  };
-  return CFFOffsetTracker;
-})();
-
-// Takes a CFF and converts it to the binary representation.
-var CFFCompiler = (function CFFCompilerClosure() {
-  function stringToArray(str) {
-    var array = [];
-    for (var i = 0, ii = str.length; i < ii; ++i)
-      array[i] = str.charCodeAt(i);
-
-    return array;
-  };
-  function CFFCompiler(cff) {
-    this.cff = cff;
-  }
-  CFFCompiler.prototype = {
-    compile: function CFFCompiler_compile() {
-      var cff = this.cff;
-      var output = {
-        data: [],
-        length: 0,
-        add: function CFFCompiler_add(data) {
-          this.data = this.data.concat(data);
-          this.length = this.data.length;
-        }
-      };
-
-      // Compile the five entries that must be in order.
-      var header = this.compileHeader(cff.header);
-      output.add(header);
-
-      var nameIndex = this.compileNameIndex(cff.names);
-      output.add(nameIndex);
-
-      var compiled = this.compileTopDicts([cff.topDict], output.length);
-      output.add(compiled.output);
-      var topDictTracker = compiled.trackers[0];
-
-      var stringIndex = this.compileStringIndex(cff.strings.strings);
-      output.add(stringIndex);
-
-      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
-      output.add(globalSubrIndex);
-
-      // Now start on the other entries that have no specfic order.
-      if (cff.encoding && cff.topDict.hasName('Encoding')) {
-        if (cff.encoding.predefined) {
-          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
-                                          output);
-        } else {
-          var encoding = this.compileEncoding(cff.encoding);
-          topDictTracker.setEntryLocation('Encoding', [output.length], output);
-          output.add(encoding);
-        }
-      }
-
-      if (cff.charset && cff.topDict.hasName('charset')) {
-        if (cff.charset.predefined) {
-          topDictTracker.setEntryLocation('charset', [cff.charset.format],
-                                          output);
-        } else {
-          var charset = this.compileCharset(cff.charset);
-          topDictTracker.setEntryLocation('charset', [output.length], output);
-          output.add(charset);
-        }
-      }
-
-      var charStrings = this.compileCharStrings(cff.charStrings);
-      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
-      output.add(charStrings);
-
-      if (cff.isCIDFont) {
-        // For some reason FDSelect must be in front of FDArray on windows. OSX
-        // and linux don't seem to care.
-        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
-        var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
-        output.add(fdSelect);
-
-        var compiled = this.compileTopDicts(cff.fdArray, output.length);
-        topDictTracker.setEntryLocation('FDArray', [output.length], output);
-        output.add(compiled.output);
-        var fontDictTrackers = compiled.trackers;
-
-        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
-      }
-
-      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
-
-      return output.data;
-    },
-    encodeNumber: function CFFCompiler_encodeNumber(value) {
-      if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
-        return this.encodeInteger(value);
-      else
-        return this.encodeFloat(value);
-    },
-    encodeFloat: function CFFCompiler_encodeFloat(value) {
-      value = value.toString();
-      // Strip off the any leading zeros.
-      if (value.substr(0, 2) === '0.')
-        value = value.substr(1);
-      else if (value.substr(0, 3) === '-0.')
-        value = '-' + value.substr(2);
-      var nibbles = [];
-      for (var i = 0, ii = value.length; i < ii; ++i) {
-        var a = value.charAt(i), b = value.charAt(i + 1);
-        var nibble;
-        if (a === 'e' && b === '-') {
-          nibble = 0xc;
-          ++i;
-        } else if (a === '.') {
-          nibble = 0xa;
-        } else if (a === 'E') {
-          nibble = 0xb;
-        } else if (a === '-') {
-          nibble = 0xe;
-        } else {
-          nibble = a;
-        }
-        nibbles.push(nibble);
-      }
-      nibbles.push(0xf);
-      if (nibbles.length % 2)
-        nibbles.push(0xf);
-      var out = [30];
-      for (var i = 0, ii = nibbles.length; i < ii; i += 2)
-        out.push(nibbles[i] << 4 | nibbles[i + 1]);
-      return out;
-    },
-    encodeInteger: function CFFCompiler_encodeInteger(value) {
-      var code;
-      if (value >= -107 && value <= 107) {
-        code = [value + 139];
-      } else if (value >= 108 && value <= 1131) {
-        value = [value - 108];
-        code = [(value >> 8) + 247, value & 0xFF];
-      } else if (value >= -1131 && value <= -108) {
-        value = -value - 108;
-        code = [(value >> 8) + 251, value & 0xFF];
-      } else if (value >= -32768 && value <= 32767) {
-        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
-      } else {
-        code = [0x1d,
-                (value >> 24) & 0xFF,
-                (value >> 16) & 0xFF,
-                (value >> 8) & 0xFF,
-                 value & 0xFF];
-      }
-      return code;
-    },
-    compileHeader: function CFFCompiler_compileHeader(header) {
-      return [
-        header.major,
-        header.minor,
-        header.hdrSize,
-        header.offSize
-      ];
-    },
-    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
-      var nameIndex = new CFFIndex();
-      for (var i = 0, ii = names.length; i < ii; ++i)
-        nameIndex.add(stringToArray(names[i]));
-      return this.compileIndex(nameIndex);
-    },
-    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) {
-      var fontDictTrackers = [];
-      var fdArrayIndex = new CFFIndex();
-      for (var i = 0, ii = dicts.length; i < ii; ++i) {
-        var fontDict = dicts[i];
-        var fontDictTracker = new CFFOffsetTracker();
-        var fontDictData = this.compileDict(fontDict, fontDictTracker);
-        fontDictTrackers.push(fontDictTracker);
-        fdArrayIndex.add(fontDictData);
-        fontDictTracker.offset(length);
-      }
-      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
-      return {
-        trackers: fontDictTrackers,
-        output: fdArrayIndex
-      };
-    },
-    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
-                                                                  trackers,
-                                                                  output) {
-      for (var i = 0, ii = dicts.length; i < ii; ++i) {
-        var fontDict = dicts[i];
-        if (!fontDict.privateDict || !fontDict.hasName('Private'))
-          continue;
-        var privateDict = fontDict.privateDict;
-        var privateDictTracker = new CFFOffsetTracker();
-        var privateDictData = this.compileDict(privateDict, privateDictTracker);
-
-        privateDictTracker.offset(output.length);
-        trackers[i].setEntryLocation('Private',
-                                     [privateDictData.length, output.length],
-                                     output);
-        output.add(privateDictData);
-
-        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
-          var subrs = this.compileIndex(privateDict.subrsIndex);
-          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
-                                              output);
-          output.add(subrs);
-        }
-      }
-    },
-    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
-      var out = [];
-      // The dictionary keys must be in a certain order.
-      var order = dict.order;
-      for (var i = 0; i < order.length; ++i) {
-        var key = order[i];
-        if (!(key in dict.values))
-          continue;
-        var values = dict.values[key];
-        var types = dict.types[key];
-        if (!isArray(types)) types = [types];
-        if (!isArray(values)) values = [values];
-
-        // Remove any empty dict values.
-        if (values.length === 0)
-          continue;
-
-        for (var j = 0, jj = types.length; j < jj; ++j) {
-          var type = types[j];
-          var value = values[j];
-          switch (type) {
-            case 'num':
-            case 'sid':
-              out = out.concat(this.encodeNumber(value));
-              break;
-            case 'offset':
-              // For offsets we just insert a 32bit integer so we don't have to
-              // deal with figuring out the length of the offset when it gets
-              // replaced later on by the compiler.
-              var name = dict.keyToNameMap[key];
-              // Some offsets have the offset and the length, so just record the
-              // position of the first one.
-              if (!offsetTracker.isTracking(name))
-                offsetTracker.track(name, out.length);
-              out = out.concat([0x1d, 0, 0, 0, 0]);
-              break;
-            case 'array':
-            case 'delta':
-              out = out.concat(this.encodeNumber(value));
-              for (var k = 1, kk = values.length; k < kk; ++k)
-                out = out.concat(this.encodeNumber(values[k]));
-              break;
-            default:
-              error('Unknown data type of ' + type);
-              break;
-          }
-        }
-        out = out.concat(dict.opcodes[key]);
-      }
-      return out;
-    },
-    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
-      var stringIndex = new CFFIndex();
-      for (var i = 0, ii = strings.length; i < ii; ++i)
-        stringIndex.add(stringToArray(strings[i]));
-      return this.compileIndex(stringIndex);
-    },
-    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
-      var globalSubrIndex = this.cff.globalSubrIndex;
-      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
-    },
-    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
-      return this.compileIndex(charStrings);
-    },
-    compileCharset: function CFFCompiler_compileCharset(charset) {
-      return this.compileTypedArray(charset.raw);
-    },
-    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
-      return this.compileTypedArray(encoding.raw);
-    },
-    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
-      return this.compileTypedArray(fdSelect);
-    },
-    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
-      var out = [];
-      for (var i = 0, ii = data.length; i < ii; ++i)
-        out[i] = data[i];
-      return out;
-    },
-    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
-      trackers = trackers || [];
-      var objects = index.objects;
-      // First 2 bytes contains the number of objects contained into this index
-      var count = objects.length;
-
-      // If there is no object, just create an index. This technically
-      // should just be [0, 0] but OTS has an issue with that.
-      if (count == 0)
-        return [0, 0, 0];
-
-      var data = [(count >> 8) & 0xFF, count & 0xff];
-
-      var lastOffset = 1;
-      for (var i = 0; i < count; ++i)
-        lastOffset += objects[i].length;
-
-      var offsetSize;
-      if (lastOffset < 0x100)
-        offsetSize = 1;
-      else if (lastOffset < 0x10000)
-        offsetSize = 2;
-      else if (lastOffset < 0x1000000)
-        offsetSize = 3;
-      else
-        offsetSize = 4;
-
-      // Next byte contains the offset size use to reference object in the file
-      data.push(offsetSize);
-
-      // Add another offset after this one because we need a new offset
-      var relativeOffset = 1;
-      for (var i = 0; i < count + 1; i++) {
-        if (offsetSize === 1) {
-          data.push(relativeOffset & 0xFF);
-        } else if (offsetSize === 2) {
-          data.push((relativeOffset >> 8) & 0xFF,
-                     relativeOffset & 0xFF);
-        } else if (offsetSize === 3) {
-          data.push((relativeOffset >> 16) & 0xFF,
-                    (relativeOffset >> 8) & 0xFF,
-                     relativeOffset & 0xFF);
-        } else {
-          data.push((relativeOffset >>> 24) & 0xFF,
-                    (relativeOffset >> 16) & 0xFF,
-                    (relativeOffset >> 8) & 0xFF,
-                     relativeOffset & 0xFF);
-        }
-
-        if (objects[i])
-          relativeOffset += objects[i].length;
-      }
-      var offset = data.length;
-
-      for (var i = 0; i < count; i++) {
-        // Notify the tracker where the object will be offset in the data.
-        if (trackers[i])
-          trackers[i].offset(data.length);
-        for (var j = 0, jj = objects[i].length; j < jj; j++)
-          data.push(objects[i][j]);
-      }
-      return data;
-    }
-  };
-  return CFFCompiler;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/function.js b/apps/files_pdfviewer/js/pdfjs/src/function.js
deleted file mode 100644
index 2e7ad45e6ea3842a7c4563eb9176542a93f16b71..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/function.js
+++ /dev/null
@@ -1,874 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var PDFFunction = (function PDFFunctionClosure() {
-  var CONSTRUCT_SAMPLED = 0;
-  var CONSTRUCT_INTERPOLATED = 2;
-  var CONSTRUCT_STICHED = 3;
-  var CONSTRUCT_POSTSCRIPT = 4;
-
-  return {
-    getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
-                                                       str) {
-      var length = 1;
-      for (var i = 0, ii = size.length; i < ii; i++)
-        length *= size[i];
-      length *= outputSize;
-
-      var array = [];
-      var codeSize = 0;
-      var codeBuf = 0;
-      // 32 is a valid bps so shifting won't work
-      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
-
-      var strBytes = str.getBytes((length * bps + 7) / 8);
-      var strIdx = 0;
-      for (var i = 0; i < length; i++) {
-        while (codeSize < bps) {
-          codeBuf <<= 8;
-          codeBuf |= strBytes[strIdx++];
-          codeSize += 8;
-        }
-        codeSize -= bps;
-        array.push((codeBuf >> codeSize) * sampleMul);
-        codeBuf &= (1 << codeSize) - 1;
-      }
-      return array;
-    },
-
-    getIR: function PDFFunction_getIR(xref, fn) {
-      var dict = fn.dict;
-      if (!dict)
-        dict = fn;
-
-      var types = [this.constructSampled,
-                   null,
-                   this.constructInterpolated,
-                   this.constructStiched,
-                   this.constructPostScript];
-
-      var typeNum = dict.get('FunctionType');
-      var typeFn = types[typeNum];
-      if (!typeFn)
-        error('Unknown type of function');
-
-      return typeFn.call(this, fn, dict, xref);
-    },
-
-    fromIR: function PDFFunction_fromIR(IR) {
-      var type = IR[0];
-      switch (type) {
-        case CONSTRUCT_SAMPLED:
-          return this.constructSampledFromIR(IR);
-        case CONSTRUCT_INTERPOLATED:
-          return this.constructInterpolatedFromIR(IR);
-        case CONSTRUCT_STICHED:
-          return this.constructStichedFromIR(IR);
-        case CONSTRUCT_POSTSCRIPT:
-        default:
-          return this.constructPostScriptFromIR(IR);
-      }
-    },
-
-    parse: function PDFFunction_parse(xref, fn) {
-      var IR = this.getIR(xref, fn);
-      return this.fromIR(IR);
-    },
-
-    constructSampled: function PDFFunction_constructSampled(str, dict) {
-      function toMultiArray(arr) {
-        var inputLength = arr.length;
-        var outputLength = arr.length / 2;
-        var out = [];
-        var index = 0;
-        for (var i = 0; i < inputLength; i += 2) {
-          out[index] = [arr[i], arr[i + 1]];
-          ++index;
-        }
-        return out;
-      }
-      var domain = dict.get('Domain');
-      var range = dict.get('Range');
-
-      if (!domain || !range)
-        error('No domain or range');
-
-      var inputSize = domain.length / 2;
-      var outputSize = range.length / 2;
-
-      domain = toMultiArray(domain);
-      range = toMultiArray(range);
-
-      var size = dict.get('Size');
-      var bps = dict.get('BitsPerSample');
-      var order = dict.get('Order');
-      if (!order)
-        order = 1;
-      if (order !== 1)
-        error('No support for cubic spline interpolation: ' + order);
-
-      var encode = dict.get('Encode');
-      if (!encode) {
-        encode = [];
-        for (var i = 0; i < inputSize; ++i) {
-          encode.push(0);
-          encode.push(size[i] - 1);
-        }
-      }
-      encode = toMultiArray(encode);
-
-      var decode = dict.get('Decode');
-      if (!decode)
-        decode = range;
-      else
-        decode = toMultiArray(decode);
-
-      var samples = this.getSampleArray(size, outputSize, bps, str);
-
-      return [
-        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
-        outputSize, Math.pow(2, bps) - 1, range
-      ];
-    },
-
-    constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
-      // See chapter 3, page 109 of the PDF reference
-      function interpolate(x, xmin, xmax, ymin, ymax) {
-        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
-      }
-
-      return function constructSampledFromIRResult(args) {
-        // See chapter 3, page 110 of the PDF reference.
-        var m = IR[1];
-        var domain = IR[2];
-        var encode = IR[3];
-        var decode = IR[4];
-        var samples = IR[5];
-        var size = IR[6];
-        var n = IR[7];
-        var mask = IR[8];
-        var range = IR[9];
-
-        if (m != args.length)
-          error('Incorrect number of arguments: ' + inputSize + ' != ' +
-                args.length);
-
-        var x = args;
-
-        // Building the cube vertices: its part and sample index
-        // http://rjwagner49.com/Mathematics/Interpolation.pdf
-        var cubeVertices = 1 << m;
-        var cubeN = new Float64Array(cubeVertices);
-        var cubeVertex = new Uint32Array(cubeVertices);
-        for (var j = 0; j < cubeVertices; j++)
-          cubeN[j] = 1;
-
-        var k = n, pos = 1;
-        // Map x_i to y_j for 0 <= i < m using the sampled function.
-        for (var i = 0; i < m; ++i) {
-          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
-          var domain_2i = domain[i][0];
-          var domain_2i_1 = domain[i][1];
-          var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
-
-          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
-          //                   Encode_2i, Encode_2i+1)
-          var e = interpolate(xi, domain_2i, domain_2i_1,
-                              encode[i][0], encode[i][1]);
-
-          // e_i' = min(max(e_i, 0), Size_i - 1)
-          var size_i = size[i];
-          e = Math.min(Math.max(e, 0), size_i - 1);
-
-          // Adjusting the cube: N and vertex sample index
-          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
-          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
-          var n1 = e - e0; // (e - e0) / (e1 - e0);
-          var offset0 = e0 * k;
-          var offset1 = offset0 + k; // e1 * k
-          for (var j = 0; j < cubeVertices; j++) {
-            if (j & pos) {
-              cubeN[j] *= n1;
-              cubeVertex[j] += offset1;
-            } else {
-              cubeN[j] *= n0;
-              cubeVertex[j] += offset0;
-            }
-          }
-
-          k *= size_i;
-          pos <<= 1;
-        }
-
-        var y = new Float64Array(n);
-        for (var j = 0; j < n; ++j) {
-          // Sum all cube vertices' samples portions
-          var rj = 0;
-          for (var i = 0; i < cubeVertices; i++)
-            rj += samples[cubeVertex[i] + j] * cubeN[i];
-
-          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
-          //                    Decode_2j, Decode_2j+1)
-          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
-
-          // y_j = min(max(r_j, range_2j), range_2j+1)
-          y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
-        }
-
-        return y;
-      }
-    },
-
-    constructInterpolated: function PDFFunction_constructInterpolated(str,
-                                                                      dict) {
-      var c0 = dict.get('C0') || [0];
-      var c1 = dict.get('C1') || [1];
-      var n = dict.get('N');
-
-      if (!isArray(c0) || !isArray(c1))
-        error('Illegal dictionary for interpolated function');
-
-      var length = c0.length;
-      var diff = [];
-      for (var i = 0; i < length; ++i)
-        diff.push(c1[i] - c0[i]);
-
-      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
-    },
-
-    constructInterpolatedFromIR:
-      function PDFFunction_constructInterpolatedFromIR(IR) {
-      var c0 = IR[1];
-      var diff = IR[2];
-      var n = IR[3];
-
-      var length = diff.length;
-
-      return function constructInterpolatedFromIRResult(args) {
-        var x = n == 1 ? args[0] : Math.pow(args[0], n);
-
-        var out = [];
-        for (var j = 0; j < length; ++j)
-          out.push(c0[j] + (x * diff[j]));
-
-        return out;
-
-      }
-    },
-
-    constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
-      var domain = dict.get('Domain');
-
-      if (!domain)
-        error('No domain');
-
-      var inputSize = domain.length / 2;
-      if (inputSize != 1)
-        error('Bad domain for stiched function');
-
-      var fnRefs = dict.get('Functions');
-      var fns = [];
-      for (var i = 0, ii = fnRefs.length; i < ii; ++i)
-        fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
-
-      var bounds = dict.get('Bounds');
-      var encode = dict.get('Encode');
-
-      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
-    },
-
-    constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
-      var domain = IR[1];
-      var bounds = IR[2];
-      var encode = IR[3];
-      var fnsIR = IR[4];
-      var fns = [];
-
-      for (var i = 0, ii = fnsIR.length; i < ii; i++) {
-        fns.push(PDFFunction.fromIR(fnsIR[i]));
-      }
-
-      return function constructStichedFromIRResult(args) {
-        var clip = function constructStichedFromIRClip(v, min, max) {
-          if (v > max)
-            v = max;
-          else if (v < min)
-            v = min;
-          return v;
-        };
-
-        // clip to domain
-        var v = clip(args[0], domain[0], domain[1]);
-        // calulate which bound the value is in
-        for (var i = 0, ii = bounds.length; i < ii; ++i) {
-          if (v < bounds[i])
-            break;
-        }
-
-        // encode value into domain of function
-        var dmin = domain[0];
-        if (i > 0)
-          dmin = bounds[i - 1];
-        var dmax = domain[1];
-        if (i < bounds.length)
-          dmax = bounds[i];
-
-        var rmin = encode[2 * i];
-        var rmax = encode[2 * i + 1];
-
-        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
-
-        // call the appropropriate function
-        return fns[i]([v2]);
-      };
-    },
-
-    constructPostScript: function PDFFunction_constructPostScript(fn, dict,
-                                                                  xref) {
-      var domain = dict.get('Domain');
-      var range = dict.get('Range');
-
-      if (!domain)
-        error('No domain.');
-
-      if (!range)
-        error('No range.');
-
-      var lexer = new PostScriptLexer(fn);
-      var parser = new PostScriptParser(lexer);
-      var code = parser.parse();
-
-      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
-    },
-
-    constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
-                                          IR) {
-      var domain = IR[1];
-      var range = IR[2];
-      var code = IR[3];
-      var numOutputs = range.length / 2;
-      var evaluator = new PostScriptEvaluator(code);
-      // Cache the values for a big speed up, the cache size is limited though
-      // since the number of possible values can be huge from a PS function.
-      var cache = new FunctionCache();
-      return function constructPostScriptFromIRResult(args) {
-        var initialStack = [];
-        for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
-          initialStack.push(args[i]);
-        }
-
-        var key = initialStack.join('_');
-        if (cache.has(key))
-          return cache.get(key);
-
-        var stack = evaluator.execute(initialStack);
-        var transformed = [];
-        for (i = numOutputs - 1; i >= 0; --i) {
-          var out = stack.pop();
-          var rangeIndex = 2 * i;
-          if (out < range[rangeIndex])
-            out = range[rangeIndex];
-          else if (out > range[rangeIndex + 1])
-            out = range[rangeIndex + 1];
-          transformed[i] = out;
-        }
-        cache.set(key, transformed);
-        return transformed;
-      };
-    }
-  };
-})();
-
-var FunctionCache = (function FunctionCacheClosure() {
-  // Of 10 PDF's with type4 functions the maxium number of distinct values seen
-  // was 256. This still may need some tweaking in the future though.
-  var MAX_CACHE_SIZE = 1024;
-  function FunctionCache() {
-    this.cache = {};
-    this.total = 0;
-  }
-  FunctionCache.prototype = {
-    has: function FunctionCache_has(key) {
-      return key in this.cache;
-    },
-    get: function FunctionCache_get(key) {
-      return this.cache[key];
-    },
-    set: function FunctionCache_set(key, value) {
-      if (this.total < MAX_CACHE_SIZE) {
-        this.cache[key] = value;
-        this.total++;
-      }
-    }
-  };
-  return FunctionCache;
-})();
-
-var PostScriptStack = (function PostScriptStackClosure() {
-  var MAX_STACK_SIZE = 100;
-  function PostScriptStack(initialStack) {
-    this.stack = initialStack || [];
-  }
-
-  PostScriptStack.prototype = {
-    push: function PostScriptStack_push(value) {
-      if (this.stack.length >= MAX_STACK_SIZE)
-        error('PostScript function stack overflow.');
-      this.stack.push(value);
-    },
-    pop: function PostScriptStack_pop() {
-      if (this.stack.length <= 0)
-        error('PostScript function stack underflow.');
-      return this.stack.pop();
-    },
-    copy: function PostScriptStack_copy(n) {
-      if (this.stack.length + n >= MAX_STACK_SIZE)
-        error('PostScript function stack overflow.');
-      var stack = this.stack;
-      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
-        stack.push(stack[i]);
-    },
-    index: function PostScriptStack_index(n) {
-      this.push(this.stack[this.stack.length - n - 1]);
-    },
-    // rotate the last n stack elements p times
-    roll: function PostScriptStack_roll(n, p) {
-      var stack = this.stack;
-      var l = stack.length - n;
-      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
-      for (i = l, j = r; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-      for (i = l, j = c - 1; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-      for (i = c, j = r; i < j; i++, j--) {
-        t = stack[i]; stack[i] = stack[j]; stack[j] = t;
-      }
-    }
-  };
-  return PostScriptStack;
-})();
-var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
-  function PostScriptEvaluator(operators, operands) {
-    this.operators = operators;
-    this.operands = operands;
-  }
-  PostScriptEvaluator.prototype = {
-    execute: function PostScriptEvaluator_execute(initialStack) {
-      var stack = new PostScriptStack(initialStack);
-      var counter = 0;
-      var operators = this.operators;
-      var length = operators.length;
-      var operator, a, b;
-      while (counter < length) {
-        operator = operators[counter++];
-        if (typeof operator == 'number') {
-          // Operator is really an operand and should be pushed to the stack.
-          stack.push(operator);
-          continue;
-        }
-        switch (operator) {
-          // non standard ps operators
-          case 'jz': // jump if false
-            b = stack.pop();
-            a = stack.pop();
-            if (!a)
-              counter = b;
-            break;
-          case 'j': // jump
-            a = stack.pop();
-            counter = a;
-            break;
-
-          // all ps operators in alphabetical order (excluding if/ifelse)
-          case 'abs':
-            a = stack.pop();
-            stack.push(Math.abs(a));
-            break;
-          case 'add':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a + b);
-            break;
-          case 'and':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a && b);
-            else
-              stack.push(a & b);
-            break;
-          case 'atan':
-            a = stack.pop();
-            stack.push(Math.atan(a));
-            break;
-          case 'bitshift':
-            b = stack.pop();
-            a = stack.pop();
-            if (a > 0)
-              stack.push(a << b);
-            else
-              stack.push(a >> b);
-            break;
-          case 'ceiling':
-            a = stack.pop();
-            stack.push(Math.ceil(a));
-            break;
-          case 'copy':
-            a = stack.pop();
-            stack.copy(a);
-            break;
-          case 'cos':
-            a = stack.pop();
-            stack.push(Math.cos(a));
-            break;
-          case 'cvi':
-            a = stack.pop() | 0;
-            stack.push(a);
-            break;
-          case 'cvr':
-            // noop
-            break;
-          case 'div':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a / b);
-            break;
-          case 'dup':
-            stack.copy(1);
-            break;
-          case 'eq':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a == b);
-            break;
-          case 'exch':
-            stack.roll(2, 1);
-            break;
-          case 'exp':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(Math.pow(a, b));
-            break;
-          case 'false':
-            stack.push(false);
-            break;
-          case 'floor':
-            a = stack.pop();
-            stack.push(Math.floor(a));
-            break;
-          case 'ge':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a >= b);
-            break;
-          case 'gt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a > b);
-            break;
-          case 'idiv':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push((a / b) | 0);
-            break;
-          case 'index':
-            a = stack.pop();
-            stack.index(a);
-            break;
-          case 'le':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a <= b);
-            break;
-          case 'ln':
-            a = stack.pop();
-            stack.push(Math.log(a));
-            break;
-          case 'log':
-            a = stack.pop();
-            stack.push(Math.log(a) / Math.LN10);
-            break;
-          case 'lt':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a < b);
-            break;
-          case 'mod':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a % b);
-            break;
-          case 'mul':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a * b);
-            break;
-          case 'ne':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a != b);
-            break;
-          case 'neg':
-            a = stack.pop();
-            stack.push(-b);
-            break;
-          case 'not':
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a && b);
-            else
-              stack.push(a & b);
-            break;
-          case 'or':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a || b);
-            else
-              stack.push(a | b);
-            break;
-          case 'pop':
-            stack.pop();
-            break;
-          case 'roll':
-            b = stack.pop();
-            a = stack.pop();
-            stack.roll(a, b);
-            break;
-          case 'round':
-            a = stack.pop();
-            stack.push(Math.round(a));
-            break;
-          case 'sin':
-            a = stack.pop();
-            stack.push(Math.sin(a));
-            break;
-          case 'sqrt':
-            a = stack.pop();
-            stack.push(Math.sqrt(a));
-            break;
-          case 'sub':
-            b = stack.pop();
-            a = stack.pop();
-            stack.push(a - b);
-            break;
-          case 'true':
-            stack.push(true);
-            break;
-          case 'truncate':
-            a = stack.pop();
-            a = a < 0 ? Math.ceil(a) : Math.floor(a);
-            stack.push(a);
-            break;
-          case 'xor':
-            b = stack.pop();
-            a = stack.pop();
-            if (isBool(a) && isBool(b))
-              stack.push(a != b);
-            else
-              stack.push(a ^ b);
-            break;
-          default:
-            error('Unknown operator ' + operator);
-            break;
-        }
-      }
-      return stack.stack;
-    }
-  };
-  return PostScriptEvaluator;
-})();
-
-var PostScriptParser = (function PostScriptParserClosure() {
-  function PostScriptParser(lexer) {
-    this.lexer = lexer;
-    this.operators = [];
-    this.token;
-    this.prev;
-  }
-  PostScriptParser.prototype = {
-    nextToken: function PostScriptParser_nextToken() {
-      this.prev = this.token;
-      this.token = this.lexer.getToken();
-    },
-    accept: function PostScriptParser_accept(type) {
-      if (this.token.type == type) {
-        this.nextToken();
-        return true;
-      }
-      return false;
-    },
-    expect: function PostScriptParser_expect(type) {
-      if (this.accept(type))
-        return true;
-      error('Unexpected symbol: found ' + this.token.type + ' expected ' +
-            type + '.');
-    },
-    parse: function PostScriptParser_parse() {
-      this.nextToken();
-      this.expect(PostScriptTokenTypes.LBRACE);
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      return this.operators;
-    },
-    parseBlock: function PostScriptParser_parseBlock() {
-      while (true) {
-        if (this.accept(PostScriptTokenTypes.NUMBER)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
-          this.operators.push(this.prev.value);
-        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-          this.parseCondition();
-        } else {
-          return;
-        }
-      }
-    },
-    parseCondition: function PostScriptParser_parseCondition() {
-      // Add two place holders that will be updated later
-      var conditionLocation = this.operators.length;
-      this.operators.push(null, null);
-
-      this.parseBlock();
-      this.expect(PostScriptTokenTypes.RBRACE);
-      if (this.accept(PostScriptTokenTypes.IF)) {
-        // The true block is right after the 'if' so it just falls through on
-        // true else it jumps and skips the true block.
-        this.operators[conditionLocation] = this.operators.length;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
-        var jumpLocation = this.operators.length;
-        this.operators.push(null, null);
-        var endOfTrue = this.operators.length;
-        this.parseBlock();
-        this.expect(PostScriptTokenTypes.RBRACE);
-        this.expect(PostScriptTokenTypes.IFELSE);
-        // The jump is added at the end of the true block to skip the false
-        // block.
-        this.operators[jumpLocation] = this.operators.length;
-        this.operators[jumpLocation + 1] = 'j';
-
-        this.operators[conditionLocation] = endOfTrue;
-        this.operators[conditionLocation + 1] = 'jz';
-      } else {
-        error('PS Function: error parsing conditional.');
-      }
-    }
-  };
-  return PostScriptParser;
-})();
-
-var PostScriptTokenTypes = {
-  LBRACE: 0,
-  RBRACE: 1,
-  NUMBER: 2,
-  OPERATOR: 3,
-  IF: 4,
-  IFELSE: 5
-};
-
-var PostScriptToken = (function PostScriptTokenClosure() {
-  function PostScriptToken(type, value) {
-    this.type = type;
-    this.value = value;
-  }
-
-  var opCache = {};
-
-  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
-    var opValue = opCache[op];
-    if (opValue)
-      return opValue;
-
-    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
-  };
-
-  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
-                                                '{');
-  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
-                                                '}');
-  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
-  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
-                                                'IFELSE');
-  return PostScriptToken;
-})();
-
-var PostScriptLexer = (function PostScriptLexerClosure() {
-  function PostScriptLexer(stream) {
-    this.stream = stream;
-  }
-  PostScriptLexer.prototype = {
-    getToken: function PostScriptLexer_getToken() {
-      var s = '';
-      var ch;
-      var comment = false;
-      var stream = this.stream;
-
-      // skip comments
-      while (true) {
-        if (!(ch = stream.getChar()))
-          return EOF;
-
-        if (comment) {
-          if (ch == '\x0a' || ch == '\x0d')
-            comment = false;
-        } else if (ch == '%') {
-          comment = true;
-        } else if (!Lexer.isSpace(ch)) {
-          break;
-        }
-      }
-      switch (ch) {
-        case '0': case '1': case '2': case '3': case '4':
-        case '5': case '6': case '7': case '8': case '9':
-        case '+': case '-': case '.':
-          return new PostScriptToken(PostScriptTokenTypes.NUMBER,
-                                      this.getNumber(ch));
-        case '{':
-          return PostScriptToken.LBRACE;
-        case '}':
-          return PostScriptToken.RBRACE;
-      }
-      // operator
-      var str = ch.toLowerCase();
-      while (true) {
-        ch = stream.lookChar().toLowerCase();
-        if (ch >= 'a' && ch <= 'z')
-          str += ch;
-        else
-          break;
-        stream.skip();
-      }
-      switch (str) {
-        case 'if':
-          return PostScriptToken.IF;
-        case 'ifelse':
-          return PostScriptToken.IFELSE;
-        default:
-          return PostScriptToken.getOperator(str);
-      }
-    },
-    getNumber: function PostScriptLexer_getNumber(ch) {
-      var str = ch;
-      var stream = this.stream;
-      while (true) {
-        ch = stream.lookChar();
-        if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
-          str += ch;
-        else
-          break;
-        stream.skip();
-      }
-      var value = parseFloat(str);
-      if (isNaN(value))
-        error('Invalid floating point number: ' + value);
-      return value;
-    }
-  };
-  return PostScriptLexer;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/glyphlist.js b/apps/files_pdfviewer/js/pdfjs/src/glyphlist.js
deleted file mode 100644
index 694134840e680206c53568f8c7941fc8224190d6..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/glyphlist.js
+++ /dev/null
@@ -1,4212 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var GlyphsUnicode = {
-  A: 0x0041,
-  AE: 0x00C6,
-  AEacute: 0x01FC,
-  AEmacron: 0x01E2,
-  AEsmall: 0xF7E6,
-  Aacute: 0x00C1,
-  Aacutesmall: 0xF7E1,
-  Abreve: 0x0102,
-  Abreveacute: 0x1EAE,
-  Abrevecyrillic: 0x04D0,
-  Abrevedotbelow: 0x1EB6,
-  Abrevegrave: 0x1EB0,
-  Abrevehookabove: 0x1EB2,
-  Abrevetilde: 0x1EB4,
-  Acaron: 0x01CD,
-  Acircle: 0x24B6,
-  Acircumflex: 0x00C2,
-  Acircumflexacute: 0x1EA4,
-  Acircumflexdotbelow: 0x1EAC,
-  Acircumflexgrave: 0x1EA6,
-  Acircumflexhookabove: 0x1EA8,
-  Acircumflexsmall: 0xF7E2,
-  Acircumflextilde: 0x1EAA,
-  Acute: 0xF6C9,
-  Acutesmall: 0xF7B4,
-  Acyrillic: 0x0410,
-  Adblgrave: 0x0200,
-  Adieresis: 0x00C4,
-  Adieresiscyrillic: 0x04D2,
-  Adieresismacron: 0x01DE,
-  Adieresissmall: 0xF7E4,
-  Adotbelow: 0x1EA0,
-  Adotmacron: 0x01E0,
-  Agrave: 0x00C0,
-  Agravesmall: 0xF7E0,
-  Ahookabove: 0x1EA2,
-  Aiecyrillic: 0x04D4,
-  Ainvertedbreve: 0x0202,
-  Alpha: 0x0391,
-  Alphatonos: 0x0386,
-  Amacron: 0x0100,
-  Amonospace: 0xFF21,
-  Aogonek: 0x0104,
-  Aring: 0x00C5,
-  Aringacute: 0x01FA,
-  Aringbelow: 0x1E00,
-  Aringsmall: 0xF7E5,
-  Asmall: 0xF761,
-  Atilde: 0x00C3,
-  Atildesmall: 0xF7E3,
-  Aybarmenian: 0x0531,
-  B: 0x0042,
-  Bcircle: 0x24B7,
-  Bdotaccent: 0x1E02,
-  Bdotbelow: 0x1E04,
-  Becyrillic: 0x0411,
-  Benarmenian: 0x0532,
-  Beta: 0x0392,
-  Bhook: 0x0181,
-  Blinebelow: 0x1E06,
-  Bmonospace: 0xFF22,
-  Brevesmall: 0xF6F4,
-  Bsmall: 0xF762,
-  Btopbar: 0x0182,
-  C: 0x0043,
-  Caarmenian: 0x053E,
-  Cacute: 0x0106,
-  Caron: 0xF6CA,
-  Caronsmall: 0xF6F5,
-  Ccaron: 0x010C,
-  Ccedilla: 0x00C7,
-  Ccedillaacute: 0x1E08,
-  Ccedillasmall: 0xF7E7,
-  Ccircle: 0x24B8,
-  Ccircumflex: 0x0108,
-  Cdot: 0x010A,
-  Cdotaccent: 0x010A,
-  Cedillasmall: 0xF7B8,
-  Chaarmenian: 0x0549,
-  Cheabkhasiancyrillic: 0x04BC,
-  Checyrillic: 0x0427,
-  Chedescenderabkhasiancyrillic: 0x04BE,
-  Chedescendercyrillic: 0x04B6,
-  Chedieresiscyrillic: 0x04F4,
-  Cheharmenian: 0x0543,
-  Chekhakassiancyrillic: 0x04CB,
-  Cheverticalstrokecyrillic: 0x04B8,
-  Chi: 0x03A7,
-  Chook: 0x0187,
-  Circumflexsmall: 0xF6F6,
-  Cmonospace: 0xFF23,
-  Coarmenian: 0x0551,
-  Csmall: 0xF763,
-  D: 0x0044,
-  DZ: 0x01F1,
-  DZcaron: 0x01C4,
-  Daarmenian: 0x0534,
-  Dafrican: 0x0189,
-  Dcaron: 0x010E,
-  Dcedilla: 0x1E10,
-  Dcircle: 0x24B9,
-  Dcircumflexbelow: 0x1E12,
-  Dcroat: 0x0110,
-  Ddotaccent: 0x1E0A,
-  Ddotbelow: 0x1E0C,
-  Decyrillic: 0x0414,
-  Deicoptic: 0x03EE,
-  Delta: 0x2206,
-  Deltagreek: 0x0394,
-  Dhook: 0x018A,
-  Dieresis: 0xF6CB,
-  DieresisAcute: 0xF6CC,
-  DieresisGrave: 0xF6CD,
-  Dieresissmall: 0xF7A8,
-  Digammagreek: 0x03DC,
-  Djecyrillic: 0x0402,
-  Dlinebelow: 0x1E0E,
-  Dmonospace: 0xFF24,
-  Dotaccentsmall: 0xF6F7,
-  Dslash: 0x0110,
-  Dsmall: 0xF764,
-  Dtopbar: 0x018B,
-  Dz: 0x01F2,
-  Dzcaron: 0x01C5,
-  Dzeabkhasiancyrillic: 0x04E0,
-  Dzecyrillic: 0x0405,
-  Dzhecyrillic: 0x040F,
-  E: 0x0045,
-  Eacute: 0x00C9,
-  Eacutesmall: 0xF7E9,
-  Ebreve: 0x0114,
-  Ecaron: 0x011A,
-  Ecedillabreve: 0x1E1C,
-  Echarmenian: 0x0535,
-  Ecircle: 0x24BA,
-  Ecircumflex: 0x00CA,
-  Ecircumflexacute: 0x1EBE,
-  Ecircumflexbelow: 0x1E18,
-  Ecircumflexdotbelow: 0x1EC6,
-  Ecircumflexgrave: 0x1EC0,
-  Ecircumflexhookabove: 0x1EC2,
-  Ecircumflexsmall: 0xF7EA,
-  Ecircumflextilde: 0x1EC4,
-  Ecyrillic: 0x0404,
-  Edblgrave: 0x0204,
-  Edieresis: 0x00CB,
-  Edieresissmall: 0xF7EB,
-  Edot: 0x0116,
-  Edotaccent: 0x0116,
-  Edotbelow: 0x1EB8,
-  Efcyrillic: 0x0424,
-  Egrave: 0x00C8,
-  Egravesmall: 0xF7E8,
-  Eharmenian: 0x0537,
-  Ehookabove: 0x1EBA,
-  Eightroman: 0x2167,
-  Einvertedbreve: 0x0206,
-  Eiotifiedcyrillic: 0x0464,
-  Elcyrillic: 0x041B,
-  Elevenroman: 0x216A,
-  Emacron: 0x0112,
-  Emacronacute: 0x1E16,
-  Emacrongrave: 0x1E14,
-  Emcyrillic: 0x041C,
-  Emonospace: 0xFF25,
-  Encyrillic: 0x041D,
-  Endescendercyrillic: 0x04A2,
-  Eng: 0x014A,
-  Enghecyrillic: 0x04A4,
-  Enhookcyrillic: 0x04C7,
-  Eogonek: 0x0118,
-  Eopen: 0x0190,
-  Epsilon: 0x0395,
-  Epsilontonos: 0x0388,
-  Ercyrillic: 0x0420,
-  Ereversed: 0x018E,
-  Ereversedcyrillic: 0x042D,
-  Escyrillic: 0x0421,
-  Esdescendercyrillic: 0x04AA,
-  Esh: 0x01A9,
-  Esmall: 0xF765,
-  Eta: 0x0397,
-  Etarmenian: 0x0538,
-  Etatonos: 0x0389,
-  Eth: 0x00D0,
-  Ethsmall: 0xF7F0,
-  Etilde: 0x1EBC,
-  Etildebelow: 0x1E1A,
-  Euro: 0x20AC,
-  Ezh: 0x01B7,
-  Ezhcaron: 0x01EE,
-  Ezhreversed: 0x01B8,
-  F: 0x0046,
-  Fcircle: 0x24BB,
-  Fdotaccent: 0x1E1E,
-  Feharmenian: 0x0556,
-  Feicoptic: 0x03E4,
-  Fhook: 0x0191,
-  Fitacyrillic: 0x0472,
-  Fiveroman: 0x2164,
-  Fmonospace: 0xFF26,
-  Fourroman: 0x2163,
-  Fsmall: 0xF766,
-  G: 0x0047,
-  GBsquare: 0x3387,
-  Gacute: 0x01F4,
-  Gamma: 0x0393,
-  Gammaafrican: 0x0194,
-  Gangiacoptic: 0x03EA,
-  Gbreve: 0x011E,
-  Gcaron: 0x01E6,
-  Gcedilla: 0x0122,
-  Gcircle: 0x24BC,
-  Gcircumflex: 0x011C,
-  Gcommaaccent: 0x0122,
-  Gdot: 0x0120,
-  Gdotaccent: 0x0120,
-  Gecyrillic: 0x0413,
-  Ghadarmenian: 0x0542,
-  Ghemiddlehookcyrillic: 0x0494,
-  Ghestrokecyrillic: 0x0492,
-  Gheupturncyrillic: 0x0490,
-  Ghook: 0x0193,
-  Gimarmenian: 0x0533,
-  Gjecyrillic: 0x0403,
-  Gmacron: 0x1E20,
-  Gmonospace: 0xFF27,
-  Grave: 0xF6CE,
-  Gravesmall: 0xF760,
-  Gsmall: 0xF767,
-  Gsmallhook: 0x029B,
-  Gstroke: 0x01E4,
-  H: 0x0048,
-  H18533: 0x25CF,
-  H18543: 0x25AA,
-  H18551: 0x25AB,
-  H22073: 0x25A1,
-  HPsquare: 0x33CB,
-  Haabkhasiancyrillic: 0x04A8,
-  Hadescendercyrillic: 0x04B2,
-  Hardsigncyrillic: 0x042A,
-  Hbar: 0x0126,
-  Hbrevebelow: 0x1E2A,
-  Hcedilla: 0x1E28,
-  Hcircle: 0x24BD,
-  Hcircumflex: 0x0124,
-  Hdieresis: 0x1E26,
-  Hdotaccent: 0x1E22,
-  Hdotbelow: 0x1E24,
-  Hmonospace: 0xFF28,
-  Hoarmenian: 0x0540,
-  Horicoptic: 0x03E8,
-  Hsmall: 0xF768,
-  Hungarumlaut: 0xF6CF,
-  Hungarumlautsmall: 0xF6F8,
-  Hzsquare: 0x3390,
-  I: 0x0049,
-  IAcyrillic: 0x042F,
-  IJ: 0x0132,
-  IUcyrillic: 0x042E,
-  Iacute: 0x00CD,
-  Iacutesmall: 0xF7ED,
-  Ibreve: 0x012C,
-  Icaron: 0x01CF,
-  Icircle: 0x24BE,
-  Icircumflex: 0x00CE,
-  Icircumflexsmall: 0xF7EE,
-  Icyrillic: 0x0406,
-  Idblgrave: 0x0208,
-  Idieresis: 0x00CF,
-  Idieresisacute: 0x1E2E,
-  Idieresiscyrillic: 0x04E4,
-  Idieresissmall: 0xF7EF,
-  Idot: 0x0130,
-  Idotaccent: 0x0130,
-  Idotbelow: 0x1ECA,
-  Iebrevecyrillic: 0x04D6,
-  Iecyrillic: 0x0415,
-  Ifraktur: 0x2111,
-  Igrave: 0x00CC,
-  Igravesmall: 0xF7EC,
-  Ihookabove: 0x1EC8,
-  Iicyrillic: 0x0418,
-  Iinvertedbreve: 0x020A,
-  Iishortcyrillic: 0x0419,
-  Imacron: 0x012A,
-  Imacroncyrillic: 0x04E2,
-  Imonospace: 0xFF29,
-  Iniarmenian: 0x053B,
-  Iocyrillic: 0x0401,
-  Iogonek: 0x012E,
-  Iota: 0x0399,
-  Iotaafrican: 0x0196,
-  Iotadieresis: 0x03AA,
-  Iotatonos: 0x038A,
-  Ismall: 0xF769,
-  Istroke: 0x0197,
-  Itilde: 0x0128,
-  Itildebelow: 0x1E2C,
-  Izhitsacyrillic: 0x0474,
-  Izhitsadblgravecyrillic: 0x0476,
-  J: 0x004A,
-  Jaarmenian: 0x0541,
-  Jcircle: 0x24BF,
-  Jcircumflex: 0x0134,
-  Jecyrillic: 0x0408,
-  Jheharmenian: 0x054B,
-  Jmonospace: 0xFF2A,
-  Jsmall: 0xF76A,
-  K: 0x004B,
-  KBsquare: 0x3385,
-  KKsquare: 0x33CD,
-  Kabashkircyrillic: 0x04A0,
-  Kacute: 0x1E30,
-  Kacyrillic: 0x041A,
-  Kadescendercyrillic: 0x049A,
-  Kahookcyrillic: 0x04C3,
-  Kappa: 0x039A,
-  Kastrokecyrillic: 0x049E,
-  Kaverticalstrokecyrillic: 0x049C,
-  Kcaron: 0x01E8,
-  Kcedilla: 0x0136,
-  Kcircle: 0x24C0,
-  Kcommaaccent: 0x0136,
-  Kdotbelow: 0x1E32,
-  Keharmenian: 0x0554,
-  Kenarmenian: 0x053F,
-  Khacyrillic: 0x0425,
-  Kheicoptic: 0x03E6,
-  Khook: 0x0198,
-  Kjecyrillic: 0x040C,
-  Klinebelow: 0x1E34,
-  Kmonospace: 0xFF2B,
-  Koppacyrillic: 0x0480,
-  Koppagreek: 0x03DE,
-  Ksicyrillic: 0x046E,
-  Ksmall: 0xF76B,
-  L: 0x004C,
-  LJ: 0x01C7,
-  LL: 0xF6BF,
-  Lacute: 0x0139,
-  Lambda: 0x039B,
-  Lcaron: 0x013D,
-  Lcedilla: 0x013B,
-  Lcircle: 0x24C1,
-  Lcircumflexbelow: 0x1E3C,
-  Lcommaaccent: 0x013B,
-  Ldot: 0x013F,
-  Ldotaccent: 0x013F,
-  Ldotbelow: 0x1E36,
-  Ldotbelowmacron: 0x1E38,
-  Liwnarmenian: 0x053C,
-  Lj: 0x01C8,
-  Ljecyrillic: 0x0409,
-  Llinebelow: 0x1E3A,
-  Lmonospace: 0xFF2C,
-  Lslash: 0x0141,
-  Lslashsmall: 0xF6F9,
-  Lsmall: 0xF76C,
-  M: 0x004D,
-  MBsquare: 0x3386,
-  Macron: 0xF6D0,
-  Macronsmall: 0xF7AF,
-  Macute: 0x1E3E,
-  Mcircle: 0x24C2,
-  Mdotaccent: 0x1E40,
-  Mdotbelow: 0x1E42,
-  Menarmenian: 0x0544,
-  Mmonospace: 0xFF2D,
-  Msmall: 0xF76D,
-  Mturned: 0x019C,
-  Mu: 0x039C,
-  N: 0x004E,
-  NJ: 0x01CA,
-  Nacute: 0x0143,
-  Ncaron: 0x0147,
-  Ncedilla: 0x0145,
-  Ncircle: 0x24C3,
-  Ncircumflexbelow: 0x1E4A,
-  Ncommaaccent: 0x0145,
-  Ndotaccent: 0x1E44,
-  Ndotbelow: 0x1E46,
-  Nhookleft: 0x019D,
-  Nineroman: 0x2168,
-  Nj: 0x01CB,
-  Njecyrillic: 0x040A,
-  Nlinebelow: 0x1E48,
-  Nmonospace: 0xFF2E,
-  Nowarmenian: 0x0546,
-  Nsmall: 0xF76E,
-  Ntilde: 0x00D1,
-  Ntildesmall: 0xF7F1,
-  Nu: 0x039D,
-  O: 0x004F,
-  OE: 0x0152,
-  OEsmall: 0xF6FA,
-  Oacute: 0x00D3,
-  Oacutesmall: 0xF7F3,
-  Obarredcyrillic: 0x04E8,
-  Obarreddieresiscyrillic: 0x04EA,
-  Obreve: 0x014E,
-  Ocaron: 0x01D1,
-  Ocenteredtilde: 0x019F,
-  Ocircle: 0x24C4,
-  Ocircumflex: 0x00D4,
-  Ocircumflexacute: 0x1ED0,
-  Ocircumflexdotbelow: 0x1ED8,
-  Ocircumflexgrave: 0x1ED2,
-  Ocircumflexhookabove: 0x1ED4,
-  Ocircumflexsmall: 0xF7F4,
-  Ocircumflextilde: 0x1ED6,
-  Ocyrillic: 0x041E,
-  Odblacute: 0x0150,
-  Odblgrave: 0x020C,
-  Odieresis: 0x00D6,
-  Odieresiscyrillic: 0x04E6,
-  Odieresissmall: 0xF7F6,
-  Odotbelow: 0x1ECC,
-  Ogoneksmall: 0xF6FB,
-  Ograve: 0x00D2,
-  Ogravesmall: 0xF7F2,
-  Oharmenian: 0x0555,
-  Ohm: 0x2126,
-  Ohookabove: 0x1ECE,
-  Ohorn: 0x01A0,
-  Ohornacute: 0x1EDA,
-  Ohorndotbelow: 0x1EE2,
-  Ohorngrave: 0x1EDC,
-  Ohornhookabove: 0x1EDE,
-  Ohorntilde: 0x1EE0,
-  Ohungarumlaut: 0x0150,
-  Oi: 0x01A2,
-  Oinvertedbreve: 0x020E,
-  Omacron: 0x014C,
-  Omacronacute: 0x1E52,
-  Omacrongrave: 0x1E50,
-  Omega: 0x2126,
-  Omegacyrillic: 0x0460,
-  Omegagreek: 0x03A9,
-  Omegaroundcyrillic: 0x047A,
-  Omegatitlocyrillic: 0x047C,
-  Omegatonos: 0x038F,
-  Omicron: 0x039F,
-  Omicrontonos: 0x038C,
-  Omonospace: 0xFF2F,
-  Oneroman: 0x2160,
-  Oogonek: 0x01EA,
-  Oogonekmacron: 0x01EC,
-  Oopen: 0x0186,
-  Oslash: 0x00D8,
-  Oslashacute: 0x01FE,
-  Oslashsmall: 0xF7F8,
-  Osmall: 0xF76F,
-  Ostrokeacute: 0x01FE,
-  Otcyrillic: 0x047E,
-  Otilde: 0x00D5,
-  Otildeacute: 0x1E4C,
-  Otildedieresis: 0x1E4E,
-  Otildesmall: 0xF7F5,
-  P: 0x0050,
-  Pacute: 0x1E54,
-  Pcircle: 0x24C5,
-  Pdotaccent: 0x1E56,
-  Pecyrillic: 0x041F,
-  Peharmenian: 0x054A,
-  Pemiddlehookcyrillic: 0x04A6,
-  Phi: 0x03A6,
-  Phook: 0x01A4,
-  Pi: 0x03A0,
-  Piwrarmenian: 0x0553,
-  Pmonospace: 0xFF30,
-  Psi: 0x03A8,
-  Psicyrillic: 0x0470,
-  Psmall: 0xF770,
-  Q: 0x0051,
-  Qcircle: 0x24C6,
-  Qmonospace: 0xFF31,
-  Qsmall: 0xF771,
-  R: 0x0052,
-  Raarmenian: 0x054C,
-  Racute: 0x0154,
-  Rcaron: 0x0158,
-  Rcedilla: 0x0156,
-  Rcircle: 0x24C7,
-  Rcommaaccent: 0x0156,
-  Rdblgrave: 0x0210,
-  Rdotaccent: 0x1E58,
-  Rdotbelow: 0x1E5A,
-  Rdotbelowmacron: 0x1E5C,
-  Reharmenian: 0x0550,
-  Rfraktur: 0x211C,
-  Rho: 0x03A1,
-  Ringsmall: 0xF6FC,
-  Rinvertedbreve: 0x0212,
-  Rlinebelow: 0x1E5E,
-  Rmonospace: 0xFF32,
-  Rsmall: 0xF772,
-  Rsmallinverted: 0x0281,
-  Rsmallinvertedsuperior: 0x02B6,
-  S: 0x0053,
-  SF010000: 0x250C,
-  SF020000: 0x2514,
-  SF030000: 0x2510,
-  SF040000: 0x2518,
-  SF050000: 0x253C,
-  SF060000: 0x252C,
-  SF070000: 0x2534,
-  SF080000: 0x251C,
-  SF090000: 0x2524,
-  SF100000: 0x2500,
-  SF110000: 0x2502,
-  SF190000: 0x2561,
-  SF200000: 0x2562,
-  SF210000: 0x2556,
-  SF220000: 0x2555,
-  SF230000: 0x2563,
-  SF240000: 0x2551,
-  SF250000: 0x2557,
-  SF260000: 0x255D,
-  SF270000: 0x255C,
-  SF280000: 0x255B,
-  SF360000: 0x255E,
-  SF370000: 0x255F,
-  SF380000: 0x255A,
-  SF390000: 0x2554,
-  SF400000: 0x2569,
-  SF410000: 0x2566,
-  SF420000: 0x2560,
-  SF430000: 0x2550,
-  SF440000: 0x256C,
-  SF450000: 0x2567,
-  SF460000: 0x2568,
-  SF470000: 0x2564,
-  SF480000: 0x2565,
-  SF490000: 0x2559,
-  SF500000: 0x2558,
-  SF510000: 0x2552,
-  SF520000: 0x2553,
-  SF530000: 0x256B,
-  SF540000: 0x256A,
-  Sacute: 0x015A,
-  Sacutedotaccent: 0x1E64,
-  Sampigreek: 0x03E0,
-  Scaron: 0x0160,
-  Scarondotaccent: 0x1E66,
-  Scaronsmall: 0xF6FD,
-  Scedilla: 0x015E,
-  Schwa: 0x018F,
-  Schwacyrillic: 0x04D8,
-  Schwadieresiscyrillic: 0x04DA,
-  Scircle: 0x24C8,
-  Scircumflex: 0x015C,
-  Scommaaccent: 0x0218,
-  Sdotaccent: 0x1E60,
-  Sdotbelow: 0x1E62,
-  Sdotbelowdotaccent: 0x1E68,
-  Seharmenian: 0x054D,
-  Sevenroman: 0x2166,
-  Shaarmenian: 0x0547,
-  Shacyrillic: 0x0428,
-  Shchacyrillic: 0x0429,
-  Sheicoptic: 0x03E2,
-  Shhacyrillic: 0x04BA,
-  Shimacoptic: 0x03EC,
-  Sigma: 0x03A3,
-  Sixroman: 0x2165,
-  Smonospace: 0xFF33,
-  Softsigncyrillic: 0x042C,
-  Ssmall: 0xF773,
-  Stigmagreek: 0x03DA,
-  T: 0x0054,
-  Tau: 0x03A4,
-  Tbar: 0x0166,
-  Tcaron: 0x0164,
-  Tcedilla: 0x0162,
-  Tcircle: 0x24C9,
-  Tcircumflexbelow: 0x1E70,
-  Tcommaaccent: 0x0162,
-  Tdotaccent: 0x1E6A,
-  Tdotbelow: 0x1E6C,
-  Tecyrillic: 0x0422,
-  Tedescendercyrillic: 0x04AC,
-  Tenroman: 0x2169,
-  Tetsecyrillic: 0x04B4,
-  Theta: 0x0398,
-  Thook: 0x01AC,
-  Thorn: 0x00DE,
-  Thornsmall: 0xF7FE,
-  Threeroman: 0x2162,
-  Tildesmall: 0xF6FE,
-  Tiwnarmenian: 0x054F,
-  Tlinebelow: 0x1E6E,
-  Tmonospace: 0xFF34,
-  Toarmenian: 0x0539,
-  Tonefive: 0x01BC,
-  Tonesix: 0x0184,
-  Tonetwo: 0x01A7,
-  Tretroflexhook: 0x01AE,
-  Tsecyrillic: 0x0426,
-  Tshecyrillic: 0x040B,
-  Tsmall: 0xF774,
-  Twelveroman: 0x216B,
-  Tworoman: 0x2161,
-  U: 0x0055,
-  Uacute: 0x00DA,
-  Uacutesmall: 0xF7FA,
-  Ubreve: 0x016C,
-  Ucaron: 0x01D3,
-  Ucircle: 0x24CA,
-  Ucircumflex: 0x00DB,
-  Ucircumflexbelow: 0x1E76,
-  Ucircumflexsmall: 0xF7FB,
-  Ucyrillic: 0x0423,
-  Udblacute: 0x0170,
-  Udblgrave: 0x0214,
-  Udieresis: 0x00DC,
-  Udieresisacute: 0x01D7,
-  Udieresisbelow: 0x1E72,
-  Udieresiscaron: 0x01D9,
-  Udieresiscyrillic: 0x04F0,
-  Udieresisgrave: 0x01DB,
-  Udieresismacron: 0x01D5,
-  Udieresissmall: 0xF7FC,
-  Udotbelow: 0x1EE4,
-  Ugrave: 0x00D9,
-  Ugravesmall: 0xF7F9,
-  Uhookabove: 0x1EE6,
-  Uhorn: 0x01AF,
-  Uhornacute: 0x1EE8,
-  Uhorndotbelow: 0x1EF0,
-  Uhorngrave: 0x1EEA,
-  Uhornhookabove: 0x1EEC,
-  Uhorntilde: 0x1EEE,
-  Uhungarumlaut: 0x0170,
-  Uhungarumlautcyrillic: 0x04F2,
-  Uinvertedbreve: 0x0216,
-  Ukcyrillic: 0x0478,
-  Umacron: 0x016A,
-  Umacroncyrillic: 0x04EE,
-  Umacrondieresis: 0x1E7A,
-  Umonospace: 0xFF35,
-  Uogonek: 0x0172,
-  Upsilon: 0x03A5,
-  Upsilon1: 0x03D2,
-  Upsilonacutehooksymbolgreek: 0x03D3,
-  Upsilonafrican: 0x01B1,
-  Upsilondieresis: 0x03AB,
-  Upsilondieresishooksymbolgreek: 0x03D4,
-  Upsilonhooksymbol: 0x03D2,
-  Upsilontonos: 0x038E,
-  Uring: 0x016E,
-  Ushortcyrillic: 0x040E,
-  Usmall: 0xF775,
-  Ustraightcyrillic: 0x04AE,
-  Ustraightstrokecyrillic: 0x04B0,
-  Utilde: 0x0168,
-  Utildeacute: 0x1E78,
-  Utildebelow: 0x1E74,
-  V: 0x0056,
-  Vcircle: 0x24CB,
-  Vdotbelow: 0x1E7E,
-  Vecyrillic: 0x0412,
-  Vewarmenian: 0x054E,
-  Vhook: 0x01B2,
-  Vmonospace: 0xFF36,
-  Voarmenian: 0x0548,
-  Vsmall: 0xF776,
-  Vtilde: 0x1E7C,
-  W: 0x0057,
-  Wacute: 0x1E82,
-  Wcircle: 0x24CC,
-  Wcircumflex: 0x0174,
-  Wdieresis: 0x1E84,
-  Wdotaccent: 0x1E86,
-  Wdotbelow: 0x1E88,
-  Wgrave: 0x1E80,
-  Wmonospace: 0xFF37,
-  Wsmall: 0xF777,
-  X: 0x0058,
-  Xcircle: 0x24CD,
-  Xdieresis: 0x1E8C,
-  Xdotaccent: 0x1E8A,
-  Xeharmenian: 0x053D,
-  Xi: 0x039E,
-  Xmonospace: 0xFF38,
-  Xsmall: 0xF778,
-  Y: 0x0059,
-  Yacute: 0x00DD,
-  Yacutesmall: 0xF7FD,
-  Yatcyrillic: 0x0462,
-  Ycircle: 0x24CE,
-  Ycircumflex: 0x0176,
-  Ydieresis: 0x0178,
-  Ydieresissmall: 0xF7FF,
-  Ydotaccent: 0x1E8E,
-  Ydotbelow: 0x1EF4,
-  Yericyrillic: 0x042B,
-  Yerudieresiscyrillic: 0x04F8,
-  Ygrave: 0x1EF2,
-  Yhook: 0x01B3,
-  Yhookabove: 0x1EF6,
-  Yiarmenian: 0x0545,
-  Yicyrillic: 0x0407,
-  Yiwnarmenian: 0x0552,
-  Ymonospace: 0xFF39,
-  Ysmall: 0xF779,
-  Ytilde: 0x1EF8,
-  Yusbigcyrillic: 0x046A,
-  Yusbigiotifiedcyrillic: 0x046C,
-  Yuslittlecyrillic: 0x0466,
-  Yuslittleiotifiedcyrillic: 0x0468,
-  Z: 0x005A,
-  Zaarmenian: 0x0536,
-  Zacute: 0x0179,
-  Zcaron: 0x017D,
-  Zcaronsmall: 0xF6FF,
-  Zcircle: 0x24CF,
-  Zcircumflex: 0x1E90,
-  Zdot: 0x017B,
-  Zdotaccent: 0x017B,
-  Zdotbelow: 0x1E92,
-  Zecyrillic: 0x0417,
-  Zedescendercyrillic: 0x0498,
-  Zedieresiscyrillic: 0x04DE,
-  Zeta: 0x0396,
-  Zhearmenian: 0x053A,
-  Zhebrevecyrillic: 0x04C1,
-  Zhecyrillic: 0x0416,
-  Zhedescendercyrillic: 0x0496,
-  Zhedieresiscyrillic: 0x04DC,
-  Zlinebelow: 0x1E94,
-  Zmonospace: 0xFF3A,
-  Zsmall: 0xF77A,
-  Zstroke: 0x01B5,
-  a: 0x0061,
-  aabengali: 0x0986,
-  aacute: 0x00E1,
-  aadeva: 0x0906,
-  aagujarati: 0x0A86,
-  aagurmukhi: 0x0A06,
-  aamatragurmukhi: 0x0A3E,
-  aarusquare: 0x3303,
-  aavowelsignbengali: 0x09BE,
-  aavowelsigndeva: 0x093E,
-  aavowelsigngujarati: 0x0ABE,
-  abbreviationmarkarmenian: 0x055F,
-  abbreviationsigndeva: 0x0970,
-  abengali: 0x0985,
-  abopomofo: 0x311A,
-  abreve: 0x0103,
-  abreveacute: 0x1EAF,
-  abrevecyrillic: 0x04D1,
-  abrevedotbelow: 0x1EB7,
-  abrevegrave: 0x1EB1,
-  abrevehookabove: 0x1EB3,
-  abrevetilde: 0x1EB5,
-  acaron: 0x01CE,
-  acircle: 0x24D0,
-  acircumflex: 0x00E2,
-  acircumflexacute: 0x1EA5,
-  acircumflexdotbelow: 0x1EAD,
-  acircumflexgrave: 0x1EA7,
-  acircumflexhookabove: 0x1EA9,
-  acircumflextilde: 0x1EAB,
-  acute: 0x00B4,
-  acutebelowcmb: 0x0317,
-  acutecmb: 0x0301,
-  acutecomb: 0x0301,
-  acutedeva: 0x0954,
-  acutelowmod: 0x02CF,
-  acutetonecmb: 0x0341,
-  acyrillic: 0x0430,
-  adblgrave: 0x0201,
-  addakgurmukhi: 0x0A71,
-  adeva: 0x0905,
-  adieresis: 0x00E4,
-  adieresiscyrillic: 0x04D3,
-  adieresismacron: 0x01DF,
-  adotbelow: 0x1EA1,
-  adotmacron: 0x01E1,
-  ae: 0x00E6,
-  aeacute: 0x01FD,
-  aekorean: 0x3150,
-  aemacron: 0x01E3,
-  afii00208: 0x2015,
-  afii08941: 0x20A4,
-  afii10017: 0x0410,
-  afii10018: 0x0411,
-  afii10019: 0x0412,
-  afii10020: 0x0413,
-  afii10021: 0x0414,
-  afii10022: 0x0415,
-  afii10023: 0x0401,
-  afii10024: 0x0416,
-  afii10025: 0x0417,
-  afii10026: 0x0418,
-  afii10027: 0x0419,
-  afii10028: 0x041A,
-  afii10029: 0x041B,
-  afii10030: 0x041C,
-  afii10031: 0x041D,
-  afii10032: 0x041E,
-  afii10033: 0x041F,
-  afii10034: 0x0420,
-  afii10035: 0x0421,
-  afii10036: 0x0422,
-  afii10037: 0x0423,
-  afii10038: 0x0424,
-  afii10039: 0x0425,
-  afii10040: 0x0426,
-  afii10041: 0x0427,
-  afii10042: 0x0428,
-  afii10043: 0x0429,
-  afii10044: 0x042A,
-  afii10045: 0x042B,
-  afii10046: 0x042C,
-  afii10047: 0x042D,
-  afii10048: 0x042E,
-  afii10049: 0x042F,
-  afii10050: 0x0490,
-  afii10051: 0x0402,
-  afii10052: 0x0403,
-  afii10053: 0x0404,
-  afii10054: 0x0405,
-  afii10055: 0x0406,
-  afii10056: 0x0407,
-  afii10057: 0x0408,
-  afii10058: 0x0409,
-  afii10059: 0x040A,
-  afii10060: 0x040B,
-  afii10061: 0x040C,
-  afii10062: 0x040E,
-  afii10063: 0xF6C4,
-  afii10064: 0xF6C5,
-  afii10065: 0x0430,
-  afii10066: 0x0431,
-  afii10067: 0x0432,
-  afii10068: 0x0433,
-  afii10069: 0x0434,
-  afii10070: 0x0435,
-  afii10071: 0x0451,
-  afii10072: 0x0436,
-  afii10073: 0x0437,
-  afii10074: 0x0438,
-  afii10075: 0x0439,
-  afii10076: 0x043A,
-  afii10077: 0x043B,
-  afii10078: 0x043C,
-  afii10079: 0x043D,
-  afii10080: 0x043E,
-  afii10081: 0x043F,
-  afii10082: 0x0440,
-  afii10083: 0x0441,
-  afii10084: 0x0442,
-  afii10085: 0x0443,
-  afii10086: 0x0444,
-  afii10087: 0x0445,
-  afii10088: 0x0446,
-  afii10089: 0x0447,
-  afii10090: 0x0448,
-  afii10091: 0x0449,
-  afii10092: 0x044A,
-  afii10093: 0x044B,
-  afii10094: 0x044C,
-  afii10095: 0x044D,
-  afii10096: 0x044E,
-  afii10097: 0x044F,
-  afii10098: 0x0491,
-  afii10099: 0x0452,
-  afii10100: 0x0453,
-  afii10101: 0x0454,
-  afii10102: 0x0455,
-  afii10103: 0x0456,
-  afii10104: 0x0457,
-  afii10105: 0x0458,
-  afii10106: 0x0459,
-  afii10107: 0x045A,
-  afii10108: 0x045B,
-  afii10109: 0x045C,
-  afii10110: 0x045E,
-  afii10145: 0x040F,
-  afii10146: 0x0462,
-  afii10147: 0x0472,
-  afii10148: 0x0474,
-  afii10192: 0xF6C6,
-  afii10193: 0x045F,
-  afii10194: 0x0463,
-  afii10195: 0x0473,
-  afii10196: 0x0475,
-  afii10831: 0xF6C7,
-  afii10832: 0xF6C8,
-  afii10846: 0x04D9,
-  afii299: 0x200E,
-  afii300: 0x200F,
-  afii301: 0x200D,
-  afii57381: 0x066A,
-  afii57388: 0x060C,
-  afii57392: 0x0660,
-  afii57393: 0x0661,
-  afii57394: 0x0662,
-  afii57395: 0x0663,
-  afii57396: 0x0664,
-  afii57397: 0x0665,
-  afii57398: 0x0666,
-  afii57399: 0x0667,
-  afii57400: 0x0668,
-  afii57401: 0x0669,
-  afii57403: 0x061B,
-  afii57407: 0x061F,
-  afii57409: 0x0621,
-  afii57410: 0x0622,
-  afii57411: 0x0623,
-  afii57412: 0x0624,
-  afii57413: 0x0625,
-  afii57414: 0x0626,
-  afii57415: 0x0627,
-  afii57416: 0x0628,
-  afii57417: 0x0629,
-  afii57418: 0x062A,
-  afii57419: 0x062B,
-  afii57420: 0x062C,
-  afii57421: 0x062D,
-  afii57422: 0x062E,
-  afii57423: 0x062F,
-  afii57424: 0x0630,
-  afii57425: 0x0631,
-  afii57426: 0x0632,
-  afii57427: 0x0633,
-  afii57428: 0x0634,
-  afii57429: 0x0635,
-  afii57430: 0x0636,
-  afii57431: 0x0637,
-  afii57432: 0x0638,
-  afii57433: 0x0639,
-  afii57434: 0x063A,
-  afii57440: 0x0640,
-  afii57441: 0x0641,
-  afii57442: 0x0642,
-  afii57443: 0x0643,
-  afii57444: 0x0644,
-  afii57445: 0x0645,
-  afii57446: 0x0646,
-  afii57448: 0x0648,
-  afii57449: 0x0649,
-  afii57450: 0x064A,
-  afii57451: 0x064B,
-  afii57452: 0x064C,
-  afii57453: 0x064D,
-  afii57454: 0x064E,
-  afii57455: 0x064F,
-  afii57456: 0x0650,
-  afii57457: 0x0651,
-  afii57458: 0x0652,
-  afii57470: 0x0647,
-  afii57505: 0x06A4,
-  afii57506: 0x067E,
-  afii57507: 0x0686,
-  afii57508: 0x0698,
-  afii57509: 0x06AF,
-  afii57511: 0x0679,
-  afii57512: 0x0688,
-  afii57513: 0x0691,
-  afii57514: 0x06BA,
-  afii57519: 0x06D2,
-  afii57534: 0x06D5,
-  afii57636: 0x20AA,
-  afii57645: 0x05BE,
-  afii57658: 0x05C3,
-  afii57664: 0x05D0,
-  afii57665: 0x05D1,
-  afii57666: 0x05D2,
-  afii57667: 0x05D3,
-  afii57668: 0x05D4,
-  afii57669: 0x05D5,
-  afii57670: 0x05D6,
-  afii57671: 0x05D7,
-  afii57672: 0x05D8,
-  afii57673: 0x05D9,
-  afii57674: 0x05DA,
-  afii57675: 0x05DB,
-  afii57676: 0x05DC,
-  afii57677: 0x05DD,
-  afii57678: 0x05DE,
-  afii57679: 0x05DF,
-  afii57680: 0x05E0,
-  afii57681: 0x05E1,
-  afii57682: 0x05E2,
-  afii57683: 0x05E3,
-  afii57684: 0x05E4,
-  afii57685: 0x05E5,
-  afii57686: 0x05E6,
-  afii57687: 0x05E7,
-  afii57688: 0x05E8,
-  afii57689: 0x05E9,
-  afii57690: 0x05EA,
-  afii57694: 0xFB2A,
-  afii57695: 0xFB2B,
-  afii57700: 0xFB4B,
-  afii57705: 0xFB1F,
-  afii57716: 0x05F0,
-  afii57717: 0x05F1,
-  afii57718: 0x05F2,
-  afii57723: 0xFB35,
-  afii57793: 0x05B4,
-  afii57794: 0x05B5,
-  afii57795: 0x05B6,
-  afii57796: 0x05BB,
-  afii57797: 0x05B8,
-  afii57798: 0x05B7,
-  afii57799: 0x05B0,
-  afii57800: 0x05B2,
-  afii57801: 0x05B1,
-  afii57802: 0x05B3,
-  afii57803: 0x05C2,
-  afii57804: 0x05C1,
-  afii57806: 0x05B9,
-  afii57807: 0x05BC,
-  afii57839: 0x05BD,
-  afii57841: 0x05BF,
-  afii57842: 0x05C0,
-  afii57929: 0x02BC,
-  afii61248: 0x2105,
-  afii61289: 0x2113,
-  afii61352: 0x2116,
-  afii61573: 0x202C,
-  afii61574: 0x202D,
-  afii61575: 0x202E,
-  afii61664: 0x200C,
-  afii63167: 0x066D,
-  afii64937: 0x02BD,
-  agrave: 0x00E0,
-  agujarati: 0x0A85,
-  agurmukhi: 0x0A05,
-  ahiragana: 0x3042,
-  ahookabove: 0x1EA3,
-  aibengali: 0x0990,
-  aibopomofo: 0x311E,
-  aideva: 0x0910,
-  aiecyrillic: 0x04D5,
-  aigujarati: 0x0A90,
-  aigurmukhi: 0x0A10,
-  aimatragurmukhi: 0x0A48,
-  ainarabic: 0x0639,
-  ainfinalarabic: 0xFECA,
-  aininitialarabic: 0xFECB,
-  ainmedialarabic: 0xFECC,
-  ainvertedbreve: 0x0203,
-  aivowelsignbengali: 0x09C8,
-  aivowelsigndeva: 0x0948,
-  aivowelsigngujarati: 0x0AC8,
-  akatakana: 0x30A2,
-  akatakanahalfwidth: 0xFF71,
-  akorean: 0x314F,
-  alef: 0x05D0,
-  alefarabic: 0x0627,
-  alefdageshhebrew: 0xFB30,
-  aleffinalarabic: 0xFE8E,
-  alefhamzaabovearabic: 0x0623,
-  alefhamzaabovefinalarabic: 0xFE84,
-  alefhamzabelowarabic: 0x0625,
-  alefhamzabelowfinalarabic: 0xFE88,
-  alefhebrew: 0x05D0,
-  aleflamedhebrew: 0xFB4F,
-  alefmaddaabovearabic: 0x0622,
-  alefmaddaabovefinalarabic: 0xFE82,
-  alefmaksuraarabic: 0x0649,
-  alefmaksurafinalarabic: 0xFEF0,
-  alefmaksurainitialarabic: 0xFEF3,
-  alefmaksuramedialarabic: 0xFEF4,
-  alefpatahhebrew: 0xFB2E,
-  alefqamatshebrew: 0xFB2F,
-  aleph: 0x2135,
-  allequal: 0x224C,
-  alpha: 0x03B1,
-  alphatonos: 0x03AC,
-  amacron: 0x0101,
-  amonospace: 0xFF41,
-  ampersand: 0x0026,
-  ampersandmonospace: 0xFF06,
-  ampersandsmall: 0xF726,
-  amsquare: 0x33C2,
-  anbopomofo: 0x3122,
-  angbopomofo: 0x3124,
-  angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
-  angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
-  angkhankhuthai: 0x0E5A,
-  angle: 0x2220,
-  anglebracketleft: 0x3008,
-  anglebracketleftvertical: 0xFE3F,
-  anglebracketright: 0x3009,
-  anglebracketrightvertical: 0xFE40,
-  angleleft: 0x2329,
-  angleright: 0x232A,
-  angstrom: 0x212B,
-  anoteleia: 0x0387,
-  anudattadeva: 0x0952,
-  anusvarabengali: 0x0982,
-  anusvaradeva: 0x0902,
-  anusvaragujarati: 0x0A82,
-  aogonek: 0x0105,
-  apaatosquare: 0x3300,
-  aparen: 0x249C,
-  apostrophearmenian: 0x055A,
-  apostrophemod: 0x02BC,
-  apple: 0xF8FF,
-  approaches: 0x2250,
-  approxequal: 0x2248,
-  approxequalorimage: 0x2252,
-  approximatelyequal: 0x2245,
-  araeaekorean: 0x318E,
-  araeakorean: 0x318D,
-  arc: 0x2312,
-  arighthalfring: 0x1E9A,
-  aring: 0x00E5,
-  aringacute: 0x01FB,
-  aringbelow: 0x1E01,
-  arrowboth: 0x2194,
-  arrowdashdown: 0x21E3,
-  arrowdashleft: 0x21E0,
-  arrowdashright: 0x21E2,
-  arrowdashup: 0x21E1,
-  arrowdblboth: 0x21D4,
-  arrowdbldown: 0x21D3,
-  arrowdblleft: 0x21D0,
-  arrowdblright: 0x21D2,
-  arrowdblup: 0x21D1,
-  arrowdown: 0x2193,
-  arrowdownleft: 0x2199,
-  arrowdownright: 0x2198,
-  arrowdownwhite: 0x21E9,
-  arrowheaddownmod: 0x02C5,
-  arrowheadleftmod: 0x02C2,
-  arrowheadrightmod: 0x02C3,
-  arrowheadupmod: 0x02C4,
-  arrowhorizex: 0xF8E7,
-  arrowleft: 0x2190,
-  arrowleftdbl: 0x21D0,
-  arrowleftdblstroke: 0x21CD,
-  arrowleftoverright: 0x21C6,
-  arrowleftwhite: 0x21E6,
-  arrowright: 0x2192,
-  arrowrightdblstroke: 0x21CF,
-  arrowrightheavy: 0x279E,
-  arrowrightoverleft: 0x21C4,
-  arrowrightwhite: 0x21E8,
-  arrowtableft: 0x21E4,
-  arrowtabright: 0x21E5,
-  arrowup: 0x2191,
-  arrowupdn: 0x2195,
-  arrowupdnbse: 0x21A8,
-  arrowupdownbase: 0x21A8,
-  arrowupleft: 0x2196,
-  arrowupleftofdown: 0x21C5,
-  arrowupright: 0x2197,
-  arrowupwhite: 0x21E7,
-  arrowvertex: 0xF8E6,
-  asciicircum: 0x005E,
-  asciicircummonospace: 0xFF3E,
-  asciitilde: 0x007E,
-  asciitildemonospace: 0xFF5E,
-  ascript: 0x0251,
-  ascriptturned: 0x0252,
-  asmallhiragana: 0x3041,
-  asmallkatakana: 0x30A1,
-  asmallkatakanahalfwidth: 0xFF67,
-  asterisk: 0x002A,
-  asteriskaltonearabic: 0x066D,
-  asteriskarabic: 0x066D,
-  asteriskmath: 0x2217,
-  asteriskmonospace: 0xFF0A,
-  asterisksmall: 0xFE61,
-  asterism: 0x2042,
-  asuperior: 0xF6E9,
-  asymptoticallyequal: 0x2243,
-  at: 0x0040,
-  atilde: 0x00E3,
-  atmonospace: 0xFF20,
-  atsmall: 0xFE6B,
-  aturned: 0x0250,
-  aubengali: 0x0994,
-  aubopomofo: 0x3120,
-  audeva: 0x0914,
-  augujarati: 0x0A94,
-  augurmukhi: 0x0A14,
-  aulengthmarkbengali: 0x09D7,
-  aumatragurmukhi: 0x0A4C,
-  auvowelsignbengali: 0x09CC,
-  auvowelsigndeva: 0x094C,
-  auvowelsigngujarati: 0x0ACC,
-  avagrahadeva: 0x093D,
-  aybarmenian: 0x0561,
-  ayin: 0x05E2,
-  ayinaltonehebrew: 0xFB20,
-  ayinhebrew: 0x05E2,
-  b: 0x0062,
-  babengali: 0x09AC,
-  backslash: 0x005C,
-  backslashmonospace: 0xFF3C,
-  badeva: 0x092C,
-  bagujarati: 0x0AAC,
-  bagurmukhi: 0x0A2C,
-  bahiragana: 0x3070,
-  bahtthai: 0x0E3F,
-  bakatakana: 0x30D0,
-  bar: 0x007C,
-  barmonospace: 0xFF5C,
-  bbopomofo: 0x3105,
-  bcircle: 0x24D1,
-  bdotaccent: 0x1E03,
-  bdotbelow: 0x1E05,
-  beamedsixteenthnotes: 0x266C,
-  because: 0x2235,
-  becyrillic: 0x0431,
-  beharabic: 0x0628,
-  behfinalarabic: 0xFE90,
-  behinitialarabic: 0xFE91,
-  behiragana: 0x3079,
-  behmedialarabic: 0xFE92,
-  behmeeminitialarabic: 0xFC9F,
-  behmeemisolatedarabic: 0xFC08,
-  behnoonfinalarabic: 0xFC6D,
-  bekatakana: 0x30D9,
-  benarmenian: 0x0562,
-  bet: 0x05D1,
-  beta: 0x03B2,
-  betasymbolgreek: 0x03D0,
-  betdagesh: 0xFB31,
-  betdageshhebrew: 0xFB31,
-  bethebrew: 0x05D1,
-  betrafehebrew: 0xFB4C,
-  bhabengali: 0x09AD,
-  bhadeva: 0x092D,
-  bhagujarati: 0x0AAD,
-  bhagurmukhi: 0x0A2D,
-  bhook: 0x0253,
-  bihiragana: 0x3073,
-  bikatakana: 0x30D3,
-  bilabialclick: 0x0298,
-  bindigurmukhi: 0x0A02,
-  birusquare: 0x3331,
-  blackcircle: 0x25CF,
-  blackdiamond: 0x25C6,
-  blackdownpointingtriangle: 0x25BC,
-  blackleftpointingpointer: 0x25C4,
-  blackleftpointingtriangle: 0x25C0,
-  blacklenticularbracketleft: 0x3010,
-  blacklenticularbracketleftvertical: 0xFE3B,
-  blacklenticularbracketright: 0x3011,
-  blacklenticularbracketrightvertical: 0xFE3C,
-  blacklowerlefttriangle: 0x25E3,
-  blacklowerrighttriangle: 0x25E2,
-  blackrectangle: 0x25AC,
-  blackrightpointingpointer: 0x25BA,
-  blackrightpointingtriangle: 0x25B6,
-  blacksmallsquare: 0x25AA,
-  blacksmilingface: 0x263B,
-  blacksquare: 0x25A0,
-  blackstar: 0x2605,
-  blackupperlefttriangle: 0x25E4,
-  blackupperrighttriangle: 0x25E5,
-  blackuppointingsmalltriangle: 0x25B4,
-  blackuppointingtriangle: 0x25B2,
-  blank: 0x2423,
-  blinebelow: 0x1E07,
-  block: 0x2588,
-  bmonospace: 0xFF42,
-  bobaimaithai: 0x0E1A,
-  bohiragana: 0x307C,
-  bokatakana: 0x30DC,
-  bparen: 0x249D,
-  bqsquare: 0x33C3,
-  braceex: 0xF8F4,
-  braceleft: 0x007B,
-  braceleftbt: 0xF8F3,
-  braceleftmid: 0xF8F2,
-  braceleftmonospace: 0xFF5B,
-  braceleftsmall: 0xFE5B,
-  bracelefttp: 0xF8F1,
-  braceleftvertical: 0xFE37,
-  braceright: 0x007D,
-  bracerightbt: 0xF8FE,
-  bracerightmid: 0xF8FD,
-  bracerightmonospace: 0xFF5D,
-  bracerightsmall: 0xFE5C,
-  bracerighttp: 0xF8FC,
-  bracerightvertical: 0xFE38,
-  bracketleft: 0x005B,
-  bracketleftbt: 0xF8F0,
-  bracketleftex: 0xF8EF,
-  bracketleftmonospace: 0xFF3B,
-  bracketlefttp: 0xF8EE,
-  bracketright: 0x005D,
-  bracketrightbt: 0xF8FB,
-  bracketrightex: 0xF8FA,
-  bracketrightmonospace: 0xFF3D,
-  bracketrighttp: 0xF8F9,
-  breve: 0x02D8,
-  brevebelowcmb: 0x032E,
-  brevecmb: 0x0306,
-  breveinvertedbelowcmb: 0x032F,
-  breveinvertedcmb: 0x0311,
-  breveinverteddoublecmb: 0x0361,
-  bridgebelowcmb: 0x032A,
-  bridgeinvertedbelowcmb: 0x033A,
-  brokenbar: 0x00A6,
-  bstroke: 0x0180,
-  bsuperior: 0xF6EA,
-  btopbar: 0x0183,
-  buhiragana: 0x3076,
-  bukatakana: 0x30D6,
-  bullet: 0x2022,
-  bulletinverse: 0x25D8,
-  bulletoperator: 0x2219,
-  bullseye: 0x25CE,
-  c: 0x0063,
-  caarmenian: 0x056E,
-  cabengali: 0x099A,
-  cacute: 0x0107,
-  cadeva: 0x091A,
-  cagujarati: 0x0A9A,
-  cagurmukhi: 0x0A1A,
-  calsquare: 0x3388,
-  candrabindubengali: 0x0981,
-  candrabinducmb: 0x0310,
-  candrabindudeva: 0x0901,
-  candrabindugujarati: 0x0A81,
-  capslock: 0x21EA,
-  careof: 0x2105,
-  caron: 0x02C7,
-  caronbelowcmb: 0x032C,
-  caroncmb: 0x030C,
-  carriagereturn: 0x21B5,
-  cbopomofo: 0x3118,
-  ccaron: 0x010D,
-  ccedilla: 0x00E7,
-  ccedillaacute: 0x1E09,
-  ccircle: 0x24D2,
-  ccircumflex: 0x0109,
-  ccurl: 0x0255,
-  cdot: 0x010B,
-  cdotaccent: 0x010B,
-  cdsquare: 0x33C5,
-  cedilla: 0x00B8,
-  cedillacmb: 0x0327,
-  cent: 0x00A2,
-  centigrade: 0x2103,
-  centinferior: 0xF6DF,
-  centmonospace: 0xFFE0,
-  centoldstyle: 0xF7A2,
-  centsuperior: 0xF6E0,
-  chaarmenian: 0x0579,
-  chabengali: 0x099B,
-  chadeva: 0x091B,
-  chagujarati: 0x0A9B,
-  chagurmukhi: 0x0A1B,
-  chbopomofo: 0x3114,
-  cheabkhasiancyrillic: 0x04BD,
-  checkmark: 0x2713,
-  checyrillic: 0x0447,
-  chedescenderabkhasiancyrillic: 0x04BF,
-  chedescendercyrillic: 0x04B7,
-  chedieresiscyrillic: 0x04F5,
-  cheharmenian: 0x0573,
-  chekhakassiancyrillic: 0x04CC,
-  cheverticalstrokecyrillic: 0x04B9,
-  chi: 0x03C7,
-  chieuchacirclekorean: 0x3277,
-  chieuchaparenkorean: 0x3217,
-  chieuchcirclekorean: 0x3269,
-  chieuchkorean: 0x314A,
-  chieuchparenkorean: 0x3209,
-  chochangthai: 0x0E0A,
-  chochanthai: 0x0E08,
-  chochingthai: 0x0E09,
-  chochoethai: 0x0E0C,
-  chook: 0x0188,
-  cieucacirclekorean: 0x3276,
-  cieucaparenkorean: 0x3216,
-  cieuccirclekorean: 0x3268,
-  cieuckorean: 0x3148,
-  cieucparenkorean: 0x3208,
-  cieucuparenkorean: 0x321C,
-  circle: 0x25CB,
-  circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
-  circlemultiply: 0x2297,
-  circleot: 0x2299,
-  circleplus: 0x2295,
-  circlepostalmark: 0x3036,
-  circlewithlefthalfblack: 0x25D0,
-  circlewithrighthalfblack: 0x25D1,
-  circumflex: 0x02C6,
-  circumflexbelowcmb: 0x032D,
-  circumflexcmb: 0x0302,
-  clear: 0x2327,
-  clickalveolar: 0x01C2,
-  clickdental: 0x01C0,
-  clicklateral: 0x01C1,
-  clickretroflex: 0x01C3,
-  club: 0x2663,
-  clubsuitblack: 0x2663,
-  clubsuitwhite: 0x2667,
-  cmcubedsquare: 0x33A4,
-  cmonospace: 0xFF43,
-  cmsquaredsquare: 0x33A0,
-  coarmenian: 0x0581,
-  colon: 0x003A,
-  colonmonetary: 0x20A1,
-  colonmonospace: 0xFF1A,
-  colonsign: 0x20A1,
-  colonsmall: 0xFE55,
-  colontriangularhalfmod: 0x02D1,
-  colontriangularmod: 0x02D0,
-  comma: 0x002C,
-  commaabovecmb: 0x0313,
-  commaaboverightcmb: 0x0315,
-  commaaccent: 0xF6C3,
-  commaarabic: 0x060C,
-  commaarmenian: 0x055D,
-  commainferior: 0xF6E1,
-  commamonospace: 0xFF0C,
-  commareversedabovecmb: 0x0314,
-  commareversedmod: 0x02BD,
-  commasmall: 0xFE50,
-  commasuperior: 0xF6E2,
-  commaturnedabovecmb: 0x0312,
-  commaturnedmod: 0x02BB,
-  compass: 0x263C,
-  congruent: 0x2245,
-  contourintegral: 0x222E,
-  control: 0x2303,
-  controlACK: 0x0006,
-  controlBEL: 0x0007,
-  controlBS: 0x0008,
-  controlCAN: 0x0018,
-  controlCR: 0x000D,
-  controlDC1: 0x0011,
-  controlDC2: 0x0012,
-  controlDC3: 0x0013,
-  controlDC4: 0x0014,
-  controlDEL: 0x007F,
-  controlDLE: 0x0010,
-  controlEM: 0x0019,
-  controlENQ: 0x0005,
-  controlEOT: 0x0004,
-  controlESC: 0x001B,
-  controlETB: 0x0017,
-  controlETX: 0x0003,
-  controlFF: 0x000C,
-  controlFS: 0x001C,
-  controlGS: 0x001D,
-  controlHT: 0x0009,
-  controlLF: 0x000A,
-  controlNAK: 0x0015,
-  controlRS: 0x001E,
-  controlSI: 0x000F,
-  controlSO: 0x000E,
-  controlSOT: 0x0002,
-  controlSTX: 0x0001,
-  controlSUB: 0x001A,
-  controlSYN: 0x0016,
-  controlUS: 0x001F,
-  controlVT: 0x000B,
-  copyright: 0x00A9,
-  copyrightsans: 0xF8E9,
-  copyrightserif: 0xF6D9,
-  cornerbracketleft: 0x300C,
-  cornerbracketlefthalfwidth: 0xFF62,
-  cornerbracketleftvertical: 0xFE41,
-  cornerbracketright: 0x300D,
-  cornerbracketrighthalfwidth: 0xFF63,
-  cornerbracketrightvertical: 0xFE42,
-  corporationsquare: 0x337F,
-  cosquare: 0x33C7,
-  coverkgsquare: 0x33C6,
-  cparen: 0x249E,
-  cruzeiro: 0x20A2,
-  cstretched: 0x0297,
-  curlyand: 0x22CF,
-  curlyor: 0x22CE,
-  currency: 0x00A4,
-  cyrBreve: 0xF6D1,
-  cyrFlex: 0xF6D2,
-  cyrbreve: 0xF6D4,
-  cyrflex: 0xF6D5,
-  d: 0x0064,
-  daarmenian: 0x0564,
-  dabengali: 0x09A6,
-  dadarabic: 0x0636,
-  dadeva: 0x0926,
-  dadfinalarabic: 0xFEBE,
-  dadinitialarabic: 0xFEBF,
-  dadmedialarabic: 0xFEC0,
-  dagesh: 0x05BC,
-  dageshhebrew: 0x05BC,
-  dagger: 0x2020,
-  daggerdbl: 0x2021,
-  dagujarati: 0x0AA6,
-  dagurmukhi: 0x0A26,
-  dahiragana: 0x3060,
-  dakatakana: 0x30C0,
-  dalarabic: 0x062F,
-  dalet: 0x05D3,
-  daletdagesh: 0xFB33,
-  daletdageshhebrew: 0xFB33,
-  dalethebrew: 0x05D3,
-  dalfinalarabic: 0xFEAA,
-  dammaarabic: 0x064F,
-  dammalowarabic: 0x064F,
-  dammatanaltonearabic: 0x064C,
-  dammatanarabic: 0x064C,
-  danda: 0x0964,
-  dargahebrew: 0x05A7,
-  dargalefthebrew: 0x05A7,
-  dasiapneumatacyrilliccmb: 0x0485,
-  dblGrave: 0xF6D3,
-  dblanglebracketleft: 0x300A,
-  dblanglebracketleftvertical: 0xFE3D,
-  dblanglebracketright: 0x300B,
-  dblanglebracketrightvertical: 0xFE3E,
-  dblarchinvertedbelowcmb: 0x032B,
-  dblarrowleft: 0x21D4,
-  dblarrowright: 0x21D2,
-  dbldanda: 0x0965,
-  dblgrave: 0xF6D6,
-  dblgravecmb: 0x030F,
-  dblintegral: 0x222C,
-  dbllowline: 0x2017,
-  dbllowlinecmb: 0x0333,
-  dbloverlinecmb: 0x033F,
-  dblprimemod: 0x02BA,
-  dblverticalbar: 0x2016,
-  dblverticallineabovecmb: 0x030E,
-  dbopomofo: 0x3109,
-  dbsquare: 0x33C8,
-  dcaron: 0x010F,
-  dcedilla: 0x1E11,
-  dcircle: 0x24D3,
-  dcircumflexbelow: 0x1E13,
-  dcroat: 0x0111,
-  ddabengali: 0x09A1,
-  ddadeva: 0x0921,
-  ddagujarati: 0x0AA1,
-  ddagurmukhi: 0x0A21,
-  ddalarabic: 0x0688,
-  ddalfinalarabic: 0xFB89,
-  dddhadeva: 0x095C,
-  ddhabengali: 0x09A2,
-  ddhadeva: 0x0922,
-  ddhagujarati: 0x0AA2,
-  ddhagurmukhi: 0x0A22,
-  ddotaccent: 0x1E0B,
-  ddotbelow: 0x1E0D,
-  decimalseparatorarabic: 0x066B,
-  decimalseparatorpersian: 0x066B,
-  decyrillic: 0x0434,
-  degree: 0x00B0,
-  dehihebrew: 0x05AD,
-  dehiragana: 0x3067,
-  deicoptic: 0x03EF,
-  dekatakana: 0x30C7,
-  deleteleft: 0x232B,
-  deleteright: 0x2326,
-  delta: 0x03B4,
-  deltaturned: 0x018D,
-  denominatorminusonenumeratorbengali: 0x09F8,
-  dezh: 0x02A4,
-  dhabengali: 0x09A7,
-  dhadeva: 0x0927,
-  dhagujarati: 0x0AA7,
-  dhagurmukhi: 0x0A27,
-  dhook: 0x0257,
-  dialytikatonos: 0x0385,
-  dialytikatonoscmb: 0x0344,
-  diamond: 0x2666,
-  diamondsuitwhite: 0x2662,
-  dieresis: 0x00A8,
-  dieresisacute: 0xF6D7,
-  dieresisbelowcmb: 0x0324,
-  dieresiscmb: 0x0308,
-  dieresisgrave: 0xF6D8,
-  dieresistonos: 0x0385,
-  dihiragana: 0x3062,
-  dikatakana: 0x30C2,
-  dittomark: 0x3003,
-  divide: 0x00F7,
-  divides: 0x2223,
-  divisionslash: 0x2215,
-  djecyrillic: 0x0452,
-  dkshade: 0x2593,
-  dlinebelow: 0x1E0F,
-  dlsquare: 0x3397,
-  dmacron: 0x0111,
-  dmonospace: 0xFF44,
-  dnblock: 0x2584,
-  dochadathai: 0x0E0E,
-  dodekthai: 0x0E14,
-  dohiragana: 0x3069,
-  dokatakana: 0x30C9,
-  dollar: 0x0024,
-  dollarinferior: 0xF6E3,
-  dollarmonospace: 0xFF04,
-  dollaroldstyle: 0xF724,
-  dollarsmall: 0xFE69,
-  dollarsuperior: 0xF6E4,
-  dong: 0x20AB,
-  dorusquare: 0x3326,
-  dotaccent: 0x02D9,
-  dotaccentcmb: 0x0307,
-  dotbelowcmb: 0x0323,
-  dotbelowcomb: 0x0323,
-  dotkatakana: 0x30FB,
-  dotlessi: 0x0131,
-  dotlessj: 0xF6BE,
-  dotlessjstrokehook: 0x0284,
-  dotmath: 0x22C5,
-  dottedcircle: 0x25CC,
-  doubleyodpatah: 0xFB1F,
-  doubleyodpatahhebrew: 0xFB1F,
-  downtackbelowcmb: 0x031E,
-  downtackmod: 0x02D5,
-  dparen: 0x249F,
-  dsuperior: 0xF6EB,
-  dtail: 0x0256,
-  dtopbar: 0x018C,
-  duhiragana: 0x3065,
-  dukatakana: 0x30C5,
-  dz: 0x01F3,
-  dzaltone: 0x02A3,
-  dzcaron: 0x01C6,
-  dzcurl: 0x02A5,
-  dzeabkhasiancyrillic: 0x04E1,
-  dzecyrillic: 0x0455,
-  dzhecyrillic: 0x045F,
-  e: 0x0065,
-  eacute: 0x00E9,
-  earth: 0x2641,
-  ebengali: 0x098F,
-  ebopomofo: 0x311C,
-  ebreve: 0x0115,
-  ecandradeva: 0x090D,
-  ecandragujarati: 0x0A8D,
-  ecandravowelsigndeva: 0x0945,
-  ecandravowelsigngujarati: 0x0AC5,
-  ecaron: 0x011B,
-  ecedillabreve: 0x1E1D,
-  echarmenian: 0x0565,
-  echyiwnarmenian: 0x0587,
-  ecircle: 0x24D4,
-  ecircumflex: 0x00EA,
-  ecircumflexacute: 0x1EBF,
-  ecircumflexbelow: 0x1E19,
-  ecircumflexdotbelow: 0x1EC7,
-  ecircumflexgrave: 0x1EC1,
-  ecircumflexhookabove: 0x1EC3,
-  ecircumflextilde: 0x1EC5,
-  ecyrillic: 0x0454,
-  edblgrave: 0x0205,
-  edeva: 0x090F,
-  edieresis: 0x00EB,
-  edot: 0x0117,
-  edotaccent: 0x0117,
-  edotbelow: 0x1EB9,
-  eegurmukhi: 0x0A0F,
-  eematragurmukhi: 0x0A47,
-  efcyrillic: 0x0444,
-  egrave: 0x00E8,
-  egujarati: 0x0A8F,
-  eharmenian: 0x0567,
-  ehbopomofo: 0x311D,
-  ehiragana: 0x3048,
-  ehookabove: 0x1EBB,
-  eibopomofo: 0x311F,
-  eight: 0x0038,
-  eightarabic: 0x0668,
-  eightbengali: 0x09EE,
-  eightcircle: 0x2467,
-  eightcircleinversesansserif: 0x2791,
-  eightdeva: 0x096E,
-  eighteencircle: 0x2471,
-  eighteenparen: 0x2485,
-  eighteenperiod: 0x2499,
-  eightgujarati: 0x0AEE,
-  eightgurmukhi: 0x0A6E,
-  eighthackarabic: 0x0668,
-  eighthangzhou: 0x3028,
-  eighthnotebeamed: 0x266B,
-  eightideographicparen: 0x3227,
-  eightinferior: 0x2088,
-  eightmonospace: 0xFF18,
-  eightoldstyle: 0xF738,
-  eightparen: 0x247B,
-  eightperiod: 0x248F,
-  eightpersian: 0x06F8,
-  eightroman: 0x2177,
-  eightsuperior: 0x2078,
-  eightthai: 0x0E58,
-  einvertedbreve: 0x0207,
-  eiotifiedcyrillic: 0x0465,
-  ekatakana: 0x30A8,
-  ekatakanahalfwidth: 0xFF74,
-  ekonkargurmukhi: 0x0A74,
-  ekorean: 0x3154,
-  elcyrillic: 0x043B,
-  element: 0x2208,
-  elevencircle: 0x246A,
-  elevenparen: 0x247E,
-  elevenperiod: 0x2492,
-  elevenroman: 0x217A,
-  ellipsis: 0x2026,
-  ellipsisvertical: 0x22EE,
-  emacron: 0x0113,
-  emacronacute: 0x1E17,
-  emacrongrave: 0x1E15,
-  emcyrillic: 0x043C,
-  emdash: 0x2014,
-  emdashvertical: 0xFE31,
-  emonospace: 0xFF45,
-  emphasismarkarmenian: 0x055B,
-  emptyset: 0x2205,
-  enbopomofo: 0x3123,
-  encyrillic: 0x043D,
-  endash: 0x2013,
-  endashvertical: 0xFE32,
-  endescendercyrillic: 0x04A3,
-  eng: 0x014B,
-  engbopomofo: 0x3125,
-  enghecyrillic: 0x04A5,
-  enhookcyrillic: 0x04C8,
-  enspace: 0x2002,
-  eogonek: 0x0119,
-  eokorean: 0x3153,
-  eopen: 0x025B,
-  eopenclosed: 0x029A,
-  eopenreversed: 0x025C,
-  eopenreversedclosed: 0x025E,
-  eopenreversedhook: 0x025D,
-  eparen: 0x24A0,
-  epsilon: 0x03B5,
-  epsilontonos: 0x03AD,
-  equal: 0x003D,
-  equalmonospace: 0xFF1D,
-  equalsmall: 0xFE66,
-  equalsuperior: 0x207C,
-  equivalence: 0x2261,
-  erbopomofo: 0x3126,
-  ercyrillic: 0x0440,
-  ereversed: 0x0258,
-  ereversedcyrillic: 0x044D,
-  escyrillic: 0x0441,
-  esdescendercyrillic: 0x04AB,
-  esh: 0x0283,
-  eshcurl: 0x0286,
-  eshortdeva: 0x090E,
-  eshortvowelsigndeva: 0x0946,
-  eshreversedloop: 0x01AA,
-  eshsquatreversed: 0x0285,
-  esmallhiragana: 0x3047,
-  esmallkatakana: 0x30A7,
-  esmallkatakanahalfwidth: 0xFF6A,
-  estimated: 0x212E,
-  esuperior: 0xF6EC,
-  eta: 0x03B7,
-  etarmenian: 0x0568,
-  etatonos: 0x03AE,
-  eth: 0x00F0,
-  etilde: 0x1EBD,
-  etildebelow: 0x1E1B,
-  etnahtafoukhhebrew: 0x0591,
-  etnahtafoukhlefthebrew: 0x0591,
-  etnahtahebrew: 0x0591,
-  etnahtalefthebrew: 0x0591,
-  eturned: 0x01DD,
-  eukorean: 0x3161,
-  euro: 0x20AC,
-  evowelsignbengali: 0x09C7,
-  evowelsigndeva: 0x0947,
-  evowelsigngujarati: 0x0AC7,
-  exclam: 0x0021,
-  exclamarmenian: 0x055C,
-  exclamdbl: 0x203C,
-  exclamdown: 0x00A1,
-  exclamdownsmall: 0xF7A1,
-  exclammonospace: 0xFF01,
-  exclamsmall: 0xF721,
-  existential: 0x2203,
-  ezh: 0x0292,
-  ezhcaron: 0x01EF,
-  ezhcurl: 0x0293,
-  ezhreversed: 0x01B9,
-  ezhtail: 0x01BA,
-  f: 0x0066,
-  fadeva: 0x095E,
-  fagurmukhi: 0x0A5E,
-  fahrenheit: 0x2109,
-  fathaarabic: 0x064E,
-  fathalowarabic: 0x064E,
-  fathatanarabic: 0x064B,
-  fbopomofo: 0x3108,
-  fcircle: 0x24D5,
-  fdotaccent: 0x1E1F,
-  feharabic: 0x0641,
-  feharmenian: 0x0586,
-  fehfinalarabic: 0xFED2,
-  fehinitialarabic: 0xFED3,
-  fehmedialarabic: 0xFED4,
-  feicoptic: 0x03E5,
-  female: 0x2640,
-  ff: 0xFB00,
-  ffi: 0xFB03,
-  ffl: 0xFB04,
-  fi: 0xFB01,
-  fifteencircle: 0x246E,
-  fifteenparen: 0x2482,
-  fifteenperiod: 0x2496,
-  figuredash: 0x2012,
-  filledbox: 0x25A0,
-  filledrect: 0x25AC,
-  finalkaf: 0x05DA,
-  finalkafdagesh: 0xFB3A,
-  finalkafdageshhebrew: 0xFB3A,
-  finalkafhebrew: 0x05DA,
-  finalmem: 0x05DD,
-  finalmemhebrew: 0x05DD,
-  finalnun: 0x05DF,
-  finalnunhebrew: 0x05DF,
-  finalpe: 0x05E3,
-  finalpehebrew: 0x05E3,
-  finaltsadi: 0x05E5,
-  finaltsadihebrew: 0x05E5,
-  firsttonechinese: 0x02C9,
-  fisheye: 0x25C9,
-  fitacyrillic: 0x0473,
-  five: 0x0035,
-  fivearabic: 0x0665,
-  fivebengali: 0x09EB,
-  fivecircle: 0x2464,
-  fivecircleinversesansserif: 0x278E,
-  fivedeva: 0x096B,
-  fiveeighths: 0x215D,
-  fivegujarati: 0x0AEB,
-  fivegurmukhi: 0x0A6B,
-  fivehackarabic: 0x0665,
-  fivehangzhou: 0x3025,
-  fiveideographicparen: 0x3224,
-  fiveinferior: 0x2085,
-  fivemonospace: 0xFF15,
-  fiveoldstyle: 0xF735,
-  fiveparen: 0x2478,
-  fiveperiod: 0x248C,
-  fivepersian: 0x06F5,
-  fiveroman: 0x2174,
-  fivesuperior: 0x2075,
-  fivethai: 0x0E55,
-  fl: 0xFB02,
-  florin: 0x0192,
-  fmonospace: 0xFF46,
-  fmsquare: 0x3399,
-  fofanthai: 0x0E1F,
-  fofathai: 0x0E1D,
-  fongmanthai: 0x0E4F,
-  forall: 0x2200,
-  four: 0x0034,
-  fourarabic: 0x0664,
-  fourbengali: 0x09EA,
-  fourcircle: 0x2463,
-  fourcircleinversesansserif: 0x278D,
-  fourdeva: 0x096A,
-  fourgujarati: 0x0AEA,
-  fourgurmukhi: 0x0A6A,
-  fourhackarabic: 0x0664,
-  fourhangzhou: 0x3024,
-  fourideographicparen: 0x3223,
-  fourinferior: 0x2084,
-  fourmonospace: 0xFF14,
-  fournumeratorbengali: 0x09F7,
-  fouroldstyle: 0xF734,
-  fourparen: 0x2477,
-  fourperiod: 0x248B,
-  fourpersian: 0x06F4,
-  fourroman: 0x2173,
-  foursuperior: 0x2074,
-  fourteencircle: 0x246D,
-  fourteenparen: 0x2481,
-  fourteenperiod: 0x2495,
-  fourthai: 0x0E54,
-  fourthtonechinese: 0x02CB,
-  fparen: 0x24A1,
-  fraction: 0x2044,
-  franc: 0x20A3,
-  g: 0x0067,
-  gabengali: 0x0997,
-  gacute: 0x01F5,
-  gadeva: 0x0917,
-  gafarabic: 0x06AF,
-  gaffinalarabic: 0xFB93,
-  gafinitialarabic: 0xFB94,
-  gafmedialarabic: 0xFB95,
-  gagujarati: 0x0A97,
-  gagurmukhi: 0x0A17,
-  gahiragana: 0x304C,
-  gakatakana: 0x30AC,
-  gamma: 0x03B3,
-  gammalatinsmall: 0x0263,
-  gammasuperior: 0x02E0,
-  gangiacoptic: 0x03EB,
-  gbopomofo: 0x310D,
-  gbreve: 0x011F,
-  gcaron: 0x01E7,
-  gcedilla: 0x0123,
-  gcircle: 0x24D6,
-  gcircumflex: 0x011D,
-  gcommaaccent: 0x0123,
-  gdot: 0x0121,
-  gdotaccent: 0x0121,
-  gecyrillic: 0x0433,
-  gehiragana: 0x3052,
-  gekatakana: 0x30B2,
-  geometricallyequal: 0x2251,
-  gereshaccenthebrew: 0x059C,
-  gereshhebrew: 0x05F3,
-  gereshmuqdamhebrew: 0x059D,
-  germandbls: 0x00DF,
-  gershayimaccenthebrew: 0x059E,
-  gershayimhebrew: 0x05F4,
-  getamark: 0x3013,
-  ghabengali: 0x0998,
-  ghadarmenian: 0x0572,
-  ghadeva: 0x0918,
-  ghagujarati: 0x0A98,
-  ghagurmukhi: 0x0A18,
-  ghainarabic: 0x063A,
-  ghainfinalarabic: 0xFECE,
-  ghaininitialarabic: 0xFECF,
-  ghainmedialarabic: 0xFED0,
-  ghemiddlehookcyrillic: 0x0495,
-  ghestrokecyrillic: 0x0493,
-  gheupturncyrillic: 0x0491,
-  ghhadeva: 0x095A,
-  ghhagurmukhi: 0x0A5A,
-  ghook: 0x0260,
-  ghzsquare: 0x3393,
-  gihiragana: 0x304E,
-  gikatakana: 0x30AE,
-  gimarmenian: 0x0563,
-  gimel: 0x05D2,
-  gimeldagesh: 0xFB32,
-  gimeldageshhebrew: 0xFB32,
-  gimelhebrew: 0x05D2,
-  gjecyrillic: 0x0453,
-  glottalinvertedstroke: 0x01BE,
-  glottalstop: 0x0294,
-  glottalstopinverted: 0x0296,
-  glottalstopmod: 0x02C0,
-  glottalstopreversed: 0x0295,
-  glottalstopreversedmod: 0x02C1,
-  glottalstopreversedsuperior: 0x02E4,
-  glottalstopstroke: 0x02A1,
-  glottalstopstrokereversed: 0x02A2,
-  gmacron: 0x1E21,
-  gmonospace: 0xFF47,
-  gohiragana: 0x3054,
-  gokatakana: 0x30B4,
-  gparen: 0x24A2,
-  gpasquare: 0x33AC,
-  gradient: 0x2207,
-  grave: 0x0060,
-  gravebelowcmb: 0x0316,
-  gravecmb: 0x0300,
-  gravecomb: 0x0300,
-  gravedeva: 0x0953,
-  gravelowmod: 0x02CE,
-  gravemonospace: 0xFF40,
-  gravetonecmb: 0x0340,
-  greater: 0x003E,
-  greaterequal: 0x2265,
-  greaterequalorless: 0x22DB,
-  greatermonospace: 0xFF1E,
-  greaterorequivalent: 0x2273,
-  greaterorless: 0x2277,
-  greateroverequal: 0x2267,
-  greatersmall: 0xFE65,
-  gscript: 0x0261,
-  gstroke: 0x01E5,
-  guhiragana: 0x3050,
-  guillemotleft: 0x00AB,
-  guillemotright: 0x00BB,
-  guilsinglleft: 0x2039,
-  guilsinglright: 0x203A,
-  gukatakana: 0x30B0,
-  guramusquare: 0x3318,
-  gysquare: 0x33C9,
-  h: 0x0068,
-  haabkhasiancyrillic: 0x04A9,
-  haaltonearabic: 0x06C1,
-  habengali: 0x09B9,
-  hadescendercyrillic: 0x04B3,
-  hadeva: 0x0939,
-  hagujarati: 0x0AB9,
-  hagurmukhi: 0x0A39,
-  haharabic: 0x062D,
-  hahfinalarabic: 0xFEA2,
-  hahinitialarabic: 0xFEA3,
-  hahiragana: 0x306F,
-  hahmedialarabic: 0xFEA4,
-  haitusquare: 0x332A,
-  hakatakana: 0x30CF,
-  hakatakanahalfwidth: 0xFF8A,
-  halantgurmukhi: 0x0A4D,
-  hamzaarabic: 0x0621,
-  hamzalowarabic: 0x0621,
-  hangulfiller: 0x3164,
-  hardsigncyrillic: 0x044A,
-  harpoonleftbarbup: 0x21BC,
-  harpoonrightbarbup: 0x21C0,
-  hasquare: 0x33CA,
-  hatafpatah: 0x05B2,
-  hatafpatah16: 0x05B2,
-  hatafpatah23: 0x05B2,
-  hatafpatah2f: 0x05B2,
-  hatafpatahhebrew: 0x05B2,
-  hatafpatahnarrowhebrew: 0x05B2,
-  hatafpatahquarterhebrew: 0x05B2,
-  hatafpatahwidehebrew: 0x05B2,
-  hatafqamats: 0x05B3,
-  hatafqamats1b: 0x05B3,
-  hatafqamats28: 0x05B3,
-  hatafqamats34: 0x05B3,
-  hatafqamatshebrew: 0x05B3,
-  hatafqamatsnarrowhebrew: 0x05B3,
-  hatafqamatsquarterhebrew: 0x05B3,
-  hatafqamatswidehebrew: 0x05B3,
-  hatafsegol: 0x05B1,
-  hatafsegol17: 0x05B1,
-  hatafsegol24: 0x05B1,
-  hatafsegol30: 0x05B1,
-  hatafsegolhebrew: 0x05B1,
-  hatafsegolnarrowhebrew: 0x05B1,
-  hatafsegolquarterhebrew: 0x05B1,
-  hatafsegolwidehebrew: 0x05B1,
-  hbar: 0x0127,
-  hbopomofo: 0x310F,
-  hbrevebelow: 0x1E2B,
-  hcedilla: 0x1E29,
-  hcircle: 0x24D7,
-  hcircumflex: 0x0125,
-  hdieresis: 0x1E27,
-  hdotaccent: 0x1E23,
-  hdotbelow: 0x1E25,
-  he: 0x05D4,
-  heart: 0x2665,
-  heartsuitblack: 0x2665,
-  heartsuitwhite: 0x2661,
-  hedagesh: 0xFB34,
-  hedageshhebrew: 0xFB34,
-  hehaltonearabic: 0x06C1,
-  heharabic: 0x0647,
-  hehebrew: 0x05D4,
-  hehfinalaltonearabic: 0xFBA7,
-  hehfinalalttwoarabic: 0xFEEA,
-  hehfinalarabic: 0xFEEA,
-  hehhamzaabovefinalarabic: 0xFBA5,
-  hehhamzaaboveisolatedarabic: 0xFBA4,
-  hehinitialaltonearabic: 0xFBA8,
-  hehinitialarabic: 0xFEEB,
-  hehiragana: 0x3078,
-  hehmedialaltonearabic: 0xFBA9,
-  hehmedialarabic: 0xFEEC,
-  heiseierasquare: 0x337B,
-  hekatakana: 0x30D8,
-  hekatakanahalfwidth: 0xFF8D,
-  hekutaarusquare: 0x3336,
-  henghook: 0x0267,
-  herutusquare: 0x3339,
-  het: 0x05D7,
-  hethebrew: 0x05D7,
-  hhook: 0x0266,
-  hhooksuperior: 0x02B1,
-  hieuhacirclekorean: 0x327B,
-  hieuhaparenkorean: 0x321B,
-  hieuhcirclekorean: 0x326D,
-  hieuhkorean: 0x314E,
-  hieuhparenkorean: 0x320D,
-  hihiragana: 0x3072,
-  hikatakana: 0x30D2,
-  hikatakanahalfwidth: 0xFF8B,
-  hiriq: 0x05B4,
-  hiriq14: 0x05B4,
-  hiriq21: 0x05B4,
-  hiriq2d: 0x05B4,
-  hiriqhebrew: 0x05B4,
-  hiriqnarrowhebrew: 0x05B4,
-  hiriqquarterhebrew: 0x05B4,
-  hiriqwidehebrew: 0x05B4,
-  hlinebelow: 0x1E96,
-  hmonospace: 0xFF48,
-  hoarmenian: 0x0570,
-  hohipthai: 0x0E2B,
-  hohiragana: 0x307B,
-  hokatakana: 0x30DB,
-  hokatakanahalfwidth: 0xFF8E,
-  holam: 0x05B9,
-  holam19: 0x05B9,
-  holam26: 0x05B9,
-  holam32: 0x05B9,
-  holamhebrew: 0x05B9,
-  holamnarrowhebrew: 0x05B9,
-  holamquarterhebrew: 0x05B9,
-  holamwidehebrew: 0x05B9,
-  honokhukthai: 0x0E2E,
-  hookabovecomb: 0x0309,
-  hookcmb: 0x0309,
-  hookpalatalizedbelowcmb: 0x0321,
-  hookretroflexbelowcmb: 0x0322,
-  hoonsquare: 0x3342,
-  horicoptic: 0x03E9,
-  horizontalbar: 0x2015,
-  horncmb: 0x031B,
-  hotsprings: 0x2668,
-  house: 0x2302,
-  hparen: 0x24A3,
-  hsuperior: 0x02B0,
-  hturned: 0x0265,
-  huhiragana: 0x3075,
-  huiitosquare: 0x3333,
-  hukatakana: 0x30D5,
-  hukatakanahalfwidth: 0xFF8C,
-  hungarumlaut: 0x02DD,
-  hungarumlautcmb: 0x030B,
-  hv: 0x0195,
-  hyphen: 0x002D,
-  hypheninferior: 0xF6E5,
-  hyphenmonospace: 0xFF0D,
-  hyphensmall: 0xFE63,
-  hyphensuperior: 0xF6E6,
-  hyphentwo: 0x2010,
-  i: 0x0069,
-  iacute: 0x00ED,
-  iacyrillic: 0x044F,
-  ibengali: 0x0987,
-  ibopomofo: 0x3127,
-  ibreve: 0x012D,
-  icaron: 0x01D0,
-  icircle: 0x24D8,
-  icircumflex: 0x00EE,
-  icyrillic: 0x0456,
-  idblgrave: 0x0209,
-  ideographearthcircle: 0x328F,
-  ideographfirecircle: 0x328B,
-  ideographicallianceparen: 0x323F,
-  ideographiccallparen: 0x323A,
-  ideographiccentrecircle: 0x32A5,
-  ideographicclose: 0x3006,
-  ideographiccomma: 0x3001,
-  ideographiccommaleft: 0xFF64,
-  ideographiccongratulationparen: 0x3237,
-  ideographiccorrectcircle: 0x32A3,
-  ideographicearthparen: 0x322F,
-  ideographicenterpriseparen: 0x323D,
-  ideographicexcellentcircle: 0x329D,
-  ideographicfestivalparen: 0x3240,
-  ideographicfinancialcircle: 0x3296,
-  ideographicfinancialparen: 0x3236,
-  ideographicfireparen: 0x322B,
-  ideographichaveparen: 0x3232,
-  ideographichighcircle: 0x32A4,
-  ideographiciterationmark: 0x3005,
-  ideographiclaborcircle: 0x3298,
-  ideographiclaborparen: 0x3238,
-  ideographicleftcircle: 0x32A7,
-  ideographiclowcircle: 0x32A6,
-  ideographicmedicinecircle: 0x32A9,
-  ideographicmetalparen: 0x322E,
-  ideographicmoonparen: 0x322A,
-  ideographicnameparen: 0x3234,
-  ideographicperiod: 0x3002,
-  ideographicprintcircle: 0x329E,
-  ideographicreachparen: 0x3243,
-  ideographicrepresentparen: 0x3239,
-  ideographicresourceparen: 0x323E,
-  ideographicrightcircle: 0x32A8,
-  ideographicsecretcircle: 0x3299,
-  ideographicselfparen: 0x3242,
-  ideographicsocietyparen: 0x3233,
-  ideographicspace: 0x3000,
-  ideographicspecialparen: 0x3235,
-  ideographicstockparen: 0x3231,
-  ideographicstudyparen: 0x323B,
-  ideographicsunparen: 0x3230,
-  ideographicsuperviseparen: 0x323C,
-  ideographicwaterparen: 0x322C,
-  ideographicwoodparen: 0x322D,
-  ideographiczero: 0x3007,
-  ideographmetalcircle: 0x328E,
-  ideographmooncircle: 0x328A,
-  ideographnamecircle: 0x3294,
-  ideographsuncircle: 0x3290,
-  ideographwatercircle: 0x328C,
-  ideographwoodcircle: 0x328D,
-  ideva: 0x0907,
-  idieresis: 0x00EF,
-  idieresisacute: 0x1E2F,
-  idieresiscyrillic: 0x04E5,
-  idotbelow: 0x1ECB,
-  iebrevecyrillic: 0x04D7,
-  iecyrillic: 0x0435,
-  ieungacirclekorean: 0x3275,
-  ieungaparenkorean: 0x3215,
-  ieungcirclekorean: 0x3267,
-  ieungkorean: 0x3147,
-  ieungparenkorean: 0x3207,
-  igrave: 0x00EC,
-  igujarati: 0x0A87,
-  igurmukhi: 0x0A07,
-  ihiragana: 0x3044,
-  ihookabove: 0x1EC9,
-  iibengali: 0x0988,
-  iicyrillic: 0x0438,
-  iideva: 0x0908,
-  iigujarati: 0x0A88,
-  iigurmukhi: 0x0A08,
-  iimatragurmukhi: 0x0A40,
-  iinvertedbreve: 0x020B,
-  iishortcyrillic: 0x0439,
-  iivowelsignbengali: 0x09C0,
-  iivowelsigndeva: 0x0940,
-  iivowelsigngujarati: 0x0AC0,
-  ij: 0x0133,
-  ikatakana: 0x30A4,
-  ikatakanahalfwidth: 0xFF72,
-  ikorean: 0x3163,
-  ilde: 0x02DC,
-  iluyhebrew: 0x05AC,
-  imacron: 0x012B,
-  imacroncyrillic: 0x04E3,
-  imageorapproximatelyequal: 0x2253,
-  imatragurmukhi: 0x0A3F,
-  imonospace: 0xFF49,
-  increment: 0x2206,
-  infinity: 0x221E,
-  iniarmenian: 0x056B,
-  integral: 0x222B,
-  integralbottom: 0x2321,
-  integralbt: 0x2321,
-  integralex: 0xF8F5,
-  integraltop: 0x2320,
-  integraltp: 0x2320,
-  intersection: 0x2229,
-  intisquare: 0x3305,
-  invbullet: 0x25D8,
-  invcircle: 0x25D9,
-  invsmileface: 0x263B,
-  iocyrillic: 0x0451,
-  iogonek: 0x012F,
-  iota: 0x03B9,
-  iotadieresis: 0x03CA,
-  iotadieresistonos: 0x0390,
-  iotalatin: 0x0269,
-  iotatonos: 0x03AF,
-  iparen: 0x24A4,
-  irigurmukhi: 0x0A72,
-  ismallhiragana: 0x3043,
-  ismallkatakana: 0x30A3,
-  ismallkatakanahalfwidth: 0xFF68,
-  issharbengali: 0x09FA,
-  istroke: 0x0268,
-  isuperior: 0xF6ED,
-  iterationhiragana: 0x309D,
-  iterationkatakana: 0x30FD,
-  itilde: 0x0129,
-  itildebelow: 0x1E2D,
-  iubopomofo: 0x3129,
-  iucyrillic: 0x044E,
-  ivowelsignbengali: 0x09BF,
-  ivowelsigndeva: 0x093F,
-  ivowelsigngujarati: 0x0ABF,
-  izhitsacyrillic: 0x0475,
-  izhitsadblgravecyrillic: 0x0477,
-  j: 0x006A,
-  jaarmenian: 0x0571,
-  jabengali: 0x099C,
-  jadeva: 0x091C,
-  jagujarati: 0x0A9C,
-  jagurmukhi: 0x0A1C,
-  jbopomofo: 0x3110,
-  jcaron: 0x01F0,
-  jcircle: 0x24D9,
-  jcircumflex: 0x0135,
-  jcrossedtail: 0x029D,
-  jdotlessstroke: 0x025F,
-  jecyrillic: 0x0458,
-  jeemarabic: 0x062C,
-  jeemfinalarabic: 0xFE9E,
-  jeeminitialarabic: 0xFE9F,
-  jeemmedialarabic: 0xFEA0,
-  jeharabic: 0x0698,
-  jehfinalarabic: 0xFB8B,
-  jhabengali: 0x099D,
-  jhadeva: 0x091D,
-  jhagujarati: 0x0A9D,
-  jhagurmukhi: 0x0A1D,
-  jheharmenian: 0x057B,
-  jis: 0x3004,
-  jmonospace: 0xFF4A,
-  jparen: 0x24A5,
-  jsuperior: 0x02B2,
-  k: 0x006B,
-  kabashkircyrillic: 0x04A1,
-  kabengali: 0x0995,
-  kacute: 0x1E31,
-  kacyrillic: 0x043A,
-  kadescendercyrillic: 0x049B,
-  kadeva: 0x0915,
-  kaf: 0x05DB,
-  kafarabic: 0x0643,
-  kafdagesh: 0xFB3B,
-  kafdageshhebrew: 0xFB3B,
-  kaffinalarabic: 0xFEDA,
-  kafhebrew: 0x05DB,
-  kafinitialarabic: 0xFEDB,
-  kafmedialarabic: 0xFEDC,
-  kafrafehebrew: 0xFB4D,
-  kagujarati: 0x0A95,
-  kagurmukhi: 0x0A15,
-  kahiragana: 0x304B,
-  kahookcyrillic: 0x04C4,
-  kakatakana: 0x30AB,
-  kakatakanahalfwidth: 0xFF76,
-  kappa: 0x03BA,
-  kappasymbolgreek: 0x03F0,
-  kapyeounmieumkorean: 0x3171,
-  kapyeounphieuphkorean: 0x3184,
-  kapyeounpieupkorean: 0x3178,
-  kapyeounssangpieupkorean: 0x3179,
-  karoriisquare: 0x330D,
-  kashidaautoarabic: 0x0640,
-  kashidaautonosidebearingarabic: 0x0640,
-  kasmallkatakana: 0x30F5,
-  kasquare: 0x3384,
-  kasraarabic: 0x0650,
-  kasratanarabic: 0x064D,
-  kastrokecyrillic: 0x049F,
-  katahiraprolongmarkhalfwidth: 0xFF70,
-  kaverticalstrokecyrillic: 0x049D,
-  kbopomofo: 0x310E,
-  kcalsquare: 0x3389,
-  kcaron: 0x01E9,
-  kcedilla: 0x0137,
-  kcircle: 0x24DA,
-  kcommaaccent: 0x0137,
-  kdotbelow: 0x1E33,
-  keharmenian: 0x0584,
-  kehiragana: 0x3051,
-  kekatakana: 0x30B1,
-  kekatakanahalfwidth: 0xFF79,
-  kenarmenian: 0x056F,
-  kesmallkatakana: 0x30F6,
-  kgreenlandic: 0x0138,
-  khabengali: 0x0996,
-  khacyrillic: 0x0445,
-  khadeva: 0x0916,
-  khagujarati: 0x0A96,
-  khagurmukhi: 0x0A16,
-  khaharabic: 0x062E,
-  khahfinalarabic: 0xFEA6,
-  khahinitialarabic: 0xFEA7,
-  khahmedialarabic: 0xFEA8,
-  kheicoptic: 0x03E7,
-  khhadeva: 0x0959,
-  khhagurmukhi: 0x0A59,
-  khieukhacirclekorean: 0x3278,
-  khieukhaparenkorean: 0x3218,
-  khieukhcirclekorean: 0x326A,
-  khieukhkorean: 0x314B,
-  khieukhparenkorean: 0x320A,
-  khokhaithai: 0x0E02,
-  khokhonthai: 0x0E05,
-  khokhuatthai: 0x0E03,
-  khokhwaithai: 0x0E04,
-  khomutthai: 0x0E5B,
-  khook: 0x0199,
-  khorakhangthai: 0x0E06,
-  khzsquare: 0x3391,
-  kihiragana: 0x304D,
-  kikatakana: 0x30AD,
-  kikatakanahalfwidth: 0xFF77,
-  kiroguramusquare: 0x3315,
-  kiromeetorusquare: 0x3316,
-  kirosquare: 0x3314,
-  kiyeokacirclekorean: 0x326E,
-  kiyeokaparenkorean: 0x320E,
-  kiyeokcirclekorean: 0x3260,
-  kiyeokkorean: 0x3131,
-  kiyeokparenkorean: 0x3200,
-  kiyeoksioskorean: 0x3133,
-  kjecyrillic: 0x045C,
-  klinebelow: 0x1E35,
-  klsquare: 0x3398,
-  kmcubedsquare: 0x33A6,
-  kmonospace: 0xFF4B,
-  kmsquaredsquare: 0x33A2,
-  kohiragana: 0x3053,
-  kohmsquare: 0x33C0,
-  kokaithai: 0x0E01,
-  kokatakana: 0x30B3,
-  kokatakanahalfwidth: 0xFF7A,
-  kooposquare: 0x331E,
-  koppacyrillic: 0x0481,
-  koreanstandardsymbol: 0x327F,
-  koroniscmb: 0x0343,
-  kparen: 0x24A6,
-  kpasquare: 0x33AA,
-  ksicyrillic: 0x046F,
-  ktsquare: 0x33CF,
-  kturned: 0x029E,
-  kuhiragana: 0x304F,
-  kukatakana: 0x30AF,
-  kukatakanahalfwidth: 0xFF78,
-  kvsquare: 0x33B8,
-  kwsquare: 0x33BE,
-  l: 0x006C,
-  labengali: 0x09B2,
-  lacute: 0x013A,
-  ladeva: 0x0932,
-  lagujarati: 0x0AB2,
-  lagurmukhi: 0x0A32,
-  lakkhangyaothai: 0x0E45,
-  lamaleffinalarabic: 0xFEFC,
-  lamalefhamzaabovefinalarabic: 0xFEF8,
-  lamalefhamzaaboveisolatedarabic: 0xFEF7,
-  lamalefhamzabelowfinalarabic: 0xFEFA,
-  lamalefhamzabelowisolatedarabic: 0xFEF9,
-  lamalefisolatedarabic: 0xFEFB,
-  lamalefmaddaabovefinalarabic: 0xFEF6,
-  lamalefmaddaaboveisolatedarabic: 0xFEF5,
-  lamarabic: 0x0644,
-  lambda: 0x03BB,
-  lambdastroke: 0x019B,
-  lamed: 0x05DC,
-  lameddagesh: 0xFB3C,
-  lameddageshhebrew: 0xFB3C,
-  lamedhebrew: 0x05DC,
-  lamfinalarabic: 0xFEDE,
-  lamhahinitialarabic: 0xFCCA,
-  laminitialarabic: 0xFEDF,
-  lamjeeminitialarabic: 0xFCC9,
-  lamkhahinitialarabic: 0xFCCB,
-  lamlamhehisolatedarabic: 0xFDF2,
-  lammedialarabic: 0xFEE0,
-  lammeemhahinitialarabic: 0xFD88,
-  lammeeminitialarabic: 0xFCCC,
-  largecircle: 0x25EF,
-  lbar: 0x019A,
-  lbelt: 0x026C,
-  lbopomofo: 0x310C,
-  lcaron: 0x013E,
-  lcedilla: 0x013C,
-  lcircle: 0x24DB,
-  lcircumflexbelow: 0x1E3D,
-  lcommaaccent: 0x013C,
-  ldot: 0x0140,
-  ldotaccent: 0x0140,
-  ldotbelow: 0x1E37,
-  ldotbelowmacron: 0x1E39,
-  leftangleabovecmb: 0x031A,
-  lefttackbelowcmb: 0x0318,
-  less: 0x003C,
-  lessequal: 0x2264,
-  lessequalorgreater: 0x22DA,
-  lessmonospace: 0xFF1C,
-  lessorequivalent: 0x2272,
-  lessorgreater: 0x2276,
-  lessoverequal: 0x2266,
-  lesssmall: 0xFE64,
-  lezh: 0x026E,
-  lfblock: 0x258C,
-  lhookretroflex: 0x026D,
-  lira: 0x20A4,
-  liwnarmenian: 0x056C,
-  lj: 0x01C9,
-  ljecyrillic: 0x0459,
-  ll: 0xF6C0,
-  lladeva: 0x0933,
-  llagujarati: 0x0AB3,
-  llinebelow: 0x1E3B,
-  llladeva: 0x0934,
-  llvocalicbengali: 0x09E1,
-  llvocalicdeva: 0x0961,
-  llvocalicvowelsignbengali: 0x09E3,
-  llvocalicvowelsigndeva: 0x0963,
-  lmiddletilde: 0x026B,
-  lmonospace: 0xFF4C,
-  lmsquare: 0x33D0,
-  lochulathai: 0x0E2C,
-  logicaland: 0x2227,
-  logicalnot: 0x00AC,
-  logicalnotreversed: 0x2310,
-  logicalor: 0x2228,
-  lolingthai: 0x0E25,
-  longs: 0x017F,
-  lowlinecenterline: 0xFE4E,
-  lowlinecmb: 0x0332,
-  lowlinedashed: 0xFE4D,
-  lozenge: 0x25CA,
-  lparen: 0x24A7,
-  lslash: 0x0142,
-  lsquare: 0x2113,
-  lsuperior: 0xF6EE,
-  ltshade: 0x2591,
-  luthai: 0x0E26,
-  lvocalicbengali: 0x098C,
-  lvocalicdeva: 0x090C,
-  lvocalicvowelsignbengali: 0x09E2,
-  lvocalicvowelsigndeva: 0x0962,
-  lxsquare: 0x33D3,
-  m: 0x006D,
-  mabengali: 0x09AE,
-  macron: 0x00AF,
-  macronbelowcmb: 0x0331,
-  macroncmb: 0x0304,
-  macronlowmod: 0x02CD,
-  macronmonospace: 0xFFE3,
-  macute: 0x1E3F,
-  madeva: 0x092E,
-  magujarati: 0x0AAE,
-  magurmukhi: 0x0A2E,
-  mahapakhhebrew: 0x05A4,
-  mahapakhlefthebrew: 0x05A4,
-  mahiragana: 0x307E,
-  maichattawalowleftthai: 0xF895,
-  maichattawalowrightthai: 0xF894,
-  maichattawathai: 0x0E4B,
-  maichattawaupperleftthai: 0xF893,
-  maieklowleftthai: 0xF88C,
-  maieklowrightthai: 0xF88B,
-  maiekthai: 0x0E48,
-  maiekupperleftthai: 0xF88A,
-  maihanakatleftthai: 0xF884,
-  maihanakatthai: 0x0E31,
-  maitaikhuleftthai: 0xF889,
-  maitaikhuthai: 0x0E47,
-  maitholowleftthai: 0xF88F,
-  maitholowrightthai: 0xF88E,
-  maithothai: 0x0E49,
-  maithoupperleftthai: 0xF88D,
-  maitrilowleftthai: 0xF892,
-  maitrilowrightthai: 0xF891,
-  maitrithai: 0x0E4A,
-  maitriupperleftthai: 0xF890,
-  maiyamokthai: 0x0E46,
-  makatakana: 0x30DE,
-  makatakanahalfwidth: 0xFF8F,
-  male: 0x2642,
-  mansyonsquare: 0x3347,
-  maqafhebrew: 0x05BE,
-  mars: 0x2642,
-  masoracirclehebrew: 0x05AF,
-  masquare: 0x3383,
-  mbopomofo: 0x3107,
-  mbsquare: 0x33D4,
-  mcircle: 0x24DC,
-  mcubedsquare: 0x33A5,
-  mdotaccent: 0x1E41,
-  mdotbelow: 0x1E43,
-  meemarabic: 0x0645,
-  meemfinalarabic: 0xFEE2,
-  meeminitialarabic: 0xFEE3,
-  meemmedialarabic: 0xFEE4,
-  meemmeeminitialarabic: 0xFCD1,
-  meemmeemisolatedarabic: 0xFC48,
-  meetorusquare: 0x334D,
-  mehiragana: 0x3081,
-  meizierasquare: 0x337E,
-  mekatakana: 0x30E1,
-  mekatakanahalfwidth: 0xFF92,
-  mem: 0x05DE,
-  memdagesh: 0xFB3E,
-  memdageshhebrew: 0xFB3E,
-  memhebrew: 0x05DE,
-  menarmenian: 0x0574,
-  merkhahebrew: 0x05A5,
-  merkhakefulahebrew: 0x05A6,
-  merkhakefulalefthebrew: 0x05A6,
-  merkhalefthebrew: 0x05A5,
-  mhook: 0x0271,
-  mhzsquare: 0x3392,
-  middledotkatakanahalfwidth: 0xFF65,
-  middot: 0x00B7,
-  mieumacirclekorean: 0x3272,
-  mieumaparenkorean: 0x3212,
-  mieumcirclekorean: 0x3264,
-  mieumkorean: 0x3141,
-  mieumpansioskorean: 0x3170,
-  mieumparenkorean: 0x3204,
-  mieumpieupkorean: 0x316E,
-  mieumsioskorean: 0x316F,
-  mihiragana: 0x307F,
-  mikatakana: 0x30DF,
-  mikatakanahalfwidth: 0xFF90,
-  minus: 0x2212,
-  minusbelowcmb: 0x0320,
-  minuscircle: 0x2296,
-  minusmod: 0x02D7,
-  minusplus: 0x2213,
-  minute: 0x2032,
-  miribaarusquare: 0x334A,
-  mirisquare: 0x3349,
-  mlonglegturned: 0x0270,
-  mlsquare: 0x3396,
-  mmcubedsquare: 0x33A3,
-  mmonospace: 0xFF4D,
-  mmsquaredsquare: 0x339F,
-  mohiragana: 0x3082,
-  mohmsquare: 0x33C1,
-  mokatakana: 0x30E2,
-  mokatakanahalfwidth: 0xFF93,
-  molsquare: 0x33D6,
-  momathai: 0x0E21,
-  moverssquare: 0x33A7,
-  moverssquaredsquare: 0x33A8,
-  mparen: 0x24A8,
-  mpasquare: 0x33AB,
-  mssquare: 0x33B3,
-  msuperior: 0xF6EF,
-  mturned: 0x026F,
-  mu: 0x00B5,
-  mu1: 0x00B5,
-  muasquare: 0x3382,
-  muchgreater: 0x226B,
-  muchless: 0x226A,
-  mufsquare: 0x338C,
-  mugreek: 0x03BC,
-  mugsquare: 0x338D,
-  muhiragana: 0x3080,
-  mukatakana: 0x30E0,
-  mukatakanahalfwidth: 0xFF91,
-  mulsquare: 0x3395,
-  multiply: 0x00D7,
-  mumsquare: 0x339B,
-  munahhebrew: 0x05A3,
-  munahlefthebrew: 0x05A3,
-  musicalnote: 0x266A,
-  musicalnotedbl: 0x266B,
-  musicflatsign: 0x266D,
-  musicsharpsign: 0x266F,
-  mussquare: 0x33B2,
-  muvsquare: 0x33B6,
-  muwsquare: 0x33BC,
-  mvmegasquare: 0x33B9,
-  mvsquare: 0x33B7,
-  mwmegasquare: 0x33BF,
-  mwsquare: 0x33BD,
-  n: 0x006E,
-  nabengali: 0x09A8,
-  nabla: 0x2207,
-  nacute: 0x0144,
-  nadeva: 0x0928,
-  nagujarati: 0x0AA8,
-  nagurmukhi: 0x0A28,
-  nahiragana: 0x306A,
-  nakatakana: 0x30CA,
-  nakatakanahalfwidth: 0xFF85,
-  napostrophe: 0x0149,
-  nasquare: 0x3381,
-  nbopomofo: 0x310B,
-  nbspace: 0x00A0,
-  ncaron: 0x0148,
-  ncedilla: 0x0146,
-  ncircle: 0x24DD,
-  ncircumflexbelow: 0x1E4B,
-  ncommaaccent: 0x0146,
-  ndotaccent: 0x1E45,
-  ndotbelow: 0x1E47,
-  nehiragana: 0x306D,
-  nekatakana: 0x30CD,
-  nekatakanahalfwidth: 0xFF88,
-  newsheqelsign: 0x20AA,
-  nfsquare: 0x338B,
-  ngabengali: 0x0999,
-  ngadeva: 0x0919,
-  ngagujarati: 0x0A99,
-  ngagurmukhi: 0x0A19,
-  ngonguthai: 0x0E07,
-  nhiragana: 0x3093,
-  nhookleft: 0x0272,
-  nhookretroflex: 0x0273,
-  nieunacirclekorean: 0x326F,
-  nieunaparenkorean: 0x320F,
-  nieuncieuckorean: 0x3135,
-  nieuncirclekorean: 0x3261,
-  nieunhieuhkorean: 0x3136,
-  nieunkorean: 0x3134,
-  nieunpansioskorean: 0x3168,
-  nieunparenkorean: 0x3201,
-  nieunsioskorean: 0x3167,
-  nieuntikeutkorean: 0x3166,
-  nihiragana: 0x306B,
-  nikatakana: 0x30CB,
-  nikatakanahalfwidth: 0xFF86,
-  nikhahitleftthai: 0xF899,
-  nikhahitthai: 0x0E4D,
-  nine: 0x0039,
-  ninearabic: 0x0669,
-  ninebengali: 0x09EF,
-  ninecircle: 0x2468,
-  ninecircleinversesansserif: 0x2792,
-  ninedeva: 0x096F,
-  ninegujarati: 0x0AEF,
-  ninegurmukhi: 0x0A6F,
-  ninehackarabic: 0x0669,
-  ninehangzhou: 0x3029,
-  nineideographicparen: 0x3228,
-  nineinferior: 0x2089,
-  ninemonospace: 0xFF19,
-  nineoldstyle: 0xF739,
-  nineparen: 0x247C,
-  nineperiod: 0x2490,
-  ninepersian: 0x06F9,
-  nineroman: 0x2178,
-  ninesuperior: 0x2079,
-  nineteencircle: 0x2472,
-  nineteenparen: 0x2486,
-  nineteenperiod: 0x249A,
-  ninethai: 0x0E59,
-  nj: 0x01CC,
-  njecyrillic: 0x045A,
-  nkatakana: 0x30F3,
-  nkatakanahalfwidth: 0xFF9D,
-  nlegrightlong: 0x019E,
-  nlinebelow: 0x1E49,
-  nmonospace: 0xFF4E,
-  nmsquare: 0x339A,
-  nnabengali: 0x09A3,
-  nnadeva: 0x0923,
-  nnagujarati: 0x0AA3,
-  nnagurmukhi: 0x0A23,
-  nnnadeva: 0x0929,
-  nohiragana: 0x306E,
-  nokatakana: 0x30CE,
-  nokatakanahalfwidth: 0xFF89,
-  nonbreakingspace: 0x00A0,
-  nonenthai: 0x0E13,
-  nonuthai: 0x0E19,
-  noonarabic: 0x0646,
-  noonfinalarabic: 0xFEE6,
-  noonghunnaarabic: 0x06BA,
-  noonghunnafinalarabic: 0xFB9F,
-  nooninitialarabic: 0xFEE7,
-  noonjeeminitialarabic: 0xFCD2,
-  noonjeemisolatedarabic: 0xFC4B,
-  noonmedialarabic: 0xFEE8,
-  noonmeeminitialarabic: 0xFCD5,
-  noonmeemisolatedarabic: 0xFC4E,
-  noonnoonfinalarabic: 0xFC8D,
-  notcontains: 0x220C,
-  notelement: 0x2209,
-  notelementof: 0x2209,
-  notequal: 0x2260,
-  notgreater: 0x226F,
-  notgreaternorequal: 0x2271,
-  notgreaternorless: 0x2279,
-  notidentical: 0x2262,
-  notless: 0x226E,
-  notlessnorequal: 0x2270,
-  notparallel: 0x2226,
-  notprecedes: 0x2280,
-  notsubset: 0x2284,
-  notsucceeds: 0x2281,
-  notsuperset: 0x2285,
-  nowarmenian: 0x0576,
-  nparen: 0x24A9,
-  nssquare: 0x33B1,
-  nsuperior: 0x207F,
-  ntilde: 0x00F1,
-  nu: 0x03BD,
-  nuhiragana: 0x306C,
-  nukatakana: 0x30CC,
-  nukatakanahalfwidth: 0xFF87,
-  nuktabengali: 0x09BC,
-  nuktadeva: 0x093C,
-  nuktagujarati: 0x0ABC,
-  nuktagurmukhi: 0x0A3C,
-  numbersign: 0x0023,
-  numbersignmonospace: 0xFF03,
-  numbersignsmall: 0xFE5F,
-  numeralsigngreek: 0x0374,
-  numeralsignlowergreek: 0x0375,
-  numero: 0x2116,
-  nun: 0x05E0,
-  nundagesh: 0xFB40,
-  nundageshhebrew: 0xFB40,
-  nunhebrew: 0x05E0,
-  nvsquare: 0x33B5,
-  nwsquare: 0x33BB,
-  nyabengali: 0x099E,
-  nyadeva: 0x091E,
-  nyagujarati: 0x0A9E,
-  nyagurmukhi: 0x0A1E,
-  o: 0x006F,
-  oacute: 0x00F3,
-  oangthai: 0x0E2D,
-  obarred: 0x0275,
-  obarredcyrillic: 0x04E9,
-  obarreddieresiscyrillic: 0x04EB,
-  obengali: 0x0993,
-  obopomofo: 0x311B,
-  obreve: 0x014F,
-  ocandradeva: 0x0911,
-  ocandragujarati: 0x0A91,
-  ocandravowelsigndeva: 0x0949,
-  ocandravowelsigngujarati: 0x0AC9,
-  ocaron: 0x01D2,
-  ocircle: 0x24DE,
-  ocircumflex: 0x00F4,
-  ocircumflexacute: 0x1ED1,
-  ocircumflexdotbelow: 0x1ED9,
-  ocircumflexgrave: 0x1ED3,
-  ocircumflexhookabove: 0x1ED5,
-  ocircumflextilde: 0x1ED7,
-  ocyrillic: 0x043E,
-  odblacute: 0x0151,
-  odblgrave: 0x020D,
-  odeva: 0x0913,
-  odieresis: 0x00F6,
-  odieresiscyrillic: 0x04E7,
-  odotbelow: 0x1ECD,
-  oe: 0x0153,
-  oekorean: 0x315A,
-  ogonek: 0x02DB,
-  ogonekcmb: 0x0328,
-  ograve: 0x00F2,
-  ogujarati: 0x0A93,
-  oharmenian: 0x0585,
-  ohiragana: 0x304A,
-  ohookabove: 0x1ECF,
-  ohorn: 0x01A1,
-  ohornacute: 0x1EDB,
-  ohorndotbelow: 0x1EE3,
-  ohorngrave: 0x1EDD,
-  ohornhookabove: 0x1EDF,
-  ohorntilde: 0x1EE1,
-  ohungarumlaut: 0x0151,
-  oi: 0x01A3,
-  oinvertedbreve: 0x020F,
-  okatakana: 0x30AA,
-  okatakanahalfwidth: 0xFF75,
-  okorean: 0x3157,
-  olehebrew: 0x05AB,
-  omacron: 0x014D,
-  omacronacute: 0x1E53,
-  omacrongrave: 0x1E51,
-  omdeva: 0x0950,
-  omega: 0x03C9,
-  omega1: 0x03D6,
-  omegacyrillic: 0x0461,
-  omegalatinclosed: 0x0277,
-  omegaroundcyrillic: 0x047B,
-  omegatitlocyrillic: 0x047D,
-  omegatonos: 0x03CE,
-  omgujarati: 0x0AD0,
-  omicron: 0x03BF,
-  omicrontonos: 0x03CC,
-  omonospace: 0xFF4F,
-  one: 0x0031,
-  onearabic: 0x0661,
-  onebengali: 0x09E7,
-  onecircle: 0x2460,
-  onecircleinversesansserif: 0x278A,
-  onedeva: 0x0967,
-  onedotenleader: 0x2024,
-  oneeighth: 0x215B,
-  onefitted: 0xF6DC,
-  onegujarati: 0x0AE7,
-  onegurmukhi: 0x0A67,
-  onehackarabic: 0x0661,
-  onehalf: 0x00BD,
-  onehangzhou: 0x3021,
-  oneideographicparen: 0x3220,
-  oneinferior: 0x2081,
-  onemonospace: 0xFF11,
-  onenumeratorbengali: 0x09F4,
-  oneoldstyle: 0xF731,
-  oneparen: 0x2474,
-  oneperiod: 0x2488,
-  onepersian: 0x06F1,
-  onequarter: 0x00BC,
-  oneroman: 0x2170,
-  onesuperior: 0x00B9,
-  onethai: 0x0E51,
-  onethird: 0x2153,
-  oogonek: 0x01EB,
-  oogonekmacron: 0x01ED,
-  oogurmukhi: 0x0A13,
-  oomatragurmukhi: 0x0A4B,
-  oopen: 0x0254,
-  oparen: 0x24AA,
-  openbullet: 0x25E6,
-  option: 0x2325,
-  ordfeminine: 0x00AA,
-  ordmasculine: 0x00BA,
-  orthogonal: 0x221F,
-  oshortdeva: 0x0912,
-  oshortvowelsigndeva: 0x094A,
-  oslash: 0x00F8,
-  oslashacute: 0x01FF,
-  osmallhiragana: 0x3049,
-  osmallkatakana: 0x30A9,
-  osmallkatakanahalfwidth: 0xFF6B,
-  ostrokeacute: 0x01FF,
-  osuperior: 0xF6F0,
-  otcyrillic: 0x047F,
-  otilde: 0x00F5,
-  otildeacute: 0x1E4D,
-  otildedieresis: 0x1E4F,
-  oubopomofo: 0x3121,
-  overline: 0x203E,
-  overlinecenterline: 0xFE4A,
-  overlinecmb: 0x0305,
-  overlinedashed: 0xFE49,
-  overlinedblwavy: 0xFE4C,
-  overlinewavy: 0xFE4B,
-  overscore: 0x00AF,
-  ovowelsignbengali: 0x09CB,
-  ovowelsigndeva: 0x094B,
-  ovowelsigngujarati: 0x0ACB,
-  p: 0x0070,
-  paampssquare: 0x3380,
-  paasentosquare: 0x332B,
-  pabengali: 0x09AA,
-  pacute: 0x1E55,
-  padeva: 0x092A,
-  pagedown: 0x21DF,
-  pageup: 0x21DE,
-  pagujarati: 0x0AAA,
-  pagurmukhi: 0x0A2A,
-  pahiragana: 0x3071,
-  paiyannoithai: 0x0E2F,
-  pakatakana: 0x30D1,
-  palatalizationcyrilliccmb: 0x0484,
-  palochkacyrillic: 0x04C0,
-  pansioskorean: 0x317F,
-  paragraph: 0x00B6,
-  parallel: 0x2225,
-  parenleft: 0x0028,
-  parenleftaltonearabic: 0xFD3E,
-  parenleftbt: 0xF8ED,
-  parenleftex: 0xF8EC,
-  parenleftinferior: 0x208D,
-  parenleftmonospace: 0xFF08,
-  parenleftsmall: 0xFE59,
-  parenleftsuperior: 0x207D,
-  parenlefttp: 0xF8EB,
-  parenleftvertical: 0xFE35,
-  parenright: 0x0029,
-  parenrightaltonearabic: 0xFD3F,
-  parenrightbt: 0xF8F8,
-  parenrightex: 0xF8F7,
-  parenrightinferior: 0x208E,
-  parenrightmonospace: 0xFF09,
-  parenrightsmall: 0xFE5A,
-  parenrightsuperior: 0x207E,
-  parenrighttp: 0xF8F6,
-  parenrightvertical: 0xFE36,
-  partialdiff: 0x2202,
-  paseqhebrew: 0x05C0,
-  pashtahebrew: 0x0599,
-  pasquare: 0x33A9,
-  patah: 0x05B7,
-  patah11: 0x05B7,
-  patah1d: 0x05B7,
-  patah2a: 0x05B7,
-  patahhebrew: 0x05B7,
-  patahnarrowhebrew: 0x05B7,
-  patahquarterhebrew: 0x05B7,
-  patahwidehebrew: 0x05B7,
-  pazerhebrew: 0x05A1,
-  pbopomofo: 0x3106,
-  pcircle: 0x24DF,
-  pdotaccent: 0x1E57,
-  pe: 0x05E4,
-  pecyrillic: 0x043F,
-  pedagesh: 0xFB44,
-  pedageshhebrew: 0xFB44,
-  peezisquare: 0x333B,
-  pefinaldageshhebrew: 0xFB43,
-  peharabic: 0x067E,
-  peharmenian: 0x057A,
-  pehebrew: 0x05E4,
-  pehfinalarabic: 0xFB57,
-  pehinitialarabic: 0xFB58,
-  pehiragana: 0x307A,
-  pehmedialarabic: 0xFB59,
-  pekatakana: 0x30DA,
-  pemiddlehookcyrillic: 0x04A7,
-  perafehebrew: 0xFB4E,
-  percent: 0x0025,
-  percentarabic: 0x066A,
-  percentmonospace: 0xFF05,
-  percentsmall: 0xFE6A,
-  period: 0x002E,
-  periodarmenian: 0x0589,
-  periodcentered: 0x00B7,
-  periodhalfwidth: 0xFF61,
-  periodinferior: 0xF6E7,
-  periodmonospace: 0xFF0E,
-  periodsmall: 0xFE52,
-  periodsuperior: 0xF6E8,
-  perispomenigreekcmb: 0x0342,
-  perpendicular: 0x22A5,
-  perthousand: 0x2030,
-  peseta: 0x20A7,
-  pfsquare: 0x338A,
-  phabengali: 0x09AB,
-  phadeva: 0x092B,
-  phagujarati: 0x0AAB,
-  phagurmukhi: 0x0A2B,
-  phi: 0x03C6,
-  phi1: 0x03D5,
-  phieuphacirclekorean: 0x327A,
-  phieuphaparenkorean: 0x321A,
-  phieuphcirclekorean: 0x326C,
-  phieuphkorean: 0x314D,
-  phieuphparenkorean: 0x320C,
-  philatin: 0x0278,
-  phinthuthai: 0x0E3A,
-  phisymbolgreek: 0x03D5,
-  phook: 0x01A5,
-  phophanthai: 0x0E1E,
-  phophungthai: 0x0E1C,
-  phosamphaothai: 0x0E20,
-  pi: 0x03C0,
-  pieupacirclekorean: 0x3273,
-  pieupaparenkorean: 0x3213,
-  pieupcieuckorean: 0x3176,
-  pieupcirclekorean: 0x3265,
-  pieupkiyeokkorean: 0x3172,
-  pieupkorean: 0x3142,
-  pieupparenkorean: 0x3205,
-  pieupsioskiyeokkorean: 0x3174,
-  pieupsioskorean: 0x3144,
-  pieupsiostikeutkorean: 0x3175,
-  pieupthieuthkorean: 0x3177,
-  pieuptikeutkorean: 0x3173,
-  pihiragana: 0x3074,
-  pikatakana: 0x30D4,
-  pisymbolgreek: 0x03D6,
-  piwrarmenian: 0x0583,
-  plus: 0x002B,
-  plusbelowcmb: 0x031F,
-  pluscircle: 0x2295,
-  plusminus: 0x00B1,
-  plusmod: 0x02D6,
-  plusmonospace: 0xFF0B,
-  plussmall: 0xFE62,
-  plussuperior: 0x207A,
-  pmonospace: 0xFF50,
-  pmsquare: 0x33D8,
-  pohiragana: 0x307D,
-  pointingindexdownwhite: 0x261F,
-  pointingindexleftwhite: 0x261C,
-  pointingindexrightwhite: 0x261E,
-  pointingindexupwhite: 0x261D,
-  pokatakana: 0x30DD,
-  poplathai: 0x0E1B,
-  postalmark: 0x3012,
-  postalmarkface: 0x3020,
-  pparen: 0x24AB,
-  precedes: 0x227A,
-  prescription: 0x211E,
-  primemod: 0x02B9,
-  primereversed: 0x2035,
-  product: 0x220F,
-  projective: 0x2305,
-  prolongedkana: 0x30FC,
-  propellor: 0x2318,
-  propersubset: 0x2282,
-  propersuperset: 0x2283,
-  proportion: 0x2237,
-  proportional: 0x221D,
-  psi: 0x03C8,
-  psicyrillic: 0x0471,
-  psilipneumatacyrilliccmb: 0x0486,
-  pssquare: 0x33B0,
-  puhiragana: 0x3077,
-  pukatakana: 0x30D7,
-  pvsquare: 0x33B4,
-  pwsquare: 0x33BA,
-  q: 0x0071,
-  qadeva: 0x0958,
-  qadmahebrew: 0x05A8,
-  qafarabic: 0x0642,
-  qaffinalarabic: 0xFED6,
-  qafinitialarabic: 0xFED7,
-  qafmedialarabic: 0xFED8,
-  qamats: 0x05B8,
-  qamats10: 0x05B8,
-  qamats1a: 0x05B8,
-  qamats1c: 0x05B8,
-  qamats27: 0x05B8,
-  qamats29: 0x05B8,
-  qamats33: 0x05B8,
-  qamatsde: 0x05B8,
-  qamatshebrew: 0x05B8,
-  qamatsnarrowhebrew: 0x05B8,
-  qamatsqatanhebrew: 0x05B8,
-  qamatsqatannarrowhebrew: 0x05B8,
-  qamatsqatanquarterhebrew: 0x05B8,
-  qamatsqatanwidehebrew: 0x05B8,
-  qamatsquarterhebrew: 0x05B8,
-  qamatswidehebrew: 0x05B8,
-  qarneyparahebrew: 0x059F,
-  qbopomofo: 0x3111,
-  qcircle: 0x24E0,
-  qhook: 0x02A0,
-  qmonospace: 0xFF51,
-  qof: 0x05E7,
-  qofdagesh: 0xFB47,
-  qofdageshhebrew: 0xFB47,
-  qofhebrew: 0x05E7,
-  qparen: 0x24AC,
-  quarternote: 0x2669,
-  qubuts: 0x05BB,
-  qubuts18: 0x05BB,
-  qubuts25: 0x05BB,
-  qubuts31: 0x05BB,
-  qubutshebrew: 0x05BB,
-  qubutsnarrowhebrew: 0x05BB,
-  qubutsquarterhebrew: 0x05BB,
-  qubutswidehebrew: 0x05BB,
-  question: 0x003F,
-  questionarabic: 0x061F,
-  questionarmenian: 0x055E,
-  questiondown: 0x00BF,
-  questiondownsmall: 0xF7BF,
-  questiongreek: 0x037E,
-  questionmonospace: 0xFF1F,
-  questionsmall: 0xF73F,
-  quotedbl: 0x0022,
-  quotedblbase: 0x201E,
-  quotedblleft: 0x201C,
-  quotedblmonospace: 0xFF02,
-  quotedblprime: 0x301E,
-  quotedblprimereversed: 0x301D,
-  quotedblright: 0x201D,
-  quoteleft: 0x2018,
-  quoteleftreversed: 0x201B,
-  quotereversed: 0x201B,
-  quoteright: 0x2019,
-  quoterightn: 0x0149,
-  quotesinglbase: 0x201A,
-  quotesingle: 0x0027,
-  quotesinglemonospace: 0xFF07,
-  r: 0x0072,
-  raarmenian: 0x057C,
-  rabengali: 0x09B0,
-  racute: 0x0155,
-  radeva: 0x0930,
-  radical: 0x221A,
-  radicalex: 0xF8E5,
-  radoverssquare: 0x33AE,
-  radoverssquaredsquare: 0x33AF,
-  radsquare: 0x33AD,
-  rafe: 0x05BF,
-  rafehebrew: 0x05BF,
-  ragujarati: 0x0AB0,
-  ragurmukhi: 0x0A30,
-  rahiragana: 0x3089,
-  rakatakana: 0x30E9,
-  rakatakanahalfwidth: 0xFF97,
-  ralowerdiagonalbengali: 0x09F1,
-  ramiddlediagonalbengali: 0x09F0,
-  ramshorn: 0x0264,
-  ratio: 0x2236,
-  rbopomofo: 0x3116,
-  rcaron: 0x0159,
-  rcedilla: 0x0157,
-  rcircle: 0x24E1,
-  rcommaaccent: 0x0157,
-  rdblgrave: 0x0211,
-  rdotaccent: 0x1E59,
-  rdotbelow: 0x1E5B,
-  rdotbelowmacron: 0x1E5D,
-  referencemark: 0x203B,
-  reflexsubset: 0x2286,
-  reflexsuperset: 0x2287,
-  registered: 0x00AE,
-  registersans: 0xF8E8,
-  registerserif: 0xF6DA,
-  reharabic: 0x0631,
-  reharmenian: 0x0580,
-  rehfinalarabic: 0xFEAE,
-  rehiragana: 0x308C,
-  rekatakana: 0x30EC,
-  rekatakanahalfwidth: 0xFF9A,
-  resh: 0x05E8,
-  reshdageshhebrew: 0xFB48,
-  reshhebrew: 0x05E8,
-  reversedtilde: 0x223D,
-  reviahebrew: 0x0597,
-  reviamugrashhebrew: 0x0597,
-  revlogicalnot: 0x2310,
-  rfishhook: 0x027E,
-  rfishhookreversed: 0x027F,
-  rhabengali: 0x09DD,
-  rhadeva: 0x095D,
-  rho: 0x03C1,
-  rhook: 0x027D,
-  rhookturned: 0x027B,
-  rhookturnedsuperior: 0x02B5,
-  rhosymbolgreek: 0x03F1,
-  rhotichookmod: 0x02DE,
-  rieulacirclekorean: 0x3271,
-  rieulaparenkorean: 0x3211,
-  rieulcirclekorean: 0x3263,
-  rieulhieuhkorean: 0x3140,
-  rieulkiyeokkorean: 0x313A,
-  rieulkiyeoksioskorean: 0x3169,
-  rieulkorean: 0x3139,
-  rieulmieumkorean: 0x313B,
-  rieulpansioskorean: 0x316C,
-  rieulparenkorean: 0x3203,
-  rieulphieuphkorean: 0x313F,
-  rieulpieupkorean: 0x313C,
-  rieulpieupsioskorean: 0x316B,
-  rieulsioskorean: 0x313D,
-  rieulthieuthkorean: 0x313E,
-  rieultikeutkorean: 0x316A,
-  rieulyeorinhieuhkorean: 0x316D,
-  rightangle: 0x221F,
-  righttackbelowcmb: 0x0319,
-  righttriangle: 0x22BF,
-  rihiragana: 0x308A,
-  rikatakana: 0x30EA,
-  rikatakanahalfwidth: 0xFF98,
-  ring: 0x02DA,
-  ringbelowcmb: 0x0325,
-  ringcmb: 0x030A,
-  ringhalfleft: 0x02BF,
-  ringhalfleftarmenian: 0x0559,
-  ringhalfleftbelowcmb: 0x031C,
-  ringhalfleftcentered: 0x02D3,
-  ringhalfright: 0x02BE,
-  ringhalfrightbelowcmb: 0x0339,
-  ringhalfrightcentered: 0x02D2,
-  rinvertedbreve: 0x0213,
-  rittorusquare: 0x3351,
-  rlinebelow: 0x1E5F,
-  rlongleg: 0x027C,
-  rlonglegturned: 0x027A,
-  rmonospace: 0xFF52,
-  rohiragana: 0x308D,
-  rokatakana: 0x30ED,
-  rokatakanahalfwidth: 0xFF9B,
-  roruathai: 0x0E23,
-  rparen: 0x24AD,
-  rrabengali: 0x09DC,
-  rradeva: 0x0931,
-  rragurmukhi: 0x0A5C,
-  rreharabic: 0x0691,
-  rrehfinalarabic: 0xFB8D,
-  rrvocalicbengali: 0x09E0,
-  rrvocalicdeva: 0x0960,
-  rrvocalicgujarati: 0x0AE0,
-  rrvocalicvowelsignbengali: 0x09C4,
-  rrvocalicvowelsigndeva: 0x0944,
-  rrvocalicvowelsigngujarati: 0x0AC4,
-  rsuperior: 0xF6F1,
-  rtblock: 0x2590,
-  rturned: 0x0279,
-  rturnedsuperior: 0x02B4,
-  ruhiragana: 0x308B,
-  rukatakana: 0x30EB,
-  rukatakanahalfwidth: 0xFF99,
-  rupeemarkbengali: 0x09F2,
-  rupeesignbengali: 0x09F3,
-  rupiah: 0xF6DD,
-  ruthai: 0x0E24,
-  rvocalicbengali: 0x098B,
-  rvocalicdeva: 0x090B,
-  rvocalicgujarati: 0x0A8B,
-  rvocalicvowelsignbengali: 0x09C3,
-  rvocalicvowelsigndeva: 0x0943,
-  rvocalicvowelsigngujarati: 0x0AC3,
-  s: 0x0073,
-  sabengali: 0x09B8,
-  sacute: 0x015B,
-  sacutedotaccent: 0x1E65,
-  sadarabic: 0x0635,
-  sadeva: 0x0938,
-  sadfinalarabic: 0xFEBA,
-  sadinitialarabic: 0xFEBB,
-  sadmedialarabic: 0xFEBC,
-  sagujarati: 0x0AB8,
-  sagurmukhi: 0x0A38,
-  sahiragana: 0x3055,
-  sakatakana: 0x30B5,
-  sakatakanahalfwidth: 0xFF7B,
-  sallallahoualayhewasallamarabic: 0xFDFA,
-  samekh: 0x05E1,
-  samekhdagesh: 0xFB41,
-  samekhdageshhebrew: 0xFB41,
-  samekhhebrew: 0x05E1,
-  saraaathai: 0x0E32,
-  saraaethai: 0x0E41,
-  saraaimaimalaithai: 0x0E44,
-  saraaimaimuanthai: 0x0E43,
-  saraamthai: 0x0E33,
-  saraathai: 0x0E30,
-  saraethai: 0x0E40,
-  saraiileftthai: 0xF886,
-  saraiithai: 0x0E35,
-  saraileftthai: 0xF885,
-  saraithai: 0x0E34,
-  saraothai: 0x0E42,
-  saraueeleftthai: 0xF888,
-  saraueethai: 0x0E37,
-  saraueleftthai: 0xF887,
-  sarauethai: 0x0E36,
-  sarauthai: 0x0E38,
-  sarauuthai: 0x0E39,
-  sbopomofo: 0x3119,
-  scaron: 0x0161,
-  scarondotaccent: 0x1E67,
-  scedilla: 0x015F,
-  schwa: 0x0259,
-  schwacyrillic: 0x04D9,
-  schwadieresiscyrillic: 0x04DB,
-  schwahook: 0x025A,
-  scircle: 0x24E2,
-  scircumflex: 0x015D,
-  scommaaccent: 0x0219,
-  sdotaccent: 0x1E61,
-  sdotbelow: 0x1E63,
-  sdotbelowdotaccent: 0x1E69,
-  seagullbelowcmb: 0x033C,
-  second: 0x2033,
-  secondtonechinese: 0x02CA,
-  section: 0x00A7,
-  seenarabic: 0x0633,
-  seenfinalarabic: 0xFEB2,
-  seeninitialarabic: 0xFEB3,
-  seenmedialarabic: 0xFEB4,
-  segol: 0x05B6,
-  segol13: 0x05B6,
-  segol1f: 0x05B6,
-  segol2c: 0x05B6,
-  segolhebrew: 0x05B6,
-  segolnarrowhebrew: 0x05B6,
-  segolquarterhebrew: 0x05B6,
-  segoltahebrew: 0x0592,
-  segolwidehebrew: 0x05B6,
-  seharmenian: 0x057D,
-  sehiragana: 0x305B,
-  sekatakana: 0x30BB,
-  sekatakanahalfwidth: 0xFF7E,
-  semicolon: 0x003B,
-  semicolonarabic: 0x061B,
-  semicolonmonospace: 0xFF1B,
-  semicolonsmall: 0xFE54,
-  semivoicedmarkkana: 0x309C,
-  semivoicedmarkkanahalfwidth: 0xFF9F,
-  sentisquare: 0x3322,
-  sentosquare: 0x3323,
-  seven: 0x0037,
-  sevenarabic: 0x0667,
-  sevenbengali: 0x09ED,
-  sevencircle: 0x2466,
-  sevencircleinversesansserif: 0x2790,
-  sevendeva: 0x096D,
-  seveneighths: 0x215E,
-  sevengujarati: 0x0AED,
-  sevengurmukhi: 0x0A6D,
-  sevenhackarabic: 0x0667,
-  sevenhangzhou: 0x3027,
-  sevenideographicparen: 0x3226,
-  seveninferior: 0x2087,
-  sevenmonospace: 0xFF17,
-  sevenoldstyle: 0xF737,
-  sevenparen: 0x247A,
-  sevenperiod: 0x248E,
-  sevenpersian: 0x06F7,
-  sevenroman: 0x2176,
-  sevensuperior: 0x2077,
-  seventeencircle: 0x2470,
-  seventeenparen: 0x2484,
-  seventeenperiod: 0x2498,
-  seventhai: 0x0E57,
-  sfthyphen: 0x00AD,
-  shaarmenian: 0x0577,
-  shabengali: 0x09B6,
-  shacyrillic: 0x0448,
-  shaddaarabic: 0x0651,
-  shaddadammaarabic: 0xFC61,
-  shaddadammatanarabic: 0xFC5E,
-  shaddafathaarabic: 0xFC60,
-  shaddakasraarabic: 0xFC62,
-  shaddakasratanarabic: 0xFC5F,
-  shade: 0x2592,
-  shadedark: 0x2593,
-  shadelight: 0x2591,
-  shademedium: 0x2592,
-  shadeva: 0x0936,
-  shagujarati: 0x0AB6,
-  shagurmukhi: 0x0A36,
-  shalshelethebrew: 0x0593,
-  shbopomofo: 0x3115,
-  shchacyrillic: 0x0449,
-  sheenarabic: 0x0634,
-  sheenfinalarabic: 0xFEB6,
-  sheeninitialarabic: 0xFEB7,
-  sheenmedialarabic: 0xFEB8,
-  sheicoptic: 0x03E3,
-  sheqel: 0x20AA,
-  sheqelhebrew: 0x20AA,
-  sheva: 0x05B0,
-  sheva115: 0x05B0,
-  sheva15: 0x05B0,
-  sheva22: 0x05B0,
-  sheva2e: 0x05B0,
-  shevahebrew: 0x05B0,
-  shevanarrowhebrew: 0x05B0,
-  shevaquarterhebrew: 0x05B0,
-  shevawidehebrew: 0x05B0,
-  shhacyrillic: 0x04BB,
-  shimacoptic: 0x03ED,
-  shin: 0x05E9,
-  shindagesh: 0xFB49,
-  shindageshhebrew: 0xFB49,
-  shindageshshindot: 0xFB2C,
-  shindageshshindothebrew: 0xFB2C,
-  shindageshsindot: 0xFB2D,
-  shindageshsindothebrew: 0xFB2D,
-  shindothebrew: 0x05C1,
-  shinhebrew: 0x05E9,
-  shinshindot: 0xFB2A,
-  shinshindothebrew: 0xFB2A,
-  shinsindot: 0xFB2B,
-  shinsindothebrew: 0xFB2B,
-  shook: 0x0282,
-  sigma: 0x03C3,
-  sigma1: 0x03C2,
-  sigmafinal: 0x03C2,
-  sigmalunatesymbolgreek: 0x03F2,
-  sihiragana: 0x3057,
-  sikatakana: 0x30B7,
-  sikatakanahalfwidth: 0xFF7C,
-  siluqhebrew: 0x05BD,
-  siluqlefthebrew: 0x05BD,
-  similar: 0x223C,
-  sindothebrew: 0x05C2,
-  siosacirclekorean: 0x3274,
-  siosaparenkorean: 0x3214,
-  sioscieuckorean: 0x317E,
-  sioscirclekorean: 0x3266,
-  sioskiyeokkorean: 0x317A,
-  sioskorean: 0x3145,
-  siosnieunkorean: 0x317B,
-  siosparenkorean: 0x3206,
-  siospieupkorean: 0x317D,
-  siostikeutkorean: 0x317C,
-  six: 0x0036,
-  sixarabic: 0x0666,
-  sixbengali: 0x09EC,
-  sixcircle: 0x2465,
-  sixcircleinversesansserif: 0x278F,
-  sixdeva: 0x096C,
-  sixgujarati: 0x0AEC,
-  sixgurmukhi: 0x0A6C,
-  sixhackarabic: 0x0666,
-  sixhangzhou: 0x3026,
-  sixideographicparen: 0x3225,
-  sixinferior: 0x2086,
-  sixmonospace: 0xFF16,
-  sixoldstyle: 0xF736,
-  sixparen: 0x2479,
-  sixperiod: 0x248D,
-  sixpersian: 0x06F6,
-  sixroman: 0x2175,
-  sixsuperior: 0x2076,
-  sixteencircle: 0x246F,
-  sixteencurrencydenominatorbengali: 0x09F9,
-  sixteenparen: 0x2483,
-  sixteenperiod: 0x2497,
-  sixthai: 0x0E56,
-  slash: 0x002F,
-  slashmonospace: 0xFF0F,
-  slong: 0x017F,
-  slongdotaccent: 0x1E9B,
-  smileface: 0x263A,
-  smonospace: 0xFF53,
-  sofpasuqhebrew: 0x05C3,
-  softhyphen: 0x00AD,
-  softsigncyrillic: 0x044C,
-  sohiragana: 0x305D,
-  sokatakana: 0x30BD,
-  sokatakanahalfwidth: 0xFF7F,
-  soliduslongoverlaycmb: 0x0338,
-  solidusshortoverlaycmb: 0x0337,
-  sorusithai: 0x0E29,
-  sosalathai: 0x0E28,
-  sosothai: 0x0E0B,
-  sosuathai: 0x0E2A,
-  space: 0x0020,
-  spacehackarabic: 0x0020,
-  spade: 0x2660,
-  spadesuitblack: 0x2660,
-  spadesuitwhite: 0x2664,
-  sparen: 0x24AE,
-  squarebelowcmb: 0x033B,
-  squarecc: 0x33C4,
-  squarecm: 0x339D,
-  squarediagonalcrosshatchfill: 0x25A9,
-  squarehorizontalfill: 0x25A4,
-  squarekg: 0x338F,
-  squarekm: 0x339E,
-  squarekmcapital: 0x33CE,
-  squareln: 0x33D1,
-  squarelog: 0x33D2,
-  squaremg: 0x338E,
-  squaremil: 0x33D5,
-  squaremm: 0x339C,
-  squaremsquared: 0x33A1,
-  squareorthogonalcrosshatchfill: 0x25A6,
-  squareupperlefttolowerrightfill: 0x25A7,
-  squareupperrighttolowerleftfill: 0x25A8,
-  squareverticalfill: 0x25A5,
-  squarewhitewithsmallblack: 0x25A3,
-  srsquare: 0x33DB,
-  ssabengali: 0x09B7,
-  ssadeva: 0x0937,
-  ssagujarati: 0x0AB7,
-  ssangcieuckorean: 0x3149,
-  ssanghieuhkorean: 0x3185,
-  ssangieungkorean: 0x3180,
-  ssangkiyeokkorean: 0x3132,
-  ssangnieunkorean: 0x3165,
-  ssangpieupkorean: 0x3143,
-  ssangsioskorean: 0x3146,
-  ssangtikeutkorean: 0x3138,
-  ssuperior: 0xF6F2,
-  sterling: 0x00A3,
-  sterlingmonospace: 0xFFE1,
-  strokelongoverlaycmb: 0x0336,
-  strokeshortoverlaycmb: 0x0335,
-  subset: 0x2282,
-  subsetnotequal: 0x228A,
-  subsetorequal: 0x2286,
-  succeeds: 0x227B,
-  suchthat: 0x220B,
-  suhiragana: 0x3059,
-  sukatakana: 0x30B9,
-  sukatakanahalfwidth: 0xFF7D,
-  sukunarabic: 0x0652,
-  summation: 0x2211,
-  sun: 0x263C,
-  superset: 0x2283,
-  supersetnotequal: 0x228B,
-  supersetorequal: 0x2287,
-  svsquare: 0x33DC,
-  syouwaerasquare: 0x337C,
-  t: 0x0074,
-  tabengali: 0x09A4,
-  tackdown: 0x22A4,
-  tackleft: 0x22A3,
-  tadeva: 0x0924,
-  tagujarati: 0x0AA4,
-  tagurmukhi: 0x0A24,
-  taharabic: 0x0637,
-  tahfinalarabic: 0xFEC2,
-  tahinitialarabic: 0xFEC3,
-  tahiragana: 0x305F,
-  tahmedialarabic: 0xFEC4,
-  taisyouerasquare: 0x337D,
-  takatakana: 0x30BF,
-  takatakanahalfwidth: 0xFF80,
-  tatweelarabic: 0x0640,
-  tau: 0x03C4,
-  tav: 0x05EA,
-  tavdages: 0xFB4A,
-  tavdagesh: 0xFB4A,
-  tavdageshhebrew: 0xFB4A,
-  tavhebrew: 0x05EA,
-  tbar: 0x0167,
-  tbopomofo: 0x310A,
-  tcaron: 0x0165,
-  tccurl: 0x02A8,
-  tcedilla: 0x0163,
-  tcheharabic: 0x0686,
-  tchehfinalarabic: 0xFB7B,
-  tchehinitialarabic: 0xFB7C,
-  tchehmedialarabic: 0xFB7D,
-  tcircle: 0x24E3,
-  tcircumflexbelow: 0x1E71,
-  tcommaaccent: 0x0163,
-  tdieresis: 0x1E97,
-  tdotaccent: 0x1E6B,
-  tdotbelow: 0x1E6D,
-  tecyrillic: 0x0442,
-  tedescendercyrillic: 0x04AD,
-  teharabic: 0x062A,
-  tehfinalarabic: 0xFE96,
-  tehhahinitialarabic: 0xFCA2,
-  tehhahisolatedarabic: 0xFC0C,
-  tehinitialarabic: 0xFE97,
-  tehiragana: 0x3066,
-  tehjeeminitialarabic: 0xFCA1,
-  tehjeemisolatedarabic: 0xFC0B,
-  tehmarbutaarabic: 0x0629,
-  tehmarbutafinalarabic: 0xFE94,
-  tehmedialarabic: 0xFE98,
-  tehmeeminitialarabic: 0xFCA4,
-  tehmeemisolatedarabic: 0xFC0E,
-  tehnoonfinalarabic: 0xFC73,
-  tekatakana: 0x30C6,
-  tekatakanahalfwidth: 0xFF83,
-  telephone: 0x2121,
-  telephoneblack: 0x260E,
-  telishagedolahebrew: 0x05A0,
-  telishaqetanahebrew: 0x05A9,
-  tencircle: 0x2469,
-  tenideographicparen: 0x3229,
-  tenparen: 0x247D,
-  tenperiod: 0x2491,
-  tenroman: 0x2179,
-  tesh: 0x02A7,
-  tet: 0x05D8,
-  tetdagesh: 0xFB38,
-  tetdageshhebrew: 0xFB38,
-  tethebrew: 0x05D8,
-  tetsecyrillic: 0x04B5,
-  tevirhebrew: 0x059B,
-  tevirlefthebrew: 0x059B,
-  thabengali: 0x09A5,
-  thadeva: 0x0925,
-  thagujarati: 0x0AA5,
-  thagurmukhi: 0x0A25,
-  thalarabic: 0x0630,
-  thalfinalarabic: 0xFEAC,
-  thanthakhatlowleftthai: 0xF898,
-  thanthakhatlowrightthai: 0xF897,
-  thanthakhatthai: 0x0E4C,
-  thanthakhatupperleftthai: 0xF896,
-  theharabic: 0x062B,
-  thehfinalarabic: 0xFE9A,
-  thehinitialarabic: 0xFE9B,
-  thehmedialarabic: 0xFE9C,
-  thereexists: 0x2203,
-  therefore: 0x2234,
-  theta: 0x03B8,
-  theta1: 0x03D1,
-  thetasymbolgreek: 0x03D1,
-  thieuthacirclekorean: 0x3279,
-  thieuthaparenkorean: 0x3219,
-  thieuthcirclekorean: 0x326B,
-  thieuthkorean: 0x314C,
-  thieuthparenkorean: 0x320B,
-  thirteencircle: 0x246C,
-  thirteenparen: 0x2480,
-  thirteenperiod: 0x2494,
-  thonangmonthothai: 0x0E11,
-  thook: 0x01AD,
-  thophuthaothai: 0x0E12,
-  thorn: 0x00FE,
-  thothahanthai: 0x0E17,
-  thothanthai: 0x0E10,
-  thothongthai: 0x0E18,
-  thothungthai: 0x0E16,
-  thousandcyrillic: 0x0482,
-  thousandsseparatorarabic: 0x066C,
-  thousandsseparatorpersian: 0x066C,
-  three: 0x0033,
-  threearabic: 0x0663,
-  threebengali: 0x09E9,
-  threecircle: 0x2462,
-  threecircleinversesansserif: 0x278C,
-  threedeva: 0x0969,
-  threeeighths: 0x215C,
-  threegujarati: 0x0AE9,
-  threegurmukhi: 0x0A69,
-  threehackarabic: 0x0663,
-  threehangzhou: 0x3023,
-  threeideographicparen: 0x3222,
-  threeinferior: 0x2083,
-  threemonospace: 0xFF13,
-  threenumeratorbengali: 0x09F6,
-  threeoldstyle: 0xF733,
-  threeparen: 0x2476,
-  threeperiod: 0x248A,
-  threepersian: 0x06F3,
-  threequarters: 0x00BE,
-  threequartersemdash: 0xF6DE,
-  threeroman: 0x2172,
-  threesuperior: 0x00B3,
-  threethai: 0x0E53,
-  thzsquare: 0x3394,
-  tihiragana: 0x3061,
-  tikatakana: 0x30C1,
-  tikatakanahalfwidth: 0xFF81,
-  tikeutacirclekorean: 0x3270,
-  tikeutaparenkorean: 0x3210,
-  tikeutcirclekorean: 0x3262,
-  tikeutkorean: 0x3137,
-  tikeutparenkorean: 0x3202,
-  tilde: 0x02DC,
-  tildebelowcmb: 0x0330,
-  tildecmb: 0x0303,
-  tildecomb: 0x0303,
-  tildedoublecmb: 0x0360,
-  tildeoperator: 0x223C,
-  tildeoverlaycmb: 0x0334,
-  tildeverticalcmb: 0x033E,
-  timescircle: 0x2297,
-  tipehahebrew: 0x0596,
-  tipehalefthebrew: 0x0596,
-  tippigurmukhi: 0x0A70,
-  titlocyrilliccmb: 0x0483,
-  tiwnarmenian: 0x057F,
-  tlinebelow: 0x1E6F,
-  tmonospace: 0xFF54,
-  toarmenian: 0x0569,
-  tohiragana: 0x3068,
-  tokatakana: 0x30C8,
-  tokatakanahalfwidth: 0xFF84,
-  tonebarextrahighmod: 0x02E5,
-  tonebarextralowmod: 0x02E9,
-  tonebarhighmod: 0x02E6,
-  tonebarlowmod: 0x02E8,
-  tonebarmidmod: 0x02E7,
-  tonefive: 0x01BD,
-  tonesix: 0x0185,
-  tonetwo: 0x01A8,
-  tonos: 0x0384,
-  tonsquare: 0x3327,
-  topatakthai: 0x0E0F,
-  tortoiseshellbracketleft: 0x3014,
-  tortoiseshellbracketleftsmall: 0xFE5D,
-  tortoiseshellbracketleftvertical: 0xFE39,
-  tortoiseshellbracketright: 0x3015,
-  tortoiseshellbracketrightsmall: 0xFE5E,
-  tortoiseshellbracketrightvertical: 0xFE3A,
-  totaothai: 0x0E15,
-  tpalatalhook: 0x01AB,
-  tparen: 0x24AF,
-  trademark: 0x2122,
-  trademarksans: 0xF8EA,
-  trademarkserif: 0xF6DB,
-  tretroflexhook: 0x0288,
-  triagdn: 0x25BC,
-  triaglf: 0x25C4,
-  triagrt: 0x25BA,
-  triagup: 0x25B2,
-  ts: 0x02A6,
-  tsadi: 0x05E6,
-  tsadidagesh: 0xFB46,
-  tsadidageshhebrew: 0xFB46,
-  tsadihebrew: 0x05E6,
-  tsecyrillic: 0x0446,
-  tsere: 0x05B5,
-  tsere12: 0x05B5,
-  tsere1e: 0x05B5,
-  tsere2b: 0x05B5,
-  tserehebrew: 0x05B5,
-  tserenarrowhebrew: 0x05B5,
-  tserequarterhebrew: 0x05B5,
-  tserewidehebrew: 0x05B5,
-  tshecyrillic: 0x045B,
-  tsuperior: 0xF6F3,
-  ttabengali: 0x099F,
-  ttadeva: 0x091F,
-  ttagujarati: 0x0A9F,
-  ttagurmukhi: 0x0A1F,
-  tteharabic: 0x0679,
-  ttehfinalarabic: 0xFB67,
-  ttehinitialarabic: 0xFB68,
-  ttehmedialarabic: 0xFB69,
-  tthabengali: 0x09A0,
-  tthadeva: 0x0920,
-  tthagujarati: 0x0AA0,
-  tthagurmukhi: 0x0A20,
-  tturned: 0x0287,
-  tuhiragana: 0x3064,
-  tukatakana: 0x30C4,
-  tukatakanahalfwidth: 0xFF82,
-  tusmallhiragana: 0x3063,
-  tusmallkatakana: 0x30C3,
-  tusmallkatakanahalfwidth: 0xFF6F,
-  twelvecircle: 0x246B,
-  twelveparen: 0x247F,
-  twelveperiod: 0x2493,
-  twelveroman: 0x217B,
-  twentycircle: 0x2473,
-  twentyhangzhou: 0x5344,
-  twentyparen: 0x2487,
-  twentyperiod: 0x249B,
-  two: 0x0032,
-  twoarabic: 0x0662,
-  twobengali: 0x09E8,
-  twocircle: 0x2461,
-  twocircleinversesansserif: 0x278B,
-  twodeva: 0x0968,
-  twodotenleader: 0x2025,
-  twodotleader: 0x2025,
-  twodotleadervertical: 0xFE30,
-  twogujarati: 0x0AE8,
-  twogurmukhi: 0x0A68,
-  twohackarabic: 0x0662,
-  twohangzhou: 0x3022,
-  twoideographicparen: 0x3221,
-  twoinferior: 0x2082,
-  twomonospace: 0xFF12,
-  twonumeratorbengali: 0x09F5,
-  twooldstyle: 0xF732,
-  twoparen: 0x2475,
-  twoperiod: 0x2489,
-  twopersian: 0x06F2,
-  tworoman: 0x2171,
-  twostroke: 0x01BB,
-  twosuperior: 0x00B2,
-  twothai: 0x0E52,
-  twothirds: 0x2154,
-  u: 0x0075,
-  uacute: 0x00FA,
-  ubar: 0x0289,
-  ubengali: 0x0989,
-  ubopomofo: 0x3128,
-  ubreve: 0x016D,
-  ucaron: 0x01D4,
-  ucircle: 0x24E4,
-  ucircumflex: 0x00FB,
-  ucircumflexbelow: 0x1E77,
-  ucyrillic: 0x0443,
-  udattadeva: 0x0951,
-  udblacute: 0x0171,
-  udblgrave: 0x0215,
-  udeva: 0x0909,
-  udieresis: 0x00FC,
-  udieresisacute: 0x01D8,
-  udieresisbelow: 0x1E73,
-  udieresiscaron: 0x01DA,
-  udieresiscyrillic: 0x04F1,
-  udieresisgrave: 0x01DC,
-  udieresismacron: 0x01D6,
-  udotbelow: 0x1EE5,
-  ugrave: 0x00F9,
-  ugujarati: 0x0A89,
-  ugurmukhi: 0x0A09,
-  uhiragana: 0x3046,
-  uhookabove: 0x1EE7,
-  uhorn: 0x01B0,
-  uhornacute: 0x1EE9,
-  uhorndotbelow: 0x1EF1,
-  uhorngrave: 0x1EEB,
-  uhornhookabove: 0x1EED,
-  uhorntilde: 0x1EEF,
-  uhungarumlaut: 0x0171,
-  uhungarumlautcyrillic: 0x04F3,
-  uinvertedbreve: 0x0217,
-  ukatakana: 0x30A6,
-  ukatakanahalfwidth: 0xFF73,
-  ukcyrillic: 0x0479,
-  ukorean: 0x315C,
-  umacron: 0x016B,
-  umacroncyrillic: 0x04EF,
-  umacrondieresis: 0x1E7B,
-  umatragurmukhi: 0x0A41,
-  umonospace: 0xFF55,
-  underscore: 0x005F,
-  underscoredbl: 0x2017,
-  underscoremonospace: 0xFF3F,
-  underscorevertical: 0xFE33,
-  underscorewavy: 0xFE4F,
-  union: 0x222A,
-  universal: 0x2200,
-  uogonek: 0x0173,
-  uparen: 0x24B0,
-  upblock: 0x2580,
-  upperdothebrew: 0x05C4,
-  upsilon: 0x03C5,
-  upsilondieresis: 0x03CB,
-  upsilondieresistonos: 0x03B0,
-  upsilonlatin: 0x028A,
-  upsilontonos: 0x03CD,
-  uptackbelowcmb: 0x031D,
-  uptackmod: 0x02D4,
-  uragurmukhi: 0x0A73,
-  uring: 0x016F,
-  ushortcyrillic: 0x045E,
-  usmallhiragana: 0x3045,
-  usmallkatakana: 0x30A5,
-  usmallkatakanahalfwidth: 0xFF69,
-  ustraightcyrillic: 0x04AF,
-  ustraightstrokecyrillic: 0x04B1,
-  utilde: 0x0169,
-  utildeacute: 0x1E79,
-  utildebelow: 0x1E75,
-  uubengali: 0x098A,
-  uudeva: 0x090A,
-  uugujarati: 0x0A8A,
-  uugurmukhi: 0x0A0A,
-  uumatragurmukhi: 0x0A42,
-  uuvowelsignbengali: 0x09C2,
-  uuvowelsigndeva: 0x0942,
-  uuvowelsigngujarati: 0x0AC2,
-  uvowelsignbengali: 0x09C1,
-  uvowelsigndeva: 0x0941,
-  uvowelsigngujarati: 0x0AC1,
-  v: 0x0076,
-  vadeva: 0x0935,
-  vagujarati: 0x0AB5,
-  vagurmukhi: 0x0A35,
-  vakatakana: 0x30F7,
-  vav: 0x05D5,
-  vavdagesh: 0xFB35,
-  vavdagesh65: 0xFB35,
-  vavdageshhebrew: 0xFB35,
-  vavhebrew: 0x05D5,
-  vavholam: 0xFB4B,
-  vavholamhebrew: 0xFB4B,
-  vavvavhebrew: 0x05F0,
-  vavyodhebrew: 0x05F1,
-  vcircle: 0x24E5,
-  vdotbelow: 0x1E7F,
-  vecyrillic: 0x0432,
-  veharabic: 0x06A4,
-  vehfinalarabic: 0xFB6B,
-  vehinitialarabic: 0xFB6C,
-  vehmedialarabic: 0xFB6D,
-  vekatakana: 0x30F9,
-  venus: 0x2640,
-  verticalbar: 0x007C,
-  verticallineabovecmb: 0x030D,
-  verticallinebelowcmb: 0x0329,
-  verticallinelowmod: 0x02CC,
-  verticallinemod: 0x02C8,
-  vewarmenian: 0x057E,
-  vhook: 0x028B,
-  vikatakana: 0x30F8,
-  viramabengali: 0x09CD,
-  viramadeva: 0x094D,
-  viramagujarati: 0x0ACD,
-  visargabengali: 0x0983,
-  visargadeva: 0x0903,
-  visargagujarati: 0x0A83,
-  vmonospace: 0xFF56,
-  voarmenian: 0x0578,
-  voicediterationhiragana: 0x309E,
-  voicediterationkatakana: 0x30FE,
-  voicedmarkkana: 0x309B,
-  voicedmarkkanahalfwidth: 0xFF9E,
-  vokatakana: 0x30FA,
-  vparen: 0x24B1,
-  vtilde: 0x1E7D,
-  vturned: 0x028C,
-  vuhiragana: 0x3094,
-  vukatakana: 0x30F4,
-  w: 0x0077,
-  wacute: 0x1E83,
-  waekorean: 0x3159,
-  wahiragana: 0x308F,
-  wakatakana: 0x30EF,
-  wakatakanahalfwidth: 0xFF9C,
-  wakorean: 0x3158,
-  wasmallhiragana: 0x308E,
-  wasmallkatakana: 0x30EE,
-  wattosquare: 0x3357,
-  wavedash: 0x301C,
-  wavyunderscorevertical: 0xFE34,
-  wawarabic: 0x0648,
-  wawfinalarabic: 0xFEEE,
-  wawhamzaabovearabic: 0x0624,
-  wawhamzaabovefinalarabic: 0xFE86,
-  wbsquare: 0x33DD,
-  wcircle: 0x24E6,
-  wcircumflex: 0x0175,
-  wdieresis: 0x1E85,
-  wdotaccent: 0x1E87,
-  wdotbelow: 0x1E89,
-  wehiragana: 0x3091,
-  weierstrass: 0x2118,
-  wekatakana: 0x30F1,
-  wekorean: 0x315E,
-  weokorean: 0x315D,
-  wgrave: 0x1E81,
-  whitebullet: 0x25E6,
-  whitecircle: 0x25CB,
-  whitecircleinverse: 0x25D9,
-  whitecornerbracketleft: 0x300E,
-  whitecornerbracketleftvertical: 0xFE43,
-  whitecornerbracketright: 0x300F,
-  whitecornerbracketrightvertical: 0xFE44,
-  whitediamond: 0x25C7,
-  whitediamondcontainingblacksmalldiamond: 0x25C8,
-  whitedownpointingsmalltriangle: 0x25BF,
-  whitedownpointingtriangle: 0x25BD,
-  whiteleftpointingsmalltriangle: 0x25C3,
-  whiteleftpointingtriangle: 0x25C1,
-  whitelenticularbracketleft: 0x3016,
-  whitelenticularbracketright: 0x3017,
-  whiterightpointingsmalltriangle: 0x25B9,
-  whiterightpointingtriangle: 0x25B7,
-  whitesmallsquare: 0x25AB,
-  whitesmilingface: 0x263A,
-  whitesquare: 0x25A1,
-  whitestar: 0x2606,
-  whitetelephone: 0x260F,
-  whitetortoiseshellbracketleft: 0x3018,
-  whitetortoiseshellbracketright: 0x3019,
-  whiteuppointingsmalltriangle: 0x25B5,
-  whiteuppointingtriangle: 0x25B3,
-  wihiragana: 0x3090,
-  wikatakana: 0x30F0,
-  wikorean: 0x315F,
-  wmonospace: 0xFF57,
-  wohiragana: 0x3092,
-  wokatakana: 0x30F2,
-  wokatakanahalfwidth: 0xFF66,
-  won: 0x20A9,
-  wonmonospace: 0xFFE6,
-  wowaenthai: 0x0E27,
-  wparen: 0x24B2,
-  wring: 0x1E98,
-  wsuperior: 0x02B7,
-  wturned: 0x028D,
-  wynn: 0x01BF,
-  x: 0x0078,
-  xabovecmb: 0x033D,
-  xbopomofo: 0x3112,
-  xcircle: 0x24E7,
-  xdieresis: 0x1E8D,
-  xdotaccent: 0x1E8B,
-  xeharmenian: 0x056D,
-  xi: 0x03BE,
-  xmonospace: 0xFF58,
-  xparen: 0x24B3,
-  xsuperior: 0x02E3,
-  y: 0x0079,
-  yaadosquare: 0x334E,
-  yabengali: 0x09AF,
-  yacute: 0x00FD,
-  yadeva: 0x092F,
-  yaekorean: 0x3152,
-  yagujarati: 0x0AAF,
-  yagurmukhi: 0x0A2F,
-  yahiragana: 0x3084,
-  yakatakana: 0x30E4,
-  yakatakanahalfwidth: 0xFF94,
-  yakorean: 0x3151,
-  yamakkanthai: 0x0E4E,
-  yasmallhiragana: 0x3083,
-  yasmallkatakana: 0x30E3,
-  yasmallkatakanahalfwidth: 0xFF6C,
-  yatcyrillic: 0x0463,
-  ycircle: 0x24E8,
-  ycircumflex: 0x0177,
-  ydieresis: 0x00FF,
-  ydotaccent: 0x1E8F,
-  ydotbelow: 0x1EF5,
-  yeharabic: 0x064A,
-  yehbarreearabic: 0x06D2,
-  yehbarreefinalarabic: 0xFBAF,
-  yehfinalarabic: 0xFEF2,
-  yehhamzaabovearabic: 0x0626,
-  yehhamzaabovefinalarabic: 0xFE8A,
-  yehhamzaaboveinitialarabic: 0xFE8B,
-  yehhamzaabovemedialarabic: 0xFE8C,
-  yehinitialarabic: 0xFEF3,
-  yehmedialarabic: 0xFEF4,
-  yehmeeminitialarabic: 0xFCDD,
-  yehmeemisolatedarabic: 0xFC58,
-  yehnoonfinalarabic: 0xFC94,
-  yehthreedotsbelowarabic: 0x06D1,
-  yekorean: 0x3156,
-  yen: 0x00A5,
-  yenmonospace: 0xFFE5,
-  yeokorean: 0x3155,
-  yeorinhieuhkorean: 0x3186,
-  yerahbenyomohebrew: 0x05AA,
-  yerahbenyomolefthebrew: 0x05AA,
-  yericyrillic: 0x044B,
-  yerudieresiscyrillic: 0x04F9,
-  yesieungkorean: 0x3181,
-  yesieungpansioskorean: 0x3183,
-  yesieungsioskorean: 0x3182,
-  yetivhebrew: 0x059A,
-  ygrave: 0x1EF3,
-  yhook: 0x01B4,
-  yhookabove: 0x1EF7,
-  yiarmenian: 0x0575,
-  yicyrillic: 0x0457,
-  yikorean: 0x3162,
-  yinyang: 0x262F,
-  yiwnarmenian: 0x0582,
-  ymonospace: 0xFF59,
-  yod: 0x05D9,
-  yoddagesh: 0xFB39,
-  yoddageshhebrew: 0xFB39,
-  yodhebrew: 0x05D9,
-  yodyodhebrew: 0x05F2,
-  yodyodpatahhebrew: 0xFB1F,
-  yohiragana: 0x3088,
-  yoikorean: 0x3189,
-  yokatakana: 0x30E8,
-  yokatakanahalfwidth: 0xFF96,
-  yokorean: 0x315B,
-  yosmallhiragana: 0x3087,
-  yosmallkatakana: 0x30E7,
-  yosmallkatakanahalfwidth: 0xFF6E,
-  yotgreek: 0x03F3,
-  yoyaekorean: 0x3188,
-  yoyakorean: 0x3187,
-  yoyakthai: 0x0E22,
-  yoyingthai: 0x0E0D,
-  yparen: 0x24B4,
-  ypogegrammeni: 0x037A,
-  ypogegrammenigreekcmb: 0x0345,
-  yr: 0x01A6,
-  yring: 0x1E99,
-  ysuperior: 0x02B8,
-  ytilde: 0x1EF9,
-  yturned: 0x028E,
-  yuhiragana: 0x3086,
-  yuikorean: 0x318C,
-  yukatakana: 0x30E6,
-  yukatakanahalfwidth: 0xFF95,
-  yukorean: 0x3160,
-  yusbigcyrillic: 0x046B,
-  yusbigiotifiedcyrillic: 0x046D,
-  yuslittlecyrillic: 0x0467,
-  yuslittleiotifiedcyrillic: 0x0469,
-  yusmallhiragana: 0x3085,
-  yusmallkatakana: 0x30E5,
-  yusmallkatakanahalfwidth: 0xFF6D,
-  yuyekorean: 0x318B,
-  yuyeokorean: 0x318A,
-  yyabengali: 0x09DF,
-  yyadeva: 0x095F,
-  z: 0x007A,
-  zaarmenian: 0x0566,
-  zacute: 0x017A,
-  zadeva: 0x095B,
-  zagurmukhi: 0x0A5B,
-  zaharabic: 0x0638,
-  zahfinalarabic: 0xFEC6,
-  zahinitialarabic: 0xFEC7,
-  zahiragana: 0x3056,
-  zahmedialarabic: 0xFEC8,
-  zainarabic: 0x0632,
-  zainfinalarabic: 0xFEB0,
-  zakatakana: 0x30B6,
-  zaqefgadolhebrew: 0x0595,
-  zaqefqatanhebrew: 0x0594,
-  zarqahebrew: 0x0598,
-  zayin: 0x05D6,
-  zayindagesh: 0xFB36,
-  zayindageshhebrew: 0xFB36,
-  zayinhebrew: 0x05D6,
-  zbopomofo: 0x3117,
-  zcaron: 0x017E,
-  zcircle: 0x24E9,
-  zcircumflex: 0x1E91,
-  zcurl: 0x0291,
-  zdot: 0x017C,
-  zdotaccent: 0x017C,
-  zdotbelow: 0x1E93,
-  zecyrillic: 0x0437,
-  zedescendercyrillic: 0x0499,
-  zedieresiscyrillic: 0x04DF,
-  zehiragana: 0x305C,
-  zekatakana: 0x30BC,
-  zero: 0x0030,
-  zeroarabic: 0x0660,
-  zerobengali: 0x09E6,
-  zerodeva: 0x0966,
-  zerogujarati: 0x0AE6,
-  zerogurmukhi: 0x0A66,
-  zerohackarabic: 0x0660,
-  zeroinferior: 0x2080,
-  zeromonospace: 0xFF10,
-  zerooldstyle: 0xF730,
-  zeropersian: 0x06F0,
-  zerosuperior: 0x2070,
-  zerothai: 0x0E50,
-  zerowidthjoiner: 0xFEFF,
-  zerowidthnonjoiner: 0x200C,
-  zerowidthspace: 0x200B,
-  zeta: 0x03B6,
-  zhbopomofo: 0x3113,
-  zhearmenian: 0x056A,
-  zhebrevecyrillic: 0x04C2,
-  zhecyrillic: 0x0436,
-  zhedescendercyrillic: 0x0497,
-  zhedieresiscyrillic: 0x04DD,
-  zihiragana: 0x3058,
-  zikatakana: 0x30B8,
-  zinorhebrew: 0x05AE,
-  zlinebelow: 0x1E95,
-  zmonospace: 0xFF5A,
-  zohiragana: 0x305E,
-  zokatakana: 0x30BE,
-  zparen: 0x24B5,
-  zretroflexhook: 0x0290,
-  zstroke: 0x01B6,
-  zuhiragana: 0x305A,
-  zukatakana: 0x30BA,
-  '.notdef': 0x0000
-};
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/image.js b/apps/files_pdfviewer/js/pdfjs/src/image.js
deleted file mode 100644
index 035e2f754be0bb6b74b9d49ace5f20222d25f15f..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/image.js
+++ /dev/null
@@ -1,375 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var PDFImage = (function PDFImageClosure() {
-  /**
-   * Decode the image in the main thread if it supported. Resovles the promise
-   * when the image data is ready.
-   */
-  function handleImageData(handler, xref, res, image, promise) {
-    if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
-      // For natively supported jpegs send them to the main thread for decoding.
-      var dict = image.dict;
-      var colorSpace = dict.get('ColorSpace', 'CS');
-      colorSpace = ColorSpace.parse(colorSpace, xref, res);
-      var numComps = colorSpace.numComps;
-      handler.send('jpeg_decode', [image.getIR(), numComps], function(message) {
-        var data = message.data;
-        var stream = new Stream(data, 0, data.length, image.dict);
-        promise.resolve(stream);
-      });
-    } else {
-      promise.resolve(image);
-    }
-  }
-  /**
-   * Decode and clamp a value. The formula is different from the spec because we
-   * don't decode to float range [0,1], we decode it in the [0,max] range.
-   */
-  function decodeAndClamp(value, addend, coefficient, max) {
-    value = addend + value * coefficient;
-    // Clamp the value to the range
-    return value < 0 ? 0 : value > max ? max : value;
-  }
-  function PDFImage(xref, res, image, inline, smask) {
-    this.image = image;
-    if (image.getParams) {
-      // JPX/JPEG2000 streams directly contain bits per component
-      // and color space mode information.
-      TODO('get params from actual stream');
-      // var bits = ...
-      // var colorspace = ...
-    }
-    // TODO cache rendered images?
-
-    var dict = image.dict;
-    this.width = dict.get('Width', 'W');
-    this.height = dict.get('Height', 'H');
-
-    if (this.width < 1 || this.height < 1)
-      error('Invalid image width: ' + this.width + ' or height: ' +
-            this.height);
-
-    this.interpolate = dict.get('Interpolate', 'I') || false;
-    this.imageMask = dict.get('ImageMask', 'IM') || false;
-
-    var bitsPerComponent = image.bitsPerComponent;
-    if (!bitsPerComponent) {
-      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
-      if (!bitsPerComponent) {
-        if (this.imageMask)
-          bitsPerComponent = 1;
-        else
-          error('Bits per component missing in image: ' + this.imageMask);
-      }
-    }
-    this.bpc = bitsPerComponent;
-
-    if (!this.imageMask) {
-      var colorSpace = dict.get('ColorSpace', 'CS');
-      if (!colorSpace) {
-        TODO('JPX images (which don"t require color spaces');
-        colorSpace = new Name('DeviceRGB');
-      }
-      this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
-      this.numComps = this.colorSpace.numComps;
-    }
-
-    this.decode = dict.get('Decode', 'D');
-    this.needsDecode = false;
-    if (this.decode && this.colorSpace &&
-        !this.colorSpace.isDefaultDecode(this.decode)) {
-      this.needsDecode = true;
-      // Do some preprocessing to avoid more math.
-      var max = (1 << bitsPerComponent) - 1;
-      this.decodeCoefficients = [];
-      this.decodeAddends = [];
-      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
-        var dmin = this.decode[i];
-        var dmax = this.decode[i + 1];
-        this.decodeCoefficients[j] = dmax - dmin;
-        this.decodeAddends[j] = max * dmin;
-      }
-    }
-
-    var mask = dict.get('Mask');
-
-    if (mask) {
-      TODO('masked images');
-    } else if (smask) {
-      this.smask = new PDFImage(xref, res, smask, false);
-    }
-  }
-  /**
-   * Handles processing of image data and calls the callback with an argument
-   * of a PDFImage when the image is ready to be used.
-   */
-  PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref,
-                                                     res, image, inline) {
-    var imageDataPromise = new Promise();
-    var smaskPromise = new Promise();
-    // The image data and smask data may not be ready yet, wait till both are
-    // resolved.
-    Promise.all([imageDataPromise, smaskPromise]).then(function(results) {
-      var imageData = results[0], smaskData = results[1];
-      var image = new PDFImage(xref, res, imageData, inline, smaskData);
-      callback(image);
-    });
-
-    handleImageData(handler, xref, res, image, imageDataPromise);
-
-    var smask = image.dict.get('SMask');
-    if (smask)
-      handleImageData(handler, xref, res, smask, smaskPromise);
-    else
-      smaskPromise.resolve(null);
-  };
-
-  /**
-   * Resize an image using the nearest neighbor algorithm.  Currently only
-   * supports one and three component images.
-   * @param {TypedArray} pixels The original image with one component.
-   * @param {Number} bpc Number of bits per component.
-   * @param {Number} components Number of color components, 1 or 3 is supported.
-   * @param {Number} w1 Original width.
-   * @param {Number} h1 Original height.
-   * @param {Number} w2 New width.
-   * @param {Number} h2 New height.
-   * @return {TypedArray} Resized image data.
-   */
-  PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
-                                             w1, h1, w2, h2) {
-    var length = w2 * h2 * components;
-    var temp = bpc <= 8 ? new Uint8Array(length) :
-        bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
-    var xRatio = w1 / w2;
-    var yRatio = h1 / h2;
-    var px, py, newIndex, oldIndex;
-    for (var i = 0; i < h2; i++) {
-      for (var j = 0; j < w2; j++) {
-        px = Math.floor(j * xRatio);
-        py = Math.floor(i * yRatio);
-        newIndex = (i * w2) + j;
-        oldIndex = ((py * w1) + px);
-        if (components === 1) {
-          temp[newIndex] = pixels[oldIndex];
-        } else if (components === 3) {
-          newIndex *= 3;
-          oldIndex *= 3;
-          temp[newIndex] = pixels[oldIndex];
-          temp[newIndex + 1] = pixels[oldIndex + 1];
-          temp[newIndex + 2] = pixels[oldIndex + 2];
-        }
-      }
-    }
-    return temp;
-  };
-
-  PDFImage.prototype = {
-    get drawWidth() {
-      if (!this.smask)
-        return this.width;
-      return Math.max(this.width, this.smask.width);
-    },
-    get drawHeight() {
-      if (!this.smask)
-        return this.height;
-      return Math.max(this.height, this.smask.height);
-    },
-    getComponents: function PDFImage_getComponents(buffer) {
-      var bpc = this.bpc;
-      var needsDecode = this.needsDecode;
-      var decodeMap = this.decode;
-
-      // This image doesn't require any extra work.
-      if (bpc == 8 && !needsDecode)
-        return buffer;
-
-      var bufferLength = buffer.length;
-      var width = this.width;
-      var height = this.height;
-      var numComps = this.numComps;
-
-      var length = width * height * numComps;
-      var bufferPos = 0;
-      var output = bpc <= 8 ? new Uint8Array(length) :
-        bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
-      var rowComps = width * numComps;
-      var decodeAddends, decodeCoefficients;
-      if (needsDecode) {
-        decodeAddends = this.decodeAddends;
-        decodeCoefficients = this.decodeCoefficients;
-      }
-      var max = (1 << bpc) - 1;
-
-      if (bpc == 8) {
-        // Optimization for reading 8 bpc images that have a decode.
-        for (var i = 0, ii = length; i < ii; ++i) {
-          var compIndex = i % numComps;
-          var value = buffer[i];
-          value = decodeAndClamp(value, decodeAddends[compIndex],
-                          decodeCoefficients[compIndex], max);
-          output[i] = value;
-        }
-      } else if (bpc == 1) {
-        // Optimization for reading 1 bpc images.
-        var valueZero = 0, valueOne = 1;
-        if (decodeMap) {
-          valueZero = decodeMap[0] ? 1 : 0;
-          valueOne = decodeMap[1] ? 1 : 0;
-        }
-        var mask = 0;
-        var buf = 0;
-
-        for (var i = 0, ii = length; i < ii; ++i) {
-          if (i % rowComps == 0) {
-            mask = 0;
-            buf = 0;
-          } else {
-            mask >>= 1;
-          }
-
-          if (mask <= 0) {
-            buf = buffer[bufferPos++];
-            mask = 128;
-          }
-
-          output[i] = !(buf & mask) ? valueZero : valueOne;
-        }
-      } else {
-        // The general case that handles all other bpc values.
-        var bits = 0, buf = 0;
-        for (var i = 0, ii = length; i < ii; ++i) {
-          if (i % rowComps == 0) {
-            buf = 0;
-            bits = 0;
-          }
-
-          while (bits < bpc) {
-            buf = (buf << 8) | buffer[bufferPos++];
-            bits += 8;
-          }
-
-          var remainingBits = bits - bpc;
-          var value = buf >> remainingBits;
-          if (needsDecode) {
-            var compIndex = i % numComps;
-            value = decodeAndClamp(value, decodeAddends[compIndex],
-                            decodeCoefficients[compIndex], max);
-          }
-          output[i] = value;
-          buf = buf & ((1 << remainingBits) - 1);
-          bits = remainingBits;
-        }
-      }
-      return output;
-    },
-    getOpacity: function PDFImage_getOpacity(width, height) {
-      var smask = this.smask;
-      var originalWidth = this.width;
-      var originalHeight = this.height;
-      var buf;
-
-      if (smask) {
-        var sw = smask.width;
-        var sh = smask.height;
-        buf = new Uint8Array(sw * sh);
-        smask.fillGrayBuffer(buf);
-        if (sw != width || sh != height)
-          buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height);
-      } else {
-        buf = new Uint8Array(width * height);
-        for (var i = 0, ii = width * height; i < ii; ++i)
-          buf[i] = 255;
-      }
-      return buf;
-    },
-    applyStencilMask: function PDFImage_applyStencilMask(buffer,
-                                                         inverseDecode) {
-      var width = this.width, height = this.height;
-      var bitStrideLength = (width + 7) >> 3;
-      var imgArray = this.getImageBytes(bitStrideLength * height);
-      var imgArrayPos = 0;
-      var i, j, mask, buf;
-      // removing making non-masked pixels transparent
-      var bufferPos = 3; // alpha component offset
-      for (i = 0; i < height; i++) {
-        mask = 0;
-        for (j = 0; j < width; j++) {
-          if (!mask) {
-            buf = imgArray[imgArrayPos++];
-            mask = 128;
-          }
-          if (!(buf & mask) == inverseDecode) {
-            buffer[bufferPos] = 0;
-          }
-          bufferPos += 4;
-          mask >>= 1;
-        }
-      }
-    },
-    fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) {
-      var numComps = this.numComps;
-      var originalWidth = this.width;
-      var originalHeight = this.height;
-      var bpc = this.bpc;
-
-      // rows start at byte boundary;
-      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
-      var imgArray = this.getImageBytes(originalHeight * rowBytes);
-
-      var comps = this.colorSpace.getRgbBuffer(
-        this.getComponents(imgArray), bpc);
-      if (originalWidth != width || originalHeight != height)
-        comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
-                                originalHeight, width, height);
-      var compsPos = 0;
-      var opacity = this.getOpacity(width, height);
-      var opacityPos = 0;
-      var length = width * height * 4;
-
-      for (var i = 0; i < length; i += 4) {
-        buffer[i] = comps[compsPos++];
-        buffer[i + 1] = comps[compsPos++];
-        buffer[i + 2] = comps[compsPos++];
-        buffer[i + 3] = opacity[opacityPos++];
-      }
-    },
-    fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
-      var numComps = this.numComps;
-      if (numComps != 1)
-        error('Reading gray scale from a color image: ' + numComps);
-
-      var width = this.width;
-      var height = this.height;
-      var bpc = this.bpc;
-
-      // rows start at byte boundary;
-      var rowBytes = (width * numComps * bpc + 7) >> 3;
-      var imgArray = this.getImageBytes(height * rowBytes);
-
-      var comps = this.getComponents(imgArray);
-      var length = width * height;
-      // we aren't using a colorspace so we need to scale the value
-      var scale = 255 / ((1 << bpc) - 1);
-      for (var i = 0; i < length; ++i)
-        buffer[i] = (scale * comps[i]) | 0;
-    },
-    getImageBytes: function PDFImage_getImageBytes(length) {
-      this.image.reset();
-      return this.image.getBytes(length);
-    }
-  };
-  return PDFImage;
-})();
-
-function loadJpegStream(id, imageData, objs) {
-  var img = new Image();
-  img.onload = (function loadJpegStream_onloadClosure() {
-    objs.resolve(id, img);
-  });
-  img.src = 'data:image/jpeg;base64,' + window.btoa(imageData);
-}
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/jpx.js b/apps/files_pdfviewer/js/pdfjs/src/jpx.js
deleted file mode 100644
index 63193753d2a1de08a9e6261810629dff7c06b4c2..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/jpx.js
+++ /dev/null
@@ -1,1862 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var JpxImage = (function JpxImageClosure() {
-  // Table E.1
-  var SubbandsGainLog2 = {
-    'LL': 0,
-    'LH': 1,
-    'HL': 1,
-    'HH': 2
-  };
-  function JpxImage() {
-    this.failOnCorruptedImage = false;
-  }
-  JpxImage.prototype = {
-    load: function JpxImage_load(url) {
-      var xhr = new XMLHttpRequest();
-      xhr.open('GET', url, true);
-      xhr.responseType = 'arraybuffer';
-      xhr.onload = (function() {
-        // TODO catch parse error
-        var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
-        this.parse(data);
-        if (this.onload)
-          this.onload();
-      }).bind(this);
-      xhr.send(null);
-    },
-    parse: function JpxImage_parse(data) {
-      function ReadUint(data, offset, bytes) {
-        var n = 0;
-        for (var i = 0; i < bytes; i++)
-          n = n * 256 + (data[offset + i] & 0xFF);
-        return n;
-      }
-      var position = 0, length = data.length;
-      while (position < length) {
-        var headerSize = 8;
-        var lbox = ReadUint(data, position, 4);
-        var tbox = ReadUint(data, position + 4, 4);
-        position += headerSize;
-        if (lbox == 1) {
-          lbox = ReadUint(data, position, 8);
-          position += 8;
-          headerSize += 8;
-        }
-        if (lbox == 0)
-          lbox = length - position + headerSize;
-        if (lbox < headerSize)
-          error('JPX error: Invalid box field size');
-        var dataLength = lbox - headerSize;
-        var jumpDataLength = true;
-        switch (tbox) {
-          case 0x6A501A1A: // 'jP\032\032'
-            // TODO
-            break;
-          case 0x6A703268: // 'jp2h'
-            jumpDataLength = false; // parsing child boxes
-            break;
-          case 0x636F6C72: // 'colr'
-            // TODO
-            break;
-          case 0x6A703263: // 'jp2c'
-            this.parseCodestream(data, position, position + dataLength);
-            break;
-        }
-        if (jumpDataLength)
-          position += dataLength;
-      }
-    },
-    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
-      var context = {};
-      try {
-        var position = start;
-        while (position < end) {
-          var code = readUint16(data, position);
-          position += 2;
-
-          var length = 0, j;
-          switch (code) {
-            case 0xFF4F: // Start of codestream (SOC)
-              context.mainHeader = true;
-              break;
-            case 0xFFD9: // End of codestream (EOC)
-              break;
-            case 0xFF51: // Image and tile size (SIZ)
-              length = readUint16(data, position);
-              var siz = {};
-              siz.Xsiz = readUint32(data, position + 4);
-              siz.Ysiz = readUint32(data, position + 8);
-              siz.XOsiz = readUint32(data, position + 12);
-              siz.YOsiz = readUint32(data, position + 16);
-              siz.XTsiz = readUint32(data, position + 20);
-              siz.YTsiz = readUint32(data, position + 24);
-              siz.XTOsiz = readUint32(data, position + 28);
-              siz.YTOsiz = readUint32(data, position + 32);
-              var componentsCount = readUint16(data, position + 36);
-              siz.Csiz = componentsCount;
-              var components = [];
-              j = position + 38;
-              for (var i = 0; i < componentsCount; i++) {
-                var component = {
-                  precision: (data[j] & 0x7F) + 1,
-                  isSigned: !!(data[j] & 0x80),
-                  XRsiz: data[j + 1],
-                  YRsiz: data[j + 1]
-                };
-                calculateComponentDimensions(component, siz);
-                components.push(component);
-              }
-              context.SIZ = siz;
-              context.components = components;
-              calculateTileGrids(context, components);
-              context.QCC = [];
-              context.COC = [];
-              break;
-            case 0xFF5C: // Quantization default (QCD)
-              length = readUint16(data, position);
-              var qcd = {};
-              j = position + 2;
-              var sqcd = data[j++];
-              var spqcdSize, scalarExpounded;
-              switch (sqcd & 0x1F) {
-                case 0:
-                  spqcdSize = 8;
-                  scalarExpounded = true;
-                  break;
-                case 1:
-                  spqcdSize = 16;
-                  scalarExpounded = false;
-                  break;
-                case 2:
-                  spqcdSize = 16;
-                  scalarExpounded = true;
-                  break;
-                default:
-                  throw 'Invalid SQcd value ' + sqcd;
-              }
-              qcd.noQuantization = spqcdSize == 8;
-              qcd.scalarExpounded = scalarExpounded;
-              qcd.guardBits = sqcd >> 5;
-              var spqcds = [];
-              while (j < length + position) {
-                var spqcd = {};
-                if (spqcdSize == 8) {
-                  spqcd.epsilon = data[j++] >> 3;
-                  spqcd.mu = 0;
-                } else {
-                  spqcd.epsilon = data[j] >> 3;
-                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
-                  j += 2;
-                }
-                spqcds.push(spqcd);
-              }
-              qcd.SPqcds = spqcds;
-              if (context.mainHeader)
-                context.QCD = qcd;
-              else {
-                context.currentTile.QCD = qcd;
-                context.currentTile.QCC = [];
-              }
-              break;
-            case 0xFF5D: // Quantization component (QCC)
-              length = readUint16(data, position);
-              var qcc = {};
-              j = position + 2;
-              var cqcc;
-              if (context.SIZ.Csiz < 257)
-                cqcc = data[j++];
-              else {
-                cqcc = readUint16(data, j);
-                j += 2;
-              }
-              var sqcd = data[j++];
-              var spqcdSize, scalarExpounded;
-              switch (sqcd & 0x1F) {
-                case 0:
-                  spqcdSize = 8;
-                  scalarExpounded = true;
-                  break;
-                case 1:
-                  spqcdSize = 16;
-                  scalarExpounded = false;
-                  break;
-                case 2:
-                  spqcdSize = 16;
-                  scalarExpounded = true;
-                  break;
-                default:
-                  throw 'Invalid SQcd value ' + sqcd;
-              }
-              qcc.noQuantization = spqcdSize == 8;
-              qcc.scalarExpounded = scalarExpounded;
-              qcc.guardBits = sqcd >> 5;
-              var spqcds = [];
-              while (j < length + position) {
-                var spqcd = {};
-                if (spqcdSize == 8) {
-                  spqcd.epsilon = data[j++] >> 3;
-                  spqcd.mu = 0;
-                } else {
-                  spqcd.epsilon = data[j] >> 3;
-                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
-                  j += 2;
-                }
-                spqcds.push(spqcd);
-              }
-              qcc.SPqcds = spqcds;
-              if (context.mainHeader)
-                context.QCC[cqcc] = qcc;
-              else
-                context.currentTile.QCC[cqcc] = qcc;
-              break;
-            case 0xFF52: // Coding style default (COD)
-              length = readUint16(data, position);
-              var cod = {};
-              j = position + 2;
-              var scod = data[j++];
-              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
-              cod.sopMarkerUsed = !!(scod & 2);
-              cod.ephMarkerUsed = !!(scod & 4);
-              var codingStyle = {};
-              cod.progressionOrder = data[j++];
-              cod.layersCount = readUint16(data, j);
-              j += 2;
-              cod.multipleComponentTransform = data[j++];
-
-              cod.decompositionLevelsCount = data[j++];
-              cod.xcb = (data[j++] & 0xF) + 2;
-              cod.ycb = (data[j++] & 0xF) + 2;
-              var blockStyle = data[j++];
-              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
-              cod.resetContextProbabilities = !!(blockStyle & 2);
-              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
-              cod.verticalyStripe = !!(blockStyle & 8);
-              cod.predictableTermination = !!(blockStyle & 16);
-              cod.segmentationSymbolUsed = !!(blockStyle & 32);
-              cod.transformation = data[j++];
-              if (cod.entropyCoderWithCustomPrecincts) {
-                var precinctsSizes = {};
-                while (j < length + position) {
-                  var precinctsSize = data[j];
-                  precinctsSizes.push({
-                    PPx: precinctsSize & 0xF,
-                    PPy: precinctsSize >> 4
-                  });
-                }
-                cod.precinctsSizes = precinctsSizes;
-              }
-
-              if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
-                  cod.selectiveArithmeticCodingBypass ||
-                  cod.resetContextProbabilities ||
-                  cod.terminationOnEachCodingPass ||
-                  cod.verticalyStripe || cod.predictableTermination ||
-                  cod.segmentationSymbolUsed)
-                throw 'Unsupported COD options: ' + uneval(cod);
-
-              if (context.mainHeader)
-                context.COD = cod;
-              else {
-                context.currentTile.COD = cod;
-                context.currentTile.COC = [];
-              }
-              break;
-            case 0xFF90: // Start of tile-part (SOT)
-              length = readUint16(data, position);
-              var tile = {};
-              tile.index = readUint16(data, position + 2);
-              tile.length = readUint32(data, position + 4);
-              tile.dataEnd = tile.length + position - 2;
-              tile.partIndex = data[position + 8];
-              tile.partsCount = data[position + 9];
-
-              context.mainHeader = false;
-              if (tile.partIndex == 0) {
-                // reset component specific settings
-                tile.COD = context.COD;
-                tile.COC = context.COC.slice(0); // clone of the global COC
-                tile.QCD = context.QCD;
-                tile.QCC = context.QCC.slice(0); // clone of the global COC
-              }
-              context.currentTile = tile;
-              break;
-            case 0xFF93: // Start of data (SOD)
-              var tile = context.currentTile;
-              if (tile.partIndex == 0) {
-                initializeTile(context, tile.index);
-                buildPackets(context);
-              }
-
-              // moving to the end of the data
-              length = tile.dataEnd - position;
-
-              parseTilePackets(context, data, position, length);
-              break;
-            case 0xFF64: // Comment (COM)
-              length = readUint16(data, position);
-              // skipping content
-              break;
-            default:
-              throw 'Unknown codestream code: ' + code.toString(16);
-          }
-          position += length;
-        }
-      } catch (e) {
-        if (this.failOnCorruptedImage)
-          error('JPX error: ' + e);
-        else
-          warn('JPX error: ' + e + '. Trying to recover');
-      }
-      this.tiles = transformComponents(context);
-      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
-      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
-      this.componentsCount = context.SIZ.Csiz;
-    }
-  };
-  function readUint32(data, offset) {
-    return (data[offset] << 24) | (data[offset + 1] << 16) |
-      (data[offset + 2] << 8) | data[offset + 3];
-  }
-  function readUint16(data, offset) {
-    return (data[offset] << 8) | data[offset + 1];
-  }
-  function log2(x) {
-    var n = 1, i = 0;
-    while (x > n) {
-      n <<= 1;
-      i++;
-    }
-    return i;
-  }
-  function calculateComponentDimensions(component, siz) {
-    // Section B.2 Component mapping
-    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
-    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
-    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
-    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
-    component.width = component.x1 - component.x0;
-    component.height = component.y1 - component.y0;
-  }
-  function calculateTileGrids(context, components) {
-    var siz = context.SIZ;
-    // Section B.3 Division into tile and tile-components
-    var tiles = [];
-    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
-    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
-    for (var q = 0; q < numYtiles; q++) {
-      for (var p = 0; p < numXtiles; p++) {
-        var tile = {};
-        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
-        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
-        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
-        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
-        tile.width = tile.tx1 - tile.tx0;
-        tile.height = tile.ty1 - tile.ty0;
-        tile.components = [];
-        tiles.push(tile);
-      }
-    }
-    context.tiles = tiles;
-
-    var componentsCount = siz.Csiz;
-    for (var i = 0, ii = componentsCount; i < ii; i++) {
-      var component = components[i];
-      var tileComponents = [];
-      for (var j = 0, jj = tiles.length; j < jj; j++) {
-        var tileComponent = {}, tile = tiles[j];
-        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
-        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
-        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
-        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
-        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
-        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
-        tile.components[i] = tileComponent;
-      }
-    }
-  }
-  function getBlocksDimensions(context, component, r) {
-    var codOrCoc = component.codingStyleParameters;
-    var result = {};
-    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
-      result.PPx = 15;
-      result.PPy = 15;
-    } else {
-      result.PPx = codOrCoc.precinctsSizes[r].PPx;
-      result.PPy = codOrCoc.precinctsSizes[r].PPy;
-    }
-    // calculate codeblock size as described in section B.7
-    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
-      Math.min(codOrCoc.xcb, result.PPx);
-    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
-      Math.min(codOrCoc.ycb, result.PPy);
-    return result;
-  }
-  function buildPrecincts(context, resolution, dimensions) {
-    // Section B.6 Division resolution to precincts
-    var precinctWidth = 1 << dimensions.PPx;
-    var precinctHeight = 1 << dimensions.PPy;
-    var numprecinctswide = resolution.trx1 > resolution.trx0 ?
-      Math.ceil(resolution.trx1 / precinctWidth) -
-      Math.floor(resolution.trx0 / precinctWidth) : 0;
-    var numprecinctshigh = resolution.try1 > resolution.try0 ?
-      Math.ceil(resolution.try1 / precinctHeight) -
-      Math.floor(resolution.try0 / precinctHeight) : 0;
-    var numprecincts = numprecinctswide * numprecinctshigh;
-    var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
-      precinctWidth;
-    var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
-      precinctHeight;
-    resolution.precinctParameters = {
-      precinctXOffset: precinctXOffset,
-      precinctYOffset: precinctYOffset,
-      precinctWidth: precinctWidth,
-      precinctHeight: precinctHeight,
-      numprecinctswide: numprecinctswide,
-      numprecinctshigh: numprecinctshigh,
-      numprecincts: numprecincts
-    };
-  }
-  function buildCodeblocks(context, subband, dimensions) {
-    // Section B.7 Division sub-band into code-blocks
-    var xcb_ = dimensions.xcb_;
-    var ycb_ = dimensions.ycb_;
-    var codeblockWidth = 1 << xcb_;
-    var codeblockHeight = 1 << ycb_;
-    var cbx0 = Math.floor(subband.tbx0 / codeblockWidth);
-    var cby0 = Math.floor(subband.tby0 / codeblockHeight);
-    var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth);
-    var cby1 = Math.ceil(subband.tby1 / codeblockHeight);
-    var precinctParameters = subband.resolution.precinctParameters;
-    var codeblocks = [];
-    var precincts = [];
-    for (var j = cby0; j < cby1; j++) {
-      for (var i = cbx0; i < cbx1; i++) {
-        var codeblock = {
-          cbx: i,
-          cby: j,
-          tbx0: codeblockWidth * i,
-          tby0: codeblockHeight * j,
-          tbx1: codeblockWidth * (i + 1),
-          tby1: codeblockHeight * (j + 1)
-        };
-        // calculate precinct number
-        var pi = Math.floor((codeblock.tbx0 -
-          precinctParameters.precinctXOffset) /
-          precinctParameters.precinctWidth);
-        var pj = Math.floor((codeblock.tby0 -
-          precinctParameters.precinctYOffset) /
-          precinctParameters.precinctHeight);
-        var precinctNumber = pj +
-          pi * precinctParameters.numprecinctswide;
-        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
-        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
-        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
-        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
-        codeblock.precinctNumber = precinctNumber;
-        codeblock.subbandType = subband.type;
-        var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) *
-          (codeblock.tby1_ - codeblock.tby0_);
-        codeblock.Lblock = 3;
-        codeblocks.push(codeblock);
-        // building precinct for the sub-band
-        var precinct;
-        if (precinctNumber in precincts) {
-          precinct = precincts[precinctNumber];
-          precinct.cbxMin = Math.min(precinct.cbxMin, i);
-          precinct.cbyMin = Math.min(precinct.cbyMin, j);
-          precinct.cbxMax = Math.max(precinct.cbxMax, i);
-          precinct.cbyMax = Math.max(precinct.cbyMax, j);
-        } else {
-          precincts[precinctNumber] = precinct = {
-            cbxMin: i,
-            cbyMin: j,
-            cbxMax: i,
-            cbyMax: j
-          };
-        }
-        codeblock.precinct = precinct;
-      }
-    }
-    subband.codeblockParameters = {
-      codeblockWidth: xcb_,
-      codeblockHeight: ycb_,
-      numcodeblockwide: cbx1 - cbx0 + 1,
-      numcodeblockhigh: cby1 - cby1 + 1
-    };
-    subband.codeblocks = codeblocks;
-    for (var i = 0, ii = codeblocks.length; i < ii; i++) {
-      var codeblock = codeblocks[i];
-      var precinctNumber = codeblock.precinctNumber;
-    }
-    subband.precincts = precincts;
-  }
-  function createPacket(resolution, precinctNumber, layerNumber) {
-    var precinctCodeblocks = [];
-    // Section B.10.8 Order of info in packet
-    var subbands = resolution.subbands;
-    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
-    for (var i = 0, ii = subbands.length; i < ii; i++) {
-      var subband = subbands[i];
-      var codeblocks = subband.codeblocks;
-      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
-        var codeblock = codeblocks[j];
-        if (codeblock.precinctNumber != precinctNumber)
-          continue;
-        precinctCodeblocks.push(codeblock);
-      }
-    }
-    return {
-      layerNumber: layerNumber,
-      codeblocks: precinctCodeblocks
-    };
-  }
-  function LayerResolutionComponentPositionIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var maxDecompositionLevelsCount = 0;
-    for (var q = 0; q < componentsCount; q++) {
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
-        tile.components[q].codingStyleParameters.decompositionLevelsCount);
-    }
-
-    var l = 0, r = 0, i = 0, k = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.1 Layer-resolution-component-position
-      for (; l < layersCount; l++) {
-        for (; r <= maxDecompositionLevelsCount; r++) {
-          for (; i < componentsCount; i++) {
-            var component = tile.components[i];
-            if (r > component.codingStyleParameters.decompositionLevelsCount)
-              continue;
-
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
-            for (; k < numprecincts;) {
-              var packet = createPacket(resolution, k, l);
-              k++;
-              return packet;
-            }
-            k = 0;
-          }
-          i = 0;
-        }
-        r = 0;
-      }
-      throw 'Out of packets';
-    };
-  }
-  function ResolutionLayerComponentPositionIterator(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var layersCount = tile.codingStyleDefaultParameters.layersCount;
-    var componentsCount = siz.Csiz;
-    var maxDecompositionLevelsCount = 0;
-    for (var q = 0; q < componentsCount; q++) {
-      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
-        tile.components[q].codingStyleParameters.decompositionLevelsCount);
-    }
-
-    var r = 0, l = 0, i = 0, k = 0;
-
-    this.nextPacket = function JpxImage_nextPacket() {
-      // Section B.12.1.2 Resolution-layer-component-position
-      for (; r <= maxDecompositionLevelsCount; r++) {
-        for (; l < layersCount; l++) {
-          for (; i < componentsCount; i++) {
-            var component = tile.components[i];
-            if (r > component.codingStyleParameters.decompositionLevelsCount)
-              continue;
-
-            var resolution = component.resolutions[r];
-            var numprecincts = resolution.precinctParameters.numprecincts;
-            for (; k < numprecincts;) {
-              var packet = createPacket(resolution, k, l);
-              k++;
-              return packet;
-            }
-            k = 0;
-          }
-          i = 0;
-        }
-        l = 0;
-      }
-      throw 'Out of packets';
-    };
-  }
-  function buildPackets(context) {
-    var siz = context.SIZ;
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var componentsCount = siz.Csiz;
-    // Creating resolutions and sub-bands for each component
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var decompositionLevelsCount =
-        component.codingStyleParameters.decompositionLevelsCount;
-      // Section B.5 Resolution levels and sub-bands
-      var resolutions = [];
-      var subbands = [];
-      for (var r = 0; r <= decompositionLevelsCount; r++) {
-        var blocksDimensions = getBlocksDimensions(context, component, r);
-        var resolution = {};
-        var scale = 1 << (decompositionLevelsCount - r);
-        resolution.trx0 = Math.ceil(component.tcx0 / scale);
-        resolution.try0 = Math.ceil(component.tcy0 / scale);
-        resolution.trx1 = Math.ceil(component.tcx1 / scale);
-        resolution.try1 = Math.ceil(component.tcy1 / scale);
-        buildPrecincts(context, resolution, blocksDimensions);
-        resolutions.push(resolution);
-
-        var subband;
-        if (r == 0) {
-          // one sub-band (LL) with last decomposition
-          subband = {};
-          subband.type = 'LL';
-          subband.tbx0 = Math.ceil(component.tcx0 / scale);
-          subband.tby0 = Math.ceil(component.tcy0 / scale);
-          subband.tbx1 = Math.ceil(component.tcx1 / scale);
-          subband.tby1 = Math.ceil(component.tcy1 / scale);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolution.subbands = [subband];
-        } else {
-          var bscale = 1 << (decompositionLevelsCount - r + 1);
-          var resolutionSubbands = [];
-          // three sub-bands (HL, LH and HH) with rest of decompositions
-          subband = {};
-          subband.type = 'HL';
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-
-          subband = {};
-          subband.type = 'LH';
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-
-          subband = {};
-          subband.type = 'HH';
-          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
-          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
-          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
-          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
-          subband.resolution = resolution;
-          buildCodeblocks(context, subband, blocksDimensions);
-          subbands.push(subband);
-          resolutionSubbands.push(subband);
-
-          resolution.subbands = resolutionSubbands;
-        }
-      }
-      component.resolutions = resolutions;
-      component.subbands = subbands;
-    }
-    // Generate the packets sequence
-    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
-    var packetsIterator;
-    switch (progressionOrder) {
-      case 0:
-        tile.packetsIterator =
-          new LayerResolutionComponentPositionIterator(context);
-        break;
-      case 1:
-        tile.packetsIterator =
-          new ResolutionLayerComponentPositionIterator(context);
-        break;
-      default:
-        throw 'Unsupported progression order ' + progressionOrder;
-    }
-  }
-  function parseTilePackets(context, data, offset, dataLength) {
-    var position = 0;
-    var buffer, bufferSize = 0, skipNextBit = false;
-    function readBits(count) {
-      while (bufferSize < count) {
-        var b = data[offset + position];
-        position++;
-        if (skipNextBit) {
-          buffer = (buffer << 7) | b;
-          bufferSize += 7;
-          skipNextBit = false;
-        } else {
-          buffer = (buffer << 8) | b;
-          bufferSize += 8;
-        }
-        if (b == 0xFF) {
-          skipNextBit = true;
-        }
-      }
-      bufferSize -= count;
-      return (buffer >>> bufferSize) & ((1 << count) - 1);
-    }
-    function alignToByte() {
-      bufferSize = 0;
-      if (skipNextBit) {
-        position++;
-        skipNextBit = false;
-      }
-    }
-    function readCodingpasses() {
-      var value = readBits(1);
-      if (value == 0)
-        return 1;
-      value = (value << 1) | readBits(1);
-      if (value == 0x02)
-        return 2;
-      value = (value << 2) | readBits(2);
-      if (value <= 0x0E)
-        return (value & 0x03) + 3;
-      value = (value << 5) | readBits(5);
-      if (value <= 0x1FE)
-        return (value & 0x1F) + 6;
-      value = (value << 7) | readBits(7);
-      return (value & 0x7F) + 37;
-    }
-    var tileIndex = context.currentTile.index;
-    var tile = context.tiles[tileIndex];
-    var packetsIterator = tile.packetsIterator;
-    while (position < dataLength) {
-      var packet = packetsIterator.nextPacket();
-      if (!readBits(1)) {
-        alignToByte();
-        continue;
-      }
-      var layerNumber = packet.layerNumber;
-      var queue = [];
-      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
-        var codeblock = packet.codeblocks[i];
-        var precinct = codeblock.precinct;
-        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
-        var codeblockRow = codeblock.cby - precinct.cbyMin;
-        var codeblockIncluded = false;
-        var firstTimeInclusion = false;
-        if ('included' in codeblock) {
-          codeblockIncluded = !!readBits(1);
-        } else {
-          // reading inclusion tree
-          var precinct = codeblock.precinct;
-          var inclusionTree, zeroBitPlanesTree;
-          if ('inclusionTree' in precinct) {
-            inclusionTree = precinct.inclusionTree;
-          } else {
-            // building inclusion and zero bit-planes trees
-            var width = precinct.cbxMax - precinct.cbxMin + 1;
-            var height = precinct.cbyMax - precinct.cbyMin + 1;
-            inclusionTree = new InclusionTree(width, height, layerNumber);
-            zeroBitPlanesTree = new TagTree(width, height);
-            precinct.inclusionTree = inclusionTree;
-            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
-          }
-
-          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
-            while (true) {
-              if (readBits(1)) {
-                var valueReady = !inclusionTree.nextLevel();
-                if (valueReady) {
-                  codeblock.included = true;
-                  codeblockIncluded = firstTimeInclusion = true;
-                  break;
-                }
-              } else {
-                inclusionTree.incrementValue(layerNumber);
-                break;
-              }
-            }
-          }
-        }
-        if (!codeblockIncluded)
-          continue;
-        if (firstTimeInclusion) {
-          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
-          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
-          while (true) {
-            if (readBits(1)) {
-              var valueReady = !zeroBitPlanesTree.nextLevel();
-              if (valueReady)
-                break;
-            } else
-              zeroBitPlanesTree.incrementValue();
-          }
-          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
-        }
-        var codingpasses = readCodingpasses();
-        while (readBits(1))
-          codeblock.Lblock++;
-        var codingpassesLog2 = log2(codingpasses);
-        // rounding down log2
-        var bits = ((codingpasses < (1 << codingpassesLog2)) ?
-          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
-        var codedDataLength = readBits(bits);
-        queue.push({
-          codeblock: codeblock,
-          codingpasses: codingpasses,
-          dataLength: codedDataLength
-        });
-      }
-      alignToByte();
-      while (queue.length > 0) {
-        var packetItem = queue.shift();
-        var codeblock = packetItem.codeblock;
-        if (!('data' in codeblock))
-          codeblock.data = [];
-        codeblock.data.push({
-          data: data,
-          start: offset + position,
-          end: offset + position + packetItem.dataLength,
-          codingpasses: packetItem.codingpasses
-        });
-        position += packetItem.dataLength;
-      }
-    }
-    return position;
-  }
-  function copyCoefficients(coefficients, x0, y0, width, height,
-                            delta, mb, codeblocks, transformation) {
-    var r = 0.5; // formula (E-6)
-    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
-      var codeblock = codeblocks[i];
-      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
-      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
-      if (blockWidth == 0 || blockHeight == 0)
-        continue;
-      if (!('data' in codeblock))
-        continue;
-
-      var bitModel, currentCodingpassType;
-      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
-        codeblock.zeroBitPlanes);
-      currentCodingpassType = 2; // first bit plane starts from cleanup
-
-      // collect data
-      var data = codeblock.data, totalLength = 0, codingpasses = 0;
-      for (var q = 0, qq = data.length; q < qq; q++) {
-        var dataItem = data[q];
-        totalLength += dataItem.end - dataItem.start;
-        codingpasses += dataItem.codingpasses;
-      }
-      var encodedData = new Uint8Array(totalLength), k = 0;
-      for (var q = 0, qq = data.length; q < qq; q++) {
-        var dataItem = data[q];
-        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
-        encodedData.set(chunk, k);
-        k += chunk.length;
-      }
-      // decoding the item
-      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
-      bitModel.setDecoder(decoder);
-
-      for (var q = 0; q < codingpasses; q++) {
-        switch (currentCodingpassType) {
-          case 0:
-            bitModel.runSignificancePropogationPass();
-            break;
-          case 1:
-            bitModel.runMagnitudeRefinementPass();
-            break;
-          case 2:
-            bitModel.runCleanupPass();
-            break;
-        }
-        currentCodingpassType = (currentCodingpassType + 1) % 3;
-      }
-
-      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
-      var position = 0;
-      for (var j = 0; j < blockHeight; j++) {
-        for (var k = 0; k < blockWidth; k++) {
-          var n = (bitModel.coefficentsSign[position] ? -1 : 1) *
-            bitModel.coefficentsMagnitude[position];
-          var nb = bitModel.bitsDecoded[position], correction;
-          if (transformation == 0 || mb > nb) {
-            // use r only if transformation is irreversible or
-            // not all bitplanes were decoded for reversible transformation
-            n += n < 0 ? n - r : n > 0 ? n + r : 0;
-            correction = 1 << (mb - nb);
-          } else
-            correction = 1;
-          coefficients[offset++] = n * correction * delta;
-          position++;
-        }
-        offset += width - blockWidth;
-      }
-    }
-  }
-  function transformTile(context, tile, c) {
-    var component = tile.components[c];
-    var codingStyleParameters = component.codingStyleParameters;
-    var quantizationParameters = component.quantizationParameters;
-    var decompositionLevelsCount =
-      codingStyleParameters.decompositionLevelsCount;
-    var spqcds = quantizationParameters.SPqcds;
-    var scalarExpounded = quantizationParameters.scalarExpounded;
-    var guardBits = quantizationParameters.guardBits;
-    var transformation = codingStyleParameters.transformation;
-    var precision = context.components[c].precision;
-
-    var subbandCoefficients = [];
-    var k = 0, b = 0;
-    for (var i = 0; i <= decompositionLevelsCount; i++) {
-      var resolution = component.resolutions[i];
-
-      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
-        var mu, epsilon;
-        if (!scalarExpounded) {
-          // formula E-5
-          mu = spqcds[0].mu;
-          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
-        } else {
-          mu = spqcds[b].mu;
-          epsilon = spqcds[b].epsilon;
-        }
-
-        var subband = resolution.subbands[j];
-        var width = subband.tbx1 - subband.tbx0;
-        var height = subband.tby1 - subband.tby0;
-        var gainLog2 = SubbandsGainLog2[subband.type];
-
-        // calulate quantization coefficient (Section E.1.1.1)
-        var delta = Math.pow(2, (precision + gainLog2) - epsilon) *
-          (1 + mu / 2048);
-        var mb = (guardBits + epsilon - 1);
-
-        var coefficients = new Float32Array(width * height);
-        copyCoefficients(coefficients, subband.tbx0, subband.tby0,
-          width, height, delta, mb, subband.codeblocks, transformation);
-
-        subbandCoefficients.push({
-          width: width,
-          height: height,
-          items: coefficients
-        });
-
-        b++;
-      }
-    }
-
-    var transformation = codingStyleParameters.transformation;
-    var transform = transformation == 0 ? new IrreversibleTransform() :
-      new ReversibleTransform();
-    var result = transform.calculate(subbandCoefficients,
-      component.tcx0, component.tcy0);
-    return {
-      left: component.tcx0,
-      top: component.tcy0,
-      width: result.width,
-      height: result.height,
-      items: result.items
-    };
-  }
-  function transformComponents(context) {
-    var siz = context.SIZ;
-    var components = context.components;
-    var componentsCount = siz.Csiz;
-    var resultImages = [];
-    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
-      var tile = context.tiles[i];
-      var result = [];
-      for (var c = 0; c < componentsCount; c++) {
-        var image = transformTile(context, tile, c);
-        result.push(image);
-      }
-
-      // Section G.2.2 Inverse multi component transform
-      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
-        var y0items = result[0].items;
-        var y1items = result[1].items;
-        var y2items = result[2].items;
-        for (var j = 0, jj = y0items.length; j < jj; j++) {
-          var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j];
-          var i1 = y0 - ((y2 + y1) >> 2);
-          y1items[j] = i1;
-          y0items[j] = y2 + i1;
-          y2items[j] = y1 + i1;
-        }
-      }
-
-      // Section G.1 DC level shifting to unsigned component values
-      for (var c = 0; c < componentsCount; c++) {
-        var component = components[c];
-        if (component.isSigned)
-          continue;
-
-        var offset = 1 << (component.precision - 1);
-        var tileImage = result[c];
-        var items = tileImage.items;
-        for (var j = 0, jj = items.length; j < jj; j++)
-          items[j] += offset;
-      }
-
-      // To simplify things: shift and clamp output to 8 bit unsigned
-      for (var c = 0; c < componentsCount; c++) {
-        var component = components[c];
-        var offset = component.isSigned ? 128 : 0;
-        var shift = component.precision - 8;
-        var tileImage = result[c];
-        var items = tileImage.items;
-        var data = new Uint8Array(items.length);
-        for (var j = 0, jj = items.length; j < jj; j++) {
-          var value = (items[j] >> shift) + offset;
-          data[j] = value < 0 ? 0 : value > 255 ? 255 : value;
-        }
-        result[c].items = data;
-      }
-
-      resultImages.push(result);
-    }
-    return resultImages;
-  }
-  function initializeTile(context, tileIndex) {
-    var siz = context.SIZ;
-    var componentsCount = siz.Csiz;
-    var tile = context.tiles[tileIndex];
-    var resultTiles = [];
-    for (var c = 0; c < componentsCount; c++) {
-      var component = tile.components[c];
-      var qcdOrQcc = c in context.currentTile.QCC ?
-        context.currentTile.QCC[c] : context.currentTile.QCD;
-      component.quantizationParameters = qcdOrQcc;
-      var codOrCoc = c in context.currentTile.COC ?
-        context.currentTile.COC[c] : context.currentTile.COD;
-      component.codingStyleParameters = codOrCoc;
-    }
-    tile.codingStyleDefaultParameters = context.currentTile.COD;
-  }
-
-  // Section B.10.2 Tag trees
-  var TagTree = (function TagTreeClosure() {
-    function TagTree(width, height) {
-      var levelsLength = log2(Math.max(width, height)) + 1;
-      this.levels = [];
-      for (var i = 0; i < levelsLength; i++) {
-        var level = {
-          width: width,
-          height: height,
-          items: []
-        };
-        this.levels.push(level);
-        width = Math.ceil(width / 2);
-        height = Math.ceil(height / 2);
-      }
-    }
-    TagTree.prototype = {
-      reset: function TagTree_reset(i, j) {
-        var currentLevel = 0, value = 0;
-        while (currentLevel < this.levels.length) {
-          var level = this.levels[currentLevel];
-          var index = i + j * level.width;
-          if (index in level.items) {
-            value = level.items[index];
-            break;
-          }
-          level.index = index;
-          i >>= 1;
-          j >>= 1;
-          currentLevel++;
-        }
-        currentLevel--;
-        var level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        this.currentLevel = currentLevel;
-        delete this.value;
-      },
-      incrementValue: function TagTree_incrementValue() {
-        var level = this.levels[this.currentLevel];
-        level.items[level.index]++;
-      },
-      nextLevel: function TagTree_nextLevel() {
-        var currentLevel = this.currentLevel;
-        var level = this.levels[currentLevel];
-        var value = level.items[level.index];
-        currentLevel--;
-        if (currentLevel < 0) {
-          this.value = value;
-          return false;
-        }
-
-        this.currentLevel = currentLevel;
-        var level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        return true;
-      }
-    };
-    return TagTree;
-  })();
-
-  var InclusionTree = (function InclusionTreeClosure() {
-    function InclusionTree(width, height,  defaultValue) {
-      var levelsLength = log2(Math.max(width, height)) + 1;
-      this.levels = [];
-      for (var i = 0; i < levelsLength; i++) {
-        var items = new Uint8Array(width * height);
-        for (var j = 0, jj = items.length; j < jj; j++)
-          items[j] = defaultValue;
-
-        var level = {
-          width: width,
-          height: height,
-          items: items
-        };
-        this.levels.push(level);
-
-        width = Math.ceil(width / 2);
-        height = Math.ceil(height / 2);
-      }
-    }
-    InclusionTree.prototype = {
-      reset: function InclusionTree_reset(i, j, stopValue) {
-        var currentLevel = 0;
-        while (currentLevel < this.levels.length) {
-          var level = this.levels[currentLevel];
-          var index = i + j * level.width;
-          level.index = index;
-          var value = level.items[index];
-
-          if (value == 0xFF)
-            break;
-
-          if (value > stopValue) {
-            this.currentLevel = currentLevel;
-            // already know about this one, propagating the value to top levels
-            this.propagateValues();
-            return false;
-          }
-
-          i >>= 1;
-          j >>= 1;
-          currentLevel++;
-        }
-        this.currentLevel = currentLevel - 1;
-        return true;
-      },
-      incrementValue: function InclusionTree_incrementValue(stopValue) {
-        var level = this.levels[this.currentLevel];
-        level.items[level.index] = stopValue + 1;
-        this.propagateValues();
-      },
-      propagateValues: function InclusionTree_propagateValues() {
-        var levelIndex = this.currentLevel;
-        var level = this.levels[levelIndex];
-        var currentValue = level.items[level.index];
-        while (--levelIndex >= 0) {
-          var level = this.levels[levelIndex];
-          level.items[level.index] = currentValue;
-        }
-      },
-      nextLevel: function InclusionTree_nextLevel() {
-        var currentLevel = this.currentLevel;
-        var level = this.levels[currentLevel];
-        var value = level.items[level.index];
-        level.items[level.index] = 0xFF;
-        currentLevel--;
-        if (currentLevel < 0)
-          return false;
-
-        this.currentLevel = currentLevel;
-        var level = this.levels[currentLevel];
-        level.items[level.index] = value;
-        return true;
-      }
-    };
-    return InclusionTree;
-  })();
-
-  // Implements C.3. Arithmetic decoding procedures
-  var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
-    var QeTable = [
-      {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
-      {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
-      {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
-      {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
-      {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
-      {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
-      {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
-      {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
-      {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
-      {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
-      {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
-      {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
-      {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
-      {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
-      {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
-      {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
-      {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
-      {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
-      {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
-      {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
-      {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
-      {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
-      {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
-      {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
-      {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
-      {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
-      {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
-      {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
-      {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
-      {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
-      {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
-      {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
-      {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
-      {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
-      {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
-      {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
-      {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
-      {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
-      {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
-      {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
-      {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
-      {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
-      {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
-      {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
-      {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
-      {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
-      {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
-    ];
-
-    function ArithmeticDecoder(data, start, end) {
-      this.data = data;
-      this.bp = start;
-      this.dataEnd = end;
-
-      this.chigh = data[start];
-      this.clow = 0;
-
-      this.byteIn();
-
-      this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
-      this.clow = (this.clow << 7) & 0xFFFF;
-      this.ct -= 7;
-      this.a = 0x8000;
-    }
-
-    ArithmeticDecoder.prototype = {
-      byteIn: function ArithmeticDecoder_byteIn() {
-        var data = this.data;
-        var bp = this.bp;
-        if (data[bp] == 0xFF) {
-          var b1 = data[bp + 1];
-          if (b1 > 0x8F) {
-            this.clow += 0xFF00;
-            this.ct = 8;
-          } else {
-            bp++;
-            this.clow += (data[bp] << 9);
-            this.ct = 7;
-            this.bp = bp;
-          }
-        } else {
-          bp++;
-          this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
-          this.ct = 8;
-          this.bp = bp;
-        }
-        if (this.clow > 0xFFFF) {
-          this.chigh += (this.clow >> 16);
-          this.clow &= 0xFFFF;
-        }
-      },
-      readBit: function ArithmeticDecoder_readBit(cx) {
-        var qeIcx = QeTable[cx.index].qe;
-        this.a -= qeIcx;
-
-        if (this.chigh < qeIcx) {
-          var d = this.exchangeLps(cx);
-          this.renormD();
-          return d;
-        } else {
-          this.chigh -= qeIcx;
-          if ((this.a & 0x8000) == 0) {
-            var d = this.exchangeMps(cx);
-            this.renormD();
-            return d;
-          } else {
-            return cx.mps;
-          }
-        }
-      },
-      renormD: function ArithmeticDecoder_renormD() {
-        do {
-          if (this.ct == 0)
-            this.byteIn();
-
-          this.a <<= 1;
-          this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
-          this.clow = (this.clow << 1) & 0xFFFF;
-          this.ct--;
-        } while ((this.a & 0x8000) == 0);
-      },
-      exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
-        var d;
-        var qeTableIcx = QeTable[cx.index];
-        if (this.a < qeTableIcx.qe) {
-          d = 1 - cx.mps;
-
-          if (qeTableIcx.switchFlag == 1) {
-            cx.mps = 1 - cx.mps;
-          }
-          cx.index = qeTableIcx.nlps;
-        } else {
-          d = cx.mps;
-          cx.index = qeTableIcx.nmps;
-        }
-        return d;
-      },
-      exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
-        var d;
-        var qeTableIcx = QeTable[cx.index];
-        if (this.a < qeTableIcx.qe) {
-          this.a = qeTableIcx.qe;
-          d = cx.mps;
-          cx.index = qeTableIcx.nmps;
-        } else {
-          this.a = qeTableIcx.qe;
-          d = 1 - cx.mps;
-
-          if (qeTableIcx.switchFlag == 1) {
-            cx.mps = 1 - cx.mps;
-          }
-          cx.index = qeTableIcx.nlps;
-        }
-        return d;
-      }
-    };
-
-    return ArithmeticDecoder;
-  })();
-
-  // Section D. Coefficient bit modeling
-  var BitModel = (function BitModelClosure() {
-    // Table D-1
-    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
-    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
-    var LLAndLHContextsLabel = new Uint8Array([
-      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
-      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
-      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
-    ]);
-    var HLContextLabel = new Uint8Array([
-      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
-      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
-      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
-    ]);
-    var HHContextLabel = new Uint8Array([
-      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
-      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
-      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
-    ]);
-
-    // Table D-2
-    function calcSignContribution(significance0, sign0, significance1, sign1) {
-      if (significance1) {
-        if (!sign1)
-          return significance0 ? (!sign0 ? 1 : 0) : 1;
-        else
-          return significance0 ? (!sign0 ? 0 : -1) : -1;
-      } else
-        return significance0 ? (!sign0 ? 1 : -1) : 0;
-    }
-    // Table D-3
-    var SignContextLabels = [
-      {contextLabel: 13, xorBit: 0},
-      {contextLabel: 12, xorBit: 0},
-      {contextLabel: 11, xorBit: 0},
-      {contextLabel: 10, xorBit: 0},
-      {contextLabel: 9, xorBit: 0},
-      {contextLabel: 10, xorBit: 1},
-      {contextLabel: 11, xorBit: 1},
-      {contextLabel: 12, xorBit: 1},
-      {contextLabel: 13, xorBit: 1}
-    ];
-
-    function BitModel(width, height, subband, zeroBitPlanes) {
-      this.width = width;
-      this.height = height;
-
-      this.contextLabelTable = subband == 'HH' ? HHContextLabel :
-        subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel;
-
-      var coefficientCount = width * height;
-
-      // coefficients outside the encoding region treated as insignificant
-      // add border state cells for significanceState
-      this.neighborsSignificance = new Uint8Array(coefficientCount);
-      this.coefficentsSign = new Uint8Array(coefficientCount);
-      this.coefficentsMagnitude = new Uint32Array(coefficientCount);
-      this.processingFlags = new Uint8Array(coefficientCount);
-
-      var bitsDecoded = new Uint8Array(this.width * this.height);
-      for (var i = 0, ii = bitsDecoded.length; i < ii; i++)
-        bitsDecoded[i] = zeroBitPlanes;
-      this.bitsDecoded = bitsDecoded;
-
-      this.reset();
-    }
-
-    BitModel.prototype = {
-      setDecoder: function BitModel_setDecoder(decoder) {
-        this.decoder = decoder;
-      },
-      reset: function BitModel_reset() {
-        this.uniformContext = {index: 46, mps: 0};
-        this.runLengthContext = {index: 3, mps: 0};
-        this.contexts = [];
-        this.contexts.push({index: 4, mps: 0});
-        for (var i = 1; i <= 16; i++)
-          this.contexts.push({index: 0, mps: 0});
-      },
-      setNeighborsSignificance:
-        function BitModel_setNeighborsSignificance(row, column) {
-        var neighborsSignificance = this.neighborsSignificance;
-        var width = this.width, height = this.height;
-        var index = row * width + column;
-        if (row > 0) {
-          if (column > 0)
-            neighborsSignificance[index - width - 1] += 0x10;
-          if (column + 1 < width)
-            neighborsSignificance[index - width + 1] += 0x10;
-          neighborsSignificance[index - width] += 0x04;
-        }
-        if (row + 1 < height) {
-          if (column > 0)
-            neighborsSignificance[index + width - 1] += 0x10;
-          if (column + 1 < width)
-            neighborsSignificance[index + width + 1] += 0x10;
-          neighborsSignificance[index + width] += 0x04;
-        }
-        if (column > 0)
-          neighborsSignificance[index - 1] += 0x01;
-        if (column + 1 < width)
-          neighborsSignificance[index + 1] += 0x01;
-        neighborsSignificance[index] |= 0x80;
-      },
-      runSignificancePropogationPass:
-        function BitModel_runSignificancePropogationPass() {
-        var decoder = this.decoder;
-        var width = this.width, height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var contextLabels = this.contextLabels;
-        var neighborsSignificance = this.neighborsSignificance;
-        var processingFlags = this.processingFlags;
-        var contexts = this.contexts;
-        var labels = this.contextLabelTable;
-        var bitsDecoded = this.bitsDecoded;
-        // clear processed flag
-        var processedInverseMask = ~1;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        for (var q = 0, qq = width * height; q < qq; q++)
-          processingFlags[q] &= processedInverseMask;
-
-        for (var i0 = 0; i0 < height; i0 += 4) {
-          for (var j = 0; j < width; j++) {
-            var index = i0 * width + j;
-            for (var i1 = 0; i1 < 4; i1++, index += width) {
-              var i = i0 + i1;
-              if (i >= height)
-                break;
-
-              if (coefficentsMagnitude[index] || !neighborsSignificance[index])
-                continue;
-
-              var contextLabel = labels[neighborsSignificance[index]];
-              var cx = contexts[contextLabel];
-              var decision = decoder.readBit(cx);
-              if (decision) {
-                var sign = this.decodeSignBit(i, j);
-                coefficentsSign[index] = sign;
-                coefficentsMagnitude[index] = 1;
-                this.setNeighborsSignificance(i, j);
-                processingFlags[index] |= firstMagnitudeBitMask;
-              }
-              bitsDecoded[index]++;
-              processingFlags[index] |= processedMask;
-            }
-          }
-        }
-      },
-      decodeSignBit: function BitModel_decodeSignBit(row, column) {
-        var width = this.width, height = this.height;
-        var index = row * width + column;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var horizontalContribution = calcSignContribution(
-          column > 0 && coefficentsMagnitude[index - 1],
-          coefficentsSign[index - 1],
-          column + 1 < width && coefficentsMagnitude[index + 1],
-          coefficentsSign[index + 1]);
-        var verticalContribution = calcSignContribution(
-          row > 0 && coefficentsMagnitude[index - width],
-          coefficentsSign[index - width],
-          row + 1 < height && coefficentsMagnitude[index + width],
-          coefficentsSign[index + width]);
-
-        var contextLabelAndXor = SignContextLabels[
-          3 * (1 - horizontalContribution) + (1 - verticalContribution)];
-        var contextLabel = contextLabelAndXor.contextLabel;
-        var cx = this.contexts[contextLabel];
-        var decoded = this.decoder.readBit(cx);
-        return decoded ^ contextLabelAndXor.xorBit;
-      },
-      runMagnitudeRefinementPass:
-        function BitModel_runMagnitudeRefinementPass() {
-        var decoder = this.decoder;
-        var width = this.width, height = this.height;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var neighborsSignificance = this.neighborsSignificance;
-        var contexts = this.contexts;
-        var bitsDecoded = this.bitsDecoded;
-        var processingFlags = this.processingFlags;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        for (var i0 = 0; i0 < height; i0 += 4) {
-          for (var j = 0; j < width; j++) {
-            for (var i1 = 0; i1 < 4; i1++) {
-              var i = i0 + i1;
-              if (i >= height)
-                break;
-              var index = i * width + j;
-
-              // significant but not those that have just become
-              if (!coefficentsMagnitude[index] ||
-                (processingFlags[index] & processedMask) != 0)
-                continue;
-
-              var contextLabel = 16;
-              if ((processingFlags[index] &
-                firstMagnitudeBitMask) != 0) {
-                processingFlags[i * width + j] ^= firstMagnitudeBitMask;
-                // first refinement
-                var significance = neighborsSignificance[index];
-                var sumOfSignificance = (significance & 3) +
-                  ((significance >> 2) & 3) + ((significance >> 4) & 7);
-                contextLabel = sumOfSignificance >= 1 ? 15 : 14;
-              }
-
-              var cx = contexts[contextLabel];
-              var bit = decoder.readBit(cx);
-              coefficentsMagnitude[index] =
-                (coefficentsMagnitude[index] << 1) | bit;
-              bitsDecoded[index]++;
-              processingFlags[index] |= processedMask;
-            }
-          }
-        }
-      },
-      runCleanupPass: function BitModel_runCleanupPass() {
-        var decoder = this.decoder;
-        var width = this.width, height = this.height;
-        var neighborsSignificance = this.neighborsSignificance;
-        var significanceState = this.significanceState;
-        var coefficentsMagnitude = this.coefficentsMagnitude;
-        var coefficentsSign = this.coefficentsSign;
-        var contexts = this.contexts;
-        var labels = this.contextLabelTable;
-        var bitsDecoded = this.bitsDecoded;
-        var processingFlags = this.processingFlags;
-        var processedMask = 1;
-        var firstMagnitudeBitMask = 2;
-        var oneRowDown = width;
-        var twoRowsDown = width * 2;
-        var threeRowsDown = width * 3;
-        for (var i0 = 0; i0 < height; i0 += 4) {
-          for (var j = 0; j < width; j++) {
-            var index0 = i0 * width + j;
-            // using the property: labels[neighborsSignificance[index]] == 0
-            // when neighborsSignificance[index] == 0
-            var allEmpty = i0 + 3 < height &&
-              processingFlags[index0] == 0 &&
-              processingFlags[index0 + oneRowDown] == 0 &&
-              processingFlags[index0 + twoRowsDown] == 0 &&
-              processingFlags[index0 + threeRowsDown] == 0 &&
-              neighborsSignificance[index0] == 0 &&
-              neighborsSignificance[index0 + oneRowDown] == 0 &&
-              neighborsSignificance[index0 + twoRowsDown] == 0 &&
-              neighborsSignificance[index0 + threeRowsDown] == 0;
-            var i1 = 0, index = index0;
-            var cx, i;
-            if (allEmpty) {
-              cx = this.runLengthContext;
-              var hasSignificantCoefficent = decoder.readBit(cx);
-              if (!hasSignificantCoefficent) {
-                bitsDecoded[index0]++;
-                bitsDecoded[index0 + oneRowDown]++;
-                bitsDecoded[index0 + twoRowsDown]++;
-                bitsDecoded[index0 + threeRowsDown]++;
-                continue; // next column
-              }
-              cx = this.uniformContext;
-              i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
-              i = i0 + i1;
-              index += i1 * width;
-
-              var sign = this.decodeSignBit(i, j);
-              coefficentsSign[index] = sign;
-              coefficentsMagnitude[index] = 1;
-              this.setNeighborsSignificance(i, j);
-              processingFlags[index] |= firstMagnitudeBitMask;
-
-              index = index0;
-              for (var i2 = i0; i2 <= i; i2++, index += width)
-                bitsDecoded[index]++;
-
-              i1++;
-            }
-            for (; i1 < 4; i1++, index += width) {
-              i = i0 + i1;
-              if (i >= height)
-                break;
-
-              if (coefficentsMagnitude[index] ||
-                (processingFlags[index] & processedMask) != 0)
-                continue;
-
-              var contextLabel = labels[neighborsSignificance[index]];
-              cx = contexts[contextLabel];
-              var decision = decoder.readBit(cx);
-              if (decision == 1) {
-                var sign = this.decodeSignBit(i, j);
-                coefficentsSign[index] = sign;
-                coefficentsMagnitude[index] = 1;
-                this.setNeighborsSignificance(i, j);
-                processingFlags[index] |= firstMagnitudeBitMask;
-              }
-              bitsDecoded[index]++;
-            }
-          }
-        }
-      }
-    };
-
-    return BitModel;
-  })();
-
-  // Section F, Discrete wavelet transofrmation
-  var Transform = (function TransformClosure() {
-    function Transform() {
-    }
-    Transform.prototype.calculate =
-      function transformCalculate(subbands, u0, v0) {
-      var ll = subbands[0];
-      for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) {
-        ll = this.iterate(ll, subbands[i], subbands[i + 1],
-                          subbands[i + 2], u0, v0);
-      }
-      return ll;
-    };
-    Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
-                                                            u0, v0) {
-      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
-      var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items;
-      var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items;
-      var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items;
-
-      // Section F.3.3 interleave
-      var width = llWidth + hlWidth;
-      var height = llHeight + lhHeight;
-      var items = new Float32Array(width * height);
-      for (var i = 0, ii = llHeight; i < ii; i++) {
-        var k = i * llWidth, l = i * 2 * width;
-        for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2)
-          items[l] = llItems[k];
-      }
-      for (var i = 0, ii = hlHeight; i < ii; i++) {
-        var k = i * hlWidth, l = i * 2 * width + 1;
-        for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2)
-          items[l] = hlItems[k];
-      }
-      for (var i = 0, ii = lhHeight; i < ii; i++) {
-        var k = i * lhWidth, l = (i * 2 + 1) * width;
-        for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2)
-          items[l] = lhItems[k];
-      }
-      for (var i = 0, ii = hhHeight; i < ii; i++) {
-        var k = i * hhWidth, l = (i * 2 + 1) * width + 1;
-        for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2)
-          items[l] = hhItems[k];
-      }
-
-      var bufferPadding = 4;
-      var bufferLength = new Float32Array(Math.max(width, height) +
-        2 * bufferPadding);
-      var buffer = new Float32Array(bufferLength);
-      var bufferOut = new Float32Array(bufferLength);
-
-      // Section F.3.4 HOR_SR
-      for (var v = 0; v < height; v++) {
-        if (width == 1) {
-          // if width = 1, when u0 even keep items as is, when odd divide by 2
-          if ((u0 % 1) != 0) {
-            items[v * width] /= 2;
-          }
-          continue;
-        }
-
-        var k = v * width;
-        var l = bufferPadding;
-        for (var u = 0; u < width; u++, k++, l++)
-          buffer[l] = items[k];
-
-        // Section F.3.7 extending... using max extension of 4
-        var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
-        var i2 = bufferPadding + width - 2, j2 = bufferPadding + width;
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-
-        this.filter(buffer, bufferPadding, width, u0, bufferOut);
-
-        k = v * width;
-        l = bufferPadding;
-        for (var u = 0; u < width; u++, k++, l++)
-          items[k] = bufferOut[l];
-      }
-
-      // Section F.3.5 VER_SR
-      for (var u = 0; u < width; u++) {
-        if (height == 1) {
-          // if height = 1, when v0 even keep items as is, when odd divide by 2
-          if ((v0 % 1) != 0) {
-            items[u] /= 2;
-          }
-          continue;
-        }
-
-        var k = u;
-        var l = bufferPadding;
-        for (var v = 0; v < height; v++, k += width, l++)
-          buffer[l] = items[k];
-
-        // Section F.3.7 extending... using max extension of 4
-        var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
-        var i2 = bufferPadding + height - 2, j2 = bufferPadding + height;
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-        buffer[i1--] = buffer[j1++];
-        buffer[j2++] = buffer[i2--];
-
-        this.filter(buffer, bufferPadding, height, v0, bufferOut);
-
-        k = u;
-        l = bufferPadding;
-        for (var v = 0; v < height; v++, k += width, l++)
-          items[k] = bufferOut[l];
-      }
-      return {
-        width: width,
-        height: height,
-        items: items
-      };
-    };
-    return Transform;
-  })();
-
-  // Section 3.8.2 Irreversible 9-7 filter
-  var IrreversibleTransform = (function IrreversibleTransformClosure() {
-    function IrreversibleTransform() {
-      Transform.call(this);
-    }
-
-    IrreversibleTransform.prototype = Object.create(Transform.prototype);
-    IrreversibleTransform.prototype.filter =
-      function irreversibleTransformFilter(y, offset, length, i0, x) {
-      var i0_ = Math.floor(i0 / 2);
-      var i1_ = Math.floor((i0 + length) / 2);
-      var offset_ = offset - (i0 % 1);
-
-      var alpha = -1.586134342059924;
-      var beta = -0.052980118572961;
-      var gamma = 0.882911075530934;
-      var delta = 0.443506852043971;
-      var K = 1.230174104914001;
-      var K_ = 1 / K;
-
-      // step 1
-      var j = offset_ - 2;
-      for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
-        x[j] = K * y[j];
-
-      // step 2
-      var j = offset_ - 3;
-      for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
-        x[j] = K_ * y[j];
-
-      // step 3
-      var j = offset_ - 2;
-      for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
-        x[j] -= delta * (x[j - 1] + x[j + 1]);
-
-      // step 4
-      var j = offset_ - 1;
-      for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2)
-        x[j] -= gamma * (x[j - 1] + x[j + 1]);
-
-      // step 5
-      var j = offset_;
-      for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
-        x[j] -= beta * (x[j - 1] + x[j + 1]);
-
-      // step 6
-      var j = offset_ + 1;
-      for (var n = i0_, nn = i1_; n < nn; n++, j += 2)
-        x[j] -= alpha * (x[j - 1] + x[j + 1]);
-    };
-
-    return IrreversibleTransform;
-  })();
-
-  // Section 3.8.1 Reversible 5-3 filter
-  var ReversibleTransform = (function ReversibleTransformClosure() {
-    function ReversibleTransform() {
-      Transform.call(this);
-    }
-
-    ReversibleTransform.prototype = Object.create(Transform.prototype);
-    ReversibleTransform.prototype.filter =
-      function reversibleTransformFilter(y, offset, length, i0, x) {
-      var i0_ = Math.floor(i0 / 2);
-      var i1_ = Math.floor((i0 + length) / 2);
-      var offset_ = offset - (i0 % 1);
-
-      for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2)
-        x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4);
-
-      for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2)
-        x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2);
-    };
-
-    return ReversibleTransform;
-  })();
-
-  return JpxImage;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/metadata.js b/apps/files_pdfviewer/js/pdfjs/src/metadata.js
deleted file mode 100644
index f3805616866b8070abc9745c907d2ea2fa7c28c9..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/metadata.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var Metadata = PDFJS.Metadata = (function MetadataClosure() {
-  function Metadata(meta) {
-    if (typeof meta === 'string') {
-      var parser = new DOMParser();
-      meta = parser.parseFromString(meta, 'application/xml');
-    } else if (!(meta instanceof Document)) {
-      error('Metadata: Invalid metadata object');
-    }
-
-    this.metaDocument = meta;
-    this.metadata = {};
-    this.parse();
-  }
-
-  Metadata.prototype = {
-    parse: function Metadata_parse() {
-      var doc = this.metaDocument;
-      var rdf = doc.documentElement;
-
-      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
-        rdf = rdf.firstChild;
-        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf')
-          rdf = rdf.nextSibling;
-      }
-
-      var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
-      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
-        return;
-
-      var childNodes = rdf.childNodes, desc, namespace, entries, entry;
-
-      for (var i = 0, length = childNodes.length; i < length; i++) {
-        desc = childNodes[i];
-        if (desc.nodeName.toLowerCase() !== 'rdf:description')
-          continue;
-
-        entries = [];
-        for (var ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
-          if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text')
-            entries.push(desc.childNodes[ii]);
-        }
-
-        for (ii = 0, iLength = entries.length; ii < iLength; ii++) {
-          var entry = entries[ii];
-          var name = entry.nodeName.toLowerCase();
-          this.metadata[name] = entry.textContent.trim();
-        }
-      }
-    },
-
-    get: function Metadata_get(name) {
-      return this.metadata[name] || null;
-    },
-
-    has: function Metadata_has(name) {
-      return typeof this.metadata[name] !== 'undefined';
-    }
-  };
-
-  return Metadata;
-})();
diff --git a/apps/files_pdfviewer/js/pdfjs/src/metrics.js b/apps/files_pdfviewer/js/pdfjs/src/metrics.js
deleted file mode 100644
index e64961aa78a9b1c454d0af52a5af3b5eae7d3a64..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/metrics.js
+++ /dev/null
@@ -1,2947 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-// The Metrics object contains glyph widths (in glyph space units).
-// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
-// space unit corresponds to 1/1000th of text space unit.
-var Metrics = {
-  'Courier': 600,
-  'Courier-Bold': 600,
-  'Courier-BoldOblique': 600,
-  'Courier-Oblique': 600,
-  'Helvetica' : {
-    'space': 278,
-    'exclam': 278,
-    'quotedbl': 355,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 667,
-    'quoteright': 222,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 556,
-    'at': 1015,
-    'A': 667,
-    'B': 667,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 500,
-    'K': 667,
-    'L': 556,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 278,
-    'backslash': 278,
-    'bracketright': 278,
-    'asciicircum': 469,
-    'underscore': 556,
-    'quoteleft': 222,
-    'a': 556,
-    'b': 556,
-    'c': 500,
-    'd': 556,
-    'e': 556,
-    'f': 278,
-    'g': 556,
-    'h': 556,
-    'i': 222,
-    'j': 222,
-    'k': 500,
-    'l': 222,
-    'm': 833,
-    'n': 556,
-    'o': 556,
-    'p': 556,
-    'q': 556,
-    'r': 333,
-    's': 500,
-    't': 278,
-    'u': 556,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 500,
-    'braceleft': 334,
-    'bar': 260,
-    'braceright': 334,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 191,
-    'quotedblleft': 333,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 500,
-    'fl': 500,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 537,
-    'bullet': 350,
-    'quotesinglbase': 222,
-    'quotedblbase': 333,
-    'quotedblright': 333,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 556,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 222,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 556,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 667,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 500,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 500,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 222,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 500,
-    'scedilla': 500,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 556,
-    'acircumflex': 556,
-    'Amacron': 667,
-    'rcaron': 333,
-    'ccedilla': 500,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 643,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 667,
-    'Abreve': 667,
-    'multiply': 584,
-    'uacute': 556,
-    'Tcaron': 611,
-    'partialdiff': 476,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 500,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 260,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 333,
-    'omacron': 556,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 222,
-    'tcaron': 317,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 667,
-    'Adieresis': 667,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 222,
-    'Oacute': 778,
-    'oacute': 556,
-    'amacron': 556,
-    'sacute': 500,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 556,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 556,
-    'igrave': 278,
-    'ohungarumlaut': 556,
-    'Eogonek': 667,
-    'dcroat': 556,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 299,
-    'Kcommaaccent': 667,
-    'Lacute': 556,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 556,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 556,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 556,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 556,
-    'Ccaron': 722,
-    'ugrave': 556,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 333,
-    'Ntilde': 722,
-    'otilde': 556,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 556,
-    'Atilde': 667,
-    'Aogonek': 667,
-    'Aring': 667,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 500,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 556,
-    'tcommaaccent': 278,
-    'logicalnot': 584,
-    'odieresis': 556,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 556,
-    'eth': 556,
-    'zcaron': 500,
-    'ncommaaccent': 556,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Helvetica-Bold': {
-    'space': 278,
-    'exclam': 333,
-    'quotedbl': 474,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 722,
-    'quoteright': 278,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 611,
-    'at': 975,
-    'A': 722,
-    'B': 722,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 556,
-    'K': 722,
-    'L': 611,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 584,
-    'underscore': 556,
-    'quoteleft': 278,
-    'a': 556,
-    'b': 611,
-    'c': 556,
-    'd': 611,
-    'e': 556,
-    'f': 333,
-    'g': 611,
-    'h': 611,
-    'i': 278,
-    'j': 278,
-    'k': 556,
-    'l': 278,
-    'm': 889,
-    'n': 611,
-    'o': 611,
-    'p': 611,
-    'q': 611,
-    'r': 389,
-    's': 556,
-    't': 333,
-    'u': 611,
-    'v': 556,
-    'w': 778,
-    'x': 556,
-    'y': 556,
-    'z': 500,
-    'braceleft': 389,
-    'bar': 280,
-    'braceright': 389,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 238,
-    'quotedblleft': 500,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 611,
-    'fl': 611,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 556,
-    'bullet': 350,
-    'quotesinglbase': 278,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 611,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 611,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 722,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 556,
-    'scommaaccent': 556,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 611,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 556,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 556,
-    'scedilla': 556,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 611,
-    'acircumflex': 556,
-    'Amacron': 722,
-    'rcaron': 389,
-    'ccedilla': 556,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 743,
-    'Umacron': 722,
-    'uring': 611,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 584,
-    'uacute': 611,
-    'Tcaron': 611,
-    'partialdiff': 494,
-    'ydieresis': 556,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 556,
-    'nacute': 611,
-    'umacron': 611,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 280,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 389,
-    'omacron': 611,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 278,
-    'tcaron': 389,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 278,
-    'Oacute': 778,
-    'oacute': 611,
-    'amacron': 556,
-    'sacute': 556,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 611,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 611,
-    'igrave': 278,
-    'ohungarumlaut': 611,
-    'Eogonek': 667,
-    'dcroat': 611,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 400,
-    'Kcommaaccent': 722,
-    'Lacute': 611,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 611,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 611,
-    'ntilde': 611,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 611,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 611,
-    'Ccaron': 722,
-    'ugrave': 611,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 722,
-    'otilde': 611,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 611,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 556,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 611,
-    'tcommaaccent': 333,
-    'logicalnot': 584,
-    'odieresis': 611,
-    'udieresis': 611,
-    'notequal': 549,
-    'gcommaaccent': 611,
-    'eth': 611,
-    'zcaron': 500,
-    'ncommaaccent': 611,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Helvetica-BoldOblique': {
-    'space': 278,
-    'exclam': 333,
-    'quotedbl': 474,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 722,
-    'quoteright': 278,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 611,
-    'at': 975,
-    'A': 722,
-    'B': 722,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 556,
-    'K': 722,
-    'L': 611,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 584,
-    'underscore': 556,
-    'quoteleft': 278,
-    'a': 556,
-    'b': 611,
-    'c': 556,
-    'd': 611,
-    'e': 556,
-    'f': 333,
-    'g': 611,
-    'h': 611,
-    'i': 278,
-    'j': 278,
-    'k': 556,
-    'l': 278,
-    'm': 889,
-    'n': 611,
-    'o': 611,
-    'p': 611,
-    'q': 611,
-    'r': 389,
-    's': 556,
-    't': 333,
-    'u': 611,
-    'v': 556,
-    'w': 778,
-    'x': 556,
-    'y': 556,
-    'z': 500,
-    'braceleft': 389,
-    'bar': 280,
-    'braceright': 389,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 238,
-    'quotedblleft': 500,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 611,
-    'fl': 611,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 556,
-    'bullet': 350,
-    'quotesinglbase': 278,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 611,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 611,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 722,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 556,
-    'scommaaccent': 556,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 611,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 556,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 556,
-    'scedilla': 556,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 611,
-    'acircumflex': 556,
-    'Amacron': 722,
-    'rcaron': 389,
-    'ccedilla': 556,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 743,
-    'Umacron': 722,
-    'uring': 611,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 584,
-    'uacute': 611,
-    'Tcaron': 611,
-    'partialdiff': 494,
-    'ydieresis': 556,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 556,
-    'nacute': 611,
-    'umacron': 611,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 280,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 389,
-    'omacron': 611,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 278,
-    'tcaron': 389,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 278,
-    'Oacute': 778,
-    'oacute': 611,
-    'amacron': 556,
-    'sacute': 556,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 611,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 611,
-    'igrave': 278,
-    'ohungarumlaut': 611,
-    'Eogonek': 667,
-    'dcroat': 611,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 400,
-    'Kcommaaccent': 722,
-    'Lacute': 611,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 611,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 611,
-    'ntilde': 611,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 611,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 611,
-    'Ccaron': 722,
-    'ugrave': 611,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 722,
-    'otilde': 611,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 611,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 556,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 611,
-    'tcommaaccent': 333,
-    'logicalnot': 584,
-    'odieresis': 611,
-    'udieresis': 611,
-    'notequal': 549,
-    'gcommaaccent': 611,
-    'eth': 611,
-    'zcaron': 500,
-    'ncommaaccent': 611,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Helvetica-Oblique' : {
-    'space': 278,
-    'exclam': 278,
-    'quotedbl': 355,
-    'numbersign': 556,
-    'dollar': 556,
-    'percent': 889,
-    'ampersand': 667,
-    'quoteright': 222,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 389,
-    'plus': 584,
-    'comma': 278,
-    'hyphen': 333,
-    'period': 278,
-    'slash': 278,
-    'zero': 556,
-    'one': 556,
-    'two': 556,
-    'three': 556,
-    'four': 556,
-    'five': 556,
-    'six': 556,
-    'seven': 556,
-    'eight': 556,
-    'nine': 556,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 584,
-    'equal': 584,
-    'greater': 584,
-    'question': 556,
-    'at': 1015,
-    'A': 667,
-    'B': 667,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 722,
-    'I': 278,
-    'J': 500,
-    'K': 667,
-    'L': 556,
-    'M': 833,
-    'N': 722,
-    'O': 778,
-    'P': 667,
-    'Q': 778,
-    'R': 722,
-    'S': 667,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 944,
-    'X': 667,
-    'Y': 667,
-    'Z': 611,
-    'bracketleft': 278,
-    'backslash': 278,
-    'bracketright': 278,
-    'asciicircum': 469,
-    'underscore': 556,
-    'quoteleft': 222,
-    'a': 556,
-    'b': 556,
-    'c': 500,
-    'd': 556,
-    'e': 556,
-    'f': 278,
-    'g': 556,
-    'h': 556,
-    'i': 222,
-    'j': 222,
-    'k': 500,
-    'l': 222,
-    'm': 833,
-    'n': 556,
-    'o': 556,
-    'p': 556,
-    'q': 556,
-    'r': 333,
-    's': 500,
-    't': 278,
-    'u': 556,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 500,
-    'braceleft': 334,
-    'bar': 260,
-    'braceright': 334,
-    'asciitilde': 584,
-    'exclamdown': 333,
-    'cent': 556,
-    'sterling': 556,
-    'fraction': 167,
-    'yen': 556,
-    'florin': 556,
-    'section': 556,
-    'currency': 556,
-    'quotesingle': 191,
-    'quotedblleft': 333,
-    'guillemotleft': 556,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 500,
-    'fl': 500,
-    'endash': 556,
-    'dagger': 556,
-    'daggerdbl': 556,
-    'periodcentered': 278,
-    'paragraph': 537,
-    'bullet': 350,
-    'quotesinglbase': 222,
-    'quotedblbase': 333,
-    'quotedblright': 333,
-    'guillemotright': 556,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 611,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 370,
-    'Lslash': 556,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 365,
-    'ae': 889,
-    'dotlessi': 278,
-    'lslash': 222,
-    'oslash': 611,
-    'oe': 944,
-    'germandbls': 611,
-    'Idieresis': 278,
-    'eacute': 556,
-    'abreve': 556,
-    'uhungarumlaut': 556,
-    'ecaron': 556,
-    'Ydieresis': 667,
-    'divide': 584,
-    'Yacute': 667,
-    'Acircumflex': 667,
-    'aacute': 556,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 500,
-    'ecircumflex': 556,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 556,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 737,
-    'Emacron': 667,
-    'ccaron': 500,
-    'aring': 556,
-    'Ncommaaccent': 722,
-    'lacute': 222,
-    'agrave': 556,
-    'Tcommaaccent': 611,
-    'Cacute': 722,
-    'atilde': 556,
-    'Edotaccent': 667,
-    'scaron': 500,
-    'scedilla': 500,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 556,
-    'acircumflex': 556,
-    'Amacron': 667,
-    'rcaron': 333,
-    'ccedilla': 500,
-    'Zdotaccent': 611,
-    'Thorn': 667,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 667,
-    'dcaron': 643,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 333,
-    'Ograve': 778,
-    'Agrave': 667,
-    'Abreve': 667,
-    'multiply': 584,
-    'uacute': 556,
-    'Tcaron': 611,
-    'partialdiff': 476,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 556,
-    'edieresis': 556,
-    'cacute': 500,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 278,
-    'plusminus': 584,
-    'brokenbar': 260,
-    'registered': 737,
-    'Gbreve': 778,
-    'Idotaccent': 278,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 333,
-    'omacron': 556,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 222,
-    'tcaron': 317,
-    'eogonek': 556,
-    'Uogonek': 722,
-    'Aacute': 667,
-    'Adieresis': 667,
-    'egrave': 556,
-    'zacute': 500,
-    'iogonek': 222,
-    'Oacute': 778,
-    'oacute': 556,
-    'amacron': 556,
-    'sacute': 500,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 556,
-    'twosuperior': 333,
-    'Odieresis': 778,
-    'mu': 556,
-    'igrave': 278,
-    'ohungarumlaut': 556,
-    'Eogonek': 667,
-    'dcroat': 556,
-    'threequarters': 834,
-    'Scedilla': 667,
-    'lcaron': 299,
-    'Kcommaaccent': 667,
-    'Lacute': 556,
-    'trademark': 1000,
-    'edotaccent': 556,
-    'Igrave': 278,
-    'Imacron': 278,
-    'Lcaron': 556,
-    'onehalf': 834,
-    'lessequal': 549,
-    'ocircumflex': 556,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 556,
-    'gbreve': 556,
-    'onequarter': 834,
-    'Scaron': 667,
-    'Scommaaccent': 667,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 556,
-    'Ccaron': 722,
-    'ugrave': 556,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 333,
-    'Ntilde': 722,
-    'otilde': 556,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 556,
-    'Atilde': 667,
-    'Aogonek': 667,
-    'Aring': 667,
-    'Otilde': 778,
-    'zdotaccent': 500,
-    'Ecaron': 667,
-    'Iogonek': 278,
-    'kcommaaccent': 500,
-    'minus': 584,
-    'Icircumflex': 278,
-    'ncaron': 556,
-    'tcommaaccent': 278,
-    'logicalnot': 584,
-    'odieresis': 556,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 556,
-    'eth': 556,
-    'zcaron': 500,
-    'ncommaaccent': 556,
-    'onesuperior': 333,
-    'imacron': 278,
-    'Euro': 556
-  },
-  'Symbol': {
-    'space': 250,
-    'exclam': 333,
-    'universal': 713,
-    'numbersign': 500,
-    'existential': 549,
-    'percent': 833,
-    'ampersand': 778,
-    'suchthat': 439,
-    'parenleft': 333,
-    'parenright': 333,
-    'asteriskmath': 500,
-    'plus': 549,
-    'comma': 250,
-    'minus': 549,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 549,
-    'equal': 549,
-    'greater': 549,
-    'question': 444,
-    'congruent': 549,
-    'Alpha': 722,
-    'Beta': 667,
-    'Chi': 722,
-    'Delta': 612,
-    'Epsilon': 611,
-    'Phi': 763,
-    'Gamma': 603,
-    'Eta': 722,
-    'Iota': 333,
-    'theta1': 631,
-    'Kappa': 722,
-    'Lambda': 686,
-    'Mu': 889,
-    'Nu': 722,
-    'Omicron': 722,
-    'Pi': 768,
-    'Theta': 741,
-    'Rho': 556,
-    'Sigma': 592,
-    'Tau': 611,
-    'Upsilon': 690,
-    'sigma1': 439,
-    'Omega': 768,
-    'Xi': 645,
-    'Psi': 795,
-    'Zeta': 611,
-    'bracketleft': 333,
-    'therefore': 863,
-    'bracketright': 333,
-    'perpendicular': 658,
-    'underscore': 500,
-    'radicalex': 500,
-    'alpha': 631,
-    'beta': 549,
-    'chi': 549,
-    'delta': 494,
-    'epsilon': 439,
-    'phi': 521,
-    'gamma': 411,
-    'eta': 603,
-    'iota': 329,
-    'phi1': 603,
-    'kappa': 549,
-    'lambda': 549,
-    'mu': 576,
-    'nu': 521,
-    'omicron': 549,
-    'pi': 549,
-    'theta': 521,
-    'rho': 549,
-    'sigma': 603,
-    'tau': 439,
-    'upsilon': 576,
-    'omega1': 713,
-    'omega': 686,
-    'xi': 493,
-    'psi': 686,
-    'zeta': 494,
-    'braceleft': 480,
-    'bar': 200,
-    'braceright': 480,
-    'similar': 549,
-    'Euro': 750,
-    'Upsilon1': 620,
-    'minute': 247,
-    'lessequal': 549,
-    'fraction': 167,
-    'infinity': 713,
-    'florin': 500,
-    'club': 753,
-    'diamond': 753,
-    'heart': 753,
-    'spade': 753,
-    'arrowboth': 1042,
-    'arrowleft': 987,
-    'arrowup': 603,
-    'arrowright': 987,
-    'arrowdown': 603,
-    'degree': 400,
-    'plusminus': 549,
-    'second': 411,
-    'greaterequal': 549,
-    'multiply': 549,
-    'proportional': 713,
-    'partialdiff': 494,
-    'bullet': 460,
-    'divide': 549,
-    'notequal': 549,
-    'equivalence': 549,
-    'approxequal': 549,
-    'ellipsis': 1000,
-    'arrowvertex': 603,
-    'arrowhorizex': 1000,
-    'carriagereturn': 658,
-    'aleph': 823,
-    'Ifraktur': 686,
-    'Rfraktur': 795,
-    'weierstrass': 987,
-    'circlemultiply': 768,
-    'circleplus': 768,
-    'emptyset': 823,
-    'intersection': 768,
-    'union': 768,
-    'propersuperset': 713,
-    'reflexsuperset': 713,
-    'notsubset': 713,
-    'propersubset': 713,
-    'reflexsubset': 713,
-    'element': 713,
-    'notelement': 713,
-    'angle': 768,
-    'gradient': 713,
-    'registerserif': 790,
-    'copyrightserif': 790,
-    'trademarkserif': 890,
-    'product': 823,
-    'radical': 549,
-    'dotmath': 250,
-    'logicalnot': 713,
-    'logicaland': 603,
-    'logicalor': 603,
-    'arrowdblboth': 1042,
-    'arrowdblleft': 987,
-    'arrowdblup': 603,
-    'arrowdblright': 987,
-    'arrowdbldown': 603,
-    'lozenge': 494,
-    'angleleft': 329,
-    'registersans': 790,
-    'copyrightsans': 790,
-    'trademarksans': 786,
-    'summation': 713,
-    'parenlefttp': 384,
-    'parenleftex': 384,
-    'parenleftbt': 384,
-    'bracketlefttp': 384,
-    'bracketleftex': 384,
-    'bracketleftbt': 384,
-    'bracelefttp': 494,
-    'braceleftmid': 494,
-    'braceleftbt': 494,
-    'braceex': 494,
-    'angleright': 329,
-    'integral': 274,
-    'integraltp': 686,
-    'integralex': 686,
-    'integralbt': 686,
-    'parenrighttp': 384,
-    'parenrightex': 384,
-    'parenrightbt': 384,
-    'bracketrighttp': 384,
-    'bracketrightex': 384,
-    'bracketrightbt': 384,
-    'bracerighttp': 494,
-    'bracerightmid': 494,
-    'bracerightbt': 494,
-    'apple': 790
-  },
-  'Times-Roman': {
-    'space': 250,
-    'exclam': 333,
-    'quotedbl': 408,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 833,
-    'ampersand': 778,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 564,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 278,
-    'semicolon': 278,
-    'less': 564,
-    'equal': 564,
-    'greater': 564,
-    'question': 444,
-    'at': 921,
-    'A': 722,
-    'B': 667,
-    'C': 667,
-    'D': 722,
-    'E': 611,
-    'F': 556,
-    'G': 722,
-    'H': 722,
-    'I': 333,
-    'J': 389,
-    'K': 722,
-    'L': 611,
-    'M': 889,
-    'N': 722,
-    'O': 722,
-    'P': 556,
-    'Q': 722,
-    'R': 667,
-    'S': 556,
-    'T': 611,
-    'U': 722,
-    'V': 722,
-    'W': 944,
-    'X': 722,
-    'Y': 722,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 469,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 444,
-    'b': 500,
-    'c': 444,
-    'd': 500,
-    'e': 444,
-    'f': 333,
-    'g': 500,
-    'h': 500,
-    'i': 278,
-    'j': 278,
-    'k': 500,
-    'l': 278,
-    'm': 778,
-    'n': 500,
-    'o': 500,
-    'p': 500,
-    'q': 500,
-    'r': 333,
-    's': 389,
-    't': 278,
-    'u': 500,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 444,
-    'braceleft': 480,
-    'bar': 200,
-    'braceright': 480,
-    'asciitilde': 541,
-    'exclamdown': 333,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 180,
-    'quotedblleft': 444,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 556,
-    'fl': 556,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 453,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 444,
-    'quotedblright': 444,
-    'guillemotright': 500,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 444,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 889,
-    'ordfeminine': 276,
-    'Lslash': 611,
-    'Oslash': 722,
-    'OE': 889,
-    'ordmasculine': 310,
-    'ae': 667,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 722,
-    'germandbls': 500,
-    'Idieresis': 333,
-    'eacute': 444,
-    'abreve': 444,
-    'uhungarumlaut': 500,
-    'ecaron': 444,
-    'Ydieresis': 722,
-    'divide': 564,
-    'Yacute': 722,
-    'Acircumflex': 722,
-    'aacute': 444,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 444,
-    'Uacute': 722,
-    'uogonek': 500,
-    'Edieresis': 611,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 760,
-    'Emacron': 611,
-    'ccaron': 444,
-    'aring': 444,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 444,
-    'Tcommaaccent': 611,
-    'Cacute': 667,
-    'atilde': 444,
-    'Edotaccent': 611,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 667,
-    'Gcommaaccent': 722,
-    'ucircumflex': 500,
-    'acircumflex': 444,
-    'Amacron': 722,
-    'rcaron': 333,
-    'ccedilla': 444,
-    'Zdotaccent': 611,
-    'Thorn': 556,
-    'Omacron': 722,
-    'Racute': 667,
-    'Sacute': 556,
-    'dcaron': 588,
-    'Umacron': 722,
-    'uring': 500,
-    'threesuperior': 300,
-    'Ograve': 722,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 564,
-    'uacute': 500,
-    'Tcaron': 611,
-    'partialdiff': 476,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 611,
-    'adieresis': 444,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 500,
-    'umacron': 500,
-    'Ncaron': 722,
-    'Iacute': 333,
-    'plusminus': 564,
-    'brokenbar': 200,
-    'registered': 760,
-    'Gbreve': 722,
-    'Idotaccent': 333,
-    'summation': 600,
-    'Egrave': 611,
-    'racute': 333,
-    'omacron': 500,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 667,
-    'lcommaaccent': 278,
-    'tcaron': 326,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 444,
-    'zacute': 444,
-    'iogonek': 278,
-    'Oacute': 722,
-    'oacute': 500,
-    'amacron': 444,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 722,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 500,
-    'twosuperior': 300,
-    'Odieresis': 722,
-    'mu': 500,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 611,
-    'dcroat': 500,
-    'threequarters': 750,
-    'Scedilla': 556,
-    'lcaron': 344,
-    'Kcommaaccent': 722,
-    'Lacute': 611,
-    'trademark': 980,
-    'edotaccent': 444,
-    'Igrave': 333,
-    'Imacron': 333,
-    'Lcaron': 611,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 500,
-    'Uhungarumlaut': 722,
-    'Eacute': 611,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 556,
-    'Scommaaccent': 556,
-    'Ohungarumlaut': 722,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 667,
-    'ugrave': 500,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 333,
-    'Ntilde': 722,
-    'otilde': 500,
-    'Rcommaaccent': 667,
-    'Lcommaaccent': 611,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 722,
-    'zdotaccent': 444,
-    'Ecaron': 611,
-    'Iogonek': 333,
-    'kcommaaccent': 500,
-    'minus': 564,
-    'Icircumflex': 333,
-    'ncaron': 500,
-    'tcommaaccent': 278,
-    'logicalnot': 564,
-    'odieresis': 500,
-    'udieresis': 500,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 444,
-    'ncommaaccent': 500,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'Times-Bold': {
-    'space': 250,
-    'exclam': 333,
-    'quotedbl': 555,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 1000,
-    'ampersand': 833,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 570,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 570,
-    'equal': 570,
-    'greater': 570,
-    'question': 500,
-    'at': 930,
-    'A': 722,
-    'B': 667,
-    'C': 722,
-    'D': 722,
-    'E': 667,
-    'F': 611,
-    'G': 778,
-    'H': 778,
-    'I': 389,
-    'J': 500,
-    'K': 778,
-    'L': 667,
-    'M': 944,
-    'N': 722,
-    'O': 778,
-    'P': 611,
-    'Q': 778,
-    'R': 722,
-    'S': 556,
-    'T': 667,
-    'U': 722,
-    'V': 722,
-    'W': 1000,
-    'X': 722,
-    'Y': 722,
-    'Z': 667,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 581,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 500,
-    'b': 556,
-    'c': 444,
-    'd': 556,
-    'e': 444,
-    'f': 333,
-    'g': 500,
-    'h': 556,
-    'i': 278,
-    'j': 333,
-    'k': 556,
-    'l': 278,
-    'm': 833,
-    'n': 556,
-    'o': 500,
-    'p': 556,
-    'q': 556,
-    'r': 444,
-    's': 389,
-    't': 333,
-    'u': 556,
-    'v': 500,
-    'w': 722,
-    'x': 500,
-    'y': 500,
-    'z': 444,
-    'braceleft': 394,
-    'bar': 220,
-    'braceright': 394,
-    'asciitilde': 520,
-    'exclamdown': 333,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 278,
-    'quotedblleft': 500,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 556,
-    'fl': 556,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 540,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 500,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 500,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 1000,
-    'ordfeminine': 300,
-    'Lslash': 667,
-    'Oslash': 778,
-    'OE': 1000,
-    'ordmasculine': 330,
-    'ae': 722,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 722,
-    'germandbls': 556,
-    'Idieresis': 389,
-    'eacute': 444,
-    'abreve': 500,
-    'uhungarumlaut': 556,
-    'ecaron': 444,
-    'Ydieresis': 722,
-    'divide': 570,
-    'Yacute': 722,
-    'Acircumflex': 722,
-    'aacute': 500,
-    'Ucircumflex': 722,
-    'yacute': 500,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 500,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 747,
-    'Emacron': 667,
-    'ccaron': 444,
-    'aring': 500,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 500,
-    'Tcommaaccent': 667,
-    'Cacute': 722,
-    'atilde': 500,
-    'Edotaccent': 667,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 722,
-    'Gcommaaccent': 778,
-    'ucircumflex': 556,
-    'acircumflex': 500,
-    'Amacron': 722,
-    'rcaron': 444,
-    'ccedilla': 444,
-    'Zdotaccent': 667,
-    'Thorn': 611,
-    'Omacron': 778,
-    'Racute': 722,
-    'Sacute': 556,
-    'dcaron': 672,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 300,
-    'Ograve': 778,
-    'Agrave': 722,
-    'Abreve': 722,
-    'multiply': 570,
-    'uacute': 556,
-    'Tcaron': 667,
-    'partialdiff': 494,
-    'ydieresis': 500,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 500,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 389,
-    'plusminus': 570,
-    'brokenbar': 220,
-    'registered': 747,
-    'Gbreve': 778,
-    'Idotaccent': 389,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 444,
-    'omacron': 500,
-    'Zacute': 667,
-    'Zcaron': 667,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 722,
-    'lcommaaccent': 278,
-    'tcaron': 416,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 722,
-    'Adieresis': 722,
-    'egrave': 444,
-    'zacute': 444,
-    'iogonek': 278,
-    'Oacute': 778,
-    'oacute': 500,
-    'amacron': 500,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 778,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 556,
-    'twosuperior': 300,
-    'Odieresis': 778,
-    'mu': 556,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 667,
-    'dcroat': 556,
-    'threequarters': 750,
-    'Scedilla': 556,
-    'lcaron': 394,
-    'Kcommaaccent': 778,
-    'Lacute': 667,
-    'trademark': 1000,
-    'edotaccent': 444,
-    'Igrave': 389,
-    'Imacron': 389,
-    'Lcaron': 667,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 556,
-    'Scommaaccent': 556,
-    'Ohungarumlaut': 778,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 722,
-    'ugrave': 556,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 444,
-    'Ntilde': 722,
-    'otilde': 500,
-    'Rcommaaccent': 722,
-    'Lcommaaccent': 667,
-    'Atilde': 722,
-    'Aogonek': 722,
-    'Aring': 722,
-    'Otilde': 778,
-    'zdotaccent': 444,
-    'Ecaron': 667,
-    'Iogonek': 389,
-    'kcommaaccent': 556,
-    'minus': 570,
-    'Icircumflex': 389,
-    'ncaron': 556,
-    'tcommaaccent': 333,
-    'logicalnot': 570,
-    'odieresis': 500,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 444,
-    'ncommaaccent': 556,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'Times-BoldItalic': {
-    'space': 250,
-    'exclam': 389,
-    'quotedbl': 555,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 833,
-    'ampersand': 778,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 570,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 570,
-    'equal': 570,
-    'greater': 570,
-    'question': 500,
-    'at': 832,
-    'A': 667,
-    'B': 667,
-    'C': 667,
-    'D': 722,
-    'E': 667,
-    'F': 667,
-    'G': 722,
-    'H': 778,
-    'I': 389,
-    'J': 500,
-    'K': 667,
-    'L': 611,
-    'M': 889,
-    'N': 722,
-    'O': 722,
-    'P': 611,
-    'Q': 722,
-    'R': 667,
-    'S': 556,
-    'T': 611,
-    'U': 722,
-    'V': 667,
-    'W': 889,
-    'X': 667,
-    'Y': 611,
-    'Z': 611,
-    'bracketleft': 333,
-    'backslash': 278,
-    'bracketright': 333,
-    'asciicircum': 570,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 500,
-    'b': 500,
-    'c': 444,
-    'd': 500,
-    'e': 444,
-    'f': 333,
-    'g': 500,
-    'h': 556,
-    'i': 278,
-    'j': 278,
-    'k': 500,
-    'l': 278,
-    'm': 778,
-    'n': 556,
-    'o': 500,
-    'p': 500,
-    'q': 500,
-    'r': 389,
-    's': 389,
-    't': 278,
-    'u': 556,
-    'v': 444,
-    'w': 667,
-    'x': 500,
-    'y': 444,
-    'z': 389,
-    'braceleft': 348,
-    'bar': 220,
-    'braceright': 348,
-    'asciitilde': 570,
-    'exclamdown': 389,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 278,
-    'quotedblleft': 500,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 556,
-    'fl': 556,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 500,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 500,
-    'quotedblright': 500,
-    'guillemotright': 500,
-    'ellipsis': 1000,
-    'perthousand': 1000,
-    'questiondown': 500,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 1000,
-    'AE': 944,
-    'ordfeminine': 266,
-    'Lslash': 611,
-    'Oslash': 722,
-    'OE': 944,
-    'ordmasculine': 300,
-    'ae': 722,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 722,
-    'germandbls': 500,
-    'Idieresis': 389,
-    'eacute': 444,
-    'abreve': 500,
-    'uhungarumlaut': 556,
-    'ecaron': 444,
-    'Ydieresis': 611,
-    'divide': 570,
-    'Yacute': 611,
-    'Acircumflex': 667,
-    'aacute': 500,
-    'Ucircumflex': 722,
-    'yacute': 444,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 500,
-    'Uacute': 722,
-    'uogonek': 556,
-    'Edieresis': 667,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 747,
-    'Emacron': 667,
-    'ccaron': 444,
-    'aring': 500,
-    'Ncommaaccent': 722,
-    'lacute': 278,
-    'agrave': 500,
-    'Tcommaaccent': 611,
-    'Cacute': 667,
-    'atilde': 500,
-    'Edotaccent': 667,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 494,
-    'Rcaron': 667,
-    'Gcommaaccent': 722,
-    'ucircumflex': 556,
-    'acircumflex': 500,
-    'Amacron': 667,
-    'rcaron': 389,
-    'ccedilla': 444,
-    'Zdotaccent': 611,
-    'Thorn': 611,
-    'Omacron': 722,
-    'Racute': 667,
-    'Sacute': 556,
-    'dcaron': 608,
-    'Umacron': 722,
-    'uring': 556,
-    'threesuperior': 300,
-    'Ograve': 722,
-    'Agrave': 667,
-    'Abreve': 667,
-    'multiply': 570,
-    'uacute': 556,
-    'Tcaron': 611,
-    'partialdiff': 494,
-    'ydieresis': 444,
-    'Nacute': 722,
-    'icircumflex': 278,
-    'Ecircumflex': 667,
-    'adieresis': 500,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 556,
-    'umacron': 556,
-    'Ncaron': 722,
-    'Iacute': 389,
-    'plusminus': 570,
-    'brokenbar': 220,
-    'registered': 747,
-    'Gbreve': 722,
-    'Idotaccent': 389,
-    'summation': 600,
-    'Egrave': 667,
-    'racute': 389,
-    'omacron': 500,
-    'Zacute': 611,
-    'Zcaron': 611,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 667,
-    'lcommaaccent': 278,
-    'tcaron': 366,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 667,
-    'Adieresis': 667,
-    'egrave': 444,
-    'zacute': 389,
-    'iogonek': 278,
-    'Oacute': 722,
-    'oacute': 500,
-    'amacron': 500,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 722,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 500,
-    'twosuperior': 300,
-    'Odieresis': 722,
-    'mu': 576,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 667,
-    'dcroat': 500,
-    'threequarters': 750,
-    'Scedilla': 556,
-    'lcaron': 382,
-    'Kcommaaccent': 667,
-    'Lacute': 611,
-    'trademark': 1000,
-    'edotaccent': 444,
-    'Igrave': 389,
-    'Imacron': 389,
-    'Lcaron': 611,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 556,
-    'Uhungarumlaut': 722,
-    'Eacute': 667,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 556,
-    'Scommaaccent': 556,
-    'Ohungarumlaut': 722,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 667,
-    'ugrave': 556,
-    'radical': 549,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 722,
-    'otilde': 500,
-    'Rcommaaccent': 667,
-    'Lcommaaccent': 611,
-    'Atilde': 667,
-    'Aogonek': 667,
-    'Aring': 667,
-    'Otilde': 722,
-    'zdotaccent': 389,
-    'Ecaron': 667,
-    'Iogonek': 389,
-    'kcommaaccent': 500,
-    'minus': 606,
-    'Icircumflex': 389,
-    'ncaron': 556,
-    'tcommaaccent': 278,
-    'logicalnot': 606,
-    'odieresis': 500,
-    'udieresis': 556,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 389,
-    'ncommaaccent': 556,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'Times-Italic': {
-    'space': 250,
-    'exclam': 333,
-    'quotedbl': 420,
-    'numbersign': 500,
-    'dollar': 500,
-    'percent': 833,
-    'ampersand': 778,
-    'quoteright': 333,
-    'parenleft': 333,
-    'parenright': 333,
-    'asterisk': 500,
-    'plus': 675,
-    'comma': 250,
-    'hyphen': 333,
-    'period': 250,
-    'slash': 278,
-    'zero': 500,
-    'one': 500,
-    'two': 500,
-    'three': 500,
-    'four': 500,
-    'five': 500,
-    'six': 500,
-    'seven': 500,
-    'eight': 500,
-    'nine': 500,
-    'colon': 333,
-    'semicolon': 333,
-    'less': 675,
-    'equal': 675,
-    'greater': 675,
-    'question': 500,
-    'at': 920,
-    'A': 611,
-    'B': 611,
-    'C': 667,
-    'D': 722,
-    'E': 611,
-    'F': 611,
-    'G': 722,
-    'H': 722,
-    'I': 333,
-    'J': 444,
-    'K': 667,
-    'L': 556,
-    'M': 833,
-    'N': 667,
-    'O': 722,
-    'P': 611,
-    'Q': 722,
-    'R': 611,
-    'S': 500,
-    'T': 556,
-    'U': 722,
-    'V': 611,
-    'W': 833,
-    'X': 611,
-    'Y': 556,
-    'Z': 556,
-    'bracketleft': 389,
-    'backslash': 278,
-    'bracketright': 389,
-    'asciicircum': 422,
-    'underscore': 500,
-    'quoteleft': 333,
-    'a': 500,
-    'b': 500,
-    'c': 444,
-    'd': 500,
-    'e': 444,
-    'f': 278,
-    'g': 500,
-    'h': 500,
-    'i': 278,
-    'j': 278,
-    'k': 444,
-    'l': 278,
-    'm': 722,
-    'n': 500,
-    'o': 500,
-    'p': 500,
-    'q': 500,
-    'r': 389,
-    's': 389,
-    't': 278,
-    'u': 500,
-    'v': 444,
-    'w': 667,
-    'x': 444,
-    'y': 444,
-    'z': 389,
-    'braceleft': 400,
-    'bar': 275,
-    'braceright': 400,
-    'asciitilde': 541,
-    'exclamdown': 389,
-    'cent': 500,
-    'sterling': 500,
-    'fraction': 167,
-    'yen': 500,
-    'florin': 500,
-    'section': 500,
-    'currency': 500,
-    'quotesingle': 214,
-    'quotedblleft': 556,
-    'guillemotleft': 500,
-    'guilsinglleft': 333,
-    'guilsinglright': 333,
-    'fi': 500,
-    'fl': 500,
-    'endash': 500,
-    'dagger': 500,
-    'daggerdbl': 500,
-    'periodcentered': 250,
-    'paragraph': 523,
-    'bullet': 350,
-    'quotesinglbase': 333,
-    'quotedblbase': 556,
-    'quotedblright': 556,
-    'guillemotright': 500,
-    'ellipsis': 889,
-    'perthousand': 1000,
-    'questiondown': 500,
-    'grave': 333,
-    'acute': 333,
-    'circumflex': 333,
-    'tilde': 333,
-    'macron': 333,
-    'breve': 333,
-    'dotaccent': 333,
-    'dieresis': 333,
-    'ring': 333,
-    'cedilla': 333,
-    'hungarumlaut': 333,
-    'ogonek': 333,
-    'caron': 333,
-    'emdash': 889,
-    'AE': 889,
-    'ordfeminine': 276,
-    'Lslash': 556,
-    'Oslash': 722,
-    'OE': 944,
-    'ordmasculine': 310,
-    'ae': 667,
-    'dotlessi': 278,
-    'lslash': 278,
-    'oslash': 500,
-    'oe': 667,
-    'germandbls': 500,
-    'Idieresis': 333,
-    'eacute': 444,
-    'abreve': 500,
-    'uhungarumlaut': 500,
-    'ecaron': 444,
-    'Ydieresis': 556,
-    'divide': 675,
-    'Yacute': 556,
-    'Acircumflex': 611,
-    'aacute': 500,
-    'Ucircumflex': 722,
-    'yacute': 444,
-    'scommaaccent': 389,
-    'ecircumflex': 444,
-    'Uring': 722,
-    'Udieresis': 722,
-    'aogonek': 500,
-    'Uacute': 722,
-    'uogonek': 500,
-    'Edieresis': 611,
-    'Dcroat': 722,
-    'commaaccent': 250,
-    'copyright': 760,
-    'Emacron': 611,
-    'ccaron': 444,
-    'aring': 500,
-    'Ncommaaccent': 667,
-    'lacute': 278,
-    'agrave': 500,
-    'Tcommaaccent': 556,
-    'Cacute': 667,
-    'atilde': 500,
-    'Edotaccent': 611,
-    'scaron': 389,
-    'scedilla': 389,
-    'iacute': 278,
-    'lozenge': 471,
-    'Rcaron': 611,
-    'Gcommaaccent': 722,
-    'ucircumflex': 500,
-    'acircumflex': 500,
-    'Amacron': 611,
-    'rcaron': 389,
-    'ccedilla': 444,
-    'Zdotaccent': 556,
-    'Thorn': 611,
-    'Omacron': 722,
-    'Racute': 611,
-    'Sacute': 500,
-    'dcaron': 544,
-    'Umacron': 722,
-    'uring': 500,
-    'threesuperior': 300,
-    'Ograve': 722,
-    'Agrave': 611,
-    'Abreve': 611,
-    'multiply': 675,
-    'uacute': 500,
-    'Tcaron': 556,
-    'partialdiff': 476,
-    'ydieresis': 444,
-    'Nacute': 667,
-    'icircumflex': 278,
-    'Ecircumflex': 611,
-    'adieresis': 500,
-    'edieresis': 444,
-    'cacute': 444,
-    'nacute': 500,
-    'umacron': 500,
-    'Ncaron': 667,
-    'Iacute': 333,
-    'plusminus': 675,
-    'brokenbar': 275,
-    'registered': 760,
-    'Gbreve': 722,
-    'Idotaccent': 333,
-    'summation': 600,
-    'Egrave': 611,
-    'racute': 389,
-    'omacron': 500,
-    'Zacute': 556,
-    'Zcaron': 556,
-    'greaterequal': 549,
-    'Eth': 722,
-    'Ccedilla': 667,
-    'lcommaaccent': 278,
-    'tcaron': 300,
-    'eogonek': 444,
-    'Uogonek': 722,
-    'Aacute': 611,
-    'Adieresis': 611,
-    'egrave': 444,
-    'zacute': 389,
-    'iogonek': 278,
-    'Oacute': 722,
-    'oacute': 500,
-    'amacron': 500,
-    'sacute': 389,
-    'idieresis': 278,
-    'Ocircumflex': 722,
-    'Ugrave': 722,
-    'Delta': 612,
-    'thorn': 500,
-    'twosuperior': 300,
-    'Odieresis': 722,
-    'mu': 500,
-    'igrave': 278,
-    'ohungarumlaut': 500,
-    'Eogonek': 611,
-    'dcroat': 500,
-    'threequarters': 750,
-    'Scedilla': 500,
-    'lcaron': 300,
-    'Kcommaaccent': 667,
-    'Lacute': 556,
-    'trademark': 980,
-    'edotaccent': 444,
-    'Igrave': 333,
-    'Imacron': 333,
-    'Lcaron': 611,
-    'onehalf': 750,
-    'lessequal': 549,
-    'ocircumflex': 500,
-    'ntilde': 500,
-    'Uhungarumlaut': 722,
-    'Eacute': 611,
-    'emacron': 444,
-    'gbreve': 500,
-    'onequarter': 750,
-    'Scaron': 500,
-    'Scommaaccent': 500,
-    'Ohungarumlaut': 722,
-    'degree': 400,
-    'ograve': 500,
-    'Ccaron': 667,
-    'ugrave': 500,
-    'radical': 453,
-    'Dcaron': 722,
-    'rcommaaccent': 389,
-    'Ntilde': 667,
-    'otilde': 500,
-    'Rcommaaccent': 611,
-    'Lcommaaccent': 556,
-    'Atilde': 611,
-    'Aogonek': 611,
-    'Aring': 611,
-    'Otilde': 722,
-    'zdotaccent': 389,
-    'Ecaron': 611,
-    'Iogonek': 333,
-    'kcommaaccent': 444,
-    'minus': 675,
-    'Icircumflex': 333,
-    'ncaron': 500,
-    'tcommaaccent': 278,
-    'logicalnot': 675,
-    'odieresis': 500,
-    'udieresis': 500,
-    'notequal': 549,
-    'gcommaaccent': 500,
-    'eth': 500,
-    'zcaron': 389,
-    'ncommaaccent': 500,
-    'onesuperior': 300,
-    'imacron': 278,
-    'Euro': 500
-  },
-  'ZapfDingbats': {
-    'space': 278,
-    'a1': 974,
-    'a2': 961,
-    'a202': 974,
-    'a3': 980,
-    'a4': 719,
-    'a5': 789,
-    'a119': 790,
-    'a118': 791,
-    'a117': 690,
-    'a11': 960,
-    'a12': 939,
-    'a13': 549,
-    'a14': 855,
-    'a15': 911,
-    'a16': 933,
-    'a105': 911,
-    'a17': 945,
-    'a18': 974,
-    'a19': 755,
-    'a20': 846,
-    'a21': 762,
-    'a22': 761,
-    'a23': 571,
-    'a24': 677,
-    'a25': 763,
-    'a26': 760,
-    'a27': 759,
-    'a28': 754,
-    'a6': 494,
-    'a7': 552,
-    'a8': 537,
-    'a9': 577,
-    'a10': 692,
-    'a29': 786,
-    'a30': 788,
-    'a31': 788,
-    'a32': 790,
-    'a33': 793,
-    'a34': 794,
-    'a35': 816,
-    'a36': 823,
-    'a37': 789,
-    'a38': 841,
-    'a39': 823,
-    'a40': 833,
-    'a41': 816,
-    'a42': 831,
-    'a43': 923,
-    'a44': 744,
-    'a45': 723,
-    'a46': 749,
-    'a47': 790,
-    'a48': 792,
-    'a49': 695,
-    'a50': 776,
-    'a51': 768,
-    'a52': 792,
-    'a53': 759,
-    'a54': 707,
-    'a55': 708,
-    'a56': 682,
-    'a57': 701,
-    'a58': 826,
-    'a59': 815,
-    'a60': 789,
-    'a61': 789,
-    'a62': 707,
-    'a63': 687,
-    'a64': 696,
-    'a65': 689,
-    'a66': 786,
-    'a67': 787,
-    'a68': 713,
-    'a69': 791,
-    'a70': 785,
-    'a71': 791,
-    'a72': 873,
-    'a73': 761,
-    'a74': 762,
-    'a203': 762,
-    'a75': 759,
-    'a204': 759,
-    'a76': 892,
-    'a77': 892,
-    'a78': 788,
-    'a79': 784,
-    'a81': 438,
-    'a82': 138,
-    'a83': 277,
-    'a84': 415,
-    'a97': 392,
-    'a98': 392,
-    'a99': 668,
-    'a100': 668,
-    'a89': 390,
-    'a90': 390,
-    'a93': 317,
-    'a94': 317,
-    'a91': 276,
-    'a92': 276,
-    'a205': 509,
-    'a85': 509,
-    'a206': 410,
-    'a86': 410,
-    'a87': 234,
-    'a88': 234,
-    'a95': 334,
-    'a96': 334,
-    'a101': 732,
-    'a102': 544,
-    'a103': 544,
-    'a104': 910,
-    'a106': 667,
-    'a107': 760,
-    'a108': 760,
-    'a112': 776,
-    'a111': 595,
-    'a110': 694,
-    'a109': 626,
-    'a120': 788,
-    'a121': 788,
-    'a122': 788,
-    'a123': 788,
-    'a124': 788,
-    'a125': 788,
-    'a126': 788,
-    'a127': 788,
-    'a128': 788,
-    'a129': 788,
-    'a130': 788,
-    'a131': 788,
-    'a132': 788,
-    'a133': 788,
-    'a134': 788,
-    'a135': 788,
-    'a136': 788,
-    'a137': 788,
-    'a138': 788,
-    'a139': 788,
-    'a140': 788,
-    'a141': 788,
-    'a142': 788,
-    'a143': 788,
-    'a144': 788,
-    'a145': 788,
-    'a146': 788,
-    'a147': 788,
-    'a148': 788,
-    'a149': 788,
-    'a150': 788,
-    'a151': 788,
-    'a152': 788,
-    'a153': 788,
-    'a154': 788,
-    'a155': 788,
-    'a156': 788,
-    'a157': 788,
-    'a158': 788,
-    'a159': 788,
-    'a160': 894,
-    'a161': 838,
-    'a163': 1016,
-    'a164': 458,
-    'a196': 748,
-    'a165': 924,
-    'a192': 748,
-    'a166': 918,
-    'a167': 927,
-    'a168': 928,
-    'a169': 928,
-    'a170': 834,
-    'a171': 873,
-    'a172': 828,
-    'a173': 924,
-    'a162': 924,
-    'a174': 917,
-    'a175': 930,
-    'a176': 931,
-    'a177': 463,
-    'a178': 883,
-    'a179': 836,
-    'a193': 836,
-    'a180': 867,
-    'a199': 867,
-    'a181': 696,
-    'a200': 696,
-    'a182': 874,
-    'a201': 874,
-    'a183': 760,
-    'a184': 946,
-    'a197': 771,
-    'a185': 865,
-    'a194': 771,
-    'a198': 888,
-    'a186': 967,
-    'a195': 888,
-    'a187': 831,
-    'a188': 873,
-    'a189': 927,
-    'a190': 970,
-    'a191': 918
-  }
-};
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/obj.js b/apps/files_pdfviewer/js/pdfjs/src/obj.js
deleted file mode 100644
index 200b40a7f9823cb2d30af5958fd31be276f4884b..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/obj.js
+++ /dev/null
@@ -1,808 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var Name = (function NameClosure() {
-  function Name(name) {
-    this.name = name;
-  }
-
-  Name.prototype = {};
-
-  return Name;
-})();
-
-var Cmd = (function CmdClosure() {
-  function Cmd(cmd) {
-    this.cmd = cmd;
-  }
-
-  Cmd.prototype = {};
-
-  var cmdCache = {};
-
-  Cmd.get = function Cmd_get(cmd) {
-    var cmdValue = cmdCache[cmd];
-    if (cmdValue)
-      return cmdValue;
-
-    return cmdCache[cmd] = new Cmd(cmd);
-  };
-
-  return Cmd;
-})();
-
-var Dict = (function DictClosure() {
-  // xref is optional
-  function Dict(xref) {
-    // Map should only be used internally, use functions below to access.
-    this.map = Object.create(null);
-    this.xref = xref;
-  }
-
-  Dict.prototype = {
-    // automatically dereferences Ref objects
-    get: function Dict_get(key1, key2, key3) {
-      var value;
-      var xref = this.xref;
-      if (typeof (value = this.map[key1]) != 'undefined' || key1 in this.map ||
-          typeof key2 == 'undefined') {
-        return xref ? this.xref.fetchIfRef(value) : value;
-      }
-      if (typeof (value = this.map[key2]) != 'undefined' || key2 in this.map ||
-          typeof key3 == 'undefined') {
-        return xref ? this.xref.fetchIfRef(value) : value;
-      }
-      value = this.map[key3] || null;
-      return xref ? this.xref.fetchIfRef(value) : value;
-    },
-    // no dereferencing
-    getRaw: function Dict_getRaw(key) {
-      return this.map[key];
-    },
-    // creates new map and dereferences all Refs
-    getAll: function Dict_getAll() {
-      var all = {};
-      for (var key in this.map)
-        all[key] = this.get(key);
-      return all;
-    },
-
-    set: function Dict_set(key, value) {
-      this.map[key] = value;
-    },
-
-    has: function Dict_has(key) {
-      return key in this.map;
-    },
-
-    forEach: function Dict_forEach(callback) {
-      for (var key in this.map) {
-        callback(key, this.get(key));
-      }
-    }
-  };
-
-  return Dict;
-})();
-
-var Ref = (function RefClosure() {
-  function Ref(num, gen) {
-    this.num = num;
-    this.gen = gen;
-  }
-
-  Ref.prototype = {};
-
-  return Ref;
-})();
-
-// The reference is identified by number and generation,
-// this structure stores only one instance of the reference.
-var RefSet = (function RefSetClosure() {
-  function RefSet() {
-    this.dict = {};
-  }
-
-  RefSet.prototype = {
-    has: function RefSet_has(ref) {
-      return !!this.dict['R' + ref.num + '.' + ref.gen];
-    },
-
-    put: function RefSet_put(ref) {
-      this.dict['R' + ref.num + '.' + ref.gen] = ref;
-    }
-  };
-
-  return RefSet;
-})();
-
-var Catalog = (function CatalogClosure() {
-  function Catalog(xref) {
-    this.xref = xref;
-    var obj = xref.getCatalogObj();
-    assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
-    this.catDict = obj;
-  }
-
-  Catalog.prototype = {
-    get metadata() {
-      var stream = this.catDict.get('Metadata');
-      var metadata;
-      if (stream && isDict(stream.dict)) {
-        var type = stream.dict.get('Type');
-        var subtype = stream.dict.get('Subtype');
-
-        if (isName(type) && isName(subtype) &&
-            type.name === 'Metadata' && subtype.name === 'XML') {
-          metadata = stringToPDFString(bytesToString(stream.getBytes()));
-        }
-      }
-
-      return shadow(this, 'metadata', metadata);
-    },
-    get toplevelPagesDict() {
-      var pagesObj = this.catDict.get('Pages');
-      assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
-      // shadow the prototype getter
-      return shadow(this, 'toplevelPagesDict', pagesObj);
-    },
-    get documentOutline() {
-      var xref = this.xref;
-      var obj = this.catDict.get('Outlines');
-      var root = { items: [] };
-      if (isDict(obj)) {
-        obj = obj.getRaw('First');
-        var processed = new RefSet();
-        if (isRef(obj)) {
-          var queue = [{obj: obj, parent: root}];
-          // to avoid recursion keeping track of the items
-          // in the processed dictionary
-          processed.put(obj);
-          while (queue.length > 0) {
-            var i = queue.shift();
-            var outlineDict = xref.fetchIfRef(i.obj);
-            if (outlineDict === null)
-              continue;
-            if (!outlineDict.has('Title'))
-              error('Invalid outline item');
-            var dest = outlineDict.get('A');
-            if (dest)
-              dest = dest.get('D');
-            else if (outlineDict.has('Dest')) {
-              dest = outlineDict.getRaw('Dest');
-              if (isName(dest))
-                dest = dest.name;
-            }
-            var title = outlineDict.get('Title');
-            var outlineItem = {
-              dest: dest,
-              title: stringToPDFString(title),
-              color: outlineDict.get('C') || [0, 0, 0],
-              count: outlineDict.get('Count'),
-              bold: !!(outlineDict.get('F') & 2),
-              italic: !!(outlineDict.get('F') & 1),
-              items: []
-            };
-            i.parent.items.push(outlineItem);
-            obj = outlineDict.getRaw('First');
-            if (isRef(obj) && !processed.has(obj)) {
-              queue.push({obj: obj, parent: outlineItem});
-              processed.put(obj);
-            }
-            obj = outlineDict.getRaw('Next');
-            if (isRef(obj) && !processed.has(obj)) {
-              queue.push({obj: obj, parent: i.parent});
-              processed.put(obj);
-            }
-          }
-        }
-      }
-      obj = root.items.length > 0 ? root.items : null;
-      return shadow(this, 'documentOutline', obj);
-    },
-    get numPages() {
-      var obj = this.toplevelPagesDict.get('Count');
-      assertWellFormed(
-        isInt(obj),
-        'page count in top level pages object is not an integer'
-      );
-      // shadow the prototype getter
-      return shadow(this, 'num', obj);
-    },
-    traverseKids: function Catalog_traverseKids(pagesDict) {
-      var pageCache = this.pageCache;
-      var kids = pagesDict.get('Kids');
-      assertWellFormed(isArray(kids),
-                       'page dictionary kids object is not an array');
-      for (var i = 0, ii = kids.length; i < ii; ++i) {
-        var kid = kids[i];
-        assertWellFormed(isRef(kid),
-                        'page dictionary kid is not a reference');
-        var obj = this.xref.fetch(kid);
-        if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
-          pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
-        } else { // must be a child page dictionary
-          assertWellFormed(
-            isDict(obj),
-            'page dictionary kid reference points to wrong type of object'
-          );
-          this.traverseKids(obj);
-        }
-      }
-    },
-    get destinations() {
-      function fetchDestination(dest) {
-        return isDict(dest) ? dest.get('D') : dest;
-      }
-
-      var xref = this.xref;
-      var dests = {}, nameTreeRef, nameDictionaryRef;
-      var obj = this.catDict.get('Names');
-      if (obj)
-        nameTreeRef = obj.getRaw('Dests');
-      else if (this.catDict.has('Dests'))
-        nameDictionaryRef = this.catDict.get('Dests');
-
-      if (nameDictionaryRef) {
-        // reading simple destination dictionary
-        obj = nameDictionaryRef;
-        obj.forEach(function catalogForEach(key, value) {
-          if (!value) return;
-          dests[key] = fetchDestination(value);
-        });
-      }
-      if (nameTreeRef) {
-        // reading name tree
-        var processed = new RefSet();
-        processed.put(nameTreeRef);
-        var queue = [nameTreeRef];
-        while (queue.length > 0) {
-          var i, n;
-          obj = xref.fetch(queue.shift());
-          if (obj.has('Kids')) {
-            var kids = obj.get('Kids');
-            for (i = 0, n = kids.length; i < n; i++) {
-              var kid = kids[i];
-              if (processed.has(kid))
-                error('invalid destinations');
-              queue.push(kid);
-              processed.put(kid);
-            }
-            continue;
-          }
-          var names = obj.get('Names');
-          for (i = 0, n = names.length; i < n; i += 2) {
-            dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1]));
-          }
-        }
-      }
-      return shadow(this, 'destinations', dests);
-    },
-    getPage: function Catalog_getPage(n) {
-      var pageCache = this.pageCache;
-      if (!pageCache) {
-        pageCache = this.pageCache = [];
-        this.traverseKids(this.toplevelPagesDict);
-      }
-      return this.pageCache[n - 1];
-    }
-  };
-
-  return Catalog;
-})();
-
-var XRef = (function XRefClosure() {
-  function XRef(stream, startXRef, mainXRefEntriesOffset) {
-    this.stream = stream;
-    this.entries = [];
-    this.xrefstms = {};
-    var trailerDict = this.readXRef(startXRef);
-    trailerDict.xref = this;
-    this.trailer = trailerDict;
-    // prepare the XRef cache
-    this.cache = [];
-
-    var encrypt = trailerDict.get('Encrypt');
-    if (encrypt) {
-      var fileId = trailerDict.get('ID');
-      this.encrypt = new CipherTransformFactory(encrypt,
-                                                fileId[0] /*, password */);
-    }
-
-    // get the root dictionary (catalog) object
-    if (!(this.root = trailerDict.get('Root')))
-      error('Invalid root reference');
-  }
-
-  XRef.prototype = {
-    readXRefTable: function XRef_readXRefTable(parser) {
-      // Example of cross-reference table:
-      // xref
-      // 0 1                    <-- subsection header (first obj #, obj count)
-      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
-      // 23 2                   <-- subsection header ... and so on ...
-      // 0000025518 00002 n
-      // 0000025635 00000 n
-      // trailer
-      // ...
-
-      // Outer loop is over subsection headers
-      var obj;
-      while (!isCmd(obj = parser.getObj(), 'trailer')) {
-        var first = obj,
-            count = parser.getObj();
-
-        if (!isInt(first) || !isInt(count))
-          error('Invalid XRef table: wrong types in subsection header');
-
-        // Inner loop is over objects themselves
-        for (var i = 0; i < count; i++) {
-          var entry = {};
-          entry.offset = parser.getObj();
-          entry.gen = parser.getObj();
-          var type = parser.getObj();
-
-          if (isCmd(type, 'f'))
-            entry.free = true;
-          else if (isCmd(type, 'n'))
-            entry.uncompressed = true;
-
-          // Validate entry obj
-          if (!isInt(entry.offset) || !isInt(entry.gen) ||
-              !(entry.free || entry.uncompressed)) {
-            error('Invalid entry in XRef subsection: ' + first + ', ' + count);
-          }
-
-          if (!this.entries[i + first])
-            this.entries[i + first] = entry;
-        }
-      }
-
-      // Sanity check: as per spec, first object must have these properties
-      if (this.entries[0] &&
-          !(this.entries[0].gen === 65535 && this.entries[0].free))
-        error('Invalid XRef table: unexpected first object');
-
-      // Sanity check
-      if (!isCmd(obj, 'trailer'))
-        error('Invalid XRef table: could not find trailer dictionary');
-
-      // Read trailer dictionary, e.g.
-      // trailer
-      //    << /Size 22
-      //      /Root 20R
-      //      /Info 10R
-      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
-      //    >>
-      // The parser goes through the entire stream << ... >> and provides
-      // a getter interface for the key-value table
-      var dict = parser.getObj();
-      if (!isDict(dict))
-        error('Invalid XRef table: could not parse trailer dictionary');
-
-      return dict;
-    },
-    readXRefStream: function XRef_readXRefStream(stream) {
-      var streamParameters = stream.parameters;
-      var byteWidths = streamParameters.get('W');
-      var range = streamParameters.get('Index');
-      if (!range)
-        range = [0, streamParameters.get('Size')];
-      var i, j;
-      while (range.length > 0) {
-        var first = range[0], n = range[1];
-        if (!isInt(first) || !isInt(n))
-          error('Invalid XRef range fields: ' + first + ', ' + n);
-        var typeFieldWidth = byteWidths[0];
-        var offsetFieldWidth = byteWidths[1];
-        var generationFieldWidth = byteWidths[2];
-        if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
-            !isInt(generationFieldWidth)) {
-          error('Invalid XRef entry fields length: ' + first + ', ' + n);
-        }
-        for (i = 0; i < n; ++i) {
-          var type = 0, offset = 0, generation = 0;
-          for (j = 0; j < typeFieldWidth; ++j)
-            type = (type << 8) | stream.getByte();
-          // if type field is absent, its default value = 1
-          if (typeFieldWidth == 0)
-            type = 1;
-          for (j = 0; j < offsetFieldWidth; ++j)
-            offset = (offset << 8) | stream.getByte();
-          for (j = 0; j < generationFieldWidth; ++j)
-            generation = (generation << 8) | stream.getByte();
-          var entry = {};
-          entry.offset = offset;
-          entry.gen = generation;
-          switch (type) {
-            case 0:
-              entry.free = true;
-              break;
-            case 1:
-              entry.uncompressed = true;
-              break;
-            case 2:
-              break;
-            default:
-              error('Invalid XRef entry type: ' + type);
-          }
-          if (!this.entries[first + i])
-            this.entries[first + i] = entry;
-        }
-        range.splice(0, 2);
-      }
-      return streamParameters;
-    },
-    indexObjects: function XRef_indexObjects() {
-      // Simple scan through the PDF content to find objects,
-      // trailers and XRef streams.
-      function readToken(data, offset) {
-        var token = '', ch = data[offset];
-        while (ch !== 13 && ch !== 10) {
-          if (++offset >= data.length)
-            break;
-          token += String.fromCharCode(ch);
-          ch = data[offset];
-        }
-        return token;
-      }
-      function skipUntil(data, offset, what) {
-        var length = what.length, dataLength = data.length;
-        var skipped = 0;
-        // finding byte sequence
-        while (offset < dataLength) {
-          var i = 0;
-          while (i < length && data[offset + i] == what[i])
-            ++i;
-          if (i >= length)
-            break; // sequence found
-
-          offset++;
-          skipped++;
-        }
-        return skipped;
-      }
-      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
-      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
-                                          101, 102]);
-      var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
-      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
-
-      var stream = this.stream;
-      stream.pos = 0;
-      var buffer = stream.getBytes();
-      var position = stream.start, length = buffer.length;
-      var trailers = [], xrefStms = [];
-      var state = 0;
-      var currentToken;
-      while (position < length) {
-        var ch = buffer[position];
-        if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
-          ++position;
-          continue;
-        }
-        if (ch === 37) { // %-comment
-          do {
-            ++position;
-            ch = buffer[position];
-          } while (ch !== 13 && ch !== 10);
-          continue;
-        }
-        var token = readToken(buffer, position);
-        var m;
-        if (token === 'xref') {
-          position += skipUntil(buffer, position, trailerBytes);
-          trailers.push(position);
-          position += skipUntil(buffer, position, startxrefBytes);
-        } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
-          this.entries[m[1]] = {
-            offset: position,
-            gen: m[2] | 0,
-            uncompressed: true
-          };
-
-          var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
-          var content = buffer.subarray(position, position + contentLength);
-
-          // checking XRef stream suspect
-          // (it shall have '/XRef' and next char is not a letter)
-          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
-          if (xrefTagOffset < contentLength &&
-              content[xrefTagOffset + 5] < 64) {
-            xrefStms.push(position);
-            this.xrefstms[position] = 1; // don't read it recursively
-          }
-
-          position += contentLength;
-        } else
-          position += token.length + 1;
-      }
-      // reading XRef streams
-      for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
-          this.readXRef(xrefStms[i]);
-      }
-      // finding main trailer
-      var dict;
-      for (var i = 0, ii = trailers.length; i < ii; ++i) {
-        stream.pos = trailers[i];
-        var parser = new Parser(new Lexer(stream), true, null);
-        var obj = parser.getObj();
-        if (!isCmd(obj, 'trailer'))
-          continue;
-        // read the trailer dictionary
-        if (!isDict(dict = parser.getObj()))
-          continue;
-        // taking the first one with 'ID'
-        if (dict.has('ID'))
-          return dict;
-      }
-      // no tailer with 'ID', taking last one (if exists)
-      if (dict)
-        return dict;
-      // nothing helps
-      error('Invalid PDF structure');
-    },
-    readXRef: function XRef_readXRef(startXRef) {
-      var stream = this.stream;
-      stream.pos = startXRef;
-
-      try {
-        var parser = new Parser(new Lexer(stream), true, null);
-        var obj = parser.getObj();
-        var dict;
-
-        // Get dictionary
-        if (isCmd(obj, 'xref')) {
-          // Parse end-of-file XRef
-          dict = this.readXRefTable(parser);
-
-          // Recursively get other XRefs 'XRefStm', if any
-          obj = dict.get('XRefStm');
-          if (isInt(obj)) {
-            var pos = obj;
-            // ignore previously loaded xref streams
-            // (possible infinite recursion)
-            if (!(pos in this.xrefstms)) {
-              this.xrefstms[pos] = 1;
-              this.readXRef(pos);
-            }
-          }
-        } else if (isInt(obj)) {
-          // Parse in-stream XRef
-          if (!isInt(parser.getObj()) ||
-              !isCmd(parser.getObj(), 'obj') ||
-              !isStream(obj = parser.getObj())) {
-            error('Invalid XRef stream');
-          }
-          dict = this.readXRefStream(obj);
-        }
-
-        // Recursively get previous dictionary, if any
-        obj = dict.get('Prev');
-        if (isInt(obj))
-          this.readXRef(obj);
-        else if (isRef(obj)) {
-          // The spec says Prev must not be a reference, i.e. "/Prev NNN"
-          // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
-          this.readXRef(obj.num);
-        }
-
-        return dict;
-      } catch (e) {
-        log('(while reading XRef): ' + e);
-      }
-
-      warn('Indexing all PDF objects');
-      return this.indexObjects();
-    },
-    getEntry: function XRef_getEntry(i) {
-      var e = this.entries[i];
-      if (e === null)
-        return null;
-      return e.free ? null : e; // returns null is the entry is free
-    },
-    fetchIfRef: function XRef_fetchIfRef(obj) {
-      if (!isRef(obj))
-        return obj;
-      return this.fetch(obj);
-    },
-    fetch: function XRef_fetch(ref, suppressEncryption) {
-      assertWellFormed(isRef(ref), 'ref object is not a reference');
-      var num = ref.num;
-      if (num in this.cache)
-        return this.cache[num];
-
-      var e = this.getEntry(num);
-
-      // the referenced entry can be free
-      if (e === null)
-        return (this.cache[num] = e);
-
-      var gen = ref.gen;
-      var stream, parser;
-      if (e.uncompressed) {
-        if (e.gen != gen)
-          error('inconsistent generation in XRef');
-        stream = this.stream.makeSubStream(e.offset);
-        parser = new Parser(new Lexer(stream), true, this);
-        var obj1 = parser.getObj();
-        var obj2 = parser.getObj();
-        var obj3 = parser.getObj();
-        if (!isInt(obj1) || obj1 != num ||
-            !isInt(obj2) || obj2 != gen ||
-            !isCmd(obj3)) {
-          error('bad XRef entry');
-        }
-        if (!isCmd(obj3, 'obj')) {
-          // some bad pdfs use "obj1234" and really mean 1234
-          if (obj3.cmd.indexOf('obj') == 0) {
-            num = parseInt(obj3.cmd.substring(3), 10);
-            if (!isNaN(num))
-              return num;
-          }
-          error('bad XRef entry');
-        }
-        if (this.encrypt && !suppressEncryption) {
-          try {
-            e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
-          } catch (ex) {
-            // almost all streams must be encrypted, but sometimes
-            // they are not probably due to some broken generators
-            // re-trying without encryption
-            return this.fetch(ref, true);
-          }
-        } else {
-          e = parser.getObj();
-        }
-        // Don't cache streams since they are mutable (except images).
-        if (!isStream(e) || e instanceof JpegStream)
-          this.cache[num] = e;
-        return e;
-      }
-
-      // compressed entry
-      stream = this.fetch(new Ref(e.offset, 0));
-      if (!isStream(stream))
-        error('bad ObjStm stream');
-      var first = stream.parameters.get('First');
-      var n = stream.parameters.get('N');
-      if (!isInt(first) || !isInt(n)) {
-        error('invalid first and n parameters for ObjStm stream');
-      }
-      parser = new Parser(new Lexer(stream), false, this);
-      var i, entries = [], nums = [];
-      // read the object numbers to populate cache
-      for (i = 0; i < n; ++i) {
-        num = parser.getObj();
-        if (!isInt(num)) {
-          error('invalid object number in the ObjStm stream: ' + num);
-        }
-        nums.push(num);
-        var offset = parser.getObj();
-        if (!isInt(offset)) {
-          error('invalid object offset in the ObjStm stream: ' + offset);
-        }
-      }
-      // read stream objects for cache
-      for (i = 0; i < n; ++i) {
-        entries.push(parser.getObj());
-        this.cache[nums[i]] = entries[i];
-      }
-      e = entries[e.gen];
-      if (!e) {
-        error('bad XRef entry for compressed object');
-      }
-      return e;
-    },
-    getCatalogObj: function XRef_getCatalogObj() {
-      return this.root;
-    }
-  };
-
-  return XRef;
-})();
-
-/**
- * A PDF document and page is built of many objects. E.g. there are objects
- * for fonts, images, rendering code and such. These objects might get processed
- * inside of a worker. The `PDFObjects` implements some basic functions to
- * manage these objects.
- */
-var PDFObjects = (function PDFObjectsClosure() {
-  function PDFObjects() {
-    this.objs = {};
-  }
-
-  PDFObjects.prototype = {
-    objs: null,
-
-    /**
-     * Internal function.
-     * Ensures there is an object defined for `objId`. Stores `data` on the
-     * object *if* it is created.
-     */
-    ensureObj: function PDFObjects_ensureObj(objId, data) {
-      if (this.objs[objId])
-        return this.objs[objId];
-      return this.objs[objId] = new Promise(objId, data);
-    },
-
-    /**
-     * If called *without* callback, this returns the data of `objId` but the
-     * object needs to be resolved. If it isn't, this function throws.
-     *
-     * If called *with* a callback, the callback is called with the data of the
-     * object once the object is resolved. That means, if you call this
-     * function and the object is already resolved, the callback gets called
-     * right away.
-     */
-    get: function PDFObjects_get(objId, callback) {
-      // If there is a callback, then the get can be async and the object is
-      // not required to be resolved right now
-      if (callback) {
-        this.ensureObj(objId).then(callback);
-        return null;
-      }
-
-      // If there isn't a callback, the user expects to get the resolved data
-      // directly.
-      var obj = this.objs[objId];
-
-      // If there isn't an object yet or the object isn't resolved, then the
-      // data isn't ready yet!
-      if (!obj || !obj.isResolved)
-        error('Requesting object that isn\'t resolved yet ' + objId);
-
-      return obj.data;
-    },
-
-    /**
-     * Resolves the object `objId` with optional `data`.
-     */
-    resolve: function PDFObjects_resolve(objId, data) {
-      var objs = this.objs;
-
-      // In case there is a promise already on this object, just resolve it.
-      if (objs[objId]) {
-        objs[objId].resolve(data);
-      } else {
-        this.ensureObj(objId, data);
-      }
-    },
-
-    onData: function PDFObjects_onData(objId, callback) {
-      this.ensureObj(objId).onData(callback);
-    },
-
-    isResolved: function PDFObjects_isResolved(objId) {
-      var objs = this.objs;
-      if (!objs[objId]) {
-        return false;
-      } else {
-        return objs[objId].isResolved;
-      }
-    },
-
-    hasData: function PDFObjects_hasData(objId) {
-      var objs = this.objs;
-      if (!objs[objId]) {
-        return false;
-      } else {
-        return objs[objId].hasData;
-      }
-    },
-
-    /**
-     * Sets the data of an object but *doesn't* resolve it.
-     */
-    setData: function PDFObjects_setData(objId, data) {
-      // Watchout! If you call `this.ensureObj(objId, data)` you're going to
-      // create a *resolved* promise which shouldn't be the case!
-      this.ensureObj(objId).data = data;
-    }
-  };
-  return PDFObjects;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/parser.js b/apps/files_pdfviewer/js/pdfjs/src/parser.js
deleted file mode 100644
index 1c50d0f5f95ac0bc06969644fb478a29e90c45c2..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/parser.js
+++ /dev/null
@@ -1,639 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var EOF = {};
-
-function isEOF(v) {
-  return v == EOF;
-}
-
-var Parser = (function ParserClosure() {
-  function Parser(lexer, allowStreams, xref) {
-    this.lexer = lexer;
-    this.allowStreams = allowStreams;
-    this.xref = xref;
-    this.inlineImg = 0;
-    this.refill();
-  }
-
-  Parser.prototype = {
-    refill: function Parser_refill() {
-      this.buf1 = this.lexer.getObj();
-      this.buf2 = this.lexer.getObj();
-    },
-    shift: function Parser_shift() {
-      if (isCmd(this.buf2, 'ID')) {
-        this.buf1 = this.buf2;
-        this.buf2 = null;
-        // skip byte after ID
-        this.lexer.skip();
-      } else {
-        this.buf1 = this.buf2;
-        this.buf2 = this.lexer.getObj();
-      }
-    },
-    getObj: function Parser_getObj(cipherTransform) {
-      if (isCmd(this.buf1, 'BI')) { // inline image
-        this.shift();
-        return this.makeInlineImage(cipherTransform);
-      }
-      if (isCmd(this.buf1, '[')) { // array
-        this.shift();
-        var array = [];
-        while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
-          array.push(this.getObj());
-        if (isEOF(this.buf1))
-          error('End of file inside array');
-        this.shift();
-        return array;
-      }
-      if (isCmd(this.buf1, '<<')) { // dictionary or stream
-        this.shift();
-        var dict = new Dict(this.xref);
-        while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
-          if (!isName(this.buf1))
-            error('Dictionary key must be a name object');
-
-          var key = this.buf1.name;
-          this.shift();
-          if (isEOF(this.buf1))
-            break;
-          dict.set(key, this.getObj(cipherTransform));
-        }
-        if (isEOF(this.buf1))
-          error('End of file inside dictionary');
-
-        // stream objects are not allowed inside content streams or
-        // object streams
-        if (isCmd(this.buf2, 'stream')) {
-          return this.allowStreams ?
-            this.makeStream(dict, cipherTransform) : dict;
-        }
-        this.shift();
-        return dict;
-      }
-      if (isInt(this.buf1)) { // indirect reference or integer
-        var num = this.buf1;
-        this.shift();
-        if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
-          var ref = new Ref(num, this.buf1);
-          this.shift();
-          this.shift();
-          return ref;
-        }
-        return num;
-      }
-      if (isString(this.buf1)) { // string
-        var str = this.buf1;
-        this.shift();
-        if (cipherTransform)
-          str = cipherTransform.decryptString(str);
-        return str;
-      }
-
-      // simple object
-      var obj = this.buf1;
-      this.shift();
-      return obj;
-    },
-    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
-      var lexer = this.lexer;
-      var stream = lexer.stream;
-
-      // parse dictionary
-      var dict = new Dict();
-      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
-        if (!isName(this.buf1))
-          error('Dictionary key must be a name object');
-
-        var key = this.buf1.name;
-        this.shift();
-        if (isEOF(this.buf1))
-          break;
-        dict.set(key, this.getObj(cipherTransform));
-      }
-
-      // parse image stream
-      var startPos = stream.pos;
-
-      // searching for the /EI\s/
-      var state = 0, ch;
-      while (state != 4 && (ch = stream.getByte()) != null) {
-        switch (ch) {
-          case 0x20:
-          case 0x0D:
-          case 0x0A:
-            state = state === 3 ? 4 : 0;
-            break;
-          case 0x45:
-            state = 2;
-            break;
-          case 0x49:
-            state = state === 2 ? 3 : 0;
-            break;
-          default:
-            state = 0;
-            break;
-        }
-      }
-
-      // TODO improve the small images performance to remove the limit
-      var inlineImgLimit = 500;
-      if (++this.inlineImg >= inlineImgLimit) {
-        if (this.inlineImg === inlineImgLimit)
-          warn('Too many inline images');
-        this.shift();
-        return null;
-      }
-
-      var length = (stream.pos - 4) - startPos;
-      var imageStream = stream.makeSubStream(startPos, length, dict);
-      if (cipherTransform)
-        imageStream = cipherTransform.createStream(imageStream);
-      imageStream = this.filter(imageStream, dict, length);
-      imageStream.parameters = dict;
-
-      this.buf2 = Cmd.get('EI');
-      this.shift();
-
-      return imageStream;
-    },
-    fetchIfRef: function Parser_fetchIfRef(obj) {
-      // not relying on the xref.fetchIfRef -- xref might not be set
-      return isRef(obj) ? this.xref.fetch(obj) : obj;
-    },
-    makeStream: function Parser_makeStream(dict, cipherTransform) {
-      var lexer = this.lexer;
-      var stream = lexer.stream;
-
-      // get stream start position
-      lexer.skipToNextLine();
-      var pos = stream.pos;
-
-      // get length
-      var length = this.fetchIfRef(dict.get('Length'));
-      if (!isInt(length))
-        error('Bad ' + length + ' attribute in stream');
-
-      // skip over the stream data
-      stream.pos = pos + length;
-      this.shift(); // '>>'
-      this.shift(); // 'stream'
-      if (!isCmd(this.buf1, 'endstream'))
-        error('Missing endstream');
-      this.shift();
-
-      stream = stream.makeSubStream(pos, length, dict);
-      if (cipherTransform)
-        stream = cipherTransform.createStream(stream);
-      stream = this.filter(stream, dict, length);
-      stream.parameters = dict;
-      return stream;
-    },
-    filter: function Parser_filter(stream, dict, length) {
-      var filter = this.fetchIfRef(dict.get('Filter', 'F'));
-      var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
-      if (isName(filter))
-        return this.makeFilter(stream, filter.name, length, params);
-      if (isArray(filter)) {
-        var filterArray = filter;
-        var paramsArray = params;
-        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
-          filter = filterArray[i];
-          if (!isName(filter))
-            error('Bad filter name: ' + filter);
-
-          params = null;
-          if (isArray(paramsArray) && (i in paramsArray))
-            params = paramsArray[i];
-          stream = this.makeFilter(stream, filter.name, length, params);
-          // after the first stream the length variable is invalid
-          length = null;
-        }
-      }
-      return stream;
-    },
-    makeFilter: function Parser_makeFilter(stream, name, length, params) {
-      if (name == 'FlateDecode' || name == 'Fl') {
-        if (params) {
-          return new PredictorStream(new FlateStream(stream), params);
-        }
-        return new FlateStream(stream);
-      }
-      if (name == 'LZWDecode' || name == 'LZW') {
-        var earlyChange = 1;
-        if (params) {
-          if (params.has('EarlyChange'))
-            earlyChange = params.get('EarlyChange');
-          return new PredictorStream(
-            new LZWStream(stream, earlyChange), params);
-        }
-        return new LZWStream(stream, earlyChange);
-      }
-      if (name == 'DCTDecode' || name == 'DCT') {
-        var bytes = stream.getBytes(length);
-        return new JpegStream(bytes, stream.dict, this.xref);
-      }
-      if (name == 'JPXDecode' || name == 'JPX') {
-        var bytes = stream.getBytes(length);
-        return new JpxStream(bytes, stream.dict);
-      }
-      if (name == 'ASCII85Decode' || name == 'A85') {
-        return new Ascii85Stream(stream);
-      }
-      if (name == 'ASCIIHexDecode' || name == 'AHx') {
-        return new AsciiHexStream(stream);
-      }
-      if (name == 'CCITTFaxDecode' || name == 'CCF') {
-        return new CCITTFaxStream(stream, params);
-      }
-      if (name == 'RunLengthDecode') {
-        return new RunLengthStream(stream);
-      }
-      warn('filter "' + name + '" not supported yet');
-      return stream;
-    }
-  };
-
-  return Parser;
-})();
-
-var Lexer = (function LexerClosure() {
-  function Lexer(stream) {
-    this.stream = stream;
-  }
-
-  Lexer.isSpace = function Lexer_isSpace(ch) {
-    return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
-  };
-
-  // A '1' in this array means the character is white space.  A '1' or
-  // '2' means the character ends a name or command.
-  var specialChars = [
-    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
-    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
-    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
-  ];
-
-  function toHexDigit(ch) {
-    if (ch >= '0' && ch <= '9')
-      return ch.charCodeAt(0) - 48;
-    ch = ch.toUpperCase();
-    if (ch >= 'A' && ch <= 'F')
-      return ch.charCodeAt(0) - 55;
-    return -1;
-  }
-
-  Lexer.prototype = {
-    getNumber: function Lexer_getNumber(ch) {
-      var floating = false;
-      var str = ch;
-      var stream = this.stream;
-      for (;;) {
-        ch = stream.lookChar();
-        if (ch == '.' && !floating) {
-          str += ch;
-          floating = true;
-        } else if (ch == '-') {
-          // ignore minus signs in the middle of numbers to match
-          // Adobe's behavior
-          warn('Badly formated number');
-        } else if (ch >= '0' && ch <= '9') {
-          str += ch;
-        } else if (ch == 'e' || ch == 'E') {
-          floating = true;
-        } else {
-          // the last character doesn't belong to us
-          break;
-        }
-        stream.skip();
-      }
-      var value = parseFloat(str);
-      if (isNaN(value))
-        error('Invalid floating point number: ' + value);
-      return value;
-    },
-    getString: function Lexer_getString() {
-      var numParen = 1;
-      var done = false;
-      var str = '';
-      var stream = this.stream;
-      var ch;
-      do {
-        ch = stream.getChar();
-        switch (ch) {
-          case undefined:
-            warn('Unterminated string');
-            done = true;
-            break;
-          case '(':
-            ++numParen;
-            str += ch;
-            break;
-          case ')':
-            if (--numParen == 0) {
-              done = true;
-            } else {
-              str += ch;
-            }
-            break;
-          case '\\':
-            ch = stream.getChar();
-            switch (ch) {
-              case undefined:
-                warn('Unterminated string');
-                done = true;
-                break;
-              case 'n':
-                str += '\n';
-                break;
-              case 'r':
-                str += '\r';
-                break;
-              case 't':
-                str += '\t';
-                break;
-              case 'b':
-                str += '\b';
-                break;
-              case 'f':
-                str += '\f';
-                break;
-              case '\\':
-              case '(':
-              case ')':
-                str += ch;
-                break;
-              case '0': case '1': case '2': case '3':
-              case '4': case '5': case '6': case '7':
-                var x = ch - '0';
-                ch = stream.lookChar();
-                if (ch >= '0' && ch <= '7') {
-                  stream.skip();
-                  x = (x << 3) + (ch - '0');
-                  ch = stream.lookChar();
-                  if (ch >= '0' && ch <= '7') {
-                    stream.skip();
-                    x = (x << 3) + (ch - '0');
-                  }
-                }
-
-                str += String.fromCharCode(x);
-                break;
-              case '\r':
-                ch = stream.lookChar();
-                if (ch == '\n')
-                  stream.skip();
-                break;
-              case '\n':
-                break;
-              default:
-                str += ch;
-            }
-            break;
-          default:
-            str += ch;
-        }
-      } while (!done);
-      return str;
-    },
-    getName: function Lexer_getName(ch) {
-      var str = '';
-      var stream = this.stream;
-      while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
-        stream.skip();
-        if (ch == '#') {
-          ch = stream.lookChar();
-          var x = toHexDigit(ch);
-          if (x != -1) {
-            stream.skip();
-            var x2 = toHexDigit(stream.getChar());
-            if (x2 == -1)
-              error('Illegal digit in hex char in name: ' + x2);
-            str += String.fromCharCode((x << 4) | x2);
-          } else {
-            str += '#';
-            str += ch;
-          }
-        } else {
-          str += ch;
-        }
-      }
-      if (str.length > 128)
-        error('Warning: name token is longer than allowed by the spec: ' +
-              str.length);
-      return new Name(str);
-    },
-    getHexString: function Lexer_getHexString(ch) {
-      var str = '';
-      var stream = this.stream;
-      for (;;) {
-        ch = stream.getChar();
-        if (ch == '>') {
-          break;
-        }
-        if (!ch) {
-          warn('Unterminated hex string');
-          break;
-        }
-        if (specialChars[ch.charCodeAt(0)] != 1) {
-          var x, x2;
-          if ((x = toHexDigit(ch)) == -1)
-            error('Illegal character in hex string: ' + ch);
-
-          ch = stream.getChar();
-          while (specialChars[ch.charCodeAt(0)] == 1)
-            ch = stream.getChar();
-
-          if ((x2 = toHexDigit(ch)) == -1)
-            error('Illegal character in hex string: ' + ch);
-
-          str += String.fromCharCode((x << 4) | x2);
-        }
-      }
-      return str;
-    },
-    getObj: function Lexer_getObj() {
-      // skip whitespace and comments
-      var comment = false;
-      var stream = this.stream;
-      var ch;
-      while (true) {
-        if (!(ch = stream.getChar()))
-          return EOF;
-        if (comment) {
-          if (ch == '\r' || ch == '\n')
-            comment = false;
-        } else if (ch == '%') {
-          comment = true;
-        } else if (specialChars[ch.charCodeAt(0)] != 1) {
-          break;
-        }
-      }
-
-      // start reading token
-      switch (ch) {
-        case '0': case '1': case '2': case '3': case '4':
-        case '5': case '6': case '7': case '8': case '9':
-        case '+': case '-': case '.':
-          return this.getNumber(ch);
-        case '(':
-          return this.getString();
-        case '/':
-          return this.getName(ch);
-        // array punctuation
-        case '[':
-        case ']':
-          return Cmd.get(ch);
-        // hex string or dict punctuation
-        case '<':
-          ch = stream.lookChar();
-          if (ch == '<') {
-            // dict punctuation
-            stream.skip();
-            return Cmd.get('<<');
-          }
-          return this.getHexString(ch);
-        // dict punctuation
-        case '>':
-          ch = stream.lookChar();
-          if (ch == '>') {
-            stream.skip();
-            return Cmd.get('>>');
-          }
-        case '{':
-        case '}':
-          return Cmd.get(ch);
-        // fall through
-        case ')':
-          error('Illegal character: ' + ch);
-      }
-
-      // command
-      var str = ch;
-      while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
-        stream.skip();
-        if (str.length == 128)
-          error('Command token too long: ' + str.length);
-
-        str += ch;
-      }
-      if (str == 'true')
-        return true;
-      if (str == 'false')
-        return false;
-      if (str == 'null')
-        return null;
-      return Cmd.get(str);
-    },
-    skipToNextLine: function Lexer_skipToNextLine() {
-      var stream = this.stream;
-      while (true) {
-        var ch = stream.getChar();
-        if (!ch || ch == '\n')
-          return;
-        if (ch == '\r') {
-          if ((ch = stream.lookChar()) == '\n')
-            stream.skip();
-          return;
-        }
-      }
-    },
-    skip: function Lexer_skip() {
-      this.stream.skip();
-    }
-  };
-
-  return Lexer;
-})();
-
-var Linearization = (function LinearizationClosure() {
-  function Linearization(stream) {
-    this.parser = new Parser(new Lexer(stream), false, null);
-    var obj1 = this.parser.getObj();
-    var obj2 = this.parser.getObj();
-    var obj3 = this.parser.getObj();
-    this.linDict = this.parser.getObj();
-    if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
-        isDict(this.linDict)) {
-      var obj = this.linDict.get('Linearized');
-      if (!(isNum(obj) && obj > 0))
-        this.linDict = null;
-    }
-  }
-
-  Linearization.prototype = {
-    getInt: function Linearization_getInt(name) {
-      var linDict = this.linDict;
-      var obj;
-      if (isDict(linDict) &&
-          isInt(obj = linDict.get(name)) &&
-          obj > 0) {
-        return obj;
-      }
-      error('"' + name + '" field in linearization table is invalid');
-    },
-    getHint: function Linearization_getHint(index) {
-      var linDict = this.linDict;
-      var obj1, obj2;
-      if (isDict(linDict) &&
-          isArray(obj1 = linDict.get('H')) &&
-          obj1.length >= 2 &&
-          isInt(obj2 = obj1[index]) &&
-          obj2 > 0) {
-        return obj2;
-      }
-      error('Hints table in linearization table is invalid: ' + index);
-    },
-    get length() {
-      if (!isDict(this.linDict))
-        return 0;
-      return this.getInt('L');
-    },
-    get hintsOffset() {
-      return this.getHint(0);
-    },
-    get hintsLength() {
-      return this.getHint(1);
-    },
-    get hintsOffset2() {
-      return this.getHint(2);
-    },
-    get hintsLenth2() {
-      return this.getHint(3);
-    },
-    get objectNumberFirst() {
-      return this.getInt('O');
-    },
-    get endFirst() {
-      return this.getInt('E');
-    },
-    get numPages() {
-      return this.getInt('N');
-    },
-    get mainXRefEntriesOffset() {
-      return this.getInt('T');
-    },
-    get pageFirst() {
-      return this.getInt('P');
-    }
-  };
-
-  return Linearization;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/pattern.js b/apps/files_pdfviewer/js/pdfjs/src/pattern.js
deleted file mode 100644
index 7659f54363c18cea76ee7fc4eea271ce4fb53e57..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/pattern.js
+++ /dev/null
@@ -1,303 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var PatternType = {
-  AXIAL: 2,
-  RADIAL: 3
-};
-
-var Pattern = (function PatternClosure() {
-  // Constructor should define this.getPattern
-  function Pattern() {
-    error('should not call Pattern constructor');
-  }
-
-  Pattern.prototype = {
-    // Input: current Canvas context
-    // Output: the appropriate fillStyle or strokeStyle
-    getPattern: function Pattern_getPattern(ctx) {
-      error('Should not call Pattern.getStyle: ' + ctx);
-    }
-  };
-
-  Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
-    return Shadings[raw[0]].fromIR(raw);
-  };
-
-  Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
-                                                       res) {
-
-    var dict = isStream(shading) ? shading.dict : shading;
-    var type = dict.get('ShadingType');
-
-    switch (type) {
-      case PatternType.AXIAL:
-      case PatternType.RADIAL:
-        // Both radial and axial shadings are handled by RadialAxial shading.
-        return new Shadings.RadialAxial(dict, matrix, xref, res);
-      default:
-        return new Shadings.Dummy();
-    }
-  };
-  return Pattern;
-})();
-
-var Shadings = {};
-
-// Radial and axial shading have very similar implementations
-// If needed, the implementations can be broken into two classes
-Shadings.RadialAxial = (function RadialAxialClosure() {
-  function RadialAxial(dict, matrix, xref, res, ctx) {
-    this.matrix = matrix;
-    this.coordsArr = dict.get('Coords');
-    this.shadingType = dict.get('ShadingType');
-    this.type = 'Pattern';
-
-    this.ctx = ctx;
-    var cs = dict.get('ColorSpace', 'CS');
-    cs = ColorSpace.parse(cs, xref, res);
-    this.cs = cs;
-
-    var t0 = 0.0, t1 = 1.0;
-    if (dict.has('Domain')) {
-      var domainArr = dict.get('Domain');
-      t0 = domainArr[0];
-      t1 = domainArr[1];
-    }
-
-    var extendStart = false, extendEnd = false;
-    if (dict.has('Extend')) {
-      var extendArr = dict.get('Extend');
-      extendStart = extendArr[0];
-      extendEnd = extendArr[1];
-      TODO('Support extend');
-    }
-
-    this.extendStart = extendStart;
-    this.extendEnd = extendEnd;
-
-    var fnObj = dict.get('Function');
-    if (isArray(fnObj))
-      error('No support for array of functions');
-    if (!isPDFFunction(fnObj))
-      error('Invalid function');
-    var fn = PDFFunction.parse(xref, fnObj);
-
-    // 10 samples seems good enough for now, but probably won't work
-    // if there are sharp color changes. Ideally, we would implement
-    // the spec faithfully and add lossless optimizations.
-    var step = (t1 - t0) / 10;
-    var diff = t1 - t0;
-
-    var colorStops = [];
-    for (var i = t0; i <= t1; i += step) {
-      var rgbColor = cs.getRgb(fn([i]));
-      var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
-      colorStops.push([(i - t0) / diff, cssColor]);
-    }
-
-    this.colorStops = colorStops;
-  }
-
-  RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
-    var type = raw[1];
-    var colorStops = raw[2];
-    var p0 = raw[3];
-    var p1 = raw[4];
-    var r0 = raw[5];
-    var r1 = raw[6];
-    return {
-      type: 'Pattern',
-      getPattern: function(ctx) {
-        var curMatrix = ctx.mozCurrentTransform;
-        if (curMatrix) {
-          var userMatrix = ctx.mozCurrentTransformInverse;
-
-          p0 = Util.applyTransform(p0, curMatrix);
-          p0 = Util.applyTransform(p0, userMatrix);
-
-          p1 = Util.applyTransform(p1, curMatrix);
-          p1 = Util.applyTransform(p1, userMatrix);
-        }
-
-        var grad;
-        if (type == PatternType.AXIAL)
-          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
-        else if (type == PatternType.RADIAL)
-          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
-
-        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
-          var c = colorStops[i];
-          grad.addColorStop(c[0], c[1]);
-        }
-        return grad;
-      }
-    };
-  };
-
-  RadialAxial.prototype = {
-    getIR: function RadialAxial_getIR() {
-      var coordsArr = this.coordsArr;
-      var type = this.shadingType;
-      if (type == PatternType.AXIAL) {
-        var p0 = [coordsArr[0], coordsArr[1]];
-        var p1 = [coordsArr[2], coordsArr[3]];
-        var r0 = null;
-        var r1 = null;
-      } else if (type == PatternType.RADIAL) {
-        var p0 = [coordsArr[0], coordsArr[1]];
-        var p1 = [coordsArr[3], coordsArr[4]];
-        var r0 = coordsArr[2];
-        var r1 = coordsArr[5];
-      } else {
-        error('getPattern type unknown: ' + type);
-      }
-
-      var matrix = this.matrix;
-      if (matrix) {
-        p0 = Util.applyTransform(p0, matrix);
-        p1 = Util.applyTransform(p1, matrix);
-      }
-
-      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
-    }
-  };
-
-  return RadialAxial;
-})();
-
-Shadings.Dummy = (function DummyClosure() {
-  function Dummy() {
-    this.type = 'Pattern';
-  }
-
-  Dummy.fromIR = function Dummy_fromIR() {
-    return 'hotpink';
-  };
-
-  Dummy.prototype = {
-    getIR: function Dummy_getIR() {
-      return ['Dummy'];
-    }
-  };
-  return Dummy;
-})();
-
-var TilingPattern = (function TilingPatternClosure() {
-  var PaintType = {
-    COLORED: 1,
-    UNCOLORED: 2
-  };
-  var MAX_PATTERN_SIZE = 512;
-
-  function TilingPattern(IR, color, ctx, objs) {
-    var operatorList = IR[2];
-    this.matrix = IR[3];
-    var bbox = IR[4];
-    var xstep = IR[5];
-    var ystep = IR[6];
-    var paintType = IR[7];
-
-    TODO('TilingType');
-
-    this.curMatrix = ctx.mozCurrentTransform;
-    this.invMatrix = ctx.mozCurrentTransformInverse;
-    this.ctx = ctx;
-    this.type = 'Pattern';
-
-    var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
-
-    var topLeft = [x0, y0];
-    // we want the canvas to be as large as the step size
-    var botRight = [x0 + xstep, y0 + ystep];
-
-    var width = botRight[0] - topLeft[0];
-    var height = botRight[1] - topLeft[1];
-
-    // TODO: hack to avoid OOM, we would ideally compute the tiling
-    // pattern to be only as large as the acual size in device space
-    // This could be computed with .mozCurrentTransform, but still
-    // needs to be implemented
-    while (Math.abs(width) > MAX_PATTERN_SIZE ||
-           Math.abs(height) > MAX_PATTERN_SIZE) {
-      width = height = MAX_PATTERN_SIZE;
-    }
-
-    var tmpCanvas = createScratchCanvas(width, height);
-
-    // set the new canvas element context as the graphics context
-    var tmpCtx = tmpCanvas.getContext('2d');
-    var graphics = new CanvasGraphics(tmpCtx, objs);
-
-    switch (paintType) {
-      case PaintType.COLORED:
-        tmpCtx.fillStyle = ctx.fillStyle;
-        tmpCtx.strokeStyle = ctx.strokeStyle;
-        break;
-      case PaintType.UNCOLORED:
-        var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
-        tmpCtx.fillStyle = cssColor;
-        tmpCtx.strokeStyle = cssColor;
-        break;
-      default:
-        error('Unsupported paint type: ' + paintType);
-    }
-
-    var scale = [width / xstep, height / ystep];
-    this.scale = scale;
-
-    // transform coordinates to pattern space
-    var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
-    var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
-    graphics.transform.apply(graphics, tmpScale);
-    graphics.transform.apply(graphics, tmpTranslate);
-
-    if (bbox && isArray(bbox) && 4 == bbox.length) {
-      var bboxWidth = x1 - x0;
-      var bboxHeight = y1 - y0;
-      graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
-      graphics.clip();
-      graphics.endPath();
-    }
-
-    graphics.executeOperatorList(operatorList);
-
-    this.canvas = tmpCanvas;
-  }
-
-  TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) {
-    var matrix = dict.get('Matrix');
-    var bbox = dict.get('BBox');
-    var xstep = dict.get('XStep');
-    var ystep = dict.get('YStep');
-    var paintType = dict.get('PaintType');
-
-    return [
-      'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType
-    ];
-  };
-
-  TilingPattern.prototype = {
-    getPattern: function TilingPattern_getPattern() {
-      var matrix = this.matrix;
-      var curMatrix = this.curMatrix;
-      var ctx = this.ctx;
-
-      if (curMatrix)
-        ctx.setTransform.apply(ctx, curMatrix);
-
-      if (matrix)
-        ctx.transform.apply(ctx, matrix);
-
-      var scale = this.scale;
-      ctx.scale(1 / scale[0], 1 / scale[1]);
-
-      return ctx.createPattern(this.canvas, 'repeat');
-    }
-  };
-
-  return TilingPattern;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/pdf.js b/apps/files_pdfviewer/js/pdfjs/src/pdf.js
deleted file mode 100644
index 1042a651b8df9ece32794fef84fab2183e839e80..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/pdf.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-var PDFJS = {};
-
-(function pdfjsWrapper() {
-  // Use strict in our context only - users might not want it
-  'use strict';
-
-  PDFJS.build = 'PDFJSSCRIPT_BUNDLE_VER';
-
-  // Files are inserted below - see Makefile
-  /* PDFJSSCRIPT_INCLUDE_ALL */
-
-}).call((typeof window === 'undefined') ? this : window);
diff --git a/apps/files_pdfviewer/js/pdfjs/src/stream.js b/apps/files_pdfviewer/js/pdfjs/src/stream.js
deleted file mode 100644
index 48c462fb2c37250fcb215f1ed8e917fad4455f1c..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/stream.js
+++ /dev/null
@@ -1,2294 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-var Stream = (function StreamClosure() {
-  function Stream(arrayBuffer, start, length, dict) {
-    this.bytes = new Uint8Array(arrayBuffer);
-    this.start = start || 0;
-    this.pos = this.start;
-    this.end = (start + length) || this.bytes.length;
-    this.dict = dict;
-  }
-
-  // required methods for a stream. if a particular stream does not
-  // implement these, an error should be thrown
-  Stream.prototype = {
-    get length() {
-      return this.end - this.start;
-    },
-    getByte: function Stream_getByte() {
-      if (this.pos >= this.end)
-        return null;
-      return this.bytes[this.pos++];
-    },
-    // returns subarray of original buffer
-    // should only be read
-    getBytes: function Stream_getBytes(length) {
-      var bytes = this.bytes;
-      var pos = this.pos;
-      var strEnd = this.end;
-
-      if (!length)
-        return bytes.subarray(pos, strEnd);
-
-      var end = pos + length;
-      if (end > strEnd)
-        end = strEnd;
-
-      this.pos = end;
-      return bytes.subarray(pos, end);
-    },
-    lookChar: function Stream_lookChar() {
-      if (this.pos >= this.end)
-        return null;
-      return String.fromCharCode(this.bytes[this.pos]);
-    },
-    getChar: function Stream_getChar() {
-      if (this.pos >= this.end)
-        return null;
-      return String.fromCharCode(this.bytes[this.pos++]);
-    },
-    skip: function Stream_skip(n) {
-      if (!n)
-        n = 1;
-      this.pos += n;
-    },
-    reset: function Stream_reset() {
-      this.pos = this.start;
-    },
-    moveStart: function Stream_moveStart() {
-      this.start = this.pos;
-    },
-    makeSubStream: function Stream_makeSubStream(start, length, dict) {
-      return new Stream(this.bytes.buffer, start, length, dict);
-    },
-    isStream: true
-  };
-
-  return Stream;
-})();
-
-var StringStream = (function StringStreamClosure() {
-  function StringStream(str) {
-    var length = str.length;
-    var bytes = new Uint8Array(length);
-    for (var n = 0; n < length; ++n)
-      bytes[n] = str.charCodeAt(n);
-    Stream.call(this, bytes);
-  }
-
-  StringStream.prototype = Stream.prototype;
-
-  return StringStream;
-})();
-
-// super class for the decoding streams
-var DecodeStream = (function DecodeStreamClosure() {
-  function DecodeStream() {
-    this.pos = 0;
-    this.bufferLength = 0;
-    this.eof = false;
-    this.buffer = null;
-  }
-
-  DecodeStream.prototype = {
-    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
-      var buffer = this.buffer;
-      var current = buffer ? buffer.byteLength : 0;
-      if (requested < current)
-        return buffer;
-      var size = 512;
-      while (size < requested)
-        size <<= 1;
-      var buffer2 = new Uint8Array(size);
-      for (var i = 0; i < current; ++i)
-        buffer2[i] = buffer[i];
-      return (this.buffer = buffer2);
-    },
-    getByte: function DecodeStream_getByte() {
-      var pos = this.pos;
-      while (this.bufferLength <= pos) {
-        if (this.eof)
-          return null;
-        this.readBlock();
-      }
-      return this.buffer[this.pos++];
-    },
-    getBytes: function DecodeStream_getBytes(length) {
-      var end, pos = this.pos;
-
-      if (length) {
-        this.ensureBuffer(pos + length);
-        end = pos + length;
-
-        while (!this.eof && this.bufferLength < end)
-          this.readBlock();
-
-        var bufEnd = this.bufferLength;
-        if (end > bufEnd)
-          end = bufEnd;
-      } else {
-        while (!this.eof)
-          this.readBlock();
-
-        end = this.bufferLength;
-
-        // checking if bufferLength is still 0 then
-        // the buffer has to be initialized
-        if (!end)
-          this.buffer = new Uint8Array(0);
-      }
-
-      this.pos = end;
-      return this.buffer.subarray(pos, end);
-    },
-    lookChar: function DecodeStream_lookChar() {
-      var pos = this.pos;
-      while (this.bufferLength <= pos) {
-        if (this.eof)
-          return null;
-        this.readBlock();
-      }
-      return String.fromCharCode(this.buffer[this.pos]);
-    },
-    getChar: function DecodeStream_getChar() {
-      var pos = this.pos;
-      while (this.bufferLength <= pos) {
-        if (this.eof)
-          return null;
-        this.readBlock();
-      }
-      return String.fromCharCode(this.buffer[this.pos++]);
-    },
-    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
-      var end = start + length;
-      while (this.bufferLength <= end && !this.eof)
-        this.readBlock();
-      return new Stream(this.buffer, start, length, dict);
-    },
-    skip: function DecodeStream_skip(n) {
-      if (!n)
-        n = 1;
-      this.pos += n;
-    },
-    reset: function DecodeStream_reset() {
-      this.pos = 0;
-    }
-  };
-
-  return DecodeStream;
-})();
-
-var FakeStream = (function FakeStreamClosure() {
-  function FakeStream(stream) {
-    this.dict = stream.dict;
-    DecodeStream.call(this);
-  }
-
-  FakeStream.prototype = Object.create(DecodeStream.prototype);
-  FakeStream.prototype.readBlock = function FakeStream_readBlock() {
-    var bufferLength = this.bufferLength;
-    bufferLength += 1024;
-    var buffer = this.ensureBuffer(bufferLength);
-    this.bufferLength = bufferLength;
-  };
-
-  FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
-    var end, pos = this.pos;
-
-    if (length) {
-      this.ensureBuffer(pos + length);
-      end = pos + length;
-
-      while (!this.eof && this.bufferLength < end)
-        this.readBlock();
-
-      var bufEnd = this.bufferLength;
-      if (end > bufEnd)
-        end = bufEnd;
-    } else {
-      this.eof = true;
-      end = this.bufferLength;
-    }
-
-    this.pos = end;
-    return this.buffer.subarray(pos, end);
-  };
-
-  return FakeStream;
-})();
-
-var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
-  function StreamsSequenceStream(streams) {
-    this.streams = streams;
-    DecodeStream.call(this);
-  }
-
-  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
-
-  StreamsSequenceStream.prototype.readBlock =
-    function streamSequenceStreamReadBlock() {
-
-    var streams = this.streams;
-    if (streams.length == 0) {
-      this.eof = true;
-      return;
-    }
-    var stream = streams.shift();
-    var chunk = stream.getBytes();
-    var bufferLength = this.bufferLength;
-    var newLength = bufferLength + chunk.length;
-    var buffer = this.ensureBuffer(newLength);
-    buffer.set(chunk, bufferLength);
-    this.bufferLength = newLength;
-  };
-
-  return StreamsSequenceStream;
-})();
-
-var FlateStream = (function FlateStreamClosure() {
-  var codeLenCodeMap = new Uint32Array([
-    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
-  ]);
-
-  var lengthDecode = new Uint32Array([
-    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
-    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
-    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
-    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
-  ]);
-
-  var distDecode = new Uint32Array([
-    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
-    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
-    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
-    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
-  ]);
-
-  var fixedLitCodeTab = [new Uint32Array([
-    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
-    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
-    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
-    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
-    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
-    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
-    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
-    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
-    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
-    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
-    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
-    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
-    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
-    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
-    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
-    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
-    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
-    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
-    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
-    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
-    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
-    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
-    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
-    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
-    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
-    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
-    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
-    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
-    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
-    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
-    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
-    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
-    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
-    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
-    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
-    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
-    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
-    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
-    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
-    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
-    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
-    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
-    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
-    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
-    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
-    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
-    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
-    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
-    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
-    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
-    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
-    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
-    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
-    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
-    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
-    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
-    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
-    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
-    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
-    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
-    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
-    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
-    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
-    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
-  ]), 9];
-
-  var fixedDistCodeTab = [new Uint32Array([
-    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
-    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
-    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
-    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
-  ]), 5];
-
-  function FlateStream(stream) {
-    var bytes = stream.getBytes();
-    var bytesPos = 0;
-
-    this.dict = stream.dict;
-    var cmf = bytes[bytesPos++];
-    var flg = bytes[bytesPos++];
-    if (cmf == -1 || flg == -1)
-      error('Invalid header in flate stream: ' + cmf + ', ' + flg);
-    if ((cmf & 0x0f) != 0x08)
-      error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
-    if ((((cmf << 8) + flg) % 31) != 0)
-      error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
-    if (flg & 0x20)
-      error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
-
-    this.bytes = bytes;
-    this.bytesPos = bytesPos;
-
-    this.codeSize = 0;
-    this.codeBuf = 0;
-
-    DecodeStream.call(this);
-  }
-
-  FlateStream.prototype = Object.create(DecodeStream.prototype);
-
-  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
-    var codeSize = this.codeSize;
-    var codeBuf = this.codeBuf;
-    var bytes = this.bytes;
-    var bytesPos = this.bytesPos;
-
-    var b;
-    while (codeSize < bits) {
-      if (typeof (b = bytes[bytesPos++]) == 'undefined')
-        error('Bad encoding in flate stream');
-      codeBuf |= b << codeSize;
-      codeSize += 8;
-    }
-    b = codeBuf & ((1 << bits) - 1);
-    this.codeBuf = codeBuf >> bits;
-    this.codeSize = codeSize -= bits;
-    this.bytesPos = bytesPos;
-    return b;
-  };
-
-  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
-    var codes = table[0];
-    var maxLen = table[1];
-    var codeSize = this.codeSize;
-    var codeBuf = this.codeBuf;
-    var bytes = this.bytes;
-    var bytesPos = this.bytesPos;
-
-    while (codeSize < maxLen) {
-      var b;
-      if (typeof (b = bytes[bytesPos++]) == 'undefined')
-        error('Bad encoding in flate stream');
-      codeBuf |= (b << codeSize);
-      codeSize += 8;
-    }
-    var code = codes[codeBuf & ((1 << maxLen) - 1)];
-    var codeLen = code >> 16;
-    var codeVal = code & 0xffff;
-    if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
-      error('Bad encoding in flate stream');
-    this.codeBuf = (codeBuf >> codeLen);
-    this.codeSize = (codeSize - codeLen);
-    this.bytesPos = bytesPos;
-    return codeVal;
-  };
-
-  FlateStream.prototype.generateHuffmanTable =
-    function flateStreamGenerateHuffmanTable(lengths) {
-    var n = lengths.length;
-
-    // find max code length
-    var maxLen = 0;
-    for (var i = 0; i < n; ++i) {
-      if (lengths[i] > maxLen)
-        maxLen = lengths[i];
-    }
-
-    // build the table
-    var size = 1 << maxLen;
-    var codes = new Uint32Array(size);
-    for (var len = 1, code = 0, skip = 2;
-         len <= maxLen;
-         ++len, code <<= 1, skip <<= 1) {
-      for (var val = 0; val < n; ++val) {
-        if (lengths[val] == len) {
-          // bit-reverse the code
-          var code2 = 0;
-          var t = code;
-          for (var i = 0; i < len; ++i) {
-            code2 = (code2 << 1) | (t & 1);
-            t >>= 1;
-          }
-
-          // fill the table entries
-          for (var i = code2; i < size; i += skip)
-            codes[i] = (len << 16) | val;
-
-          ++code;
-        }
-      }
-    }
-
-    return [codes, maxLen];
-  };
-
-  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
-    // read block header
-    var hdr = this.getBits(3);
-    if (hdr & 1)
-      this.eof = true;
-    hdr >>= 1;
-
-    if (hdr == 0) { // uncompressed block
-      var bytes = this.bytes;
-      var bytesPos = this.bytesPos;
-      var b;
-
-      if (typeof (b = bytes[bytesPos++]) == 'undefined')
-        error('Bad block header in flate stream');
-      var blockLen = b;
-      if (typeof (b = bytes[bytesPos++]) == 'undefined')
-        error('Bad block header in flate stream');
-      blockLen |= (b << 8);
-      if (typeof (b = bytes[bytesPos++]) == 'undefined')
-        error('Bad block header in flate stream');
-      var check = b;
-      if (typeof (b = bytes[bytesPos++]) == 'undefined')
-        error('Bad block header in flate stream');
-      check |= (b << 8);
-      if (check != (~blockLen & 0xffff))
-        error('Bad uncompressed block length in flate stream');
-
-      this.codeBuf = 0;
-      this.codeSize = 0;
-
-      var bufferLength = this.bufferLength;
-      var buffer = this.ensureBuffer(bufferLength + blockLen);
-      var end = bufferLength + blockLen;
-      this.bufferLength = end;
-      for (var n = bufferLength; n < end; ++n) {
-        if (typeof (b = bytes[bytesPos++]) == 'undefined') {
-          this.eof = true;
-          break;
-        }
-        buffer[n] = b;
-      }
-      this.bytesPos = bytesPos;
-      return;
-    }
-
-    var litCodeTable;
-    var distCodeTable;
-    if (hdr == 1) { // compressed block, fixed codes
-      litCodeTable = fixedLitCodeTab;
-      distCodeTable = fixedDistCodeTab;
-    } else if (hdr == 2) { // compressed block, dynamic codes
-      var numLitCodes = this.getBits(5) + 257;
-      var numDistCodes = this.getBits(5) + 1;
-      var numCodeLenCodes = this.getBits(4) + 4;
-
-      // build the code lengths code table
-      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
-
-      for (var i = 0; i < numCodeLenCodes; ++i)
-        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
-      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
-
-      // build the literal and distance code tables
-      var len = 0;
-      var i = 0;
-      var codes = numLitCodes + numDistCodes;
-      var codeLengths = new Uint8Array(codes);
-      while (i < codes) {
-        var code = this.getCode(codeLenCodeTab);
-        if (code == 16) {
-          var bitsLength = 2, bitsOffset = 3, what = len;
-        } else if (code == 17) {
-          var bitsLength = 3, bitsOffset = 3, what = (len = 0);
-        } else if (code == 18) {
-          var bitsLength = 7, bitsOffset = 11, what = (len = 0);
-        } else {
-          codeLengths[i++] = len = code;
-          continue;
-        }
-
-        var repeatLength = this.getBits(bitsLength) + bitsOffset;
-        while (repeatLength-- > 0)
-          codeLengths[i++] = what;
-      }
-
-      litCodeTable =
-        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
-      distCodeTable =
-        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
-    } else {
-      error('Unknown block type in flate stream');
-    }
-
-    var buffer = this.buffer;
-    var limit = buffer ? buffer.length : 0;
-    var pos = this.bufferLength;
-    while (true) {
-      var code1 = this.getCode(litCodeTable);
-      if (code1 < 256) {
-        if (pos + 1 >= limit) {
-          buffer = this.ensureBuffer(pos + 1);
-          limit = buffer.length;
-        }
-        buffer[pos++] = code1;
-        continue;
-      }
-      if (code1 == 256) {
-        this.bufferLength = pos;
-        return;
-      }
-      code1 -= 257;
-      code1 = lengthDecode[code1];
-      var code2 = code1 >> 16;
-      if (code2 > 0)
-        code2 = this.getBits(code2);
-      var len = (code1 & 0xffff) + code2;
-      code1 = this.getCode(distCodeTable);
-      code1 = distDecode[code1];
-      code2 = code1 >> 16;
-      if (code2 > 0)
-        code2 = this.getBits(code2);
-      var dist = (code1 & 0xffff) + code2;
-      if (pos + len >= limit) {
-        buffer = this.ensureBuffer(pos + len);
-        limit = buffer.length;
-      }
-      for (var k = 0; k < len; ++k, ++pos)
-        buffer[pos] = buffer[pos - dist];
-    }
-  };
-
-  return FlateStream;
-})();
-
-var PredictorStream = (function PredictorStreamClosure() {
-  function PredictorStream(stream, params) {
-    var predictor = this.predictor = params.get('Predictor') || 1;
-
-    if (predictor <= 1)
-      return stream; // no prediction
-    if (predictor !== 2 && (predictor < 10 || predictor > 15))
-      error('Unsupported predictor: ' + predictor);
-
-    if (predictor === 2)
-      this.readBlock = this.readBlockTiff;
-    else
-      this.readBlock = this.readBlockPng;
-
-    this.stream = stream;
-    this.dict = stream.dict;
-
-    var colors = this.colors = params.get('Colors') || 1;
-    var bits = this.bits = params.get('BitsPerComponent') || 8;
-    var columns = this.columns = params.get('Columns') || 1;
-
-    this.pixBytes = (colors * bits + 7) >> 3;
-    this.rowBytes = (columns * colors * bits + 7) >> 3;
-
-    DecodeStream.call(this);
-    return this;
-  }
-
-  PredictorStream.prototype = Object.create(DecodeStream.prototype);
-
-  PredictorStream.prototype.readBlockTiff =
-    function predictorStreamReadBlockTiff() {
-    var rowBytes = this.rowBytes;
-
-    var bufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(bufferLength + rowBytes);
-
-    var bits = this.bits;
-    var colors = this.colors;
-
-    var rawBytes = this.stream.getBytes(rowBytes);
-
-    var inbuf = 0, outbuf = 0;
-    var inbits = 0, outbits = 0;
-    var pos = bufferLength;
-
-    if (bits === 1) {
-      for (var i = 0; i < rowBytes; ++i) {
-        var c = rawBytes[i];
-        inbuf = (inbuf << 8) | c;
-        // bitwise addition is exclusive or
-        // first shift inbuf and then add
-        buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
-        // truncate inbuf (assumes colors < 16)
-        inbuf &= 0xFFFF;
-      }
-    } else if (bits === 8) {
-      for (var i = 0; i < colors; ++i)
-        buffer[pos++] = rawBytes[i];
-      for (; i < rowBytes; ++i) {
-        buffer[pos] = buffer[pos - colors] + rawBytes[i];
-        pos++;
-      }
-    } else {
-      var compArray = new Uint8Array(colors + 1);
-      var bitMask = (1 << bits) - 1;
-      var j = 0, k = bufferLength;
-      var columns = this.columns;
-      for (var i = 0; i < columns; ++i) {
-        for (var kk = 0; kk < colors; ++kk) {
-          if (inbits < bits) {
-            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
-            inbits += 8;
-          }
-          compArray[kk] = (compArray[kk] +
-                           (inbuf >> (inbits - bits))) & bitMask;
-          inbits -= bits;
-          outbuf = (outbuf << bits) | compArray[kk];
-          outbits += bits;
-          if (outbits >= 8) {
-            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
-            outbits -= 8;
-          }
-        }
-      }
-      if (outbits > 0) {
-        buffer[k++] = (outbuf << (8 - outbits)) +
-        (inbuf & ((1 << (8 - outbits)) - 1));
-      }
-    }
-    this.bufferLength += rowBytes;
-  };
-
-  PredictorStream.prototype.readBlockPng =
-    function predictorStreamReadBlockPng() {
-
-    var rowBytes = this.rowBytes;
-    var pixBytes = this.pixBytes;
-
-    var predictor = this.stream.getByte();
-    var rawBytes = this.stream.getBytes(rowBytes);
-
-    var bufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(bufferLength + rowBytes);
-
-    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
-    if (prevRow.length == 0)
-      prevRow = new Uint8Array(rowBytes);
-
-    var j = bufferLength;
-    switch (predictor) {
-      case 0:
-        for (var i = 0; i < rowBytes; ++i)
-          buffer[j++] = rawBytes[i];
-        break;
-      case 1:
-        for (var i = 0; i < pixBytes; ++i)
-          buffer[j++] = rawBytes[i];
-        for (; i < rowBytes; ++i) {
-          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
-          j++;
-        }
-        break;
-      case 2:
-        for (var i = 0; i < rowBytes; ++i)
-          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
-        break;
-      case 3:
-        for (var i = 0; i < pixBytes; ++i)
-          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
-        for (; i < rowBytes; ++i) {
-          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
-                           rawBytes[i]) & 0xFF;
-          j++;
-        }
-        break;
-      case 4:
-        // we need to save the up left pixels values. the simplest way
-        // is to create a new buffer
-        for (var i = 0; i < pixBytes; ++i) {
-          var up = prevRow[i];
-          var c = rawBytes[i];
-          buffer[j++] = up + c;
-        }
-        for (; i < rowBytes; ++i) {
-          var up = prevRow[i];
-          var upLeft = prevRow[i - pixBytes];
-          var left = buffer[j - pixBytes];
-          var p = left + up - upLeft;
-
-          var pa = p - left;
-          if (pa < 0)
-            pa = -pa;
-          var pb = p - up;
-          if (pb < 0)
-            pb = -pb;
-          var pc = p - upLeft;
-          if (pc < 0)
-            pc = -pc;
-
-          var c = rawBytes[i];
-          if (pa <= pb && pa <= pc)
-            buffer[j++] = left + c;
-          else if (pb <= pc)
-            buffer[j++] = up + c;
-          else
-            buffer[j++] = upLeft + c;
-        }
-        break;
-      default:
-        error('Unsupported predictor: ' + predictor);
-    }
-    this.bufferLength += rowBytes;
-  };
-
-  return PredictorStream;
-})();
-
-/**
- * Depending on the type of JPEG a JpegStream is handled in different ways. For
- * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
- * data is stored and then loaded by the browser.  For unsupported JPEG's we use
- * a library to decode these images and the stream behaves like all the other
- * DecodeStreams.
- */
-var JpegStream = (function JpegStreamClosure() {
-  function isAdobeImage(bytes) {
-    var maxBytesScanned = Math.max(bytes.length - 16, 1024);
-    // Looking for APP14, 'Adobe'
-    for (var i = 0; i < maxBytesScanned; ++i) {
-      if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
-          bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
-          bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
-          bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
-          bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
-          return true;
-      // scanning until frame tag
-      if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
-        break;
-    }
-    return false;
-  }
-
-  function fixAdobeImage(bytes) {
-    // Inserting 'EMBED' marker after JPEG signature
-    var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
-                                      0x44, 0]);
-    var newBytes = new Uint8Array(bytes.length + embedMarker.length);
-    newBytes.set(bytes, embedMarker.length);
-    // copy JPEG header
-    newBytes[0] = bytes[0];
-    newBytes[1] = bytes[1];
-    newBytes.set(embedMarker, 2);
-    return newBytes;
-  }
-
-  function JpegStream(bytes, dict, xref) {
-    // TODO: per poppler, some images may have 'junk' before that
-    // need to be removed
-    this.dict = dict;
-
-    this.isAdobeImage = false;
-    this.colorTransform = dict.get('ColorTransform') || -1;
-
-    if (isAdobeImage(bytes)) {
-      this.isAdobeImage = true;
-      bytes = fixAdobeImage(bytes);
-    }
-
-    this.bytes = bytes;
-
-    DecodeStream.call(this);
-  }
-
-  JpegStream.prototype = Object.create(DecodeStream.prototype);
-
-  JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
-    if (this.bufferLength)
-      return;
-    try {
-      var jpegImage = new JpegImage();
-      if (this.colorTransform != -1)
-        jpegImage.colorTransform = this.colorTransform;
-      jpegImage.parse(this.bytes);
-      var width = jpegImage.width;
-      var height = jpegImage.height;
-      var data = jpegImage.getData(width, height);
-      this.buffer = data;
-      this.bufferLength = data.length;
-    } catch (e) {
-      error('JPEG error: ' + e);
-    }
-  };
-  JpegStream.prototype.getIR = function JpegStream_getIR() {
-    return bytesToString(this.bytes);
-  };
-  JpegStream.prototype.getChar = function JpegStream_getChar() {
-    error('internal error: getChar is not valid on JpegStream');
-  };
-  /**
-   * Checks if the image can be decoded and displayed by the browser without any
-   * further processing such as color space conversions.
-   */
-  JpegStream.prototype.isNativelySupported =
-    function JpegStream_isNativelySupported(xref, res) {
-    var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
-    // when bug 674619 lands, let's check if browser can do
-    // normal cmyk and then we won't need to decode in JS
-    if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB')
-      return true;
-    if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
-        this.colorTransform < 1)
-      return true;
-    return false;
-  };
-  /**
-   * Checks if the image can be decoded by the browser.
-   */
-  JpegStream.prototype.isNativelyDecodable =
-    function JpegStream_isNativelyDecodable(xref, res) {
-    var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
-    var numComps = cs.numComps;
-    if (numComps == 1 || numComps == 3)
-      return true;
-
-    return false;
-  };
-
-  return JpegStream;
-})();
-
-/**
- * For JPEG 2000's we use a library to decode these images and
- * the stream behaves like all the other DecodeStreams.
- */
-var JpxStream = (function JpxStreamClosure() {
-  function JpxStream(bytes, dict) {
-    this.dict = dict;
-    this.bytes = bytes;
-
-    DecodeStream.call(this);
-  }
-
-  JpxStream.prototype = Object.create(DecodeStream.prototype);
-
-  JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
-    if (this.bufferLength)
-      return;
-
-    var jpxImage = new JpxImage();
-    jpxImage.parse(this.bytes);
-
-    var width = jpxImage.width;
-    var height = jpxImage.height;
-    var componentsCount = jpxImage.componentsCount;
-    if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4)
-      error('JPX with ' + componentsCount + ' components is not supported');
-
-    var data = new Uint8Array(width * height * componentsCount);
-
-    for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) {
-      var tileCompoments = jpxImage.tiles[k];
-      var tileWidth = tileCompoments[0].width;
-      var tileHeight = tileCompoments[0].height;
-      var tileLeft = tileCompoments[0].left;
-      var tileTop = tileCompoments[0].top;
-
-      var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed;
-      switch (componentsCount) {
-        case 1:
-          data0 = tileCompoments[0].items;
-
-          dataPosition = width * tileTop + tileLeft;
-          rowFeed = width - tileWidth;
-          sourcePosition = 0;
-          for (var j = 0; j < tileHeight; j++) {
-            for (var i = 0; i < tileWidth; i++)
-              data[dataPosition++] = data0[sourcePosition++];
-            dataPosition += rowFeed;
-          }
-          break;
-        case 3:
-          data0 = tileCompoments[0].items;
-          data1 = tileCompoments[1].items;
-          data2 = tileCompoments[2].items;
-
-          dataPosition = (width * tileTop + tileLeft) * 3;
-          rowFeed = (width - tileWidth) * 3;
-          sourcePosition = 0;
-          for (var j = 0; j < tileHeight; j++) {
-            for (var i = 0; i < tileWidth; i++) {
-              data[dataPosition++] = data0[sourcePosition];
-              data[dataPosition++] = data1[sourcePosition];
-              data[dataPosition++] = data2[sourcePosition];
-              sourcePosition++;
-            }
-            dataPosition += rowFeed;
-          }
-          break;
-        case 4:
-          data0 = tileCompoments[0].items;
-          data1 = tileCompoments[1].items;
-          data2 = tileCompoments[2].items;
-          data3 = tileCompoments[3].items;
-
-          dataPosition = (width * tileTop + tileLeft) * 4;
-          rowFeed = (width - tileWidth) * 4;
-          sourcePosition = 0;
-          for (var j = 0; j < tileHeight; j++) {
-            for (var i = 0; i < tileWidth; i++) {
-              data[dataPosition++] = data0[sourcePosition];
-              data[dataPosition++] = data1[sourcePosition];
-              data[dataPosition++] = data2[sourcePosition];
-              data[dataPosition++] = data3[sourcePosition];
-              sourcePosition++;
-            }
-            dataPosition += rowFeed;
-          }
-          break;
-      }
-    }
-
-    this.buffer = data;
-    this.bufferLength = data.length;
-  };
-  JpxStream.prototype.getChar = function JpxStream_getChar() {
-    error('internal error: getChar is not valid on JpxStream');
-  };
-
-  return JpxStream;
-})();
-
-var DecryptStream = (function DecryptStreamClosure() {
-  function DecryptStream(str, decrypt) {
-    this.str = str;
-    this.dict = str.dict;
-    this.decrypt = decrypt;
-
-    DecodeStream.call(this);
-  }
-
-  var chunkSize = 512;
-
-  DecryptStream.prototype = Object.create(DecodeStream.prototype);
-
-  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
-    var chunk = this.str.getBytes(chunkSize);
-    if (!chunk || chunk.length == 0) {
-      this.eof = true;
-      return;
-    }
-    var decrypt = this.decrypt;
-    chunk = decrypt(chunk);
-
-    var bufferLength = this.bufferLength;
-    var i, n = chunk.length;
-    var buffer = this.ensureBuffer(bufferLength + n);
-    for (i = 0; i < n; i++)
-      buffer[bufferLength++] = chunk[i];
-    this.bufferLength = bufferLength;
-  };
-
-  return DecryptStream;
-})();
-
-var Ascii85Stream = (function Ascii85StreamClosure() {
-  function Ascii85Stream(str) {
-    this.str = str;
-    this.dict = str.dict;
-    this.input = new Uint8Array(5);
-
-    DecodeStream.call(this);
-  }
-
-  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
-
-  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
-    var tildaCode = '~'.charCodeAt(0);
-    var zCode = 'z'.charCodeAt(0);
-    var str = this.str;
-
-    var c = str.getByte();
-    while (Lexer.isSpace(String.fromCharCode(c)))
-      c = str.getByte();
-
-    if (!c || c === tildaCode) {
-      this.eof = true;
-      return;
-    }
-
-    var bufferLength = this.bufferLength, buffer;
-
-    // special code for z
-    if (c == zCode) {
-      buffer = this.ensureBuffer(bufferLength + 4);
-      for (var i = 0; i < 4; ++i)
-        buffer[bufferLength + i] = 0;
-      this.bufferLength += 4;
-    } else {
-      var input = this.input;
-      input[0] = c;
-      for (var i = 1; i < 5; ++i) {
-        c = str.getByte();
-        while (Lexer.isSpace(String.fromCharCode(c)))
-          c = str.getByte();
-
-        input[i] = c;
-
-        if (!c || c == tildaCode)
-          break;
-      }
-      buffer = this.ensureBuffer(bufferLength + i - 1);
-      this.bufferLength += i - 1;
-
-      // partial ending;
-      if (i < 5) {
-        for (; i < 5; ++i)
-          input[i] = 0x21 + 84;
-        this.eof = true;
-      }
-      var t = 0;
-      for (var i = 0; i < 5; ++i)
-        t = t * 85 + (input[i] - 0x21);
-
-      for (var i = 3; i >= 0; --i) {
-        buffer[bufferLength + i] = t & 0xFF;
-        t >>= 8;
-      }
-    }
-  };
-
-  return Ascii85Stream;
-})();
-
-var AsciiHexStream = (function AsciiHexStreamClosure() {
-  function AsciiHexStream(str) {
-    this.str = str;
-    this.dict = str.dict;
-
-    DecodeStream.call(this);
-  }
-
-  var hexvalueMap = {
-      9: -1, // \t
-      32: -1, // space
-      48: 0,
-      49: 1,
-      50: 2,
-      51: 3,
-      52: 4,
-      53: 5,
-      54: 6,
-      55: 7,
-      56: 8,
-      57: 9,
-      65: 10,
-      66: 11,
-      67: 12,
-      68: 13,
-      69: 14,
-      70: 15,
-      97: 10,
-      98: 11,
-      99: 12,
-      100: 13,
-      101: 14,
-      102: 15
-  };
-
-  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
-
-  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
-    var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
-        decodeLength, buffer, bufferLength, i, length;
-
-    decodeLength = (bytes.length + 1) >> 1;
-    buffer = this.ensureBuffer(this.bufferLength + decodeLength);
-    bufferLength = this.bufferLength;
-
-    for (i = 0, length = bytes.length; i < length; i++) {
-      c = hexvalueMap[bytes[i]];
-      while (c == -1 && (i + 1) < length) {
-        c = hexvalueMap[bytes[++i]];
-      }
-
-      if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
-        n = hexvalueMap[bytes[++i]];
-        buffer[bufferLength++] = c * 16 + n;
-      } else {
-        // EOD marker at an odd number, behave as if a 0 followed the last
-        // digit.
-        if (bytes[i] !== gtCode) {
-          buffer[bufferLength++] = c * 16;
-        }
-      }
-    }
-
-    this.bufferLength = bufferLength;
-    this.eof = true;
-  };
-
-  return AsciiHexStream;
-})();
-
-var RunLengthStream = (function RunLengthStreamClosure() {
-  function RunLengthStream(str) {
-    this.str = str;
-    this.dict = str.dict;
-
-    DecodeStream.call(this);
-  }
-
-  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
-
-  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
-    // The repeatHeader has following format. The first byte defines type of run
-    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
-    // (in addition to the second byte from the header), n = 129 through 255 -
-    // duplicate the second byte from the header (257 - n) times, n = 128 - end.
-    var repeatHeader = this.str.getBytes(2);
-    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
-      this.eof = true;
-      return;
-    }
-
-    var bufferLength = this.bufferLength;
-    var n = repeatHeader[0];
-    if (n < 128) {
-      // copy n bytes
-      var buffer = this.ensureBuffer(bufferLength + n + 1);
-      buffer[bufferLength++] = repeatHeader[1];
-      if (n > 0) {
-        var source = this.str.getBytes(n);
-        buffer.set(source, bufferLength);
-        bufferLength += n;
-      }
-    } else {
-      n = 257 - n;
-      var b = repeatHeader[1];
-      var buffer = this.ensureBuffer(bufferLength + n + 1);
-      for (var i = 0; i < n; i++)
-        buffer[bufferLength++] = b;
-    }
-    this.bufferLength = bufferLength;
-  };
-
-  return RunLengthStream;
-})();
-
-var CCITTFaxStream = (function CCITTFaxStreamClosure() {
-
-  var ccittEOL = -2;
-  var twoDimPass = 0;
-  var twoDimHoriz = 1;
-  var twoDimVert0 = 2;
-  var twoDimVertR1 = 3;
-  var twoDimVertL1 = 4;
-  var twoDimVertR2 = 5;
-  var twoDimVertL2 = 6;
-  var twoDimVertR3 = 7;
-  var twoDimVertL3 = 8;
-
-  var twoDimTable = [
-    [-1, -1], [-1, -1],                   // 000000x
-    [7, twoDimVertL3],                    // 0000010
-    [7, twoDimVertR3],                    // 0000011
-    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
-    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
-    [4, twoDimPass], [4, twoDimPass],     // 0001xxx
-    [4, twoDimPass], [4, twoDimPass],
-    [4, twoDimPass], [4, twoDimPass],
-    [4, twoDimPass], [4, twoDimPass],
-    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimHoriz], [3, twoDimHoriz],
-    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertL1], [3, twoDimVertL1],
-    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [3, twoDimVertR1], [3, twoDimVertR1],
-    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0],
-    [1, twoDimVert0], [1, twoDimVert0]
-  ];
-
-  var whiteTable1 = [
-    [-1, -1],                               // 00000
-    [12, ccittEOL],                         // 00001
-    [-1, -1], [-1, -1],                     // 0001x
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
-    [11, 1792], [11, 1792],                 // 1000x
-    [12, 1984],                             // 10010
-    [12, 2048],                             // 10011
-    [12, 2112],                             // 10100
-    [12, 2176],                             // 10101
-    [12, 2240],                             // 10110
-    [12, 2304],                             // 10111
-    [11, 1856], [11, 1856],                 // 1100x
-    [11, 1920], [11, 1920],                 // 1101x
-    [12, 2368],                             // 11100
-    [12, 2432],                             // 11101
-    [12, 2496],                             // 11110
-    [12, 2560]                              // 11111
-  ];
-
-  var whiteTable2 = [
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx
-    [8, 29], [8, 29],                           // 00000010x
-    [8, 30], [8, 30],                           // 00000011x
-    [8, 45], [8, 45],                           // 00000100x
-    [8, 46], [8, 46],                           // 00000101x
-    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx
-    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx
-    [8, 47], [8, 47],                           // 00001010x
-    [8, 48], [8, 48],                           // 00001011x
-    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx
-    [6, 13], [6, 13], [6, 13], [6, 13],
-    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx
-    [8, 33], [8, 33],                           // 00010010x
-    [8, 34], [8, 34],                           // 00010011x
-    [8, 35], [8, 35],                           // 00010100x
-    [8, 36], [8, 36],                           // 00010101x
-    [8, 37], [8, 37],                           // 00010110x
-    [8, 38], [8, 38],                           // 00010111x
-    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx
-    [8, 31], [8, 31],                           // 00011010x
-    [8, 32], [8, 32],                           // 00011011x
-    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx
-    [6, 1], [6, 1], [6, 1], [6, 1],
-    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx
-    [6, 12], [6, 12], [6, 12], [6, 12],
-    [8, 53], [8, 53],                           // 00100100x
-    [8, 54], [8, 54],                           // 00100101x
-    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx
-    [8, 39], [8, 39],                           // 00101000x
-    [8, 40], [8, 40],                           // 00101001x
-    [8, 41], [8, 41],                           // 00101010x
-    [8, 42], [8, 42],                           // 00101011x
-    [8, 43], [8, 43],                           // 00101100x
-    [8, 44], [8, 44],                           // 00101101x
-    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx
-    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx
-    [8, 61], [8, 61],                           // 00110010x
-    [8, 62], [8, 62],                           // 00110011x
-    [8, 63], [8, 63],                           // 00110100x
-    [8, 0], [8, 0],                             // 00110101x
-    [8, 320], [8, 320],                         // 00110110x
-    [8, 384], [8, 384],                         // 00110111x
-    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx
-    [5, 10], [5, 10], [5, 10], [5, 10],
-    [5, 10], [5, 10], [5, 10], [5, 10],
-    [5, 10], [5, 10], [5, 10], [5, 10],
-    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx
-    [5, 11], [5, 11], [5, 11], [5, 11],
-    [5, 11], [5, 11], [5, 11], [5, 11],
-    [5, 11], [5, 11], [5, 11], [5, 11],
-    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx
-    [8, 59], [8, 59],                           // 01001010x
-    [8, 60], [8, 60],                           // 01001011x
-    [9, 1472],                                  // 010011000
-    [9, 1536],                                  // 010011001
-    [9, 1600],                                  // 010011010
-    [9, 1728],                                  // 010011011
-    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx
-    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx
-    [8, 49], [8, 49],                           // 01010010x
-    [8, 50], [8, 50],                           // 01010011x
-    [8, 51], [8, 51],                           // 01010100x
-    [8, 52], [8, 52],                           // 01010101x
-    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx
-    [8, 55], [8, 55],                           // 01011000x
-    [8, 56], [8, 56],                           // 01011001x
-    [8, 57], [8, 57],                           // 01011010x
-    [8, 58], [8, 58],                           // 01011011x
-    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx
-    [6, 192], [6, 192], [6, 192], [6, 192],
-    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
-    [6, 1664], [6, 1664], [6, 1664], [6, 1664],
-    [8, 448], [8, 448],                         // 01100100x
-    [8, 512], [8, 512],                         // 01100101x
-    [9, 704],                                   // 011001100
-    [9, 768],                                   // 011001101
-    [8, 640], [8, 640],                         // 01100111x
-    [8, 576], [8, 576],                         // 01101000x
-    [9, 832],                                   // 011010010
-    [9, 896],                                   // 011010011
-    [9, 960],                                   // 011010100
-    [9, 1024],                                  // 011010101
-    [9, 1088],                                  // 011010110
-    [9, 1152],                                  // 011010111
-    [9, 1216],                                  // 011011000
-    [9, 1280],                                  // 011011001
-    [9, 1344],                                  // 011011010
-    [9, 1408],                                  // 011011011
-    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx
-    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 2], [4, 2], [4, 2], [4, 2],
-    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [4, 3], [4, 3], [4, 3], [4, 3],
-    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx
-    [5, 128], [5, 128], [5, 128], [5, 128],
-    [5, 128], [5, 128], [5, 128], [5, 128],
-    [5, 128], [5, 128], [5, 128], [5, 128],
-    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx
-    [5, 8], [5, 8], [5, 8], [5, 8],
-    [5, 8], [5, 8], [5, 8], [5, 8],
-    [5, 8], [5, 8], [5, 8], [5, 8],
-    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx
-    [5, 9], [5, 9], [5, 9], [5, 9],
-    [5, 9], [5, 9], [5, 9], [5, 9],
-    [5, 9], [5, 9], [5, 9], [5, 9],
-    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx
-    [6, 16], [6, 16], [6, 16], [6, 16],
-    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx
-    [6, 17], [6, 17], [6, 17], [6, 17],
-    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 4], [4, 4], [4, 4], [4, 4],
-    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [4, 5], [4, 5], [4, 5], [4, 5],
-    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx
-    [6, 14], [6, 14], [6, 14], [6, 14],
-    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx
-    [6, 15], [6, 15], [6, 15], [6, 15],
-    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx
-    [5, 64], [5, 64], [5, 64], [5, 64],
-    [5, 64], [5, 64], [5, 64], [5, 64],
-    [5, 64], [5, 64], [5, 64], [5, 64],
-    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 6], [4, 6], [4, 6], [4, 6],
-    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7],
-    [4, 7], [4, 7], [4, 7], [4, 7]
-  ];
-
-  var blackTable1 = [
-    [-1, -1], [-1, -1],                             // 000000000000x
-    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx
-    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
-    [12, 1984], [12, 1984],                         // 000000010010x
-    [12, 2048], [12, 2048],                         // 000000010011x
-    [12, 2112], [12, 2112],                         // 000000010100x
-    [12, 2176], [12, 2176],                         // 000000010101x
-    [12, 2240], [12, 2240],                         // 000000010110x
-    [12, 2304], [12, 2304],                         // 000000010111x
-    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
-    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
-    [12, 2368], [12, 2368],                         // 000000011100x
-    [12, 2432], [12, 2432],                         // 000000011101x
-    [12, 2496], [12, 2496],                         // 000000011110x
-    [12, 2560], [12, 2560],                         // 000000011111x
-    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx
-    [10, 18], [10, 18], [10, 18], [10, 18],
-    [12, 52], [12, 52],                             // 000000100100x
-    [13, 640],                                      // 0000001001010
-    [13, 704],                                      // 0000001001011
-    [13, 768],                                      // 0000001001100
-    [13, 832],                                      // 0000001001101
-    [12, 55], [12, 55],                             // 000000100111x
-    [12, 56], [12, 56],                             // 000000101000x
-    [13, 1280],                                     // 0000001010010
-    [13, 1344],                                     // 0000001010011
-    [13, 1408],                                     // 0000001010100
-    [13, 1472],                                     // 0000001010101
-    [12, 59], [12, 59],                             // 000000101011x
-    [12, 60], [12, 60],                             // 000000101100x
-    [13, 1536],                                     // 0000001011010
-    [13, 1600],                                     // 0000001011011
-    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx
-    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx
-    [13, 1664],                                     // 0000001100100
-    [13, 1728],                                     // 0000001100101
-    [12, 320], [12, 320],                           // 000000110011x
-    [12, 384], [12, 384],                           // 000000110100x
-    [12, 448], [12, 448],                           // 000000110101x
-    [13, 512],                                      // 0000001101100
-    [13, 576],                                      // 0000001101101
-    [12, 53], [12, 53],                             // 000000110111x
-    [12, 54], [12, 54],                             // 000000111000x
-    [13, 896],                                      // 0000001110010
-    [13, 960],                                      // 0000001110011
-    [13, 1024],                                     // 0000001110100
-    [13, 1088],                                     // 0000001110101
-    [13, 1152],                                     // 0000001110110
-    [13, 1216],                                     // 0000001110111
-    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx
-    [10, 64], [10, 64], [10, 64], [10, 64]
-  ];
-
-  var blackTable2 = [
-    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx
-    [8, 13], [8, 13], [8, 13], [8, 13],
-    [8, 13], [8, 13], [8, 13], [8, 13],
-    [8, 13], [8, 13], [8, 13], [8, 13],
-    [11, 23], [11, 23],                     // 00000101000x
-    [12, 50],                               // 000001010010
-    [12, 51],                               // 000001010011
-    [12, 44],                               // 000001010100
-    [12, 45],                               // 000001010101
-    [12, 46],                               // 000001010110
-    [12, 47],                               // 000001010111
-    [12, 57],                               // 000001011000
-    [12, 58],                               // 000001011001
-    [12, 61],                               // 000001011010
-    [12, 256],                              // 000001011011
-    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
-    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
-    [12, 48],                               // 000001100100
-    [12, 49],                               // 000001100101
-    [12, 62],                               // 000001100110
-    [12, 63],                               // 000001100111
-    [12, 30],                               // 000001101000
-    [12, 31],                               // 000001101001
-    [12, 32],                               // 000001101010
-    [12, 33],                               // 000001101011
-    [12, 40],                               // 000001101100
-    [12, 41],                               // 000001101101
-    [11, 22], [11, 22],                     // 00000110111x
-    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx
-    [8, 14], [8, 14], [8, 14], [8, 14],
-    [8, 14], [8, 14], [8, 14], [8, 14],
-    [8, 14], [8, 14], [8, 14], [8, 14],
-    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 10], [7, 10], [7, 10], [7, 10],
-    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [7, 11], [7, 11], [7, 11], [7, 11],
-    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx
-    [9, 15], [9, 15], [9, 15], [9, 15],
-    [12, 128],                              // 000011001000
-    [12, 192],                              // 000011001001
-    [12, 26],                               // 000011001010
-    [12, 27],                               // 000011001011
-    [12, 28],                               // 000011001100
-    [12, 29],                               // 000011001101
-    [11, 19], [11, 19],                     // 00001100111x
-    [11, 20], [11, 20],                     // 00001101000x
-    [12, 34],                               // 000011010010
-    [12, 35],                               // 000011010011
-    [12, 36],                               // 000011010100
-    [12, 37],                               // 000011010101
-    [12, 38],                               // 000011010110
-    [12, 39],                               // 000011010111
-    [11, 21], [11, 21],                     // 00001101100x
-    [12, 42],                               // 000011011010
-    [12, 43],                               // 000011011011
-    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx
-    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12],
-    [7, 12], [7, 12], [7, 12], [7, 12]
-  ];
-
-  var blackTable3 = [
-    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
-    [6, 9],                                 // 000100
-    [6, 8],                                 // 000101
-    [5, 7], [5, 7],                         // 00011x
-    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx
-    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx
-    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx
-    [3, 1], [3, 1], [3, 1], [3, 1],
-    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx
-    [3, 4], [3, 4], [3, 4], [3, 4],
-    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx
-    [2, 3], [2, 3], [2, 3], [2, 3],
-    [2, 3], [2, 3], [2, 3], [2, 3],
-    [2, 3], [2, 3], [2, 3], [2, 3],
-    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx
-    [2, 2], [2, 2], [2, 2], [2, 2],
-    [2, 2], [2, 2], [2, 2], [2, 2],
-    [2, 2], [2, 2], [2, 2], [2, 2]
-  ];
-
-  function CCITTFaxStream(str, params) {
-    this.str = str;
-    this.dict = str.dict;
-
-    params = params || new Dict();
-
-    this.encoding = params.get('K') || 0;
-    this.eoline = params.get('EndOfLine') || false;
-    this.byteAlign = params.get('EncodedByteAlign') || false;
-    this.columns = params.get('Columns') || 1728;
-    this.rows = params.get('Rows') || 0;
-    var eoblock = params.get('EndOfBlock');
-    if (eoblock == null)
-      eoblock = true;
-    this.eoblock = eoblock;
-    this.black = params.get('BlackIs1') || false;
-
-    this.codingLine = new Uint32Array(this.columns + 1);
-    this.refLine = new Uint32Array(this.columns + 2);
-
-    this.codingLine[0] = this.columns;
-    this.codingPos = 0;
-
-    this.row = 0;
-    this.nextLine2D = this.encoding < 0;
-    this.inputBits = 0;
-    this.inputBuf = 0;
-    this.outputBits = 0;
-    this.buf = EOF;
-
-    var code1;
-    while ((code1 = this.lookBits(12)) == 0) {
-      this.eatBits(1);
-    }
-    if (code1 == 1) {
-      this.eatBits(12);
-    }
-    if (this.encoding > 0) {
-      this.nextLine2D = !this.lookBits(1);
-      this.eatBits(1);
-    }
-
-    DecodeStream.call(this);
-  }
-
-  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
-
-  CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
-    while (!this.eof) {
-      var c = this.lookChar();
-      this.buf = EOF;
-      this.ensureBuffer(this.bufferLength + 1);
-      this.buffer[this.bufferLength++] = c;
-    }
-  };
-
-  CCITTFaxStream.prototype.addPixels =
-    function ccittFaxStreamAddPixels(a1, blackPixels) {
-    var codingLine = this.codingLine;
-    var codingPos = this.codingPos;
-
-    if (a1 > codingLine[codingPos]) {
-      if (a1 > this.columns) {
-        warn('row is wrong length');
-        this.err = true;
-        a1 = this.columns;
-      }
-      if ((codingPos & 1) ^ blackPixels) {
-        ++codingPos;
-      }
-
-      codingLine[codingPos] = a1;
-    }
-    this.codingPos = codingPos;
-  };
-
-  CCITTFaxStream.prototype.addPixelsNeg =
-    function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
-    var codingLine = this.codingLine;
-    var codingPos = this.codingPos;
-
-    if (a1 > codingLine[codingPos]) {
-      if (a1 > this.columns) {
-        warn('row is wrong length');
-        this.err = true;
-        a1 = this.columns;
-      }
-      if ((codingPos & 1) ^ blackPixels)
-        ++codingPos;
-
-      codingLine[codingPos] = a1;
-    } else if (a1 < codingLine[codingPos]) {
-      if (a1 < 0) {
-        warn('invalid code');
-        this.err = true;
-        a1 = 0;
-      }
-      while (codingPos > 0 && a1 < codingLine[codingPos - 1])
-        --codingPos;
-      codingLine[codingPos] = a1;
-    }
-
-    this.codingPos = codingPos;
-  };
-
-  CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
-    if (this.buf != EOF)
-      return this.buf;
-
-    var refLine = this.refLine;
-    var codingLine = this.codingLine;
-    var columns = this.columns;
-
-    var refPos, blackPixels, bits;
-
-    if (this.outputBits == 0) {
-      if (this.eof)
-        return null;
-
-      this.err = false;
-
-      var code1, code2, code3;
-      if (this.nextLine2D) {
-        for (var i = 0; codingLine[i] < columns; ++i)
-          refLine[i] = codingLine[i];
-
-        refLine[i++] = columns;
-        refLine[i] = columns;
-        codingLine[0] = 0;
-        this.codingPos = 0;
-        refPos = 0;
-        blackPixels = 0;
-
-        while (codingLine[this.codingPos] < columns) {
-          code1 = this.getTwoDimCode();
-          switch (code1) {
-            case twoDimPass:
-              this.addPixels(refLine[refPos + 1], blackPixels);
-              if (refLine[refPos + 1] < columns)
-                refPos += 2;
-              break;
-            case twoDimHoriz:
-              code1 = code2 = 0;
-              if (blackPixels) {
-                do {
-                  code1 += (code3 = this.getBlackCode());
-                } while (code3 >= 64);
-                do {
-                  code2 += (code3 = this.getWhiteCode());
-                } while (code3 >= 64);
-              } else {
-                do {
-                  code1 += (code3 = this.getWhiteCode());
-                } while (code3 >= 64);
-                do {
-                  code2 += (code3 = this.getBlackCode());
-                } while (code3 >= 64);
-              }
-              this.addPixels(codingLine[this.codingPos] +
-                             code1, blackPixels);
-              if (codingLine[this.codingPos] < columns) {
-                this.addPixels(codingLine[this.codingPos] + code2,
-                               blackPixels ^ 1);
-              }
-              while (refLine[refPos] <= codingLine[this.codingPos] &&
-                     refLine[refPos] < columns) {
-                refPos += 2;
-              }
-              break;
-            case twoDimVertR3:
-              this.addPixels(refLine[refPos] + 3, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns)
-                  refPos += 2;
-              }
-              break;
-            case twoDimVertR2:
-              this.addPixels(refLine[refPos] + 2, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns) {
-                  refPos += 2;
-                }
-              }
-              break;
-            case twoDimVertR1:
-              this.addPixels(refLine[refPos] + 1, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns)
-                  refPos += 2;
-              }
-              break;
-            case twoDimVert0:
-              this.addPixels(refLine[refPos], blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns)
-                  refPos += 2;
-              }
-              break;
-            case twoDimVertL3:
-              this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                if (refPos > 0)
-                  --refPos;
-                else
-                  ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns)
-                  refPos += 2;
-              }
-              break;
-            case twoDimVertL2:
-              this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                if (refPos > 0)
-                  --refPos;
-                else
-                  ++refPos;
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns)
-                  refPos += 2;
-              }
-              break;
-            case twoDimVertL1:
-              this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
-              blackPixels ^= 1;
-              if (codingLine[this.codingPos] < columns) {
-                if (refPos > 0)
-                  --refPos;
-                else
-                  ++refPos;
-
-                while (refLine[refPos] <= codingLine[this.codingPos] &&
-                       refLine[refPos] < columns)
-                  refPos += 2;
-              }
-              break;
-            case EOF:
-              this.addPixels(columns, 0);
-              this.eof = true;
-              break;
-            default:
-              warn('bad 2d code');
-              this.addPixels(columns, 0);
-              this.err = true;
-          }
-        }
-      } else {
-        codingLine[0] = 0;
-        this.codingPos = 0;
-        blackPixels = 0;
-        while (codingLine[this.codingPos] < columns) {
-          code1 = 0;
-          if (blackPixels) {
-            do {
-              code1 += (code3 = this.getBlackCode());
-            } while (code3 >= 64);
-          } else {
-            do {
-              code1 += (code3 = this.getWhiteCode());
-            } while (code3 >= 64);
-          }
-          this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
-          blackPixels ^= 1;
-        }
-      }
-
-      if (this.byteAlign)
-        this.inputBits &= ~7;
-
-      var gotEOL = false;
-
-      if (!this.eoblock && this.row == this.rows - 1) {
-        this.eof = true;
-      } else {
-        code1 = this.lookBits(12);
-        while (code1 == 0) {
-          this.eatBits(1);
-          code1 = this.lookBits(12);
-        }
-        if (code1 == 1) {
-          this.eatBits(12);
-          gotEOL = true;
-        } else if (code1 == EOF) {
-          this.eof = true;
-        }
-      }
-
-      if (!this.eof && this.encoding > 0) {
-        this.nextLine2D = !this.lookBits(1);
-        this.eatBits(1);
-      }
-
-      if (this.eoblock && gotEOL) {
-        code1 = this.lookBits(12);
-        if (code1 == 1) {
-          this.eatBits(12);
-          if (this.encoding > 0) {
-            this.lookBits(1);
-            this.eatBits(1);
-          }
-          if (this.encoding >= 0) {
-            for (var i = 0; i < 4; ++i) {
-              code1 = this.lookBits(12);
-              if (code1 != 1)
-                warn('bad rtc code: ' + code1);
-              this.eatBits(12);
-              if (this.encoding > 0) {
-                this.lookBits(1);
-                this.eatBits(1);
-              }
-            }
-          }
-          this.eof = true;
-        }
-      } else if (this.err && this.eoline) {
-        while (true) {
-          code1 = this.lookBits(13);
-          if (code1 == EOF) {
-            this.eof = true;
-            return null;
-          }
-          if ((code1 >> 1) == 1) {
-            break;
-          }
-          this.eatBits(1);
-        }
-        this.eatBits(12);
-        if (this.encoding > 0) {
-          this.eatBits(1);
-          this.nextLine2D = !(code1 & 1);
-        }
-      }
-
-      if (codingLine[0] > 0)
-        this.outputBits = codingLine[this.codingPos = 0];
-      else
-        this.outputBits = codingLine[this.codingPos = 1];
-      this.row++;
-    }
-
-    if (this.outputBits >= 8) {
-      this.buf = (this.codingPos & 1) ? 0 : 0xFF;
-      this.outputBits -= 8;
-      if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
-        this.codingPos++;
-        this.outputBits = (codingLine[this.codingPos] -
-                           codingLine[this.codingPos - 1]);
-      }
-    } else {
-      var bits = 8;
-      this.buf = 0;
-      do {
-        if (this.outputBits > bits) {
-          this.buf <<= bits;
-          if (!(this.codingPos & 1)) {
-            this.buf |= 0xFF >> (8 - bits);
-          }
-          this.outputBits -= bits;
-          bits = 0;
-        } else {
-          this.buf <<= this.outputBits;
-          if (!(this.codingPos & 1)) {
-            this.buf |= 0xFF >> (8 - this.outputBits);
-          }
-          bits -= this.outputBits;
-          this.outputBits = 0;
-          if (codingLine[this.codingPos] < columns) {
-            this.codingPos++;
-            this.outputBits = (codingLine[this.codingPos] -
-                               codingLine[this.codingPos - 1]);
-          } else if (bits > 0) {
-            this.buf <<= bits;
-            bits = 0;
-          }
-        }
-      } while (bits);
-    }
-    if (this.black) {
-      this.buf ^= 0xFF;
-    }
-    return this.buf;
-  };
-
-  // This functions returns the code found from the table.
-  // The start and end parameters set the boundaries for searching the table.
-  // The limit parameter is optional. Function returns an array with three
-  // values. The first array element indicates whether a valid code is being
-  // returned. The second array element is the actual code. The third array
-  // element indicates whether EOF was reached.
-  CCITTFaxStream.prototype.findTableCode =
-    function ccittFaxStreamFindTableCode(start, end, table, limit) {
-
-    var limitValue = limit || 0;
-    for (var i = start; i <= end; ++i) {
-      var code = this.lookBits(i);
-      if (code == EOF)
-        return [true, 1, false];
-      if (i < end)
-        code <<= end - i;
-      if (!limitValue || code >= limitValue) {
-        var p = table[code - limitValue];
-        if (p[0] == i) {
-          this.eatBits(i);
-          return [true, p[1], true];
-        }
-      }
-    }
-    return [false, 0, false];
-  };
-
-  CCITTFaxStream.prototype.getTwoDimCode =
-    function ccittFaxStreamGetTwoDimCode() {
-
-    var code = 0;
-    var p;
-    if (this.eoblock) {
-      code = this.lookBits(7);
-      p = twoDimTable[code];
-      if (p && p[0] > 0) {
-        this.eatBits(p[0]);
-        return p[1];
-      }
-    } else {
-      var result = this.findTableCode(1, 7, twoDimTable);
-      if (result[0] && result[2])
-        return result[1];
-    }
-    warn('Bad two dim code');
-    return EOF;
-  };
-
-  CCITTFaxStream.prototype.getWhiteCode =
-    function ccittFaxStreamGetWhiteCode() {
-
-    var code = 0;
-    var p;
-    var n;
-    if (this.eoblock) {
-      code = this.lookBits(12);
-      if (code == EOF)
-        return 1;
-
-      if ((code >> 5) == 0)
-        p = whiteTable1[code];
-      else
-        p = whiteTable2[code >> 3];
-
-      if (p[0] > 0) {
-        this.eatBits(p[0]);
-        return p[1];
-      }
-    } else {
-      var result = this.findTableCode(1, 9, whiteTable2);
-      if (result[0])
-        return result[1];
-
-      result = this.findTableCode(11, 12, whiteTable1);
-      if (result[0])
-        return result[1];
-    }
-    warn('bad white code');
-    this.eatBits(1);
-    return 1;
-  };
-
-  CCITTFaxStream.prototype.getBlackCode =
-    function ccittFaxStreamGetBlackCode() {
-
-    var code, p;
-    if (this.eoblock) {
-      code = this.lookBits(13);
-      if (code == EOF)
-        return 1;
-      if ((code >> 7) == 0)
-        p = blackTable1[code];
-      else if ((code >> 9) == 0 && (code >> 7) != 0)
-        p = blackTable2[(code >> 1) - 64];
-      else
-        p = blackTable3[code >> 7];
-
-      if (p[0] > 0) {
-        this.eatBits(p[0]);
-        return p[1];
-      }
-    } else {
-      var result = this.findTableCode(2, 6, blackTable3);
-      if (result[0])
-        return result[1];
-
-      result = this.findTableCode(7, 12, blackTable2, 64);
-      if (result[0])
-        return result[1];
-
-      result = this.findTableCode(10, 13, blackTable1);
-      if (result[0])
-        return result[1];
-    }
-    warn('bad black code');
-    this.eatBits(1);
-    return 1;
-  };
-
-  CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
-    var c;
-    while (this.inputBits < n) {
-      if ((c = this.str.getByte()) == null) {
-        if (this.inputBits == 0)
-          return EOF;
-        return ((this.inputBuf << (n - this.inputBits)) &
-                (0xFFFF >> (16 - n)));
-      }
-      this.inputBuf = (this.inputBuf << 8) + c;
-      this.inputBits += 8;
-    }
-    return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
-  };
-
-  CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
-    if ((this.inputBits -= n) < 0)
-      this.inputBits = 0;
-  };
-
-  return CCITTFaxStream;
-})();
-
-var LZWStream = (function LZWStreamClosure() {
-  function LZWStream(str, earlyChange) {
-    this.str = str;
-    this.dict = str.dict;
-    this.cachedData = 0;
-    this.bitsCached = 0;
-
-    var maxLzwDictionarySize = 4096;
-    var lzwState = {
-      earlyChange: earlyChange,
-      codeLength: 9,
-      nextCode: 258,
-      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
-      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
-      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
-      currentSequence: new Uint8Array(maxLzwDictionarySize),
-      currentSequenceLength: 0
-    };
-    for (var i = 0; i < 256; ++i) {
-      lzwState.dictionaryValues[i] = i;
-      lzwState.dictionaryLengths[i] = 1;
-    }
-    this.lzwState = lzwState;
-
-    DecodeStream.call(this);
-  }
-
-  LZWStream.prototype = Object.create(DecodeStream.prototype);
-
-  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
-    var bitsCached = this.bitsCached;
-    var cachedData = this.cachedData;
-    while (bitsCached < n) {
-      var c = this.str.getByte();
-      if (c == null) {
-        this.eof = true;
-        return null;
-      }
-      cachedData = (cachedData << 8) | c;
-      bitsCached += 8;
-    }
-    this.bitsCached = (bitsCached -= n);
-    this.cachedData = cachedData;
-    this.lastCode = null;
-    return (cachedData >>> bitsCached) & ((1 << n) - 1);
-  };
-
-  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
-    var blockSize = 512;
-    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
-    var i, j, q;
-
-    var lzwState = this.lzwState;
-    if (!lzwState)
-      return; // eof was found
-
-    var earlyChange = lzwState.earlyChange;
-    var nextCode = lzwState.nextCode;
-    var dictionaryValues = lzwState.dictionaryValues;
-    var dictionaryLengths = lzwState.dictionaryLengths;
-    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
-    var codeLength = lzwState.codeLength;
-    var prevCode = lzwState.prevCode;
-    var currentSequence = lzwState.currentSequence;
-    var currentSequenceLength = lzwState.currentSequenceLength;
-
-    var decodedLength = 0;
-    var currentBufferLength = this.bufferLength;
-    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
-
-    for (i = 0; i < blockSize; i++) {
-      var code = this.readBits(codeLength);
-      var hasPrev = currentSequenceLength > 0;
-      if (code < 256) {
-        currentSequence[0] = code;
-        currentSequenceLength = 1;
-      } else if (code >= 258) {
-        if (code < nextCode) {
-          currentSequenceLength = dictionaryLengths[code];
-          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
-            currentSequence[j] = dictionaryValues[q];
-            q = dictionaryPrevCodes[q];
-          }
-        } else {
-          currentSequence[currentSequenceLength++] = currentSequence[0];
-        }
-      } else if (code == 256) {
-        codeLength = 9;
-        nextCode = 258;
-        currentSequenceLength = 0;
-        continue;
-      } else {
-        this.eof = true;
-        delete this.lzwState;
-        break;
-      }
-
-      if (hasPrev) {
-        dictionaryPrevCodes[nextCode] = prevCode;
-        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
-        dictionaryValues[nextCode] = currentSequence[0];
-        nextCode++;
-        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
-          codeLength : Math.min(Math.log(nextCode + earlyChange) /
-          0.6931471805599453 + 1, 12) | 0;
-      }
-      prevCode = code;
-
-      decodedLength += currentSequenceLength;
-      if (estimatedDecodedSize < decodedLength) {
-        do {
-          estimatedDecodedSize += decodedSizeDelta;
-        } while (estimatedDecodedSize < decodedLength);
-        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
-      }
-      for (j = 0; j < currentSequenceLength; j++)
-        buffer[currentBufferLength++] = currentSequence[j];
-    }
-    lzwState.nextCode = nextCode;
-    lzwState.codeLength = codeLength;
-    lzwState.prevCode = prevCode;
-    lzwState.currentSequenceLength = currentSequenceLength;
-
-    this.bufferLength = currentBufferLength;
-  };
-
-  return LZWStream;
-})();
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/util.js b/apps/files_pdfviewer/js/pdfjs/src/util.js
deleted file mode 100644
index de7f3c1d548e31fc9fd8dc717d6a0e4176e38756..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/util.js
+++ /dev/null
@@ -1,470 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-function log(msg) {
-  if (console && console.log)
-    console.log(msg);
-  else if (print)
-    print(msg);
-}
-
-function warn(msg) {
-  if (verbosity >= WARNINGS)
-    log('Warning: ' + msg);
-}
-
-function backtrace() {
-  try {
-    throw new Error();
-  } catch (e) {
-    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
-  }
-}
-
-function error(msg) {
-  log('Error: ' + msg);
-  log(backtrace());
-  throw new Error(msg);
-}
-
-function TODO(what) {
-  if (verbosity >= TODOS)
-    log('TODO: ' + what);
-}
-
-function malformed(msg) {
-  error('Malformed PDF: ' + msg);
-}
-
-function assert(cond, msg) {
-  if (!cond)
-    error(msg);
-}
-
-// In a well-formed PDF, |cond| holds.  If it doesn't, subsequent
-// behavior is undefined.
-function assertWellFormed(cond, msg) {
-  if (!cond)
-    malformed(msg);
-}
-
-function shadow(obj, prop, value) {
-  Object.defineProperty(obj, prop, { value: value,
-                                     enumerable: true,
-                                     configurable: true,
-                                     writable: false });
-  return value;
-}
-
-function bytesToString(bytes) {
-  var str = '';
-  var length = bytes.length;
-  for (var n = 0; n < length; ++n)
-    str += String.fromCharCode(bytes[n]);
-  return str;
-}
-
-function stringToBytes(str) {
-  var length = str.length;
-  var bytes = new Uint8Array(length);
-  for (var n = 0; n < length; ++n)
-    bytes[n] = str.charCodeAt(n) & 0xFF;
-  return bytes;
-}
-
-var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
-
-var Util = (function UtilClosure() {
-  function Util() {}
-
-  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
-    var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
-    return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
-  };
-
-  Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) {
-    c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
-    var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
-    return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
-  };
-
-  // For 2d affine transforms
-  Util.applyTransform = function Util_applyTransform(p, m) {
-    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
-    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
-    return [xt, yt];
-  };
-
-  // Apply a generic 3d matrix M on a 3-vector v:
-  //   | a b c |   | X |
-  //   | d e f | x | Y |
-  //   | g h i |   | Z |
-  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
-  // with v as [X,Y,Z]
-  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
-    return [
-      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
-      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
-      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
-    ];
-  }
-
-  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
-  // For coordinate systems whose origin lies in the bottom-left, this
-  // means normalization to (BL,TR) ordering. For systems with origin in the
-  // top-left, this means (TL,BR) ordering.
-  Util.normalizeRect = function Util_normalizeRect(rect) {
-    var r = rect.slice(0); // clone rect
-    if (rect[0] > rect[2]) {
-      r[0] = rect[2];
-      r[2] = rect[0];
-    }
-    if (rect[1] > rect[3]) {
-      r[1] = rect[3];
-      r[3] = rect[1];
-    }
-    return r;
-  }
-
-  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
-  // intersection of rect1 and rect2. If no intersection, returns 'false'
-  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
-  Util.intersect = function Util_intersect(rect1, rect2) {
-    function compare(a, b) {
-      return a - b;
-    };
-
-    // Order points along the axes
-    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
-        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
-        result = [];
-
-    rect1 = Util.normalizeRect(rect1);
-    rect2 = Util.normalizeRect(rect2);
-
-    // X: first and second points belong to different rectangles?
-    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
-        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
-      // Intersection must be between second and third points
-      result[0] = orderedX[1];
-      result[2] = orderedX[2];
-    } else {
-      return false;
-    }
-
-    // Y: first and second points belong to different rectangles?
-    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
-        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
-      // Intersection must be between second and third points
-      result[1] = orderedY[1];
-      result[3] = orderedY[2];
-    } else {
-      return false;
-    }
-
-    return result;
-  }
-
-  Util.sign = function Util_sign(num) {
-    return num < 0 ? -1 : 1;
-  };
-
-  return Util;
-})();
-
-var PDFStringTranslateTable = [
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
-  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
-  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
-  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
-];
-
-function stringToPDFString(str) {
-  var i, n = str.length, str2 = '';
-  if (str[0] === '\xFE' && str[1] === '\xFF') {
-    // UTF16BE BOM
-    for (i = 2; i < n; i += 2)
-      str2 += String.fromCharCode(
-        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
-  } else {
-    for (i = 0; i < n; ++i) {
-      var code = PDFStringTranslateTable[str.charCodeAt(i)];
-      str2 += code ? String.fromCharCode(code) : str.charAt(i);
-    }
-  }
-  return str2;
-}
-
-function isBool(v) {
-  return typeof v == 'boolean';
-}
-
-function isInt(v) {
-  return typeof v == 'number' && ((v | 0) == v);
-}
-
-function isNum(v) {
-  return typeof v == 'number';
-}
-
-function isString(v) {
-  return typeof v == 'string';
-}
-
-function isNull(v) {
-  return v === null;
-}
-
-function isName(v) {
-  return v instanceof Name;
-}
-
-function isCmd(v, cmd) {
-  return v instanceof Cmd && (!cmd || v.cmd == cmd);
-}
-
-function isDict(v, type) {
-  return v instanceof Dict && (!type || v.get('Type').name == type);
-}
-
-function isArray(v) {
-  return v instanceof Array;
-}
-
-function isStream(v) {
-  return typeof v == 'object' && v != null && ('getChar' in v);
-}
-
-function isArrayBuffer(v) {
-  return typeof v == 'object' && v != null && ('byteLength' in v);
-}
-
-function isRef(v) {
-  return v instanceof Ref;
-}
-
-function isPDFFunction(v) {
-  var fnDict;
-  if (typeof v != 'object')
-    return false;
-  else if (isDict(v))
-    fnDict = v;
-  else if (isStream(v))
-    fnDict = v.dict;
-  else
-    return false;
-  return fnDict.has('FunctionType');
-}
-
-/**
- * 'Promise' object.
- * Each object that is stored in PDFObjects is based on a Promise object that
- * contains the status of the object and the data. There migth be situations,
- * where a function want to use the value of an object, but it isn't ready at
- * that time. To get a notification, once the object is ready to be used, s.o.
- * can add a callback using the `then` method on the promise that then calls
- * the callback once the object gets resolved.
- * A promise can get resolved only once and only once the data of the promise
- * can be set. If any of these happens twice or the data is required before
- * it was set, an exception is throw.
- */
-var Promise = (function PromiseClosure() {
-  var EMPTY_PROMISE = {};
-
-  /**
-   * If `data` is passed in this constructor, the promise is created resolved.
-   * If there isn't data, it isn't resolved at the beginning.
-   */
-  function Promise(name, data) {
-    this.name = name;
-    this.isRejected = false;
-    this.error = null;
-    // If you build a promise and pass in some data it's already resolved.
-    if (data != null) {
-      this.isResolved = true;
-      this._data = data;
-      this.hasData = true;
-    } else {
-      this.isResolved = false;
-      this._data = EMPTY_PROMISE;
-    }
-    this.callbacks = [];
-    this.errbacks = [];
-  };
-  /**
-   * Builds a promise that is resolved when all the passed in promises are
-   * resolved.
-   * @param {Promise[]} promises Array of promises to wait for.
-   * @return {Promise} New dependant promise.
-   */
-  Promise.all = function Promise_all(promises) {
-    var deferred = new Promise();
-    var unresolved = promises.length;
-    var results = [];
-    if (unresolved === 0) {
-      deferred.resolve(results);
-      return deferred;
-    }
-    for (var i = 0; i < unresolved; ++i) {
-      var promise = promises[i];
-      promise.then((function(i) {
-        return function(value) {
-          results[i] = value;
-          unresolved--;
-          if (unresolved === 0)
-            deferred.resolve(results);
-        };
-      })(i));
-    }
-    return deferred;
-  };
-  Promise.prototype = {
-    hasData: false,
-
-    set data(value) {
-      if (value === undefined) {
-        return;
-      }
-      if (this._data !== EMPTY_PROMISE) {
-        error('Promise ' + this.name +
-              ': Cannot set the data of a promise twice');
-      }
-      this._data = value;
-      this.hasData = true;
-
-      if (this.onDataCallback) {
-        this.onDataCallback(value);
-      }
-    },
-
-    get data() {
-      if (this._data === EMPTY_PROMISE) {
-        error('Promise ' + this.name + ': Cannot get data that isn\'t set');
-      }
-      return this._data;
-    },
-
-    onData: function Promise_onData(callback) {
-      if (this._data !== EMPTY_PROMISE) {
-        callback(this._data);
-      } else {
-        this.onDataCallback = callback;
-      }
-    },
-
-    resolve: function Promise_resolve(data) {
-      if (this.isResolved) {
-        error('A Promise can be resolved only once ' + this.name);
-      }
-      if (this.isRejected) {
-        error('The Promise was already rejected ' + this.name);
-      }
-
-      this.isResolved = true;
-      this.data = data || null;
-      var callbacks = this.callbacks;
-
-      for (var i = 0, ii = callbacks.length; i < ii; i++) {
-        callbacks[i].call(null, data);
-      }
-    },
-
-    reject: function Promise_reject(reason) {
-      if (this.isRejected) {
-        error('A Promise can be rejected only once ' + this.name);
-      }
-      if (this.isResolved) {
-        error('The Promise was already resolved ' + this.name);
-      }
-
-      this.isRejected = true;
-      this.error = reason || null;
-      var errbacks = this.errbacks;
-
-      for (var i = 0, ii = errbacks.length; i < ii; i++) {
-        errbacks[i].call(null, reason);
-      }
-    },
-
-    then: function Promise_then(callback, errback) {
-      if (!callback) {
-        error('Requiring callback' + this.name);
-      }
-
-      // If the promise is already resolved, call the callback directly.
-      if (this.isResolved) {
-        var data = this.data;
-        callback.call(null, data);
-      } else if (this.isRejected && errback) {
-        var error = this.error;
-        errback.call(null, error);
-      } else {
-        this.callbacks.push(callback);
-        if (errback)
-          this.errbacks.push(errback);
-      }
-    }
-  };
-
-  return Promise;
-})();
-
-var StatTimer = (function StatTimerClosure() {
-  function rpad(str, pad, length) {
-    while (str.length < length)
-      str += pad;
-    return str;
-  }
-  function StatTimer() {
-    this.started = {};
-    this.times = [];
-    this.enabled = true;
-  }
-  StatTimer.prototype = {
-    time: function StatTimer_time(name) {
-      if (!this.enabled)
-        return;
-      if (name in this.started)
-        throw 'Timer is already running for ' + name;
-      this.started[name] = Date.now();
-    },
-    timeEnd: function StatTimer_timeEnd(name) {
-      if (!this.enabled)
-        return;
-      if (!(name in this.started))
-        throw 'Timer has not been started for ' + name;
-      this.times.push({
-        'name': name,
-        'start': this.started[name],
-        'end': Date.now()
-      });
-      // Remove timer from started so it can be called again.
-      delete this.started[name];
-    },
-    toString: function StatTimer_toString() {
-      var times = this.times;
-      var out = '';
-      // Find the longest name for padding purposes.
-      var longest = 0;
-      for (var i = 0, ii = times.length; i < ii; ++i) {
-        var name = times[i]['name'];
-        if (name.length > longest)
-          longest = name.length;
-      }
-      for (var i = 0, ii = times.length; i < ii; ++i) {
-        var span = times[i];
-        var duration = span.end - span.start;
-        out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
-      }
-      return out;
-    }
-  };
-  return StatTimer;
-})();
diff --git a/apps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js b/apps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js
deleted file mode 100644
index 97d7e5a251f30640fb50ccd6df51cbd722e41075..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/utils/cffStandardStrings.js
+++ /dev/null
@@ -1,298 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-var CFFEncodingMap = {
-  '0': '-reserved-',
-  '1': 'hstem',
-  '2': '-reserved-',
-  '3': 'vstem',
-  '4': 'vmoveto',
-  '5': 'rlineto',
-  '6': 'hlineto',
-  '7': 'vlineto',
-  '8': 'rrcurveto',
-  '9': '-reserved-',
-  '10': 'callsubr',
-  '11': 'return',
-  '12': {
-    '3': 'and',
-    '4': 'or',
-    '5': 'not',
-    '9': 'abs',
-    '10': 'add',
-    '11': 'div',
-    '12': 'sub',
-    '14': 'neg',
-    '15': 'eq',
-    '18': 'drop',
-    '20': 'put',
-    '21': 'get',
-    '22': 'ifelse',
-    '23': 'random',
-    '24': 'mul',
-    '26': 'sqrt',
-    '27': 'dup',
-    '28': 'exch',
-    '29': 'index',
-    '30': 'roll',
-    '34': 'hflex',
-    '35': 'flex',
-    '36': 'hflex1',
-    '37': 'flex1'
-  },
-  '13': '-reserved-',
-  '14': 'endchar',
-  '15': '-reserved-',
-  '16': '-reserved-',
-  '17': '-reserved-',
-  '18': 'hstemhm',
-  '19': 'hintmask',
-  '20': 'cntrmask',
-  '21': 'rmoveto',
-  '22': 'hmoveto',
-  '23': 'vstemhm',
-  '24': 'rcurveline',
-  '25': 'rlivecurve',
-  '26': 'vvcurveto',
-  '27': 'hhcurveto',
-  '29': 'callgsubr',
-  '30': 'vhcurveto',
-  '31': 'hvcurveto'
-};
-
-var CFFDictDataMap = {
-  '0': {
-    name: 'version',
-    operand: 'SID'
-  },
-  '1': {
-    name: 'Notice',
-    operand: 'SID'
-  },
-  '2': {
-    name: 'FullName',
-    operand: 'SID'
-  },
-  '3': {
-    name: 'FamilyName',
-    operand: 'SID'
-  },
-  '4': {
-    name: 'Weight',
-    operand: 'SID'
-  },
-  '5': {
-    name: 'FontBBox',
-    operand: [0, 0, 0, 0]
-  },
-  '6': {
-    name: 'BlueValues'
-  },
-  '7': {
-    name: 'OtherBlues'
-  },
-  '8': {
-    name: 'FamilyBlues'
-  },
-  '9': {
-    name: 'FamilyOtherBlues'
-  },
-  '10': {
-    name: 'StdHW'
-  },
-  '11': {
-    name: 'StdVW'
-  },
-  '12': {
-    '0': {
-      name: 'Copyright',
-      operand: 'SID'
-    },
-    '1': {
-      name: 'IsFixedPitch',
-      operand: false
-    },
-    '2': {
-      name: 'ItalicAngle',
-      operand: 0
-    },
-    '3': {
-      name: 'UnderlinePosition',
-      operand: -100
-    },
-    '4': {
-      name: 'UnderlineThickness',
-      operand: 50
-    },
-    '5': {
-      name: 'PaintType',
-      operand: 0
-    },
-    '6': {
-      name: 'CharstringType',
-      operand: 2
-    },
-    '7': {
-      name: 'FontMatrix',
-      operand: [0.001, 0, 0, 0.001, 0 , 0]
-    },
-    '8': {
-      name: 'StrokeWidth',
-      operand: 0
-    },
-    '9': {
-      name: 'BlueScale'
-    },
-    '10': {
-      name: 'BlueShift'
-    },
-    '11': {
-      name: 'BlueFuzz'
-    },
-    '12': {
-      name: 'StemSnapH'
-    },
-    '13': {
-      name: 'StemSnapV'
-    },
-    '14': {
-      name: 'ForceBold'
-    },
-    '17': {
-      name: 'LanguageGroup'
-    },
-    '18': {
-      name: 'ExpansionFactor'
-    },
-    '19': {
-      name: 'initialRandomSeed'
-    },
-    '20': {
-      name: 'SyntheticBase',
-      operand: null
-    },
-    '21': {
-      name: 'PostScript',
-      operand: 'SID'
-    },
-    '22': {
-      name: 'BaseFontName',
-      operand: 'SID'
-    },
-    '23': {
-      name: 'BaseFontBlend',
-      operand: 'delta'
-    }
-  },
-  '13': {
-    name: 'UniqueID',
-    operand: null
-  },
-  '14': {
-    name: 'XUID',
-    operand: []
-  },
-  '15': {
-    name: 'charset',
-    operand: 0
-  },
-  '16': {
-    name: 'Encoding',
-    operand: 0
-  },
-  '17': {
-    name: 'CharStrings',
-    operand: null
-  },
-  '18': {
-    name: 'Private',
-    operand: 'number number'
-  },
-  '19': {
-    name: 'Subrs'
-  },
-  '20': {
-    name: 'defaultWidthX'
-  },
-  '21': {
-    name: 'nominalWidthX'
-  }
-};
-
-var CFFDictPrivateDataMap = {
-  '6': {
-    name: 'BluesValues',
-    operand: 'delta'
-  },
-  '7': {
-    name: 'OtherBlues',
-    operand: 'delta'
-  },
-  '8': {
-    name: 'FamilyBlues',
-    operand: 'delta'
-  },
-  '9': {
-    name: 'FamilyOtherBlues',
-    operand: 'delta'
-  },
-  '10': {
-    name: 'StdHW',
-    operand: null
-  },
-  '11': {
-    name: 'StdVW',
-    operand: null
-  },
-  '12': {
-    '9': {
-      name: 'BlueScale',
-      operand: 0.039625
-    },
-    '10': {
-      name: 'BlueShift',
-      operand: 7
-    },
-    '11': {
-      name: 'BlueFuzz',
-      operand: 1
-    },
-    '12': {
-      name: 'StemSnapH',
-      operand: 'delta'
-    },
-    '13': {
-      name: 'StemSnapV',
-      operand: 'delta'
-    },
-    '14': {
-      name: 'ForceBold',
-      operand: 'boolean'
-    },
-    '17': {
-      name: 'LanguageGroup',
-      operand: 0
-    },
-    '18': {
-      name: 'ExpansionFactor',
-      operand: 0.06
-    },
-    '19': {
-      name: 'initialRandomSeed',
-      operand: 0
-    }
-  },
-  '19': {
-    name: 'Subrs',
-    operand: null
-  },
-  '20': {
-    name: 'defaultWidthX',
-    operand: 0
-  },
-  '21': {
-    name: 'nominalWidthX',
-    operand: 0
-  }
-};
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js b/apps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js
deleted file mode 100644
index 65c02fce2772550181f630e0f9f94204136f28c7..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/utils/fonts_utils.js
+++ /dev/null
@@ -1,408 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-/*
- * The Type2 reader code below is only used for debugging purpose since Type2
- * is only a CharString format and is never used directly as a Font file.
- *
- * So the code here is useful for dumping the data content of a .cff file in
- * order to investigate the similarity between a Type1 CharString and a Type2
- * CharString or to understand the structure of the CFF format.
- */
-
-/*
- * Build a charset by assigning the glyph name and the human readable form
- * of the glyph data.
- */
-function readCharset(aStream, aCharstrings) {
-  var charset = {};
-
-  var format = aStream.getByte();
-  var count = aCharstrings.length - 1;
-  if (format == 0) {
-    charset['.notdef'] = readCharstringEncoding(aCharstrings[0]);
-
-    for (var i = 1; i < count + 1; i++) {
-      var sid = aStream.getByte() << 8 | aStream.getByte();
-      charset[CFFStrings[sid]] = readCharstringEncoding(aCharstrings[i]);
-      //log(CFFStrings[sid] + "::" + charset[CFFStrings[sid]]);
-    }
-  } else if (format == 1) {
-    for (var i = 1; i < count + 1; i++) {
-      var first = aStream.getByte();
-      first = (first << 8) | aStream.getByte();
-      var numLeft = aStream.getByte();
-      for (var j = 0; j <= numLeft; j++) {
-        var sid = first++;
-        if (CFFStrings[sid] == 'three')
-          log(aCharstrings[j]);
-        charset[CFFStrings[sid]] = readCharstringEncoding(aCharstrings[j]);
-      }
-    }
-  } else {
-    error('Invalid charset format');
-  }
-
-  return charset;
-}
-
-/*
- * Take a Type2 binary charstring as input and transform it to a human
- * readable representation as specified by the 'The Type 2 Charstring Format',
- * chapter 3.1.
- */
-function readCharstringEncoding(aString) {
-  if (!aString)
-    return '';
-
-  var charstringTokens = [];
-
-  var count = aString.length;
-  for (var i = 0; i < count; ) {
-    var value = aString[i++];
-    var token = null;
-
-    if (value < 0) {
-      continue;
-    } else if (value <= 11) {
-      token = CFFEncodingMap[value];
-    } else if (value == 12) {
-      token = CFFEncodingMap[value][aString[i++]];
-    } else if (value <= 18) {
-      token = CFFEncodingMap[value];
-    } else if (value <= 20) {
-      var mask = aString[i++];
-      token = CFFEncodingMap[value];
-    } else if (value <= 27) {
-      token = CFFEncodingMap[value];
-    } else if (value == 28) {
-      token = aString[i++] << 8 | aString[i++];
-    } else if (value <= 31) {
-      token = CFFEncodingMap[value];
-    } else if (value < 247) {
-      token = parseInt(value, 10) - 139;
-    } else if (value < 251) {
-      token = (value - 247) * 256 + aString[i++] + 108;
-    } else if (value < 255) {
-      token = -(value - 251) * 256 - aString[i++] - 108;
-    } else {// value == 255
-      token = aString[i++] << 24 | aString[i++] << 16 |
-              aString[i++] << 8 | aString[i];
-    }
-
-    charstringTokens.push(token);
-  }
-
-  return charstringTokens;
-}
-
-
-/*
- * Take a binary DICT Data as input and transform it into a human readable
- * form as specified by 'The Compact Font Format Specification', chapter 5.
- */
-function readFontDictData(aString, aMap) {
-  var fontDictDataTokens = [];
-
-  var count = aString.length;
-  for (var i = 0; i < count; i) {
-    var value = aString[i++];
-    var token = null;
-
-    if (value == 12) {
-      token = aMap[value][aString[i++]];
-    } else if (value == 28) {
-      token = aString[i++] << 8 | aString[i++];
-    } else if (value == 29) {
-      token = aString[i++] << 24 |
-              aString[i++] << 16 |
-              aString[i++] << 8 |
-              aString[i++];
-    } else if (value == 30) {
-      token = '';
-      var parsed = false;
-      while (!parsed) {
-        var octet = aString[i++];
-
-        var nibbles = [parseInt(octet / 16, 10), parseInt(octet % 16, 10)];
-        for (var j = 0; j < nibbles.length; j++) {
-          var nibble = nibbles[j];
-          switch (nibble) {
-            case 0xA:
-              token += '.';
-              break;
-            case 0xB:
-              token += 'E';
-              break;
-            case 0xC:
-              token += 'E-';
-              break;
-            case 0xD:
-              break;
-            case 0xE:
-              token += '-';
-              break;
-            case 0xF:
-              parsed = true;
-              break;
-            default:
-              token += nibble;
-              break;
-          }
-        }
-      }
-      token = parseFloat(token);
-    } else if (value <= 31) {
-      token = aMap[value];
-    } else if (value <= 246) {
-      token = parseInt(value, 10) - 139;
-    } else if (value <= 250) {
-      token = (value - 247) * 256 + aString[i++] + 108;
-    } else if (value <= 254) {
-      token = -(value - 251) * 256 - aString[i++] - 108;
-    } else if (value == 255) {
-      error('255 is not a valid DICT command');
-    }
-
-    fontDictDataTokens.push(token);
-  }
-
-  return fontDictDataTokens;
-}
-
-/*
- * Take a stream as input and return an array of objects.
- * In CFF an INDEX is a structure with the following format:
- *  {
- *    count: 2 bytes (Number of objects stored in INDEX),
- *    offsize: 1 byte (Offset array element size),
- *    offset: [count + 1] bytes (Offsets array),
- *    data: - (Objects data)
- *  }
- *
- *  More explanation are given in the 'CFF Font Format Specification',
- *  chapter 5.
- */
-function readFontIndexData(aStream, aIsByte) {
-  var count = aStream.getByte() << 8 | aStream.getByte();
-  var offsize = aStream.getByte();
-
-  function getNextOffset() {
-    switch (offsize) {
-      case 0:
-        return 0;
-      case 1:
-        return aStream.getByte();
-      case 2:
-        return aStream.getByte() << 8 | aStream.getByte();
-      case 3:
-        return aStream.getByte() << 16 | aStream.getByte() << 8 |
-               aStream.getByte();
-      case 4:
-      return aStream.getByte() << 24 | aStream.getByte() << 16 |
-             aStream.getByte() << 8 | aStream.getByte();
-    }
-    error(offsize + ' is not a valid offset size');
-    return null;
-  }
-
-  var offsets = [];
-  for (var i = 0; i < count + 1; i++)
-    offsets.push(getNextOffset());
-
-  dump('Found ' + count + ' objects at offsets :' +
-      offsets + ' (offsize: ' + offsize + ')');
-
-  // Now extract the objects
-  var relativeOffset = aStream.pos;
-  var objects = [];
-  for (var i = 0; i < count; i++) {
-    var offset = offsets[i];
-    aStream.pos = relativeOffset + offset - 1;
-
-    var data = [];
-    var length = offsets[i + 1] - 1;
-    for (var j = offset - 1; j < length; j++)
-      data.push(aIsByte ? aStream.getByte() : aStream.getChar());
-    objects.push(data);
-  }
-
-  return objects;
-}
-
-var Type2Parser = function type2Parser(aFilePath) {
-  var font = new Dict();
-
-  var xhr = new XMLHttpRequest();
-  xhr.open('GET', aFilePath, false);
-  xhr.mozResponseType = xhr.responseType = 'arraybuffer';
-  xhr.expected = (document.URL.indexOf('file:') == 0) ? 0 : 200;
-  xhr.send(null);
-  this.data = new Stream(xhr.mozResponseArrayBuffer || xhr.mozResponse ||
-                         xhr.responseArrayBuffer || xhr.response);
-
-  // Turn on this flag for additional debugging logs
-  var debug = false;
-
-  function dump(aStr) {
-    if (debug)
-      log(aStr);
-  }
-
-  function parseAsToken(aString, aMap) {
-    var decoded = readFontDictData(aString, aMap);
-
-    var stack = [];
-    var count = decoded.length;
-    for (var i = 0; i < count; i++) {
-      var token = decoded[i];
-      if (isNum(token)) {
-        stack.push(token);
-      } else {
-        switch (token.operand) {
-          case 'SID':
-            font.set(token.name, CFFStrings[stack.pop()]);
-            break;
-          case 'number number':
-            font.set(token.name, {
-              offset: stack.pop(),
-              size: stack.pop()
-            });
-            break;
-          case 'boolean':
-            font.set(token.name, stack.pop());
-            break;
-          case 'delta':
-            font.set(token.name, stack.pop());
-            break;
-          default:
-            if (token.operand && token.operand.length) {
-              var array = [];
-              for (var j = 0; j < token.operand.length; j++)
-                array.push(stack.pop());
-              font.set(token.name, array);
-            } else {
-              font.set(token.name, stack.pop());
-            }
-            break;
-        }
-      }
-    }
-  }
-
-  this.parse = function type2ParserParse(aStream) {
-    font.set('major', aStream.getByte());
-    font.set('minor', aStream.getByte());
-    font.set('hdrSize', aStream.getByte());
-    font.set('offsize', aStream.getByte());
-
-    // Read the NAME Index
-    dump('Reading Index: Names');
-    font.set('Names', readFontIndexData(aStream));
-    dump('Names: ' + font.get('Names'));
-
-    // Read the Top Dict Index
-    dump('Reading Index: TopDict');
-    var topDict = readFontIndexData(aStream, true);
-    dump('TopDict: ' + topDict);
-
-    // Read the String Index
-    dump('Reading Index: Strings');
-    var strings = readFontIndexData(aStream);
-    dump('strings: ' + strings);
-
-    // Fill up the Strings dictionary with the new unique strings
-    for (var i = 0; i < strings.length; i++)
-      CFFStrings.push(strings[i].join(''));
-
-    // Parse the TopDict operator
-    var objects = [];
-    var count = topDict.length;
-    for (var i = 0; i < count; i++)
-      parseAsToken(topDict[i], CFFDictDataMap);
-
-    // Read the Global Subr Index that comes just after the Strings Index
-    // (cf. "The Compact Font Format Specification" Chapter 16)
-    dump('Reading Global Subr Index');
-    var subrs = readFontIndexData(aStream, true);
-    dump(subrs);
-
-    // Reading Private Dict
-    var priv = font.get('Private');
-    dump('Reading Private Dict (offset: ' + priv.offset +
-        ' size: ' + priv.size + ')');
-    aStream.pos = priv.offset;
-
-    var privateDict = [];
-    for (var i = 0; i < priv.size; i++)
-      privateDict.push(aStream.getByte());
-    dump('privateData:' + privateDict);
-    parseAsToken(privateDict, CFFDictPrivateDataMap);
-
-    for (var p in font.map)
-      dump(p + '::' + font.get(p));
-
-    // Read CharStrings Index
-    var charStringsOffset = font.get('CharStrings');
-    dump('Read CharStrings Index (offset: ' + charStringsOffset + ')');
-    aStream.pos = charStringsOffset;
-    var charStrings = readFontIndexData(aStream, true);
-
-    // Read Charset
-    dump('Read Charset for ' + charStrings.length + ' glyphs');
-    var charsetEntry = font.get('charset');
-    if (charsetEntry == 0) {
-      error('Need to support CFFISOAdobeCharset');
-    } else if (charsetEntry == 1) {
-      error('Need to support CFFExpert');
-    } else if (charsetEntry == 2) {
-      error('Need to support CFFExpertSubsetCharset');
-    } else {
-      aStream.pos = charsetEntry;
-      var charset = readCharset(aStream, charStrings);
-    }
-  };
-};
-
-/*
- * To try the Type2 decoder on a local file in the current directory:
- *
- *  var cff = new Type2Parser("file.cff");
- *  cff.parse(this.data);
- *
- * To try the Type2 decoder on a custom built CFF array:
- *
- *  var file = new Uint8Array(cffFileArray, 0, cffFileSize);
- *  var parser = new Type2Parser();
- *  parser.parse(new Stream(file));
- *
- */
-
-/*
- * Write to a file to the disk (works only on Firefox in privilege mode)
- * but this is useful for dumping a font file to the disk and check with
- * fontforge or the ots program what's wrong with the file.
- *
- * writeToFile(fontData, "/tmp/pdf.js." + fontCount + ".cff");
- */
-function writeToFile(aBytes, aFilePath) {
-  if (!('netscape' in window))
-    return;
-
-  netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
-  var Cc = Components.classes,
-      Ci = Components.interfaces;
-  var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
-  file.initWithPath(aFilePath);
-
-  var stream = Cc['@mozilla.org/network/file-output-stream;1']
-                 .createInstance(Ci.nsIFileOutputStream);
-  stream.init(file, 0x04 | 0x08 | 0x20, 0x180, 0);
-
-  var bos = Cc['@mozilla.org/binaryoutputstream;1']
-              .createInstance(Ci.nsIBinaryOutputStream);
-  bos.setOutputStream(stream);
-  bos.writeByteArray(aBytes, aBytes.length);
-  stream.close();
-}
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/worker.js b/apps/files_pdfviewer/js/pdfjs/src/worker.js
deleted file mode 100644
index 42bd610503f7721a9becffabfc1c2dcc324d2ff3..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/worker.js
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-function MessageHandler(name, comObj) {
-  this.name = name;
-  this.comObj = comObj;
-  this.callbackIndex = 1;
-  var callbacks = this.callbacks = {};
-  var ah = this.actionHandler = {};
-
-  ah['console_log'] = [function ahConsoleLog(data) {
-      console.log.apply(console, data);
-  }];
-  ah['console_error'] = [function ahConsoleError(data) {
-      console.error.apply(console, data);
-  }];
-
-  comObj.onmessage = function messageHandlerComObjOnMessage(event) {
-    var data = event.data;
-    if (data.isReply) {
-      var callbackId = data.callbackId;
-      if (data.callbackId in callbacks) {
-        var callback = callbacks[callbackId];
-        delete callbacks[callbackId];
-        callback(data.data);
-      } else {
-        error('Cannot resolve callback ' + callbackId);
-      }
-    } else if (data.action in ah) {
-      var action = ah[data.action];
-      if (data.callbackId) {
-        var promise = new Promise();
-        promise.then(function(resolvedData) {
-          comObj.postMessage({
-            isReply: true,
-            callbackId: data.callbackId,
-            data: resolvedData
-          });
-        });
-        action[0].call(action[1], data.data, promise);
-      } else {
-        action[0].call(action[1], data.data);
-      }
-    } else {
-      error('Unkown action from worker: ' + data.action);
-    }
-  };
-}
-
-MessageHandler.prototype = {
-  on: function messageHandlerOn(actionName, handler, scope) {
-    var ah = this.actionHandler;
-    if (ah[actionName]) {
-      error('There is already an actionName called "' + actionName + '"');
-    }
-    ah[actionName] = [handler, scope];
-  },
-  /**
-   * Sends a message to the comObj to invoke the action with the supplied data.
-   * @param {String} actionName Action to call.
-   * @param {JSON} data JSON data to send.
-   * @param {function} [callback] Optional callback that will handle a reply.
-   */
-  send: function messageHandlerSend(actionName, data, callback) {
-    var message = {
-      action: actionName,
-      data: data
-    };
-    if (callback) {
-      var callbackId = this.callbackIndex++;
-      this.callbacks[callbackId] = callback;
-      message.callbackId = callbackId;
-    }
-    this.comObj.postMessage(message);
-  }
-};
-
-var WorkerMessageHandler = {
-  setup: function wphSetup(handler) {
-    var pdfModel = null;
-
-    handler.on('test', function wphSetupTest(data) {
-      handler.send('test', data instanceof Uint8Array);
-    });
-
-    handler.on('doc', function wphSetupDoc(data) {
-      // Create only the model of the PDFDoc, which is enough for
-      // processing the content of the pdf.
-      pdfModel = new PDFDocModel(new Stream(data));
-    });
-
-    handler.on('page_request', function wphSetupPageRequest(pageNum) {
-      pageNum = parseInt(pageNum);
-
-
-      // The following code does quite the same as
-      // Page.prototype.startRendering, but stops at one point and sends the
-      // result back to the main thread.
-      var gfx = new CanvasGraphics(null);
-
-      var start = Date.now();
-
-      var dependency = [];
-      var operatorList = null;
-      try {
-        var page = pdfModel.getPage(pageNum);
-        // Pre compile the pdf page and fetch the fonts/images.
-        operatorList = page.getOperatorList(handler, dependency);
-      } catch (e) {
-        var minimumStackMessage =
-            'worker.js: while trying to getPage() and getOperatorList()';
-
-        // Turn the error into an obj that can be serialized
-        if (typeof e === 'string') {
-          e = {
-            message: e,
-            stack: minimumStackMessage
-          };
-        } else if (typeof e === 'object') {
-          e = {
-            message: e.message || e.toString(),
-            stack: e.stack || minimumStackMessage
-          };
-        } else {
-          e = {
-            message: 'Unknown exception type: ' + (typeof e),
-            stack: minimumStackMessage
-          };
-        }
-
-        handler.send('page_error', {
-          pageNum: pageNum,
-          error: e
-        });
-        return;
-      }
-
-      console.log('page=%d - getOperatorList: time=%dms, len=%d', pageNum,
-                              Date.now() - start, operatorList.fnArray.length);
-
-      // Filter the dependecies for fonts.
-      var fonts = {};
-      for (var i = 0, ii = dependency.length; i < ii; i++) {
-        var dep = dependency[i];
-        if (dep.indexOf('font_') == 0) {
-          fonts[dep] = true;
-        }
-      }
-
-      handler.send('page', {
-        pageNum: pageNum,
-        operatorList: operatorList,
-        depFonts: Object.keys(fonts)
-      });
-    }, this);
-  }
-};
-
-var consoleTimer = {};
-
-var workerConsole = {
-  log: function log() {
-    var args = Array.prototype.slice.call(arguments);
-    postMessage({
-      action: 'console_log',
-      data: args
-    });
-  },
-
-  error: function error() {
-    var args = Array.prototype.slice.call(arguments);
-    postMessage({
-      action: 'console_error',
-      data: args
-    });
-    throw 'pdf.js execution error';
-  },
-
-  time: function time(name) {
-    consoleTimer[name] = Date.now();
-  },
-
-  timeEnd: function timeEnd(name) {
-    var time = consoleTimer[name];
-    if (time == null) {
-      error('Unkown timer name ' + name);
-    }
-    this.log('Timer:', name, Date.now() - time);
-  }
-};
-
-// Worker thread?
-if (typeof window === 'undefined') {
-  globalScope.console = workerConsole;
-
-  var handler = new MessageHandler('worker_processor', this);
-  WorkerMessageHandler.setup(handler);
-}
-
diff --git a/apps/files_pdfviewer/js/pdfjs/src/worker_loader.js b/apps/files_pdfviewer/js/pdfjs/src/worker_loader.js
deleted file mode 100644
index 69eb1414f0bd79d694885e4a33d44d7821bb833e..0000000000000000000000000000000000000000
--- a/apps/files_pdfviewer/js/pdfjs/src/worker_loader.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-
-'use strict';
-
-// List of files to include;
-var files = [
-  'core.js',
-  'util.js',
-  'canvas.js',
-  'obj.js',
-  'function.js',
-  'charsets.js',
-  'cidmaps.js',
-  'colorspace.js',
-  'crypto.js',
-  'evaluator.js',
-  'fonts.js',
-  'glyphlist.js',
-  'image.js',
-  'metrics.js',
-  'parser.js',
-  'pattern.js',
-  'stream.js',
-  'worker.js',
-  '../external/jpgjs/jpg.js',
-  'jpx.js',
-  'bidi.js'
-];
-
-// Load all the files.
-for (var i = 0; i < files.length; i++) {
-  importScripts(files[i]);
-}
diff --git a/apps/files_pdfviewer/js/pdfjs/update.sh b/apps/files_pdfviewer/js/pdfjs/update.sh
new file mode 100755
index 0000000000000000000000000000000000000000..599f6338602fe1bd34ef95f5151355d4a5885db9
--- /dev/null
+++ b/apps/files_pdfviewer/js/pdfjs/update.sh
@@ -0,0 +1,3 @@
+cd build
+rm pdf.js
+wget http://mozilla.github.com/pdf.js/build/pdf.js
diff --git a/apps/files_sharing/ajax/email.php b/apps/files_sharing/ajax/email.php
old mode 100755
new mode 100644
index 9eba203465e0f17b3e9f918c2d7a2d47bebd0ec9..163683cd0e3c3bc3624df039983d30dbaffa6659
--- a/apps/files_sharing/ajax/email.php
+++ b/apps/files_sharing/ajax/email.php
@@ -3,9 +3,10 @@ OCP\JSON::checkLoggedIn();
 OCP\JSON::checkAppEnabled('files_sharing');
 $user = OCP\USER::getUser();
 // TODO translations
-$subject = $user + ' ' + 'shared a file with you';
-$link = $_POST['link'] + '&f=' + $_POST['f'];
-$text = $user + ' ' + 'shared the file' + ' ' + $_POST['f'] + ' ' + 'with you.' + ' ' + 'It is available for download here:' + ' ' + $link;
+$type = (strpos($_POST['file'], '.') === false) ? 'folder' : 'file';
+$subject = $user.' shared a '.$type.' with you';
+$link = $_POST['link'];
+$text = $user.' shared the '.$type.' '.$_POST['file'].' with you. It is available for download here: '.$link;
 $fromaddress = OCP\Config::getUserValue($user, 'settings', 'email', 'sharing-noreply@'.$_SERVER['HTTP_HOST']);
 OC_Mail::send($_POST['toaddress'], $_POST['toaddress'], $subject, $text, $fromaddress, $user);
 
diff --git a/apps/files_sharing/ajax/getitem.php b/apps/files_sharing/ajax/getitem.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/ajax/setpermissions.php b/apps/files_sharing/ajax/setpermissions.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/ajax/share.php b/apps/files_sharing/ajax/share.php
old mode 100755
new mode 100644
index 4478144e92f3df9b1005302f5324a3a4c578823c..ec3c25998af903b41d88c11d481a1313cbf36235
--- a/apps/files_sharing/ajax/share.php
+++ b/apps/files_sharing/ajax/share.php
@@ -9,10 +9,11 @@ $sources = explode(';', $_POST['sources']);
 $uid_shared_with = $_POST['uid_shared_with'];
 $permissions = $_POST['permissions'];
 foreach ($sources as $source) {
+	$file = OC_FileCache::get($source);
 	$path = ltrim($source, '/'); 
 	$source = $userDirectory.$source;
 	// Check if the file exists or if the file is being reshared
-	if ($source && (OC_FILESYSTEM::file_exists($path) && OC_FILESYSTEM::is_readable($path) || OC_Share::getSource($source))) {
+	if ($source && $file['encrypted'] == false && (OC_FILESYSTEM::file_exists($path) && OC_FILESYSTEM::is_readable($path) || OC_Share::getSource($source))) {
 		try {
 			$shared = new OC_Share($source, $uid_shared_with, $permissions);
 			// If this is a private link, return the token
@@ -26,8 +27,12 @@ foreach ($sources as $source) {
 			OCP\JSON::error(array('data' => array('message' => $exception->getMessage())));
 		}
 	} else {
-		OCP\Util::writeLog('files_sharing', 'File does not exist or is not readable :'.$source, OCP\Util::ERROR);
-		OCP\JSON::error(array('data' => array('message' => 'File does not exist or is not readable')));
+		if ($file['encrypted'] == true) {
+			OCP\JSON::error(array('data' => array('message' => 'Encrypted files cannot be shared')));
+		} else {
+			OCP\Util::writeLog('files_sharing', 'File does not exist or is not readable :'.$source, OCP\Util::ERROR);
+			OCP\JSON::error(array('data' => array('message' => 'File does not exist or is not readable')));
+		}
 	}
 }
 
diff --git a/apps/files_sharing/ajax/toggleresharing.php b/apps/files_sharing/ajax/toggleresharing.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/ajax/unshare.php b/apps/files_sharing/ajax/unshare.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/ajax/userautocomplete.php b/apps/files_sharing/ajax/userautocomplete.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
old mode 100755
new mode 100644
index b3b9776d2970f34d1044742924c6c345d963cc49..ea3a9da6f7a9693b7595cb2a55eac81cba0c3f96
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -17,5 +17,3 @@ if ($dir != '/Shared' || OCP\Config::getAppValue('files_sharing', 'resharing', '
 OCP\Util::addscript("3rdparty", "chosen/chosen.jquery.min");
 OCP\Util::addStyle( 'files_sharing', 'sharing' );
 OCP\Util::addStyle("3rdparty", "chosen/chosen");
-OCP\CONFIG::setAppValue('core', 'public_files', '/apps/files_sharing/get.php');
-?>
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index 490ffaca890829334254cef4f9e6b0574c0dfbf8..58298a205fe046ab5549a532f11b799629e3b107 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -10,4 +10,8 @@
 	<types>
 		<filesystem/>
 	</types>
+	<public>
+		<files>get.php</files>
+		<webdav>get.php</webdav>
+	</public>
 </info>
diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version
index ceab6e11ece0bcec917c12e11d350946f085d549..7dff5b8921122a487162febe3c8e32effb7acb35 100644
--- a/apps/files_sharing/appinfo/version
+++ b/apps/files_sharing/appinfo/version
@@ -1 +1 @@
-0.1
\ No newline at end of file
+0.2.1
\ No newline at end of file
diff --git a/apps/files_sharing/get.php b/apps/files_sharing/get.php
old mode 100755
new mode 100644
index caf25d00cfdecfc1a3c7c6537f2b2412a9d24f68..e2fcb82750d80f5c662b26380a5da9790d388a8a
--- a/apps/files_sharing/get.php
+++ b/apps/files_sharing/get.php
@@ -1,6 +1,10 @@
 <?php
 $RUNTIME_NOSETUPFS=true; //don't setup the fs yet
 
+// only need authentication apps
+$RUNTIME_APPTYPES=array('authentication');
+OC_App::loadApps($RUNTIME_APPTYPES);
+
 OCP\JSON::checkAppEnabled('files_sharing');
 require_once 'lib_share.php';
 
@@ -50,11 +54,11 @@ if (isset($_GET['token']) && $source = OC_Share::getSource($_GET['token'])) {
 		OCP\Util::addStyle("files", "files");
 		$breadcrumbNav = new OCP\Template("files", "part.breadcrumb", "");
 		$breadcrumbNav->assign("breadcrumb", $breadcrumb);
-		$breadcrumbNav->assign("baseURL", OCP\Util::linkTo("files_sharing", "get.php")."?token=".$token."&path=");
+		$breadcrumbNav->assign("baseURL", OCP\Util::linkTo("", "public.php")."?service=files&token=".$token."&path=");
 		$list = new OCP\Template("files", "part.list", "");
 		$list->assign("files", $files);
-		$list->assign("baseURL", OCP\Util::linkTo("files_sharing", "get.php")."?token=".$token."&path=");
-		$list->assign("downloadURL", OCP\Util::linkTo("files_sharing", "get.php")."?token=".$token."&path=");
+		$list->assign("baseURL", OCP\Util::linkTo("", "public.php")."?service=files&token=".$token."&path=");
+		$list->assign("downloadURL", OCP\Util::linkTo("", "public.php")."?service=files&token=".$token."&path=");
 		$list->assign("readonly", true);
 		$tmpl = new OCP\Template("files", "index", "user");
 		$tmpl->assign("fileList", $list->fetchPage());
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 5b0c4ee8096a30f8e4227215f82249d51cbbdd5f..a1fa3bb4586ff457c6eacec09f5893e28799b7d8 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -181,7 +181,7 @@ OC.Share={
 		$('#privateLinkCheckbox').attr('checked', true);
 		var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&token='+token;
 		if (token.indexOf('&path=') == -1) {
-			link += '&file=' + encodeURIComponent(item).replace('%2F', '/');
+			link += '&file=' + encodeURIComponent(item).replace(/%2F/g, '/');
 		} else {
 			// Disable checkbox if inside a shared parent folder
 			$('#privateLinkCheckbox').attr('disabled', 'true');
@@ -200,11 +200,13 @@ OC.Share={
 		$('#emailButton').hide();
 	},
 	emailPrivateLink:function() {
+		var link = $('#privateLinkText').val();
+		var file = link.substr(link.lastIndexOf('/') + 1).replace(/%20/g, ' ');
+		$.post(OC.filePath('files_sharing', 'ajax', 'email.php'), { toaddress: $('#email').val(), link: link, file: file } );
 		$('#email').css('font-weight', 'bold');
 		$('#email').animate({ fontWeight: 'normal' }, 2000, function() {
 			$(this).val('');
 		}).val('Email sent');
-		$.post(OC.filePath('files_sharing', 'ajax', 'email.php'), 'toaddress='+$('#email').val()+'&link='+$('#link').val());
 	},
 	dirname:function(path) {
 		return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, '');
diff --git a/apps/files_sharing/lib_share.php b/apps/files_sharing/lib_share.php
old mode 100755
new mode 100644
index 02e4b6e4c26532a5e714cf6d49b84ed8af9c5ef9..83f9b6a7545b543c37519968c8b8be1ef2acef20
--- a/apps/files_sharing/lib_share.php
+++ b/apps/files_sharing/lib_share.php
@@ -41,6 +41,10 @@ class OC_Share {
 	public function __construct($source, $uid_shared_with, $permissions) {
 		$uid_owner = OCP\USER::getUser();
 		$query = OCP\DB::prepare("INSERT INTO *PREFIX*sharing VALUES(?,?,?,?,?)");
+		// Check if this is a reshare and use the original source
+		if ($result = OC_Share::getSource($source)) {
+			$source = $result;
+		}
 		if ($uid_shared_with == self::PUBLICLINK) {
 			$token = sha1("$uid_shared_with-$source");
 			$query->execute(array($uid_owner, self::PUBLICLINK, $source, $token, $permissions));
@@ -107,6 +111,11 @@ class OC_Share {
 				// Update mtime of shared folder to invoke a file cache rescan
 				$rootView=new OC_FilesystemView('/');
 				if (!$rootView->is_dir($sharedFolder)) {
+					if (!$rootView->is_dir('/'.$uid.'/files')) {
+						OC_Util::tearDownFS();
+						OC_Util::setupFS($uid);
+						OC_Util::tearDownFS();
+					}
 					$rootView->mkdir($sharedFolder);
 				}
 				$rootView->touch($sharedFolder);
@@ -468,12 +477,10 @@ class OC_Share {
 		$gid = '@'.$arguments['gid'];
 		$result = $query->execute(array($gid))->fetchAll();
 		if (count($result) > 0) {
-			$query = OCP\DB::prepare('INSERT INTO *PREFIX*sharing VALUES(?,?,?,?,?)');
-			$sharedFolder = '/'.$arguments['uid'].'/files/Shared/';
 			$lastSource = '';
 			for ($i = 0; $i < count($result) - 1; $i++) {
 				if ($result[$i]['source'] != $lastSource) {
-					$query->execute(array($result[$i]['uid_owner'], $arguments['uid'].'@'.$arguments['gid'], $result[$i]['source'], $sharedFolder.basename($result[$i]['source']), $result[$i]['permissions']));
+					new OC_Share($result[$i]['source'], $arguments['gid'], $result[$i]['permissions']);
 					$lastSource = $result[$i]['source'];
 				}
 			}
diff --git a/apps/files_sharing/list.php b/apps/files_sharing/list.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/settings.php b/apps/files_sharing/settings.php
old mode 100755
new mode 100644
diff --git a/apps/files_sharing/sharedstorage.php b/apps/files_sharing/sharedstorage.php
old mode 100755
new mode 100644
diff --git a/apps/files_texteditor/ajax/loadfile.php b/apps/files_texteditor/ajax/loadfile.php
old mode 100755
new mode 100644
diff --git a/apps/files_texteditor/ajax/mtime.php b/apps/files_texteditor/ajax/mtime.php
old mode 100755
new mode 100644
diff --git a/apps/files_texteditor/ajax/savefile.php b/apps/files_texteditor/ajax/savefile.php
old mode 100755
new mode 100644
diff --git a/apps/files_texteditor/appinfo/app.php b/apps/files_texteditor/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files_texteditor/js/aceeditor/ace.js b/apps/files_texteditor/js/aceeditor/ace.js
index 6043589ac1f2fa1a68df3383b708c38357ea6cfb..8661789c94a764c0bfda84b36207194e3f961f56 100644
--- a/apps/files_texteditor/js/aceeditor/ace.js
+++ b/apps/files_texteditor/js/aceeditor/ace.js
@@ -1,4 +1,4 @@
-(function(){function g(a){if(typeof requirejs!="undefined"){var e=b.define;b.define=function(a,b,c){return typeof c!="function"?e.apply(this,arguments):e(a,b,function(a,d,e){return b[2]=="module"&&(e.packaged=!0),c.apply(this,arguments)})},b.define.packaged=!0;return}var f=function(a,b){return d("",a,b)};f.packaged=!0;var g=b;a&&(b[a]||(b[a]={}),g=b[a]),g.define&&(c.original=g.define),g.define=c,g.require&&(d.original=g.require),g.require=f}var a="",b=function(){return this}(),c=function(a,b,d){if(typeof a!="string"){c.original?c.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(d=b),c.modules||(c.modules={}),c.modules[a]=d},d=function(a,b,c){if(Object.prototype.toString.call(b)==="[object Array]"){var e=[];for(var g=0,h=b.length;g<h;++g){var i=f(a,b[g]);if(!i&&d.original)return d.original.apply(window,arguments);e.push(i)}c&&c.apply(null,e)}else{if(typeof b=="string"){var j=f(a,b);return!j&&d.original?d.original.apply(window,arguments):(c&&c(),j)}if(d.original)return d.original.apply(window,arguments)}},e=function(a,b){if(b.indexOf("!")!==-1){var c=b.split("!");return e(a,c[0])+"!"+e(a,c[1])}if(b.charAt(0)=="."){var d=a.split("/").slice(0,-1).join("/");b=d+"/"+b;while(b.indexOf(".")!==-1&&f!=b){var f=b;b=b.replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return b},f=function(a,b){b=e(a,b);var f=c.modules[b];if(!f)return null;if(typeof f=="function"){var g={},h={id:b,uri:"",exports:g,packaged:!0},i=function(a,c){return d(b,a,c)},j=f(i,g,h);return g=j||h.exports,c.modules[b]=g,g}return f};g(a)})(),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/multi_select","ace/worker/worker_client","ace/keyboard/hash_handler","ace/keyboard/state_handler","ace/placeholder","ace/config","ace/theme/textmate"],function(a,b,c){"use strict",a("./lib/fixoldbrowsers");var d=a("./lib/dom"),e=a("./lib/event"),f=a("./editor").Editor,g=a("./edit_session").EditSession,h=a("./undomanager").UndoManager,i=a("./virtual_renderer").VirtualRenderer,j=a("./multi_select").MultiSelect;a("./worker/worker_client"),a("./keyboard/hash_handler"),a("./keyboard/state_handler"),a("./placeholder"),a("./config").init(),b.edit=function(b){typeof b=="string"&&(b=document.getElementById(b));var c=new g(d.getInnerText(b));c.setUndoManager(new h),b.innerHTML="";var k=new f(new i(b,a("./theme/textmate")));new j(k),k.setSession(c);var l={};return l.document=c,l.editor=k,k.resize(),e.addListener(window,"resize",function(){k.resize()}),b.env=l,k.env=l,k}}),define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(a,b,c){"use strict",a("./regexp"),a("./es5-shim")}),define("ace/lib/regexp",["require","exports","module"],function(a,b,c){function g(a){return(a.global?"g":"")+(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.extended?"x":"")+(a.sticky?"y":"")}function h(a,b,c){if(Array.prototype.indexOf)return a.indexOf(b,c);for(var d=c||0;d<a.length;d++)if(a[d]===b)return d;return-1}"use strict";var d={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},e=d.exec.call(/()??/,"")[1]===undefined,f=function(){var a=/^/g;return d.test.call(a,""),!a.lastIndex}();RegExp.prototype.exec=function(a){var b=d.exec.apply(this,arguments),c,i;if(typeof a=="string"&&b){!e&&b.length>1&&h(b,"")>-1&&(i=RegExp(this.source,d.replace.call(g(this),"g","")),d.replace.call(a.slice(b.index),i,function(){for(var a=1;a<arguments.length-2;a++)arguments[a]===undefined&&(b[a]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var j=1;j<b.length;j++)c=this._xregexp.captureNames[j-1],c&&(b[c]=b[j]);!f&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--}return b},f||(RegExp.prototype.test=function(a){var b=d.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b})}),define("ace/lib/es5-shim",["require","exports","module"],function(a,b,c){function p(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=g.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,h=c.apply(f,d.concat(g.call(arguments)));return h!==null&&Object(h)===h?h:f}return c.apply(b,d.concat(g.call(arguments)))};return e});var d=Function.prototype.call,e=Array.prototype,f=Object.prototype,g=e.slice,h=d.bind(f.toString),i=d.bind(f.hasOwnProperty),j,k,l,m,n;if(n=i(f,"__defineGetter__"))j=d.bind(f.__defineGetter__),k=d.bind(f.__defineSetter__),l=d.bind(f.__lookupGetter__),m=d.bind(f.__lookupSetter__);Array.isArray||(Array.isArray=function(b){return h(b)=="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(b){var c=G(this),d=arguments[1],e=0,f=c.length>>>0;if(h(b)!="[object Function]")throw new TypeError;while(e<f)e in c&&b.call(d,c[e],e,c),e++}),Array.prototype.map||(Array.prototype.map=function(b){var c=G(this),d=c.length>>>0,e=Array(d),f=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var g=0;g<d;g++)g in c&&(e[g]=b.call(f,c[g],g,c));return e}),Array.prototype.filter||(Array.prototype.filter=function(b){var c=G(this),d=c.length>>>0,e=[],f=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var g=0;g<d;g++)g in c&&b.call(f,c[g],g,c)&&e.push(c[g]);return e}),Array.prototype.every||(Array.prototype.every=function(b){var c=G(this),d=c.length>>>0,e=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var f=0;f<d;f++)if(f in c&&!b.call(e,c[f],f,c))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(b){var c=G(this),d=c.length>>>0,e=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var f=0;f<d;f++)if(f in c&&b.call(e,c[f],f,c))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(b){var c=G(this),d=c.length>>>0;if(h(b)!="[object Function]")throw new TypeError;if(!d&&arguments.length==1)throw new TypeError;var e=0,f;if(arguments.length>=2)f=arguments[1];else do{if(e in c){f=c[e++];break}if(++e>=d)throw new TypeError}while(!0);for(;e<d;e++)e in c&&(f=b.call(void 0,f,c[e],e,c));return f}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(b){var c=G(this),d=c.length>>>0;if(h(b)!="[object Function]")throw new TypeError;if(!d&&arguments.length==1)throw new TypeError;var e,f=d-1;if(arguments.length>=2)e=arguments[1];else do{if(f in c){e=c[f--];break}if(--f<0)throw new TypeError}while(!0);do f in this&&(e=b.call(void 0,e,c[f],f,c));while(f--);return e}),Array.prototype.indexOf||(Array.prototype.indexOf=function(b){var c=G(this),d=c.length>>>0;if(!d)return-1;var e=0;arguments.length>1&&(e=E(arguments[1])),e=e>=0?e:Math.max(0,d+e);for(;e<d;e++)if(e in c&&c[e]===b)return e;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(b){var c=G(this),d=c.length>>>0;if(!d)return-1;var e=d-1;arguments.length>1&&(e=Math.min(e,E(arguments[1]))),e=e>=0?e:d-Math.abs(e);for(;e>=0;e--)if(e in c&&b===c[e])return e;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(b){return b.__proto__||(b.constructor?b.constructor.prototype:f)});if(!Object.getOwnPropertyDescriptor){var o="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(b,c){if(typeof b!="object"&&typeof b!="function"||b===null)throw new TypeError(o+b);if(!i(b,c))return;var d,e,g;d={enumerable:!0,configurable:!0};if(n){var h=b.__proto__;b.__proto__=f;var e=l(b,c),g=m(b,c);b.__proto__=h;if(e||g)return e&&(d.get=e),g&&(d.set=g),d}return d.value=b[c],d}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(b){return Object.keys(b)}),Object.create||(Object.create=function(b,c){var d;if(b===null)d={__proto__:null};else{if(typeof b!="object")throw new TypeError("typeof prototype["+typeof b+"] != 'object'");var e=function(){};e.prototype=b,d=new e,d.__proto__=b}return c!==void 0&&Object.defineProperties(d,c),d});if(Object.defineProperty){var q=p({}),r=typeof document=="undefined"||p(document.createElement("div"));if(!q||!r)var s=Object.defineProperty}if(!Object.defineProperty||s){var t="Property description must be an object: ",u="Object.defineProperty called on non-object: ",v="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(b,c,d){if(typeof b!="object"&&typeof b!="function"||b===null)throw new TypeError(u+b);if(typeof d!="object"&&typeof d!="function"||d===null)throw new TypeError(t+d);if(s)try{return s.call(Object,b,c,d)}catch(e){}if(i(d,"value"))if(n&&(l(b,c)||m(b,c))){var g=b.__proto__;b.__proto__=f,delete b[c],b[c]=d.value,b.__proto__=g}else b[c]=d.value;else{if(!n)throw new TypeError(v);i(d,"get")&&j(b,c,d.get),i(d,"set")&&k(b,c,d.set)}return b}}Object.defineProperties||(Object.defineProperties=function(b,c){for(var d in c)i(c,d)&&Object.defineProperty(b,d,c[d]);return b}),Object.seal||(Object.seal=function(b){return b}),Object.freeze||(Object.freeze=function(b){return b});try{Object.freeze(function(){})}catch(w){Object.freeze=function(b){return function(c){return typeof c=="function"?c:b(c)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(b){return b}),Object.isSealed||(Object.isSealed=function(b){return!1}),Object.isFrozen||(Object.isFrozen=function(b){return!1}),Object.isExtensible||(Object.isExtensible=function(b){if(Object(b)===b)throw new TypeError;var c="";while(i(b,c))c+="?";b[c]=!0;var d=i(b,c);return delete b[c],d});if(!Object.keys){var x=!0,y=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],z=y.length;for(var A in{toString:null})x=!1;Object.keys=function H(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var H=[];for(var b in a)i(a,b)&&H.push(b);if(x)for(var c=0,d=z;c<d;c++){var e=y[c];i(a,e)&&H.push(e)}return H}}if(!Date.prototype.toISOString||(new Date(-621987552e5)).toISOString().indexOf("-000001")===-1)Date.prototype.toISOString=function(){var b,c,d,e;if(!isFinite(this))throw new RangeError;b=[this.getUTCMonth()+1,this.getUTCDate(),this.getUTCHours(),this.getUTCMinutes(),this.getUTCSeconds()],e=this.getUTCFullYear(),e=(e<0?"-":e>9999?"+":"")+("00000"+Math.abs(e)).slice(0<=e&&e<=9999?-4:-6),c=b.length;while(c--)d=b[c],d<10&&(b[c]="0"+d);return e+"-"+b.slice(0,2).join("-")+"T"+b.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"};Date.now||(Date.now=function(){return(new Date).getTime()}),Date.prototype.toJSON||(Date.prototype.toJSON=function(b){if(typeof this.toISOString!="function")throw new TypeError;return this.toISOString()}),Date.parse("+275760-09-13T00:00:00.000Z")!==864e13&&(Date=function(a){var b=function e(b,c,d,f,g,h,i){var j=arguments.length;if(this instanceof a){var k=j==1&&String(b)===b?new a(e.parse(b)):j>=7?new a(b,c,d,f,g,h,i):j>=6?new a(b,c,d,f,g,h):j>=5?new a(b,c,d,f,g):j>=4?new a(b,c,d,f):j>=3?new a(b,c,d):j>=2?new a(b,c):j>=1?new a(b):new a;return k.constructor=e,k}return a.apply(this,arguments)},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$");for(var d in a)b[d]=a[d];return b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function(d){var e=c.exec(d);if(e){e.shift();for(var f=1;f<7;f++)e[f]=+(e[f]||(f<3?1:0)),f==1&&e[f]--;var g=+e.pop(),h=+e.pop(),i=e.pop(),j=0;if(i){if(h>23||g>59)return NaN;j=(h*60+g)*6e4*(i=="+"?-1:1)}var k=+e[0];return 0<=k&&k<=99?(e[0]=k+400,a.UTC.apply(this,e)+j-126227808e5):a.UTC.apply(this,e)+j}return a.parse.apply(this,arguments)},b}(Date));var B="	\n\f\r   ᠎              \u2028\u2029";if(!String.prototype.trim||B.trim()){B="["+B+"]";var C=new RegExp("^"+B+B+"*"),D=new RegExp(B+B+"*$");String.prototype.trim=function(){return String(this).replace(C,"").replace(D,"")}}var E=function(a){return a=+a,a!==a?a=0:a!==0&&a!==1/0&&a!==-Infinity&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a},F="a"[0]!="a",G=function(a){if(a==null)throw new TypeError;return F&&typeof a=="string"&&a?a.split(""):Object(a)}}),define("ace/lib/dom",["require","exports","module"],function(a,b,c){"use strict";var d="http://www.w3.org/1999/xhtml";b.createElement=function(a,b){return document.createElementNS?document.createElementNS(b||d,a):document.createElement(a)},b.setText=function(a,b){a.innerText!==undefined&&(a.innerText=b),a.textContent!==undefined&&(a.textContent=b)},b.hasCssClass=function(a,b){var c=a.className.split(/\s+/g);return c.indexOf(b)!==-1},b.addCssClass=function(a,c){b.hasCssClass(a,c)||(a.className+=" "+c)},b.removeCssClass=function(a,b){var c=a.className.split(/\s+/g);for(;;){var d=c.indexOf(b);if(d==-1)break;c.splice(d,1)}a.className=c.join(" ")},b.toggleCssClass=function(a,b){var c=a.className.split(/\s+/g),d=!0;for(;;){var e=c.indexOf(b);if(e==-1)break;d=!1,c.splice(e,1)}return d&&c.push(b),a.className=c.join(" "),d},b.setCssClass=function(a,c,d){d?b.addCssClass(a,c):b.removeCssClass(a,c)},b.hasCssString=function(a,b){var c=0,d;b=b||document;if(b.createStyleSheet&&(d=b.styleSheets)){while(c<d.length)if(d[c++].owningElement.id===a)return!0}else if(d=b.getElementsByTagName("style"))while(c<d.length)if(d[c++].id===a)return!0;return!1},b.importCssString=function(c,e,f){f=f||document;if(e&&b.hasCssString(e,f))return null;var g;if(f.createStyleSheet)g=f.createStyleSheet(),g.cssText=c,e&&(g.owningElement.id=e);else{g=f.createElementNS?f.createElementNS(d,"style"):f.createElement("style"),g.appendChild(f.createTextNode(c)),e&&(g.id=e);var h=f.getElementsByTagName("head")[0]||f.documentElement;h.appendChild(g)}},b.importCssStylsheet=function(a,c){if(c.createStyleSheet)c.createStyleSheet(a);else{var d=b.createElement("link");d.rel="stylesheet",d.href=a;var e=c.getElementsByTagName("head")[0]||c.documentElement;e.appendChild(d)}},b.getInnerWidth=function(a){return parseInt(b.computedStyle(a,"paddingLeft"),10)+parseInt(b.computedStyle(a,"paddingRight"),10)+a.clientWidth},b.getInnerHeight=function(a){return parseInt(b.computedStyle(a,"paddingTop"),10)+parseInt(b.computedStyle(a,"paddingBottom"),10)+a.clientHeight},window.pageYOffset!==undefined?(b.getPageScrollTop=function(){return window.pageYOffset},b.getPageScrollLeft=function(){return window.pageXOffset}):(b.getPageScrollTop=function(){return document.body.scrollTop},b.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?b.computedStyle=function(a,b){return b?(window.getComputedStyle(a,"")||{})[b]||"":window.getComputedStyle(a,"")||{}}:b.computedStyle=function(a,b){return b?a.currentStyle[b]:a.currentStyle},b.scrollbarWidth=function(a){var c=b.createElement("p");c.style.width="100%",c.style.minWidth="0px",c.style.height="200px";var d=b.createElement("div"),e=d.style;e.position="absolute",e.left="-10000px",e.overflow="hidden",e.width="200px",e.minWidth="0px",e.height="150px",d.appendChild(c);var f=a.body||a.documentElement;f.appendChild(d);var g=c.offsetWidth;e.overflow="scroll";var h=c.offsetWidth;return g==h&&(h=d.clientWidth),f.removeChild(d),g-h},b.setInnerHtml=function(a,b){var c=a.cloneNode(!1);return c.innerHTML=b,a.parentNode.replaceChild(c,a),c},b.setInnerText=function(a,b){var c=a.ownerDocument;c.body&&"textContent"in c.body?a.textContent=b:a.innerText=b},b.getInnerText=function(a){var b=a.ownerDocument;return b.body&&"textContent"in b.body?a.textContent:a.innerText||a.textContent||""},b.getParentWindow=function(a){return a.defaultView||a.parentWindow}}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent","ace/lib/dom"],function(a,b,c){function g(a,b,c){var f=0;e.isOpera&&e.isMac?f=0|(b.metaKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.ctrlKey?8:0):f=0|(b.ctrlKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.metaKey?8:0);if(c in d.MODIFIER_KEYS){switch(d.MODIFIER_KEYS[c]){case"Alt":f=2;break;case"Shift":f=4;break;case"Ctrl":f=1;break;default:f=8}c=0}return f&8&&(c==91||c==93)&&(c=0),!!f||c in d.FUNCTION_KEYS||c in d.PRINTABLE_KEYS?a(b,f,c):!1}"use strict";var d=a("./keys"),e=a("./useragent"),f=a("./dom");b.addListener=function(a,b,c){if(a.addEventListener)return a.addEventListener(b,c,!1);if(a.attachEvent){var d=function(){c(window.event)};c._wrapper=d,a.attachEvent("on"+b,d)}},b.removeListener=function(a,b,c){if(a.removeEventListener)return a.removeEventListener(b,c,!1);a.detachEvent&&a.detachEvent("on"+b,c._wrapper||c)},b.stopEvent=function(a){return b.stopPropagation(a),b.preventDefault(a),!1},b.stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},b.preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},b.getDocumentX=function(a){return a.clientX?a.clientX+f.getPageScrollLeft():a.pageX},b.getDocumentY=function(a){return a.clientY?a.clientY+f.getPageScrollTop():a.pageY},b.getButton=function(a){return a.type=="dblclick"?0:a.type=="contextmenu"?2:a.preventDefault?a.button:{1:0,2:2,4:1}[a.button]},document.documentElement.setCapture?b.capture=function(a,c,d){function e(a){return c(a),b.stopPropagation(a)}function g(e){c(e),f||(f=!0,d(e)),b.removeListener(a,"mousemove",c),b.removeListener(a,"mouseup",g),b.removeListener(a,"losecapture",g),a.releaseCapture()}var f=!1;b.addListener(a,"mousemove",c),b.addListener(a,"mouseup",g),b.addListener(a,"losecapture",g),a.setCapture()}:b.capture=function(a,b,c){function d(a){b(a),a.stopPropagation()}function e(a){b&&b(a),c&&c(a),document.removeEventListener("mousemove",d,!0),document.removeEventListener("mouseup",e,!0),a.stopPropagation()}document.addEventListener("mousemove",d,!0),document.addEventListener("mouseup",e,!0)},b.addMouseWheelListener=function(a,c){var d=8,e=function(a){a.wheelDelta!==undefined?a.wheelDeltaX!==undefined?(a.wheelX=-a.wheelDeltaX/d,a.wheelY=-a.wheelDeltaY/d):(a.wheelX=0,a.wheelY=-a.wheelDelta/d):a.axis&&a.axis==a.HORIZONTAL_AXIS?(a.wheelX=(a.detail||0)*5,a.wheelY=0):(a.wheelX=0,a.wheelY=(a.detail||0)*5),c(a)};b.addListener(a,"DOMMouseScroll",e),b.addListener(a,"mousewheel",e)},b.addMultiMouseDownListener=function(a,c,d,f,g){var h=0,i,j,k=function(a){h+=1,h==1&&(i=a.clientX,j=a.clientY,setTimeout(function(){h=0},f||600));var e=b.getButton(a)==c;if(!e||Math.abs(a.clientX-i)>5||Math.abs(a.clientY-j)>5)h=0;h==d&&(h=0,g(a));if(e)return b.preventDefault(a)};b.addListener(a,"mousedown",k),e.isOldIE&&b.addListener(a,"dblclick",k)},b.addCommandKeyListener=function(a,c){var d=b.addListener;if(e.isOldGecko||e.isOpera){var f=null;d(a,"keydown",function(a){f=a.keyCode}),d(a,"keypress",function(a){return g(c,a,f)})}else{var h=null;d(a,"keydown",function(a){return h=a.keyIdentifier||a.keyCode,g(c,a,a.keyCode)})}};if(window.postMessage){var h=1;b.nextTick=function(a,c){c=c||window;var d="zero-timeout-message-"+h;b.addListener(c,"message",function e(f){f.data==d&&(b.stopPropagation(f),b.removeListener(c,"message",e),a())}),c.postMessage(d,"*")}}else b.nextTick=function(a,b){b=b||window,window.setTimeout(a,0)}}),define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(a,b,c){"use strict";var d=a("./oop"),e=function(){var a={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:'"'}};for(var b in a.FUNCTION_KEYS){var c=a.FUNCTION_KEYS[b].toUpperCase();a[c]=parseInt(b,10)}return d.mixin(a,a.MODIFIER_KEYS),d.mixin(a,a.PRINTABLE_KEYS),d.mixin(a,a.FUNCTION_KEYS),a}();d.mixin(b,e),b.keyCodeToString=function(a){return(e[a]||String.fromCharCode(a)).toLowerCase()}}),define("ace/lib/oop",["require","exports","module"],function(a,b,c){"use strict",b.inherits=function(){var a=function(){};return function(b,c){a.prototype=c.prototype,b.super_=c.prototype,b.prototype=new a,b.prototype.constructor=b}}(),b.mixin=function(a,b){for(var c in b)a[c]=b[c]},b.implement=function(a,c){b.mixin(a,c)}}),define("ace/lib/useragent",["require","exports","module"],function(a,b,c){"use strict";var d=(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase(),e=navigator.userAgent;b.isWin=d=="win",b.isMac=d=="mac",b.isLinux=d=="linux",b.isIE=navigator.appName=="Microsoft Internet Explorer"&&parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]),b.isOldIE=b.isIE&&b.isIE<9,b.isGecko=b.isMozilla=window.controllers&&window.navigator.product==="Gecko",b.isOldGecko=b.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4,b.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",b.isWebKit=parseFloat(e.split("WebKit/")[1])||undefined,b.isChrome=parseFloat(e.split(" Chrome/")[1])||undefined,b.isAIR=e.indexOf("AdobeAIR")>=0,b.isIPad=e.indexOf("iPad")>=0,b.isTouchPad=e.indexOf("TouchPad")>=0,b.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},b.getOS=function(){return b.isMac?b.OS.MAC:b.isLinux?b.OS.LINUX:b.OS.WINDOWS}}),define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands"],function(a,b,c){"use strict",a("./lib/fixoldbrowsers");var d=a("./lib/oop"),e=a("./lib/lang"),f=a("./lib/useragent"),g=a("./keyboard/textinput").TextInput,h=a("./mouse/mouse_handler").MouseHandler,i=a("./mouse/fold_handler").FoldHandler,j=a("./keyboard/keybinding").KeyBinding,k=a("./edit_session").EditSession,l=a("./search").Search,m=a("./range").Range,n=a("./lib/event_emitter").EventEmitter,o=a("./commands/command_manager").CommandManager,p=a("./commands/default_commands").commands,q=function(a,b){var c=a.getContainerElement();this.container=c,this.renderer=a,this.textInput=new g(a.getTextAreaContainer(),this),this.keyBinding=new j(this),f.isIPad||(this.$mouseHandler=new h(this),new i(this)),this.$blockScrolling=0,this.$search=(new l).set({wrap:!0}),this.commands=new o(f.isMac?"mac":"win",p),this.setSession(b||new k(""))};(function(){d.implement(this,n),this.setKeyboardHandler=function(a){this.keyBinding.setKeyboardHandler(a)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session==a)return;if(this.session){var b=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange),this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange),this.session.removeEventListener("changeLeftTop",this.$onScrollLeftChange);var c=this.session.getSelection();c.removeEventListener("changeCursor",this.$onCursorChange),c.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=a,this.$onDocumentChange=this.onDocumentChange.bind(this),a.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.updateText.bind(this.renderer),a.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange),this.selection=a.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull(),this._emit("changeSession",{session:a,oldSession:b})},this.getSession=function(){return this.session},this.getSelection=function(){return this.selection},this.resize=function(){this.renderer.onResize()},this.setTheme=function(a){this.renderer.setTheme(a)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.setFontSize=function(a){this.container.style.fontSize=a,this.renderer.updateFontSize()},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session.findMatchingBracket(a.getCursorPosition());if(b){var c=new m(b.row,b.column,b.row,b.column+1);a.session.$bracketHighlight=a.session.addMarker(c,"ace_bracket","text")}},10)},this.focus=function(){var a=this;setTimeout(function(){a.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus")},this.onBlur=function(){this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur")},this.onDocumentChange=function(a){var b=a.data,c=b.range,d;c.start.row==c.end.row&&b.action!="insertLines"&&b.action!="removeLines"?d=c.end.row:d=Infinity,this.renderer.updateLines(c.start.row,d),this._emit("change",a),this.onCursorChange()},this.onTokenizerUpdate=function(a){var b=a.data;this.renderer.updateLines(b.first,b.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.renderer.updateCursor(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.renderer.moveTextAreaToCursor(this.textInput.getElement()),this.$highlightBrackets(),this.$updateHighlightActiveLine()},this.$updateHighlightActiveLine=function(){var a=this.getSession();a.$highlightLineMarker&&a.removeMarker(a.$highlightLineMarker),typeof this.$lastrow=="number"&&this.renderer.removeGutterDecoration(this.$lastrow,"ace_gutter_active_line"),a.$highlightLineMarker=null,this.$lastrow=null;if(this.getHighlightActiveLine()){var b=this.getCursorPosition(),c=this.session.getFoldLine(b.row);if(this.getSelectionStyle()!="line"||!this.selection.isMultiLine()){var d;c?d=new m(c.start.row,0,c.end.row+1,0):d=new m(b.row,0,b.row+1,0),a.$highlightLineMarker=a.addMarker(d,"ace_active_line","background")}this.renderer.addGutterDecoration(this.$lastrow=b.row,"ace_gutter_active_line")}},this.onSelectionChange=function(a){var b=this.getSession();b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null;if(!this.selection.isEmpty()){var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}else this.$updateHighlightActiveLine();this.$highlightSelectedWord&&this.session.getMode().highlightSelection(this)},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.setBreakpoints(this.session.getBreakpoints())},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(){this.renderer.updateText()},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){var a="";return this.selection.isEmpty()||(a=this.session.getTextRange(this.getSelectionRange())),this._emit("copy",a),a},this.onCut=function(){this.commands.exec("cut",this)},this.insert=function(a){var b=this.session,c=b.getMode(),d=this.getCursorPosition();if(this.getBehavioursEnabled()){var e=c.transformAction(b.getState(d.row),"insertion",this,b,a);e&&(a=e.text)}a=a.replace("	",this.session.getTabString());if(!this.selection.isEmpty())d=this.session.remove(this.getSelectionRange()),this.clearSelection();else if(this.session.getOverwrite()){var f=new m.fromPoints(d,d);f.end.column+=a.length,this.session.remove(f)}this.clearSelection();var g=d.column,h=b.getState(d.row),i=c.checkOutdent(h,b.getLine(d.row),a),j=b.getLine(d.row),k=c.getNextLineIndent(h,j.slice(0,d.column),b.getTabString()),l=b.insert(d,a);e&&e.selection&&(e.selection.length==2?this.selection.setSelectionRange(new m(d.row,g+e.selection[0],d.row,g+e.selection[1])):this.selection.setSelectionRange(new m(d.row+e.selection[0],e.selection[1],d.row+e.selection[2],e.selection[3])));var h=b.getState(d.row);if(b.getDocument().isNewLine(a)){this.moveCursorTo(d.row+1,0);var n=b.getTabSize(),o=Number.MAX_VALUE;for(var p=d.row+1;p<=l.row;++p){var q=0;j=b.getLine(p);for(var r=0;r<j.length;++r)if(j.charAt(r)=="	")q+=n;else{if(j.charAt(r)!=" ")break;q+=1}/[^\s]/.test(j)&&(o=Math.min(q,o))}for(var p=d.row+1;p<=l.row;++p){var s=o;j=b.getLine(p);for(var r=0;r<j.length&&s>0;++r)j.charAt(r)=="	"?s-=n:j.charAt(r)==" "&&(s-=1);b.remove(new m(p,0,p,r))}b.indentRows(d.row+1,l.row,k)}i&&c.autoOutdent(h,b,d.row)},this.onTextInput=function(a,b){b&&this._emit("paste",a),this.keyBinding.onTextInput(a,b)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.$mouseHandler.setScrollSpeed(a)},this.getScrollSpeed=function(){return this.$mouseHandler.getScrollSpeed()},this.setDragDelay=function(a){this.$mouseHandler.setDragDelay(a)},this.getDragDelay=function(){return this.$mouseHandler.getDragDelay()},this.$selectionStyle="line",this.setSelectionStyle=function(a){if(this.$selectionStyle==a)return;this.$selectionStyle=a,this.onSelectionChange(),this._emit("changeSelectionStyle",{data:a})},this.getSelectionStyle=function(){return this.$selectionStyle},this.$highlightActiveLine=!0,this.setHighlightActiveLine=function(a){if(this.$highlightActiveLine==a)return;this.$highlightActiveLine=a,this.$updateHighlightActiveLine()},this.getHighlightActiveLine=function(){return this.$highlightActiveLine},this.$highlightSelectedWord=!0,this.setHighlightSelectedWord=function(a){if(this.$highlightSelectedWord==a)return;this.$highlightSelectedWord=a,a?this.session.getMode().highlightSelection(this):this.session.getMode().clearSelectionHighlight(this)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(a){this.renderer.setAnimatedScroll(a)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(a){if(this.getShowInvisibles()==a)return;this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.$readOnly=!1,this.setReadOnly=function(a){this.$readOnly=a},this.getReadOnly=function(){return this.$readOnly},this.$modeBehaviours=!0,this.setBehavioursEnabled=function(a){this.$modeBehaviours=a},this.getBehavioursEnabled=function(){return this.$modeBehaviours},this.setShowFoldWidgets=function(a){var b=this.renderer.$gutterLayer;if(b.getShowFoldWidgets()==a)return;this.renderer.$gutterLayer.setShowFoldWidgets(a),this.$showFoldWidgets=a,this.renderer.updateFull()},this.getShowFoldWidgets=function(){return this.renderer.$gutterLayer.getShowFoldWidgets()},this.remove=function(a){this.selection.isEmpty()&&(a=="left"?this.selection.selectLeft():this.selection.selectRight());var b=this.getSelectionRange();if(this.getBehavioursEnabled()){var c=this.session,d=c.getState(b.start.row),e=c.getMode().transformAction(d,"deletion",this,c,b);e&&(b=e)}this.session.remove(b),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var a=this.getCursorPosition(),b=a.column;if(b===0)return;var c=this.session.getLine(a.row),d,e;b<c.length?(d=c.charAt(b)+c.charAt(b-1),e=new m(a.row,b-1,a.row,b+1)):(d=c.charAt(b-1)+c.charAt(b-2),e=new m(a.row,b-2,a.row,b)),this.session.replace(e,d)},this.toLowerCase=function(){var a=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var b=this.getSelectionRange(),c=this.session.getTextRange(b);this.session.replace(b,c.toLowerCase()),this.selection.setSelectionRange(a)},this.toUpperCase=function(){var a=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var b=this.getSelectionRange(),c=this.session.getTextRange(b);this.session.replace(b,c.toUpperCase()),this.selection.setSelectionRange(a)},this.indent=function(){var a=this.session,b=this.getSelectionRange();if(!(b.start.row<b.end.row||b.start.column<b.end.column)){var d;if(this.session.getUseSoftTabs()){var f=a.getTabSize(),g=this.getCursorPosition(),h=a.documentToScreenColumn(g.row,g.column),i=f-h%f;d=e.stringRepeat(" ",i)}else d="	";return this.insert(d)}var c=this.$getSelectedRows();a.indentRows(c.first,c.last,"	")},this.blockOutdent=function(){var a=this.session.getSelection();this.session.outdentRows(a.getRange())},this.toggleCommentLines=function(){var a=this.session.getState(this.getCursorPosition().row),b=this.$getSelectedRows();this.session.getMode().toggleCommentLines(a,this.session,b.first,b.last)},this.removeLines=function(){var a=this.$getSelectedRows(),b;a.first===0||a.last+1<this.session.getLength()?b=new m(a.first,0,a.last+1,0):b=new m(a.first-1,this.session.getLine(a.first-1).length,a.last,this.session.getLine(a.last).length),this.session.remove(b),this.clearSelection()},this.moveLinesDown=function(){this.$moveLines(function(a,b){return this.session.moveLinesDown(a,b)})},this.moveLinesUp=function(){this.$moveLines(function(a,b){return this.session.moveLinesUp(a,b)})},this.moveText=function(a,b){return this.$readOnly?null:this.session.moveText(a,b)},this.copyLinesUp=function(){this.$moveLines(function(a,b){return this.session.duplicateLines(a,b),0})},this.copyLinesDown=function(){this.$moveLines(function(a,b){return this.session.duplicateLines(a,b)})},this.$moveLines=function(a){var b=this.$getSelectedRows(),c=this.selection;if(!c.isMultiLine())var d=c.getRange(),e=c.isBackwards();var f=a.call(this,b.first,b.last);d?(d.start.row+=f,d.end.row+=f,c.setSelectionRange(d,e)):(c.setSelectionAnchor(b.last+f+1,0),c.$moveSelection(function(){c.moveCursorTo(b.first+f,0)}))},this.$getSelectedRows=function(){var a=this.getSelectionRange().collapseRows();return{first:a.start.row,last:a.end.row}},this.onCompositionStart=function(a){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(a){this.renderer.setCompositionText(a)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(a){return a>=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.isRowFullyVisible=function(a){return a>=this.renderer.getFirstFullyVisibleRow()&&a<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$getPageDownRow=function(){return this.renderer.getScrollBottomRow()},this.$getPageUpRow=function(){var a=this.renderer.getScrollTopRow(),b=this.renderer.getScrollBottomRow();return a-(b-a)},this.selectPageDown=function(){var a=this.$getPageDownRow()+Math.floor(this.$getVisibleRowCount()/2);this.scrollPageDown();var b=this.getSelection(),c=this.session.documentToScreenPosition(b.getSelectionLead()),d=this.session.screenToDocumentPosition(a,c.column);b.selectTo(d.row,d.column)},this.selectPageUp=function(){var a=this.renderer.getScrollTopRow()-this.renderer.getScrollBottomRow(),b=this.$getPageUpRow()+Math.round(a/2);this.scrollPageUp();var c=this.getSelection(),d=this.session.documentToScreenPosition(c.getSelectionLead()),e=this.session.screenToDocumentPosition(b,d.column);c.selectTo(e.row,e.column)},this.gotoPageDown=function(){var a=this.$getPageDownRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.gotoPageUp=function(){var a=this.$getPageUpRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.scrollPageDown=function(){this.scrollToRow(this.$getPageDownRow())},this.scrollPageUp=function(){this.renderer.scrollToRow(this.$getPageUpRow())},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b){this.renderer.scrollToLine(a,b)},this.centerSelection=function(){var a=this.getSelectionRange(),b=Math.floor(a.start.row+(a.end.row-a.start.row)/2);this.renderer.scrollToLine(b,!0)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.jumpToMatching=function(){var a=this.getCursorPosition(),b=this.session.findMatchingBracket(a);b||(a.column+=1,b=this.session.findMatchingBracket(a)),b||(a.column-=2,b=this.session.findMatchingBracket(a)),b&&(this.clearSelection(),this.moveCursorTo(b.row,b.column))},this.gotoLine=function(a,b){this.selection.clearSelection(),this.session.unfold({row:a-1,column:b||0}),this.$blockScrolling+=1,this.moveCursorTo(a-1,b||0),this.$blockScrolling-=1,this.isRowFullyVisible(this.getCursorPosition().row)||this.scrollToLine(a,!0)},this.navigateTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.navigateUp=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(-a,0)},this.navigateDown=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(a,0)},this.navigateLeft=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().start;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().end;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(a,b){b&&this.$search.set(b);var c=this.$search.find(this.session),d=0;return c?(this.$tryReplace(c,a)&&(d=1),c!==null&&(this.selection.setSelectionRange(c),this.renderer.scrollSelectionIntoView(c.start,c.end)),d):d},this.replaceAll=function(a,b){b&&this.$search.set(b);var c=this.$search.findAll(this.session),d=0;if(!c.length)return d;var e=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0),this.$blockScrolling+=1;for(var f=c.length-1;f>=0;--f)this.$tryReplace(c[f],a)&&d++;return this.selection.setSelectionRange(e),this.$blockScrolling-=1,d},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a);return b=this.$search.replace(c,b),b!==null?(a.end=this.session.replace(a,b),a):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b){this.clearSelection(),b=b||{},b.needle=a,this.$search.set(b),this.$find()},this.findNext=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!1),this.$search.set(a),this.$find()},this.findPrevious=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!0),this.$search.set(a),this.$find()},this.$find=function(a){this.selection.isEmpty()||this.$search.set({needle:this.session.getTextRange(this.getSelectionRange())}),typeof a!="undefined"&&this.$search.set({backwards:a});var b=this.$search.find(this.session);if(b){this.session.unfold(b),this.$blockScrolling+=1,this.selection.setSelectionRange(b),this.$blockScrolling-=1;if(this.getAnimatedScroll()){var c=this.getCursorPosition();this.isRowFullyVisible(c.row)||this.scrollToLine(c.row,!0)}else this.renderer.scrollSelectionIntoView(b.start,b.end)}},this.undo=function(){this.session.getUndoManager().undo()},this.redo=function(){this.session.getUndoManager().redo()},this.destroy=function(){this.renderer.destroy()}}).call(q.prototype),b.Editor=q}),define("ace/lib/lang",["require","exports","module"],function(a,b,c){"use strict",b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return(new Array(b+1)).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(var c=0,d=a.length;c<d;c++)a[c]&&typeof a[c]=="object"?b[c]=this.copyObject(a[c]):b[c]=a[c];return b},b.deepCopy=function(a){if(typeof a!="object")return a;var b=a.constructor();for(var c in a)typeof a[c]=="object"?b[c]=this.deepCopy(a[c]):b[c]=a[c];return b},b.arrayToMap=function(a){var b={};for(var c=0;c<a.length;c++)b[a[c]]=1;return b},b.arrayRemove=function(a,b){for(var c=0;c<=a.length;c++)b===a[c]&&a.splice(c,1)},b.escapeRegExp=function(a){return a.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},b.deferredCall=function(a){var b=null,c=function(){b=null,a()},d=function(a){return d.cancel(),b=setTimeout(c,a||0),d};return d.schedule=d,d.call=function(){return this.cancel(),a(),d},d.cancel=function(){return clearTimeout(b),b=null,d},d}}),define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("../lib/useragent"),f=a("../lib/dom"),g=function(a,b){function l(){try{c.select()}catch(a){}}function m(a){if(!i){var d=a||c.value;if(d){d.charCodeAt(d.length-1)==g.charCodeAt(0)?(d=d.slice(0,-1),d&&b.onTextInput(d,j)):b.onTextInput(d,j);if(!v())return!1}}i=!1,j=!1,c.value=g,l()}function v(){return document.activeElement===c}var c=f.createElement("textarea");e.isTouchPad&&c.setAttribute("x-palm-disable-auto-cap",!0),c.style.left="-10000px",c.style.position="fixed",a.insertBefore(c,a.firstChild);var g=String.fromCharCode(0);m();var h=!1,i=!1,j=!1,k="",n=function(a){setTimeout(function(){h||m(a.data)},0)},o=function(a){if(e.isOldIE&&c.value.charCodeAt(0)>128)return;setTimeout(function(){h||m()},0)},p=function(a){h=!0,b.onCompositionStart(),e.isGecko||setTimeout(q,0)},q=function(){if(!h)return;b.onCompositionUpdate(c.value)},r=function(a){h=!1,b.onCompositionEnd()},s=function(a){i=!0;var d=b.getCopyText();d?c.value=d:a.preventDefault(),l(),setTimeout(function(){m()},0)},t=function(a){i=!0;var d=b.getCopyText();d?(c.value=d,b.onCut()):a.preventDefault(),l(),setTimeout(function(){m()},0)};d.addCommandKeyListener(c,b.onCommandKey.bind(b));if(e.isOldIE){var u={13:1,27:1};d.addListener(c,"keyup",function(a){h&&(!c.value||u[a.keyCode])&&setTimeout(r,0);if((c.value.charCodeAt(0)|0)<129)return;h?q():p()})}"onpropertychange"in c&&!("oninput"in c)?d.addListener(c,"propertychange",o):d.addListener(c,"input",n),d.addListener(c,"paste",function(a){j=!0,a.clipboardData&&a.clipboardData.getData?(m(a.clipboardData.getData("text/plain")),a.preventDefault()):o()}),"onbeforecopy"in c&&typeof clipboardData!="undefined"?(d.addListener(c,"beforecopy",function(a){var c=b.getCopyText();c?clipboardData.setData("Text",c):a.preventDefault()}),d.addListener(a,"keydown",function(a){if(a.ctrlKey&&a.keyCode==88){var c=b.getCopyText();c&&(clipboardData.setData("Text",c),b.onCut()),d.preventDefault(a)}})):(d.addListener(c,"copy",s),d.addListener(c,"cut",t)),d.addListener(c,"compositionstart",p),e.isGecko&&d.addListener(c,"text",q),e.isWebKit&&d.addListener(c,"keyup",q),d.addListener(c,"compositionend",r),d.addListener(c,"blur",function(){b.onBlur()}),d.addListener(c,"focus",function(){b.onFocus(),l()}),this.focus=function(){b.onFocus(),l(),c.focus()},this.blur=function(){c.blur()},this.isFocused=v,this.getElement=function(){return c},this.onContextMenu=function(a,b){a&&(k||(k=c.style.cssText),c.style.cssText="position:fixed; z-index:1000;left:"+(a.x-2)+"px; top:"+(a.y-2)+"px;"),b&&(c.value="")},this.onContextMenuClose=function(){setTimeout(function(){k&&(c.style.cssText=k,k=""),m()},0)}};b.TextInput=g}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("./default_handlers").DefaultHandlers,f=a("./default_gutter_handler").GutterHandler,g=a("./mouse_event").MouseEvent,h=function(a){this.editor=a,new e(a),new f(a),d.addListener(a.container,"mousedown",function(b){return a.focus(),d.preventDefault(b)}),d.addListener(a.container,"selectstart",function(a){return d.preventDefault(a)});var b=a.renderer.getMouseEventTarget();d.addListener(b,"mousedown",this.onMouseEvent.bind(this,"mousedown")),d.addListener(b,"click",this.onMouseEvent.bind(this,"click")),d.addListener(b,"mousemove",this.onMouseMove.bind(this,"mousemove")),d.addMultiMouseDownListener(b,0,2,500,this.onMouseEvent.bind(this,"dblclick")),d.addMultiMouseDownListener(b,0,3,600,this.onMouseEvent.bind(this,"tripleclick")),d.addMultiMouseDownListener(b,0,4,600,this.onMouseEvent.bind(this,"quadclick")),d.addMouseWheelListener(a.container,this.onMouseWheel.bind(this,"mousewheel"));var c=a.renderer.$gutter;d.addListener(c,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),d.addListener(c,"click",this.onMouseEvent.bind(this,"gutterclick")),d.addListener(c,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),d.addListener(c,"mousemove",this.onMouseMove.bind(this,"gutter"))};(function(){this.$scrollSpeed=1,this.setScrollSpeed=function(a){this.$scrollSpeed=a},this.getScrollSpeed=function(){return this.$scrollSpeed},this.onMouseEvent=function(a,b){this.editor._emit(a,new g(b,this.editor))},this.$dragDelay=250,this.setDragDelay=function(a){this.$dragDelay=a},this.getDragDelay=function(){return this.$dragDelay},this.onMouseMove=function(a,b){var c=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!c||!c.length)return;this.editor._emit(a,new g(b,this.editor))},this.onMouseWheel=function(a,b){var c=new g(b,this.editor);c.speed=this.$scrollSpeed*2,c.wheelX=b.wheelX,c.wheelY=b.wheelY,this.editor._emit(a,c)}}).call(h.prototype),b.MouseHandler=h}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/event","ace/lib/dom","ace/lib/browser_focus"],function(a,b,c){function k(a){this.editor=a,this.$clickSelection=null,this.browserFocus=new f,a.setDefaultHandler("mousedown",this.onMouseDown.bind(this)),a.setDefaultHandler("dblclick",this.onDoubleClick.bind(this)),a.setDefaultHandler("tripleclick",this.onTripleClick.bind(this)),a.setDefaultHandler("quadclick",this.onQuadClick.bind(this)),a.setDefaultHandler("mousewheel",this.onScroll.bind(this))}function l(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}"use strict";var d=a("../lib/event"),e=a("../lib/dom"),f=a("../lib/browser_focus").BrowserFocus,g=0,h=1,i=2,j=5;(function(){this.onMouseDown=function(a){function C(b){a.getShiftKey()?m.selection.selectToPosition(b):n.$clickSelection||(m.moveCursorToPosition(b),m.selection.clearSelection()),q=h}var b=a.inSelection(),c=a.pageX,f=a.pageY,k=a.getDocumentPosition(),m=this.editor,n=this,o=m.getSelectionRange(),p=o.isEmpty(),q=g;if(b&&(!this.browserFocus.isFocused()||(new Date).getTime()-this.browserFocus.lastFocus<20||!m.isFocused())){m.focus();return}var r=a.getButton();if(r!==0){p&&m.moveCursorToPosition(k),r==2&&(m.textInput.onContextMenu({x:a.clientX,y:a.clientY},p),d.capture(m.container,function(){},m.textInput.onContextMenuClose));return}b||C(k);var s=c,t=f,u=(new Date).getTime(),v,w,x,y=function(a){s=d.getDocumentX(a),t=d.getDocumentY(a)},z=function(a){clearInterval(F),q==g?C(k):q==i&&A(a),n.$clickSelection=null,q=g},A=function(a){e.removeCssClass(m.container,"ace_dragging"),m.session.removeMarker(x),m.$mouseHandler.$clickSelection||v||(m.moveCursorToPosition(k),m.selection.clearSelection());if(!v)return;if(w.contains(v.row,v.column)){v=null;return}m.clearSelection();if(a&&(a.ctrlKey||a.altKey))var b=m.session,c=b.insert(v,b.getTextRange(w));else var c=m.moveText(w,v);if(!c){v=null;return}m.selection.setSelectionRange(c)},B=function(){if(q==g){var a=l(c,f,s,t),b=(new Date).getTime();if(a>j){q=h;var d=m.renderer.screenToTextCoordinates(s,t);C(d)}else if(b-u>m.getDragDelay()){q=i,w=m.getSelectionRange();var k=m.getSelectionStyle();x=m.session.addMarker(w,"ace_selection",k),m.clearSelection(),e.addCssClass(m.container,"ace_dragging")}}q==i?E():q==h&&D()},D=function(){var a,b=m.renderer.screenToTextCoordinates(s,t);n.$clickSelection?n.$clickSelection.contains(b.row,b.column)?m.selection.setSelectionRange(n.$clickSelection):(n.$clickSelection.compare(b.row,b.column)==-1?a=n.$clickSelection.end:a=n.$clickSelection.start,m.selection.setSelectionAnchor(a.row,a.column),m.selection.selectToPosition(b)):m.selection.selectToPosition(b),m.renderer.scrollCursorIntoView()},E=function(){v=m.renderer.screenToTextCoordinates(s,t),m.moveCursorToPosition(v)};d.capture(m.container,y,z);var F=setInterval(B,20);return a.preventDefault()},this.onDoubleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectWord(),this.$clickSelection=c.getSelectionRange()},this.onTripleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectLine(),this.$clickSelection=c.getSelectionRange()},this.onQuadClick=function(a){var b=this.editor;b.selectAll(),this.$clickSelection=b.getSelectionRange()},this.onScroll=function(a){var b=this.editor;b.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed);if(b.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed))return a.preventDefault()}}).call(k.prototype),b.DefaultHandlers=k}),define("ace/lib/browser_focus",["require","exports","module","ace/lib/oop","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./oop"),e=a("./event"),f=a("./event_emitter").EventEmitter,g=function(a){a=a||window,this.lastFocus=(new Date).getTime(),this._isFocused=!0;var b=this;"onfocusin"in a.document?(e.addListener(a.document,"focusin",function(a){b._setFocused(!0)}),e.addListener(a.document,"focusout",function(a){b._setFocused(!!a.toElement)})):(e.addListener(a,"blur",function(a){b._setFocused(!1)}),e.addListener(a,"focus",function(a){b._setFocused(!0)}))};(function(){d.implement(this,f),this.isFocused=function(){return this._isFocused},this._setFocused=function(a){if(this._isFocused==a)return;a&&(this.lastFocus=(new Date).getTime()),this._isFocused=a,this._emit("changeFocus")}}).call(g.prototype),b.BrowserFocus=g}),define("ace/lib/event_emitter",["require","exports","module"],function(a,b,c){"use strict";var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{},this._defaultHandlers=this._defaultHandlers||{};var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(!c.length&&!d)return;b=b||{},b.type=a,b.stopPropagation||(b.stopPropagation=function(){this.propagationStopped=!0}),b.preventDefault||(b.preventDefault=function(){this.defaultPrevented=!0});for(var e=0;e<c.length;e++){c[e](b);if(b.propagationStopped)break}d&&!b.defaultPrevented&&d(b)},d.setDefaultHandler=function(a,b){this._defaultHandlers=this._defaultHandlers||{};if(this._defaultHandlers[a])throw new Error("The default handler for '"+a+"' is already set");this._defaultHandlers[a]=b},d.on=d.addEventListener=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!c)var c=this._eventRegistry[a]=[];c.indexOf(b)==-1&&c.push(b)},d.removeListener=d.removeEventListener=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!c)return;var d=c.indexOf(b);d!==-1&&c.splice(d,1)},d.removeAllListeners=function(a){this._eventRegistry&&(this._eventRegistry[a]=[])},b.EventEmitter=d}),define("ace/mouse/default_gutter_handler",["require","exports","module"],function(a,b,c){function d(a){a.setDefaultHandler("gutterclick",function(b){var c=b.getDocumentPosition().row,d=a.session.selection;d.moveCursorTo(c,0),d.selectLine()})}"use strict",b.GutterHandler=d}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event"],function(a,b,c){"use strict";var d=a("../lib/event"),e=b.MouseEvent=function(a,b){this.domEvent=a,this.editor=b,this.pageX=d.getDocumentX(a),this.pageY=d.getDocumentY(a),this.clientX=a.clientX,this.clientY=a.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){d.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){d.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){if(this.$pos)return this.$pos;var a=d.getDocumentX(this.domEvent),b=d.getDocumentY(this.domEvent);return this.$pos=this.editor.renderer.screenToTextCoordinates(a,b),this.$pos},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var a=this.editor;if(a.getReadOnly())this.$inSelection=!1;else{var b=a.getSelectionRange();if(b.isEmpty())this.$inSelection=!1;else{var c=this.getDocumentPosition();this.$inSelection=b.contains(c.row,c.column)}}return this.$inSelection},this.getButton=function(){return d.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=function(){return this.domEvent.ctrlKey||this.domEvent.metaKey}}).call(e.prototype)}),define("ace/mouse/fold_handler",["require","exports","module"],function(a,b,c){function d(a){a.on("click",function(b){var c=b.getDocumentPosition(),d=a.session,e=d.getFoldAt(c.row,c.column,1);e&&(b.getAccelKey()?d.removeFold(e):d.expandFold(e),b.stop())}),a.on("gutterclick",function(b){if(b.domEvent.target.className.indexOf("ace_fold-widget")!=-1){var c=b.getDocumentPosition().row;a.session.onFoldWidgetClick(c,b.domEvent),b.stop()}})}"use strict",b.FoldHandler=d}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event","ace/commands/default_commands"],function(a,b,c){"use strict";var d=a("../lib/keys"),e=a("../lib/event");a("../commands/default_commands");var f=function(a){this.$editor=a,this.$data={},this.$handlers=[this]};(function(){this.setKeyboardHandler=function(a){if(this.$handlers[this.$handlers.length-1]==a)return;this.$data={},this.$handlers=a?[this,a]:[this]},this.addKeyboardHandler=function(a){this.removeKeyboardHandler(a),this.$handlers.push(a)},this.removeKeyboardHandler=function(a){var b=this.$handlers.indexOf(a);return b==-1?!1:(this.$handlers.splice(b,1),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.$callKeyboardHandlers=function(a,b,c,d){var f;for(var g=this.$handlers.length;g--;){f=this.$handlers[g].handleKeyboard(this.$data,a,b,c,d);if(f&&f.command)break}if(!f||!f.command)return!1;var h=!1,i=this.$editor.commands;return f.command!="null"?h=i.exec(f.command,this.$editor,f.args):h=!0,h&&d&&e.stopEvent(d),h},this.handleKeyboard=function(a,b,c){return{command:this.$editor.commands.findKeyCommand(b,c)}},this.onCommandKey=function(a,b,c){var e=d.keyCodeToString(c);this.$callKeyboardHandlers(b,e,c,a)},this.onTextInput=function(a,b){var c=!1;!b&&a.length==1&&(c=this.$callKeyboardHandlers(0,a)),c||this.$editor.commands.exec("insertstring",this.$editor,a)}}).call(f.prototype),b.KeyBinding=f}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang"],function(a,b,c){function e(a,b){return{win:a,mac:b}}"use strict";var d=a("../lib/lang");b.commands=[{name:"selectall",bindKey:e("Ctrl-A","Command-A"),exec:function(a){a.selectAll()},readOnly:!0},{name:"centerselection",bindKey:e(null,"Ctrl-L"),exec:function(a){a.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:e("Ctrl-L","Command-L"),exec:function(a){var b=parseInt(prompt("Enter line number:"),10);isNaN(b)||a.gotoLine(b)},readOnly:!0},{name:"fold",bindKey:e("Alt-L","Alt-L"),exec:function(a){a.session.toggleFold(!1)},readOnly:!0},{name:"unfold",bindKey:e("Alt-Shift-L","Alt-Shift-L"),exec:function(a){a.session.toggleFold(!0)},readOnly:!0},{name:"foldall",bindKey:e("Alt-0","Alt-0"),exec:function(a){a.session.foldAll()},readOnly:!0},{name:"unfoldall",bindKey:e("Alt-Shift-0","Alt-Shift-0"),exec:function(a){a.session.unfold()},readOnly:!0},{name:"findnext",bindKey:e("Ctrl-K","Command-G"),exec:function(a){a.findNext()},readOnly:!0},{name:"findprevious",bindKey:e("Ctrl-Shift-K","Command-Shift-G"),exec:function(a){a.findPrevious()},readOnly:!0},{name:"find",bindKey:e("Ctrl-F","Command-F"),exec:function(a){var b=prompt("Find:",a.getCopyText());a.find(b)},readOnly:!0},{name:"overwrite",bindKey:e("Insert","Insert"),exec:function(a){a.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:e("Ctrl-Shift-Home|Alt-Shift-Up","Command-Shift-Up"),exec:function(a){a.getSelection().selectFileStart()},readOnly:!0},{name:"gotostart",bindKey:e("Ctrl-Home|Ctrl-Up","Command-Home|Command-Up"),exec:function(a){a.navigateFileStart()},readOnly:!0},{name:"selectup",bindKey:e("Shift-Up","Shift-Up"),exec:function(a){a.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:!0},{name:"golineup",bindKey:e("Up","Up|Ctrl-P"),exec:function(a,b){a.navigateUp(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selecttoend",bindKey:e("Ctrl-Shift-End|Alt-Shift-Down","Command-Shift-Down"),exec:function(a){a.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoend",bindKey:e("Ctrl-End|Ctrl-Down","Command-End|Command-Down"),exec:function(a){a.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectdown",bindKey:e("Shift-Down","Shift-Down"),exec:function(a){a.getSelection().selectDown()},multiSelectAction:"forEach",readOnly:!0},{name:"golinedown",bindKey:e("Down","Down|Ctrl-N"),exec:function(a,b){a.navigateDown(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordleft",bindKey:e("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(a){a.getSelection().selectWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordleft",bindKey:e("Ctrl-Left","Option-Left"),exec:function(a){a.navigateWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolinestart",bindKey:e("Alt-Shift-Left","Command-Shift-Left"),exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolinestart",bindKey:e("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(a){a.navigateLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectleft",bindKey:e("Shift-Left","Shift-Left"),exec:function(a){a.getSelection().selectLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoleft",bindKey:e("Left","Left|Ctrl-B"),exec:function(a,b){a.navigateLeft(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordright",bindKey:e("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(a){a.getSelection().selectWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordright",bindKey:e("Ctrl-Right","Option-Right"),exec:function(a){a.navigateWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolineend",bindKey:e("Alt-Shift-Right","Command-Shift-Right"),exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolineend",bindKey:e("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(a){a.navigateLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectright",bindKey:e("Shift-Right","Shift-Right"),exec:function(a){a.getSelection().selectRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoright",bindKey:e("Right","Right|Ctrl-F"),exec:function(a,b){a.navigateRight(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectpagedown",bindKey:e("Shift-PageDown","Shift-PageDown"),exec:function(a){a.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:e(null,"PageDown"),exec:function(a){a.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:e("PageDown","Option-PageDown|Ctrl-V"),exec:function(a){a.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:e("Shift-PageUp","Shift-PageUp"),exec:function(a){a.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:e(null,"PageUp"),exec:function(a){a.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:e("PageUp","Option-PageUp"),exec:function(a){a.gotoPageUp()},readOnly:!0},{name:"selectlinestart",bindKey:e("Shift-Home","Shift-Home"),exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectlineend",bindKey:e("Shift-End","Shift-End"),exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"togglerecording",bindKey:e("Ctrl-Alt-E","Command-Option-E"),exec:function(a){a.commands.toggleRecording()},readOnly:!0},{name:"replaymacro",bindKey:e("Ctrl-Shift-E","Command-Shift-E"),exec:function(a){a.commands.replay(a)},readOnly:!0},{name:"jumptomatching",bindKey:e("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(a){a.jumpToMatching()},multiSelectAction:"forEach",readOnly:!0},{name:"cut",exec:function(a){var b=a.getSelectionRange();a._emit("cut",b),a.selection.isEmpty()||(a.session.remove(b),a.clearSelection())},multiSelectAction:"forEach"},{name:"removeline",bindKey:e("Ctrl-D","Command-D"),exec:function(a){a.removeLines()},multiSelectAction:"forEach"},{name:"togglecomment",bindKey:e("Ctrl-7","Command-7"),exec:function(a){a.toggleCommentLines()},multiSelectAction:"forEach"},{name:"replace",bindKey:e("Ctrl-R","Command-Option-F"),exec:function(a){var b=prompt("Find:",a.getCopyText());if(!b)return;var c=prompt("Replacement:");if(!c)return;a.replace(c,{needle:b})}},{name:"replaceall",bindKey:e("Ctrl-Shift-R","Command-Shift-Option-F"),exec:function(a){var b=prompt("Find:");if(!b)return;var c=prompt("Replacement:");if(!c)return;a.replaceAll(c,{needle:b})}},{name:"undo",bindKey:e("Ctrl-Z","Command-Z"),exec:function(a){a.undo()}},{name:"redo",bindKey:e("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(a){a.redo()}},{name:"copylinesup",bindKey:e("Ctrl-Alt-Up","Command-Option-Up"),exec:function(a){a.copyLinesUp()}},{name:"movelinesup",bindKey:e("Alt-Up","Option-Up"),exec:function(a){a.moveLinesUp()}},{name:"copylinesdown",bindKey:e("Ctrl-Alt-Down","Command-Option-Down"),exec:function(a){a.copyLinesDown()}},{name:"movelinesdown",bindKey:e("Alt-Down","Option-Down"),exec:function(a){a.moveLinesDown()}},{name:"del",bindKey:e("Delete","Delete|Ctrl-D"),exec:function(a){a.remove("right")},multiSelectAction:"forEach"},{name:"backspace",bindKey:e("Command-Backspace|Option-Backspace|Shift-Backspace|Backspace","Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(a){a.remove("left")},multiSelectAction:"forEach"},{name:"removetolinestart",bindKey:e("Alt-Backspace","Command-Backspace"),exec:function(a){a.removeToLineStart()},multiSelectAction:"forEach"},{name:"removetolineend",bindKey:e("Alt-Delete","Ctrl-K"),exec:function(a){a.removeToLineEnd()},multiSelectAction:"forEach"},{name:"removewordleft",bindKey:e("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(a){a.removeWordLeft()},multiSelectAction:"forEach"},{name:"removewordright",bindKey:e("Ctrl-Delete","Alt-Delete"),exec:function(a){a.removeWordRight()},multiSelectAction:"forEach"},{name:"outdent",bindKey:e("Shift-Tab","Shift-Tab"),exec:function(a){a.blockOutdent()},multiSelectAction:"forEach"},{name:"indent",bindKey:e("Tab","Tab"),exec:function(a){a.indent()},multiSelectAction:"forEach"},{name:"insertstring",exec:function(a,b){a.insert(b)},multiSelectAction:"forEach"},{name:"inserttext",exec:function(a,b){a.insert(d.stringRepeat(b.text||"",b.times||1))},multiSelectAction:"forEach"},{name:"splitline",bindKey:e(null,"Ctrl-O"),exec:function(a){a.splitLine()},multiSelectAction:"forEach"},{name:"transposeletters",bindKey:e("Ctrl-T","Ctrl-T"),exec:function(a){a.transposeLetters()},multiSelectAction:function(a){a.transposeSelections(1)}},{name:"touppercase",bindKey:e("Ctrl-U","Ctrl-U"),exec:function(a){a.toUpperCase()},multiSelectAction:"forEach"},{name:"tolowercase",bindKey:e("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(a){a.toLowerCase()},multiSelectAction:"forEach"}]}),define("ace/edit_session",["require","exports","module","ace/config","ace/lib/oop","ace/lib/lang","ace/lib/net","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/edit_session/folding","ace/edit_session/bracket_match"],function(a,b,c){"use strict";var d=a("./config"),e=a("./lib/oop"),f=a("./lib/lang"),g=a("./lib/net"),h=a("./lib/event_emitter").EventEmitter,i=a("./selection").Selection,j=a("./mode/text").Mode,k=a("./range").Range,l=a("./document").Document,m=a("./background_tokenizer").BackgroundTokenizer,n=function(a,b){this.$modified=!0,this.$breakpoints=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$rowCache=[],this.$wrapData=[],this.$foldData=[],this.$undoSelect=!0,this.$foldData.toString=function(){var a="";return this.forEach(function(b){a+="\n"+b.toString()}),a},a instanceof l?this.setDocument(a):this.setDocument(new l(a)),this.selection=new i(this),b?this.setMode(b):this.setMode(new j)};(function(){function q(a){return a<4352?!1:a>=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510}e.implement(this,h),this.setDocument=function(a){if(this.doc)throw new Error("Document is already set");this.doc=a,a.on("change",this.onChange.bind(this)),this.on("changeFold",this.onChangeFold.bind(this)),this.bgTokenizer&&(this.bgTokenizer.setDocument(this.getDocument()),this.bgTokenizer.start(0))},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(a==0){this.$rowCache=[];return}var b=this.$rowCache;for(var c=0;c<b.length;c++)if(b[c].docRow>=a){b.splice(c,b.length);return}},this.onChangeFold=function(a){var b=a.data;this.$resetRowCache(b.start.row)},this.onChange=function(a){var b=a.data;this.$modified=!0,this.$resetRowCache(b.range.start.row);var c=this.$updateInternalDataOnChange(a);!this.$fromUndo&&this.$undoManager&&!b.ignore&&(this.$deltasDoc.push(b),c&&c.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:c}),this.$informUndoManager.schedule()),this.bgTokenizer.start(b.range.start.row),this._emit("change",a)},this.setValue=function(a){this.doc.setValue(a),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(a){return this.bgTokenizer.getState(a)},this.getTokens=function(a,b){return this.bgTokenizer.getTokens(a,b)},this.getTokenAt=function(a,b){var c=this.bgTokenizer.getTokens(a,a)[0].tokens,d,e=0;if(b==null)f=c.length-1,e=this.getLine(a).length;else for(var f=0;f<c.length;f++){e+=c[f].value.length;if(e>=b)break}return d=c[f],d?(d.index=f,d.start=e-d.value.length,d):null},this.setUndoManager=function(a){this.$undoManager=a,this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b]}),b.$deltas=[]},this.$informUndoManager=f.deferredCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?f.stringRepeat(" ",this.getTabSize()):"	"},this.$useSoftTabs=!0,this.setUseSoftTabs=function(a){if(this.$useSoftTabs===a)return;this.$useSoftTabs=a},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.$tabSize=4,this.setTabSize=function(a){if(isNaN(a)||this.$tabSize===a)return;this.$modified=!0,this.$tabSize=a,this._emit("changeTabSize")},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(a){if(this.$overwrite==a)return;this.$overwrite=a,this._emit("changeOverwrite")},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b<a.length;b++)this.$breakpoints[a[b]]=!0;this._emit("changeBreakpoint",{})},this.clearBreakpoints=function(){this.$breakpoints=[],this._emit("changeBreakpoint",{})},this.setBreakpoint=function(a){this.$breakpoints[a]=!0,this._emit("changeBreakpoint",{})},this.clearBreakpoint=function(a){delete this.$breakpoints[a],this._emit("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.addMarker=function(a,b,c,d){var e=this.$markerId++,f={range:a,type:c||"line",renderer:typeof c=="function"?c:null,clazz:b,inFront:!!d};return d?(this.$frontMarkers[e]=f,this._emit("changeFrontMarker")):(this.$backMarkers[e]=f,this._emit("changeBackMarker")),e},this.removeMarker=function(a){var b=this.$frontMarkers[a]||this.$backMarkers[a];if(!b)return;var c=b.inFront?this.$frontMarkers:this.$backMarkers;b&&(delete c[a],this._emit(b.inFront?"changeFrontMarker":"changeBackMarker"))},this.getMarkers=function(a){return a?this.$frontMarkers:this.$backMarkers},this.setAnnotations=function(a){this.$annotations={};for(var b=0;b<a.length;b++){var c=a[b],d=c.row;this.$annotations[d]?this.$annotations[d].push(c):this.$annotations[d]=[c]}this._emit("changeAnnotation",{})},this.getAnnotations=function(){return this.$annotations||{}},this.clearAnnotations=function(){this.$annotations={},this._emit("changeAnnotation",{})},this.$detectNewLine=function(a){var b=a.match(/^.*?(\r?\n)/m);b?this.$autoNewLine=b[1]:this.$autoNewLine="\n"},this.getWordRange=function(a,b){var c=this.getLine(a),d=!1;b>0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe));var e=d?this.tokenRe:this.nonTokenRe,f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}var g=b;while(g<c.length&&c.charAt(g).match(e))g++;return new k(a,f,a,g)},this.getAWordRange=function(a,b){var c=this.getWordRange(a,b),d=this.getLine(c.end.row);while(d.charAt(c.end.column).match(/[ \t]/))c.end.column+=1;return c},this.setNewLineMode=function(a){this.doc.setNewLineMode(a)},this.getNewLineMode=function(){return this.doc.getNewLineMode()},this.$useWorker=!0,this.setUseWorker=function(a){if(this.$useWorker==a)return;this.$useWorker=a,this.$stopWorker(),a&&this.$startWorker()},this.getUseWorker=function(){return this.$useWorker},this.onReloadTokenizer=function(a){var b=a.data;this.bgTokenizer.start(b.first),this._emit("tokenizerUpdate",a)},this.$modes={},this._loadMode=function(b,c){function i(a){if(e.$modes[b])return c(e.$modes[b]);e.$modes[b]=new a.Mode,e._emit("loadmode",{name:b,mode:e.$modes[b]}),c(e.$modes[b])}function j(a){if(!d.get("packaged"))return a();var c=b.split("/").pop(),e=d.get("modePath")+"/mode-"+c+d.get("suffix");g.loadScript(e,a)}if(this.$modes[b])return c(this.$modes[b]);var e=this,f;try{f=a(b)}catch(h){}if(f)return i(f);j(function(){a([b],i)})},this.$mode=null,this.$origMode=null,this.setMode=function(a){this.$origMode=a;if(typeof a=="string"){var b=this;this._loadMode(a,function(c){if(b.$origMode!==a)return;b.setMode(c)});return}if(this.$mode===a)return;this.$mode=a,this.$stopWorker(),this.$useWorker&&this.$startWorker();var c=a.getTokenizer();if(c.addEventListener!==undefined){var d=this.onReloadTokenizer.bind(this);c.addEventListener("update",d)}if(!this.bgTokenizer){this.bgTokenizer=new m(c);var b=this;this.bgTokenizer.addEventListener("update",function(a){b._emit("tokenizerUpdate",a)})}else this.bgTokenizer.setTokenizer(c);this.bgTokenizer.setDocument(this.getDocument()),this.bgTokenizer.start(0),this.tokenRe=a.tokenRe,this.nonTokenRe=a.nonTokenRe,this.$setFolding(a.foldingRules),this._emit("changeMode")},this.$stopWorker=function(){this.$worker&&this.$worker.terminate(),this.$worker=null},this.$startWorker=function(){if(typeof Worker!="undefined"&&!a.noWorker)try{this.$worker=this.$mode.createWorker(this)}catch(b){console.log("Could not load worker"),console.log(b),this.$worker=null}else this.$worker=null},this.getMode=function(){return this.$mode},this.$scrollTop=0,this.setScrollTop=function(a){a=Math.round(Math.max(0,a));if(this.$scrollTop===a)return;this.$scrollTop=a,this._emit("changeScrollTop",a)},this.getScrollTop=function(){return this.$scrollTop},this.$scrollLeft=0,this.setScrollLeft=function(a){a=Math.round(Math.max(0,a));if(this.$scrollLeft===a)return;this.$scrollLeft=a,this._emit("changeScrollLeft",a)},this.getScrollLeft=function(){return this.$scrollLeft},this.getWidth=function(){return this.$computeWidth(),this.width},this.getScreenWidth=function(){return this.$computeWidth(),this.screenWidth},this.$computeWidth=function(a){if(this.$modified||a){this.$modified=!1;var b=this.doc.getAllLines(),c=0,d=0;for(var e=0;e<b.length;e++){var f=this.getFoldLine(e),g,h;g=b[e];if(f){var i=f.range.end;g=this.getFoldDisplayLine(f),e=i.row}h=g.length,c=Math.max(c,h),this.$useWrapMode||(d=Math.max(d,this.$getStringScreenWidth(g)[0]))}this.width=c,this.$useWrapMode?this.screenWidth=this.$wrapLimit:this.screenWidth=d}},this.getLine=function(a){return this.doc.getLine(a)},this.getLines=function(a,b){return this.doc.getLines(a,b)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(a){return this.doc.getTextRange(a)},this.insert=function(a,b){return this.doc.insert(a,b)},this.remove=function(a){return this.doc.remove(a)},this.undoChanges=function(a,b){if(!a.length)return;this.$fromUndo=!0;var c=null;for(var d=a.length-1;d!=-1;d--){var e=a[d];e.group=="doc"?(this.doc.revertDeltas(e.deltas),c=this.$getUndoSelection(e.deltas,!0,c)):e.deltas.forEach(function(a){this.addFolds(a.folds)},this)}return this.$fromUndo=!1,c&&this.$undoSelect&&!b&&this.selection.setSelectionRange(c),c},this.redoChanges=function(a,b){if(!a.length)return;this.$fromUndo=!0;var c=null;for(var d=0;d<a.length;d++){var e=a[d];e.group=="doc"&&(this.doc.applyDeltas(e.deltas),c=this.$getUndoSelection(e.deltas,!1,c))}return this.$fromUndo=!1,c&&this.$undoSelect&&!b&&this.selection.setSelectionRange(c),c},this.setUndoSelect=function(a){this.$undoSelect=a},this.$getUndoSelection=function(a,b,c){function d(a){var c=a.action=="insertText"||a.action=="insertLines";return b?!c:c}var e=a[0],f,g,h=!1;d(e)?(f=e.range.clone(),h=!0):(f=k.fromPoints(e.range.start,e.range.start),h=!1);for(var i=1;i<a.length;i++)e=a[i],d(e)?(g=e.range.start,f.compare(g.row,g.column)==-1&&f.setStart(e.range.start),g=e.range.end,f.compare(g.row,g.column)==1&&f.setEnd(e.range.end),h=!0):(g=e.range.start,f.compare(g.row,g.column)==-1&&(f=k.fromPoints(e.range.start,e.range.start)),h=!1);if(c!=null){var j=c.compareRange(f);j==1?f.setStart(c.start):j==-1&&f.setEnd(c.end)}return f},this.replace=function(a,b){return this.doc.replace(a,b)},this.moveText=function(a,b){var c=this.getTextRange(a);this.remove(a);var d=b.row,e=b.column;!a.isMultiLine()&&a.start.row==d&&a.end.column<e&&(e-=c.length);if(a.isMultiLine()&&a.end.row<d){var f=this.doc.$split(c);d-=f.length-1}var g=d+a.end.row-a.start.row,h=a.isMultiLine()?a.end.column:e+a.end.column-a.start.column,i=new k(d,e,g,h);return this.insert(i.start,c),i},this.indentRows=function(a,b,c){c=c.replace(/\t/g,this.getTabString());for(var d=a;d<=b;d++)this.insert({row:d,column:0},c)},this.outdentRows=function(a){var b=a.collapseRows(),c=new k(0,0,0,0),d=this.getTabSize();for(var e=b.start.row;e<=b.end.row;++e){var f=this.getLine(e);c.start.row=e,c.end.row=e;for(var g=0;g<d;++g)if(f.charAt(g)!=" ")break;g<d&&f.charAt(g)=="	"?(c.start.column=g,c.end.column=g+1):(c.start.column=0,c.end.column=g),this.remove(c)}},this.moveLinesUp=function(a,b){if(a<=0)return 0;var c=this.doc.removeLines(a,b);return this.doc.insertLines(a-1,c),-1},this.moveLinesDown=function(a,b){if(b>=this.doc.getLength()-1)return 0;var c=this.doc.removeLines(a,b);return this.doc.insertLines(a+1,c),1},this.duplicateLines=function(a,b){var a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b),c=this.getLines(a,b);this.doc.insertLines(a,c);var d=b-a+1;return d},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipColumnToRow=function(a,b){return b<0?0:Math.min(this.doc.getLine(a).length,b)},this.$clipPositionToDocument=function(a,b){b=Math.max(0,b);if(a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$clipRangeToDocument=function(a){a.start.row<0?(a.start.row=0,a.start.column=0):a.start.column=this.$clipColumnToRow(a.start.row,a.start.column);var b=this.doc.getLength()-1;return a.end.row>b?(a.end.row=b,a.end.column=this.doc.getLine(b).length):a.end.column=this.$clipColumnToRow(a.end.row,a.end.column),a},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0);if(a){var b=this.getLength();this.$wrapData=[];for(var c=0;c<b;c++)this.$wrapData.push([]);this.$updateWrapData(0,b-1)}this._emit("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(a,b){if(this.$wrapLimitRange.min!==a||this.$wrapLimitRange.max!==b)this.$wrapLimitRange.min=a,this.$wrapLimitRange.max=b,this.$modified=!0,this._emit("changeWrapMode")},this.adjustWrapLimit=function(a){var b=this.$constrainWrapLimit(a);return b!=this.$wrapLimit&&b>0?(this.$wrapLimit=b,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._emit("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(a){var b=this.$wrapLimitRange.min;b&&(a=Math.max(b,a));var c=this.$wrapLimitRange.max;return c&&(a=Math.min(c,a)),Math.max(1,a)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b=this.$useWrapMode,c,d=a.data.action,e=a.data.range.start.row,f=a.data.range.end.row,g=a.data.range.start,h=a.data.range.end,i=null;d.indexOf("Lines")!=-1?(d=="insertLines"?f=e+a.data.lines.length:f=e,c=a.data.lines?a.data.lines.length:f-e):c=f-e;if(c!=0)if(d.indexOf("remove")!=-1){b&&this.$wrapData.splice(e,c);var j=this.$foldData;i=this.getFoldsInRange(a.data.range),this.removeFolds(i);var k=this.getFoldLine(h.row),l=0;if(k){k.addRemoveChars(h.row,h.column,g.column-h.column),k.shiftRow(-c);var m=this.getFoldLine(e);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l<j.length;l++){var k=j[l];k.start.row>=h.row&&k.shiftRow(-c)}f=e}else{var n;if(b){n=[e,0];for(var o=0;o<c;o++)n.push([]);this.$wrapData.splice.apply(this.$wrapData,n)}var j=this.$foldData,k=this.getFoldLine(e),l=0;if(k){var p=k.range.compareInside(g.row,g.column);p==0?(k=k.split(g.row,g.column),k.shiftRow(c),k.addRemoveChars(f,0,h.column-g.column)):p==-1&&(k.addRemoveChars(e,0,h.column-g.column),k.shiftRow(c)),l=j.indexOf(k)+1}for(l;l<j.length;l++){var k=j[l];k.start.row>=e&&k.shiftRow(c)}}else{c=Math.abs(a.data.range.start.column-a.data.range.end.column),d.indexOf("remove")!=-1&&(i=this.getFoldsInRange(a.data.range),this.removeFolds(i),c=-c);var k=this.getFoldLine(e);k&&k.addRemoveChars(e,g.column,c)}return b&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),b&&this.$updateWrapData(e,f),i},this.$updateWrapData=function(a,b){var c=this.doc.getAllLines(),d=this.getTabSize(),e=this.$wrapData,g=this.$wrapLimit,h,k,l=a;b=Math.min(b,c.length-1);while(l<=b){k=this.getFoldLine(l,k);if(!k)h=this.$getDisplayTokens(f.stringTrimRight(c[l])),e[l]=this.$computeWrapSplits(h,g,d),l++;else{h=[],k.walk(function(a,b,d,e){var f;if(a){f=this.$getDisplayTokens(a,h.length),f[0]=i;for(var g=1;g<f.length;g++)f[g]=j}else f=this.$getDisplayTokens(c[b].substring(e,d),h.length);h=h.concat(f)}.bind(this),k.end.row,c[k.end.row].length+1);while(h.length!=0&&h[h.length-1]>=n)h.pop();e[k.start.row]=this.$computeWrapSplits(h,g,d),l=k.end.row+1}}};var b=1,c=2,i=3,j=4,l=9,n=10,o=11,p=12;this.$computeWrapSplits=function(a,b){function g(b){var d=a.slice(e,b),g=d.length;d.join("").replace(/12/g,function(){g-=1}).replace(/2/g,function(){g-=1}),f+=g,c.push(f),e=b}if(a.length==0)return[];var c=[],d=a.length,e=0,f=0;while(d-e>b){var h=e+b;if(a[h]>=n){while(a[h]>=n)h++;g(h);continue}if(a[h]==i||a[h]==j){for(h;h!=e-1;h--)if(a[h]==i)break;if(h>e){g(h);continue}h=e+b;for(h;h<a.length;h++)if(a[h]!=j)break;if(h==a.length)break;g(h);continue}var k=Math.max(h-10,e-1);while(h>k&&a[h]<i)h--;while(h>k&&a[h]==l)h--;if(h>k){g(++h);continue}h=e+b,g(h)}return c},this.$getDisplayTokens=function(a,d){var e=[],f;d=d||0;for(var g=0;g<a.length;g++){var h=a.charCodeAt(g);if(h==9){f=this.getScreenTabSize(e.length+d),e.push(o);for(var i=1;i<f;i++)e.push(p)}else h==32?e.push(n):h>39&&h<48||h>57&&h<64?e.push(l):h>=4352&&q(h)?e.push(b,c):e.push(b)}return e},this.$getStringScreenWidth=function(a,b,c){if(b==0)return[0,0];b==null&&(b=c+a.length*Math.max(this.getTabSize(),2)),c=c||0;var d,e;for(e=0;e<a.length;e++){d=a.charCodeAt(e),d==9?c+=this.getScreenTabSize(c):d>=4352&&q(d)?c+=2:c+=1;if(c>b)break}return[c,e]},this.getRowLength=function(a){return!this.$useWrapMode||!this.$wrapData[a]?1:this.$wrapData[a].length+1},this.getRowHeight=function(a,b){return this.getRowLength(b)*a.lineHeight},this.getScreenLastRowColumn=function(a){var b=this.screenToDocumentPosition(a,Number.MAX_VALUE);return this.documentToScreenColumn(b.row,b.column)},this.getDocumentLastRowColumn=function(a,b){var c=this.documentToScreenRow(a,b);return this.getScreenLastRowColumn(c)},this.getDocumentLastRowColumnPosition=function(a,b){var c=this.documentToScreenRow(a,b);return this.screenToDocumentPosition(c,Number.MAX_VALUE/10)},this.getRowSplitData=function(a){return this.$useWrapMode?this.$wrapData[a]:undefined},this.getScreenTabSize=function(a){return this.$tabSize-a%this.$tabSize},this.screenToDocumentRow=function(a,b){return this.screenToDocumentPosition(a,b).row},this.screenToDocumentColumn=function(a,b){return this.screenToDocumentPosition(a,b).column},this.screenToDocumentPosition=function(a,b){if(a<0)return{row:0,column:0};var c,d=0,e=0,f,g=0,h=0,i=this.$rowCache;for(var j=0;j<i.length;j++){if(!(i[j].screenRow<a))break;g=i[j].screenRow,d=i[j].docRow}var k=!i.length||j==i.length,l=this.getLength()-1,m=this.getNextFoldLine(d),n=m?m.start.row:Infinity;while(g<=a){h=this.getRowLength(d);if(g+h-1>=a||d>=l)break;g+=h,d++,d>n&&(d=m.end.row+1,m=this.getNextFoldLine(d,m),n=m?m.start.row:Infinity),k&&i.push({docRow:d,screenRow:g})}if(m&&m.start.row<=d)c=this.getFoldDisplayLine(m),d=m.start.row;else{if(g+h<=a||d>l)return{row:l,column:this.getLine(l).length};c=this.getLine(d),m=null}if(this.$useWrapMode){var o=this.$wrapData[d];o&&(f=o[a-g],a>g&&o.length&&(e=o[a-g-1]||o[o.length-1],c=c.substring(e)))}return e+=this.$getStringScreenWidth(c,b)[1],this.$useWrapMode&&e>=f&&(e=f-1),m?m.idxToPosition(e):{row:d,column:e}},this.documentToScreenPosition=function(a,b){if(typeof b=="undefined")var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d;if(this.$useWrapMode){d=this.$wrapData;if(a>d.length-1)return{row:this.getScreenLength(),column:d.length==0?0:d[d.length-1].length-1}}var e=0,f=null,g=null;g=this.getFoldAt(a,b,1),g&&(a=g.start.row,b=g.start.column);var h,i=0,j=this.$rowCache;for(var k=0;k<j.length;k++){if(!(j[k].docRow<a))break;e=j[k].screenRow,i=j[k].docRow}var l=!j.length||k==j.length,m=this.getNextFoldLine(i),n=m?m.start.row:Infinity;while(i<a){if(i>=n){h=m.end.row+1;if(h>a)break;m=this.getNextFoldLine(h,m),n=m?m.start.row:Infinity}else h=i+1;e+=this.getRowLength(i),i=h,l&&j.push({docRow:i,screenRow:e})}var o="";m&&i>=n?(o=this.getFoldDisplayLine(m,a,b),f=m.start.row):(o=this.getLine(a).substring(0,b),f=a);if(this.$useWrapMode){var p=d[f],q=0;while(o.length>=p[q])e++,q++;o=o.substring(p[q-1]||0,o.length)}return{row:e,column:this.$getStringScreenWidth(o)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null;if(!this.$useWrapMode){a=this.getLength();var c=this.$foldData;for(var d=0;d<c.length;d++)b=c[d],a-=b.end.row-b.start.row}else{var e=this.$wrapData.length,f=0,d=0,b=this.$foldData[d++],g=b?b.start.row:Infinity;while(f<e)a+=this.$wrapData[f].length+1,f++,f>g&&(f=b.end.row+1,b=this.$foldData[d++],g=b?b.start.row:Infinity)}return a}}).call(n.prototype),a("./edit_session/folding").Folding.call(n.prototype),a("./edit_session/bracket_match").BracketMatch.call(n.prototype),b.EditSession=n}),define("ace/config",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}"no use strict";var d=a("./lib/lang"),e=function(){return this}(),f={packaged:!1,workerPath:"",modePath:"",themePath:"",suffix:".js"};b.get=function(a){if(!f.hasOwnProperty(a))throw new Error("Unknown confik key: "+a);return f[a]},b.set=function(a,b){if(!f.hasOwnProperty(a))throw new Error("Unknown confik key: "+a);f[a]=b},b.all=function(){return d.copyObject(f)},b.init=function(){f.packaged=a.packaged||c.packaged||e.define&&define.packaged;if(!e.document)return"";var d={},h="",i,j=document.getElementsByTagName("script");for(var k=0;k<j.length;k++){var l=j[k],m=l.src||l.getAttribute("src");if(!m)continue;var n=l.attributes;for(var o=0,p=n.length;o<p;o++){var q=n[o];q.name.indexOf("data-ace-")===0&&(d[g(q.name.replace(/^data-ace-/,""))]=q.value)}var r=m.match(/^(?:(.*\/)ace\.js|(.*\/)ace((-uncompressed)?(-noconflict)?\.js))(?:\?|$)/);r&&(h=r[1]||r[2],i=r[3])}h&&(d.base=d.base||h,d.packaged=!0),d.suffix=d.suffix||i,d.workerPath=d.workerPath||d.base,d.modePath=d.modePath||d.base,d.themePath=d.themePath||d.base,delete d.base;for(var s in d)typeof d[s]!="undefined"&&b.set(s,d[s])}}),define("ace/lib/net",["require","exports","module"],function(a,b,c){"use strict",b.get=function(a,c){var d=b.createXhr();d.open("GET",a,!0),d.onreadystatechange=function(a){d.readyState===4&&c(d.responseText)},d.send(null)};var d=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];b.createXhr=function(){var a,b,c;if(typeof XMLHttpRequest!="undefined")return new XMLHttpRequest;for(b=0;b<3;b++){c=d[b];try{a=new ActiveXObject(c)}catch(e){}if(a){d=[c];break}}if(!a)throw new Error("createXhr(): XMLHttpRequest not available");return a},b.loadScript=function(a,b){var c=document.getElementsByTagName("head")[0],d=document.createElement("script");d.src=a,c.appendChild(d),d.onload=b}}),define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/lang"),f=a("./lib/event_emitter").EventEmitter,g=a("./range").Range,h=function(a){this.session=a,this.doc=a.getDocument(),this.clearSelection(),this.selectionLead=this.doc.createAnchor(0,0),this.selectionAnchor=this.doc.createAnchor(0,0);var b=this;this.selectionLead.on("change",function(a){b._emit("changeCursor"),b.$isEmpty||b._emit("changeSelection"),!b.$keepDesiredColumnOnChange&&a.old.column!=a.value.column&&(b.$desiredColumn=null)}),this.selectionAnchor.on("change",function(){b.$isEmpty||b._emit("changeSelection")})};(function(){d.implement(this,f),this.isEmpty=function(){return this.$isEmpty||this.selectionAnchor.row==this.selectionLead.row&&this.selectionAnchor.column==this.selectionLead.column},this.isMultiLine=function(){return this.isEmpty()?!1:this.getRange().isMultiLine()},this.getCursor=function(){return this.selectionLead.getPosition()},this.setSelectionAnchor=function(a,b){this.selectionAnchor.setPosition(a,b),this.$isEmpty&&(this.$isEmpty=!1,this._emit("changeSelection"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.selectionAnchor.getPosition()},this.getSelectionLead=function(){return this.selectionLead.getPosition()},this.shiftSelection=function(a){if(this.$isEmpty){this.moveCursorTo(this.selectionLead.row,this.selectionLead.column+a);return}var b=this.getSelectionAnchor(),c=this.getSelectionLead(),d=this.isBackwards();(!d||b.column!==0)&&this.setSelectionAnchor(b.row,b.column+a),(d||c.column!==0)&&this.$moveSelection(function(){this.moveCursorTo(c.row,c.column+a)})},this.isBackwards=function(){var a=this.selectionAnchor,b=this.selectionLead;return a.row>b.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.selectionAnchor,b=this.selectionLead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(a,this.doc.getLine(a).length),this.moveCursorTo(0,0)},this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.$desiredColumn=null},this.$moveSelection=function(a){var b=this.selectionLead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.selectWord=function(){var a=this.getCursor(),b=this.session.getWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectAWord=function(){var a=this.getCursor(),b=this.session.getAWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectLine=function(){var a=this.selectionLead.row,b,c=this.session.getFoldLine(a);c?(a=c.start.row,b=c.end.row):b=a,this.setSelectionAnchor(a,0),this.$moveSelection(function(){this.moveCursorTo(b+1,0)})},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,-1))this.moveCursorTo(b.start.row,b.start.column);else if(a.column==0)a.row>0&&this.moveCursorTo(a.row-1,this.doc.getLine(a.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column-c,a.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,1))this.moveCursorTo(b.end.row,b.end.column);else if(this.selectionLead.column==this.doc.getLine(this.selectionLead.row).length)this.selectionLead.row<this.doc.getLength()-1&&this.moveCursorTo(this.selectionLead.row+1,0);else{var c=this.session.getTabSize(),a=this.selectionLead;this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column,a.column+c).split(" ").length-1==c?this.moveCursorBy(0,c):this.moveCursorBy(0,1)}},this.moveCursorLineStart=function(){var a=this.selectionLead.row,b=this.selectionLead.column,c=this.session.documentToScreenRow(a,b),d=this.session.screenToDocumentPosition(c,0),e=this.session.getDisplayLine(a,null,d.row,d.column),f=e.match(/^\s*/);f[0].length==b?this.moveCursorTo(d.row,d.column):this.moveCursorTo(d.row,d.column+f[0].length)},this.moveCursorLineEnd=function(){var a=this.selectionLead,b=this.session.getDocumentLastRowColumnPosition(a.row,a.column);this.moveCursorTo(b.row,b.column)},this.moveCursorFileEnd=function(){var a=this.doc.getLength()-1,b=this.doc.getLine(a).length;this.moveCursorTo(a,b)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorWordRight=function(){var a=this.selectionLead.row,b=this.selectionLead.column,c=this.doc.getLine(a),d=c.substring(b),e;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var f=this.session.getFoldAt(a,b,1);if(f){this.moveCursorTo(f.end.row,f.end.column);return}if(e=this.session.nonTokenRe.exec(d))b+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,d=c.substring(b);if(b>=c.length){this.moveCursorTo(a,c.length),this.moveCursorRight(),a<this.doc.getLength()-1&&this.moveCursorWordRight();return}if(e=this.session.tokenRe.exec(d))b+=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(a,b)},this.moveCursorWordLeft=function(){var a=this.selectionLead.row,b=this.selectionLead.column,c;if(c=this.session.getFoldAt(a,b,-1)){this.moveCursorTo(c.start.row,c.start.column);return}var d=this.session.getFoldStringAt(a,b,-1);d==null&&(d=this.doc.getLine(a).substring(0,b));var f=e.stringReverse(d),g;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;if(g=this.session.nonTokenRe.exec(f))b-=this.session.nonTokenRe.lastIndex,f=f.slice(this.session.nonTokenRe.lastIndex),this.session.nonTokenRe.lastIndex=0;if(b<=0){this.moveCursorTo(a,0),this.moveCursorLeft(),a>0&&this.moveCursorWordLeft();return}if(g=this.session.tokenRe.exec(f))b-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(a,b)},this.moveCursorBy=function(a,b){var c=this.session.documentToScreenPosition(this.selectionLead.row,this.selectionLead.column);b===0&&(this.$desiredColumn?c.column=this.$desiredColumn:this.$desiredColumn=c.column);var d=this.session.screenToDocumentPosition(c.row+a,c.column);this.moveCursorTo(d.row,d.column+b,b===0)},this.moveCursorToPosition=function(a){this.moveCursorTo(a.row,a.column)},this.moveCursorTo=function(a,b,c){var d=this.session.getFoldAt(a,b,1);d&&(a=d.start.row,b=d.start.column),this.$keepDesiredColumnOnChange=!0,this.selectionLead.setPosition(a,b),this.$keepDesiredColumnOnChange=!1,c||(this.$desiredColumn=null)},this.moveCursorToScreen=function(a,b,c){var d=this.session.screenToDocumentPosition(a,b);this.moveCursorTo(d.row,d.column,c)},this.detach=function(){this.selectionLead.detach(),this.selectionAnchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(a){this.setSelectionRange(a,a.cursor==a.start),this.$desiredColumn=a.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(a){var b=this.getRange();return a?(a.start.column=b.start.column,a.start.row=b.start.row,a.end.column=b.end.column,a.end.row=b.end.row):a=b,a.cursor=this.isBackwards()?a.start:a.end,a.desiredColumn=this.$desiredColumn,a}}).call(h.prototype),b.Selection=h}),define("ace/range",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.isEqual=function(a){return this.start.row==a.start.row&&this.end.row==a.end.row&&this.start.column==a.start.column&&this.end.column==a.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),b==1?(b=this.compare(d.row,d.column),b==1?2:b==0?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:b==1?42:0)},this.comparePoint=function(a){return this.compare(a.row,a.column)},this.containsRange=function(a){return this.comparePoint(a.start)==0&&this.comparePoint(a.end)==0},this.intersectsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)||this.isStart(a,b)?!1:!0:!1},this.insideStart=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)?!1:!0:!1},this.insideEnd=function(a,b){return this.compare(a,b)==0?this.isStart(a,b)?!1:!0:!1},this.compare=function(a,b){return!this.isMultiLine()&&a===this.start.row?b<this.start.column?-1:b>this.end.column?1:0:a<this.start.row?-1:a>this.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.row<a)var e={row:a,column:0};if(this.end.row<a)var c={row:a,column:0};return d.fromPoints(e||this.start,c||this.end)},this.extend=function(a,b){var c=this.compare(a,b);if(c==0)return this;if(c==-1)var e={row:a,column:b};else var f={row:a,column:b};return d.fromPoints(e||this.start,f||this.end)},this.fixOrientation=function(){if(this.start.row<this.end.row||this.start.row==this.end.row&&this.start.column<this.end.column)return!1;var a=this.start;return this.end=this.start,this.start=a,!0},this.isEmpty=function(){return this.start.row==this.end.row&&this.start.column==this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return d.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new d(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new d(this.start.row,0,this.end.row,0)},this.toScreenRange=function(a){var b=a.documentToScreenPosition(this.start),c=a.documentToScreenPosition(this.end);return new d(b.row,b.column,c.row,c.column)}}).call(d.prototype),d.fromPoints=function(a,b){return new d(a.row,a.column,b.row,b.column)},b.Range=d}),define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode"],function(a,b,c){"use strict";var d=a("../tokenizer").Tokenizer,e=a("./text_highlight_rules").TextHighlightRules,f=a("./behaviour").Behaviour,g=a("../unicode"),h=function(){this.$tokenizer=new d((new e).getRules()),this.$behaviour=new f};(function(){this.tokenRe=new RegExp("^["+g.packages.L+g.packages.Mn+g.packages.Mc+g.packages.Nd+g.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+g.packages.L+g.packages.Mn+g.packages.Mc+g.packages.Nd+g.packages.Pc+"\\$_]|s])+","g"),this.getTokenizer=function(){return this.$tokenizer},this.toggleCommentLines=function(a,b,c,d){},this.getNextLineIndent=function(a,b,c){return""},this.checkOutdent=function(a,b,c){return!1},this.autoOutdent=function(a,b,c){},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""},this.createWorker=function(a){return null},this.highlightSelection=function(a){var b=a.session;b.$selectionOccurrences||(b.$selectionOccurrences=[]),b.$selectionOccurrences.length&&this.clearSelectionHighlight(a);var c=a.getSelectionRange();if(c.isEmpty()||c.isMultiLine())return;var d=c.start.column-1,e=c.end.column+1,f=b.getLine(c.start.row),g=f.length,h=f.substring(Math.max(d,0),Math.min(e,g));if(d>=0&&/^[\w\d]/.test(h)||e<=g&&/[\w\d]$/.test(h))return;h=f.substring(c.start.column,c.end.column);if(!/^[\w\d]+$/.test(h))return;var i=a.getCursorPosition(),j={wrap:!0,wholeWord:!0,caseSensitive:!0,needle:h},k=a.$search.getOptions();a.$search.set(j);var l=a.$search.findAll(b);l.forEach(function(a){if(!a.contains(i.row,i.column)){var c=b.addMarker(a,"ace_selected_word","text");b.$selectionOccurrences.push(c)}}),a.$search.set(k)},this.clearSelectionHighlight=function(a){if(!a.session.$selectionOccurrences)return;a.session.$selectionOccurrences.forEach(function(b){a.session.removeMarker(b)}),a.session.$selectionOccurrences=[]},this.createModeDelegates=function(a){if(!this.$embeds)return;this.$modes={};for(var b=0;b<this.$embeds.length;b++)a[this.$embeds[b]]&&(this.$modes[this.$embeds[b]]=new a[this.$embeds[b]]);var c=["toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction"];for(var b=0;b<c.length;b++)(function(a){var d=c[b],e=a[d];a[c[b]]=function(){return this.$delegator(d,arguments,e)}})(this)},this.$delegator=function(a,b,c){var d=b[0];for(var e=0;e<this.$embeds.length;e++){if(!this.$modes[this.$embeds[e]])continue;var f=d.split(this.$embeds[e]);if(!f[0]&&f[1]){b[0]=f[1];var g=this.$modes[this.$embeds[e]];return g[a].apply(g,b)}}var h=c.apply(this,b);return c?h:undefined},this.transformAction=function(a,b,c,d,e){if(this.$behaviour){var f=this.$behaviour.getBehaviours();for(var g in f)if(f[g][b]){var h=f[g][b].apply(this,arguments);if(h)return h}}}}).call(h.prototype),b.Mode=h}),define("ace/tokenizer",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b){b=b?"g"+b:"g",this.rules=a,this.regExps={},this.matchMappings={};for(var c in this.rules){var d=this.rules[c],e=d,f=[],g=0,h=this.matchMappings[c]={};for(var i=0;i<e.length;i++){e[i].regex instanceof RegExp&&(e[i].regex=e[i].regex.toString().slice(1,-1));var j=(new RegExp("(?:("+e[i].regex+")|(.))")).exec("a").length-2,k=e[i].regex.replace(/\\([0-9]+)/g,function(a,b){return"\\"+(parseInt(b,10)+g+1)});if(j>1&&e[i].token.length!==j-1)throw new Error("Matching groups and length of the token array don't match in rule #"+i+" of state "+c);h[g]={rule:i,len:j},g+=j,f.push(k)}this.regExps[c]=new RegExp("(?:("+f.join(")|(")+")|(.))",b)}};(function(){this.getLineTokens=function(a,b){var c=b,d=this.rules[c],e=this.matchMappings[c],f=this.regExps[c];f.lastIndex=0;var g,h=[],i=0,j={type:null,value:""};while(g=f.exec(a)){var k="text",l=null,m=[g[0]];for(var n=0;n<g.length-2;n++){if(g[n+1]===undefined)continue;l=d[e[n].rule],e[n].len>1&&(m=g.slice(n+2,n+1+e[n].len)),typeof l.token=="function"?k=l.token.apply(this,m):k=l.token;var o=l.next;o&&o!==c&&(c=o,d=this.rules[c],e=this.matchMappings[c],i=f.lastIndex,f=this.regExps[c],f.lastIndex=i);break}if(m[0]){typeof k=="string"&&(m=[m.join("")],k=[k]);for(var n=0;n<m.length;n++){if(!m[n])continue;(!l||l.merge||k[n]==="text")&&j.type===k[n]?j.value+=m[n]:(j.type&&h.push(j),j={type:k[n],value:m[n]})}}if(i==a.length)break;i=f.lastIndex}return j.type&&h.push(j),{tokens:h,state:c}}}).call(d.prototype),b.Tokenizer=d}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(a,b,c){"use strict";var d=a("../lib/lang"),e=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{token:"text",regex:".+"}]}};(function(){this.addRules=function(a,b){for(var c in a){var d=a[c];for(var e=0;e<d.length;e++){var f=d[e];f.next?f.next=b+f.next:f.next=b+c}this.$rules[b+c]=d}},this.getRules=function(){return this.$rules},this.embedRules=function(a,b,c,e){var f=(new a).getRules();if(e)for(var g=0;g<e.length;g++)e[g]=b+e[g];else{e=[];for(var h in f)e.push(b+h)}this.addRules(f,b);for(var g=0;g<e.length;g++)Array.prototype.unshift.apply(this.$rules[e[g]],d.deepCopy(c));this.$embeds||(this.$embeds=[]),this.$embeds.push(b)},this.getEmbeds=function(){return this.$embeds}}).call(e.prototype),b.TextHighlightRules=e}),define("ace/mode/behaviour",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.$behaviours={}};(function(){this.add=function(a,b,c){switch(undefined){case this.$behaviours:this.$behaviours={};case this.$behaviours[a]:this.$behaviours[a]={}}this.$behaviours[a][b]=c},this.addBehaviours=function(a){for(var b in a)for(var c in a[b])this.add(b,c,a[b][c])},this.remove=function(a){this.$behaviours&&this.$behaviours[a]&&delete this.$behaviours[a]},this.inherit=function(a,b){if(typeof a=="function")var c=(new a).getBehaviours(b);else var c=a.getBehaviours(b);this.addBehaviours(c)},this.getBehaviours=function(a){if(!a)return this.$behaviours;var b={};for(var c=0;c<a.length;c++)this.$behaviours[a[c]]&&(b[a[c]]=this.$behaviours[a[c]]);return b}}).call(d.prototype),b.Behaviour=d}),define("ace/unicode",["require","exports","module"],function(a,b,c){function d(a){var c=/\w{4}/g;for(var d in a)b.packages[d]=a[d].replace(c,"\\u$&")}"use strict",b.packages={},d({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=a("./range").Range,g=a("./anchor").Anchor,h=function(a){this.$lines=[],Array.isArray(a)?this.insertLines(0,a):a.length==0?this.$lines=[""]:this.insert({row:0,column:0},a)};(function(){d.implement(this,e),this.setValue=function(a){var b=this.getLength();this.remove(new f(0,0,b,this.getLine(b-1).length)),this.insert({row:0,column:0},a)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(a,b){return new g(this,a,b)},"aaa".split(/a/).length==0?this.$split=function(a){return a.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(a){return a.split(/\r\n|\r|\n/)},this.$detectNewLine=function(a){var b=a.match(/^.*?(\r\n|\r|\n)/m);b?this.$autoNewLine=b[1]:this.$autoNewLine="\n"},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";case"auto":return this.$autoNewLine}},this.$autoNewLine="\n",this.$newLineMode="auto",this.setNewLineMode=function(a){if(this.$newLineMode===a)return;this.$newLineMode=a},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(a){return a=="\r\n"||a=="\r"||a=="\n"},this.getLine=function(a){return this.$lines[a]||""},this.getLines=function(a,b){return this.$lines.slice(a,b+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(a){if(a.start.row==a.end.row)return this.$lines[a.start.row].substring(a.start.column,a.end.column);var b=[];return b.push(this.$lines[a.start.row].substring(a.start.column)),b.push.apply(b,this.getLines(a.start.row+1,a.end.row-1)),b.push(this.$lines[a.end.row].substring(0,a.end.column)),b.join(this.getNewLineCharacter())},this.$clipPosition=function(a){var b=this.getLength();return a.row>=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length),a},this.insert=function(a,b){if(!b||b.length===0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];return a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||"")),a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};return this._emit("change",{data:e}),d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};return this._emit("change",{data:d}),c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};return this._emit("change",{data:e}),d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b==c)return;var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};return this._emit("change",{data:i}),d.start},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};return this._emit("change",{data:e}),d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._emit("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b<a.length;b++){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.insertLines(d.start.row,c.lines):c.action=="insertText"?this.insert(d.start,c.text):c.action=="removeLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="removeText"&&this.remove(d)}},this.revertDeltas=function(a){for(var b=a.length-1;b>=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=b.Anchor=function(a,b,c){this.document=a,typeof c=="undefined"?this.setPosition(b.row,b.column):this.setPosition(b,c),this.$onChange=this.onChange.bind(this),a.on("change",this.$onChange)};(function(){d.implement(this,e),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(a){var b=a.data,c=b.range;if(c.start.row==c.end.row&&c.start.row!=this.row)return;if(c.start.row>this.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row<d&&(d+=c.end.row-c.start.row):b.action==="insertLines"?c.start.row<=d&&(d+=c.end.row-c.start.row):b.action=="removeText"?c.start.row==d&&c.start.column<e?c.end.column>=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row<d?(c.end.row==d&&(e=Math.max(0,e-c.end.column)+c.start.column),d-=c.end.row-c.start.row):c.end.row==d&&(d-=c.end.row-c.start.row,e=Math.max(0,e-c.end.column)+c.start.column):b.action=="removeLines"&&c.start.row<=d&&(c.end.row<=d?d-=c.end.row-c.start.row:(d=c.start.row,e=0)),this.setPosition(d,e,!0)},this.setPosition=function(a,b,c){var d;c?d={row:a,column:b}:d=this.$clipPositionToDocument(a,b);if(this.row==d.row&&this.column==d.column)return;var e={row:this.row,column:this.column};this.row=d.row,this.column=d.column,this._emit("change",{old:e,value:d})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.$clipPositionToDocument=function(a,b){var c={};return a>=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}}).call(f.prototype)}),define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=function(a,b){this.running=!1,this.lines=[],this.currentLine=0,this.tokenizer=a;var c=this;this.$worker=function(){if(!c.running)return;var a=new Date,b=c.currentLine,d=c.doc,e=0,f=d.getLength();while(c.currentLine<f){c.lines[c.currentLine]=c.$tokenizeRows(c.currentLine,c.currentLine)[0],c.currentLine++,e+=1;if(e%5==0&&new Date-a>20){c.fireUpdateEvent(b,c.currentLine-1),c.running=setTimeout(c.$worker,20);return}}c.running=!1,c.fireUpdateEvent(b,f-1)}};(function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._emit("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a,b){return this.$tokenizeRows(a,b)},this.getState=function(a){return this.$tokenizeRows(a,a)[0].state},this.$tokenizeRows=function(a,b){if(!this.doc||isNaN(a)||isNaN(b))return[{state:"start",tokens:[]}];var c=[],d="start",e=!1;a>0&&this.lines[a-1]?(d=this.lines[a-1].state,e=!0):a==0?(d="start",e=!0):this.lines.length>0&&(d=this.lines[this.lines.length-1].state);var f=this.doc.getLines(a,b);for(var g=a;g<=b;g++)if(!this.lines[g]){var h=this.tokenizer.getLineTokens(f[g-a]||"",d),d=h.state;c.push(h),e&&(this.lines[g]=h)}else{var h=this.lines[g];d=h.state,c.push(h)}return c}}).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(a,b,c){function h(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if(!d)return null;var e=d.folds;for(var f=0;f<e.length;f++){var g=e[f];if(g.range.contains(a,b)){if(c==1&&g.range.isEnd(a,b))continue;if(c==-1&&g.range.isStart(a,b))continue;return g}}},this.getFoldsInRange=function(a){a=a.clone();var b=a.start,c=a.end,d=this.$foldData,e=[];b.column+=1,c.column-=1;for(var f=0;f<d.length;f++){var g=d[f].range.compareRange(a);if(g==2)continue;if(g==-2)break;var h=d[f].folds;for(var i=0;i<h.length;i++){var j=h[i];g=j.range.compareRange(a);if(g==-2)break;if(g==2)continue;if(g==42)break;e.push(j)}}return e},this.getAllFolds=function(){function c(b){a.push(b);if(!b.subFolds)return;for(var d=0;d<b.subFolds.length;d++)c(b.subFolds[d])}var a=[],b=this.$foldData;for(var d=0;d<b.length;d++)for(var e=0;e<b[d].folds.length;e++)c(b[d].folds[e]);return a},this.getFoldStringAt=function(a,b,c,d){d=d||this.getFoldLine(a);if(!d)return null;var e={end:{column:0}},f,g;for(var h=0;h<d.folds.length;h++){g=d.folds[h];var i=g.range.compareEnd(a,b);if(i==-1){f=this.getLine(g.start.row).substring(e.end.column,g.start.column);break}if(i===0)return null;e=g}return f||(f=this.getLine(g.start.row).substring(e.end.column)),c==-1?f.substring(0,b-e.end.column):c==1?f.substring(b-e.end.column):f},this.getFoldLine=function(a,b){var c=this.$foldData,d=0;b&&(d=c.indexOf(b)),d==-1&&(d=0);for(d;d<c.length;d++){var e=c[d];if(e.start.row<=a&&e.end.row>=a)return e;if(e.end.row>a)return null}return null},this.getNextFoldLine=function(a,b){var c=this.$foldData,d=0;b&&(d=c.indexOf(b)),d==-1&&(d=0);for(d;d<c.length;d++){var e=c[d];if(e.end.row>=a)return e}return null},this.getFoldedRowCount=function(a,b){var c=this.$foldData,d=b-a+1;for(var e=0;e<c.length;e++){var f=c[e],g=f.end.row,h=f.start.row;if(g>=b){h<b&&(h>=a?d-=b-h:d=0);break}g>=a&&(h>=a?d-=g-h:d-=g-a+1)}return d},this.$addFoldLine=function(a){return this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row}),a},this.addFold=function(a,b){var c=this.$foldData,d=!1,g;a instanceof f?g=a:g=new f(b,a),this.$clipRangeToDocument(g.range);var h=g.start.row,i=g.start.column,j=g.end.row,k=g.end.column;if(g.placeholder.length<2)throw"Placeholder has to be at least 2 characters";if(h==j&&k-i<2)throw"The range has to be at least 2 characters width";var l=this.getFoldAt(h,i,1),m=this.getFoldAt(j,k,-1);if(l&&m==l)return l.addSubFold(g);if(l&&!l.range.isStart(h,i)||m&&!m.range.isEnd(j,k))throw"A fold can't intersect already existing fold"+g.range+l.range;var n=this.getFoldsInRange(g.range);n.length>0&&(this.removeFolds(n),g.subFolds=n);for(var o=0;o<c.length;o++){var p=c[o];if(j==p.start.row){p.addFold(g),d=!0;break}if(h==p.end.row){p.addFold(g),d=!0;if(!g.sameRow){var q=c[o+1];if(q&&q.start.row==j){p.merge(q);break}}break}if(j<=p.start.row)break}return d||(p=this.$addFoldLine(new e(this.$foldData,g))),this.$useWrapMode&&this.$updateWrapData(p.start.row,p.start.row),this.$modified=!0,this._emit("changeFold",{data:g}),g},this.addFolds=function(a){a.forEach(function(a){this.addFold(a)},this)},this.removeFold=function(a){var b=a.foldLine,c=b.start.row,d=b.end.row,e=this.$foldData,f=b.folds;if(f.length==1)e.splice(e.indexOf(b),1);else if(b.range.isEnd(a.end.row,a.end.column))f.pop(),b.end.row=f[f.length-1].end.row,b.end.column=f[f.length-1].end.column;else if(b.range.isStart(a.start.row,a.start.column))f.shift(),b.start.row=f[0].start.row,b.start.column=f[0].start.column;else if(a.sameRow)f.splice(f.indexOf(a),1);else{var g=b.split(a.start.row,a.start.column);f=g.folds,f.shift(),g.start.row=f[0].start.row,g.start.column=f[0].start.column}this.$useWrapMode&&this.$updateWrapData(c,d),this.$modified=!0,this._emit("changeFold",{data:a})},this.removeFolds=function(a){var b=[];for(var c=0;c<a.length;c++)b.push(a[c]);b.forEach(function(a){this.removeFold(a)},this),this.$modified=!0},this.expandFold=function(a){this.removeFold(a),a.subFolds.forEach(function(a){this.addFold(a)},this),a.subFolds=[]},this.expandFolds=function(a){a.forEach(function(a){this.expandFold(a)},this)},this.unfold=function(a,b){var c,e;a==null?c=new d(0,0,this.getLength(),0):typeof a=="number"?c=new d(a,0,a,this.getLine(a).length):"row"in a?c=d.fromPoints(a,a):c=a,e=this.getFoldsInRange(c);if(b)this.removeFolds(e);else while(e.length)this.expandFolds(e),e=this.getFoldsInRange(c)},this.isRowFolded=function(a,b){return!!this.getFoldLine(a,b)},this.getRowFoldEnd=function(a,b){var c=this.getFoldLine(a,b);return c?c.end.row:a},this.getFoldDisplayLine=function(a,b,c,d,e){d==null&&(d=a.start.row,e=0),b==null&&(b=a.end.row,c=this.getLine(b).length);var f=this.doc,g="";return a.walk(function(a,b,c,h){if(b<d)return;if(b==d){if(c<e)return;h=Math.max(e,h)}a?g+=a:g+=f.getLine(b).substring(h,c)}.bind(this),b,c),g},this.getDisplayLine=function(a,b,c,d){var e=this.getFoldLine(a);if(!e){var f;return f=this.doc.getLine(a),f.substring(d||0,b||f.length)}return this.getFoldDisplayLine(e,a,b,c,d)},this.$cloneFoldData=function(){var a=[];return a=this.$foldData.map(function(b){var c=b.folds.map(function(a){return a.clone()});return new e(a,c)}),a},this.toggleFold=function(a){var b=this.selection,c=b.getRange(),d,e;if(c.isEmpty()){var f=c.start;d=this.getFoldAt(f.row,f.column);if(d){this.expandFold(d);return}(e=this.findMatchingBracket(f))?c.comparePoint(e)==1?c.end=e:(c.start=e,c.start.column++,c.end.column--):(e=this.findMatchingBracket({row:f.row,column:f.column+1}))?(c.comparePoint(e)==1?c.end=e:c.start=e,c.start.column++):c=this.getCommentFoldRange(f.row,f.column)||c}else{var g=this.getFoldsInRange(c);if(a&&g.length){this.expandFolds(g);return}g.length==1&&(d=g[0])}d||(d=this.getFoldAt(c.start.row,c.start.column));if(d&&d.range.toString()==c.toString()){this.expandFold(d);return}var h="...";if(!c.isMultiLine()){h=this.getTextRange(c);if(h.length<4)return;h=h.trim().substring(0,2)+".."}this.addFold(h,c)},this.getCommentFoldRange=function(a,b){var c=new g(this,a,b),e=c.getCurrentToken();if(e&&/^comment|string/.test(e.type)){var f=new d,h=new RegExp(e.type.replace(/\..*/,"\\."));do e=c.stepBackward();while(e&&h.test(e.type));c.stepForward(),f.start.row=c.getCurrentTokenRow(),f.start.column=c.getCurrentTokenColumn()+2,c=new g(this,a,b);do e=c.stepForward();while(e&&h.test(e.type));return e=c.stepBackward(),f.end.row=c.getCurrentTokenRow(),f.end.column=c.getCurrentTokenColumn()+e.value.length,f}},this.foldAll=function(a,b){var c=this.foldWidgets;b=b||this.getLength();for(var d=a||0;d<b;d++){c[d]==null&&(c[d]=this.getFoldWidget(d));if(c[d]!="start")continue;var e=this.getFoldWidgetRange(d);if(e&&e.end.row<b)try{this.addFold("...",e)}catch(f){}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(a){if(!this.$foldStyles[a])throw new Error("invalid fold style: "+a+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==a)return;this.$foldStyle=a,a=="manual"&&this.unfold();var b=this.$foldMode;this.$setFolding(null),this.$setFolding(b)},this.$setFolding=function(a){if(this.$foldMode==a)return;this.$foldMode=a,this.removeListener("change",this.$updateFoldWidgets),this._emit("changeAnnotation");if(!a||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=a.getFoldWidget.bind(a,this,this.$foldStyle),this.getFoldWidgetRange=a.getFoldWidgetRange.bind(a,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets)},this.onFoldWidgetClick=function(a,b){var c=this.getFoldWidget(a),d=this.getLine(a),e=b.shiftKey,f=e||b.ctrlKey||b.altKey||b.metaKey,g;c=="end"?g=this.getFoldAt(a,0,-1):g=this.getFoldAt(a,d.length,1);if(g){f?this.removeFold(g):this.expandFold(g);return}var h=this.getFoldWidgetRange(a);if(h){if(!h.isMultiLine()){g=this.getFoldAt(h.start.row,h.start.column,1);if(g&&h.isEqual(g.range)){this.removeFold(g);return}}e||this.addFold("...",h),f&&this.foldAll(h.start.row+1,h.end.row)}else f&&this.foldAll(a+1,this.getLength()),b.target.className+=" invalid"},this.updateFoldWidgets=function(a){var b=a.data,c=b.range,d=c.start.row,e=c.end.row-d;if(e===0)this.foldWidgets[d]=null;else if(b.action=="removeText"||b.action=="removeLines")this.foldWidgets.splice(d,e+1,null);else{var f=Array(e+1);f.unshift(d,1),this.foldWidgets.splice.apply(this.foldWidgets,f)}}}"use strict";var d=a("../range").Range,e=a("./fold_line").FoldLine,f=a("./fold").Fold,g=a("../token_iterator").TokenIterator;b.Folding=h}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(a,b,c){function e(a,b){this.foldData=a,Array.isArray(b)?this.folds=b:b=this.folds=[b];var c=b[b.length-1];this.range=new d(b[0].start.row,b[0].start.column,c.end.row,c.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(a){a.setFoldLine(this)},this)}"use strict";var d=a("../range").Range;(function(){this.shiftRow=function(a){this.start.row+=a,this.end.row+=a,this.folds.forEach(function(b){b.start.row+=a,b.end.row+=a})},this.addFold=function(a){if(a.sameRow){if(a.start.row<this.startRow||a.endRow>this.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else{if(a.end.row!=this.start.row)throw"Trying to add fold to FoldRow that doesn't have a matching row";this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column}a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d=0,e=this.folds,f,g,h,i=!0;b==null&&(b=this.end.row,c=this.end.column);for(var j=0;j<e.length;j++){f=e[j],g=f.range.compareStart(b,c);if(g==-1){a(null,b,c,d,i);return}h=a(null,f.start.row,f.start.column,d,i),h=!h&&a(f.placeholder,f.start.row,f.start.column,d);if(h||g==0)return;i=!f.sameRow,d=f.end.column}a(null,b,c,d,i)},this.getNextFoldTo=function(a,b){var c,d;for(var e=0;e<this.folds.length;e++){c=this.folds[e],d=c.range.compareEnd(a,b);if(d==-1)return{fold:c,kind:"after"};if(d==0)return{fold:c,kind:"inside"}}return null},this.addRemoveChars=function(a,b,c){var d=this.getNextFoldTo(a,b),e,f;if(d){e=d.fold;if(d.kind=="inside"&&e.start.column!=b&&e.start.row!=a)throw"Moving characters inside of a fold should never be reached";if(e.start.row==a){f=this.folds;var g=f.indexOf(e);g==0&&(this.start.column+=c);for(g;g<f.length;g++){e=f[g],e.start.column+=c;if(!e.sameRow)return;e.end.column+=c}this.end.column+=c}}},this.split=function(a,b){var c=this.getNextFoldTo(a,b).fold,d=this.folds,f=this.foldData;if(!c)return null;var g=d.indexOf(c),h=d[g-1];this.end.row=h.end.row,this.end.column=h.end.column,d=d.splice(g,d.length-g);var i=new e(f,d);return f.splice(f.indexOf(this)+1,0,i),i},this.merge=function(a){var b=a.folds;for(var c=0;c<b.length;c++)this.addFold(b[c]);var d=this.foldData;d.splice(d.indexOf(a),1)},this.toString=function(){var a=[this.range.toString()+": ["];return this.folds.forEach(function(b){a.push("  "+b.toString())}),a.push("]"),a.join("\n")},this.idxToPosition=function(a){var b=0,c;for(var d=0;d<this.folds.length;d++){var c=this.folds[d];a-=c.start.column-b;if(a<0)return{row:c.start.row,column:c.start.column+a};a-=c.placeholder.length;if(a<0)return c.start;b=c.end.column}return{row:this.end.row,column:this.end.column+a}}}).call(e.prototype),b.FoldLine=e}),define("ace/edit_session/fold",["require","exports","module"],function(a,b,c){"use strict";var d=b.Fold=function(a,b){this.foldLine=null,this.placeholder=b,this.range=a,this.start=a.start,this.end=a.end,this.sameRow=a.start.row==a.end.row,this.subFolds=[]};(function(){this.toString=function(){return'"'+this.placeholder+'" '+this.range.toString()},this.setFoldLine=function(a){this.foldLine=a,this.subFolds.forEach(function(b){b.setFoldLine(a)})},this.clone=function(){var a=this.range.clone(),b=new d(a,this.placeholder);return this.subFolds.forEach(function(a){b.subFolds.push(a.clone())}),b},this.addSubFold=function(a){if(this.range.isEqual(a))return this;if(!this.range.containsRange(a))throw"A fold can't intersect already existing fold"+a.range+this.range;var b=a.range.start.row,c=a.range.start.column;for(var d=0,e=-1;d<this.subFolds.length;d++){e=this.subFolds[d].range.compare(b,c);if(e!=1)break}var f=this.subFolds[d];if(e==0)return f.addSubFold(a);var b=a.range.end.row,c=a.range.end.column;for(var g=d,e=-1;g<this.subFolds.length;g++){e=this.subFolds[g].range.compare(b,c);if(e!=1)break}var h=this.subFolds[g];if(e==0)throw"A fold can't intersect already existing fold"+a.range+this.range;var i=this.subFolds.splice(d,g-d,a);return a.setFoldLine(this.foldLine),a}}).call(d.prototype)}),define("ace/token_iterator",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b,c){this.$session=a,this.$row=b,this.$rowTokens=a.getTokens(b,b)[0].tokens;var d=a.getTokenAt(b,c);this.$tokenIndex=d?d.index:-1};(function(){this.stepBackward=function(){this.$tokenIndex-=1;while(this.$tokenIndex<0){this.$row-=1;if(this.$row<0)return this.$row=0,null;this.$rowTokens=this.$session.getTokens(this.$row,this.$row)[0].tokens,this.$tokenIndex=this.$rowTokens.length-1}return this.$rowTokens[this.$tokenIndex]},this.stepForward=function(){var a=this.$session.getLength();this.$tokenIndex+=1;while(this.$tokenIndex>=this.$rowTokens.length){this.$row+=1;if(this.$row>=a)return this.$row=a-1,null;this.$rowTokens=this.$session.getTokens(this.$row,this.$row)[0].tokens,this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var a=this.$rowTokens,b=this.$tokenIndex,c=a[b].start;if(c!==undefined)return c;c=0;while(b>0)b-=1,c+=a[b].value.length;return c}}).call(d.prototype),b.TokenIterator=d}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator"],function(a,b,c){function e(){this.findMatchingBracket=function(a){if(a.column==0)return null;var b=this.getLine(a.row).charAt(a.column-1);if(b=="")return null;var c=b.match(/([\(\[\{])|([\)\]\}])/);return c?c[1]?this.$findClosingBracket(c[1],a):this.$findOpeningBracket(c[2],a):null},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(a,b){var c=this.$brackets[a],e=1,f=new d(this,b.row,b.column),g=f.getCurrentToken();if(!g)return null;var h=new RegExp("(\\.?"+g.type.replace(".","|").replace("rparen","lparen|rparen")+")+"),i=b.column-f.getCurrentTokenColumn()-2,j=g.value;for(;;){while(i>=0){var k=j.charAt(i);if(k==c){e-=1;if(e==0)return{row:f.getCurrentTokenRow(),column:i+f.getCurrentTokenColumn()}}else k==a&&(e+=1);i-=1}do g=f.stepBackward();while(g&&!h.test(g.type));if(g==null)break;j=g.value,i=j.length-1}return null},this.$findClosingBracket=function(a,b){var c=this.$brackets[a],e=1,f=new d(this,b.row,b.column),g=f.getCurrentToken();if(!g)return null;var h=new RegExp("(\\.?"+g.type.replace(".","|").replace("lparen","lparen|rparen")+")+"),i=b.column-f.getCurrentTokenColumn();for(;;){var j=g.value,k=j.length;while(i<k){var l=j.charAt(i);if(l==c){e-=1;if(e==0)return{row:f.getCurrentTokenRow(),column:i+f.getCurrentTokenColumn()}}else l==a&&(e+=1);i+=1}do g=f.stepForward();while(g&&!h.test(g.type));if(g==null)break;i=0}return null}}"use strict";var d=a("../token_iterator").TokenIterator;b.BracketMatch=e}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(a,b,c){"use strict";var d=a("./lib/lang"),e=a("./lib/oop"),f=a("./range").Range,g=function(){this.$options={needle:"",backwards:!1,wrap:!1,caseSensitive:!1,wholeWord:!1,scope:g.ALL,regExp:!1}};g.ALL=1,g.SELECTION=2,function(){this.set=function(a){return e.mixin(this.$options,a),this},this.getOptions=function(){return d.copyObject(this.$options)},this.find=function(a){if(!this.$options.needle)return null;if(this.$options.backwards)var b=this.$backwardMatchIterator(a);else b=this.$forwardMatchIterator(a);var c=null;return b.forEach(function(a){return c=a,!0}),c},this.findAll=function(a){var b=this.$options;if(!b.needle)return[];if(b.backwards)var c=this.$backwardMatchIterator(a);else c=this.$forwardMatchIterator(a);var d=!b.start&&b.wrap&&b.scope==g.ALL;d&&(b.start={row:0,column:0});var e=[];return c.forEach(function(a){e.push(a)}),d&&(b.start=null),e},this.replace=function(a,b){var c=this.$assembleRegExp(),d=c.exec(a);return d&&d[0].length==a.length?this.$options.regExp?a.replace(c,b):b:null},this.$forwardMatchIterator=function(a){var b=this.$assembleRegExp(),c=this;return{forEach:function(d){c.$forwardLineIterator(a).forEach(function(a,e,f){e&&(a=a.substring(e));var g=[];a.replace(b,function(a){var b=arguments[arguments.length-2];return g.push({str:a,offset:e+b}),a});for(var h=0;h<g.length;h++){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$backwardMatchIterator=function(a){var b=this.$assembleRegExp(),c=this;return{forEach:function(d){c.$backwardLineIterator(a).forEach(function(a,e,f){e&&(a=a.substring(e));var g=[];a.replace(b,function(a,b){return g.push({str:a,offset:e+b}),a});for(var h=g.length-1;h>=0;h--){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$rangeFromMatch=function(a,b,c){return new f(a,b,a,b+c)},this.$assembleRegExp=function(){if(this.$options.regExp)var a=this.$options.needle;else a=d.escapeRegExp(this.$options.needle);this.$options.wholeWord&&(a="\\b"+a+"\\b");var b="g";this.$options.caseSensitive||(b+="i");var c=new RegExp(a,b);return c},this.$forwardLineIterator=function(a){function k(e){var f=a.getLine(e);return b&&e==c.end.row&&(f=f.substring(0,c.end.column)),j&&e==d.row&&(f=f.substring(0,d.column)),f}var b=this.$options.scope==g.SELECTION,c=this.$options.range||a.getSelection().getRange(),d=this.$options.start||c[b?"start":"end"],e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap,j=!1;return{forEach:function(a){var b=d.row,c=k(b),g=d.column,l=!1;j=!1;while(!a(c,g,b)){if(l)return;b++,g=0;if(b>h){if(!i)return;b=e,g=f,j=!0}b==d.row&&(l=!0),c=k(b)}}}},this.$backwardLineIterator=function(a){var b=this.$options.scope==g.SELECTION,c=this.$options.range||a.getSelection().getRange(),d=this.$options.start||c[b?"end":"start"],e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap;return{forEach:function(g){var j=d.row,k=a.getLine(j).substring(0,d.column),l=0,m=!1,n=!1;while(!g(k,l,j)){if(m)return;j--,l=0;if(j<e){if(!i)return;j=h,n=!0}j==d.row&&(m=!0),k=a.getLine(j),b&&(j==e?l=f:j==h&&(k=k.substring(0,c.end.column))),n&&j==d.row&&(l=d.column)}}}}}.call(g.prototype),b.Search=g}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../keyboard/hash_handler").HashHandler,f=a("../lib/event_emitter").EventEmitter,g=function(a,b){this.platform=a,this.commands={},this.commmandKeyBinding={},this.addCommands(b),this.setDefaultHandler("exec",function(a){a.command.exec(a.editor,a.args||{})})};d.inherits(g,e),function(){d.implement(this,f),this.exec=function(a,b,c){return typeof a=="string"&&(a=this.commands[a]),a?b&&b.$readOnly&&!a.readOnly?!1:(this._emit("exec",{editor:b,command:a,args:c}),!0):!1},this.toggleRecording=function(){if(this.$inReplay)return;return this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(a){this.macro.push([a.command,a.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(a){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording();try{this.$inReplay=!0,this.macro.forEach(function(b){typeof b=="string"?this.exec(b,a):this.exec(b[0],a,b[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(a){return a.map(function(a){return typeof a[0]!="string"&&(a[0]=a[0].name),a[1]||(a=a[0]),a})}}.call(g.prototype),b.CommandManager=g}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys"],function(a,b,c){function e(a,b){this.platform=b,this.commands={},this.commmandKeyBinding={},this.addCommands(a)}"use strict";var d=a("../lib/keys");(function(){function a(a,c,e){var f,g=0,h=b(a.toLowerCase());for(var i=0,j=h.length;i<j;i++)d.KEY_MODS[h[i]]?g|=d.KEY_MODS[h[i]]:f=h[i]||"-";return{key:f,hashId:g}}function b(a){return a.trim().split(new RegExp("[\\s ]*\\-[\\s ]*","g"),999)}this.addCommand=function(a){this.commands[a.name]&&this.removeCommand(a),this.commands[a.name]=a,a.bindKey&&this._buildKeyHash(a)},this.removeCommand=function(a){var b=typeof a=="string"?a:a.name;a=this.commands[b],delete this.commands[b];var c=this.commmandKeyBinding;for(var d in c)for(var e in c[d])c[d][e]==a&&delete c[d][e]},this.addCommands=function(a){a&&Object.keys(a).forEach(function(b){var c=a[b];if(typeof c=="string")return this.bindKey(c,b);typeof c=="function"&&(c={exec:c}),c.name||(c.name=b),this.addCommand(c)},this)},this.removeCommands=function(a){Object.keys(a).forEach(function(b){this.removeCommand(a[b])},this)},this.bindKey=function(b,c){if(!b)return;var d=this.commmandKeyBinding;b.split("|").forEach(function(b){var e=a(b,c),f=e.hashId;(d[f]||(d[f]={}))[e.key]=c})},this.bindKeys=function(a){Object.keys(a).forEach(function(b){this.bindKey(b,a[b])},this)},this._buildKeyHash=function(a){var b=a.bindKey;if(!b)return;var c=typeof b=="string"?b:b[this.platform];this.bindKey(c,a)},this.findKeyCommand=function(b,c){var d=this.commmandKeyBinding;return d[b]&&d[b][c.toLowerCase()]},this.handleKeyboard=function(a,b,c,d){return{command:this.findKeyCommand(b,c)}}}).call(e.prototype),b.HashHandler=e}),define("ace/undomanager",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.reset()};(function(){this.execute=function(a){var b=a.args[0];this.$doc=a.args[1],this.$undoStack.push(b),this.$redoStack=[]},this.undo=function(a){var b=this.$undoStack.pop(),c=null;return b&&(c=this.$doc.undoChanges(b,a),this.$redoStack.push(b)),c},this.redo=function(a){var b=this.$redoStack.pop(),c=null;return b&&(c=this.$doc.redoChanges(b,a),this.$undoStack.push(b)),c},this.reset=function(){this.$undoStack=[],this.$redoStack=[]},this.hasUndo=function(){return this.$undoStack.length>0},this.hasRedo=function(){return this.$redoStack.length>0}}).call(d.prototype),b.UndoManager=d}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/useragent","ace/config","ace/lib/net","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/lib/event_emitter","text!ace/css/editor.css"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/useragent"),h=a("./config"),i=a("./lib/net"),j=a("./layer/gutter").Gutter,k=a("./layer/marker").Marker,l=a("./layer/text").Text,m=a("./layer/cursor").Cursor,n=a("./scrollbar").ScrollBar,o=a("./renderloop").RenderLoop,p=a("./lib/event_emitter").EventEmitter,q=a("text!./css/editor.css");e.importCssString(q,"ace_editor");var r=function(a,b){var c=this;this.container=a,e.addCssClass(a,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new j(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onResize.bind(this,!0)),this.$markerBack=new k(this.content);var d=this.$textLayer=new l(this.content);this.canvas=d.element,this.$markerFront=new k(this.content),this.characterWidth=d.getCharacterWidth(),this.lineHeight=d.getLineHeight(),this.$cursorLayer=new m(this.content),this.$cursorPadding=8,this.$horizScroll=!0,this.$horizScrollAlwaysVisible=!0,this.$animatedScroll=!1,this.scrollBar=new n(a),this.scrollBar.addEventListener("scroll",function(a){c.session.setScrollTop(a.data)}),this.scrollTop=0,this.scrollLeft=0,f.addListener(this.scroller,"scroll",function(){var a=c.scroller.scrollLeft;c.scrollLeft=a,c.session.setScrollLeft(a),a==0?c.$gutter.className="ace_gutter":c.$gutter.className="ace_gutter horscroll"}),this.cursorPos={row:0,column:0},this.$textLayer.addEventListener("changeCharacterSize",function(){c.characterWidth=d.getCharacterWidth(),c.lineHeight=d.getLineHeight(),c.$updatePrintMargin(),c.onResize(!0),c.$loop.schedule(c.CHANGE_FULL)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new o(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.setPadding(4),this.$updatePrintMargin()};(function(){this.showGutter=!0,this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,d.implement(this,p),this.setSession=function(a){this.session=a,this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(a,b){b===undefined&&(b=Infinity),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRow<b&&(this.$changedLines.lastRow=b)):this.$changedLines={firstRow:a,lastRow:b},this.$loop.schedule(this.CHANGE_LINES)},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(){this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.onResize=function(a){var b=this.CHANGE_SIZE,c=this.$size,d=e.getInnerHeight(this.container);if(a||c.height!=d)c.height=d,this.scroller.style.height=d+"px",c.scrollerHeight=this.scroller.clientHeight,this.scrollBar.setHeight(c.scrollerHeight),this.session&&(this.session.setScrollTop(this.getScrollTop()),b|=this.CHANGE_FULL);var f=e.getInnerWidth(this.container);if(a||c.width!=f){c.width=f;var g=this.showGutter?this.$gutter.offsetWidth:0;this.scroller.style.left=g+"px",c.scrollerWidth=Math.max(0,f-g-this.scrollBar.getWidth()),this.scroller.style.width=c.scrollerWidth+"px";if(this.session.getUseWrapMode()&&this.adjustWrapLimit()||a)b|=this.CHANGE_FULL}this.$loop.schedule(b)},this.adjustWrapLimit=function(){var a=this.$size.scrollerWidth-this.$padding*2,b=Math.floor(a/this.characterWidth);return this.session.adjustWrapLimit(b)},this.setAnimatedScroll=function(a){this.$animatedScroll=a},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(a){this.$textLayer.setShowInvisibles(a)&&this.$loop.schedule(this.CHANGE_TEXT)},this.getShowInvisibles=function(){return this.$textLayer.showInvisibles},this.$showPrintMargin=!0,this.setShowPrintMargin=function(a){this.$showPrintMargin=a,this.$updatePrintMargin()},this.getShowPrintMargin=function(){return this.$showPrintMargin},this.$printMarginColumn=80,this.setPrintMarginColumn=function(a){this.$printMarginColumn=a,this.$updatePrintMargin()},this.getPrintMarginColumn=function(){return this.$printMarginColumn},this.getShowGutter=function(){return this.showGutter},this.setShowGutter=function(a){if(this.showGutter===a)return;this.$gutter.style.display=a?"block":"none",this.showGutter=a,this.onResize(!0)},this.$updatePrintMargin=function(){var a;if(!this.$showPrintMargin&&!this.$printMarginEl)return;this.$printMarginEl||(a=e.createElement("div"),a.className="ace_print_margin_layer",this.$printMarginEl=e.createElement("div"),this.$printMarginEl.className="ace_print_margin",a.appendChild(this.$printMarginEl),this.content.insertBefore(a,this.$textLayer.element));var b=this.$printMarginEl.style;b.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",b.visibility=this.$showPrintMargin?"visible":"hidden"},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.content},this.getTextAreaContainer=function(){return this.container},this.moveTextAreaToCursor=function(a){if(g.isIE)return;if(this.layerConfig.lastRow===0)return;var b=this.$cursorLayer.getPixelPosition();if(!b)return;var c=this.content.getBoundingClientRect(),d=this.layerConfig.offset;a.style.left=c.left+b.left+"px",a.style.top=c.top+b.top-this.scrollTop+d+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var a=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+a},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(a){this.$padding=a,this.$textLayer.setPadding(a),this.$cursorLayer.setPadding(a),this.$markerFront.setPadding(a),this.$markerBack.setPadding(a),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.getHScrollBarAlwaysVisible=function(){return this.$horizScrollAlwaysVisible},this.setHScrollBarAlwaysVisible=function(a){this.$horizScrollAlwaysVisible!=a&&(this.$horizScrollAlwaysVisible=a,(!this.$horizScrollAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL))},this.$updateScrollBar=function(){this.scrollBar.setInnerHeight(this.layerConfig.maxHeight),this.scrollBar.setScrollTop(this.scrollTop)},this.$renderChanges=function(a){if(!a||!this.session||!this.container.offsetWidth)return;(a&this.CHANGE_FULL||a&this.CHANGE_SIZE||a&this.CHANGE_TEXT||a&this.CHANGE_LINES||a&this.CHANGE_SCROLL)&&this.$computeLayerConfig();if(a&this.CHANGE_H_SCROLL){this.scroller.scrollLeft=this.scrollLeft;var b=this.scroller.scrollLeft;this.scrollLeft=b,this.session.setScrollLeft(b)}if(a&this.CHANGE_FULL){this.$textLayer.checkForSizeChanges(),this.$updateScrollBar(),this.$textLayer.update(this.layerConfig),this.showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig);return}if(a&this.CHANGE_SCROLL){this.$updateScrollBar(),a&this.CHANGE_TEXT||a&this.CHANGE_LINES?this.$textLayer.update(this.layerConfig):this.$textLayer.scrollLines(this.layerConfig),this.showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig);return}a&this.CHANGE_TEXT?(this.$textLayer.update(this.layerConfig),this.showGutter&&this.$gutterLayer.update(this.layerConfig)):a&this.CHANGE_LINES?this.$updateLines()&&(this.$updateScrollBar(),this.showGutter&&this.$gutterLayer.update(this.layerConfig)):a&this.CHANGE_GUTTER&&this.showGutter&&this.$gutterLayer.update(this.layerConfig),a&this.CHANGE_CURSOR&&this.$cursorLayer.update(this.layerConfig),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(this.layerConfig),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(this.layerConfig),a&this.CHANGE_SIZE&&this.$updateScrollBar()},this.$computeLayerConfig=function(){var a=this.session,b=this.scrollTop%this.lineHeight,c=this.$size.scrollerHeight+this.lineHeight,d=this.$getLongestLine(),e=this.$horizScrollAlwaysVisible||this.$size.scrollerWidth-d<0,f=this.$horizScroll!==e;this.$horizScroll=e,f&&(this.scroller.style.overflowX=e?"scroll":"hidden",e||this.session.setScrollLeft(0));var g=this.session.getScreenLength()*this.lineHeight;this.session.setScrollTop(Math.max(0,Math.min(this.scrollTop,g-this.$size.scrollerHeight)));var h=Math.ceil(c/this.lineHeight)-1,i=Math.max(0,Math.round((this.scrollTop-b)/this.lineHeight)),j=i+h,k,l,m={lineHeight:this.lineHeight};i=a.screenToDocumentRow(i,0);var n=a.getFoldLine(i);n&&(i=n.start.row),k=a.documentToScreenRow(i,0),l=a.getRowHeight(m,i),j=Math.min(a.screenToDocumentRow(j,0),a.getLength()-1),c=this.$size.scrollerHeight+a.getRowHeight(m,j)+l,b=this.scrollTop-k*this.lineHeight,this.layerConfig={width:d,padding:this.$padding,firstRow:i,firstRowScreen:k,lastRow:j,lineHeight:this.lineHeight,characterWidth:this.characterWidth,minHeight:c,maxHeight:g,offset:b,height:this.$size.scrollerHeight},this.$gutterLayer.element.style.marginTop=-b+"px",this.content.style.marginTop=-b+"px",this.content.style.width=d+2*this.$padding+"px",this.content.style.height=c+"px",f&&this.onResize(!0)},this.$updateLines=function(){var a=this.$changedLines.firstRow,b=this.$changedLines.lastRow;this.$changedLines=null;var c=this.layerConfig;if(c.width!=this.$getLongestLine())return this.$textLayer.update(c);if(a>c.lastRow+1)return;if(b<c.firstRow)return;if(b===Infinity){this.showGutter&&this.$gutterLayer.update(c),this.$textLayer.update(c);return}return this.$textLayer.updateLines(c,a,b),!0},this.$getLongestLine=function(){var a=this.session.getScreenWidth();return this.$textLayer.showInvisibles&&(a+=1),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(a*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(a,b){this.$gutterLayer.addGutterDecoration(a,b),this.$loop.schedule(this.CHANGE_GUTTER)},this.removeGutterDecoration=function(a,b){this.$gutterLayer.removeGutterDecoration(a,b),this.$loop.schedule(this.CHANGE_GUTTER)},this.setBreakpoints=function(a){this.$gutterLayer.setBreakpoints(a),this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(a){this.$gutterLayer.setAnnotations(a),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(a,b){this.scrollCursorIntoView(a),this.scrollCursorIntoView(b)},this.scrollCursorIntoView=function(a){if(this.$size.scrollerHeight===0)return;var b=this.$cursorLayer.getPixelPosition(a),c=b.left,d=b.top;this.scrollTop>d&&this.session.setScrollTop(d),this.scrollTop+this.$size.scrollerHeight<d+this.lineHeight&&this.session.setScrollTop(d+this.lineHeight-this.$size.scrollerHeight);var e=this.scrollLeft;e>c&&(c<this.$padding+2*this.layerConfig.characterWidth&&(c=0),this.session.setScrollLeft(c)),e+this.$size.scrollerWidth<c+this.characterWidth&&this.session.setScrollLeft(Math.round(c+this.characterWidth-this.$size.scrollerWidth))},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollLeft()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(a){this.session.setScrollTop(a*this.lineHeight)},this.STEPS=10,this.$calcSteps=function(a,b){var c=0,d=this.STEPS,e=[],f=function(a,b,c){return(a/=.5)<1?c/2*Math.pow(a,3)+b:c/2*(Math.pow(a-2,3)+2)+b};for(c=0;c<d;++c)e.push(f(c/this.STEPS,a,b-a));return e.push(b),e},this.scrollToLine=function(a,b){var c=this.$cursorLayer.getPixelPosition({row:a,column:0}),d=c.top;b&&(d-=this.$size.scrollerHeight/2);if(this.$animatedScroll&&Math.abs(d-this.scrollTop)<1e4){var e=this,f=e.$calcSteps(this.scrollTop,d);clearInterval(this.$timer),this.$timer=setInterval(function(){e.session.setScrollTop(f.shift()),f.length||clearInterval(e.$timer)},10)}else this.session.setScrollTop(d)},this.scrollToY=function(a){this.scrollTop!==a&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=a)},this.scrollToX=function(a){a<=this.$padding&&(a=0),this.scrollLeft!==a&&(this.scrollLeft=a),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollBy=function(a,b){b&&this.session.setScrollTop(this.session.getScrollTop()+b),a&&this.session.setScrollLeft(this.session.getScrollLeft()+a)},this.isScrollableBy=function(a,b){if(b<0&&this.session.getScrollTop()>0)return!0;if(b>0&&this.session.getScrollTop()+this.$size.scrollerHeight<this.layerConfig.maxHeight)return!0},this.pixelToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=Math.round((a+this.scrollLeft-c.left-this.$padding-e.getPageScrollLeft())/this.characterWidth),f=Math.floor((b+this.scrollTop-c.top-e.getPageScrollTop())/this.lineHeight);return{row:f,column:d}},this.screenToTextCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=Math.round((a+this.scrollLeft-c.left-this.$padding-e.getPageScrollLeft())/this.characterWidth),f=Math.floor((b+this.scrollTop-c.top-e.getPageScrollTop())/this.lineHeight);return this.session.screenToDocumentPosition(f,Math.max(d,0))},this.textToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=this.session.documentToScreenPosition(a,b),e=this.$padding+Math.round(d.column*this.characterWidth),f=d.row*this.lineHeight;return{pageX:c.left+e-this.scrollLeft,pageY:c.top+f-this.scrollTop}},this.visualizeFocus=function(){e.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){e.removeCssClass(this.container,"ace_focus")},this.showComposition=function(a){this.$composition||(this.$composition=e.createElement("div"),this.$composition.className="ace_composition",this.content.appendChild(this.$composition)),this.$composition.innerHTML="&#160;";var b=this.$cursorLayer.getPixelPosition(),c=this.$composition.style;c.top=b.top+"px",c.left=b.left+this.$padding+"px",c.height=this.lineHeight+"px",this.hideCursor()},this.setCompositionText=function(a){e.setInnerText(this.$composition,a)},this.hideComposition=function(){this.showCursor();if(!this.$composition)return;var a=this.$composition.style;a.top="-10000px",a.left="-10000px"},this._loadTheme=function(a,b){if(!h.get("packaged"))return b();var c=a.split("/").pop(),d=h.get("themePath")+"/theme-"+c+h.get("suffix");i.loadScript(d,b)},this.setTheme=function(b){function h(a){e.importCssString(a.cssText,a.cssClass,c.container.ownerDocument),c.$theme&&e.removeCssClass(c.container,c.$theme),c.$theme=a?a.cssClass:null,c.$theme&&e.addCssClass(c.container,c.$theme),a&&a.isDark?e.addCssClass(c.container,"ace_dark"):e.removeCssClass(c.container,"ace_dark"),c.$size&&(c.$size.width=0,c.onResize())}var c=this;this.$themeValue=b;if(!b||typeof b=="string"){var d=b||"ace/theme/textmate",f;try{f=a(d)}catch(g){}if(f)return h(f);c._loadTheme(d,function(){a([d],function(a){if(c.$themeValue!==b)return;h(a)})})}else h(b)},this.getTheme=function(){return this.$themeValue},this.setStyle=function(b){e.addCssClass(this.container,b)},this.unsetStyle=function(b){e.removeCssClass(this.container,b)},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(r.prototype),b.VirtualRenderer=r}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/dom"),e=a("../lib/oop"),f=a("../lib/event_emitter").EventEmitter,g=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_gutter-layer",a.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$breakpoints=[],this.$annotations=[],this.$decorations=[]};(function(){e.implement(this,f),this.setSession=function(a){this.session=a},this.addGutterDecoration=function(a,b){this.$decorations[a]||(this.$decorations[a]=""),this.$decorations[a]+=" "+b},this.removeGutterDecoration=function(a,b){this.$decorations[a]=this.$decorations[a].replace(" "+b,"")},this.setBreakpoints=function(a){this.$breakpoints=a.concat()},this.setAnnotations=function(a){this.$annotations=[];for(var b in a)if(a.hasOwnProperty(b)){var c=a[b];if(!c)continue;var d=this.$annotations[b]={text:[]};for(var e=0;e<c.length;e++){var f=c[e],g=f.text.replace(/"/g,"&quot;").replace(/'/g,"&#8217;").replace(/</,"&lt;");d.text.indexOf(g)===-1&&d.text.push(g);var h=f.type;h=="error"?d.className="ace_error":h=="warning"&&d.className!="ace_error"?d.className="ace_warning":h=="info"&&!d.className&&(d.className="ace_info")}}},this.update=function(a){this.$config=a;var b={className:"",text:[]},c=[],e=a.firstRow,f=a.lastRow,g=this.session.getNextFoldLine(e),h=g?g.start.row:Infinity,i=this.$showFoldWidgets&&this.session.foldWidgets;for(;;){e>h&&(e=g.end.row+1,g=this.session.getNextFoldLine(e,g),h=g?g.start.row:Infinity);if(e>f)break;var j=this.$annotations[e]||b;c.push("<div class='ace_gutter-cell",this.$decorations[e]||"",this.$breakpoints[e]?" ace_breakpoint ":" ",j.className,"' title='",j.text.join("\n"),"' style='height:",a.lineHeight,"px;'>",e+1);if(i){var k=i[e];k==null&&(k=i[e]=this.session.getFoldWidget(e)),k&&c.push("<span class='ace_fold-widget ",k,k=="start"&&e==h&&e<g.end.row?" closed":" open","'></span>")}var l=this.session.getRowLength(e)-1;while(l--)c.push("</div><div class='ace_gutter-cell' style='height:",a.lineHeight,"px'>¦");c.push("</div>"),e++}this.element=d.setInnerHtml(this.element,c.join("")),this.element.style.height=a.minHeight+"px";var m=this.element.offsetWidth;m!==this.gutterWidth&&(this.gutterWidth=m,this._emit("changeGutterWidth",m))},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(a){a?d.addCssClass(this.element,"ace_folding-enabled"):d.removeCssClass(this.element,"ace_folding-enabled"),this.$showFoldWidgets=a},this.getShowFoldWidgets=function(){return this.$showFoldWidgets}}).call(g.prototype),b.Gutter=g}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../range").Range,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(!a)return;this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c],f=d.range.clipRows(a.firstRow,a.lastRow);if(f.isEmpty())continue;f=f.toScreenRange(this.session);if(d.renderer){var g=this.$getTop(f.start.row,a),h=Math.round(this.$padding+f.start.column*a.characterWidth);d.renderer(b,f,h,g,a)}else f.isMultiLine()?d.type=="text"?this.drawTextMarker(b,f,d.clazz,a):this.drawMultiLineMarker(b,f,d.clazz,a,d.type):this.drawSingleLineMarker(b,f,d.clazz,a,null,d.type)}this.element=e.setInnerHtml(this.element,b.join(""))},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(a,b,c,e){var f=b.start.row,g=new d(f,b.start.column,f,this.session.getScreenLastRowColumn(f));this.drawSingleLineMarker(a,g,c,e,1,"text"),f=b.end.row,g=new d(f,0,f,b.end.column),this.drawSingleLineMarker(a,g,c,e,0,"text");for(f=b.start.row+1;f<b.end.row;f++)g.start.row=f,g.end.row=f,g.end.column=this.session.getScreenLastRowColumn(f),this.drawSingleLineMarker(a,g,c,e,1,"text")},this.drawMultiLineMarker=function(a,b,c,d,e){var f=e==="background"?0:this.$padding,g=d.width+2*this.$padding-f,h=d.lineHeight,i=Math.round(g-b.start.column*d.characterWidth),j=this.$getTop(b.start.row,d),k=Math.round(f+b.start.column*d.characterWidth);a.push("<div class='",c,"' style='","height:",h,"px;","width:",i,"px;","top:",j,"px;","left:",k,"px;'></div>"),j=this.$getTop(b.end.row,d),i=Math.round(b.end.column*d.characterWidth),a.push("<div class='",c,"' style='","height:",h,"px;","width:",i,"px;","top:",j,"px;","left:",f,"px;'></div>"),h=(b.end.row-b.start.row-1)*d.lineHeight;if(h<0)return;j=this.$getTop(b.start.row+1,d),a.push("<div class='",c,"' style='","height:",h,"px;","width:",g,"px;","top:",j,"px;","left:",f,"px;'></div>")},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=f==="background"?0:this.$padding,h=d.lineHeight;if(f==="background")var i=d.width;else i=Math.round((b.end.column+(e||0)-b.start.column)*d.characterWidth);var j=this.$getTop(b.start.row,d),k=Math.round(g+b.start.column*d.characterWidth);a.push("<div class='",c,"' style='","height:",h,"px;","width:",i,"px;","top:",j,"px;","left:",k,"px;'></div>")}}).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=a("../lib/useragent"),h=a("../lib/event_emitter").EventEmitter,i=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",a.appendChild(this.element),this.$characterSize=this.$measureSizes()||{width:0,height:0},this.$pollSizeChanges()};(function(){d.implement(this,h),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var a=this.$measureSizes();a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)&&(this.$characterSize=a,this._emit("changeCharacterSize",{data:a}))},this.$pollSizeChanges=function(){var a=this;this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=g.isIE||g.isOldGecko?function(){var a=1e3;if(!this.$measureNode){var b=this.$measureNode=e.createElement("div"),c=b.style;c.width=c.height="auto",c.left=c.top=-a*40+"px",c.visibility="hidden",c.position="fixed",c.overflow="visible",c.whiteSpace="nowrap",b.innerHTML=f.stringRepeat("Xy",a);if(this.element.ownerDocument.body)this.element.ownerDocument.body.appendChild(b);else{var d=this.element.parentNode;while(!e.hasCssClass(d,"ace_editor"))d=d.parentNode;d.appendChild(b)}}if(!this.element.offsetWidth)return null;var c=this.$measureNode.style,g=e.computedStyle(this.element);for(var h in this.$fontStyles)c[h]=g[h];var i={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(a*2)};return i.width==0||i.height==0?null:i}:function(){if(!this.$measureNode){var a=this.$measureNode=e.createElement("div"),b=a.style;b.width=b.height="auto",b.left=b.top="-100px",b.visibility="hidden",b.position="fixed",b.overflow="visible",b.whiteSpace="nowrap",a.innerHTML="X";var c=this.element.parentNode;while(c&&!e.hasCssClass(c,"ace_editor"))c=c.parentNode;if(!c)return this.$measureNode=null;c.appendChild(a)}var d=this.$measureNode.getBoundingClientRect(),f={height:d.height,width:d.width};return f.width==0||f.height==0?null:f},this.setSession=function(a){this.session=a},this.showInvisibles=!1,this.setShowInvisibles=function(a){return this.showInvisibles==a?!1:(this.showInvisibles=a,!0)},this.$tabStrings=[],this.$computeTabString=function(){var a=this.session.getTabSize(),b=this.$tabStrings=[0];for(var c=1;c<a+1;c++)this.showInvisibles?b.push("<span class='ace_invisible'>"+this.TAB_CHAR+(new Array(c)).join("&#160;")+"</span>"):b.push((new Array(c+1)).join("&#160;"))},this.updateLines=function(a,b,c){this.$computeTabString(),(this.config.lastRow!=a.lastRow||this.config.firstRow!=a.firstRow)&&this.scrollLines(a),this.config=a;var d=Math.max(b,a.firstRow),f=Math.min(c,a.lastRow),g=this.element.childNodes,h=0;for(var i=a.firstRow;i<d;i++){var j=this.session.getFoldLine(i);if(j){if(j.containsRow(d)){d=j.start.row;break}i=j.end.row}h++}for(var k=d;k<=f;k++){var l=g[h++];if(!l)continue;var m=[],n=this.session.getTokens(k,k);this.$renderLine(m,k,n[0].tokens,!this.$useLineGroups()),l=e.setInnerHtml(l,m.join("")),k=this.session.getRowFoldEnd(k)}},this.scrollLines=function(a){this.$computeTabString();var b=this.config;this.config=a;if(!b||b.lastRow<a.firstRow)return this.update(a);if(a.lastRow<b.firstRow)return this.update(a);var c=this.element;if(b.firstRow<a.firstRow)for(var d=this.session.getFoldedRowCount(b.firstRow,a.firstRow-1);d>0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRow<b.firstRow){var e=this.$renderLinesFragment(a,a.firstRow,b.firstRow-1);c.firstChild?c.insertBefore(e,c.firstChild):c.appendChild(e)}if(a.lastRow>b.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){var d=this.element.ownerDocument.createDocumentFragment(),f=b,g=this.session.getNextFoldLine(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:Infinity);if(f>c)break;var i=e.createElement("div"),j=[],k=this.session.getTokens(f,f);k.length==1&&this.$renderLine(j,f,k[0].tokens,!1),i.innerHTML=j.join("");if(this.$useLineGroups())i.className="ace_line_group",d.appendChild(i);else{var l=i.childNodes;while(l.length)d.appendChild(l[0])}f++}return d},this.update=function(a){this.$computeTabString(),this.config=a;var b=[],c=a.firstRow,d=a.lastRow,f=c,g=this.session.getNextFoldLine(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:Infinity);if(f>d)break;this.$useLineGroups()&&b.push("<div class='ace_line_group'>");var i=this.session.getTokens(f,f);i.length==1&&this.$renderLine(b,f,i[0].tokens,!1),this.$useLineGroups()&&b.push("</div>"),f++}this.element=e.setInnerHtml(this.element,b.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,f=/\t|&|<|( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])|[\u1100-\u115F]|[\u11A3-\u11A7]|[\u11FA-\u11FF]|[\u2329-\u232A]|[\u2E80-\u2E99]|[\u2E9B-\u2EF3]|[\u2F00-\u2FD5]|[\u2FF0-\u2FFB]|[\u3000-\u303E]|[\u3041-\u3096]|[\u3099-\u30FF]|[\u3105-\u312D]|[\u3131-\u318E]|[\u3190-\u31BA]|[\u31C0-\u31E3]|[\u31F0-\u321E]|[\u3220-\u3247]|[\u3250-\u32FE]|[\u3300-\u4DBF]|[\u4E00-\uA48C]|[\uA490-\uA4C6]|[\uA960-\uA97C]|[\uAC00-\uD7A3]|[\uD7B0-\uD7C6]|[\uD7CB-\uD7FB]|[\uF900-\uFAFF]|[\uFE10-\uFE19]|[\uFE30-\uFE52]|[\uFE54-\uFE66]|[\uFE68-\uFE6B]|[\uFF01-\uFF60]|[\uFFE0-\uFFE6]/g,h=function(a,c,d,f,h){if(a.charCodeAt(0)==32)return(new Array(a.length+1)).join("&#160;");if(a=="	"){var i=e.session.getScreenTabSize(b+f);return b+=i-1,e.$tabStrings[i]}if(a=="&")return g.isOldGecko?"&":"&amp;";if(a=="<")return"&lt;";if(a==" "){var j=e.showInvisibles?"ace_cjk ace_invisible":"ace_cjk",k=e.showInvisibles?e.SPACE_CHAR:"";return b+=1,"<span class='"+j+"' style='width:"+e.config.characterWidth*2+"px'>"+k+"</span>"}if(a.match(/[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/)){if(e.showInvisibles){var k=(new Array(a.length+1)).join(e.SPACE_CHAR);return"<span class='ace_invisible'>"+k+"</span>"}return"&#160;"}return b+=1,"<span class='ace_cjk' style='width:"+e.config.characterWidth*2+"px'>"+a+"</span>"},i=d.replace(f,h);if(!this.$textToken[c.type]){var j="ace_"+c.type.replace(/\./g," ace_"),k="";c.type=="fold"&&(k=" style='width:"+c.value.length*this.config.characterWidth+"px;' "),a.push("<span class='",j,"'",k,">",i,"</span>")}else a.push(i);return b+d.length},this.$renderLineCore=function(a,b,c,d,e){var f=0,g=0,h,i=0,j=this;!d||d.length==0?h=Number.MAX_VALUE:h=d[0],e||a.push("<div class='ace_line' style='height:",this.config.lineHeight,"px","'>");for(var k=0;k<c.length;k++){var l=c[k],m=l.value;if(f+m.length<h)i=j.$renderToken(a,i,l,m),f+=m.length;else{while(f+m.length>=h)i=j.$renderToken(a,i,l,m.substring(0,h-f)),m=m.substring(h-f),f=h,e||a.push("</div>","<div class='ace_line' style='height:",this.config.lineHeight,"px","'>"),g++,i=0,h=d[g]||Number.MAX_VALUE;m.length!=0&&(f+=m.length,i=j.$renderToken(a,i,l,m))}}this.showInvisibles&&(b!==this.session.getLength()-1?a.push("<span class='ace_invisible'>"+this.EOL_CHAR+"</span>"):a.push("<span class='ace_invisible'>"+this.EOF_CHAR+"</span>")),e||a.push("</div>")},this.$renderLine=function(a,b,c,d){if(!this.session.isRowFolded(b)){var e=this.session.getRowSplitData(b);this.$renderLineCore(a,b,c,e,d)}else this.$renderFoldLine(a,b,c,d)},this.$renderFoldLine=function(a,b,c,d){function h(a,b,c){var d=0,e=0;while(e+a[d].value.length<b){e+=a[d].value.length,d++;if(d==a.length)return}if(e!=b){var f=a[d].value.substring(b-e);f.length>c-b&&(f=f.substring(0,c-b)),g.push({type:a[d].type,value:f}),e=b+f.length,d+=1}while(e<c){var f=a[d].value;f.length+e>c&&(f=f.substring(0,c-e)),g.push({type:a[d].type,value:f}),e+=f.length,d+=1}}var e=this.session,f=e.getFoldLine(b),g=[];f.walk(function(a,b,d,e,f){a?g.push({type:"fold",value:a}):(f&&(c=this.session.getTokens(b,b)[0].tokens),c.length!=0&&h(c,e,d))}.bind(this),f.end.row,this.session.getLine(f.end.row).length);var i=this.session.$useWrapMode?this.session.$wrapData[b]:null;this.$renderLineCore(a,b,g,i,d)},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(i.prototype),b.Text=i}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../lib/dom"),e=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),this.isVisible=!1,this.cursors=[],this.cursor=this.addCursor()};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.addCursor=function(){var a=d.createElement("div"),b="ace_cursor";return this.isVisible||(b+=" ace_hidden"),this.overwrite&&(b+=" ace_overwrite"),a.className=b,this.element.appendChild(a),this.cursors.push(a),a},this.removeCursor=function(){if(this.cursors.length>1){var a=this.cursors.pop();return a.parentNode.removeChild(a),a}},this.hideCursor=function(){this.isVisible=!1;for(var a=this.cursors.length;a--;)d.addCssClass(this.cursors[a],"ace_hidden");clearInterval(this.blinkId)},this.showCursor=function(){this.isVisible=!0;for(var a=this.cursors.length;a--;)d.removeCssClass(this.cursors[a],"ace_hidden");this.element.style.visibility="",this.restartTimer()},this.restartTimer=function(){clearInterval(this.blinkId);if(!this.isVisible)return;var a=this.element;this.blinkId=setInterval(function(){a.style.visibility="hidden",setTimeout(function(){a.style.visibility="visible"},400)},1e3)},this.getPixelPosition=function(a,b){if(!this.config||!this.session)return{left:0,top:0};a||(a=this.session.selection.getCursor());var c=this.session.documentToScreenPosition(a),d=Math.round(this.$padding+c.column*this.config.characterWidth),e=(c.row-(b?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a;if(this.session.selectionMarkerCount>1){var b=this.session.$selectionMarkers,c=0,d,e=0;for(var c=b.length;c--;){d=b[c];var f=this.getPixelPosition(d.cursor,!0),g=(this.cursors[e++]||this.addCursor()).style;g.left=f.left+"px",g.top=f.top+"px",g.width=a.characterWidth+"px",g.height=a.lineHeight+"px"}if(e>1)while(this.cursors.length>e)this.removeCursor()}else{var f=this.getPixelPosition(null,!0),g=this.cursor.style;g.left=f.left+"px",g.top=f.top+"px",g.width=a.characterWidth+"px",g.height=a.lineHeight+"px";while(this.cursors.length>1)this.removeCursor()}var h=this.session.getOverwrite();h!=this.overwrite&&this.$setOverite(h),this.restartTimer()},this.$setOverite=function(a){this.overwrite=a;for(var b=this.cursors.length;b--;)a?d.addCssClass(this.cursors[b],"ace_overwrite"):d.removeCssClass(this.cursors[b],"ace_overwrite")},this.destroy=function(){clearInterval(this.blinkId)}}).call(e.prototype),b.Cursor=e}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/event_emitter").EventEmitter,h=function(a){this.element=e.createElement("div"),this.element.className="ace_sb",this.inner=e.createElement("div"),this.element.appendChild(this.inner),a.appendChild(this.element),this.width=e.scrollbarWidth(a.ownerDocument),this.element.style.width=(this.width||15)+5+"px",f.addListener(this.element,"scroll",this.onScroll.bind(this))};(function(){d.implement(this,g),this.onScroll=function(){this._emit("scroll",{data:this.element.scrollTop})},this.getWidth=function(){return this.width},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=function(a){this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.element.scrollTop=a}}).call(h.prototype),b.ScrollBar=h}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(a,b,c){"use strict";var d=a("./lib/event"),e=function(a,b){this.onRender=a,this.pending=!1,this.changes=0,this.window=b||window};(function(){this.schedule=function(a){this.changes=this.changes|a;if(!this.pending){this.pending=!0;var b=this;d.nextTick(function(){b.pending=!1;var a;while(a=b.changes)b.changes=0,b.onRender(a)},this.window)}}}).call(e.prototype),b.RenderLoop=e}),define("text!ace/css/editor.css",[],"@import url(//fonts.googleapis.com/css?family=Droid+Sans+Mono);\n\n.ace_editor {\n    position: absolute;\n    overflow: hidden;\n    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Droid Sans Mono', 'Consolas', monospace;\n    font-size: 12px;\n}\n\n.ace_scroller {\n    position: absolute;\n    overflow-x: scroll;\n    overflow-y: hidden;\n}\n\n.ace_content {\n    position: absolute;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    cursor: text;\n}\n\n.ace_composition {\n    position: absolute;\n    background: #555;\n    color: #DDD;\n    z-index: 4;\n}\n\n.ace_gutter {\n    position: absolute;\n    overflow : hidden;\n    height: 100%;\n    width: auto;\n    cursor: default;\n    z-index: 1000;\n}\n\n.ace_gutter.horscroll {\n    box-shadow: 0px 0px 20px rgba(0,0,0,0.4);\n}\n\n.ace_gutter-cell {\n    padding-left: 19px;\n    padding-right: 6px;\n}\n\n.ace_gutter-cell.ace_error {\n    background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B\");\n    background-repeat: no-repeat;\n    background-position: 2px center;\n}\n\n.ace_gutter-cell.ace_warning {\n    background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B\");\n    background-repeat: no-repeat;\n    background-position: 2px center;\n}\n\n.ace_gutter-cell.ace_info {\n    background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");\n    background-repeat: no-repeat;\n    background-position: 2px center;\n}\n\n.ace_editor .ace_sb {\n    position: absolute;\n    overflow-x: hidden;\n    overflow-y: scroll;\n    right: 0;\n}\n\n.ace_editor .ace_sb div {\n    position: absolute;\n    width: 1px;\n    left: 0;\n}\n\n.ace_editor .ace_print_margin_layer {\n    z-index: 0;\n    position: absolute;\n    overflow: hidden;\n    margin: 0;\n    left: 0;\n    height: 100%;\n    width: 100%;\n}\n\n.ace_editor .ace_print_margin {\n    position: absolute;\n    height: 100%;\n}\n\n.ace_editor textarea {\n    position: fixed;\n    z-index: 0;\n    width: 10px;\n    height: 30px;\n    opacity: 0;\n    background: transparent;\n    appearance: none;\n    -moz-appearance: none;\n    border: none;\n    resize: none;\n    outline: none;\n    overflow: hidden;\n}\n\n.ace_layer {\n    z-index: 1;\n    position: absolute;\n    overflow: hidden;\n    white-space: nowrap;\n    height: 100%;\n    width: 100%;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    /* setting pointer-events: auto; on node under the mouse, which changes\n        during scroll, will break mouse wheel scrolling in Safari */\n    pointer-events: none;\n}\n\n.ace_gutter .ace_layer {\n    position: relative;\n    min-width: 40px;\n    text-align: right;\n    pointer-events: auto;\n}\n\n.ace_text-layer {\n    color: black;\n}\n\n.ace_cjk {\n    display: inline-block;\n    text-align: center;\n}\n\n.ace_cursor-layer {\n    z-index: 4;\n}\n\n.ace_cursor {\n    z-index: 4;\n    position: absolute;\n}\n\n.ace_cursor.ace_hidden {\n    opacity: 0.2;\n}\n\n.ace_line {\n    white-space: nowrap;\n}\n\n.ace_marker-layer .ace_step {\n    position: absolute;\n    z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n    position: absolute;\n    z-index: 5;\n}\n\n.ace_marker-layer .ace_bracket {\n    position: absolute;\n    z-index: 6;\n}\n\n.ace_marker-layer .ace_active_line {\n    position: absolute;\n    z-index: 2;\n}\n\n.ace_gutter .ace_gutter_active_line{\n    background-color : #dcdcdc;\n}\n\n.ace_marker-layer .ace_selected_word {\n    position: absolute;\n    z-index: 4;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    \n    display: inline-block;\n    height: 11px;\n    margin-top: -2px;\n    vertical-align: middle;\n\n    background-image: \n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");\n    background-repeat: no-repeat, repeat-x;\n    background-position: center center, top left;\n    color: transparent;\n\n    border: 1px solid black;\n    -moz-border-radius: 2px;\n    -webkit-border-radius: 2px;\n    border-radius: 2px;\n    \n    cursor: pointer;\n    pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n    background-image: \n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");\n    background-repeat: no-repeat, repeat-x;\n    background-position: center center, top left;\n}\n\n.ace_dragging .ace_content {\n    cursor: move;\n}\n\n.ace_folding-enabled > .ace_gutter-cell {\n    padding-right: 13px;\n}\n\n.ace_fold-widget {\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n\n    margin: 0 -12px 1px 1px;\n    display: inline-block;\n    height: 14px;\n    width: 11px;\n    vertical-align: text-bottom;\n    \n    background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");\n    background-repeat: no-repeat;\n    background-position: center 5px;\n\n    border-radius: 3px;\n}\n\n.ace_fold-widget.end {\n    background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");\n}\n\n.ace_fold-widget.closed {\n    background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");\n}\n\n.ace_fold-widget:hover {\n    border: 1px solid rgba(0, 0, 0, 0.3);\n    background-color: rgba(255, 255, 255, 0.2);\n    -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n    -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n    box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n    background-position: center 4px;\n}\n\n.ace_fold-widget:active {\n    border: 1px solid rgba(0, 0, 0, 0.4);\n    background-color: rgba(0, 0, 0, 0.05);\n    -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n    -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n    box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n\n.ace_fold-widget.invalid {\n    background-color: #FFB4B4;\n    border-color: #DE5555;\n}\n"),define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor"],function(a,b,c){function j(a,b,c){return i.$options.wrap=!0,i.$options.needle=b,i.$options.backwards=c==-1,i.find(a)}function m(a,b){return a.row==b.row&&a.column==b.column}function n(a){a.$onAddRange=a.$onAddRange.bind(a),a.$onRemoveRange=a.$onRemoveRange.bind(a),a.$onMultiSelect=a.$onMultiSelect.bind(a),a.$onSingleSelect=a.$onSingleSelect.bind(a),b.onSessionChange.call(a,a),a.on("changeSession",b.onSessionChange.bind(a)),a.on("mousedown",g),a.commands.addCommands(b.commands.defaultCommands)}var d=a("./range_list").RangeList,e=a("./range").Range,f=a("./selection").Selection,g=a("./mouse/multi_select_handler").onMouseDown;b.commands=a("./commands/multi_select_commands");var h=a("./search").Search,i=new h,k=a("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(k.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(a){if(!this.inMultiSelectMode&&this.rangeCount==0){var b=this.toOrientedRange();if(!a||!a.isEqual(b))this.rangeList.add(b),this.$onAddRange(b)}if(!a)return;a.cursor||(a.cursor=a.end);var c=this.rangeList.add(a);this.$onAddRange(a),c.length&&this.$onRemoveRange(c),this.rangeCount>0&&!this.inMultiSelectMode&&(this._emit("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session))},this.toSingleRange=function(a){a=a||this.ranges[0];var b=this.rangeList.removeAll();b.length&&this.$onRemoveRange(b),a&&this.fromOrientedRange(a)},this.substractPoint=function(a){var b=this.rangeList.substractPoint(a);if(b)return this.$onRemoveRange(b),b[0]},this.mergeOverlappingRanges=function(){var a=this.rangeList.merge();a.length?this.$onRemoveRange(a):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(a){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(a),this.fromOrientedRange(a),this._emit("addRange",{range:a})},this.$onRemoveRange=function(a){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var b=this.rangeList.ranges.pop();a.push(b),this.rangeCount=0}for(var c=a.length;c--;){var d=this.ranges.indexOf(a[c]);this.ranges.splice(d,1)}this._emit("removeRange",{ranges:a}),this.rangeCount==0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._emit("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),b=b||this.ranges[0],b&&!b.isEqual(this.getRange())&&this.fromOrientedRange(b)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new d,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeList.ranges.concat()},this.splitIntoLines=function(){if(this.rangeCount>1){var a=this.rangeList.ranges,b=a[a.length-1],c=e.fromPoints(a[0].start,b.end);this.toSingleRange(),this.setSelectionRange(c,b.cursor==b.start)}else{var d=this.session.documentToScreenPosition(this.selectionLead),f=this.session.documentToScreenPosition(this.selectionAnchor),g=this.rectangularRangeBlock(d,f);g.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(a,b,c){var d=[],f=a.column<b.column;if(f)var g=a.column,h=b.column;else var g=b.column,h=a.column;var i=a.row<b.row;if(i)var j=a.row,k=b.row;else var j=b.row,k=a.row;g<0&&(g=0),j<0&&(j=0),j==k&&(c=!0);for(var l=j;l<=k;l++){var n=e.fromPoints(this.session.screenToDocumentPosition(l,g),this.session.screenToDocumentPosition(l,h));if(n.isEmpty()){if(o&&m(n.end,o))break;var o=n.end}n.cursor=f?n.start:n.end,d.push(n)}i&&d.reverse();if(!c){var p=d.length-1;while(d[p].isEmpty()&&p>0)p--;if(p>0){var q=0;while(d[q].isEmpty())q++}for(var r=p;r>=q;r--)d[r].isEmpty()&&d.splice(r,1)}return d}}.call(f.prototype);var l=a("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(a){a.cursor||(a.cursor=a.end);var b=this.getSelectionStyle();return a.marker=this.session.addMarker(a,"ace_selection",b),this.session.$selectionMarkers.push(a),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,a},this.removeSelectionMarkers=function(a){for(var b=a.length;b--;){var c=a[b];if(!c.marker)continue;this.session.removeMarker(c.marker);var d=this.session.$selectionMarkers.indexOf(c);d!=-1&&this.session.$selectionMarkers.splice(d,1)}this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.$onAddRange=function(a){this.addSelectionMarker(a.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(a){this.removeSelectionMarkers(a.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(a){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("multiselect"),this.keyBinding.addKeyboardHandler(b.commands.keyboardHandler),this.commands.on("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(a){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("multiselect"),this.keyBinding.removeKeyboardHandler(b.commands.keyboardHandler),this.commands.removeEventListener("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelectExec=function(a){var b=a.command,c=a.editor;b.multiSelectAction?b.multiSelectAction=="forEach"?c.forEachSelection(b,a.args):b.multiSelectAction=="single"?(c.exitMultiSelectMode(),b.exec(c,a.args||{})):b.multiSelectAction(c,a.args||{}):(b.exec(c,a.args||{}),c.multiSelect.addRange(c.multiSelect.toOrientedRange()),c.multiSelect.mergeOverlappingRanges()),a.preventDefault()},this.forEachSelection=function(a,b){if(this.inVirtualSelectionMode)return;var c=this.session,d=this.selection,e=d.rangeList,g=d._eventRegistry;d._eventRegistry={};var h=new f(c);this.inVirtualSelectionMode=!0;for(var i=e.ranges.length;i--;)h.fromOrientedRange(e.ranges[i]),this.selection=c.selection=h,a.exec(this,b||{}),h.toOrientedRange(e.ranges[i]);h.detach(),this.selection=c.selection=d,this.inVirtualSelectionMode=!1,d._eventRegistry=g,d.mergeOverlappingRanges(),this.onCursorChange(),this.onSelectionChange()},this.exitMultiSelectMode=function(){if(this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getCopyText=function(){var a="";if(this.inMultiSelectMode){var b=this.multiSelect.rangeList.ranges;a=[];for(var c=0;c<b.length;c++)a.push(this.session.getTextRange(b[c]));a=a.join(this.session.getDocument().getNewLineCharacter())}else this.selection.isEmpty()||(a=this.session.getTextRange(this.getSelectionRange()));return a},this.selectMoreLines=function(a,b){var c=this.selection.toOrientedRange(),d=c.cursor==c.end,f=this.session.documentToScreenPosition(c.cursor);this.selection.$desiredColumn&&(f.column=this.selection.$desiredColumn);var g=this.session.screenToDocumentPosition(f.row+a,f.column);if(!c.isEmpty())var h=this.session.documentToScreenPosition(d?c.end:c.start),i=this.session.screenToDocumentPosition(h.row+a,h.column);else var i=g;if(d){var j=e.fromPoints(g,i);j.cursor=j.start}else{var j=e.fromPoints(i,g);j.cursor=j.end}j.desiredColumn=f.column;if(!this.selection.inMultiSelectMode)this.selection.addRange(c);else if(b)var k=c.cursor;this.selection.addRange(j),k&&this.selection.substractPoint(k)},this.transposeSelections=function(a){var b=this.session,c=b.multiSelect,d=c.ranges;for(var e=d.length;e--;){var f=d[e];if(f.isEmpty()){var g=b.getWordRange(f.start.row,f.start.column);f.start.row=g.start.row,f.start.column=g.start.column,f.end.row=g.end.row,f.end.column=g.end.column}}c.mergeOverlappingRanges();var h=[];for(var e=d.length;e--;){var f=d[e];h.unshift(b.getTextRange(f))}a<0?h.unshift(h.pop()):h.push(h.shift());for(var e=d.length;e--;){var f=d[e],g=f.clone();b.replace(f,h[e]),f.start.row=g.start.row,f.start.column=g.start.column}},this.selectMore=function(a,b){var c=this.session,d=c.multiSelect,e=d.toOrientedRange();if(e.isEmpty()){var e=c.getWordRange(e.start.row,e.start.column);e.cursor=e.end,this.multiSelect.addRange(e)}var f=c.getTextRange(e),g=j(c,f,a);g&&(g.cursor=a==-1?g.start:g.end,this.multiSelect.addRange(g)),b&&this.multiSelect.substractPoint(e.cursor)}}).call(l.prototype),b.onSessionChange=function(a){var b=a.session;b.multiSelect||(b.$selectionMarkers=[],b.selection.$initRangeList(),b.multiSelect=b.selection),this.multiSelect=b.multiSelect;var c=a.oldSession;c&&(c.multiSelect&&c.multiSelect.editor==this&&(c.multiSelect.editor=null),b.multiSelect.removeEventListener("addRange",this.$onAddRange),b.multiSelect.removeEventListener("removeRange",this.$onRemoveRange),b.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect),b.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)),b.multiSelect.on("addRange",this.$onAddRange),b.multiSelect.on("removeRange",this.$onRemoveRange),b.multiSelect.on("multiSelect",this.$onMultiSelect),b.multiSelect.on("singleSelect",this.$onSingleSelect),this.inMultiSelectMode!=b.selection.inMultiSelectMode&&(b.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},b.MultiSelect=n}),define("ace/range_list",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.ranges=[]};(function(){this.comparePoints=function(a,b){return a.row-b.row||a.column-b.column},this.pointIndex=function(a,b){var c=this.ranges;for(var d=b||0;d<c.length;d++){var e=c[d],f=this.comparePoints(a,e.end);if(f>0)continue;return f==0?d:(f=this.comparePoints(a,e.start),f>=0?d:-d-1)}return-d-1},this.add=function(a){var b=this.pointIndex(a.start);b<0&&(b=-b-1);var c=this.pointIndex(a.end,b);return c<0?c=-c-1:c++,this.ranges.splice(b,c-b,a)},this.addList=function(a){var b=[];for(var c=a.length;c--;)b.push.call(b,this.add(a[c]));return b},this.substractPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges.splice(b,1)},this.merge=function(){var a=[],b=this.ranges,c=b[0],d;for(var e=1;e<b.length;e++){d=c,c=b[e];var f=this.comparePoints(d.end,c.start);if(f<0)continue;if(f==0&&!d.isEmpty()&&!c.isEmpty())continue;this.comparePoints(d.end,c.end)<0&&(d.end.row=c.end.row,d.end.column=c.end.column),b.splice(e,1),a.push(c),c=d,e--}return a},this.contains=function(a,b){return this.pointIndex({row:a,column:b})>=0},this.containsPoint=function(a){return this.pointIndex(a)>=0},this.rangeAtPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges[b]},this.clipRows=function(a,b){var c=this.ranges;if(c[0].start.row>b||c[c.length-1].start.row<a)return[];var d=this.pointIndex({row:a,column:0});d<0&&(d=-d-1);var e=this.pointIndex({row:b,column:0},d);e<0&&(e=-e-1);var f=[];for(var g=d;g<e;g++)f.push(c[g]);return f},this.removeAll=function(){return this.ranges.splice(0,this.ranges.length)},this.attach=function(a){this.session&&this.detach(),this.session=a,this.onChange=this.$onChange.bind(this),this.session.on("change",this.onChange)},this.detach=function(){if(!this.session)return;this.session.removeListener("change",this.onChange),this.session=null},this.$onChange=function(a){var b=a.data.range;if(a.data.action[0]=="i")var c=b.start,d=b.end;else var d=b.start,c=b.end;var e=c.row,f=d.row,g=f-e,h=-c.column+d.column,i=this.ranges;for(var j=0,k=i.length;j<k;j++){var l=i[j];if(l.end.row<e)continue;if(l.start.row>e)break;l.start.row==e&&l.start.column>=c.column&&(l.start.column+=h,l.start.row+=g),l.end.row==e&&l.end.column>=c.column&&(l.end.column+=h,l.end.row+=g)}if(g!=0&&j<k)for(;j<k;j++){var l=i[j];l.start.row+=g,l.end.row+=g}}}).call(d.prototype),b.RangeList=d}),define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(a,b,c){function e(a,b){return a.row==b.row&&a.column==b.column}function f(a){var b=a.domEvent,c=b.altKey,f=b.shiftKey,g=a.getAccelKey(),h=a.getButton();if(!g&&!c){if(a.editor.inMultiSelectMode)if(h==0)a.editor.exitMultiSelectMode();else if(h==2){var i=a.editor,j=i.selection.isEmpty();i.textInput.onContextMenu({x:a.clientX,y:a.clientY},j),d.capture(i.container,function(){},i.textInput.onContextMenuClose),a.stop()}return}var i=a.editor,k=i.selection,l=i.inMultiSelectMode,m=a.getDocumentPosition(),n=k.getCursor(),o=a.inSelection()||k.isEmpty()&&e(m,n),p=a.pageX,q=a.pageY,r=function(a){p=d.getDocumentX(a),q=d.getDocumentY(a)},s=function(){var a=i.renderer.pixelToScreenCoordinates(p,q),b=t.screenToDocumentPosition(a.row,a.column);if(e(v,a)&&e(b,k.selectionLead))return;v=a,i.selection.moveCursorToPosition(b),i.selection.clearSelection(),i.renderer.scrollCursorIntoView(),i.removeSelectionMarkers(x),x=k.rectangularRangeBlock(v,u),x.forEach(i.addSelectionMarker,i),i.updateSelectionMarkers()},t=i.session,u=i.renderer.pixelToScreenCoordinates(p,q),v=u;if(g&&!f&&!c&&h==0){if(!l&&o)return;l||k.addRange(k.toOrientedRange());var w=k.rangeList.rangeAtPoint(m);d.capture(i.container,function(){},function(){var a=k.toOrientedRange();w&&a.isEmpty()&&e(w.cursor,a.cursor)?k.substractPoint(a.cursor):k.addRange(a)})}else if(!f&&c&&h==0){a.stop(),l&&!g?k.toSingleRange():!l&&g&&k.addRange(),k.moveCursorToPosition(m),k.clearSelection();var x=[],y=function(a){clearInterval(A),i.removeSelectionMarkers(x);for(var b=0;b<x.length;b++)k.addRange(x[b])},z=s;d.capture(i.container,r,y);var A=setInterval(function(){z()},20);return a.preventDefault()}}var d=a("../lib/event");b.onMouseDown=f}),define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"],function(a,b,c){b.defaultCommands=[{name:"addCursorAbove",exec:function(a){a.selectMoreLines(-1)},bindKey:{win:"Ctrl-Alt-Up",mac:"Ctrl-Alt-Up"},readonly:!0},{name:"addCursorBelow",exec:function(a){a.selectMoreLines(1)},bindKey:{win:"Ctrl-Alt-Down",mac:"Ctrl-Alt-Down"},readonly:!0},{name:"addCursorAboveSkipCurrent",exec:function(a){a.selectMoreLines(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Up",mac:"Ctrl-Alt-Shift-Up"},readonly:!0},{name:"addCursorBelowSkipCurrent",exec:function(a){a.selectMoreLines(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Down",mac:"Ctrl-Alt-Shift-Down"},readonly:!0},{name:"selectMoreBefore",exec:function(a){a.selectMore(-1)},bindKey:{win:"Ctrl-Alt-Left",mac:"Ctrl-Alt-Left"},readonly:!0},{name:"selectMoreAfter",exec:function(a){a.selectMore(1)},bindKey:{win:"Ctrl-Alt-Right",mac:"Ctrl-Alt-Right"},readonly:!0},{name:"selectNextBefore",exec:function(a){a.selectMore(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Left",mac:"Ctrl-Alt-Shift-Left"},readonly:!0},{name:"selectNextAfter",exec:function(a){a.selectMore(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Right",mac:"Ctrl-Alt-Shift-Right"},readonly:!0},{name:"splitIntoLines",exec:function(a){a.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Shift-L",mac:"Ctrl-Shift-L"},readonly:!0}],b.multiEditCommands=[{name:"singleSelection",bindKey:"esc",exec:function(a){a.exitMultiSelectMode()},readonly:!0}];var d=a("../keyboard/hash_handler").HashHandler;b.keyboardHandler=new d(b.multiEditCommands)}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/config"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=a("../config"),g=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(f.get("packaged"))this.$worker=new Worker(f.get("workerPath")+"/"+c);else{var g=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(g);var h={};for(var i=0;i<b.length;i++){var j=b[i],k=this.$normalizePath(a.nameToUrl(j,null,"_").replace(/.js$/,""));h[j]=k}}this.$worker.postMessage({init:!0,tlns:h,module:d,classname:e}),this.callbackId=1,this.callbacks={};var l=this;this.$worker.onerror=function(a){throw window.console&&console.log&&console.log(a),a},this.$worker.onmessage=function(a){var b=a.data;switch(b.type){case"log":window.console&&console.log&&console.log(b.data);break;case"event":l._emit(b.name,{data:b.data});break;case"call":var c=l.callbacks[b.id];c&&(c(b.data),delete l.callbacks[b.id])}}};(function(){d.implement(this,e),this.$normalizePath=function(a){return a=a.replace(/^[a-z]+:\/\/[^\/]+/,""),a=location.protocol+"//"+location.host+(a.charAt(0)=="/"?"":location.pathname.replace(/\/[^\/]*$/,""))+"/"+a.replace(/^[\/]+/,""),a},this.terminate=function(){this._emit("terminate",{}),this.$worker.terminate(),this.$worker=null,this.$doc.removeEventListener("change",this.changeListener),this.$doc=null},this.send=function(a,b){this.$worker.postMessage({command:a,args:b})},this.call=function(a,b,c){if(c){var d=this.callbackId++;this.callbacks[d]=c,b.push(d)}this.send(a,b)},this.emit=function(a,b){try{this.$worker.postMessage({event:a,data:{data:b.data}})}catch(c){}},this.attachToDocument=function(a){this.$doc&&this.terminate(),this.$doc=a,this.call("setValue",[a.getValue()]),a.on("change",this.changeListener)},this.changeListener=function(a){a.range={start:a.data.range.start,end:a.data.range.end},this.emit("change",a)}}).call(g.prototype),b.WorkerClient=g}),define("ace/keyboard/state_handler",["require","exports","module"],function(a,b,c){function e(a){this.keymapping=this.$buildKeymappingRegex(a)}"use strict";var d=!1;e.prototype={$buildKeymappingRegex:function(a){for(var b in a)this.$buildBindingsRegex(a[b]);return a},$buildBindingsRegex:function(a){a.forEach(function(a){a.key?a.key=new RegExp("^"+a.key+"$"):Array.isArray(a.regex)?("key"in a||(a.key=new RegExp("^"+a.regex[1]+"$")),a.regex=new RegExp(a.regex.join("")+"$")):a.regex&&(a.regex=new RegExp(a.regex+"$"))})},$composeBuffer:function(a,b,c,d){if(a.state==null||a.buffer==null)a.state="start",a.buffer="";var e=[];b&1&&e.push("ctrl"),b&8&&e.push("command"),b&2&&e.push("option"),b&4&&e.push("shift"),c&&e.push(c);var f=e.join("-"),g=a.buffer+f;b!=2&&(a.buffer=g);var h={bufferToUse:g,symbolicName:f};return d&&(h.keyIdentifier=d.keyIdentifier),h},$find:function(a,b,c,e,f,g){var h={};return this.keymapping[a.state].some(function(i){var j;if(i.key&&!i.key.test(c))return!1;if(i.regex&&!(j=i.regex.exec(b)))return!1;if(i.match&&!i.match(b,e,f,c,g))return!1;if(i.disallowMatches)for(var k=0;k<i.disallowMatches.length;k++)if(!!j[i.disallowMatches[k]])return!1;if(i.exec){h.command=i.exec;if(i.params){var l;h.args={},i.params.forEach(function(a){a.match!=null&&j!=null?l=j[a.match]||a.defaultValue:l=a.defaultValue,a.type==="number"&&(l=parseInt(l)),h.args[a.name]=l})}a.buffer=""}return i.then&&(a.state=i.then,a.buffer=""),h.command==null&&(h.command="null"),d&&console.log("KeyboardStateMapper#find",i),!0}),h.command?h:(a.buffer="",!1)},handleKeyboard:function(a,b,c,e,f){if(b==0||c!=""&&c!=String.fromCharCode(0)){var g=this.$composeBuffer(a,b,c,f),h=g.bufferToUse,i=g.symbolicName,j=g.keyIdentifier;return g=this.$find(a,h,i,b,c,j),d&&console.log("KeyboardStateMapper#match",h,i,g),g}return null}},b.matchCharacterOnly=function(a,b,c,d){return b==0?!0:b==4&&c.length==1?!0:!1},b.StateHandler=e}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(a,b,c){"use strict";var d=a("./range").Range,e=a("./lib/event_emitter").EventEmitter,f=a("./lib/oop"),g=function(a,b,c,d,e,f){var g=this;this.length=b,this.session=a,this.doc=a.getDocument(),this.mainClass=e,this.othersClass=f,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=d,this.$onCursorChange=function(){setTimeout(function(){g.onCursorChange()})},this.$pos=c;var h=a.getUndoManager().$undoStack||a.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=h.length,this.setup(),a.selection.on("changeCursor",this.$onCursorChange)};(function(){f.implement(this,e),this.setup=function(){var a=this,b=this.doc,c=this.session,e=this.$pos;this.pos=b.createAnchor(e.row,e.column),this.markerId=c.addMarker(new d(e.row,e.column,e.row,e.column+this.length),this.mainClass,null,!1),this.pos.on("change",function(b){c.removeMarker(a.markerId),a.markerId=c.addMarker(new d(b.value.row,b.value.column,b.value.row,b.value.column+a.length),a.mainClass,null,!1)}),this.others=[],this.$others.forEach(function(c){var d=b.createAnchor(c.row,c.column);a.others.push(d)}),c.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var a=this.session,b=this;this.othersActive=!0,this.others.forEach(function(c){c.markerId=a.addMarker(new d(c.row,c.column,c.row,c.column+b.length),b.othersClass,null,!1),c.on("change",function(e){a.removeMarker(c.markerId),c.markerId=a.addMarker(new d(e.value.row,e.value.column,e.value.row,e.value.column+b.length),b.othersClass,null,!1)})})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var a=0;a<this.others.length;a++)this.session.removeMarker(this.others[a].markerId)},this.onUpdate=function(a){var b=a.data,c=b.range;if(c.start.row!==c.end.row)return;if(c.start.row!==this.pos.row)return;if(this.$updating)return;this.$updating=!0;var e=b.action==="insertText"?c.end.column-c.start.column:c.start.column-c.end.column;if(c.start.column>=this.pos.column&&c.start.column<=this.pos.column+this.length+1){var f=c.start.column-this.pos.column;this.length+=e;if(!this.session.$fromUndo){if(b.action==="insertText")for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};h.row===c.start.row&&c.start.column<h.column&&(i.column+=e),this.doc.insert(i,b.text)}else if(b.action==="removeText")for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};h.row===c.start.row&&c.start.column<h.column&&(i.column+=e),this.doc.remove(new d(i.row,i.column,i.row,i.column-e))}c.start.column===this.pos.column&&b.action==="insertText"?setTimeout(function(){this.pos.setPosition(this.pos.row,this.pos.column-e);for(var a=0;a<this.others.length;a++){var b=this.others[a],d={row:b.row,column:b.column-e};b.row===c.start.row&&c.start.column<b.column&&(d.column+=e),b.setPosition(d.row,d.column)}}.bind(this),0):c.start.column===this.pos.column&&b.action==="removeText"&&setTimeout(function(){for(var a=0;a<this.others.length;a++){var b=this.others[a];b.row===c.start.row&&c.start.column<b.column&&b.setPosition(b.row,b.column-e)}}.bind(this),0)}this.pos._emit("change",{value:this.pos});for(var g=0;g<this.others.length;g++)this.others[g]._emit("change",{value:this.others[g]})}this.$updating=!1},this.onCursorChange=function(a){if(this.$updating)return;var b=this.session.selection.getCursor();b.row===this.pos.row&&b.column>=this.pos.column&&b.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",a)):(this.hideOtherMarkers(),this._emit("cursorLeave",a))},this.detach=function(){this.session.removeMarker(this.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.pos.detach();for(var a=0;a<this.others.length;a++)this.others[a].detach();this.session.setUndoSelect(!0)},this.cancel=function(){if(this.$undoStackDepth===-1)throw Error("Canceling placeholders only supported with undo manager attached to session.");var a=this.session.getUndoManager(),b=(a.$undoStack||a.$undostack).length-this.$undoStackDepth;for(var c=0;c<b;c++)a.undo(!0)}}).call(g.prototype),b.PlaceHolder=g}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict",b.isDark=!1,b.cssClass="ace-tm",b.cssText=".ace-tm .ace_editor {  border: 2px solid rgb(159, 159, 159);}.ace-tm .ace_editor.ace_focus {  border: 2px solid #327fbd;}.ace-tm .ace_gutter {  background: #e8e8e8;  color: #333;}.ace-tm .ace_print_margin {  width: 1px;  background: #e8e8e8;}.ace-tm .ace_fold {    background-color: #6B72E6;}.ace-tm .ace_text-layer {  cursor: text;}.ace-tm .ace_cursor {  border-left: 1px solid black;}.ace-tm .ace_cursor.ace_overwrite {  border-left: 0px;  border-bottom: 1px solid black;}        .ace-tm .ace_line .ace_invisible {  color: rgb(191, 191, 191);}.ace-tm .ace_line .ace_storage,.ace-tm .ace_line .ace_keyword {  color: blue;}.ace-tm .ace_line .ace_constant {  color: rgb(197, 6, 11);}.ace-tm .ace_line .ace_constant.ace_buildin {  color: rgb(88, 72, 246);}.ace-tm .ace_line .ace_constant.ace_language {  color: rgb(88, 92, 246);}.ace-tm .ace_line .ace_constant.ace_library {  color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_invalid {  background-color: rgb(153, 0, 0);  color: white;}.ace-tm .ace_line .ace_support.ace_function {  color: rgb(60, 76, 114);}.ace-tm .ace_line .ace_support.ace_constant {  color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_support.ace_type,.ace-tm .ace_line .ace_support.ace_class {  color: rgb(109, 121, 222);}.ace-tm .ace_line .ace_keyword.ace_operator {  color: rgb(104, 118, 135);}.ace-tm .ace_line .ace_string {  color: rgb(3, 106, 7);}.ace-tm .ace_line .ace_comment {  color: rgb(76, 136, 107);}.ace-tm .ace_line .ace_comment.ace_doc {  color: rgb(0, 102, 255);}.ace-tm .ace_line .ace_comment.ace_doc.ace_tag {  color: rgb(128, 159, 191);}.ace-tm .ace_line .ace_constant.ace_numeric {  color: rgb(0, 0, 205);}.ace-tm .ace_line .ace_variable {  color: rgb(49, 132, 149);}.ace-tm .ace_line .ace_xml_pe {  color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {  color: #0000A2;}.ace-tm .ace_markup.ace_markupine {    text-decoration:underline;}.ace-tm .ace_markup.ace_heading {  color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list {  color:rgb(185, 6, 144);}.ace-tm .ace_marker-layer .ace_selection {  background: rgb(181, 213, 255);}.ace-tm .ace_marker-layer .ace_step {  background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {  background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {  margin: -1px 0 0 -1px;  border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active_line {  background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_marker-layer .ace_selected_word {  background: rgb(250, 250, 255);  border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_meta.ace_tag {  color:rgb(28, 2, 255);}.ace-tm .ace_string.ace_regex {  color: rgb(255, 0, 0)}";var d=a("../lib/dom");d.importCssString(b.cssText,b.cssClass)});
+(function(){function g(a){if(typeof requirejs!="undefined"){var e=b.define;b.define=function(a,b,c){return typeof c!="function"?e.apply(this,arguments):e(a,b,function(a,d,e){return b[2]=="module"&&(e.packaged=!0),c.apply(this,arguments)})},b.define.packaged=!0;return}var f=function(a,b){return d("",a,b)};f.packaged=!0;var g=b;a&&(b[a]||(b[a]={}),g=b[a]),g.define&&(c.original=g.define),g.define=c,g.require&&(d.original=g.require),g.require=f}var a="",b=function(){return this}(),c=function(a,b,d){if(typeof a!="string"){c.original?c.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(d=b),c.modules||(c.modules={}),c.modules[a]=d},d=function(a,b,c){if(Object.prototype.toString.call(b)==="[object Array]"){var e=[];for(var g=0,h=b.length;g<h;++g){var i=f(a,b[g]);if(!i&&d.original)return d.original.apply(window,arguments);e.push(i)}c&&c.apply(null,e)}else{if(typeof b=="string"){var j=f(a,b);return!j&&d.original?d.original.apply(window,arguments):(c&&c(),j)}if(d.original)return d.original.apply(window,arguments)}},e=function(a,b){if(b.indexOf("!")!==-1){var c=b.split("!");return e(a,c[0])+"!"+e(a,c[1])}if(b.charAt(0)=="."){var d=a.split("/").slice(0,-1).join("/");b=d+"/"+b;while(b.indexOf(".")!==-1&&f!=b){var f=b;b=b.replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return b},f=function(a,b){b=e(a,b);var f=c.modules[b];if(!f)return null;if(typeof f=="function"){var g={},h={id:b,uri:"",exports:g,packaged:!0},i=function(a,c){return d(b,a,c)},j=f(i,g,h);return g=j||h.exports,c.modules[b]=g,g}return f};g(a)})(),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/multi_select","ace/worker/worker_client","ace/keyboard/hash_handler","ace/keyboard/state_handler","ace/placeholder","ace/config","ace/theme/textmate"],function(a,b,c){"use strict",a("./lib/fixoldbrowsers");var d=a("./lib/dom"),e=a("./lib/event"),f=a("./editor").Editor,g=a("./edit_session").EditSession,h=a("./undomanager").UndoManager,i=a("./virtual_renderer").VirtualRenderer,j=a("./multi_select").MultiSelect;a("./worker/worker_client"),a("./keyboard/hash_handler"),a("./keyboard/state_handler"),a("./placeholder"),a("./config").init(),b.edit=function(b){typeof b=="string"&&(b=document.getElementById(b));var c=new g(d.getInnerText(b));c.setUndoManager(new h),b.innerHTML="";var k=new f(new i(b,a("./theme/textmate")));new j(k),k.setSession(c);var l={};return l.document=c,l.editor=k,k.resize(),e.addListener(window,"resize",function(){k.resize()}),b.env=l,k.env=l,k}}),define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(a,b,c){"use strict",a("./regexp"),a("./es5-shim")}),define("ace/lib/regexp",["require","exports","module"],function(a,b,c){function g(a){return(a.global?"g":"")+(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.extended?"x":"")+(a.sticky?"y":"")}function h(a,b,c){if(Array.prototype.indexOf)return a.indexOf(b,c);for(var d=c||0;d<a.length;d++)if(a[d]===b)return d;return-1}"use strict";var d={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},e=d.exec.call(/()??/,"")[1]===undefined,f=function(){var a=/^/g;return d.test.call(a,""),!a.lastIndex}();RegExp.prototype.exec=function(a){var b=d.exec.apply(this,arguments),c,i;if(typeof a=="string"&&b){!e&&b.length>1&&h(b,"")>-1&&(i=RegExp(this.source,d.replace.call(g(this),"g","")),d.replace.call(a.slice(b.index),i,function(){for(var a=1;a<arguments.length-2;a++)arguments[a]===undefined&&(b[a]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var j=1;j<b.length;j++)c=this._xregexp.captureNames[j-1],c&&(b[c]=b[j]);!f&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--}return b},f||(RegExp.prototype.test=function(a){var b=d.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b})}),define("ace/lib/es5-shim",["require","exports","module"],function(a,b,c){function p(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=g.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,h=c.apply(f,d.concat(g.call(arguments)));return h!==null&&Object(h)===h?h:f}return c.apply(b,d.concat(g.call(arguments)))};return e});var d=Function.prototype.call,e=Array.prototype,f=Object.prototype,g=e.slice,h=d.bind(f.toString),i=d.bind(f.hasOwnProperty),j,k,l,m,n;if(n=i(f,"__defineGetter__"))j=d.bind(f.__defineGetter__),k=d.bind(f.__defineSetter__),l=d.bind(f.__lookupGetter__),m=d.bind(f.__lookupSetter__);Array.isArray||(Array.isArray=function(b){return h(b)=="[object Array]"}),Array.prototype.forEach||(Array.prototype.forEach=function(b){var c=G(this),d=arguments[1],e=0,f=c.length>>>0;if(h(b)!="[object Function]")throw new TypeError;while(e<f)e in c&&b.call(d,c[e],e,c),e++}),Array.prototype.map||(Array.prototype.map=function(b){var c=G(this),d=c.length>>>0,e=Array(d),f=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var g=0;g<d;g++)g in c&&(e[g]=b.call(f,c[g],g,c));return e}),Array.prototype.filter||(Array.prototype.filter=function(b){var c=G(this),d=c.length>>>0,e=[],f=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var g=0;g<d;g++)g in c&&b.call(f,c[g],g,c)&&e.push(c[g]);return e}),Array.prototype.every||(Array.prototype.every=function(b){var c=G(this),d=c.length>>>0,e=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var f=0;f<d;f++)if(f in c&&!b.call(e,c[f],f,c))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(b){var c=G(this),d=c.length>>>0,e=arguments[1];if(h(b)!="[object Function]")throw new TypeError;for(var f=0;f<d;f++)if(f in c&&b.call(e,c[f],f,c))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(b){var c=G(this),d=c.length>>>0;if(h(b)!="[object Function]")throw new TypeError;if(!d&&arguments.length==1)throw new TypeError;var e=0,f;if(arguments.length>=2)f=arguments[1];else do{if(e in c){f=c[e++];break}if(++e>=d)throw new TypeError}while(!0);for(;e<d;e++)e in c&&(f=b.call(void 0,f,c[e],e,c));return f}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(b){var c=G(this),d=c.length>>>0;if(h(b)!="[object Function]")throw new TypeError;if(!d&&arguments.length==1)throw new TypeError;var e,f=d-1;if(arguments.length>=2)e=arguments[1];else do{if(f in c){e=c[f--];break}if(--f<0)throw new TypeError}while(!0);do f in this&&(e=b.call(void 0,e,c[f],f,c));while(f--);return e}),Array.prototype.indexOf||(Array.prototype.indexOf=function(b){var c=G(this),d=c.length>>>0;if(!d)return-1;var e=0;arguments.length>1&&(e=E(arguments[1])),e=e>=0?e:Math.max(0,d+e);for(;e<d;e++)if(e in c&&c[e]===b)return e;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(b){var c=G(this),d=c.length>>>0;if(!d)return-1;var e=d-1;arguments.length>1&&(e=Math.min(e,E(arguments[1]))),e=e>=0?e:d-Math.abs(e);for(;e>=0;e--)if(e in c&&b===c[e])return e;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(b){return b.__proto__||(b.constructor?b.constructor.prototype:f)});if(!Object.getOwnPropertyDescriptor){var o="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(b,c){if(typeof b!="object"&&typeof b!="function"||b===null)throw new TypeError(o+b);if(!i(b,c))return;var d,e,g;d={enumerable:!0,configurable:!0};if(n){var h=b.__proto__;b.__proto__=f;var e=l(b,c),g=m(b,c);b.__proto__=h;if(e||g)return e&&(d.get=e),g&&(d.set=g),d}return d.value=b[c],d}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(b){return Object.keys(b)}),Object.create||(Object.create=function(b,c){var d;if(b===null)d={__proto__:null};else{if(typeof b!="object")throw new TypeError("typeof prototype["+typeof b+"] != 'object'");var e=function(){};e.prototype=b,d=new e,d.__proto__=b}return c!==void 0&&Object.defineProperties(d,c),d});if(Object.defineProperty){var q=p({}),r=typeof document=="undefined"||p(document.createElement("div"));if(!q||!r)var s=Object.defineProperty}if(!Object.defineProperty||s){var t="Property description must be an object: ",u="Object.defineProperty called on non-object: ",v="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(b,c,d){if(typeof b!="object"&&typeof b!="function"||b===null)throw new TypeError(u+b);if(typeof d!="object"&&typeof d!="function"||d===null)throw new TypeError(t+d);if(s)try{return s.call(Object,b,c,d)}catch(e){}if(i(d,"value"))if(n&&(l(b,c)||m(b,c))){var g=b.__proto__;b.__proto__=f,delete b[c],b[c]=d.value,b.__proto__=g}else b[c]=d.value;else{if(!n)throw new TypeError(v);i(d,"get")&&j(b,c,d.get),i(d,"set")&&k(b,c,d.set)}return b}}Object.defineProperties||(Object.defineProperties=function(b,c){for(var d in c)i(c,d)&&Object.defineProperty(b,d,c[d]);return b}),Object.seal||(Object.seal=function(b){return b}),Object.freeze||(Object.freeze=function(b){return b});try{Object.freeze(function(){})}catch(w){Object.freeze=function(b){return function(c){return typeof c=="function"?c:b(c)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(b){return b}),Object.isSealed||(Object.isSealed=function(b){return!1}),Object.isFrozen||(Object.isFrozen=function(b){return!1}),Object.isExtensible||(Object.isExtensible=function(b){if(Object(b)===b)throw new TypeError;var c="";while(i(b,c))c+="?";b[c]=!0;var d=i(b,c);return delete b[c],d});if(!Object.keys){var x=!0,y=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],z=y.length;for(var A in{toString:null})x=!1;Object.keys=function H(a){if(typeof a!="object"&&typeof a!="function"||a===null)throw new TypeError("Object.keys called on a non-object");var H=[];for(var b in a)i(a,b)&&H.push(b);if(x)for(var c=0,d=z;c<d;c++){var e=y[c];i(a,e)&&H.push(e)}return H}}if(!Date.prototype.toISOString||(new Date(-621987552e5)).toISOString().indexOf("-000001")===-1)Date.prototype.toISOString=function(){var b,c,d,e;if(!isFinite(this))throw new RangeError;b=[this.getUTCMonth()+1,this.getUTCDate(),this.getUTCHours(),this.getUTCMinutes(),this.getUTCSeconds()],e=this.getUTCFullYear(),e=(e<0?"-":e>9999?"+":"")+("00000"+Math.abs(e)).slice(0<=e&&e<=9999?-4:-6),c=b.length;while(c--)d=b[c],d<10&&(b[c]="0"+d);return e+"-"+b.slice(0,2).join("-")+"T"+b.slice(2).join(":")+"."+("000"+this.getUTCMilliseconds()).slice(-3)+"Z"};Date.now||(Date.now=function(){return(new Date).getTime()}),Date.prototype.toJSON||(Date.prototype.toJSON=function(b){if(typeof this.toISOString!="function")throw new TypeError;return this.toISOString()}),Date.parse("+275760-09-13T00:00:00.000Z")!==864e13&&(Date=function(a){var b=function e(b,c,d,f,g,h,i){var j=arguments.length;if(this instanceof a){var k=j==1&&String(b)===b?new a(e.parse(b)):j>=7?new a(b,c,d,f,g,h,i):j>=6?new a(b,c,d,f,g,h):j>=5?new a(b,c,d,f,g):j>=4?new a(b,c,d,f):j>=3?new a(b,c,d):j>=2?new a(b,c):j>=1?new a(b):new a;return k.constructor=e,k}return a.apply(this,arguments)},c=new RegExp("^(\\d{4}|[+-]\\d{6})(?:-(\\d{2})(?:-(\\d{2})(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:Z|(?:([-+])(\\d{2}):(\\d{2})))?)?)?)?$");for(var d in a)b[d]=a[d];return b.now=a.now,b.UTC=a.UTC,b.prototype=a.prototype,b.prototype.constructor=b,b.parse=function(d){var e=c.exec(d);if(e){e.shift();for(var f=1;f<7;f++)e[f]=+(e[f]||(f<3?1:0)),f==1&&e[f]--;var g=+e.pop(),h=+e.pop(),i=e.pop(),j=0;if(i){if(h>23||g>59)return NaN;j=(h*60+g)*6e4*(i=="+"?-1:1)}var k=+e[0];return 0<=k&&k<=99?(e[0]=k+400,a.UTC.apply(this,e)+j-126227808e5):a.UTC.apply(this,e)+j}return a.parse.apply(this,arguments)},b}(Date));var B="	\n\f\r   ᠎              \u2028\u2029";if(!String.prototype.trim||B.trim()){B="["+B+"]";var C=new RegExp("^"+B+B+"*"),D=new RegExp(B+B+"*$");String.prototype.trim=function(){return String(this).replace(C,"").replace(D,"")}}var E=function(a){return a=+a,a!==a?a=0:a!==0&&a!==1/0&&a!==-Infinity&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a},F="a"[0]!="a",G=function(a){if(a==null)throw new TypeError;return F&&typeof a=="string"&&a?a.split(""):Object(a)}}),define("ace/lib/dom",["require","exports","module"],function(a,b,c){"use strict";var d="http://www.w3.org/1999/xhtml";b.createElement=function(a,b){return document.createElementNS?document.createElementNS(b||d,a):document.createElement(a)},b.setText=function(a,b){a.innerText!==undefined&&(a.innerText=b),a.textContent!==undefined&&(a.textContent=b)},b.hasCssClass=function(a,b){var c=a.className.split(/\s+/g);return c.indexOf(b)!==-1},b.addCssClass=function(a,c){b.hasCssClass(a,c)||(a.className+=" "+c)},b.removeCssClass=function(a,b){var c=a.className.split(/\s+/g);for(;;){var d=c.indexOf(b);if(d==-1)break;c.splice(d,1)}a.className=c.join(" ")},b.toggleCssClass=function(a,b){var c=a.className.split(/\s+/g),d=!0;for(;;){var e=c.indexOf(b);if(e==-1)break;d=!1,c.splice(e,1)}return d&&c.push(b),a.className=c.join(" "),d},b.setCssClass=function(a,c,d){d?b.addCssClass(a,c):b.removeCssClass(a,c)},b.hasCssString=function(a,b){var c=0,d;b=b||document;if(b.createStyleSheet&&(d=b.styleSheets)){while(c<d.length)if(d[c++].owningElement.id===a)return!0}else if(d=b.getElementsByTagName("style"))while(c<d.length)if(d[c++].id===a)return!0;return!1},b.importCssString=function(c,e,f){f=f||document;if(e&&b.hasCssString(e,f))return null;var g;if(f.createStyleSheet)g=f.createStyleSheet(),g.cssText=c,e&&(g.owningElement.id=e);else{g=f.createElementNS?f.createElementNS(d,"style"):f.createElement("style"),g.appendChild(f.createTextNode(c)),e&&(g.id=e);var h=f.getElementsByTagName("head")[0]||f.documentElement;h.appendChild(g)}},b.importCssStylsheet=function(a,c){if(c.createStyleSheet)c.createStyleSheet(a);else{var d=b.createElement("link");d.rel="stylesheet",d.href=a;var e=c.getElementsByTagName("head")[0]||c.documentElement;e.appendChild(d)}},b.getInnerWidth=function(a){return parseInt(b.computedStyle(a,"paddingLeft"),10)+parseInt(b.computedStyle(a,"paddingRight"),10)+a.clientWidth},b.getInnerHeight=function(a){return parseInt(b.computedStyle(a,"paddingTop"),10)+parseInt(b.computedStyle(a,"paddingBottom"),10)+a.clientHeight},window.pageYOffset!==undefined?(b.getPageScrollTop=function(){return window.pageYOffset},b.getPageScrollLeft=function(){return window.pageXOffset}):(b.getPageScrollTop=function(){return document.body.scrollTop},b.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?b.computedStyle=function(a,b){return b?(window.getComputedStyle(a,"")||{})[b]||"":window.getComputedStyle(a,"")||{}}:b.computedStyle=function(a,b){return b?a.currentStyle[b]:a.currentStyle},b.scrollbarWidth=function(a){var c=b.createElement("p");c.style.width="100%",c.style.minWidth="0px",c.style.height="200px";var d=b.createElement("div"),e=d.style;e.position="absolute",e.left="-10000px",e.overflow="hidden",e.width="200px",e.minWidth="0px",e.height="150px",d.appendChild(c);var f=a.body||a.documentElement;f.appendChild(d);var g=c.offsetWidth;e.overflow="scroll";var h=c.offsetWidth;return g==h&&(h=d.clientWidth),f.removeChild(d),g-h},b.setInnerHtml=function(a,b){var c=a.cloneNode(!1);return c.innerHTML=b,a.parentNode.replaceChild(c,a),c},b.setInnerText=function(a,b){var c=a.ownerDocument;c.body&&"textContent"in c.body?a.textContent=b:a.innerText=b},b.getInnerText=function(a){var b=a.ownerDocument;return b.body&&"textContent"in b.body?a.textContent:a.innerText||a.textContent||""},b.getParentWindow=function(a){return a.defaultView||a.parentWindow}}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent","ace/lib/dom"],function(a,b,c){function g(a,b,c){var f=0;e.isOpera&&e.isMac?f=0|(b.metaKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.ctrlKey?8:0):f=0|(b.ctrlKey?1:0)|(b.altKey?2:0)|(b.shiftKey?4:0)|(b.metaKey?8:0);if(c in d.MODIFIER_KEYS){switch(d.MODIFIER_KEYS[c]){case"Alt":f=2;break;case"Shift":f=4;break;case"Ctrl":f=1;break;default:f=8}c=0}return f&8&&(c==91||c==93)&&(c=0),!!f||c in d.FUNCTION_KEYS||c in d.PRINTABLE_KEYS?a(b,f,c):!1}"use strict";var d=a("./keys"),e=a("./useragent"),f=a("./dom");b.addListener=function(a,b,c){if(a.addEventListener)return a.addEventListener(b,c,!1);if(a.attachEvent){var d=function(){c(window.event)};c._wrapper=d,a.attachEvent("on"+b,d)}},b.removeListener=function(a,b,c){if(a.removeEventListener)return a.removeEventListener(b,c,!1);a.detachEvent&&a.detachEvent("on"+b,c._wrapper||c)},b.stopEvent=function(a){return b.stopPropagation(a),b.preventDefault(a),!1},b.stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},b.preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},b.getDocumentX=function(a){return a.clientX?a.clientX+f.getPageScrollLeft():a.pageX},b.getDocumentY=function(a){return a.clientY?a.clientY+f.getPageScrollTop():a.pageY},b.getButton=function(a){return a.type=="dblclick"?0:a.type=="contextmenu"?2:a.preventDefault?a.button:{1:0,2:2,4:1}[a.button]},document.documentElement.setCapture?b.capture=function(a,c,d){function e(a){return c(a),b.stopPropagation(a)}function g(e){c(e),f||(f=!0,d(e)),b.removeListener(a,"mousemove",c),b.removeListener(a,"mouseup",g),b.removeListener(a,"losecapture",g),a.releaseCapture()}var f=!1;b.addListener(a,"mousemove",c),b.addListener(a,"mouseup",g),b.addListener(a,"losecapture",g),a.setCapture()}:b.capture=function(a,b,c){function d(a){b(a),a.stopPropagation()}function e(a){b&&b(a),c&&c(a),document.removeEventListener("mousemove",d,!0),document.removeEventListener("mouseup",e,!0),a.stopPropagation()}document.addEventListener("mousemove",d,!0),document.addEventListener("mouseup",e,!0)},b.addMouseWheelListener=function(a,c){var d=8,e=function(a){a.wheelDelta!==undefined?a.wheelDeltaX!==undefined?(a.wheelX=-a.wheelDeltaX/d,a.wheelY=-a.wheelDeltaY/d):(a.wheelX=0,a.wheelY=-a.wheelDelta/d):a.axis&&a.axis==a.HORIZONTAL_AXIS?(a.wheelX=(a.detail||0)*5,a.wheelY=0):(a.wheelX=0,a.wheelY=(a.detail||0)*5),c(a)};b.addListener(a,"DOMMouseScroll",e),b.addListener(a,"mousewheel",e)},b.addMultiMouseDownListener=function(a,c,d,f,g){var h=0,i,j,k=function(a){h+=1,h==1&&(i=a.clientX,j=a.clientY,setTimeout(function(){h=0},f||600));var e=b.getButton(a)==c;if(!e||Math.abs(a.clientX-i)>5||Math.abs(a.clientY-j)>5)h=0;h==d&&(h=0,g(a));if(e)return b.preventDefault(a)};b.addListener(a,"mousedown",k),e.isOldIE&&b.addListener(a,"dblclick",k)},b.addCommandKeyListener=function(a,c){var d=b.addListener;if(e.isOldGecko||e.isOpera){var f=null;d(a,"keydown",function(a){f=a.keyCode}),d(a,"keypress",function(a){return g(c,a,f)})}else{var h=null;d(a,"keydown",function(a){return h=a.keyIdentifier||a.keyCode,g(c,a,a.keyCode)})}};if(window.postMessage){var h=1;b.nextTick=function(a,c){c=c||window;var d="zero-timeout-message-"+h;b.addListener(c,"message",function e(f){f.data==d&&(b.stopPropagation(f),b.removeListener(c,"message",e),a())}),c.postMessage(d,"*")}}else b.nextTick=function(a,b){b=b||window,window.setTimeout(a,0)}}),define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(a,b,c){"use strict";var d=a("./oop"),e=function(){var a={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:'"'}};for(var b in a.FUNCTION_KEYS){var c=a.FUNCTION_KEYS[b].toUpperCase();a[c]=parseInt(b,10)}return d.mixin(a,a.MODIFIER_KEYS),d.mixin(a,a.PRINTABLE_KEYS),d.mixin(a,a.FUNCTION_KEYS),a}();d.mixin(b,e),b.keyCodeToString=function(a){return(e[a]||String.fromCharCode(a)).toLowerCase()}}),define("ace/lib/oop",["require","exports","module"],function(a,b,c){"use strict",b.inherits=function(){var a=function(){};return function(b,c){a.prototype=c.prototype,b.super_=c.prototype,b.prototype=new a,b.prototype.constructor=b}}(),b.mixin=function(a,b){for(var c in b)a[c]=b[c]},b.implement=function(a,c){b.mixin(a,c)}}),define("ace/lib/useragent",["require","exports","module"],function(a,b,c){"use strict";var d=(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase(),e=navigator.userAgent;b.isWin=d=="win",b.isMac=d=="mac",b.isLinux=d=="linux",b.isIE=navigator.appName=="Microsoft Internet Explorer"&&parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]),b.isOldIE=b.isIE&&b.isIE<9,b.isGecko=b.isMozilla=window.controllers&&window.navigator.product==="Gecko",b.isOldGecko=b.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4,b.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",b.isWebKit=parseFloat(e.split("WebKit/")[1])||undefined,b.isChrome=parseFloat(e.split(" Chrome/")[1])||undefined,b.isAIR=e.indexOf("AdobeAIR")>=0,b.isIPad=e.indexOf("iPad")>=0,b.isTouchPad=e.indexOf("TouchPad")>=0,b.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},b.getOS=function(){return b.isMac?b.OS.MAC:b.isLinux?b.OS.LINUX:b.OS.WINDOWS}}),define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands"],function(a,b,c){"use strict",a("./lib/fixoldbrowsers");var d=a("./lib/oop"),e=a("./lib/lang"),f=a("./lib/useragent"),g=a("./keyboard/textinput").TextInput,h=a("./mouse/mouse_handler").MouseHandler,i=a("./mouse/fold_handler").FoldHandler,j=a("./keyboard/keybinding").KeyBinding,k=a("./edit_session").EditSession,l=a("./search").Search,m=a("./range").Range,n=a("./lib/event_emitter").EventEmitter,o=a("./commands/command_manager").CommandManager,p=a("./commands/default_commands").commands,q=function(a,b){var c=a.getContainerElement();this.container=c,this.renderer=a,this.textInput=new g(a.getTextAreaContainer(),this),this.keyBinding=new j(this),f.isIPad||(this.$mouseHandler=new h(this),new i(this)),this.$blockScrolling=0,this.$search=(new l).set({wrap:!0}),this.commands=new o(f.isMac?"mac":"win",p),this.setSession(b||new k(""))};(function(){d.implement(this,n),this.setKeyboardHandler=function(a){this.keyBinding.setKeyboardHandler(a)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session==a)return;if(this.session){var b=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange),this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange),this.session.removeEventListener("changeLeftTop",this.$onScrollLeftChange);var c=this.session.getSelection();c.removeEventListener("changeCursor",this.$onCursorChange),c.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=a,this.$onDocumentChange=this.onDocumentChange.bind(this),a.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.updateText.bind(this.renderer),a.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange),this.selection=a.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull(),this._emit("changeSession",{session:a,oldSession:b})},this.getSession=function(){return this.session},this.getSelection=function(){return this.selection},this.resize=function(){this.renderer.onResize()},this.setTheme=function(a){this.renderer.setTheme(a)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.setFontSize=function(a){this.container.style.fontSize=a,this.renderer.updateFontSize()},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session.findMatchingBracket(a.getCursorPosition());if(b){var c=new m(b.row,b.column,b.row,b.column+1);a.session.$bracketHighlight=a.session.addMarker(c,"ace_bracket","text")}},10)},this.focus=function(){var a=this;setTimeout(function(){a.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus")},this.onBlur=function(){this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur")},this.onDocumentChange=function(a){var b=a.data,c=b.range,d;c.start.row==c.end.row&&b.action!="insertLines"&&b.action!="removeLines"?d=c.end.row:d=Infinity,this.renderer.updateLines(c.start.row,d),this._emit("change",a),this.onCursorChange()},this.onTokenizerUpdate=function(a){var b=a.data;this.renderer.updateLines(b.first,b.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.renderer.updateCursor(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.renderer.moveTextAreaToCursor(this.textInput.getElement()),this.$highlightBrackets(),this.$updateHighlightActiveLine()},this.$updateHighlightActiveLine=function(){var a=this.getSession();a.$highlightLineMarker&&a.removeMarker(a.$highlightLineMarker),typeof this.$lastrow=="number"&&this.renderer.removeGutterDecoration(this.$lastrow,"ace_gutter_active_line"),a.$highlightLineMarker=null,this.$lastrow=null;if(this.getHighlightActiveLine()){var b=this.getCursorPosition(),c=this.session.getFoldLine(b.row);if(this.getSelectionStyle()!="line"||!this.selection.isMultiLine()){var d;c?d=new m(c.start.row,0,c.end.row+1,0):d=new m(b.row,0,b.row+1,0),a.$highlightLineMarker=a.addMarker(d,"ace_active_line","background")}this.renderer.addGutterDecoration(this.$lastrow=b.row,"ace_gutter_active_line")}},this.onSelectionChange=function(a){var b=this.getSession();b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null;if(!this.selection.isEmpty()){var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}else this.$updateHighlightActiveLine();this.$highlightSelectedWord&&this.session.getMode().highlightSelection(this)},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.setBreakpoints(this.session.getBreakpoints())},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(){this.renderer.updateText()},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){var a="";return this.selection.isEmpty()||(a=this.session.getTextRange(this.getSelectionRange())),this._emit("copy",a),a},this.onCut=function(){this.commands.exec("cut",this)},this.insert=function(a){var b=this.session,c=b.getMode(),d=this.getCursorPosition();if(this.getBehavioursEnabled()){var e=c.transformAction(b.getState(d.row),"insertion",this,b,a);e&&(a=e.text)}a=a.replace("	",this.session.getTabString());if(!this.selection.isEmpty())d=this.session.remove(this.getSelectionRange()),this.clearSelection();else if(this.session.getOverwrite()){var f=new m.fromPoints(d,d);f.end.column+=a.length,this.session.remove(f)}this.clearSelection();var g=d.column,h=b.getState(d.row),i=c.checkOutdent(h,b.getLine(d.row),a),j=b.getLine(d.row),k=c.getNextLineIndent(h,j.slice(0,d.column),b.getTabString()),l=b.insert(d,a);e&&e.selection&&(e.selection.length==2?this.selection.setSelectionRange(new m(d.row,g+e.selection[0],d.row,g+e.selection[1])):this.selection.setSelectionRange(new m(d.row+e.selection[0],e.selection[1],d.row+e.selection[2],e.selection[3])));var h=b.getState(d.row);if(b.getDocument().isNewLine(a)){this.moveCursorTo(d.row+1,0);var n=b.getTabSize(),o=Number.MAX_VALUE;for(var p=d.row+1;p<=l.row;++p){var q=0;j=b.getLine(p);for(var r=0;r<j.length;++r)if(j.charAt(r)=="	")q+=n;else{if(j.charAt(r)!=" ")break;q+=1}/[^\s]/.test(j)&&(o=Math.min(q,o))}for(var p=d.row+1;p<=l.row;++p){var s=o;j=b.getLine(p);for(var r=0;r<j.length&&s>0;++r)j.charAt(r)=="	"?s-=n:j.charAt(r)==" "&&(s-=1);b.remove(new m(p,0,p,r))}b.indentRows(d.row+1,l.row,k)}i&&c.autoOutdent(h,b,d.row)},this.onTextInput=function(a,b){b&&this._emit("paste",a),this.keyBinding.onTextInput(a,b)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.$mouseHandler.setScrollSpeed(a)},this.getScrollSpeed=function(){return this.$mouseHandler.getScrollSpeed()},this.setDragDelay=function(a){this.$mouseHandler.setDragDelay(a)},this.getDragDelay=function(){return this.$mouseHandler.getDragDelay()},this.$selectionStyle="line",this.setSelectionStyle=function(a){if(this.$selectionStyle==a)return;this.$selectionStyle=a,this.onSelectionChange(),this._emit("changeSelectionStyle",{data:a})},this.getSelectionStyle=function(){return this.$selectionStyle},this.$highlightActiveLine=!0,this.setHighlightActiveLine=function(a){if(this.$highlightActiveLine==a)return;this.$highlightActiveLine=a,this.$updateHighlightActiveLine()},this.getHighlightActiveLine=function(){return this.$highlightActiveLine},this.$highlightSelectedWord=!0,this.setHighlightSelectedWord=function(a){if(this.$highlightSelectedWord==a)return;this.$highlightSelectedWord=a,a?this.session.getMode().highlightSelection(this):this.session.getMode().clearSelectionHighlight(this)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(a){this.renderer.setAnimatedScroll(a)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(a){if(this.getShowInvisibles()==a)return;this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.$readOnly=!1,this.setReadOnly=function(a){this.$readOnly=a},this.getReadOnly=function(){return this.$readOnly},this.$modeBehaviours=!0,this.setBehavioursEnabled=function(a){this.$modeBehaviours=a},this.getBehavioursEnabled=function(){return this.$modeBehaviours},this.setShowFoldWidgets=function(a){var b=this.renderer.$gutterLayer;if(b.getShowFoldWidgets()==a)return;this.renderer.$gutterLayer.setShowFoldWidgets(a),this.$showFoldWidgets=a,this.renderer.updateFull()},this.getShowFoldWidgets=function(){return this.renderer.$gutterLayer.getShowFoldWidgets()},this.remove=function(a){this.selection.isEmpty()&&(a=="left"?this.selection.selectLeft():this.selection.selectRight());var b=this.getSelectionRange();if(this.getBehavioursEnabled()){var c=this.session,d=c.getState(b.start.row),e=c.getMode().transformAction(d,"deletion",this,c,b);e&&(b=e)}this.session.remove(b),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var a=this.getCursorPosition(),b=a.column;if(b===0)return;var c=this.session.getLine(a.row),d,e;b<c.length?(d=c.charAt(b)+c.charAt(b-1),e=new m(a.row,b-1,a.row,b+1)):(d=c.charAt(b-1)+c.charAt(b-2),e=new m(a.row,b-2,a.row,b)),this.session.replace(e,d)},this.toLowerCase=function(){var a=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var b=this.getSelectionRange(),c=this.session.getTextRange(b);this.session.replace(b,c.toLowerCase()),this.selection.setSelectionRange(a)},this.toUpperCase=function(){var a=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var b=this.getSelectionRange(),c=this.session.getTextRange(b);this.session.replace(b,c.toUpperCase()),this.selection.setSelectionRange(a)},this.indent=function(){var a=this.session,b=this.getSelectionRange();if(!(b.start.row<b.end.row||b.start.column<b.end.column)){var d;if(this.session.getUseSoftTabs()){var f=a.getTabSize(),g=this.getCursorPosition(),h=a.documentToScreenColumn(g.row,g.column),i=f-h%f;d=e.stringRepeat(" ",i)}else d="	";return this.insert(d)}var c=this.$getSelectedRows();a.indentRows(c.first,c.last,"	")},this.blockOutdent=function(){var a=this.session.getSelection();this.session.outdentRows(a.getRange())},this.toggleCommentLines=function(){var a=this.session.getState(this.getCursorPosition().row),b=this.$getSelectedRows();this.session.getMode().toggleCommentLines(a,this.session,b.first,b.last)},this.removeLines=function(){var a=this.$getSelectedRows(),b;a.first===0||a.last+1<this.session.getLength()?b=new m(a.first,0,a.last+1,0):b=new m(a.first-1,this.session.getLine(a.first-1).length,a.last,this.session.getLine(a.last).length),this.session.remove(b),this.clearSelection()},this.moveLinesDown=function(){this.$moveLines(function(a,b){return this.session.moveLinesDown(a,b)})},this.moveLinesUp=function(){this.$moveLines(function(a,b){return this.session.moveLinesUp(a,b)})},this.moveText=function(a,b){return this.$readOnly?null:this.session.moveText(a,b)},this.copyLinesUp=function(){this.$moveLines(function(a,b){return this.session.duplicateLines(a,b),0})},this.copyLinesDown=function(){this.$moveLines(function(a,b){return this.session.duplicateLines(a,b)})},this.$moveLines=function(a){var b=this.$getSelectedRows(),c=this.selection;if(!c.isMultiLine())var d=c.getRange(),e=c.isBackwards();var f=a.call(this,b.first,b.last);d?(d.start.row+=f,d.end.row+=f,c.setSelectionRange(d,e)):(c.setSelectionAnchor(b.last+f+1,0),c.$moveSelection(function(){c.moveCursorTo(b.first+f,0)}))},this.$getSelectedRows=function(){var a=this.getSelectionRange().collapseRows();return{first:a.start.row,last:a.end.row}},this.onCompositionStart=function(a){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(a){this.renderer.setCompositionText(a)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(a){return a>=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.isRowFullyVisible=function(a){return a>=this.renderer.getFirstFullyVisibleRow()&&a<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$getPageDownRow=function(){return this.renderer.getScrollBottomRow()},this.$getPageUpRow=function(){var a=this.renderer.getScrollTopRow(),b=this.renderer.getScrollBottomRow();return a-(b-a)},this.selectPageDown=function(){var a=this.$getPageDownRow()+Math.floor(this.$getVisibleRowCount()/2);this.scrollPageDown();var b=this.getSelection(),c=this.session.documentToScreenPosition(b.getSelectionLead()),d=this.session.screenToDocumentPosition(a,c.column);b.selectTo(d.row,d.column)},this.selectPageUp=function(){var a=this.renderer.getScrollTopRow()-this.renderer.getScrollBottomRow(),b=this.$getPageUpRow()+Math.round(a/2);this.scrollPageUp();var c=this.getSelection(),d=this.session.documentToScreenPosition(c.getSelectionLead()),e=this.session.screenToDocumentPosition(b,d.column);c.selectTo(e.row,e.column)},this.gotoPageDown=function(){var a=this.$getPageDownRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.gotoPageUp=function(){var a=this.$getPageUpRow(),b=this.getCursorPositionScreen().column;this.scrollToRow(a),this.getSelection().moveCursorToScreen(a,b)},this.scrollPageDown=function(){this.scrollToRow(this.$getPageDownRow())},this.scrollPageUp=function(){this.renderer.scrollToRow(this.$getPageUpRow())},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b){this.renderer.scrollToLine(a,b)},this.centerSelection=function(){var a=this.getSelectionRange(),b=Math.floor(a.start.row+(a.end.row-a.start.row)/2);this.renderer.scrollToLine(b,!0)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.jumpToMatching=function(){var a=this.getCursorPosition(),b=this.session.findMatchingBracket(a);b||(a.column+=1,b=this.session.findMatchingBracket(a)),b||(a.column-=2,b=this.session.findMatchingBracket(a)),b&&(this.clearSelection(),this.moveCursorTo(b.row,b.column))},this.gotoLine=function(a,b){this.selection.clearSelection(),this.session.unfold({row:a-1,column:b||0}),this.$blockScrolling+=1,this.moveCursorTo(a-1,b||0),this.$blockScrolling-=1,this.isRowFullyVisible(this.getCursorPosition().row)||this.scrollToLine(a,!0)},this.navigateTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.navigateUp=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(-a,0)},this.navigateDown=function(a){this.selection.clearSelection(),a=a||1,this.selection.moveCursorBy(a,0)},this.navigateLeft=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().start;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(a){if(!this.selection.isEmpty()){var b=this.getSelectionRange().end;this.moveCursorToPosition(b)}else{a=a||1;while(a--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(a,b){b&&this.$search.set(b);var c=this.$search.find(this.session),d=0;return c?(this.$tryReplace(c,a)&&(d=1),c!==null&&(this.selection.setSelectionRange(c),this.renderer.scrollSelectionIntoView(c.start,c.end)),d):d},this.replaceAll=function(a,b){b&&this.$search.set(b);var c=this.$search.findAll(this.session),d=0;if(!c.length)return d;var e=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0),this.$blockScrolling+=1;for(var f=c.length-1;f>=0;--f)this.$tryReplace(c[f],a)&&d++;return this.selection.setSelectionRange(e),this.$blockScrolling-=1,d},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a);return b=this.$search.replace(c,b),b!==null?(a.end=this.session.replace(a,b),a):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b){this.clearSelection(),b=b||{},b.needle=a,this.$search.set(b),this.$find()},this.findNext=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!1),this.$search.set(a),this.$find()},this.findPrevious=function(a){a=a||{},typeof a.backwards=="undefined"&&(a.backwards=!0),this.$search.set(a),this.$find()},this.$find=function(a){this.selection.isEmpty()||this.$search.set({needle:this.session.getTextRange(this.getSelectionRange())}),typeof a!="undefined"&&this.$search.set({backwards:a});var b=this.$search.find(this.session);if(b){this.session.unfold(b),this.$blockScrolling+=1,this.selection.setSelectionRange(b),this.$blockScrolling-=1;if(this.getAnimatedScroll()){var c=this.getCursorPosition();this.isRowFullyVisible(c.row)||this.scrollToLine(c.row,!0)}else this.renderer.scrollSelectionIntoView(b.start,b.end)}},this.undo=function(){this.session.getUndoManager().undo()},this.redo=function(){this.session.getUndoManager().redo()},this.destroy=function(){this.renderer.destroy()}}).call(q.prototype),b.Editor=q}),define("ace/lib/lang",["require","exports","module"],function(a,b,c){"use strict",b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){return(new Array(b+1)).join(a)};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){var b=[];for(var c=0,d=a.length;c<d;c++)a[c]&&typeof a[c]=="object"?b[c]=this.copyObject(a[c]):b[c]=a[c];return b},b.deepCopy=function(a){if(typeof a!="object")return a;var b=a.constructor();for(var c in a)typeof a[c]=="object"?b[c]=this.deepCopy(a[c]):b[c]=a[c];return b},b.arrayToMap=function(a){var b={};for(var c=0;c<a.length;c++)b[a[c]]=1;return b},b.arrayRemove=function(a,b){for(var c=0;c<=a.length;c++)b===a[c]&&a.splice(c,1)},b.escapeRegExp=function(a){return a.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},b.deferredCall=function(a){var b=null,c=function(){b=null,a()},d=function(a){return d.cancel(),b=setTimeout(c,a||0),d};return d.schedule=d,d.call=function(){return this.cancel(),a(),d},d.cancel=function(){return clearTimeout(b),b=null,d},d}}),define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("../lib/useragent"),f=a("../lib/dom"),g=function(a,b){function l(){try{c.select()}catch(a){}}function m(a){if(!i){var d=a||c.value;if(d){d.charCodeAt(d.length-1)==g.charCodeAt(0)?(d=d.slice(0,-1),d&&b.onTextInput(d,j)):b.onTextInput(d,j);if(!v())return!1}}i=!1,j=!1,c.value=g,l()}function v(){return document.activeElement===c}var c=f.createElement("textarea");e.isTouchPad&&c.setAttribute("x-palm-disable-auto-cap",!0),c.style.left="-10000px",c.style.position="fixed",a.insertBefore(c,a.firstChild);var g=String.fromCharCode(0);m();var h=!1,i=!1,j=!1,k="",n=function(a){setTimeout(function(){h||m(a.data)},0)},o=function(a){if(e.isOldIE&&c.value.charCodeAt(0)>128)return;setTimeout(function(){h||m()},0)},p=function(a){h=!0,b.onCompositionStart(),e.isGecko||setTimeout(q,0)},q=function(){if(!h)return;b.onCompositionUpdate(c.value)},r=function(a){h=!1,b.onCompositionEnd()},s=function(a){i=!0;var d=b.getCopyText();d?c.value=d:a.preventDefault(),l(),setTimeout(function(){m()},0)},t=function(a){i=!0;var d=b.getCopyText();d?(c.value=d,b.onCut()):a.preventDefault(),l(),setTimeout(function(){m()},0)};d.addCommandKeyListener(c,b.onCommandKey.bind(b));if(e.isOldIE){var u={13:1,27:1};d.addListener(c,"keyup",function(a){h&&(!c.value||u[a.keyCode])&&setTimeout(r,0);if((c.value.charCodeAt(0)|0)<129)return;h?q():p()})}"onpropertychange"in c&&!("oninput"in c)?d.addListener(c,"propertychange",o):d.addListener(c,"input",n),d.addListener(c,"paste",function(a){j=!0,a.clipboardData&&a.clipboardData.getData?(m(a.clipboardData.getData("text/plain")),a.preventDefault()):o()}),"onbeforecopy"in c&&typeof clipboardData!="undefined"?(d.addListener(c,"beforecopy",function(a){var c=b.getCopyText();c?clipboardData.setData("Text",c):a.preventDefault()}),d.addListener(a,"keydown",function(a){if(a.ctrlKey&&a.keyCode==88){var c=b.getCopyText();c&&(clipboardData.setData("Text",c),b.onCut()),d.preventDefault(a)}})):(d.addListener(c,"copy",s),d.addListener(c,"cut",t)),d.addListener(c,"compositionstart",p),e.isGecko&&d.addListener(c,"text",q),e.isWebKit&&d.addListener(c,"keyup",q),d.addListener(c,"compositionend",r),d.addListener(c,"blur",function(){b.onBlur()}),d.addListener(c,"focus",function(){b.onFocus(),l()}),this.focus=function(){b.onFocus(),l(),c.focus()},this.blur=function(){c.blur()},this.isFocused=v,this.getElement=function(){return c},this.onContextMenu=function(a,b){a&&(k||(k=c.style.cssText),c.style.cssText="position:fixed; z-index:1000;left:"+(a.x-2)+"px; top:"+(a.y-2)+"px;"),b&&(c.value="")},this.onContextMenuClose=function(){setTimeout(function(){k&&(c.style.cssText=k,k=""),m()},0)}};b.TextInput=g}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("./default_handlers").DefaultHandlers,f=a("./default_gutter_handler").GutterHandler,g=a("./mouse_event").MouseEvent,h=function(a){this.editor=a,new e(a),new f(a),d.addListener(a.container,"mousedown",function(b){return a.focus(),d.preventDefault(b)}),d.addListener(a.container,"selectstart",function(a){return d.preventDefault(a)});var b=a.renderer.getMouseEventTarget();d.addListener(b,"mousedown",this.onMouseEvent.bind(this,"mousedown")),d.addListener(b,"click",this.onMouseEvent.bind(this,"click")),d.addListener(b,"mousemove",this.onMouseMove.bind(this,"mousemove")),d.addMultiMouseDownListener(b,0,2,500,this.onMouseEvent.bind(this,"dblclick")),d.addMultiMouseDownListener(b,0,3,600,this.onMouseEvent.bind(this,"tripleclick")),d.addMultiMouseDownListener(b,0,4,600,this.onMouseEvent.bind(this,"quadclick")),d.addMouseWheelListener(a.container,this.onMouseWheel.bind(this,"mousewheel"));var c=a.renderer.$gutter;d.addListener(c,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),d.addListener(c,"click",this.onMouseEvent.bind(this,"gutterclick")),d.addListener(c,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),d.addListener(c,"mousemove",this.onMouseMove.bind(this,"gutter"))};(function(){this.$scrollSpeed=1,this.setScrollSpeed=function(a){this.$scrollSpeed=a},this.getScrollSpeed=function(){return this.$scrollSpeed},this.onMouseEvent=function(a,b){this.editor._emit(a,new g(b,this.editor))},this.$dragDelay=250,this.setDragDelay=function(a){this.$dragDelay=a},this.getDragDelay=function(){return this.$dragDelay},this.onMouseMove=function(a,b){var c=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!c||!c.length)return;this.editor._emit(a,new g(b,this.editor))},this.onMouseWheel=function(a,b){var c=new g(b,this.editor);c.speed=this.$scrollSpeed*2,c.wheelX=b.wheelX,c.wheelY=b.wheelY,this.editor._emit(a,c)}}).call(h.prototype),b.MouseHandler=h}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/event","ace/lib/dom","ace/lib/browser_focus"],function(a,b,c){function k(a){this.editor=a,this.$clickSelection=null,this.browserFocus=new f,a.setDefaultHandler("mousedown",this.onMouseDown.bind(this)),a.setDefaultHandler("dblclick",this.onDoubleClick.bind(this)),a.setDefaultHandler("tripleclick",this.onTripleClick.bind(this)),a.setDefaultHandler("quadclick",this.onQuadClick.bind(this)),a.setDefaultHandler("mousewheel",this.onScroll.bind(this))}function l(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}"use strict";var d=a("../lib/event"),e=a("../lib/dom"),f=a("../lib/browser_focus").BrowserFocus,g=0,h=1,i=2,j=5;(function(){this.onMouseDown=function(a){function C(b){a.getShiftKey()?m.selection.selectToPosition(b):n.$clickSelection||(m.moveCursorToPosition(b),m.selection.clearSelection()),q=h}var b=a.inSelection(),c=a.pageX,f=a.pageY,k=a.getDocumentPosition(),m=this.editor,n=this,o=m.getSelectionRange(),p=o.isEmpty(),q=g;if(b&&(!this.browserFocus.isFocused()||(new Date).getTime()-this.browserFocus.lastFocus<20||!m.isFocused())){m.focus();return}var r=a.getButton();if(r!==0){p&&m.moveCursorToPosition(k),r==2&&(m.textInput.onContextMenu({x:a.clientX,y:a.clientY},p),d.capture(m.container,function(){},m.textInput.onContextMenuClose));return}b||C(k);var s=c,t=f,u=(new Date).getTime(),v,w,x,y=function(a){s=d.getDocumentX(a),t=d.getDocumentY(a)},z=function(a){clearInterval(F),q==g?C(k):q==i&&A(a),n.$clickSelection=null,q=g},A=function(a){e.removeCssClass(m.container,"ace_dragging"),m.session.removeMarker(x),m.$mouseHandler.$clickSelection||v||(m.moveCursorToPosition(k),m.selection.clearSelection());if(!v)return;if(w.contains(v.row,v.column)){v=null;return}m.clearSelection();if(a&&(a.ctrlKey||a.altKey))var b=m.session,c=b.insert(v,b.getTextRange(w));else var c=m.moveText(w,v);if(!c){v=null;return}m.selection.setSelectionRange(c)},B=function(){if(q==g){var a=l(c,f,s,t),b=(new Date).getTime();if(a>j){q=h;var d=m.renderer.screenToTextCoordinates(s,t);C(d)}else if(b-u>m.getDragDelay()){q=i,w=m.getSelectionRange();var k=m.getSelectionStyle();x=m.session.addMarker(w,"ace_selection",k),m.clearSelection(),e.addCssClass(m.container,"ace_dragging")}}q==i?E():q==h&&D()},D=function(){var a,b=m.renderer.screenToTextCoordinates(s,t);n.$clickSelection?n.$clickSelection.contains(b.row,b.column)?m.selection.setSelectionRange(n.$clickSelection):(n.$clickSelection.compare(b.row,b.column)==-1?a=n.$clickSelection.end:a=n.$clickSelection.start,m.selection.setSelectionAnchor(a.row,a.column),m.selection.selectToPosition(b)):m.selection.selectToPosition(b),m.renderer.scrollCursorIntoView()},E=function(){v=m.renderer.screenToTextCoordinates(s,t),m.moveCursorToPosition(v)};d.capture(m.container,y,z);var F=setInterval(B,20);return a.preventDefault()},this.onDoubleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectWord(),this.$clickSelection=c.getSelectionRange()},this.onTripleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;c.moveCursorToPosition(b),c.selection.selectLine(),this.$clickSelection=c.getSelectionRange()},this.onQuadClick=function(a){var b=this.editor;b.selectAll(),this.$clickSelection=b.getSelectionRange()},this.onScroll=function(a){var b=this.editor;b.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed);if(b.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed))return a.preventDefault()}}).call(k.prototype),b.DefaultHandlers=k}),define("ace/lib/browser_focus",["require","exports","module","ace/lib/oop","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./oop"),e=a("./event"),f=a("./event_emitter").EventEmitter,g=function(a){a=a||window,this.lastFocus=(new Date).getTime(),this._isFocused=!0;var b=this;"onfocusin"in a.document?(e.addListener(a.document,"focusin",function(a){b._setFocused(!0)}),e.addListener(a.document,"focusout",function(a){b._setFocused(!!a.toElement)})):(e.addListener(a,"blur",function(a){b._setFocused(!1)}),e.addListener(a,"focus",function(a){b._setFocused(!0)}))};(function(){d.implement(this,f),this.isFocused=function(){return this._isFocused},this._setFocused=function(a){if(this._isFocused==a)return;a&&(this.lastFocus=(new Date).getTime()),this._isFocused=a,this._emit("changeFocus")}}).call(g.prototype),b.BrowserFocus=g}),define("ace/lib/event_emitter",["require","exports","module"],function(a,b,c){"use strict";var d={};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry=this._eventRegistry||{},this._defaultHandlers=this._defaultHandlers||{};var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(!c.length&&!d)return;b=b||{},b.type=a,b.stopPropagation||(b.stopPropagation=function(){this.propagationStopped=!0}),b.preventDefault||(b.preventDefault=function(){this.defaultPrevented=!0});for(var e=0;e<c.length;e++){c[e](b);if(b.propagationStopped)break}d&&!b.defaultPrevented&&d(b)},d.setDefaultHandler=function(a,b){this._defaultHandlers=this._defaultHandlers||{};if(this._defaultHandlers[a])throw new Error("The default handler for '"+a+"' is already set");this._defaultHandlers[a]=b},d.on=d.addEventListener=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!c)var c=this._eventRegistry[a]=[];c.indexOf(b)==-1&&c.push(b)},d.removeListener=d.removeEventListener=function(a,b){this._eventRegistry=this._eventRegistry||{};var c=this._eventRegistry[a];if(!c)return;var d=c.indexOf(b);d!==-1&&c.splice(d,1)},d.removeAllListeners=function(a){this._eventRegistry&&(this._eventRegistry[a]=[])},b.EventEmitter=d}),define("ace/mouse/default_gutter_handler",["require","exports","module"],function(a,b,c){function d(a){a.setDefaultHandler("gutterclick",function(b){var c=b.getDocumentPosition().row,d=a.session.selection;d.moveCursorTo(c,0),d.selectLine()})}"use strict",b.GutterHandler=d}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event"],function(a,b,c){"use strict";var d=a("../lib/event"),e=b.MouseEvent=function(a,b){this.domEvent=a,this.editor=b,this.pageX=d.getDocumentX(a),this.pageY=d.getDocumentY(a),this.clientX=a.clientX,this.clientY=a.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){d.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){d.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){if(this.$pos)return this.$pos;var a=d.getDocumentX(this.domEvent),b=d.getDocumentY(this.domEvent);return this.$pos=this.editor.renderer.screenToTextCoordinates(a,b),this.$pos},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var a=this.editor;if(a.getReadOnly())this.$inSelection=!1;else{var b=a.getSelectionRange();if(b.isEmpty())this.$inSelection=!1;else{var c=this.getDocumentPosition();this.$inSelection=b.contains(c.row,c.column)}}return this.$inSelection},this.getButton=function(){return d.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=function(){return this.domEvent.ctrlKey||this.domEvent.metaKey}}).call(e.prototype)}),define("ace/mouse/fold_handler",["require","exports","module"],function(a,b,c){function d(a){a.on("click",function(b){var c=b.getDocumentPosition(),d=a.session,e=d.getFoldAt(c.row,c.column,1);e&&(b.getAccelKey()?d.removeFold(e):d.expandFold(e),b.stop())}),a.on("gutterclick",function(b){if(b.domEvent.target.className.indexOf("ace_fold-widget")!=-1){var c=b.getDocumentPosition().row;a.session.onFoldWidgetClick(c,b.domEvent),b.stop()}})}"use strict",b.FoldHandler=d}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event","ace/commands/default_commands"],function(a,b,c){"use strict";var d=a("../lib/keys"),e=a("../lib/event");a("../commands/default_commands");var f=function(a){this.$editor=a,this.$data={},this.$handlers=[this]};(function(){this.setKeyboardHandler=function(a){if(this.$handlers[this.$handlers.length-1]==a)return;this.$data={},this.$handlers=a?[this,a]:[this]},this.addKeyboardHandler=function(a){this.removeKeyboardHandler(a),this.$handlers.push(a)},this.removeKeyboardHandler=function(a){var b=this.$handlers.indexOf(a);return b==-1?!1:(this.$handlers.splice(b,1),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.$callKeyboardHandlers=function(a,b,c,d){var f;for(var g=this.$handlers.length;g--;){f=this.$handlers[g].handleKeyboard(this.$data,a,b,c,d);if(f&&f.command)break}if(!f||!f.command)return!1;var h=!1,i=this.$editor.commands;return f.command!="null"?h=i.exec(f.command,this.$editor,f.args):h=!0,h&&d&&e.stopEvent(d),h},this.handleKeyboard=function(a,b,c){return{command:this.$editor.commands.findKeyCommand(b,c)}},this.onCommandKey=function(a,b,c){var e=d.keyCodeToString(c);this.$callKeyboardHandlers(b,e,c,a)},this.onTextInput=function(a,b){var c=!1;!b&&a.length==1&&(c=this.$callKeyboardHandlers(0,a)),c||this.$editor.commands.exec("insertstring",this.$editor,a)}}).call(f.prototype),b.KeyBinding=f}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang"],function(a,b,c){function e(a,b){return{win:a,mac:b}}"use strict";var d=a("../lib/lang");b.commands=[{name:"selectall",bindKey:e("Ctrl-A","Command-A"),exec:function(a){a.selectAll()},readOnly:!0},{name:"centerselection",bindKey:e(null,"Ctrl-L"),exec:function(a){a.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:e("Ctrl-L","Command-L"),exec:function(a){var b=parseInt(prompt("Enter line number:"),10);isNaN(b)||a.gotoLine(b)},readOnly:!0},{name:"fold",bindKey:e("Alt-L","Alt-L"),exec:function(a){a.session.toggleFold(!1)},readOnly:!0},{name:"unfold",bindKey:e("Alt-Shift-L","Alt-Shift-L"),exec:function(a){a.session.toggleFold(!0)},readOnly:!0},{name:"foldall",bindKey:e("Alt-0","Alt-0"),exec:function(a){a.session.foldAll()},readOnly:!0},{name:"unfoldall",bindKey:e("Alt-Shift-0","Alt-Shift-0"),exec:function(a){a.session.unfold()},readOnly:!0},{name:"findnext",bindKey:e("Ctrl-K","Command-G"),exec:function(a){a.findNext()},readOnly:!0},{name:"findprevious",bindKey:e("Ctrl-Shift-K","Command-Shift-G"),exec:function(a){a.findPrevious()},readOnly:!0},{name:"find",bindKey:e("Ctrl-F","Command-F"),exec:function(a){var b=prompt("Find:",a.getCopyText());a.find(b)},readOnly:!0},{name:"overwrite",bindKey:e("Insert","Insert"),exec:function(a){a.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:e("Ctrl-Shift-Home|Alt-Shift-Up","Command-Shift-Up"),exec:function(a){a.getSelection().selectFileStart()},readOnly:!0},{name:"gotostart",bindKey:e("Ctrl-Home|Ctrl-Up","Command-Home|Command-Up"),exec:function(a){a.navigateFileStart()},readOnly:!0},{name:"selectup",bindKey:e("Shift-Up","Shift-Up"),exec:function(a){a.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:!0},{name:"golineup",bindKey:e("Up","Up|Ctrl-P"),exec:function(a,b){a.navigateUp(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selecttoend",bindKey:e("Ctrl-Shift-End|Alt-Shift-Down","Command-Shift-Down"),exec:function(a){a.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoend",bindKey:e("Ctrl-End|Ctrl-Down","Command-End|Command-Down"),exec:function(a){a.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectdown",bindKey:e("Shift-Down","Shift-Down"),exec:function(a){a.getSelection().selectDown()},multiSelectAction:"forEach",readOnly:!0},{name:"golinedown",bindKey:e("Down","Down|Ctrl-N"),exec:function(a,b){a.navigateDown(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordleft",bindKey:e("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(a){a.getSelection().selectWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordleft",bindKey:e("Ctrl-Left","Option-Left"),exec:function(a){a.navigateWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolinestart",bindKey:e("Alt-Shift-Left","Command-Shift-Left"),exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolinestart",bindKey:e("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(a){a.navigateLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectleft",bindKey:e("Shift-Left","Shift-Left"),exec:function(a){a.getSelection().selectLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoleft",bindKey:e("Left","Left|Ctrl-B"),exec:function(a,b){a.navigateLeft(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordright",bindKey:e("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(a){a.getSelection().selectWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordright",bindKey:e("Ctrl-Right","Option-Right"),exec:function(a){a.navigateWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolineend",bindKey:e("Alt-Shift-Right","Command-Shift-Right"),exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolineend",bindKey:e("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(a){a.navigateLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectright",bindKey:e("Shift-Right","Shift-Right"),exec:function(a){a.getSelection().selectRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoright",bindKey:e("Right","Right|Ctrl-F"),exec:function(a,b){a.navigateRight(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectpagedown",bindKey:e("Shift-PageDown","Shift-PageDown"),exec:function(a){a.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:e(null,"PageDown"),exec:function(a){a.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:e("PageDown","Option-PageDown|Ctrl-V"),exec:function(a){a.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:e("Shift-PageUp","Shift-PageUp"),exec:function(a){a.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:e(null,"PageUp"),exec:function(a){a.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:e("PageUp","Option-PageUp"),exec:function(a){a.gotoPageUp()},readOnly:!0},{name:"selectlinestart",bindKey:e("Shift-Home","Shift-Home"),exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectlineend",bindKey:e("Shift-End","Shift-End"),exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"togglerecording",bindKey:e("Ctrl-Alt-E","Command-Option-E"),exec:function(a){a.commands.toggleRecording()},readOnly:!0},{name:"replaymacro",bindKey:e("Ctrl-Shift-E","Command-Shift-E"),exec:function(a){a.commands.replay(a)},readOnly:!0},{name:"jumptomatching",bindKey:e("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(a){a.jumpToMatching()},multiSelectAction:"forEach",readOnly:!0},{name:"cut",exec:function(a){var b=a.getSelectionRange();a._emit("cut",b),a.selection.isEmpty()||(a.session.remove(b),a.clearSelection())},multiSelectAction:"forEach"},{name:"removeline",bindKey:e("Ctrl-D","Command-D"),exec:function(a){a.removeLines()},multiSelectAction:"forEach"},{name:"togglecomment",bindKey:e("Ctrl-7","Command-7"),exec:function(a){a.toggleCommentLines()},multiSelectAction:"forEach"},{name:"replace",bindKey:e("Ctrl-R","Command-Option-F"),exec:function(a){var b=prompt("Find:",a.getCopyText());if(!b)return;var c=prompt("Replacement:");if(!c)return;a.replace(c,{needle:b})}},{name:"replaceall",bindKey:e("Ctrl-Shift-R","Command-Shift-Option-F"),exec:function(a){var b=prompt("Find:");if(!b)return;var c=prompt("Replacement:");if(!c)return;a.replaceAll(c,{needle:b})}},{name:"undo",bindKey:e("Ctrl-Z","Command-Z"),exec:function(a){a.undo()}},{name:"redo",bindKey:e("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(a){a.redo()}},{name:"copylinesup",bindKey:e("Ctrl-Alt-Up","Command-Option-Up"),exec:function(a){a.copyLinesUp()}},{name:"movelinesup",bindKey:e("Alt-Up","Option-Up"),exec:function(a){a.moveLinesUp()}},{name:"copylinesdown",bindKey:e("Ctrl-Alt-Down","Command-Option-Down"),exec:function(a){a.copyLinesDown()}},{name:"movelinesdown",bindKey:e("Alt-Down","Option-Down"),exec:function(a){a.moveLinesDown()}},{name:"del",bindKey:e("Delete","Delete|Ctrl-D"),exec:function(a){a.remove("right")},multiSelectAction:"forEach"},{name:"backspace",bindKey:e("Command-Backspace|Option-Backspace|Shift-Backspace|Backspace","Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(a){a.remove("left")},multiSelectAction:"forEach"},{name:"removetolinestart",bindKey:e("Alt-Backspace","Command-Backspace"),exec:function(a){a.removeToLineStart()},multiSelectAction:"forEach"},{name:"removetolineend",bindKey:e("Alt-Delete","Ctrl-K"),exec:function(a){a.removeToLineEnd()},multiSelectAction:"forEach"},{name:"removewordleft",bindKey:e("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(a){a.removeWordLeft()},multiSelectAction:"forEach"},{name:"removewordright",bindKey:e("Ctrl-Delete","Alt-Delete"),exec:function(a){a.removeWordRight()},multiSelectAction:"forEach"},{name:"outdent",bindKey:e("Shift-Tab","Shift-Tab"),exec:function(a){a.blockOutdent()},multiSelectAction:"forEach"},{name:"indent",bindKey:e("Tab","Tab"),exec:function(a){a.indent()},multiSelectAction:"forEach"},{name:"insertstring",exec:function(a,b){a.insert(b)},multiSelectAction:"forEach"},{name:"inserttext",exec:function(a,b){a.insert(d.stringRepeat(b.text||"",b.times||1))},multiSelectAction:"forEach"},{name:"splitline",bindKey:e(null,"Ctrl-O"),exec:function(a){a.splitLine()},multiSelectAction:"forEach"},{name:"transposeletters",bindKey:e("Ctrl-T","Ctrl-T"),exec:function(a){a.transposeLetters()},multiSelectAction:function(a){a.transposeSelections(1)}},{name:"touppercase",bindKey:e("Ctrl-U","Ctrl-U"),exec:function(a){a.toUpperCase()},multiSelectAction:"forEach"},{name:"tolowercase",bindKey:e("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(a){a.toLowerCase()},multiSelectAction:"forEach"}]}),define("ace/edit_session",["require","exports","module","ace/config","ace/lib/oop","ace/lib/lang","ace/lib/net","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/edit_session/folding","ace/edit_session/bracket_match"],function(a,b,c){"use strict";var d=a("./config"),e=a("./lib/oop"),f=a("./lib/lang"),g=a("./lib/net"),h=a("./lib/event_emitter").EventEmitter,i=a("./selection").Selection,j=a("./mode/text").Mode,k=a("./range").Range,l=a("./document").Document,m=a("./background_tokenizer").BackgroundTokenizer,n=function(a,b){this.$modified=!0,this.$breakpoints=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$rowCache=[],this.$wrapData=[],this.$foldData=[],this.$undoSelect=!0,this.$foldData.toString=function(){var a="";return this.forEach(function(b){a+="\n"+b.toString()}),a},a instanceof l?this.setDocument(a):this.setDocument(new l(a)),this.selection=new i(this),b?this.setMode(b):this.setMode(new j)};(function(){function q(a){return a<4352?!1:a>=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510}e.implement(this,h),this.setDocument=function(a){if(this.doc)throw new Error("Document is already set");this.doc=a,a.on("change",this.onChange.bind(this)),this.on("changeFold",this.onChangeFold.bind(this)),this.bgTokenizer&&(this.bgTokenizer.setDocument(this.getDocument()),this.bgTokenizer.start(0))},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(a==0){this.$rowCache=[];return}var b=this.$rowCache;for(var c=0;c<b.length;c++)if(b[c].docRow>=a){b.splice(c,b.length);return}},this.onChangeFold=function(a){var b=a.data;this.$resetRowCache(b.start.row)},this.onChange=function(a){var b=a.data;this.$modified=!0,this.$resetRowCache(b.range.start.row);var c=this.$updateInternalDataOnChange(a);!this.$fromUndo&&this.$undoManager&&!b.ignore&&(this.$deltasDoc.push(b),c&&c.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:c}),this.$informUndoManager.schedule()),this.bgTokenizer.start(b.range.start.row),this._emit("change",a)},this.setValue=function(a){this.doc.setValue(a),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(a){return this.bgTokenizer.getState(a)},this.getTokens=function(a,b){return this.bgTokenizer.getTokens(a,b)},this.getTokenAt=function(a,b){var c=this.bgTokenizer.getTokens(a,a)[0].tokens,d,e=0;if(b==null)f=c.length-1,e=this.getLine(a).length;else for(var f=0;f<c.length;f++){e+=c[f].value.length;if(e>=b)break}return d=c[f],d?(d.index=f,d.start=e-d.value.length,d):null},this.setUndoManager=function(a){this.$undoManager=a,this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b]}),b.$deltas=[]},this.$informUndoManager=f.deferredCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?f.stringRepeat(" ",this.getTabSize()):"	"},this.$useSoftTabs=!0,this.setUseSoftTabs=function(a){if(this.$useSoftTabs===a)return;this.$useSoftTabs=a},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.$tabSize=4,this.setTabSize=function(a){if(isNaN(a)||this.$tabSize===a)return;this.$modified=!0,this.$tabSize=a,this._emit("changeTabSize")},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(a){if(this.$overwrite==a)return;this.$overwrite=a,this._emit("changeOverwrite")},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b<a.length;b++)this.$breakpoints[a[b]]=!0;this._emit("changeBreakpoint",{})},this.clearBreakpoints=function(){this.$breakpoints=[],this._emit("changeBreakpoint",{})},this.setBreakpoint=function(a){this.$breakpoints[a]=!0,this._emit("changeBreakpoint",{})},this.clearBreakpoint=function(a){delete this.$breakpoints[a],this._emit("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.addMarker=function(a,b,c,d){var e=this.$markerId++,f={range:a,type:c||"line",renderer:typeof c=="function"?c:null,clazz:b,inFront:!!d};return d?(this.$frontMarkers[e]=f,this._emit("changeFrontMarker")):(this.$backMarkers[e]=f,this._emit("changeBackMarker")),e},this.removeMarker=function(a){var b=this.$frontMarkers[a]||this.$backMarkers[a];if(!b)return;var c=b.inFront?this.$frontMarkers:this.$backMarkers;b&&(delete c[a],this._emit(b.inFront?"changeFrontMarker":"changeBackMarker"))},this.getMarkers=function(a){return a?this.$frontMarkers:this.$backMarkers},this.setAnnotations=function(a){this.$annotations={};for(var b=0;b<a.length;b++){var c=a[b],d=c.row;this.$annotations[d]?this.$annotations[d].push(c):this.$annotations[d]=[c]}this._emit("changeAnnotation",{})},this.getAnnotations=function(){return this.$annotations||{}},this.clearAnnotations=function(){this.$annotations={},this._emit("changeAnnotation",{})},this.$detectNewLine=function(a){var b=a.match(/^.*?(\r?\n)/m);b?this.$autoNewLine=b[1]:this.$autoNewLine="\n"},this.getWordRange=function(a,b){var c=this.getLine(a),d=!1;b>0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe));var e=d?this.tokenRe:this.nonTokenRe,f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}var g=b;while(g<c.length&&c.charAt(g).match(e))g++;return new k(a,f,a,g)},this.getAWordRange=function(a,b){var c=this.getWordRange(a,b),d=this.getLine(c.end.row);while(d.charAt(c.end.column).match(/[ \t]/))c.end.column+=1;return c},this.setNewLineMode=function(a){this.doc.setNewLineMode(a)},this.getNewLineMode=function(){return this.doc.getNewLineMode()},this.$useWorker=!0,this.setUseWorker=function(a){if(this.$useWorker==a)return;this.$useWorker=a,this.$stopWorker(),a&&this.$startWorker()},this.getUseWorker=function(){return this.$useWorker},this.onReloadTokenizer=function(a){var b=a.data;this.bgTokenizer.start(b.first),this._emit("tokenizerUpdate",a)},this.$modes={},this._loadMode=function(b,c){function i(a){if(e.$modes[b])return c(e.$modes[b]);e.$modes[b]=new a.Mode,e._emit("loadmode",{name:b,mode:e.$modes[b]}),c(e.$modes[b])}function j(a){if(!d.get("packaged"))return a();var c=b.split("/").pop(),e=d.get("modePath")+"/mode-"+c+d.get("suffix");g.loadScript(e,a)}if(this.$modes[b])return c(this.$modes[b]);var e=this,f;try{f=a(b)}catch(h){}if(f)return i(f);j(function(){a([b],i)})},this.$mode=null,this.$origMode=null,this.setMode=function(a){this.$origMode=a;if(typeof a=="string"){var b=this;this._loadMode(a,function(c){if(b.$origMode!==a)return;b.setMode(c)});return}if(this.$mode===a)return;this.$mode=a,this.$stopWorker(),this.$useWorker&&this.$startWorker();var c=a.getTokenizer();if(c.addEventListener!==undefined){var d=this.onReloadTokenizer.bind(this);c.addEventListener("update",d)}if(!this.bgTokenizer){this.bgTokenizer=new m(c);var b=this;this.bgTokenizer.addEventListener("update",function(a){b._emit("tokenizerUpdate",a)})}else this.bgTokenizer.setTokenizer(c);this.bgTokenizer.setDocument(this.getDocument()),this.bgTokenizer.start(0),this.tokenRe=a.tokenRe,this.nonTokenRe=a.nonTokenRe,this.$setFolding(a.foldingRules),this._emit("changeMode")},this.$stopWorker=function(){this.$worker&&this.$worker.terminate(),this.$worker=null},this.$startWorker=function(){if(typeof Worker!="undefined"&&!a.noWorker)try{this.$worker=this.$mode.createWorker(this)}catch(b){console.log("Could not load worker"),console.log(b),this.$worker=null}else this.$worker=null},this.getMode=function(){return this.$mode},this.$scrollTop=0,this.setScrollTop=function(a){a=Math.round(Math.max(0,a));if(this.$scrollTop===a)return;this.$scrollTop=a,this._emit("changeScrollTop",a)},this.getScrollTop=function(){return this.$scrollTop},this.$scrollLeft=0,this.setScrollLeft=function(a){a=Math.round(Math.max(0,a));if(this.$scrollLeft===a)return;this.$scrollLeft=a,this._emit("changeScrollLeft",a)},this.getScrollLeft=function(){return this.$scrollLeft},this.getWidth=function(){return this.$computeWidth(),this.width},this.getScreenWidth=function(){return this.$computeWidth(),this.screenWidth},this.$computeWidth=function(a){if(this.$modified||a){this.$modified=!1;var b=this.doc.getAllLines(),c=0,d=0;for(var e=0;e<b.length;e++){var f=this.getFoldLine(e),g,h;g=b[e];if(f){var i=f.range.end;g=this.getFoldDisplayLine(f),e=i.row}h=g.length,c=Math.max(c,h),this.$useWrapMode||(d=Math.max(d,this.$getStringScreenWidth(g)[0]))}this.width=c,this.$useWrapMode?this.screenWidth=this.$wrapLimit:this.screenWidth=d}},this.getLine=function(a){return this.doc.getLine(a)},this.getLines=function(a,b){return this.doc.getLines(a,b)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(a){return this.doc.getTextRange(a)},this.insert=function(a,b){return this.doc.insert(a,b)},this.remove=function(a){return this.doc.remove(a)},this.undoChanges=function(a,b){if(!a.length)return;this.$fromUndo=!0;var c=null;for(var d=a.length-1;d!=-1;d--){var e=a[d];e.group=="doc"?(this.doc.revertDeltas(e.deltas),c=this.$getUndoSelection(e.deltas,!0,c)):e.deltas.forEach(function(a){this.addFolds(a.folds)},this)}return this.$fromUndo=!1,c&&this.$undoSelect&&!b&&this.selection.setSelectionRange(c),c},this.redoChanges=function(a,b){if(!a.length)return;this.$fromUndo=!0;var c=null;for(var d=0;d<a.length;d++){var e=a[d];e.group=="doc"&&(this.doc.applyDeltas(e.deltas),c=this.$getUndoSelection(e.deltas,!1,c))}return this.$fromUndo=!1,c&&this.$undoSelect&&!b&&this.selection.setSelectionRange(c),c},this.setUndoSelect=function(a){this.$undoSelect=a},this.$getUndoSelection=function(a,b,c){function d(a){var c=a.action=="insertText"||a.action=="insertLines";return b?!c:c}var e=a[0],f,g,h=!1;d(e)?(f=e.range.clone(),h=!0):(f=k.fromPoints(e.range.start,e.range.start),h=!1);for(var i=1;i<a.length;i++)e=a[i],d(e)?(g=e.range.start,f.compare(g.row,g.column)==-1&&f.setStart(e.range.start),g=e.range.end,f.compare(g.row,g.column)==1&&f.setEnd(e.range.end),h=!0):(g=e.range.start,f.compare(g.row,g.column)==-1&&(f=k.fromPoints(e.range.start,e.range.start)),h=!1);if(c!=null){var j=c.compareRange(f);j==1?f.setStart(c.start):j==-1&&f.setEnd(c.end)}return f},this.replace=function(a,b){return this.doc.replace(a,b)},this.moveText=function(a,b){var c=this.getTextRange(a);this.remove(a);var d=b.row,e=b.column;!a.isMultiLine()&&a.start.row==d&&a.end.column<e&&(e-=c.length);if(a.isMultiLine()&&a.end.row<d){var f=this.doc.$split(c);d-=f.length-1}var g=d+a.end.row-a.start.row,h=a.isMultiLine()?a.end.column:e+a.end.column-a.start.column,i=new k(d,e,g,h);return this.insert(i.start,c),i},this.indentRows=function(a,b,c){c=c.replace(/\t/g,this.getTabString());for(var d=a;d<=b;d++)this.insert({row:d,column:0},c)},this.outdentRows=function(a){var b=a.collapseRows(),c=new k(0,0,0,0),d=this.getTabSize();for(var e=b.start.row;e<=b.end.row;++e){var f=this.getLine(e);c.start.row=e,c.end.row=e;for(var g=0;g<d;++g)if(f.charAt(g)!=" ")break;g<d&&f.charAt(g)=="	"?(c.start.column=g,c.end.column=g+1):(c.start.column=0,c.end.column=g),this.remove(c)}},this.moveLinesUp=function(a,b){if(a<=0)return 0;var c=this.doc.removeLines(a,b);return this.doc.insertLines(a-1,c),-1},this.moveLinesDown=function(a,b){if(b>=this.doc.getLength()-1)return 0;var c=this.doc.removeLines(a,b);return this.doc.insertLines(a+1,c),1},this.duplicateLines=function(a,b){var a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b),c=this.getLines(a,b);this.doc.insertLines(a,c);var d=b-a+1;return d},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipColumnToRow=function(a,b){return b<0?0:Math.min(this.doc.getLine(a).length,b)},this.$clipPositionToDocument=function(a,b){b=Math.max(0,b);if(a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$clipRangeToDocument=function(a){a.start.row<0?(a.start.row=0,a.start.column=0):a.start.column=this.$clipColumnToRow(a.start.row,a.start.column);var b=this.doc.getLength()-1;return a.end.row>b?(a.end.row=b,a.end.column=this.doc.getLine(b).length):a.end.column=this.$clipColumnToRow(a.end.row,a.end.column),a},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0);if(a){var b=this.getLength();this.$wrapData=[];for(var c=0;c<b;c++)this.$wrapData.push([]);this.$updateWrapData(0,b-1)}this._emit("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(a,b){if(this.$wrapLimitRange.min!==a||this.$wrapLimitRange.max!==b)this.$wrapLimitRange.min=a,this.$wrapLimitRange.max=b,this.$modified=!0,this._emit("changeWrapMode")},this.adjustWrapLimit=function(a){var b=this.$constrainWrapLimit(a);return b!=this.$wrapLimit&&b>0?(this.$wrapLimit=b,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._emit("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(a){var b=this.$wrapLimitRange.min;b&&(a=Math.max(b,a));var c=this.$wrapLimitRange.max;return c&&(a=Math.min(c,a)),Math.max(1,a)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b=this.$useWrapMode,c,d=a.data.action,e=a.data.range.start.row,f=a.data.range.end.row,g=a.data.range.start,h=a.data.range.end,i=null;d.indexOf("Lines")!=-1?(d=="insertLines"?f=e+a.data.lines.length:f=e,c=a.data.lines?a.data.lines.length:f-e):c=f-e;if(c!=0)if(d.indexOf("remove")!=-1){b&&this.$wrapData.splice(e,c);var j=this.$foldData;i=this.getFoldsInRange(a.data.range),this.removeFolds(i);var k=this.getFoldLine(h.row),l=0;if(k){k.addRemoveChars(h.row,h.column,g.column-h.column),k.shiftRow(-c);var m=this.getFoldLine(e);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l<j.length;l++){var k=j[l];k.start.row>=h.row&&k.shiftRow(-c)}f=e}else{var n;if(b){n=[e,0];for(var o=0;o<c;o++)n.push([]);this.$wrapData.splice.apply(this.$wrapData,n)}var j=this.$foldData,k=this.getFoldLine(e),l=0;if(k){var p=k.range.compareInside(g.row,g.column);p==0?(k=k.split(g.row,g.column),k.shiftRow(c),k.addRemoveChars(f,0,h.column-g.column)):p==-1&&(k.addRemoveChars(e,0,h.column-g.column),k.shiftRow(c)),l=j.indexOf(k)+1}for(l;l<j.length;l++){var k=j[l];k.start.row>=e&&k.shiftRow(c)}}else{c=Math.abs(a.data.range.start.column-a.data.range.end.column),d.indexOf("remove")!=-1&&(i=this.getFoldsInRange(a.data.range),this.removeFolds(i),c=-c);var k=this.getFoldLine(e);k&&k.addRemoveChars(e,g.column,c)}return b&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),b&&this.$updateWrapData(e,f),i},this.$updateWrapData=function(a,b){var c=this.doc.getAllLines(),d=this.getTabSize(),e=this.$wrapData,g=this.$wrapLimit,h,k,l=a;b=Math.min(b,c.length-1);while(l<=b){k=this.getFoldLine(l,k);if(!k)h=this.$getDisplayTokens(f.stringTrimRight(c[l])),e[l]=this.$computeWrapSplits(h,g,d),l++;else{h=[],k.walk(function(a,b,d,e){var f;if(a){f=this.$getDisplayTokens(a,h.length),f[0]=i;for(var g=1;g<f.length;g++)f[g]=j}else f=this.$getDisplayTokens(c[b].substring(e,d),h.length);h=h.concat(f)}.bind(this),k.end.row,c[k.end.row].length+1);while(h.length!=0&&h[h.length-1]>=n)h.pop();e[k.start.row]=this.$computeWrapSplits(h,g,d),l=k.end.row+1}}};var b=1,c=2,i=3,j=4,l=9,n=10,o=11,p=12;this.$computeWrapSplits=function(a,b){function g(b){var d=a.slice(e,b),g=d.length;d.join("").replace(/12/g,function(){g-=1}).replace(/2/g,function(){g-=1}),f+=g,c.push(f),e=b}if(a.length==0)return[];var c=[],d=a.length,e=0,f=0;while(d-e>b){var h=e+b;if(a[h]>=n){while(a[h]>=n)h++;g(h);continue}if(a[h]==i||a[h]==j){for(h;h!=e-1;h--)if(a[h]==i)break;if(h>e){g(h);continue}h=e+b;for(h;h<a.length;h++)if(a[h]!=j)break;if(h==a.length)break;g(h);continue}var k=Math.max(h-10,e-1);while(h>k&&a[h]<i)h--;while(h>k&&a[h]==l)h--;if(h>k){g(++h);continue}h=e+b,g(h)}return c},this.$getDisplayTokens=function(a,d){var e=[],f;d=d||0;for(var g=0;g<a.length;g++){var h=a.charCodeAt(g);if(h==9){f=this.getScreenTabSize(e.length+d),e.push(o);for(var i=1;i<f;i++)e.push(p)}else h==32?e.push(n):h>39&&h<48||h>57&&h<64?e.push(l):h>=4352&&q(h)?e.push(b,c):e.push(b)}return e},this.$getStringScreenWidth=function(a,b,c){if(b==0)return[0,0];b==null&&(b=c+a.length*Math.max(this.getTabSize(),2)),c=c||0;var d,e;for(e=0;e<a.length;e++){d=a.charCodeAt(e),d==9?c+=this.getScreenTabSize(c):d>=4352&&q(d)?c+=2:c+=1;if(c>b)break}return[c,e]},this.getRowLength=function(a){return!this.$useWrapMode||!this.$wrapData[a]?1:this.$wrapData[a].length+1},this.getRowHeight=function(a,b){return this.getRowLength(b)*a.lineHeight},this.getScreenLastRowColumn=function(a){var b=this.screenToDocumentPosition(a,Number.MAX_VALUE);return this.documentToScreenColumn(b.row,b.column)},this.getDocumentLastRowColumn=function(a,b){var c=this.documentToScreenRow(a,b);return this.getScreenLastRowColumn(c)},this.getDocumentLastRowColumnPosition=function(a,b){var c=this.documentToScreenRow(a,b);return this.screenToDocumentPosition(c,Number.MAX_VALUE/10)},this.getRowSplitData=function(a){return this.$useWrapMode?this.$wrapData[a]:undefined},this.getScreenTabSize=function(a){return this.$tabSize-a%this.$tabSize},this.screenToDocumentRow=function(a,b){return this.screenToDocumentPosition(a,b).row},this.screenToDocumentColumn=function(a,b){return this.screenToDocumentPosition(a,b).column},this.screenToDocumentPosition=function(a,b){if(a<0)return{row:0,column:0};var c,d=0,e=0,f,g=0,h=0,i=this.$rowCache;for(var j=0;j<i.length;j++){if(!(i[j].screenRow<a))break;g=i[j].screenRow,d=i[j].docRow}var k=!i.length||j==i.length,l=this.getLength()-1,m=this.getNextFoldLine(d),n=m?m.start.row:Infinity;while(g<=a){h=this.getRowLength(d);if(g+h-1>=a||d>=l)break;g+=h,d++,d>n&&(d=m.end.row+1,m=this.getNextFoldLine(d,m),n=m?m.start.row:Infinity),k&&i.push({docRow:d,screenRow:g})}if(m&&m.start.row<=d)c=this.getFoldDisplayLine(m),d=m.start.row;else{if(g+h<=a||d>l)return{row:l,column:this.getLine(l).length};c=this.getLine(d),m=null}if(this.$useWrapMode){var o=this.$wrapData[d];o&&(f=o[a-g],a>g&&o.length&&(e=o[a-g-1]||o[o.length-1],c=c.substring(e)))}return e+=this.$getStringScreenWidth(c,b)[1],this.$useWrapMode&&e>=f&&(e=f-1),m?m.idxToPosition(e):{row:d,column:e}},this.documentToScreenPosition=function(a,b){if(typeof b=="undefined")var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d;if(this.$useWrapMode){d=this.$wrapData;if(a>d.length-1)return{row:this.getScreenLength(),column:d.length==0?0:d[d.length-1].length-1}}var e=0,f=null,g=null;g=this.getFoldAt(a,b,1),g&&(a=g.start.row,b=g.start.column);var h,i=0,j=this.$rowCache;for(var k=0;k<j.length;k++){if(!(j[k].docRow<a))break;e=j[k].screenRow,i=j[k].docRow}var l=!j.length||k==j.length,m=this.getNextFoldLine(i),n=m?m.start.row:Infinity;while(i<a){if(i>=n){h=m.end.row+1;if(h>a)break;m=this.getNextFoldLine(h,m),n=m?m.start.row:Infinity}else h=i+1;e+=this.getRowLength(i),i=h,l&&j.push({docRow:i,screenRow:e})}var o="";m&&i>=n?(o=this.getFoldDisplayLine(m,a,b),f=m.start.row):(o=this.getLine(a).substring(0,b),f=a);if(this.$useWrapMode){var p=d[f],q=0;while(o.length>=p[q])e++,q++;o=o.substring(p[q-1]||0,o.length)}return{row:e,column:this.$getStringScreenWidth(o)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null;if(!this.$useWrapMode){a=this.getLength();var c=this.$foldData;for(var d=0;d<c.length;d++)b=c[d],a-=b.end.row-b.start.row}else{var e=this.$wrapData.length,f=0,d=0,b=this.$foldData[d++],g=b?b.start.row:Infinity;while(f<e)a+=this.$wrapData[f].length+1,f++,f>g&&(f=b.end.row+1,b=this.$foldData[d++],g=b?b.start.row:Infinity)}return a}}).call(n.prototype),a("./edit_session/folding").Folding.call(n.prototype),a("./edit_session/bracket_match").BracketMatch.call(n.prototype),b.EditSession=n}),define("ace/config",["require","exports","module","ace/lib/lang"],function(a,b,c){function g(a){return a.replace(/-(.)/g,function(a,b){return b.toUpperCase()})}"no use strict";var d=a("./lib/lang"),e=function(){return this}(),f={packaged:!1,workerPath:"",modePath:"",themePath:"",suffix:".js"};b.get=function(a){if(!f.hasOwnProperty(a))throw new Error("Unknown confik key: "+a);return f[a]},b.set=function(a,b){if(!f.hasOwnProperty(a))throw new Error("Unknown confik key: "+a);f[a]=b},b.all=function(){return d.copyObject(f)},b.init=function(){f.packaged=a.packaged||c.packaged||e.define&&define.packaged;if(!e.document)return"";var d={},h="",i,j=document.getElementsByTagName("script");for(var k=0;k<j.length;k++){var l=j[k],m=l.src||l.getAttribute("src");if(!m)continue;var n=l.attributes;for(var o=0,p=n.length;o<p;o++){var q=n[o];q.name.indexOf("data-ace-")===0&&(d[g(q.name.replace(/^data-ace-/,""))]=q.value)}var r=m.match(/^(?:(.*\/)ace\.js|(.*\/)ace((-uncompressed)?(-noconflict)?\.js))(?:\?|$)/);r&&(h=r[1]||r[2],i=r[3])}h&&(d.base=d.base||h,d.packaged=!0),d.suffix=d.suffix||i,d.workerPath=d.workerPath||d.base,d.modePath=d.modePath||d.base,d.themePath=d.themePath||d.base,delete d.base;for(var s in d)typeof d[s]!="undefined"&&b.set(s,d[s])}}),define("ace/lib/net",["require","exports","module"],function(a,b,c){"use strict",b.get=function(a,c){var d=b.createXhr();d.open("GET",a,!0),d.onreadystatechange=function(a){d.readyState===4&&c(d.responseText)},d.send(null)};var d=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];b.createXhr=function(){var a,b,c;if(typeof XMLHttpRequest!="undefined")return new XMLHttpRequest;for(b=0;b<3;b++){c=d[b];try{a=new ActiveXObject(c)}catch(e){}if(a){d=[c];break}}if(!a)throw new Error("createXhr(): XMLHttpRequest not available");return a},b.loadScript=function(a,b){var c=document.getElementsByTagName("head")[0],d=document.createElement("script");d.src=a,c.appendChild(d),d.onload=b}}),define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/lang"),f=a("./lib/event_emitter").EventEmitter,g=a("./range").Range,h=function(a){this.session=a,this.doc=a.getDocument(),this.clearSelection(),this.selectionLead=this.doc.createAnchor(0,0),this.selectionAnchor=this.doc.createAnchor(0,0);var b=this;this.selectionLead.on("change",function(a){b._emit("changeCursor"),b.$isEmpty||b._emit("changeSelection"),!b.$keepDesiredColumnOnChange&&a.old.column!=a.value.column&&(b.$desiredColumn=null)}),this.selectionAnchor.on("change",function(){b.$isEmpty||b._emit("changeSelection")})};(function(){d.implement(this,f),this.isEmpty=function(){return this.$isEmpty||this.selectionAnchor.row==this.selectionLead.row&&this.selectionAnchor.column==this.selectionLead.column},this.isMultiLine=function(){return this.isEmpty()?!1:this.getRange().isMultiLine()},this.getCursor=function(){return this.selectionLead.getPosition()},this.setSelectionAnchor=function(a,b){this.selectionAnchor.setPosition(a,b),this.$isEmpty&&(this.$isEmpty=!1,this._emit("changeSelection"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.selectionAnchor.getPosition()},this.getSelectionLead=function(){return this.selectionLead.getPosition()},this.shiftSelection=function(a){if(this.$isEmpty){this.moveCursorTo(this.selectionLead.row,this.selectionLead.column+a);return}var b=this.getSelectionAnchor(),c=this.getSelectionLead(),d=this.isBackwards();(!d||b.column!==0)&&this.setSelectionAnchor(b.row,b.column+a),(d||c.column!==0)&&this.$moveSelection(function(){this.moveCursorTo(c.row,c.column+a)})},this.isBackwards=function(){var a=this.selectionAnchor,b=this.selectionLead;return a.row>b.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.selectionAnchor,b=this.selectionLead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(a,this.doc.getLine(a).length),this.moveCursorTo(0,0)},this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.$desiredColumn=null},this.$moveSelection=function(a){var b=this.selectionLead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.selectWord=function(){var a=this.getCursor(),b=this.session.getWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectAWord=function(){var a=this.getCursor(),b=this.session.getAWordRange(a.row,a.column);this.setSelectionRange(b)},this.selectLine=function(){var a=this.selectionLead.row,b,c=this.session.getFoldLine(a);c?(a=c.start.row,b=c.end.row):b=a,this.setSelectionAnchor(a,0),this.$moveSelection(function(){this.moveCursorTo(b+1,0)})},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,-1))this.moveCursorTo(b.start.row,b.start.column);else if(a.column==0)a.row>0&&this.moveCursorTo(a.row-1,this.doc.getLine(a.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column-c,a.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a=this.selectionLead.getPosition(),b;if(b=this.session.getFoldAt(a.row,a.column,1))this.moveCursorTo(b.end.row,b.end.column);else if(this.selectionLead.column==this.doc.getLine(this.selectionLead.row).length)this.selectionLead.row<this.doc.getLength()-1&&this.moveCursorTo(this.selectionLead.row+1,0);else{var c=this.session.getTabSize(),a=this.selectionLead;this.session.isTabStop(a)&&this.doc.getLine(a.row).slice(a.column,a.column+c).split(" ").length-1==c?this.moveCursorBy(0,c):this.moveCursorBy(0,1)}},this.moveCursorLineStart=function(){var a=this.selectionLead.row,b=this.selectionLead.column,c=this.session.documentToScreenRow(a,b),d=this.session.screenToDocumentPosition(c,0),e=this.session.getDisplayLine(a,null,d.row,d.column),f=e.match(/^\s*/);f[0].length==b?this.moveCursorTo(d.row,d.column):this.moveCursorTo(d.row,d.column+f[0].length)},this.moveCursorLineEnd=function(){var a=this.selectionLead,b=this.session.getDocumentLastRowColumnPosition(a.row,a.column);this.moveCursorTo(b.row,b.column)},this.moveCursorFileEnd=function(){var a=this.doc.getLength()-1,b=this.doc.getLine(a).length;this.moveCursorTo(a,b)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorWordRight=function(){var a=this.selectionLead.row,b=this.selectionLead.column,c=this.doc.getLine(a),d=c.substring(b),e;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var f=this.session.getFoldAt(a,b,1);if(f){this.moveCursorTo(f.end.row,f.end.column);return}if(e=this.session.nonTokenRe.exec(d))b+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,d=c.substring(b);if(b>=c.length){this.moveCursorTo(a,c.length),this.moveCursorRight(),a<this.doc.getLength()-1&&this.moveCursorWordRight();return}if(e=this.session.tokenRe.exec(d))b+=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(a,b)},this.moveCursorWordLeft=function(){var a=this.selectionLead.row,b=this.selectionLead.column,c;if(c=this.session.getFoldAt(a,b,-1)){this.moveCursorTo(c.start.row,c.start.column);return}var d=this.session.getFoldStringAt(a,b,-1);d==null&&(d=this.doc.getLine(a).substring(0,b));var f=e.stringReverse(d),g;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;if(g=this.session.nonTokenRe.exec(f))b-=this.session.nonTokenRe.lastIndex,f=f.slice(this.session.nonTokenRe.lastIndex),this.session.nonTokenRe.lastIndex=0;if(b<=0){this.moveCursorTo(a,0),this.moveCursorLeft(),a>0&&this.moveCursorWordLeft();return}if(g=this.session.tokenRe.exec(f))b-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(a,b)},this.moveCursorBy=function(a,b){var c=this.session.documentToScreenPosition(this.selectionLead.row,this.selectionLead.column);b===0&&(this.$desiredColumn?c.column=this.$desiredColumn:this.$desiredColumn=c.column);var d=this.session.screenToDocumentPosition(c.row+a,c.column);this.moveCursorTo(d.row,d.column+b,b===0)},this.moveCursorToPosition=function(a){this.moveCursorTo(a.row,a.column)},this.moveCursorTo=function(a,b,c){var d=this.session.getFoldAt(a,b,1);d&&(a=d.start.row,b=d.start.column),this.$keepDesiredColumnOnChange=!0,this.selectionLead.setPosition(a,b),this.$keepDesiredColumnOnChange=!1,c||(this.$desiredColumn=null)},this.moveCursorToScreen=function(a,b,c){var d=this.session.screenToDocumentPosition(a,b);this.moveCursorTo(d.row,d.column,c)},this.detach=function(){this.selectionLead.detach(),this.selectionAnchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(a){this.setSelectionRange(a,a.cursor==a.start),this.$desiredColumn=a.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(a){var b=this.getRange();return a?(a.start.column=b.start.column,a.start.row=b.start.row,a.end.column=b.end.column,a.end.row=b.end.row):a=b,a.cursor=this.isBackwards()?a.start:a.end,a.desiredColumn=this.$desiredColumn,a}}).call(h.prototype),b.Selection=h}),define("ace/range",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.isEqual=function(a){return this.start.row==a.start.row&&this.end.row==a.end.row&&this.start.column==a.start.column&&this.end.column==a.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return this.compare(a,b)==0},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),b==1?(b=this.compare(d.row,d.column),b==1?2:b==0?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:b==1?42:0)},this.comparePoint=function(a){return this.compare(a.row,a.column)},this.containsRange=function(a){return this.comparePoint(a.start)==0&&this.comparePoint(a.end)==0},this.intersectsRange=function(a){var b=this.compareRange(a);return b==-1||b==0||b==1},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){typeof a=="object"?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){typeof a=="object"?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)||this.isStart(a,b)?!1:!0:!1},this.insideStart=function(a,b){return this.compare(a,b)==0?this.isEnd(a,b)?!1:!0:!1},this.insideEnd=function(a,b){return this.compare(a,b)==0?this.isStart(a,b)?!1:!0:!1},this.compare=function(a,b){return!this.isMultiLine()&&a===this.start.row?b<this.start.column?-1:b>this.end.column?1:0:a<this.start.row?-1:a>this.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};if(this.start.row>b)var e={row:b+1,column:0};if(this.start.row<a)var e={row:a,column:0};if(this.end.row<a)var c={row:a,column:0};return d.fromPoints(e||this.start,c||this.end)},this.extend=function(a,b){var c=this.compare(a,b);if(c==0)return this;if(c==-1)var e={row:a,column:b};else var f={row:a,column:b};return d.fromPoints(e||this.start,f||this.end)},this.fixOrientation=function(){if(this.start.row<this.end.row||this.start.row==this.end.row&&this.start.column<this.end.column)return!1;var a=this.start;return this.end=this.start,this.start=a,!0},this.isEmpty=function(){return this.start.row==this.end.row&&this.start.column==this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return d.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new d(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new d(this.start.row,0,this.end.row,0)},this.toScreenRange=function(a){var b=a.documentToScreenPosition(this.start),c=a.documentToScreenPosition(this.end);return new d(b.row,b.column,c.row,c.column)}}).call(d.prototype),d.fromPoints=function(a,b){return new d(a.row,a.column,b.row,b.column)},b.Range=d}),define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode"],function(a,b,c){"use strict";var d=a("../tokenizer").Tokenizer,e=a("./text_highlight_rules").TextHighlightRules,f=a("./behaviour").Behaviour,g=a("../unicode"),h=function(){this.$tokenizer=new d((new e).getRules()),this.$behaviour=new f};(function(){this.tokenRe=new RegExp("^["+g.packages.L+g.packages.Mn+g.packages.Mc+g.packages.Nd+g.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+g.packages.L+g.packages.Mn+g.packages.Mc+g.packages.Nd+g.packages.Pc+"\\$_]|s])+","g"),this.getTokenizer=function(){return this.$tokenizer},this.toggleCommentLines=function(a,b,c,d){},this.getNextLineIndent=function(a,b,c){return""},this.checkOutdent=function(a,b,c){return!1},this.autoOutdent=function(a,b,c){},this.$getIndent=function(a){var b=a.match(/^(\s+)/);return b?b[1]:""},this.createWorker=function(a){return null},this.highlightSelection=function(a){var b=a.session;b.$selectionOccurrences||(b.$selectionOccurrences=[]),b.$selectionOccurrences.length&&this.clearSelectionHighlight(a);var c=a.getSelectionRange();if(c.isEmpty()||c.isMultiLine())return;var d=c.start.column-1,e=c.end.column+1,f=b.getLine(c.start.row),g=f.length,h=f.substring(Math.max(d,0),Math.min(e,g));if(d>=0&&/^[\w\d]/.test(h)||e<=g&&/[\w\d]$/.test(h))return;h=f.substring(c.start.column,c.end.column);if(!/^[\w\d]+$/.test(h))return;var i=a.getCursorPosition(),j={wrap:!0,wholeWord:!0,caseSensitive:!0,needle:h},k=a.$search.getOptions();a.$search.set(j);var l=a.$search.findAll(b);l.forEach(function(a){if(!a.contains(i.row,i.column)){var c=b.addMarker(a,"ace_selected_word","text");b.$selectionOccurrences.push(c)}}),a.$search.set(k)},this.clearSelectionHighlight=function(a){if(!a.session.$selectionOccurrences)return;a.session.$selectionOccurrences.forEach(function(b){a.session.removeMarker(b)}),a.session.$selectionOccurrences=[]},this.createModeDelegates=function(a){if(!this.$embeds)return;this.$modes={};for(var b=0;b<this.$embeds.length;b++)a[this.$embeds[b]]&&(this.$modes[this.$embeds[b]]=new a[this.$embeds[b]]);var c=["toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction"];for(var b=0;b<c.length;b++)(function(a){var d=c[b],e=a[d];a[c[b]]=function(){return this.$delegator(d,arguments,e)}})(this)},this.$delegator=function(a,b,c){var d=b[0];for(var e=0;e<this.$embeds.length;e++){if(!this.$modes[this.$embeds[e]])continue;var f=d.split(this.$embeds[e]);if(!f[0]&&f[1]){b[0]=f[1];var g=this.$modes[this.$embeds[e]];return g[a].apply(g,b)}}var h=c.apply(this,b);return c?h:undefined},this.transformAction=function(a,b,c,d,e){if(this.$behaviour){var f=this.$behaviour.getBehaviours();for(var g in f)if(f[g][b]){var h=f[g][b].apply(this,arguments);if(h)return h}}}}).call(h.prototype),b.Mode=h}),define("ace/tokenizer",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b){b=b?"g"+b:"g",this.rules=a,this.regExps={},this.matchMappings={};for(var c in this.rules){var d=this.rules[c],e=d,f=[],g=0,h=this.matchMappings[c]={};for(var i=0;i<e.length;i++){e[i].regex instanceof RegExp&&(e[i].regex=e[i].regex.toString().slice(1,-1));var j=(new RegExp("(?:("+e[i].regex+")|(.))")).exec("a").length-2,k=e[i].regex.replace(/\\([0-9]+)/g,function(a,b){return"\\"+(parseInt(b,10)+g+1)});if(j>1&&e[i].token.length!==j-1)throw new Error("Matching groups and length of the token array don't match in rule #"+i+" of state "+c);h[g]={rule:i,len:j},g+=j,f.push(k)}this.regExps[c]=new RegExp("(?:("+f.join(")|(")+")|(.))",b)}};(function(){this.getLineTokens=function(a,b){var c=b,d=this.rules[c],e=this.matchMappings[c],f=this.regExps[c];f.lastIndex=0;var g,h=[],i=0,j={type:null,value:""};while(g=f.exec(a)){var k="text",l=null,m=[g[0]];for(var n=0;n<g.length-2;n++){if(g[n+1]===undefined)continue;l=d[e[n].rule],e[n].len>1&&(m=g.slice(n+2,n+1+e[n].len)),typeof l.token=="function"?k=l.token.apply(this,m):k=l.token;var o=l.next;o&&o!==c&&(c=o,d=this.rules[c],e=this.matchMappings[c],i=f.lastIndex,f=this.regExps[c],f.lastIndex=i);break}if(m[0]){typeof k=="string"&&(m=[m.join("")],k=[k]);for(var n=0;n<m.length;n++){if(!m[n])continue;(!l||l.merge||k[n]==="text")&&j.type===k[n]?j.value+=m[n]:(j.type&&h.push(j),j={type:k[n],value:m[n]})}}if(i==a.length)break;i=f.lastIndex}return j.type&&h.push(j),{tokens:h,state:c}}}).call(d.prototype),b.Tokenizer=d}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(a,b,c){"use strict";var d=a("../lib/lang"),e=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{token:"text",regex:".+"}]}};(function(){this.addRules=function(a,b){for(var c in a){var d=a[c];for(var e=0;e<d.length;e++){var f=d[e];f.next?f.next=b+f.next:f.next=b+c}this.$rules[b+c]=d}},this.getRules=function(){return this.$rules},this.embedRules=function(a,b,c,e){var f=(new a).getRules();if(e)for(var g=0;g<e.length;g++)e[g]=b+e[g];else{e=[];for(var h in f)e.push(b+h)}this.addRules(f,b);for(var g=0;g<e.length;g++)Array.prototype.unshift.apply(this.$rules[e[g]],d.deepCopy(c));this.$embeds||(this.$embeds=[]),this.$embeds.push(b)},this.getEmbeds=function(){return this.$embeds}}).call(e.prototype),b.TextHighlightRules=e}),define("ace/mode/behaviour",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.$behaviours={}};(function(){this.add=function(a,b,c){switch(undefined){case this.$behaviours:this.$behaviours={};case this.$behaviours[a]:this.$behaviours[a]={}}this.$behaviours[a][b]=c},this.addBehaviours=function(a){for(var b in a)for(var c in a[b])this.add(b,c,a[b][c])},this.remove=function(a){this.$behaviours&&this.$behaviours[a]&&delete this.$behaviours[a]},this.inherit=function(a,b){if(typeof a=="function")var c=(new a).getBehaviours(b);else var c=a.getBehaviours(b);this.addBehaviours(c)},this.getBehaviours=function(a){if(!a)return this.$behaviours;var b={};for(var c=0;c<a.length;c++)this.$behaviours[a[c]]&&(b[a[c]]=this.$behaviours[a[c]]);return b}}).call(d.prototype),b.Behaviour=d}),define("ace/unicode",["require","exports","module"],function(a,b,c){function d(a){var c=/\w{4}/g;for(var d in a)b.packages[d]=a[d].replace(c,"\\u$&")}"use strict",b.packages={},d({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=a("./range").Range,g=a("./anchor").Anchor,h=function(a){this.$lines=[],Array.isArray(a)?this.insertLines(0,a):a.length==0?this.$lines=[""]:this.insert({row:0,column:0},a)};(function(){d.implement(this,e),this.setValue=function(a){var b=this.getLength();this.remove(new f(0,0,b,this.getLine(b-1).length)),this.insert({row:0,column:0},a)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(a,b){return new g(this,a,b)},"aaa".split(/a/).length==0?this.$split=function(a){return a.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(a){return a.split(/\r\n|\r|\n/)},this.$detectNewLine=function(a){var b=a.match(/^.*?(\r\n|\r|\n)/m);b?this.$autoNewLine=b[1]:this.$autoNewLine="\n"},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";case"auto":return this.$autoNewLine}},this.$autoNewLine="\n",this.$newLineMode="auto",this.setNewLineMode=function(a){if(this.$newLineMode===a)return;this.$newLineMode=a},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(a){return a=="\r\n"||a=="\r"||a=="\n"},this.getLine=function(a){return this.$lines[a]||""},this.getLines=function(a,b){return this.$lines.slice(a,b+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(a){if(a.start.row==a.end.row)return this.$lines[a.start.row].substring(a.start.column,a.end.column);var b=[];return b.push(this.$lines[a.start.row].substring(a.start.column)),b.push.apply(b,this.getLines(a.start.row+1,a.end.row-1)),b.push(this.$lines[a.end.row].substring(0,a.end.column)),b.join(this.getNewLineCharacter())},this.$clipPosition=function(a){var b=this.getLength();return a.row>=b&&(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length),a},this.insert=function(a,b){if(!b||b.length===0)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=c.length==0?null:c.splice(c.length-1,1)[0];return a=this.insertInLine(a,d),e!==null&&(a=this.insertNewLine(a),a=this.insertLines(a.row,c),a=this.insertInLine(a,e||"")),a},this.insertLines=function(a,b){if(b.length==0)return{row:a,column:0};var c=[a,0];c.push.apply(c,b),this.$lines.splice.apply(this.$lines,c);var d=new f(a,0,a+b.length,0),e={action:"insertLines",range:d,lines:b};return this._emit("change",{data:e}),d.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};return this._emit("change",{data:d}),c},this.insertInLine=function(a,b){if(b.length==0)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};return this._emit("change",{data:e}),d},this.remove=function(a){a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end);if(a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=a.start.column==0?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this.removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b==c)return;var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};return this._emit("change",{data:i}),d.start},this.removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};return this._emit("change",{data:e}),d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._emit("change",{data:g})},this.replace=function(a,b){if(b.length==0&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);if(b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b<a.length;b++){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.insertLines(d.start.row,c.lines):c.action=="insertText"?this.insert(d.start,c.text):c.action=="removeLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="removeText"&&this.remove(d)}},this.revertDeltas=function(a){for(var b=a.length-1;b>=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);c.action=="insertLines"?this.removeLines(d.start.row,d.end.row-1):c.action=="insertText"?this.remove(d):c.action=="removeLines"?this.insertLines(d.start.row,c.lines):c.action=="removeText"&&this.insert(d.start,c.text)}}}).call(h.prototype),b.Document=h}),define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=b.Anchor=function(a,b,c){this.document=a,typeof c=="undefined"?this.setPosition(b.row,b.column):this.setPosition(b,c),this.$onChange=this.onChange.bind(this),a.on("change",this.$onChange)};(function(){d.implement(this,e),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(a){var b=a.data,c=b.range;if(c.start.row==c.end.row&&c.start.row!=this.row)return;if(c.start.row>this.row)return;if(c.start.row==this.row&&c.start.column>this.column)return;var d=this.row,e=this.column;b.action==="insertText"?c.start.row===d&&c.start.column<=e?c.start.row===c.end.row?e+=c.end.column-c.start.column:(e-=c.start.column,d+=c.end.row-c.start.row):c.start.row!==c.end.row&&c.start.row<d&&(d+=c.end.row-c.start.row):b.action==="insertLines"?c.start.row<=d&&(d+=c.end.row-c.start.row):b.action=="removeText"?c.start.row==d&&c.start.column<e?c.end.column>=e?e=c.start.column:e=Math.max(0,e-(c.end.column-c.start.column)):c.start.row!==c.end.row&&c.start.row<d?(c.end.row==d&&(e=Math.max(0,e-c.end.column)+c.start.column),d-=c.end.row-c.start.row):c.end.row==d&&(d-=c.end.row-c.start.row,e=Math.max(0,e-c.end.column)+c.start.column):b.action=="removeLines"&&c.start.row<=d&&(c.end.row<=d?d-=c.end.row-c.start.row:(d=c.start.row,e=0)),this.setPosition(d,e,!0)},this.setPosition=function(a,b,c){var d;c?d={row:a,column:b}:d=this.$clipPositionToDocument(a,b);if(this.row==d.row&&this.column==d.column)return;var e={row:this.row,column:this.column};this.row=d.row,this.column=d.column,this._emit("change",{old:e,value:d})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.$clipPositionToDocument=function(a,b){var c={};return a>=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}}).call(f.prototype)}),define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=function(a,b){this.running=!1,this.lines=[],this.currentLine=0,this.tokenizer=a;var c=this;this.$worker=function(){if(!c.running)return;var a=new Date,b=c.currentLine,d=c.doc,e=0,f=d.getLength();while(c.currentLine<f){c.lines[c.currentLine]=c.$tokenizeRows(c.currentLine,c.currentLine)[0],c.currentLine++,e+=1;if(e%5==0&&new Date-a>20){c.fireUpdateEvent(b,c.currentLine-1),c.running=setTimeout(c.$worker,20);return}}c.running=!1,c.fireUpdateEvent(b,f-1)}};(function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._emit("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a,b){return this.$tokenizeRows(a,b)},this.getState=function(a){return this.$tokenizeRows(a,a)[0].state},this.$tokenizeRows=function(a,b){if(!this.doc||isNaN(a)||isNaN(b))return[{state:"start",tokens:[]}];var c=[],d="start",e=!1;a>0&&this.lines[a-1]?(d=this.lines[a-1].state,e=!0):a==0?(d="start",e=!0):this.lines.length>0&&(d=this.lines[this.lines.length-1].state);var f=this.doc.getLines(a,b);for(var g=a;g<=b;g++)if(!this.lines[g]){var h=this.tokenizer.getLineTokens(f[g-a]||"",d),d=h.state;c.push(h),e&&(this.lines[g]=h)}else{var h=this.lines[g];d=h.state,c.push(h)}return c}}).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(a,b,c){function h(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if(!d)return null;var e=d.folds;for(var f=0;f<e.length;f++){var g=e[f];if(g.range.contains(a,b)){if(c==1&&g.range.isEnd(a,b))continue;if(c==-1&&g.range.isStart(a,b))continue;return g}}},this.getFoldsInRange=function(a){a=a.clone();var b=a.start,c=a.end,d=this.$foldData,e=[];b.column+=1,c.column-=1;for(var f=0;f<d.length;f++){var g=d[f].range.compareRange(a);if(g==2)continue;if(g==-2)break;var h=d[f].folds;for(var i=0;i<h.length;i++){var j=h[i];g=j.range.compareRange(a);if(g==-2)break;if(g==2)continue;if(g==42)break;e.push(j)}}return e},this.getAllFolds=function(){function c(b){a.push(b);if(!b.subFolds)return;for(var d=0;d<b.subFolds.length;d++)c(b.subFolds[d])}var a=[],b=this.$foldData;for(var d=0;d<b.length;d++)for(var e=0;e<b[d].folds.length;e++)c(b[d].folds[e]);return a},this.getFoldStringAt=function(a,b,c,d){d=d||this.getFoldLine(a);if(!d)return null;var e={end:{column:0}},f,g;for(var h=0;h<d.folds.length;h++){g=d.folds[h];var i=g.range.compareEnd(a,b);if(i==-1){f=this.getLine(g.start.row).substring(e.end.column,g.start.column);break}if(i===0)return null;e=g}return f||(f=this.getLine(g.start.row).substring(e.end.column)),c==-1?f.substring(0,b-e.end.column):c==1?f.substring(b-e.end.column):f},this.getFoldLine=function(a,b){var c=this.$foldData,d=0;b&&(d=c.indexOf(b)),d==-1&&(d=0);for(d;d<c.length;d++){var e=c[d];if(e.start.row<=a&&e.end.row>=a)return e;if(e.end.row>a)return null}return null},this.getNextFoldLine=function(a,b){var c=this.$foldData,d=0;b&&(d=c.indexOf(b)),d==-1&&(d=0);for(d;d<c.length;d++){var e=c[d];if(e.end.row>=a)return e}return null},this.getFoldedRowCount=function(a,b){var c=this.$foldData,d=b-a+1;for(var e=0;e<c.length;e++){var f=c[e],g=f.end.row,h=f.start.row;if(g>=b){h<b&&(h>=a?d-=b-h:d=0);break}g>=a&&(h>=a?d-=g-h:d-=g-a+1)}return d},this.$addFoldLine=function(a){return this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row}),a},this.addFold=function(a,b){var c=this.$foldData,d=!1,g;a instanceof f?g=a:g=new f(b,a),this.$clipRangeToDocument(g.range);var h=g.start.row,i=g.start.column,j=g.end.row,k=g.end.column;if(g.placeholder.length<2)throw"Placeholder has to be at least 2 characters";if(h==j&&k-i<2)throw"The range has to be at least 2 characters width";var l=this.getFoldAt(h,i,1),m=this.getFoldAt(j,k,-1);if(l&&m==l)return l.addSubFold(g);if(l&&!l.range.isStart(h,i)||m&&!m.range.isEnd(j,k))throw"A fold can't intersect already existing fold"+g.range+l.range;var n=this.getFoldsInRange(g.range);n.length>0&&(this.removeFolds(n),g.subFolds=n);for(var o=0;o<c.length;o++){var p=c[o];if(j==p.start.row){p.addFold(g),d=!0;break}if(h==p.end.row){p.addFold(g),d=!0;if(!g.sameRow){var q=c[o+1];if(q&&q.start.row==j){p.merge(q);break}}break}if(j<=p.start.row)break}return d||(p=this.$addFoldLine(new e(this.$foldData,g))),this.$useWrapMode&&this.$updateWrapData(p.start.row,p.start.row),this.$modified=!0,this._emit("changeFold",{data:g}),g},this.addFolds=function(a){a.forEach(function(a){this.addFold(a)},this)},this.removeFold=function(a){var b=a.foldLine,c=b.start.row,d=b.end.row,e=this.$foldData,f=b.folds;if(f.length==1)e.splice(e.indexOf(b),1);else if(b.range.isEnd(a.end.row,a.end.column))f.pop(),b.end.row=f[f.length-1].end.row,b.end.column=f[f.length-1].end.column;else if(b.range.isStart(a.start.row,a.start.column))f.shift(),b.start.row=f[0].start.row,b.start.column=f[0].start.column;else if(a.sameRow)f.splice(f.indexOf(a),1);else{var g=b.split(a.start.row,a.start.column);f=g.folds,f.shift(),g.start.row=f[0].start.row,g.start.column=f[0].start.column}this.$useWrapMode&&this.$updateWrapData(c,d),this.$modified=!0,this._emit("changeFold",{data:a})},this.removeFolds=function(a){var b=[];for(var c=0;c<a.length;c++)b.push(a[c]);b.forEach(function(a){this.removeFold(a)},this),this.$modified=!0},this.expandFold=function(a){this.removeFold(a),a.subFolds.forEach(function(a){this.addFold(a)},this),a.subFolds=[]},this.expandFolds=function(a){a.forEach(function(a){this.expandFold(a)},this)},this.unfold=function(a,b){var c,e;a==null?c=new d(0,0,this.getLength(),0):typeof a=="number"?c=new d(a,0,a,this.getLine(a).length):"row"in a?c=d.fromPoints(a,a):c=a,e=this.getFoldsInRange(c);if(b)this.removeFolds(e);else while(e.length)this.expandFolds(e),e=this.getFoldsInRange(c)},this.isRowFolded=function(a,b){return!!this.getFoldLine(a,b)},this.getRowFoldEnd=function(a,b){var c=this.getFoldLine(a,b);return c?c.end.row:a},this.getFoldDisplayLine=function(a,b,c,d,e){d==null&&(d=a.start.row,e=0),b==null&&(b=a.end.row,c=this.getLine(b).length);var f=this.doc,g="";return a.walk(function(a,b,c,h){if(b<d)return;if(b==d){if(c<e)return;h=Math.max(e,h)}a?g+=a:g+=f.getLine(b).substring(h,c)}.bind(this),b,c),g},this.getDisplayLine=function(a,b,c,d){var e=this.getFoldLine(a);if(!e){var f;return f=this.doc.getLine(a),f.substring(d||0,b||f.length)}return this.getFoldDisplayLine(e,a,b,c,d)},this.$cloneFoldData=function(){var a=[];return a=this.$foldData.map(function(b){var c=b.folds.map(function(a){return a.clone()});return new e(a,c)}),a},this.toggleFold=function(a){var b=this.selection,c=b.getRange(),d,e;if(c.isEmpty()){var f=c.start;d=this.getFoldAt(f.row,f.column);if(d){this.expandFold(d);return}(e=this.findMatchingBracket(f))?c.comparePoint(e)==1?c.end=e:(c.start=e,c.start.column++,c.end.column--):(e=this.findMatchingBracket({row:f.row,column:f.column+1}))?(c.comparePoint(e)==1?c.end=e:c.start=e,c.start.column++):c=this.getCommentFoldRange(f.row,f.column)||c}else{var g=this.getFoldsInRange(c);if(a&&g.length){this.expandFolds(g);return}g.length==1&&(d=g[0])}d||(d=this.getFoldAt(c.start.row,c.start.column));if(d&&d.range.toString()==c.toString()){this.expandFold(d);return}var h="...";if(!c.isMultiLine()){h=this.getTextRange(c);if(h.length<4)return;h=h.trim().substring(0,2)+".."}this.addFold(h,c)},this.getCommentFoldRange=function(a,b){var c=new g(this,a,b),e=c.getCurrentToken();if(e&&/^comment|string/.test(e.type)){var f=new d,h=new RegExp(e.type.replace(/\..*/,"\\."));do e=c.stepBackward();while(e&&h.test(e.type));c.stepForward(),f.start.row=c.getCurrentTokenRow(),f.start.column=c.getCurrentTokenColumn()+2,c=new g(this,a,b);do e=c.stepForward();while(e&&h.test(e.type));return e=c.stepBackward(),f.end.row=c.getCurrentTokenRow(),f.end.column=c.getCurrentTokenColumn()+e.value.length,f}},this.foldAll=function(a,b){var c=this.foldWidgets;b=b||this.getLength();for(var d=a||0;d<b;d++){c[d]==null&&(c[d]=this.getFoldWidget(d));if(c[d]!="start")continue;var e=this.getFoldWidgetRange(d);if(e&&e.end.row<b)try{this.addFold("...",e)}catch(f){}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(a){if(!this.$foldStyles[a])throw new Error("invalid fold style: "+a+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==a)return;this.$foldStyle=a,a=="manual"&&this.unfold();var b=this.$foldMode;this.$setFolding(null),this.$setFolding(b)},this.$setFolding=function(a){if(this.$foldMode==a)return;this.$foldMode=a,this.removeListener("change",this.$updateFoldWidgets),this._emit("changeAnnotation");if(!a||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=a.getFoldWidget.bind(a,this,this.$foldStyle),this.getFoldWidgetRange=a.getFoldWidgetRange.bind(a,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets)},this.onFoldWidgetClick=function(a,b){var c=this.getFoldWidget(a),d=this.getLine(a),e=b.shiftKey,f=e||b.ctrlKey||b.altKey||b.metaKey,g;c=="end"?g=this.getFoldAt(a,0,-1):g=this.getFoldAt(a,d.length,1);if(g){f?this.removeFold(g):this.expandFold(g);return}var h=this.getFoldWidgetRange(a);if(h){if(!h.isMultiLine()){g=this.getFoldAt(h.start.row,h.start.column,1);if(g&&h.isEqual(g.range)){this.removeFold(g);return}}e||this.addFold("...",h),f&&this.foldAll(h.start.row+1,h.end.row)}else f&&this.foldAll(a+1,this.getLength()),b.target.className+=" invalid"},this.updateFoldWidgets=function(a){var b=a.data,c=b.range,d=c.start.row,e=c.end.row-d;if(e===0)this.foldWidgets[d]=null;else if(b.action=="removeText"||b.action=="removeLines")this.foldWidgets.splice(d,e+1,null);else{var f=Array(e+1);f.unshift(d,1),this.foldWidgets.splice.apply(this.foldWidgets,f)}}}"use strict";var d=a("../range").Range,e=a("./fold_line").FoldLine,f=a("./fold").Fold,g=a("../token_iterator").TokenIterator;b.Folding=h}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(a,b,c){function e(a,b){this.foldData=a,Array.isArray(b)?this.folds=b:b=this.folds=[b];var c=b[b.length-1];this.range=new d(b[0].start.row,b[0].start.column,c.end.row,c.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(a){a.setFoldLine(this)},this)}"use strict";var d=a("../range").Range;(function(){this.shiftRow=function(a){this.start.row+=a,this.end.row+=a,this.folds.forEach(function(b){b.start.row+=a,b.end.row+=a})},this.addFold=function(a){if(a.sameRow){if(a.start.row<this.startRow||a.endRow>this.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else{if(a.end.row!=this.start.row)throw"Trying to add fold to FoldRow that doesn't have a matching row";this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column}a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d=0,e=this.folds,f,g,h,i=!0;b==null&&(b=this.end.row,c=this.end.column);for(var j=0;j<e.length;j++){f=e[j],g=f.range.compareStart(b,c);if(g==-1){a(null,b,c,d,i);return}h=a(null,f.start.row,f.start.column,d,i),h=!h&&a(f.placeholder,f.start.row,f.start.column,d);if(h||g==0)return;i=!f.sameRow,d=f.end.column}a(null,b,c,d,i)},this.getNextFoldTo=function(a,b){var c,d;for(var e=0;e<this.folds.length;e++){c=this.folds[e],d=c.range.compareEnd(a,b);if(d==-1)return{fold:c,kind:"after"};if(d==0)return{fold:c,kind:"inside"}}return null},this.addRemoveChars=function(a,b,c){var d=this.getNextFoldTo(a,b),e,f;if(d){e=d.fold;if(d.kind=="inside"&&e.start.column!=b&&e.start.row!=a)throw"Moving characters inside of a fold should never be reached";if(e.start.row==a){f=this.folds;var g=f.indexOf(e);g==0&&(this.start.column+=c);for(g;g<f.length;g++){e=f[g],e.start.column+=c;if(!e.sameRow)return;e.end.column+=c}this.end.column+=c}}},this.split=function(a,b){var c=this.getNextFoldTo(a,b).fold,d=this.folds,f=this.foldData;if(!c)return null;var g=d.indexOf(c),h=d[g-1];this.end.row=h.end.row,this.end.column=h.end.column,d=d.splice(g,d.length-g);var i=new e(f,d);return f.splice(f.indexOf(this)+1,0,i),i},this.merge=function(a){var b=a.folds;for(var c=0;c<b.length;c++)this.addFold(b[c]);var d=this.foldData;d.splice(d.indexOf(a),1)},this.toString=function(){var a=[this.range.toString()+": ["];return this.folds.forEach(function(b){a.push("  "+b.toString())}),a.push("]"),a.join("\n")},this.idxToPosition=function(a){var b=0,c;for(var d=0;d<this.folds.length;d++){var c=this.folds[d];a-=c.start.column-b;if(a<0)return{row:c.start.row,column:c.start.column+a};a-=c.placeholder.length;if(a<0)return c.start;b=c.end.column}return{row:this.end.row,column:this.end.column+a}}}).call(e.prototype),b.FoldLine=e}),define("ace/edit_session/fold",["require","exports","module"],function(a,b,c){"use strict";var d=b.Fold=function(a,b){this.foldLine=null,this.placeholder=b,this.range=a,this.start=a.start,this.end=a.end,this.sameRow=a.start.row==a.end.row,this.subFolds=[]};(function(){this.toString=function(){return'"'+this.placeholder+'" '+this.range.toString()},this.setFoldLine=function(a){this.foldLine=a,this.subFolds.forEach(function(b){b.setFoldLine(a)})},this.clone=function(){var a=this.range.clone(),b=new d(a,this.placeholder);return this.subFolds.forEach(function(a){b.subFolds.push(a.clone())}),b},this.addSubFold=function(a){if(this.range.isEqual(a))return this;if(!this.range.containsRange(a))throw"A fold can't intersect already existing fold"+a.range+this.range;var b=a.range.start.row,c=a.range.start.column;for(var d=0,e=-1;d<this.subFolds.length;d++){e=this.subFolds[d].range.compare(b,c);if(e!=1)break}var f=this.subFolds[d];if(e==0)return f.addSubFold(a);var b=a.range.end.row,c=a.range.end.column;for(var g=d,e=-1;g<this.subFolds.length;g++){e=this.subFolds[g].range.compare(b,c);if(e!=1)break}var h=this.subFolds[g];if(e==0)throw"A fold can't intersect already existing fold"+a.range+this.range;var i=this.subFolds.splice(d,g-d,a);return a.setFoldLine(this.foldLine),a}}).call(d.prototype)}),define("ace/token_iterator",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b,c){this.$session=a,this.$row=b,this.$rowTokens=a.getTokens(b,b)[0].tokens;var d=a.getTokenAt(b,c);this.$tokenIndex=d?d.index:-1};(function(){this.stepBackward=function(){this.$tokenIndex-=1;while(this.$tokenIndex<0){this.$row-=1;if(this.$row<0)return this.$row=0,null;this.$rowTokens=this.$session.getTokens(this.$row,this.$row)[0].tokens,this.$tokenIndex=this.$rowTokens.length-1}return this.$rowTokens[this.$tokenIndex]},this.stepForward=function(){var a=this.$session.getLength();this.$tokenIndex+=1;while(this.$tokenIndex>=this.$rowTokens.length){this.$row+=1;if(this.$row>=a)return this.$row=a-1,null;this.$rowTokens=this.$session.getTokens(this.$row,this.$row)[0].tokens,this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var a=this.$rowTokens,b=this.$tokenIndex,c=a[b].start;if(c!==undefined)return c;c=0;while(b>0)b-=1,c+=a[b].value.length;return c}}).call(d.prototype),b.TokenIterator=d}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator"],function(a,b,c){function e(){this.findMatchingBracket=function(a){if(a.column==0)return null;var b=this.getLine(a.row).charAt(a.column-1);if(b=="")return null;var c=b.match(/([\(\[\{])|([\)\]\}])/);return c?c[1]?this.$findClosingBracket(c[1],a):this.$findOpeningBracket(c[2],a):null},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(a,b){var c=this.$brackets[a],e=1,f=new d(this,b.row,b.column),g=f.getCurrentToken();if(!g)return null;var h=new RegExp("(\\.?"+g.type.replace(".","|").replace("rparen","lparen|rparen")+")+"),i=b.column-f.getCurrentTokenColumn()-2,j=g.value;for(;;){while(i>=0){var k=j.charAt(i);if(k==c){e-=1;if(e==0)return{row:f.getCurrentTokenRow(),column:i+f.getCurrentTokenColumn()}}else k==a&&(e+=1);i-=1}do g=f.stepBackward();while(g&&!h.test(g.type));if(g==null)break;j=g.value,i=j.length-1}return null},this.$findClosingBracket=function(a,b){var c=this.$brackets[a],e=1,f=new d(this,b.row,b.column),g=f.getCurrentToken();if(!g)return null;var h=new RegExp("(\\.?"+g.type.replace(".","|").replace("lparen","lparen|rparen")+")+"),i=b.column-f.getCurrentTokenColumn();for(;;){var j=g.value,k=j.length;while(i<k){var l=j.charAt(i);if(l==c){e-=1;if(e==0)return{row:f.getCurrentTokenRow(),column:i+f.getCurrentTokenColumn()}}else l==a&&(e+=1);i+=1}do g=f.stepForward();while(g&&!h.test(g.type));if(g==null)break;i=0}return null}}"use strict";var d=a("../token_iterator").TokenIterator;b.BracketMatch=e}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(a,b,c){"use strict";var d=a("./lib/lang"),e=a("./lib/oop"),f=a("./range").Range,g=function(){this.$options={needle:"",backwards:!1,wrap:!1,caseSensitive:!1,wholeWord:!1,scope:g.ALL,regExp:!1}};g.ALL=1,g.SELECTION=2,function(){this.set=function(a){return e.mixin(this.$options,a),this},this.getOptions=function(){return d.copyObject(this.$options)},this.find=function(a){if(!this.$options.needle)return null;if(this.$options.backwards)var b=this.$backwardMatchIterator(a);else b=this.$forwardMatchIterator(a);var c=null;return b.forEach(function(a){return c=a,!0}),c},this.findAll=function(a){var b=this.$options;if(!b.needle)return[];if(b.backwards)var c=this.$backwardMatchIterator(a);else c=this.$forwardMatchIterator(a);var d=!b.start&&b.wrap&&b.scope==g.ALL;d&&(b.start={row:0,column:0});var e=[];return c.forEach(function(a){e.push(a)}),d&&(b.start=null),e},this.replace=function(a,b){var c=this.$assembleRegExp(),d=c.exec(a);return d&&d[0].length==a.length?this.$options.regExp?a.replace(c,b):b:null},this.$forwardMatchIterator=function(a){var b=this.$assembleRegExp(),c=this;return{forEach:function(d){c.$forwardLineIterator(a).forEach(function(a,e,f){e&&(a=a.substring(e));var g=[];a.replace(b,function(a){var b=arguments[arguments.length-2];return g.push({str:a,offset:e+b}),a});for(var h=0;h<g.length;h++){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$backwardMatchIterator=function(a){var b=this.$assembleRegExp(),c=this;return{forEach:function(d){c.$backwardLineIterator(a).forEach(function(a,e,f){e&&(a=a.substring(e));var g=[];a.replace(b,function(a,b){return g.push({str:a,offset:e+b}),a});for(var h=g.length-1;h>=0;h--){var i=g[h],j=c.$rangeFromMatch(f,i.offset,i.str.length);if(d(j))return!0}})}}},this.$rangeFromMatch=function(a,b,c){return new f(a,b,a,b+c)},this.$assembleRegExp=function(){if(this.$options.regExp)var a=this.$options.needle;else a=d.escapeRegExp(this.$options.needle);this.$options.wholeWord&&(a="\\b"+a+"\\b");var b="g";this.$options.caseSensitive||(b+="i");var c=new RegExp(a,b);return c},this.$forwardLineIterator=function(a){function k(e){var f=a.getLine(e);return b&&e==c.end.row&&(f=f.substring(0,c.end.column)),j&&e==d.row&&(f=f.substring(0,d.column)),f}var b=this.$options.scope==g.SELECTION,c=this.$options.range||a.getSelection().getRange(),d=this.$options.start||c[b?"start":"end"],e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap,j=!1;return{forEach:function(a){var b=d.row,c=k(b),g=d.column,l=!1;j=!1;while(!a(c,g,b)){if(l)return;b++,g=0;if(b>h){if(!i)return;b=e,g=f,j=!0}b==d.row&&(l=!0),c=k(b)}}}},this.$backwardLineIterator=function(a){var b=this.$options.scope==g.SELECTION,c=this.$options.range||a.getSelection().getRange(),d=this.$options.start||c[b?"end":"start"],e=b?c.start.row:0,f=b?c.start.column:0,h=b?c.end.row:a.getLength()-1,i=this.$options.wrap;return{forEach:function(g){var j=d.row,k=a.getLine(j).substring(0,d.column),l=0,m=!1,n=!1;while(!g(k,l,j)){if(m)return;j--,l=0;if(j<e){if(!i)return;j=h,n=!0}j==d.row&&(m=!0),k=a.getLine(j),b&&(j==e?l=f:j==h&&(k=k.substring(0,c.end.column))),n&&j==d.row&&(l=d.column)}}}}}.call(g.prototype),b.Search=g}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../keyboard/hash_handler").HashHandler,f=a("../lib/event_emitter").EventEmitter,g=function(a,b){this.platform=a,this.commands={},this.commmandKeyBinding={},this.addCommands(b),this.setDefaultHandler("exec",function(a){a.command.exec(a.editor,a.args||{})})};d.inherits(g,e),function(){d.implement(this,f),this.exec=function(a,b,c){return typeof a=="string"&&(a=this.commands[a]),a?b&&b.$readOnly&&!a.readOnly?!1:(this._emit("exec",{editor:b,command:a,args:c}),!0):!1},this.toggleRecording=function(){if(this.$inReplay)return;return this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(a){this.macro.push([a.command,a.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(a){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording();try{this.$inReplay=!0,this.macro.forEach(function(b){typeof b=="string"?this.exec(b,a):this.exec(b[0],a,b[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(a){return a.map(function(a){return typeof a[0]!="string"&&(a[0]=a[0].name),a[1]||(a=a[0]),a})}}.call(g.prototype),b.CommandManager=g}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys"],function(a,b,c){function e(a,b){this.platform=b,this.commands={},this.commmandKeyBinding={},this.addCommands(a)}"use strict";var d=a("../lib/keys");(function(){function a(a,c,e){var f,g=0,h=b(a.toLowerCase());for(var i=0,j=h.length;i<j;i++)d.KEY_MODS[h[i]]?g|=d.KEY_MODS[h[i]]:f=h[i]||"-";return{key:f,hashId:g}}function b(a){return a.trim().split(new RegExp("[\\s ]*\\-[\\s ]*","g"),999)}this.addCommand=function(a){this.commands[a.name]&&this.removeCommand(a),this.commands[a.name]=a,a.bindKey&&this._buildKeyHash(a)},this.removeCommand=function(a){var b=typeof a=="string"?a:a.name;a=this.commands[b],delete this.commands[b];var c=this.commmandKeyBinding;for(var d in c)for(var e in c[d])c[d][e]==a&&delete c[d][e]},this.addCommands=function(a){a&&Object.keys(a).forEach(function(b){var c=a[b];if(typeof c=="string")return this.bindKey(c,b);typeof c=="function"&&(c={exec:c}),c.name||(c.name=b),this.addCommand(c)},this)},this.removeCommands=function(a){Object.keys(a).forEach(function(b){this.removeCommand(a[b])},this)},this.bindKey=function(b,c){if(!b)return;var d=this.commmandKeyBinding;b.split("|").forEach(function(b){var e=a(b,c),f=e.hashId;(d[f]||(d[f]={}))[e.key]=c})},this.bindKeys=function(a){Object.keys(a).forEach(function(b){this.bindKey(b,a[b])},this)},this._buildKeyHash=function(a){var b=a.bindKey;if(!b)return;var c=typeof b=="string"?b:b[this.platform];this.bindKey(c,a)},this.findKeyCommand=function(b,c){var d=this.commmandKeyBinding;return d[b]&&d[b][c.toLowerCase()]},this.handleKeyboard=function(a,b,c,d){return{command:this.findKeyCommand(b,c)}}}).call(e.prototype),b.HashHandler=e}),define("ace/undomanager",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.reset()};(function(){this.execute=function(a){var b=a.args[0];this.$doc=a.args[1],this.$undoStack.push(b),this.$redoStack=[]},this.undo=function(a){var b=this.$undoStack.pop(),c=null;return b&&(c=this.$doc.undoChanges(b,a),this.$redoStack.push(b)),c},this.redo=function(a){var b=this.$redoStack.pop(),c=null;return b&&(c=this.$doc.redoChanges(b,a),this.$undoStack.push(b)),c},this.reset=function(){this.$undoStack=[],this.$redoStack=[]},this.hasUndo=function(){return this.$undoStack.length>0},this.hasRedo=function(){return this.$redoStack.length>0}}).call(d.prototype),b.UndoManager=d}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/useragent","ace/config","ace/lib/net","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/lib/event_emitter","text!ace/css/editor.css"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/useragent"),h=a("./config"),i=a("./lib/net"),j=a("./layer/gutter").Gutter,k=a("./layer/marker").Marker,l=a("./layer/text").Text,m=a("./layer/cursor").Cursor,n=a("./scrollbar").ScrollBar,o=a("./renderloop").RenderLoop,p=a("./lib/event_emitter").EventEmitter,q=a("text!./css/editor.css");e.importCssString(q,"ace_editor");var r=function(a,b){var c=this;this.container=a,e.addCssClass(a,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new j(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onResize.bind(this,!0)),this.$markerBack=new k(this.content);var d=this.$textLayer=new l(this.content);this.canvas=d.element,this.$markerFront=new k(this.content),this.characterWidth=d.getCharacterWidth(),this.lineHeight=d.getLineHeight(),this.$cursorLayer=new m(this.content),this.$cursorPadding=8,this.$horizScroll=!0,this.$horizScrollAlwaysVisible=!0,this.$animatedScroll=!1,this.scrollBar=new n(a),this.scrollBar.addEventListener("scroll",function(a){c.session.setScrollTop(a.data)}),this.scrollTop=0,this.scrollLeft=0,f.addListener(this.scroller,"scroll",function(){var a=c.scroller.scrollLeft;c.scrollLeft=a,c.session.setScrollLeft(a),a==0?c.$gutter.className="ace_gutter":c.$gutter.className="ace_gutter horscroll"}),this.cursorPos={row:0,column:0},this.$textLayer.addEventListener("changeCharacterSize",function(){c.characterWidth=d.getCharacterWidth(),c.lineHeight=d.getLineHeight(),c.$updatePrintMargin(),c.onResize(!0),c.$loop.schedule(c.CHANGE_FULL)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new o(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.setPadding(4),this.$updatePrintMargin()};(function(){this.showGutter=!0,this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,d.implement(this,p),this.setSession=function(a){this.session=a,this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(a,b){b===undefined&&(b=Infinity),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRow<b&&(this.$changedLines.lastRow=b)):this.$changedLines={firstRow:a,lastRow:b},this.$loop.schedule(this.CHANGE_LINES)},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(){this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.onResize=function(a){var b=this.CHANGE_SIZE,c=this.$size,d=e.getInnerHeight(this.container);if(a||c.height!=d)c.height=d,this.scroller.style.height=d+"px",c.scrollerHeight=this.scroller.clientHeight,this.scrollBar.setHeight(c.scrollerHeight),this.session&&(this.session.setScrollTop(this.getScrollTop()),b|=this.CHANGE_FULL);var f=e.getInnerWidth(this.container);if(a||c.width!=f){c.width=f;var g=this.showGutter?this.$gutter.offsetWidth:0;this.scroller.style.left=g+"px",c.scrollerWidth=Math.max(0,f-g-this.scrollBar.getWidth()),this.scroller.style.width=c.scrollerWidth+"px";if(this.session.getUseWrapMode()&&this.adjustWrapLimit()||a)b|=this.CHANGE_FULL}this.$loop.schedule(b)},this.adjustWrapLimit=function(){var a=this.$size.scrollerWidth-this.$padding*2,b=Math.floor(a/this.characterWidth);return this.session.adjustWrapLimit(b)},this.setAnimatedScroll=function(a){this.$animatedScroll=a},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(a){this.$textLayer.setShowInvisibles(a)&&this.$loop.schedule(this.CHANGE_TEXT)},this.getShowInvisibles=function(){return this.$textLayer.showInvisibles},this.$showPrintMargin=!0,this.setShowPrintMargin=function(a){this.$showPrintMargin=a,this.$updatePrintMargin()},this.getShowPrintMargin=function(){return this.$showPrintMargin},this.$printMarginColumn=80,this.setPrintMarginColumn=function(a){this.$printMarginColumn=a,this.$updatePrintMargin()},this.getPrintMarginColumn=function(){return this.$printMarginColumn},this.getShowGutter=function(){return this.showGutter},this.setShowGutter=function(a){if(this.showGutter===a)return;this.$gutter.style.display=a?"block":"none",this.showGutter=a,this.onResize(!0)},this.$updatePrintMargin=function(){var a;if(!this.$showPrintMargin&&!this.$printMarginEl)return;this.$printMarginEl||(a=e.createElement("div"),a.className="ace_print_margin_layer",this.$printMarginEl=e.createElement("div"),this.$printMarginEl.className="ace_print_margin",a.appendChild(this.$printMarginEl),this.content.insertBefore(a,this.$textLayer.element));var b=this.$printMarginEl.style;b.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",b.visibility=this.$showPrintMargin?"visible":"hidden"},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.content},this.getTextAreaContainer=function(){return this.container},this.moveTextAreaToCursor=function(a){if(g.isIE)return;if(this.layerConfig.lastRow===0)return;var b=this.$cursorLayer.getPixelPosition();if(!b)return;var c=this.content.getBoundingClientRect(),d=this.layerConfig.offset;a.style.left=c.left+b.left+"px",a.style.top=c.top+b.top-this.scrollTop+d+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var a=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+a},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(a){this.$padding=a,this.$textLayer.setPadding(a),this.$cursorLayer.setPadding(a),this.$markerFront.setPadding(a),this.$markerBack.setPadding(a),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.getHScrollBarAlwaysVisible=function(){return this.$horizScrollAlwaysVisible},this.setHScrollBarAlwaysVisible=function(a){this.$horizScrollAlwaysVisible!=a&&(this.$horizScrollAlwaysVisible=a,(!this.$horizScrollAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL))},this.$updateScrollBar=function(){this.scrollBar.setInnerHeight(this.layerConfig.maxHeight),this.scrollBar.setScrollTop(this.scrollTop)},this.$renderChanges=function(a){if(!a||!this.session||!this.container.offsetWidth)return;(a&this.CHANGE_FULL||a&this.CHANGE_SIZE||a&this.CHANGE_TEXT||a&this.CHANGE_LINES||a&this.CHANGE_SCROLL)&&this.$computeLayerConfig();if(a&this.CHANGE_H_SCROLL){this.scroller.scrollLeft=this.scrollLeft;var b=this.scroller.scrollLeft;this.scrollLeft=b,this.session.setScrollLeft(b)}if(a&this.CHANGE_FULL){this.$textLayer.checkForSizeChanges(),this.$updateScrollBar(),this.$textLayer.update(this.layerConfig),this.showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig);return}if(a&this.CHANGE_SCROLL){this.$updateScrollBar(),a&this.CHANGE_TEXT||a&this.CHANGE_LINES?this.$textLayer.update(this.layerConfig):this.$textLayer.scrollLines(this.layerConfig),this.showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig);return}a&this.CHANGE_TEXT?(this.$textLayer.update(this.layerConfig),this.showGutter&&this.$gutterLayer.update(this.layerConfig)):a&this.CHANGE_LINES?this.$updateLines()&&(this.$updateScrollBar(),this.showGutter&&this.$gutterLayer.update(this.layerConfig)):a&this.CHANGE_GUTTER&&this.showGutter&&this.$gutterLayer.update(this.layerConfig),a&this.CHANGE_CURSOR&&this.$cursorLayer.update(this.layerConfig),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(this.layerConfig),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(this.layerConfig),a&this.CHANGE_SIZE&&this.$updateScrollBar()},this.$computeLayerConfig=function(){var a=this.session,b=this.scrollTop%this.lineHeight,c=this.$size.scrollerHeight+this.lineHeight,d=this.$getLongestLine(),e=this.$horizScrollAlwaysVisible||this.$size.scrollerWidth-d<0,f=this.$horizScroll!==e;this.$horizScroll=e,f&&(this.scroller.style.overflowX=e?"scroll":"hidden",e||this.session.setScrollLeft(0));var g=this.session.getScreenLength()*this.lineHeight;this.session.setScrollTop(Math.max(0,Math.min(this.scrollTop,g-this.$size.scrollerHeight)));var h=Math.ceil(c/this.lineHeight)-1,i=Math.max(0,Math.round((this.scrollTop-b)/this.lineHeight)),j=i+h,k,l,m={lineHeight:this.lineHeight};i=a.screenToDocumentRow(i,0);var n=a.getFoldLine(i);n&&(i=n.start.row),k=a.documentToScreenRow(i,0),l=a.getRowHeight(m,i),j=Math.min(a.screenToDocumentRow(j,0),a.getLength()-1),c=this.$size.scrollerHeight+a.getRowHeight(m,j)+l,b=this.scrollTop-k*this.lineHeight,this.layerConfig={width:d,padding:this.$padding,firstRow:i,firstRowScreen:k,lastRow:j,lineHeight:this.lineHeight,characterWidth:this.characterWidth,minHeight:c,maxHeight:g,offset:b,height:this.$size.scrollerHeight},this.$gutterLayer.element.style.marginTop=-b+"px",this.content.style.marginTop=-b+"px",this.content.style.width=d+2*this.$padding+"px",this.content.style.height=c+"px",f&&this.onResize(!0)},this.$updateLines=function(){var a=this.$changedLines.firstRow,b=this.$changedLines.lastRow;this.$changedLines=null;var c=this.layerConfig;if(c.width!=this.$getLongestLine())return this.$textLayer.update(c);if(a>c.lastRow+1)return;if(b<c.firstRow)return;if(b===Infinity){this.showGutter&&this.$gutterLayer.update(c),this.$textLayer.update(c);return}return this.$textLayer.updateLines(c,a,b),!0},this.$getLongestLine=function(){var a=this.session.getScreenWidth();return this.$textLayer.showInvisibles&&(a+=1),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(a*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(a,b){this.$gutterLayer.addGutterDecoration(a,b),this.$loop.schedule(this.CHANGE_GUTTER)},this.removeGutterDecoration=function(a,b){this.$gutterLayer.removeGutterDecoration(a,b),this.$loop.schedule(this.CHANGE_GUTTER)},this.setBreakpoints=function(a){this.$gutterLayer.setBreakpoints(a),this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(a){this.$gutterLayer.setAnnotations(a),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(a,b){this.scrollCursorIntoView(a),this.scrollCursorIntoView(b)},this.scrollCursorIntoView=function(a){if(this.$size.scrollerHeight===0)return;var b=this.$cursorLayer.getPixelPosition(a),c=b.left,d=b.top;this.scrollTop>d&&this.session.setScrollTop(d),this.scrollTop+this.$size.scrollerHeight<d+this.lineHeight&&this.session.setScrollTop(d+this.lineHeight-this.$size.scrollerHeight);var e=this.scrollLeft;e>c&&(c<this.$padding+2*this.layerConfig.characterWidth&&(c=0),this.session.setScrollLeft(c)),e+this.$size.scrollerWidth<c+this.characterWidth&&this.session.setScrollLeft(Math.round(c+this.characterWidth-this.$size.scrollerWidth))},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollLeft()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(a){this.session.setScrollTop(a*this.lineHeight)},this.STEPS=10,this.$calcSteps=function(a,b){var c=0,d=this.STEPS,e=[],f=function(a,b,c){return(a/=.5)<1?c/2*Math.pow(a,3)+b:c/2*(Math.pow(a-2,3)+2)+b};for(c=0;c<d;++c)e.push(f(c/this.STEPS,a,b-a));return e.push(b),e},this.scrollToLine=function(a,b){var c=this.$cursorLayer.getPixelPosition({row:a,column:0}),d=c.top;b&&(d-=this.$size.scrollerHeight/2);if(this.$animatedScroll&&Math.abs(d-this.scrollTop)<1e4){var e=this,f=e.$calcSteps(this.scrollTop,d);clearInterval(this.$timer),this.$timer=setInterval(function(){e.session.setScrollTop(f.shift()),f.length||clearInterval(e.$timer)},10)}else this.session.setScrollTop(d)},this.scrollToY=function(a){this.scrollTop!==a&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=a)},this.scrollToX=function(a){a<=this.$padding&&(a=0),this.scrollLeft!==a&&(this.scrollLeft=a),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollBy=function(a,b){b&&this.session.setScrollTop(this.session.getScrollTop()+b),a&&this.session.setScrollLeft(this.session.getScrollLeft()+a)},this.isScrollableBy=function(a,b){if(b<0&&this.session.getScrollTop()>0)return!0;if(b>0&&this.session.getScrollTop()+this.$size.scrollerHeight<this.layerConfig.maxHeight)return!0},this.pixelToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=Math.round((a+this.scrollLeft-c.left-this.$padding-e.getPageScrollLeft())/this.characterWidth),f=Math.floor((b+this.scrollTop-c.top-e.getPageScrollTop())/this.lineHeight);return{row:f,column:d}},this.screenToTextCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=Math.round((a+this.scrollLeft-c.left-this.$padding-e.getPageScrollLeft())/this.characterWidth),f=Math.floor((b+this.scrollTop-c.top-e.getPageScrollTop())/this.lineHeight);return this.session.screenToDocumentPosition(f,Math.max(d,0))},this.textToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=this.session.documentToScreenPosition(a,b),e=this.$padding+Math.round(d.column*this.characterWidth),f=d.row*this.lineHeight;return{pageX:c.left+e-this.scrollLeft,pageY:c.top+f-this.scrollTop}},this.visualizeFocus=function(){e.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){e.removeCssClass(this.container,"ace_focus")},this.showComposition=function(a){this.$composition||(this.$composition=e.createElement("div"),this.$composition.className="ace_composition",this.content.appendChild(this.$composition)),this.$composition.innerHTML="&#160;";var b=this.$cursorLayer.getPixelPosition(),c=this.$composition.style;c.top=b.top+"px",c.left=b.left+this.$padding+"px",c.height=this.lineHeight+"px",this.hideCursor()},this.setCompositionText=function(a){e.setInnerText(this.$composition,a)},this.hideComposition=function(){this.showCursor();if(!this.$composition)return;var a=this.$composition.style;a.top="-10000px",a.left="-10000px"},this._loadTheme=function(a,b){if(!h.get("packaged"))return b();var c=a.split("/").pop(),d=h.get("themePath")+"/theme-"+c+h.get("suffix");i.loadScript(d,b)},this.setTheme=function(b){function h(a){e.importCssString(a.cssText,a.cssClass,c.container.ownerDocument),c.$theme&&e.removeCssClass(c.container,c.$theme),c.$theme=a?a.cssClass:null,c.$theme&&e.addCssClass(c.container,c.$theme),a&&a.isDark?e.addCssClass(c.container,"ace_dark"):e.removeCssClass(c.container,"ace_dark"),c.$size&&(c.$size.width=0,c.onResize())}var c=this;this.$themeValue=b;if(!b||typeof b=="string"){var d=b||"ace/theme/textmate",f;try{f=a(d)}catch(g){}if(f)return h(f);c._loadTheme(d,function(){a([d],function(a){if(c.$themeValue!==b)return;h(a)})})}else h(b)},this.getTheme=function(){return this.$themeValue},this.setStyle=function(b){e.addCssClass(this.container,b)},this.unsetStyle=function(b){e.removeCssClass(this.container,b)},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(r.prototype),b.VirtualRenderer=r}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/dom"),e=a("../lib/oop"),f=a("../lib/event_emitter").EventEmitter,g=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_gutter-layer",a.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$breakpoints=[],this.$annotations=[],this.$decorations=[]};(function(){e.implement(this,f),this.setSession=function(a){this.session=a},this.addGutterDecoration=function(a,b){this.$decorations[a]||(this.$decorations[a]=""),this.$decorations[a]+=" "+b},this.removeGutterDecoration=function(a,b){this.$decorations[a]=this.$decorations[a].replace(" "+b,"")},this.setBreakpoints=function(a){this.$breakpoints=a.concat()},this.setAnnotations=function(a){this.$annotations=[];for(var b in a)if(a.hasOwnProperty(b)){var c=a[b];if(!c)continue;var d=this.$annotations[b]={text:[]};for(var e=0;e<c.length;e++){var f=c[e],g=f.text.replace(/"/g,"&quot;").replace(/'/g,"&#8217;").replace(/</,"&lt;");d.text.indexOf(g)===-1&&d.text.push(g);var h=f.type;h=="error"?d.className="ace_error":h=="warning"&&d.className!="ace_error"?d.className="ace_warning":h=="info"&&!d.className&&(d.className="ace_info")}}},this.update=function(a){this.$config=a;var b={className:"",text:[]},c=[],e=a.firstRow,f=a.lastRow,g=this.session.getNextFoldLine(e),h=g?g.start.row:Infinity,i=this.$showFoldWidgets&&this.session.foldWidgets;for(;;){e>h&&(e=g.end.row+1,g=this.session.getNextFoldLine(e,g),h=g?g.start.row:Infinity);if(e>f)break;var j=this.$annotations[e]||b;c.push("<div class='ace_gutter-cell",this.$decorations[e]||"",this.$breakpoints[e]?" ace_breakpoint ":" ",j.className,"' title='",j.text.join("\n"),"' style='height:",a.lineHeight,"px;'>",e+1);if(i){var k=i[e];k==null&&(k=i[e]=this.session.getFoldWidget(e)),k&&c.push("<span class='ace_fold-widget ",k,k=="start"&&e==h&&e<g.end.row?" closed":" open","'></span>")}var l=this.session.getRowLength(e)-1;while(l--)c.push("</div><div class='ace_gutter-cell' style='height:",a.lineHeight,"px'>¦");c.push("</div>"),e++}this.element=d.setInnerHtml(this.element,c.join("")),this.element.style.height=a.minHeight+"px";var m=this.element.offsetWidth;m!==this.gutterWidth&&(this.gutterWidth=m,this._emit("changeGutterWidth",m))},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(a){a?d.addCssClass(this.element,"ace_folding-enabled"):d.removeCssClass(this.element,"ace_folding-enabled"),this.$showFoldWidgets=a},this.getShowFoldWidgets=function(){return this.$showFoldWidgets}}).call(g.prototype),b.Gutter=g}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../range").Range,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(!a)return;this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c],f=d.range.clipRows(a.firstRow,a.lastRow);if(f.isEmpty())continue;f=f.toScreenRange(this.session);if(d.renderer){var g=this.$getTop(f.start.row,a),h=Math.round(this.$padding+f.start.column*a.characterWidth);d.renderer(b,f,h,g,a)}else f.isMultiLine()?d.type=="text"?this.drawTextMarker(b,f,d.clazz,a):this.drawMultiLineMarker(b,f,d.clazz,a,d.type):this.drawSingleLineMarker(b,f,d.clazz,a,null,d.type)}this.element=e.setInnerHtml(this.element,b.join(""))},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(a,b,c,e){var f=b.start.row,g=new d(f,b.start.column,f,this.session.getScreenLastRowColumn(f));this.drawSingleLineMarker(a,g,c,e,1,"text"),f=b.end.row,g=new d(f,0,f,b.end.column),this.drawSingleLineMarker(a,g,c,e,0,"text");for(f=b.start.row+1;f<b.end.row;f++)g.start.row=f,g.end.row=f,g.end.column=this.session.getScreenLastRowColumn(f),this.drawSingleLineMarker(a,g,c,e,1,"text")},this.drawMultiLineMarker=function(a,b,c,d,e){var f=e==="background"?0:this.$padding,g=d.width+2*this.$padding-f,h=d.lineHeight,i=Math.round(g-b.start.column*d.characterWidth),j=this.$getTop(b.start.row,d),k=Math.round(f+b.start.column*d.characterWidth);a.push("<div class='",c,"' style='","height:",h,"px;","width:",i,"px;","top:",j,"px;","left:",k,"px;'></div>"),j=this.$getTop(b.end.row,d),i=Math.round(b.end.column*d.characterWidth),a.push("<div class='",c,"' style='","height:",h,"px;","width:",i,"px;","top:",j,"px;","left:",f,"px;'></div>"),h=(b.end.row-b.start.row-1)*d.lineHeight;if(h<0)return;j=this.$getTop(b.start.row+1,d),a.push("<div class='",c,"' style='","height:",h,"px;","width:",g,"px;","top:",j,"px;","left:",f,"px;'></div>")},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=f==="background"?0:this.$padding,h=d.lineHeight;if(f==="background")var i=d.width;else i=Math.round((b.end.column+(e||0)-b.start.column)*d.characterWidth);var j=this.$getTop(b.start.row,d),k=Math.round(g+b.start.column*d.characterWidth);a.push("<div class='",c,"' style='","height:",h,"px;","width:",i,"px;","top:",j,"px;","left:",k,"px;'></div>")}}).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=a("../lib/useragent"),h=a("../lib/event_emitter").EventEmitter,i=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",a.appendChild(this.element),this.$characterSize=this.$measureSizes()||{width:0,height:0},this.$pollSizeChanges()};(function(){d.implement(this,h),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var a=this.$measureSizes();a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)&&(this.$characterSize=a,this._emit("changeCharacterSize",{data:a}))},this.$pollSizeChanges=function(){var a=this;this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=g.isIE||g.isOldGecko?function(){var a=1e3;if(!this.$measureNode){var b=this.$measureNode=e.createElement("div"),c=b.style;c.width=c.height="auto",c.left=c.top=-a*40+"px",c.visibility="hidden",c.position="fixed",c.overflow="visible",c.whiteSpace="nowrap",b.innerHTML=f.stringRepeat("Xy",a);if(this.element.ownerDocument.body)this.element.ownerDocument.body.appendChild(b);else{var d=this.element.parentNode;while(!e.hasCssClass(d,"ace_editor"))d=d.parentNode;d.appendChild(b)}}if(!this.element.offsetWidth)return null;var c=this.$measureNode.style,g=e.computedStyle(this.element);for(var h in this.$fontStyles)c[h]=g[h];var i={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(a*2)};return i.width==0||i.height==0?null:i}:function(){if(!this.$measureNode){var a=this.$measureNode=e.createElement("div"),b=a.style;b.width=b.height="auto",b.left=b.top="-100px",b.visibility="hidden",b.position="fixed",b.overflow="visible",b.whiteSpace="nowrap",a.innerHTML="X";var c=this.element.parentNode;while(c&&!e.hasCssClass(c,"ace_editor"))c=c.parentNode;if(!c)return this.$measureNode=null;c.appendChild(a)}var d=this.$measureNode.getBoundingClientRect(),f={height:d.height,width:d.width};return f.width==0||f.height==0?null:f},this.setSession=function(a){this.session=a},this.showInvisibles=!1,this.setShowInvisibles=function(a){return this.showInvisibles==a?!1:(this.showInvisibles=a,!0)},this.$tabStrings=[],this.$computeTabString=function(){var a=this.session.getTabSize(),b=this.$tabStrings=[0];for(var c=1;c<a+1;c++)this.showInvisibles?b.push("<span class='ace_invisible'>"+this.TAB_CHAR+(new Array(c)).join("&#160;")+"</span>"):b.push((new Array(c+1)).join("&#160;"))},this.updateLines=function(a,b,c){this.$computeTabString(),(this.config.lastRow!=a.lastRow||this.config.firstRow!=a.firstRow)&&this.scrollLines(a),this.config=a;var d=Math.max(b,a.firstRow),f=Math.min(c,a.lastRow),g=this.element.childNodes,h=0;for(var i=a.firstRow;i<d;i++){var j=this.session.getFoldLine(i);if(j){if(j.containsRow(d)){d=j.start.row;break}i=j.end.row}h++}for(var k=d;k<=f;k++){var l=g[h++];if(!l)continue;var m=[],n=this.session.getTokens(k,k);this.$renderLine(m,k,n[0].tokens,!this.$useLineGroups()),l=e.setInnerHtml(l,m.join("")),k=this.session.getRowFoldEnd(k)}},this.scrollLines=function(a){this.$computeTabString();var b=this.config;this.config=a;if(!b||b.lastRow<a.firstRow)return this.update(a);if(a.lastRow<b.firstRow)return this.update(a);var c=this.element;if(b.firstRow<a.firstRow)for(var d=this.session.getFoldedRowCount(b.firstRow,a.firstRow-1);d>0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRow<b.firstRow){var e=this.$renderLinesFragment(a,a.firstRow,b.firstRow-1);c.firstChild?c.insertBefore(e,c.firstChild):c.appendChild(e)}if(a.lastRow>b.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){var d=this.element.ownerDocument.createDocumentFragment(),f=b,g=this.session.getNextFoldLine(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:Infinity);if(f>c)break;var i=e.createElement("div"),j=[],k=this.session.getTokens(f,f);k.length==1&&this.$renderLine(j,f,k[0].tokens,!1),i.innerHTML=j.join("");if(this.$useLineGroups())i.className="ace_line_group",d.appendChild(i);else{var l=i.childNodes;while(l.length)d.appendChild(l[0])}f++}return d},this.update=function(a){this.$computeTabString(),this.config=a;var b=[],c=a.firstRow,d=a.lastRow,f=c,g=this.session.getNextFoldLine(f),h=g?g.start.row:Infinity;for(;;){f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:Infinity);if(f>d)break;this.$useLineGroups()&&b.push("<div class='ace_line_group'>");var i=this.session.getTokens(f,f);i.length==1&&this.$renderLine(b,f,i[0].tokens,!1),this.$useLineGroups()&&b.push("</div>"),f++}this.element=e.setInnerHtml(this.element,b.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,f=/\t|&|<|( +)|([\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000])|[\u1100-\u115F]|[\u11A3-\u11A7]|[\u11FA-\u11FF]|[\u2329-\u232A]|[\u2E80-\u2E99]|[\u2E9B-\u2EF3]|[\u2F00-\u2FD5]|[\u2FF0-\u2FFB]|[\u3000-\u303E]|[\u3041-\u3096]|[\u3099-\u30FF]|[\u3105-\u312D]|[\u3131-\u318E]|[\u3190-\u31BA]|[\u31C0-\u31E3]|[\u31F0-\u321E]|[\u3220-\u3247]|[\u3250-\u32FE]|[\u3300-\u4DBF]|[\u4E00-\uA48C]|[\uA490-\uA4C6]|[\uA960-\uA97C]|[\uAC00-\uD7A3]|[\uD7B0-\uD7C6]|[\uD7CB-\uD7FB]|[\uF900-\uFAFF]|[\uFE10-\uFE19]|[\uFE30-\uFE52]|[\uFE54-\uFE66]|[\uFE68-\uFE6B]|[\uFF01-\uFF60]|[\uFFE0-\uFFE6]/g,h=function(a,c,d,f,h){if(a.charCodeAt(0)==32)return(new Array(a.length+1)).join("&#160;");if(a=="	"){var i=e.session.getScreenTabSize(b+f);return b+=i-1,e.$tabStrings[i]}if(a=="&")return g.isOldGecko?"&":"&amp;";if(a=="<")return"&lt;";if(a==" "){var j=e.showInvisibles?"ace_cjk ace_invisible":"ace_cjk",k=e.showInvisibles?e.SPACE_CHAR:"";return b+=1,"<span class='"+j+"' style='width:"+e.config.characterWidth*2+"px'>"+k+"</span>"}if(a.match(/[\v\f \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]/)){if(e.showInvisibles){var k=(new Array(a.length+1)).join(e.SPACE_CHAR);return"<span class='ace_invisible'>"+k+"</span>"}return"&#160;"}return b+=1,"<span class='ace_cjk' style='width:"+e.config.characterWidth*2+"px'>"+a+"</span>"},i=d.replace(f,h);if(!this.$textToken[c.type]){var j="ace_"+c.type.replace(/\./g," ace_"),k="";c.type=="fold"&&(k=" style='width:"+c.value.length*this.config.characterWidth+"px;' "),a.push("<span class='",j,"'",k,">",i,"</span>")}else a.push(i);return b+d.length},this.$renderLineCore=function(a,b,c,d,e){var f=0,g=0,h,i=0,j=this;!d||d.length==0?h=Number.MAX_VALUE:h=d[0],e||a.push("<div class='ace_line' style='height:",this.config.lineHeight,"px","'>");for(var k=0;k<c.length;k++){var l=c[k],m=l.value;if(f+m.length<h)i=j.$renderToken(a,i,l,m),f+=m.length;else{while(f+m.length>=h)i=j.$renderToken(a,i,l,m.substring(0,h-f)),m=m.substring(h-f),f=h,e||a.push("</div>","<div class='ace_line' style='height:",this.config.lineHeight,"px","'>"),g++,i=0,h=d[g]||Number.MAX_VALUE;m.length!=0&&(f+=m.length,i=j.$renderToken(a,i,l,m))}}this.showInvisibles&&(b!==this.session.getLength()-1?a.push("<span class='ace_invisible'>"+this.EOL_CHAR+"</span>"):a.push("<span class='ace_invisible'>"+this.EOF_CHAR+"</span>")),e||a.push("</div>")},this.$renderLine=function(a,b,c,d){if(!this.session.isRowFolded(b)){var e=this.session.getRowSplitData(b);this.$renderLineCore(a,b,c,e,d)}else this.$renderFoldLine(a,b,c,d)},this.$renderFoldLine=function(a,b,c,d){function h(a,b,c){var d=0,e=0;while(e+a[d].value.length<b){e+=a[d].value.length,d++;if(d==a.length)return}if(e!=b){var f=a[d].value.substring(b-e);f.length>c-b&&(f=f.substring(0,c-b)),g.push({type:a[d].type,value:f}),e=b+f.length,d+=1}while(e<c){var f=a[d].value;f.length+e>c&&(f=f.substring(0,c-e)),g.push({type:a[d].type,value:f}),e+=f.length,d+=1}}var e=this.session,f=e.getFoldLine(b),g=[];f.walk(function(a,b,d,e,f){a?g.push({type:"fold",value:a}):(f&&(c=this.session.getTokens(b,b)[0].tokens),c.length!=0&&h(c,e,d))}.bind(this),f.end.row,this.session.getLine(f.end.row).length);var i=this.session.$useWrapMode?this.session.$wrapData[b]:null;this.$renderLineCore(a,b,g,i,d)},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(i.prototype),b.Text=i}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../lib/dom"),e=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),this.isVisible=!1,this.cursors=[],this.cursor=this.addCursor()};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.addCursor=function(){var a=d.createElement("div"),b="ace_cursor";return this.isVisible||(b+=" ace_hidden"),this.overwrite&&(b+=" ace_overwrite"),a.className=b,this.element.appendChild(a),this.cursors.push(a),a},this.removeCursor=function(){if(this.cursors.length>1){var a=this.cursors.pop();return a.parentNode.removeChild(a),a}},this.hideCursor=function(){this.isVisible=!1;for(var a=this.cursors.length;a--;)d.addCssClass(this.cursors[a],"ace_hidden");clearInterval(this.blinkId)},this.showCursor=function(){this.isVisible=!0;for(var a=this.cursors.length;a--;)d.removeCssClass(this.cursors[a],"ace_hidden");this.element.style.visibility="",this.restartTimer()},this.restartTimer=function(){clearInterval(this.blinkId);if(!this.isVisible)return;var a=this.element;this.blinkId=setInterval(function(){a.style.visibility="hidden",setTimeout(function(){a.style.visibility="visible"},400)},1e3)},this.getPixelPosition=function(a,b){if(!this.config||!this.session)return{left:0,top:0};a||(a=this.session.selection.getCursor());var c=this.session.documentToScreenPosition(a),d=Math.round(this.$padding+c.column*this.config.characterWidth),e=(c.row-(b?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a;if(this.session.selectionMarkerCount>1){var b=this.session.$selectionMarkers,c=0,d,e=0;for(var c=b.length;c--;){d=b[c];var f=this.getPixelPosition(d.cursor,!0),g=(this.cursors[e++]||this.addCursor()).style;g.left=f.left+"px",g.top=f.top+"px",g.width=a.characterWidth+"px",g.height=a.lineHeight+"px"}if(e>1)while(this.cursors.length>e)this.removeCursor()}else{var f=this.getPixelPosition(null,!0),g=this.cursor.style;g.left=f.left+"px",g.top=f.top+"px",g.width=a.characterWidth+"px",g.height=a.lineHeight+"px";while(this.cursors.length>1)this.removeCursor()}var h=this.session.getOverwrite();h!=this.overwrite&&this.$setOverite(h),this.restartTimer()},this.$setOverite=function(a){this.overwrite=a;for(var b=this.cursors.length;b--;)a?d.addCssClass(this.cursors[b],"ace_overwrite"):d.removeCssClass(this.cursors[b],"ace_overwrite")},this.destroy=function(){clearInterval(this.blinkId)}}).call(e.prototype),b.Cursor=e}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/event_emitter").EventEmitter,h=function(a){this.element=e.createElement("div"),this.element.className="ace_sb",this.inner=e.createElement("div"),this.element.appendChild(this.inner),a.appendChild(this.element),this.width=e.scrollbarWidth(a.ownerDocument),this.element.style.width=(this.width||15)+5+"px",f.addListener(this.element,"scroll",this.onScroll.bind(this))};(function(){d.implement(this,g),this.onScroll=function(){this._emit("scroll",{data:this.element.scrollTop})},this.getWidth=function(){return this.width},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=function(a){this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.element.scrollTop=a}}).call(h.prototype),b.ScrollBar=h}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(a,b,c){"use strict";var d=a("./lib/event"),e=function(a,b){this.onRender=a,this.pending=!1,this.changes=0,this.window=b||window};(function(){this.schedule=function(a){this.changes=this.changes|a;if(!this.pending){this.pending=!0;var b=this;d.nextTick(function(){b.pending=!1;var a;while(a=b.changes)b.changes=0,b.onRender(a)},this.window)}}}).call(e.prototype),b.RenderLoop=e}),define("text!ace/css/editor.css",[],";\n\n.ace_editor {\n    position: absolute;\n    overflow: hidden;\n    font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Droid Sans Mono', 'Consolas', monospace;\n    font-size: 12px;\n}\n\n.ace_scroller {\n    position: absolute;\n    overflow-x: scroll;\n    overflow-y: hidden;\n}\n\n.ace_content {\n    position: absolute;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    cursor: text;\n}\n\n.ace_composition {\n    position: absolute;\n    background: #555;\n    color: #DDD;\n    z-index: 4;\n}\n\n.ace_gutter {\n    position: absolute;\n    overflow : hidden;\n    height: 100%;\n    width: auto;\n    cursor: default;\n    z-index: 1000;\n}\n\n.ace_gutter.horscroll {\n    box-shadow: 0px 0px 20px rgba(0,0,0,0.4);\n}\n\n.ace_gutter-cell {\n    padding-left: 19px;\n    padding-right: 6px;\n}\n\n.ace_gutter-cell.ace_error {\n    background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%F5or%F5%87%88%F5nr%F4ns%EBmq%F5z%7F%DDJT%DEKS%DFOW%F1Yc%F2ah%CE(7%CE)8%D18E%DD%40M%F2KZ%EBU%60%F4%60m%DCir%C8%16(%C8%19*%CE%255%F1%3FR%F1%3FS%E6%AB%B5%CA%5DI%CEn%5E%F7%A2%9A%C9G%3E%E0a%5B%F7%89%85%F5yy%F6%82%80%ED%82%80%FF%BF%BF%E3%C4%C4%FF%FF%FF%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%25%00%2C%00%00%00%00%10%00%10%00%00%06p%C0%92pH%2C%1A%8F%C8%D2H%93%E1d4%23%E4%88%D3%09mB%1DN%B48%F5%90%40%60%92G%5B%94%20%3E%22%D2%87%24%FA%20%24%C5%06A%00%20%B1%07%02B%A38%89X.v%17%82%11%13q%10%0Fi%24%0F%8B%10%7BD%12%0Ei%09%92%09%0EpD%18%15%24%0A%9Ci%05%0C%18F%18%0B%07%04%01%04%06%A0H%18%12%0D%14%0D%12%A1I%B3%B4%B5IA%00%3B\");\n    background-repeat: no-repeat;\n    background-position: 2px center;\n}\n\n.ace_gutter-cell.ace_warning {\n    background-image: url(\"data:image/gif,GIF89a%10%00%10%00%D5%00%00%FF%DBr%FF%DE%81%FF%E2%8D%FF%E2%8F%FF%E4%96%FF%E3%97%FF%E5%9D%FF%E6%9E%FF%EE%C1%FF%C8Z%FF%CDk%FF%D0s%FF%D4%81%FF%D5%82%FF%D5%83%FF%DC%97%FF%DE%9D%FF%E7%B8%FF%CCl%7BQ%13%80U%15%82W%16%81U%16%89%5B%18%87%5B%18%8C%5E%1A%94d%1D%C5%83-%C9%87%2F%C6%84.%C6%85.%CD%8B2%C9%871%CB%8A3%CD%8B5%DC%98%3F%DF%9BB%E0%9CC%E1%A5U%CB%871%CF%8B5%D1%8D6%DB%97%40%DF%9AB%DD%99B%E3%B0p%E7%CC%AE%FF%FF%FF%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00!%F9%04%01%00%00%2F%00%2C%00%00%00%00%10%00%10%00%00%06a%C0%97pH%2C%1A%8FH%A1%ABTr%25%87%2B%04%82%F4%7C%B9X%91%08%CB%99%1C!%26%13%84*iJ9(%15G%CA%84%14%01%1A%97%0C%03%80%3A%9A%3E%81%84%3E%11%08%B1%8B%20%02%12%0F%18%1A%0F%0A%03'F%1C%04%0B%10%16%18%10%0B%05%1CF%1D-%06%07%9A%9A-%1EG%1B%A0%A1%A0U%A4%A5%A6BA%00%3B\");\n    background-repeat: no-repeat;\n    background-position: 2px center;\n}\n\n.ace_gutter-cell.ace_info {\n    background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");\n    background-repeat: no-repeat;\n    background-position: 2px center;\n}\n\n.ace_editor .ace_sb {\n    position: absolute;\n    overflow-x: hidden;\n    overflow-y: scroll;\n    right: 0;\n}\n\n.ace_editor .ace_sb div {\n    position: absolute;\n    width: 1px;\n    left: 0;\n}\n\n.ace_editor .ace_print_margin_layer {\n    z-index: 0;\n    position: absolute;\n    overflow: hidden;\n    margin: 0;\n    left: 0;\n    height: 100%;\n    width: 100%;\n}\n\n.ace_editor .ace_print_margin {\n    position: absolute;\n    height: 100%;\n}\n\n.ace_editor textarea {\n    position: fixed;\n    z-index: 0;\n    width: 10px;\n    height: 30px;\n    opacity: 0;\n    background: transparent;\n    appearance: none;\n    -moz-appearance: none;\n    border: none;\n    resize: none;\n    outline: none;\n    overflow: hidden;\n}\n\n.ace_layer {\n    z-index: 1;\n    position: absolute;\n    overflow: hidden;\n    white-space: nowrap;\n    height: 100%;\n    width: 100%;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    /* setting pointer-events: auto; on node under the mouse, which changes\n        during scroll, will break mouse wheel scrolling in Safari */\n    pointer-events: none;\n}\n\n.ace_gutter .ace_layer {\n    position: relative;\n    min-width: 40px;\n    text-align: right;\n    pointer-events: auto;\n}\n\n.ace_text-layer {\n    color: black;\n}\n\n.ace_cjk {\n    display: inline-block;\n    text-align: center;\n}\n\n.ace_cursor-layer {\n    z-index: 4;\n}\n\n.ace_cursor {\n    z-index: 4;\n    position: absolute;\n}\n\n.ace_cursor.ace_hidden {\n    opacity: 0.2;\n}\n\n.ace_line {\n    white-space: nowrap;\n}\n\n.ace_marker-layer .ace_step {\n    position: absolute;\n    z-index: 3;\n}\n\n.ace_marker-layer .ace_selection {\n    position: absolute;\n    z-index: 5;\n}\n\n.ace_marker-layer .ace_bracket {\n    position: absolute;\n    z-index: 6;\n}\n\n.ace_marker-layer .ace_active_line {\n    position: absolute;\n    z-index: 2;\n}\n\n.ace_gutter .ace_gutter_active_line{\n    background-color : #dcdcdc;\n}\n\n.ace_marker-layer .ace_selected_word {\n    position: absolute;\n    z-index: 4;\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n}\n\n.ace_line .ace_fold {\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    \n    display: inline-block;\n    height: 11px;\n    margin-top: -2px;\n    vertical-align: middle;\n\n    background-image: \n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");\n    background-repeat: no-repeat, repeat-x;\n    background-position: center center, top left;\n    color: transparent;\n\n    border: 1px solid black;\n    -moz-border-radius: 2px;\n    -webkit-border-radius: 2px;\n    border-radius: 2px;\n    \n    cursor: pointer;\n    pointer-events: auto;\n}\n\n.ace_dark .ace_fold {\n}\n\n.ace_fold:hover{\n    background-image: \n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),\n        url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");\n    background-repeat: no-repeat, repeat-x;\n    background-position: center center, top left;\n}\n\n.ace_dragging .ace_content {\n    cursor: move;\n}\n\n.ace_folding-enabled > .ace_gutter-cell {\n    padding-right: 13px;\n}\n\n.ace_fold-widget {\n    box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n\n    margin: 0 -12px 1px 1px;\n    display: inline-block;\n    height: 14px;\n    width: 11px;\n    vertical-align: text-bottom;\n    \n    background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");\n    background-repeat: no-repeat;\n    background-position: center 5px;\n\n    border-radius: 3px;\n}\n\n.ace_fold-widget.end {\n    background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");\n}\n\n.ace_fold-widget.closed {\n    background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");\n}\n\n.ace_fold-widget:hover {\n    border: 1px solid rgba(0, 0, 0, 0.3);\n    background-color: rgba(255, 255, 255, 0.2);\n    -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n    -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n    box-shadow:inset 0 1px 1px rgba(255, 255, 255, 0.7);\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\n    background-position: center 4px;\n}\n\n.ace_fold-widget:active {\n    border: 1px solid rgba(0, 0, 0, 0.4);\n    background-color: rgba(0, 0, 0, 0.05);\n    -moz-box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n    -moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n    -webkit-box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n    -webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n    box-shadow:inset 0 1px 1px rgba(255, 255, 255);\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\n}\n\n.ace_fold-widget.invalid {\n    background-color: #FFB4B4;\n    border-color: #DE5555;\n}\n"),define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor"],function(a,b,c){function j(a,b,c){return i.$options.wrap=!0,i.$options.needle=b,i.$options.backwards=c==-1,i.find(a)}function m(a,b){return a.row==b.row&&a.column==b.column}function n(a){a.$onAddRange=a.$onAddRange.bind(a),a.$onRemoveRange=a.$onRemoveRange.bind(a),a.$onMultiSelect=a.$onMultiSelect.bind(a),a.$onSingleSelect=a.$onSingleSelect.bind(a),b.onSessionChange.call(a,a),a.on("changeSession",b.onSessionChange.bind(a)),a.on("mousedown",g),a.commands.addCommands(b.commands.defaultCommands)}var d=a("./range_list").RangeList,e=a("./range").Range,f=a("./selection").Selection,g=a("./mouse/multi_select_handler").onMouseDown;b.commands=a("./commands/multi_select_commands");var h=a("./search").Search,i=new h,k=a("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(k.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(a){if(!this.inMultiSelectMode&&this.rangeCount==0){var b=this.toOrientedRange();if(!a||!a.isEqual(b))this.rangeList.add(b),this.$onAddRange(b)}if(!a)return;a.cursor||(a.cursor=a.end);var c=this.rangeList.add(a);this.$onAddRange(a),c.length&&this.$onRemoveRange(c),this.rangeCount>0&&!this.inMultiSelectMode&&(this._emit("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session))},this.toSingleRange=function(a){a=a||this.ranges[0];var b=this.rangeList.removeAll();b.length&&this.$onRemoveRange(b),a&&this.fromOrientedRange(a)},this.substractPoint=function(a){var b=this.rangeList.substractPoint(a);if(b)return this.$onRemoveRange(b),b[0]},this.mergeOverlappingRanges=function(){var a=this.rangeList.merge();a.length?this.$onRemoveRange(a):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(a){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(a),this.fromOrientedRange(a),this._emit("addRange",{range:a})},this.$onRemoveRange=function(a){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var b=this.rangeList.ranges.pop();a.push(b),this.rangeCount=0}for(var c=a.length;c--;){var d=this.ranges.indexOf(a[c]);this.ranges.splice(d,1)}this._emit("removeRange",{ranges:a}),this.rangeCount==0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._emit("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),b=b||this.ranges[0],b&&!b.isEqual(this.getRange())&&this.fromOrientedRange(b)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new d,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeList.ranges.concat()},this.splitIntoLines=function(){if(this.rangeCount>1){var a=this.rangeList.ranges,b=a[a.length-1],c=e.fromPoints(a[0].start,b.end);this.toSingleRange(),this.setSelectionRange(c,b.cursor==b.start)}else{var d=this.session.documentToScreenPosition(this.selectionLead),f=this.session.documentToScreenPosition(this.selectionAnchor),g=this.rectangularRangeBlock(d,f);g.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(a,b,c){var d=[],f=a.column<b.column;if(f)var g=a.column,h=b.column;else var g=b.column,h=a.column;var i=a.row<b.row;if(i)var j=a.row,k=b.row;else var j=b.row,k=a.row;g<0&&(g=0),j<0&&(j=0),j==k&&(c=!0);for(var l=j;l<=k;l++){var n=e.fromPoints(this.session.screenToDocumentPosition(l,g),this.session.screenToDocumentPosition(l,h));if(n.isEmpty()){if(o&&m(n.end,o))break;var o=n.end}n.cursor=f?n.start:n.end,d.push(n)}i&&d.reverse();if(!c){var p=d.length-1;while(d[p].isEmpty()&&p>0)p--;if(p>0){var q=0;while(d[q].isEmpty())q++}for(var r=p;r>=q;r--)d[r].isEmpty()&&d.splice(r,1)}return d}}.call(f.prototype);var l=a("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(a){a.cursor||(a.cursor=a.end);var b=this.getSelectionStyle();return a.marker=this.session.addMarker(a,"ace_selection",b),this.session.$selectionMarkers.push(a),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,a},this.removeSelectionMarkers=function(a){for(var b=a.length;b--;){var c=a[b];if(!c.marker)continue;this.session.removeMarker(c.marker);var d=this.session.$selectionMarkers.indexOf(c);d!=-1&&this.session.$selectionMarkers.splice(d,1)}this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.$onAddRange=function(a){this.addSelectionMarker(a.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(a){this.removeSelectionMarkers(a.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(a){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("multiselect"),this.keyBinding.addKeyboardHandler(b.commands.keyboardHandler),this.commands.on("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(a){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("multiselect"),this.keyBinding.removeKeyboardHandler(b.commands.keyboardHandler),this.commands.removeEventListener("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelectExec=function(a){var b=a.command,c=a.editor;b.multiSelectAction?b.multiSelectAction=="forEach"?c.forEachSelection(b,a.args):b.multiSelectAction=="single"?(c.exitMultiSelectMode(),b.exec(c,a.args||{})):b.multiSelectAction(c,a.args||{}):(b.exec(c,a.args||{}),c.multiSelect.addRange(c.multiSelect.toOrientedRange()),c.multiSelect.mergeOverlappingRanges()),a.preventDefault()},this.forEachSelection=function(a,b){if(this.inVirtualSelectionMode)return;var c=this.session,d=this.selection,e=d.rangeList,g=d._eventRegistry;d._eventRegistry={};var h=new f(c);this.inVirtualSelectionMode=!0;for(var i=e.ranges.length;i--;)h.fromOrientedRange(e.ranges[i]),this.selection=c.selection=h,a.exec(this,b||{}),h.toOrientedRange(e.ranges[i]);h.detach(),this.selection=c.selection=d,this.inVirtualSelectionMode=!1,d._eventRegistry=g,d.mergeOverlappingRanges(),this.onCursorChange(),this.onSelectionChange()},this.exitMultiSelectMode=function(){if(this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getCopyText=function(){var a="";if(this.inMultiSelectMode){var b=this.multiSelect.rangeList.ranges;a=[];for(var c=0;c<b.length;c++)a.push(this.session.getTextRange(b[c]));a=a.join(this.session.getDocument().getNewLineCharacter())}else this.selection.isEmpty()||(a=this.session.getTextRange(this.getSelectionRange()));return a},this.selectMoreLines=function(a,b){var c=this.selection.toOrientedRange(),d=c.cursor==c.end,f=this.session.documentToScreenPosition(c.cursor);this.selection.$desiredColumn&&(f.column=this.selection.$desiredColumn);var g=this.session.screenToDocumentPosition(f.row+a,f.column);if(!c.isEmpty())var h=this.session.documentToScreenPosition(d?c.end:c.start),i=this.session.screenToDocumentPosition(h.row+a,h.column);else var i=g;if(d){var j=e.fromPoints(g,i);j.cursor=j.start}else{var j=e.fromPoints(i,g);j.cursor=j.end}j.desiredColumn=f.column;if(!this.selection.inMultiSelectMode)this.selection.addRange(c);else if(b)var k=c.cursor;this.selection.addRange(j),k&&this.selection.substractPoint(k)},this.transposeSelections=function(a){var b=this.session,c=b.multiSelect,d=c.ranges;for(var e=d.length;e--;){var f=d[e];if(f.isEmpty()){var g=b.getWordRange(f.start.row,f.start.column);f.start.row=g.start.row,f.start.column=g.start.column,f.end.row=g.end.row,f.end.column=g.end.column}}c.mergeOverlappingRanges();var h=[];for(var e=d.length;e--;){var f=d[e];h.unshift(b.getTextRange(f))}a<0?h.unshift(h.pop()):h.push(h.shift());for(var e=d.length;e--;){var f=d[e],g=f.clone();b.replace(f,h[e]),f.start.row=g.start.row,f.start.column=g.start.column}},this.selectMore=function(a,b){var c=this.session,d=c.multiSelect,e=d.toOrientedRange();if(e.isEmpty()){var e=c.getWordRange(e.start.row,e.start.column);e.cursor=e.end,this.multiSelect.addRange(e)}var f=c.getTextRange(e),g=j(c,f,a);g&&(g.cursor=a==-1?g.start:g.end,this.multiSelect.addRange(g)),b&&this.multiSelect.substractPoint(e.cursor)}}).call(l.prototype),b.onSessionChange=function(a){var b=a.session;b.multiSelect||(b.$selectionMarkers=[],b.selection.$initRangeList(),b.multiSelect=b.selection),this.multiSelect=b.multiSelect;var c=a.oldSession;c&&(c.multiSelect&&c.multiSelect.editor==this&&(c.multiSelect.editor=null),b.multiSelect.removeEventListener("addRange",this.$onAddRange),b.multiSelect.removeEventListener("removeRange",this.$onRemoveRange),b.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect),b.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)),b.multiSelect.on("addRange",this.$onAddRange),b.multiSelect.on("removeRange",this.$onRemoveRange),b.multiSelect.on("multiSelect",this.$onMultiSelect),b.multiSelect.on("singleSelect",this.$onSingleSelect),this.inMultiSelectMode!=b.selection.inMultiSelectMode&&(b.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},b.MultiSelect=n}),define("ace/range_list",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.ranges=[]};(function(){this.comparePoints=function(a,b){return a.row-b.row||a.column-b.column},this.pointIndex=function(a,b){var c=this.ranges;for(var d=b||0;d<c.length;d++){var e=c[d],f=this.comparePoints(a,e.end);if(f>0)continue;return f==0?d:(f=this.comparePoints(a,e.start),f>=0?d:-d-1)}return-d-1},this.add=function(a){var b=this.pointIndex(a.start);b<0&&(b=-b-1);var c=this.pointIndex(a.end,b);return c<0?c=-c-1:c++,this.ranges.splice(b,c-b,a)},this.addList=function(a){var b=[];for(var c=a.length;c--;)b.push.call(b,this.add(a[c]));return b},this.substractPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges.splice(b,1)},this.merge=function(){var a=[],b=this.ranges,c=b[0],d;for(var e=1;e<b.length;e++){d=c,c=b[e];var f=this.comparePoints(d.end,c.start);if(f<0)continue;if(f==0&&!d.isEmpty()&&!c.isEmpty())continue;this.comparePoints(d.end,c.end)<0&&(d.end.row=c.end.row,d.end.column=c.end.column),b.splice(e,1),a.push(c),c=d,e--}return a},this.contains=function(a,b){return this.pointIndex({row:a,column:b})>=0},this.containsPoint=function(a){return this.pointIndex(a)>=0},this.rangeAtPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges[b]},this.clipRows=function(a,b){var c=this.ranges;if(c[0].start.row>b||c[c.length-1].start.row<a)return[];var d=this.pointIndex({row:a,column:0});d<0&&(d=-d-1);var e=this.pointIndex({row:b,column:0},d);e<0&&(e=-e-1);var f=[];for(var g=d;g<e;g++)f.push(c[g]);return f},this.removeAll=function(){return this.ranges.splice(0,this.ranges.length)},this.attach=function(a){this.session&&this.detach(),this.session=a,this.onChange=this.$onChange.bind(this),this.session.on("change",this.onChange)},this.detach=function(){if(!this.session)return;this.session.removeListener("change",this.onChange),this.session=null},this.$onChange=function(a){var b=a.data.range;if(a.data.action[0]=="i")var c=b.start,d=b.end;else var d=b.start,c=b.end;var e=c.row,f=d.row,g=f-e,h=-c.column+d.column,i=this.ranges;for(var j=0,k=i.length;j<k;j++){var l=i[j];if(l.end.row<e)continue;if(l.start.row>e)break;l.start.row==e&&l.start.column>=c.column&&(l.start.column+=h,l.start.row+=g),l.end.row==e&&l.end.column>=c.column&&(l.end.column+=h,l.end.row+=g)}if(g!=0&&j<k)for(;j<k;j++){var l=i[j];l.start.row+=g,l.end.row+=g}}}).call(d.prototype),b.RangeList=d}),define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(a,b,c){function e(a,b){return a.row==b.row&&a.column==b.column}function f(a){var b=a.domEvent,c=b.altKey,f=b.shiftKey,g=a.getAccelKey(),h=a.getButton();if(!g&&!c){if(a.editor.inMultiSelectMode)if(h==0)a.editor.exitMultiSelectMode();else if(h==2){var i=a.editor,j=i.selection.isEmpty();i.textInput.onContextMenu({x:a.clientX,y:a.clientY},j),d.capture(i.container,function(){},i.textInput.onContextMenuClose),a.stop()}return}var i=a.editor,k=i.selection,l=i.inMultiSelectMode,m=a.getDocumentPosition(),n=k.getCursor(),o=a.inSelection()||k.isEmpty()&&e(m,n),p=a.pageX,q=a.pageY,r=function(a){p=d.getDocumentX(a),q=d.getDocumentY(a)},s=function(){var a=i.renderer.pixelToScreenCoordinates(p,q),b=t.screenToDocumentPosition(a.row,a.column);if(e(v,a)&&e(b,k.selectionLead))return;v=a,i.selection.moveCursorToPosition(b),i.selection.clearSelection(),i.renderer.scrollCursorIntoView(),i.removeSelectionMarkers(x),x=k.rectangularRangeBlock(v,u),x.forEach(i.addSelectionMarker,i),i.updateSelectionMarkers()},t=i.session,u=i.renderer.pixelToScreenCoordinates(p,q),v=u;if(g&&!f&&!c&&h==0){if(!l&&o)return;l||k.addRange(k.toOrientedRange());var w=k.rangeList.rangeAtPoint(m);d.capture(i.container,function(){},function(){var a=k.toOrientedRange();w&&a.isEmpty()&&e(w.cursor,a.cursor)?k.substractPoint(a.cursor):k.addRange(a)})}else if(!f&&c&&h==0){a.stop(),l&&!g?k.toSingleRange():!l&&g&&k.addRange(),k.moveCursorToPosition(m),k.clearSelection();var x=[],y=function(a){clearInterval(A),i.removeSelectionMarkers(x);for(var b=0;b<x.length;b++)k.addRange(x[b])},z=s;d.capture(i.container,r,y);var A=setInterval(function(){z()},20);return a.preventDefault()}}var d=a("../lib/event");b.onMouseDown=f}),define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"],function(a,b,c){b.defaultCommands=[{name:"addCursorAbove",exec:function(a){a.selectMoreLines(-1)},bindKey:{win:"Ctrl-Alt-Up",mac:"Ctrl-Alt-Up"},readonly:!0},{name:"addCursorBelow",exec:function(a){a.selectMoreLines(1)},bindKey:{win:"Ctrl-Alt-Down",mac:"Ctrl-Alt-Down"},readonly:!0},{name:"addCursorAboveSkipCurrent",exec:function(a){a.selectMoreLines(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Up",mac:"Ctrl-Alt-Shift-Up"},readonly:!0},{name:"addCursorBelowSkipCurrent",exec:function(a){a.selectMoreLines(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Down",mac:"Ctrl-Alt-Shift-Down"},readonly:!0},{name:"selectMoreBefore",exec:function(a){a.selectMore(-1)},bindKey:{win:"Ctrl-Alt-Left",mac:"Ctrl-Alt-Left"},readonly:!0},{name:"selectMoreAfter",exec:function(a){a.selectMore(1)},bindKey:{win:"Ctrl-Alt-Right",mac:"Ctrl-Alt-Right"},readonly:!0},{name:"selectNextBefore",exec:function(a){a.selectMore(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Left",mac:"Ctrl-Alt-Shift-Left"},readonly:!0},{name:"selectNextAfter",exec:function(a){a.selectMore(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Right",mac:"Ctrl-Alt-Shift-Right"},readonly:!0},{name:"splitIntoLines",exec:function(a){a.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Shift-L",mac:"Ctrl-Shift-L"},readonly:!0}],b.multiEditCommands=[{name:"singleSelection",bindKey:"esc",exec:function(a){a.exitMultiSelectMode()},readonly:!0}];var d=a("../keyboard/hash_handler").HashHandler;b.keyboardHandler=new d(b.multiEditCommands)}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/config"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/event_emitter").EventEmitter,f=a("../config"),g=function(b,c,d,e){this.changeListener=this.changeListener.bind(this);if(f.get("packaged"))this.$worker=new Worker(f.get("workerPath")+"/"+c);else{var g=this.$normalizePath(a.nameToUrl("ace/worker/worker",null,"_"));this.$worker=new Worker(g);var h={};for(var i=0;i<b.length;i++){var j=b[i],k=this.$normalizePath(a.nameToUrl(j,null,"_").replace(/.js$/,""));h[j]=k}}this.$worker.postMessage({init:!0,tlns:h,module:d,classname:e}),this.callbackId=1,this.callbacks={};var l=this;this.$worker.onerror=function(a){throw window.console&&console.log&&console.log(a),a},this.$worker.onmessage=function(a){var b=a.data;switch(b.type){case"log":window.console&&console.log&&console.log(b.data);break;case"event":l._emit(b.name,{data:b.data});break;case"call":var c=l.callbacks[b.id];c&&(c(b.data),delete l.callbacks[b.id])}}};(function(){d.implement(this,e),this.$normalizePath=function(a){return a=a.replace(/^[a-z]+:\/\/[^\/]+/,""),a=location.protocol+"//"+location.host+(a.charAt(0)=="/"?"":location.pathname.replace(/\/[^\/]*$/,""))+"/"+a.replace(/^[\/]+/,""),a},this.terminate=function(){this._emit("terminate",{}),this.$worker.terminate(),this.$worker=null,this.$doc.removeEventListener("change",this.changeListener),this.$doc=null},this.send=function(a,b){this.$worker.postMessage({command:a,args:b})},this.call=function(a,b,c){if(c){var d=this.callbackId++;this.callbacks[d]=c,b.push(d)}this.send(a,b)},this.emit=function(a,b){try{this.$worker.postMessage({event:a,data:{data:b.data}})}catch(c){}},this.attachToDocument=function(a){this.$doc&&this.terminate(),this.$doc=a,this.call("setValue",[a.getValue()]),a.on("change",this.changeListener)},this.changeListener=function(a){a.range={start:a.data.range.start,end:a.data.range.end},this.emit("change",a)}}).call(g.prototype),b.WorkerClient=g}),define("ace/keyboard/state_handler",["require","exports","module"],function(a,b,c){function e(a){this.keymapping=this.$buildKeymappingRegex(a)}"use strict";var d=!1;e.prototype={$buildKeymappingRegex:function(a){for(var b in a)this.$buildBindingsRegex(a[b]);return a},$buildBindingsRegex:function(a){a.forEach(function(a){a.key?a.key=new RegExp("^"+a.key+"$"):Array.isArray(a.regex)?("key"in a||(a.key=new RegExp("^"+a.regex[1]+"$")),a.regex=new RegExp(a.regex.join("")+"$")):a.regex&&(a.regex=new RegExp(a.regex+"$"))})},$composeBuffer:function(a,b,c,d){if(a.state==null||a.buffer==null)a.state="start",a.buffer="";var e=[];b&1&&e.push("ctrl"),b&8&&e.push("command"),b&2&&e.push("option"),b&4&&e.push("shift"),c&&e.push(c);var f=e.join("-"),g=a.buffer+f;b!=2&&(a.buffer=g);var h={bufferToUse:g,symbolicName:f};return d&&(h.keyIdentifier=d.keyIdentifier),h},$find:function(a,b,c,e,f,g){var h={};return this.keymapping[a.state].some(function(i){var j;if(i.key&&!i.key.test(c))return!1;if(i.regex&&!(j=i.regex.exec(b)))return!1;if(i.match&&!i.match(b,e,f,c,g))return!1;if(i.disallowMatches)for(var k=0;k<i.disallowMatches.length;k++)if(!!j[i.disallowMatches[k]])return!1;if(i.exec){h.command=i.exec;if(i.params){var l;h.args={},i.params.forEach(function(a){a.match!=null&&j!=null?l=j[a.match]||a.defaultValue:l=a.defaultValue,a.type==="number"&&(l=parseInt(l)),h.args[a.name]=l})}a.buffer=""}return i.then&&(a.state=i.then,a.buffer=""),h.command==null&&(h.command="null"),d&&console.log("KeyboardStateMapper#find",i),!0}),h.command?h:(a.buffer="",!1)},handleKeyboard:function(a,b,c,e,f){if(b==0||c!=""&&c!=String.fromCharCode(0)){var g=this.$composeBuffer(a,b,c,f),h=g.bufferToUse,i=g.symbolicName,j=g.keyIdentifier;return g=this.$find(a,h,i,b,c,j),d&&console.log("KeyboardStateMapper#match",h,i,g),g}return null}},b.matchCharacterOnly=function(a,b,c,d){return b==0?!0:b==4&&c.length==1?!0:!1},b.StateHandler=e}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(a,b,c){"use strict";var d=a("./range").Range,e=a("./lib/event_emitter").EventEmitter,f=a("./lib/oop"),g=function(a,b,c,d,e,f){var g=this;this.length=b,this.session=a,this.doc=a.getDocument(),this.mainClass=e,this.othersClass=f,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=d,this.$onCursorChange=function(){setTimeout(function(){g.onCursorChange()})},this.$pos=c;var h=a.getUndoManager().$undoStack||a.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=h.length,this.setup(),a.selection.on("changeCursor",this.$onCursorChange)};(function(){f.implement(this,e),this.setup=function(){var a=this,b=this.doc,c=this.session,e=this.$pos;this.pos=b.createAnchor(e.row,e.column),this.markerId=c.addMarker(new d(e.row,e.column,e.row,e.column+this.length),this.mainClass,null,!1),this.pos.on("change",function(b){c.removeMarker(a.markerId),a.markerId=c.addMarker(new d(b.value.row,b.value.column,b.value.row,b.value.column+a.length),a.mainClass,null,!1)}),this.others=[],this.$others.forEach(function(c){var d=b.createAnchor(c.row,c.column);a.others.push(d)}),c.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var a=this.session,b=this;this.othersActive=!0,this.others.forEach(function(c){c.markerId=a.addMarker(new d(c.row,c.column,c.row,c.column+b.length),b.othersClass,null,!1),c.on("change",function(e){a.removeMarker(c.markerId),c.markerId=a.addMarker(new d(e.value.row,e.value.column,e.value.row,e.value.column+b.length),b.othersClass,null,!1)})})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var a=0;a<this.others.length;a++)this.session.removeMarker(this.others[a].markerId)},this.onUpdate=function(a){var b=a.data,c=b.range;if(c.start.row!==c.end.row)return;if(c.start.row!==this.pos.row)return;if(this.$updating)return;this.$updating=!0;var e=b.action==="insertText"?c.end.column-c.start.column:c.start.column-c.end.column;if(c.start.column>=this.pos.column&&c.start.column<=this.pos.column+this.length+1){var f=c.start.column-this.pos.column;this.length+=e;if(!this.session.$fromUndo){if(b.action==="insertText")for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};h.row===c.start.row&&c.start.column<h.column&&(i.column+=e),this.doc.insert(i,b.text)}else if(b.action==="removeText")for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};h.row===c.start.row&&c.start.column<h.column&&(i.column+=e),this.doc.remove(new d(i.row,i.column,i.row,i.column-e))}c.start.column===this.pos.column&&b.action==="insertText"?setTimeout(function(){this.pos.setPosition(this.pos.row,this.pos.column-e);for(var a=0;a<this.others.length;a++){var b=this.others[a],d={row:b.row,column:b.column-e};b.row===c.start.row&&c.start.column<b.column&&(d.column+=e),b.setPosition(d.row,d.column)}}.bind(this),0):c.start.column===this.pos.column&&b.action==="removeText"&&setTimeout(function(){for(var a=0;a<this.others.length;a++){var b=this.others[a];b.row===c.start.row&&c.start.column<b.column&&b.setPosition(b.row,b.column-e)}}.bind(this),0)}this.pos._emit("change",{value:this.pos});for(var g=0;g<this.others.length;g++)this.others[g]._emit("change",{value:this.others[g]})}this.$updating=!1},this.onCursorChange=function(a){if(this.$updating)return;var b=this.session.selection.getCursor();b.row===this.pos.row&&b.column>=this.pos.column&&b.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",a)):(this.hideOtherMarkers(),this._emit("cursorLeave",a))},this.detach=function(){this.session.removeMarker(this.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.pos.detach();for(var a=0;a<this.others.length;a++)this.others[a].detach();this.session.setUndoSelect(!0)},this.cancel=function(){if(this.$undoStackDepth===-1)throw Error("Canceling placeholders only supported with undo manager attached to session.");var a=this.session.getUndoManager(),b=(a.$undoStack||a.$undostack).length-this.$undoStackDepth;for(var c=0;c<b;c++)a.undo(!0)}}).call(g.prototype),b.PlaceHolder=g}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict",b.isDark=!1,b.cssClass="ace-tm",b.cssText=".ace-tm .ace_editor {  border: 2px solid rgb(159, 159, 159);}.ace-tm .ace_editor.ace_focus {  border: 2px solid #327fbd;}.ace-tm .ace_gutter {  background: #e8e8e8;  color: #333;}.ace-tm .ace_print_margin {  width: 1px;  background: #e8e8e8;}.ace-tm .ace_fold {    background-color: #6B72E6;}.ace-tm .ace_text-layer {  cursor: text;}.ace-tm .ace_cursor {  border-left: 1px solid black;}.ace-tm .ace_cursor.ace_overwrite {  border-left: 0px;  border-bottom: 1px solid black;}        .ace-tm .ace_line .ace_invisible {  color: rgb(191, 191, 191);}.ace-tm .ace_line .ace_storage,.ace-tm .ace_line .ace_keyword {  color: blue;}.ace-tm .ace_line .ace_constant {  color: rgb(197, 6, 11);}.ace-tm .ace_line .ace_constant.ace_buildin {  color: rgb(88, 72, 246);}.ace-tm .ace_line .ace_constant.ace_language {  color: rgb(88, 92, 246);}.ace-tm .ace_line .ace_constant.ace_library {  color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_invalid {  background-color: rgb(153, 0, 0);  color: white;}.ace-tm .ace_line .ace_support.ace_function {  color: rgb(60, 76, 114);}.ace-tm .ace_line .ace_support.ace_constant {  color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_support.ace_type,.ace-tm .ace_line .ace_support.ace_class {  color: rgb(109, 121, 222);}.ace-tm .ace_line .ace_keyword.ace_operator {  color: rgb(104, 118, 135);}.ace-tm .ace_line .ace_string {  color: rgb(3, 106, 7);}.ace-tm .ace_line .ace_comment {  color: rgb(76, 136, 107);}.ace-tm .ace_line .ace_comment.ace_doc {  color: rgb(0, 102, 255);}.ace-tm .ace_line .ace_comment.ace_doc.ace_tag {  color: rgb(128, 159, 191);}.ace-tm .ace_line .ace_constant.ace_numeric {  color: rgb(0, 0, 205);}.ace-tm .ace_line .ace_variable {  color: rgb(49, 132, 149);}.ace-tm .ace_line .ace_xml_pe {  color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {  color: #0000A2;}.ace-tm .ace_markup.ace_markupine {    text-decoration:underline;}.ace-tm .ace_markup.ace_heading {  color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list {  color:rgb(185, 6, 144);}.ace-tm .ace_marker-layer .ace_selection {  background: rgb(181, 213, 255);}.ace-tm .ace_marker-layer .ace_step {  background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {  background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {  margin: -1px 0 0 -1px;  border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active_line {  background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_marker-layer .ace_selected_word {  background: rgb(250, 250, 255);  border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_meta.ace_tag {  color:rgb(28, 2, 255);}.ace-tm .ace_string.ace_regex {  color: rgb(255, 0, 0)}";var d=a("../lib/dom");d.importCssString(b.cssText,b.cssClass)});
             (function() {
                 window.require(["ace/ace"], function(a) {
                     if (!window.ace)
diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js
index 2471d294a851337c7486b600e7952fe234323550..9d168c1c4f6cf13d30da5dc08113b87f99bb2060 100644
--- a/apps/files_texteditor/js/editor.js
+++ b/apps/files_texteditor/js/editor.js
@@ -67,7 +67,7 @@ function setSyntaxMode(ext){
 function showControls(filename,writeperms){
 	// Loads the control bar at the top.
 	// Load the new toolbar.
-	var editorbarhtml = '<div id="editorcontrols" style="display: none;"><div class="crumb svg last" id="breadcrumb_file" style="background-image:url(&quot;../core/img/breadcrumb.png&quot;)"><p>'+filename+'</p></div>';
+	var editorbarhtml = '<div id="editorcontrols" style="display: none;"><div class="crumb svg last" id="breadcrumb_file" style="background-image:url(&quot;'+OC.imagePath('core','breadcrumb.png')+'&quot;)"><p>'+filename+'</p></div>';
 	if(writeperms=="true"){
 		editorbarhtml += '<button id="editor_save">'+t('files_texteditor','Save')+'</button><div class="separator"></div>';
 	}
@@ -221,6 +221,10 @@ function showFileEditor(dir,filename){
 								document.title = $('#editor').attr('data-filename')+' * - ownCloud';
 							}
 						});
+						// Add the ctrl+s event
+						window.aceEditor.commands.addCommand({
							name: "save",
							bindKey: {
							win: "Ctrl-S",
							mac: "Command-S",
							sender: "editor"
							},
							exec: function(){
+								doFileSave();	
+							}
						});
 					});
 				} else {
 					// Failed to get the file.
diff --git a/apps/files_versions/ajax/getVersions.php b/apps/files_versions/ajax/getVersions.php
old mode 100755
new mode 100644
index 8ef17d5a25c0292e3abc691c71cdf548fbd78b6d..1d107c1bda0ad391a7d2253028c93817f16df47d
--- a/apps/files_versions/ajax/getVersions.php
+++ b/apps/files_versions/ajax/getVersions.php
@@ -1,7 +1,4 @@
 <?php
-
-require_once('lib/base.php');
-
 OCP\JSON::checkAppEnabled('files_versions');
 
 require_once('apps/files_versions/versions.php');
@@ -14,15 +11,8 @@ if( OCA_Versions\Storage::isversioned( $source ) ) {
 
 	$count=5; //show the newest revisions
 	$versions = OCA_Versions\Storage::getversions( $source, $count);
-	$versionsFormatted = array();
-	
-	foreach ( $versions AS $version ) {
-	
-		$versionsFormatted[] = OCP\Util::formatDate( $version );
-		
-	}
 
-	$versionsSorted = array_reverse( $versionsFormatted );
+	$versionsSorted = array_reverse( $versions );
 	
 	if ( !empty( $versionsSorted ) ) {
 		OCP\JSON::encodedPrint($versionsSorted);
diff --git a/apps/files_versions/ajax/rollbackVersion.php b/apps/files_versions/ajax/rollbackVersion.php
old mode 100755
new mode 100644
index 3faaafe935daf2a9d82134e48cbff20e7baee59f..127592f3b58095bf55c48b95ae13562c1a049b0c
--- a/apps/files_versions/ajax/rollbackVersion.php
+++ b/apps/files_versions/ajax/rollbackVersion.php
@@ -1,26 +1,18 @@
 <?php
 
-require_once('../../../lib/base.php');
 OCP\JSON::checkAppEnabled('files_versions');
-require_once('../versions.php');
 
-$userDirectory = "/".OCP\USER::getUser()."/files";
-
-$source = $_GET['source'];
-
-$source = strip_tags( $source );
-
-echo "\n\n$source\n\n";
+require_once('apps/files_versions/versions.php');
 
-$revision = strtotime( $source );
-
-echo "\n\n$revision\n\n";
-
-if( OCA_Versions\Storage::isversioned( $source ) ) {
+$userDirectory = "/".OCP\USER::getUser()."/files";
 
+$file = $_GET['file'];
+$revision=(int)$_GET['revision'];
 
-        #\OCA_Versions\Storage::rollback( $source, $revision );
-	
+if( OCA_Versions\Storage::isversioned( $file ) ) {
+	if(OCA_Versions\Storage::rollback( $file, $revision )){
+		OCP\JSON::success(array("data" => array( "revision" => $revision, "file" => $file )));
+	}else{
+		OCP\JSON::error(array("data" => array( "message" => "Could not revert:" . $file )));
+	}
 }
-
-?>
\ No newline at end of file
diff --git a/apps/files_versions/ajax/togglesettings.php b/apps/files_versions/ajax/togglesettings.php
old mode 100755
new mode 100644
diff --git a/apps/files_versions/appinfo/app.php b/apps/files_versions/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version
index afaf360d37fb71bcfa8cc082882f910ac2628bda..7f207341d5d9bda5ae8acfa7a6e02cdf7cd9d983 100644
--- a/apps/files_versions/appinfo/version
+++ b/apps/files_versions/appinfo/version
@@ -1 +1 @@
-1.0.0
\ No newline at end of file
+1.0.1
\ No newline at end of file
diff --git a/apps/files_versions/history.php b/apps/files_versions/history.php
old mode 100755
new mode 100644
index 59288b6c62d315ec474c1368276d7aebfb11a8b1..f12dc618f235ad1b56c54321b8cbdd9dcc6a5034
--- a/apps/files_versions/history.php
+++ b/apps/files_versions/history.php
@@ -20,7 +20,6 @@
  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
  * 
  */
-require_once( '../../lib/base.php' );
 
 OCP\User::checkLoggedIn( );
 OCP\Util::addStyle('files_versions','versions');
diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js
index eadf7a510399f00cc15f34386f201813021ca98f..61090f956f0e81008a3804de6e63466d573f56ef 100644
--- a/apps/files_versions/js/versions.js
+++ b/apps/files_versions/js/versions.js
@@ -34,7 +34,7 @@ function createVersionsDropdown(filename, files) {
 	html += '</select>';
 	html += '</div>';
 	//html += '<input type="button" value="Revert file" onclick="revertFile()" />';
-	html += '<input type="button" value="Revert file..." onclick="window.location=\''+historyUrl+'\'" name="makelink" id="makelink" />';
+	html += '<input type="button" value="All versions..." onclick="window.location=\''+historyUrl+'\'" name="makelink" id="makelink" />';
 	html += '<br />';
 	html += '<input id="link" style="display:none; width:90%;" />';
 	
@@ -47,7 +47,7 @@ function createVersionsDropdown(filename, files) {
 	
 	$.ajax({
 		type: 'GET',
-		url: OC.linkTo('files_versions', 'ajax/getVersions.php'),
+		url: OC.filePath('files_versions', 'ajax', 'getVersions.php'),
 		dataType: 'json',
 		data: { source: files },
 		async: false,
@@ -58,34 +58,39 @@ function createVersionsDropdown(filename, files) {
 			if (versions) {
 				
 				$.each( versions, function(index, row ) {
-						
-						addVersion( row );
+					addVersion( row );
 				});
 				
 			}
-			
+			$('#found_versions').change(function(){
+				var revision=parseInt($(this).val());
+				revertFile(files,revision);
+			})
 		}
 	});
 	
-	function revertFile() {
+	function revertFile(file, revision) {
 		
 		$.ajax({
 			type: 'GET',
 			url: OC.linkTo('files_versions', 'ajax/rollbackVersion.php'),
 			dataType: 'json',
-			data: {path: file, revision: 'revision'},
+			data: {file: file, revision: revision},
 			async: false,
-			success: function(versions) {
-				if (versions) {
+			success: function(response) {
+				if (response.status=='error') {
+					OC.dialogs.alert('Failed to revert '+file+' to revision '+formatDate(revision*1000)+'.','Failed to revert');
 				}
 			}
 		});	
 		
 	}
 	
-	function addVersion( name ) {
-		
-		var version = '<option>'+name+'</option>';
+	function addVersion(revision ) {
+		name=formatDate(revision*1000);
+		var version=$('<option/>');
+		version.attr('value',revision);
+		version.text(name);
 		
 // 		} else {
 // 			var checked = ((permissions > 0) ? 'checked="checked"' : 'style="display:none;"');
@@ -98,7 +103,7 @@ function createVersionsDropdown(filename, files) {
 // 			user += '</li>';
 // 		}
 		
-		$(version).appendTo('#found_versions');
+		version.appendTo('#found_versions');
 	}
 
 	$('#dropdown').show('blind');
diff --git a/apps/files_versions/settings.php b/apps/files_versions/settings.php
old mode 100755
new mode 100644
diff --git a/apps/files_versions/templates/history.php b/apps/files_versions/templates/history.php
old mode 100755
new mode 100644
diff --git a/apps/files_versions/templates/settings.php b/apps/files_versions/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/files_versions/versions.php b/apps/files_versions/versions.php
old mode 100755
new mode 100644
index 082dfbf7fd07b4dbc5dd25a37395444bca1b24b2..6c2e104247455de9f3263aa0de344e9fbed079bc
--- a/apps/files_versions/versions.php
+++ b/apps/files_versions/versions.php
@@ -33,7 +33,7 @@ class Storage {
 
 	const DEFAULTENABLED=true; 
 	const DEFAULTFOLDER='versions'; 
-	const DEFAULTBLACKLIST='avi mp3 mpg mp4'; 
+	const DEFAULTBLACKLIST='avi mp3 mpg mp4 ctmp'; 
 	const DEFAULTMAXFILESIZE=1048576; // 10MB 
 	const DEFAULTMININTERVAL=120; // 2 min
 	const DEFAULTMAXVERSIONS=50; 
diff --git a/apps/gallery/ajax/createAlbum.php b/apps/gallery/ajax/createAlbum.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/ajax/galleryOp.php b/apps/gallery/ajax/galleryOp.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/ajax/sharing.php b/apps/gallery/ajax/sharing.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/ajax/thumbnail.php b/apps/gallery/ajax/thumbnail.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/index.php b/apps/gallery/index.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/l10n/ca.php b/apps/gallery/l10n/ca.php
index b007d776ec2562c33a2e45f9c05f6a902577a476..cbb0d8b6c5fbafa19e6f90da7dc4c18ea134b2ed 100644
--- a/apps/gallery/l10n/ca.php
+++ b/apps/gallery/l10n/ca.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Fotos",
 "Rescan" => "Escaneja de nou",
-"Back" => "Enrera"
+"Stop" => "Atura",
+"Share" => "Comparteix",
+"Settings" => "Arranjament",
+"Back" => "Enrera",
+"Remove confirmation" => "Elimina la confirmació",
+"Do you want to remove album" => "Voleu eliminar l'àlbum",
+"Change album name" => "Canvia el nom de l'àlbum",
+"New album name" => "Nom nou de l'àlbum"
 );
diff --git a/apps/gallery/l10n/cs_CZ.php b/apps/gallery/l10n/cs_CZ.php
index cbb3e5d068e919ab228df98e9d9a051016cd3121..4d6394cbb3ffcc26f84176ba96d306f69c192b6d 100644
--- a/apps/gallery/l10n/cs_CZ.php
+++ b/apps/gallery/l10n/cs_CZ.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Obrázky",
 "Rescan" => "Znovu prohledat",
-"Back" => "Zpět"
+"Stop" => "Zastavit",
+"Share" => "Sdílet",
+"Settings" => "Nastavení",
+"Back" => "Zpět",
+"Remove confirmation" => "Potvrzení odebrání",
+"Do you want to remove album" => "Chcete odstranit album?",
+"Change album name" => "Změnit název alba",
+"New album name" => "Název nového alba"
 );
diff --git a/apps/gallery/l10n/de.php b/apps/gallery/l10n/de.php
index c9afd4e91af5c668a9bd3b840e879740659697d4..f760022ba25d52cedd9049b83c8c70bc45df3bfa 100644
--- a/apps/gallery/l10n/de.php
+++ b/apps/gallery/l10n/de.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Bilder",
 "Rescan" => "Rescan",
-"Back" => "Zurück"
+"Stop" => "Stopp",
+"Share" => "Teilen",
+"Settings" => "Einstellungen",
+"Back" => "Zurück",
+"Remove confirmation" => "Bestätigung entfernen",
+"Do you want to remove album" => "Soll das Album entfernt werden",
+"Change album name" => "Albumname ändern",
+"New album name" => "Neuer Albumname"
 );
diff --git a/apps/gallery/l10n/el.php b/apps/gallery/l10n/el.php
index 3edbbed8e713e765e9d7192cfe84c11634d01ec5..461bd346704f772a36a5b0d07459a377a87402f3 100644
--- a/apps/gallery/l10n/el.php
+++ b/apps/gallery/l10n/el.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Εικόνες",
 "Rescan" => "Επανασάρωση",
-"Back" => "Επιστροφή"
+"Stop" => "Σταμάτησε",
+"Share" => "Κοινοποίησε",
+"Settings" => "Ρυθμίσεις",
+"Back" => "Επιστροφή",
+"Remove confirmation" => "Αφαίρεση επιβεβαίωσης",
+"Do you want to remove album" => "Θέλετε να αφαιρέσετε το άλμπουμ",
+"Change album name" => "Αλλάξτε το όνομα του άλμπουμ",
+"New album name" => "Νέο όνομα άλμπουμ"
 );
diff --git a/apps/gallery/l10n/es.php b/apps/gallery/l10n/es.php
index f54f1cd4ceca4cc06dbd2cc23a4d6f3f11d973c6..098a92b5c537e6b39693c0d80d041880a75638c0 100644
--- a/apps/gallery/l10n/es.php
+++ b/apps/gallery/l10n/es.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Imágenes",
 "Rescan" => "Refrescar",
-"Back" => "Atrás"
+"Stop" => "Parar",
+"Share" => "Compartir",
+"Settings" => "Preferencias",
+"Back" => "Atrás",
+"Remove confirmation" => "Borrar confirmación",
+"Do you want to remove album" => "¿Quieres eliminar el álbum",
+"Change album name" => "Cambiar nombre al álbum",
+"New album name" => "Nuevo nombre de álbum"
 );
diff --git a/apps/gallery/l10n/et_EE.php b/apps/gallery/l10n/et_EE.php
index 36c1cd76a0bd7be495a72f92c3109282d34e80a3..e386274bc543b926a5593f653fd5f225f515b41a 100644
--- a/apps/gallery/l10n/et_EE.php
+++ b/apps/gallery/l10n/et_EE.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Pildid",
 "Rescan" => "Skänni uuesti",
-"Back" => "Tagasi"
+"Stop" => "Peata",
+"Share" => "Jaga",
+"Settings" => "Seaded",
+"Back" => "Tagasi",
+"Remove confirmation" => "Eemaldamise kinnitus",
+"Do you want to remove album" => "Kas sa soovid albumit eemaldada",
+"Change album name" => "Muuda albumi nime",
+"New album name" => "Uue albumi nimi"
 );
diff --git a/apps/gallery/l10n/eu.php b/apps/gallery/l10n/eu.php
index d1e89af25a135a8e96e8edc52d21849160a56a89..9942183523a5d8748c08d1416ad77292facbc24a 100644
--- a/apps/gallery/l10n/eu.php
+++ b/apps/gallery/l10n/eu.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Argazkiak",
 "Rescan" => "Bireskaneatu",
-"Back" => "Atzera"
+"Stop" => "Gelditu",
+"Share" => "Elkarbanatu",
+"Settings" => "Ezarpenak",
+"Back" => "Atzera",
+"Remove confirmation" => "Ezabatu konfirmazioa",
+"Do you want to remove album" => "Albuma ezabatu nahi al duzu",
+"Change album name" => "Aldatu albumaren izena",
+"New album name" => "Album berriaren izena"
 );
diff --git a/apps/gallery/l10n/fa.php b/apps/gallery/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ddf28b015d3c4b9a6578b6dd88d1c2720dc8e76
--- /dev/null
+++ b/apps/gallery/l10n/fa.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Pictures" => "تصاویر",
+"Rescan" => "بازرسی دوباره",
+"Stop" => "توقف",
+"Share" => "به اشتراک گذاری",
+"Settings" => "تنظیمات",
+"Back" => "بازگشت",
+"Remove confirmation" => "پاک کردن تصدیق",
+"Do you want to remove album" => "آیا مایل به پاک کردن آلبوم هستید؟",
+"Change album name" => "تغییر نام آلبوم",
+"New album name" => "نام آلبوم جدید"
+);
diff --git a/apps/gallery/l10n/fr.php b/apps/gallery/l10n/fr.php
index d57072315538324a9e57f629b93b0efe5ab996d8..4cbd42f1b36739e696d5630caa75f91567b0d614 100644
--- a/apps/gallery/l10n/fr.php
+++ b/apps/gallery/l10n/fr.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Images",
 "Rescan" => "Analyser à nouveau",
-"Back" => "Retour"
+"Stop" => "Arrêter",
+"Share" => "Partager",
+"Settings" => "Préférences",
+"Back" => "Retour",
+"Remove confirmation" => "Enlever la confirmation",
+"Do you want to remove album" => "Voulez-vous supprimer l'album",
+"Change album name" => "Modifier le nom de l'album",
+"New album name" => "Nouveau nom de l'album"
 );
diff --git a/apps/gallery/l10n/hu_HU.php b/apps/gallery/l10n/hu_HU.php
new file mode 100644
index 0000000000000000000000000000000000000000..bd30fe20f2f3d64a59c08cf73293fca2eef1cc40
--- /dev/null
+++ b/apps/gallery/l10n/hu_HU.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Pictures" => "Képek",
+"Rescan" => "Újravizsgálás",
+"Stop" => "Állj",
+"Share" => "Megosztás",
+"Settings" => "Beállítások",
+"Back" => "Vissza",
+"Remove confirmation" => "Megerősítés eltávolítása",
+"Do you want to remove album" => "El akarja távolítani az albumot?",
+"Change album name" => "Albumnév megváltoztatása",
+"New album name" => "Új albumnév"
+);
diff --git a/apps/gallery/l10n/it.php b/apps/gallery/l10n/it.php
index 9d808f2dfca69b56f41666da98eec3b7338bc656..1ca87129261d1fb9563f1907895584484b849eae 100644
--- a/apps/gallery/l10n/it.php
+++ b/apps/gallery/l10n/it.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Immagini",
 "Rescan" => "Nuova scansione",
-"Back" => "Indietro"
+"Stop" => "Ferma",
+"Share" => "Condividi",
+"Settings" => "Impostazioni",
+"Back" => "Indietro",
+"Remove confirmation" => "Rimuovi conferma",
+"Do you want to remove album" => "Vuoi rimuovere l'album",
+"Change album name" => "Cambia il nome dell'album",
+"New album name" => "Nuovo nome dell'album"
 );
diff --git a/apps/gallery/l10n/ko.php b/apps/gallery/l10n/ko.php
index a4f159f244f3abb0cb6942b0f14f642d114c93ba..b6d37796a080065c01f7b253925d2c4ca22ea146 100644
--- a/apps/gallery/l10n/ko.php
+++ b/apps/gallery/l10n/ko.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "사진",
 "Rescan" => "재검색",
-"Back" => "뒤로"
+"Stop" => "정지",
+"Share" => "공유",
+"Settings" => "세팅",
+"Back" => "뒤로",
+"Remove confirmation" => "삭제 승인",
+"Do you want to remove album" => "앨범을 삭제하시겠습니까",
+"Change album name" => "앨범 이름 변경",
+"New album name" => "새로운 앨범 이름"
 );
diff --git a/apps/gallery/l10n/mk.php b/apps/gallery/l10n/mk.php
index 7fda4d89ddc58357ba5ffd59845b7865dad6de6f..59bef78bec6b348fb0d52f533afe69a80f5b16ae 100644
--- a/apps/gallery/l10n/mk.php
+++ b/apps/gallery/l10n/mk.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Слики",
 "Rescan" => "Рескенирај",
-"Back" => "Назад"
+"Stop" => "Стоп",
+"Share" => "Сподели",
+"Settings" => "Параметри",
+"Back" => "Назад",
+"Remove confirmation" => "Тргни потврда",
+"Do you want to remove album" => "Дали сакате да го отстраните албумот",
+"Change album name" => "Измени име на албумот",
+"New album name" => "Ново има на албумот"
 );
diff --git a/apps/gallery/l10n/nb_NO.php b/apps/gallery/l10n/nb_NO.php
index 59954de0f59c4a5eed0ed1bbffa7667ae9c27cc3..e3f35ea393872f12f0d38c869cd300b17a5d99e8 100644
--- a/apps/gallery/l10n/nb_NO.php
+++ b/apps/gallery/l10n/nb_NO.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Bilder",
 "Rescan" => "Les inn på nytt",
-"Back" => "Tilbake"
+"Stop" => "Stopp",
+"Share" => "Del",
+"Settings" => "Innstillinger",
+"Back" => "Tilbake",
+"Remove confirmation" => "Fjern bekreftelse",
+"Do you want to remove album" => "Ønsker du å slette albumet?",
+"Change album name" => "Endre navn på album",
+"New album name" => "Nytt navn på album"
 );
diff --git a/apps/gallery/l10n/nl.php b/apps/gallery/l10n/nl.php
index 9d03cebf5b1472fd4134405c797891ac3e9f0d97..b4bd0eb8ea9e9bad2cf9f6fbe773ae53f6390b46 100644
--- a/apps/gallery/l10n/nl.php
+++ b/apps/gallery/l10n/nl.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Plaatjes",
 "Rescan" => "Opnieuw doorzoeken",
-"Back" => "Terug"
+"Stop" => "Stop",
+"Share" => "Deel",
+"Settings" => "Instellingen",
+"Back" => "Terug",
+"Remove confirmation" => "Verwijder bevestiging",
+"Do you want to remove album" => "Wil je het album verwijderen: ",
+"Change album name" => "Wijzig album naam",
+"New album name" => "Nieuwe album naam"
 );
diff --git a/apps/gallery/l10n/pt_BR.php b/apps/gallery/l10n/pt_BR.php
index 5d704b824c0aa2b4b20979655140effc8ba5e47c..6fb47e4f842c5b0ce80fddc676af9564188b438b 100644
--- a/apps/gallery/l10n/pt_BR.php
+++ b/apps/gallery/l10n/pt_BR.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Fotos",
 "Rescan" => "Atualizar",
-"Back" => "Voltar"
+"Stop" => "Parar",
+"Share" => "Compartilhar",
+"Settings" => "Configuração",
+"Back" => "Voltar",
+"Remove confirmation" => "Confirmar apagar",
+"Do you want to remove album" => "Voçe dezeja remover o album",
+"Change album name" => "Mudar nome do album",
+"New album name" => "Nome do novo album"
 );
diff --git a/apps/gallery/l10n/sk_SK.php b/apps/gallery/l10n/sk_SK.php
index d43f068472ba1ff9365f7d2cbc6df8ef469b2097..9c18cb49cd78caf16045d1768016875d298fed1b 100644
--- a/apps/gallery/l10n/sk_SK.php
+++ b/apps/gallery/l10n/sk_SK.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Obrázky",
 "Rescan" => "Znovu oskenovať",
-"Back" => "Späť"
+"Stop" => "Zastaviť",
+"Share" => "Zdielať",
+"Settings" => "nastavenia",
+"Back" => "Späť",
+"Remove confirmation" => "Potvrdenie odstránenia",
+"Do you want to remove album" => "Chcete odstrániť album?",
+"Change album name" => "Zmeniť meno albumu",
+"New album name" => "Nové meno albumu"
 );
diff --git a/apps/gallery/l10n/sl.php b/apps/gallery/l10n/sl.php
index e81a78e94854cc21865b21fdaa36cd56ad37b7fd..671e7306369698193d2c875e205d21c0dcaf9ce6 100644
--- a/apps/gallery/l10n/sl.php
+++ b/apps/gallery/l10n/sl.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Slike",
 "Rescan" => "Ponovno preišči",
-"Back" => "Nazaj"
+"Stop" => "Stop",
+"Share" => "Deli",
+"Settings" => "Nastavitve",
+"Back" => "Nazaj",
+"Remove confirmation" => "Odstrani potrditev",
+"Do you want to remove album" => "Ali želite odstraniti album",
+"Change album name" => "Spremeni ime albuma",
+"New album name" => "Novo ime albuma"
 );
diff --git a/apps/gallery/l10n/th_TH.php b/apps/gallery/l10n/th_TH.php
index 0bd950acc47b72d5793fbe11b7466b4e99e4bb7a..39d43dcdc4b94639498aad078cc2f84966a7f23b 100644
--- a/apps/gallery/l10n/th_TH.php
+++ b/apps/gallery/l10n/th_TH.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "รูปภาพ",
 "Rescan" => "ตรวจสอบอีกครั้ง",
-"Back" => "ย้อนกลับ"
+"Stop" => "หยุด",
+"Share" => "แชร์",
+"Settings" => "ตั้งค่า",
+"Back" => "ย้อนกลับ",
+"Remove confirmation" => "การยืนยันการลบ",
+"Do you want to remove album" => "คุณต้องการลบอัลบั้มออกหรือไม่",
+"Change album name" => "เปลี่ยนชื่ออัลบั้ม",
+"New album name" => "ชื่อใหม่ของอัลบั้ม"
 );
diff --git a/apps/gallery/l10n/tr.php b/apps/gallery/l10n/tr.php
index 2139e7aac1c42d7df5828d5ebb24899d602005dd..07d853998bb5b26928533d873a4710c4011525d9 100644
--- a/apps/gallery/l10n/tr.php
+++ b/apps/gallery/l10n/tr.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "Resimler",
 "Rescan" => "Yeniden Tara ",
-"Back" => "Geri"
+"Stop" => "Durdur",
+"Share" => "Paylaş",
+"Settings" => "Ayarlar",
+"Back" => "Geri",
+"Remove confirmation" => "Doğrulamayı kaldır",
+"Do you want to remove album" => "Albümü silmek istiyor musunuz",
+"Change album name" => "Albüm adını değiştir",
+"New album name" => "Yeni albüm adı"
 );
diff --git a/apps/gallery/l10n/zh_CN.php b/apps/gallery/l10n/zh_CN.php
index 0b628d8d4a728030506a6ecae59ef18e8fbbde37..006c64c32be3b4ad023518ef6facde0d3dc682d4 100644
--- a/apps/gallery/l10n/zh_CN.php
+++ b/apps/gallery/l10n/zh_CN.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "图片",
 "Rescan" => "重新扫描",
-"Back" => "返回"
+"Stop" => "停止",
+"Share" => "分享",
+"Settings" => "设置",
+"Back" => "返回",
+"Remove confirmation" => "移除确认",
+"Do you want to remove album" => "您是否想要移除相册",
+"Change album name" => "修改相册名称",
+"New album name" => "新相册名称"
 );
diff --git a/apps/gallery/l10n/zh_TW.php b/apps/gallery/l10n/zh_TW.php
index b9b50fd6ba57ffd9451d02df030727c5035e3e72..3e633bd792ed325d44052d3efb5075eada4b4227 100644
--- a/apps/gallery/l10n/zh_TW.php
+++ b/apps/gallery/l10n/zh_TW.php
@@ -1,4 +1,12 @@
 <?php $TRANSLATIONS = array(
+"Pictures" => "圖片",
 "Rescan" => "重新掃描",
-"Back" => "返回"
+"Stop" => "停止",
+"Share" => "分享",
+"Settings" => "設定",
+"Back" => "返回",
+"Remove confirmation" => "移除確認",
+"Do you want to remove album" => "你確定要移除相簿嗎",
+"Change album name" => "變更相簿名稱",
+"New album name" => "新相簿名稱"
 );
diff --git a/apps/gallery/lib/album.php b/apps/gallery/lib/album.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/lib/hooks_handlers.php b/apps/gallery/lib/hooks_handlers.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/lib/images_utils.php b/apps/gallery/lib/images_utils.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/lib/photo.php b/apps/gallery/lib/photo.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/lib/scanner.php b/apps/gallery/lib/scanner.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/lib/sharing.php b/apps/gallery/lib/sharing.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/sharing.php b/apps/gallery/sharing.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php
old mode 100755
new mode 100644
diff --git a/apps/gallery/templates/view_album.php b/apps/gallery/templates/view_album.php
old mode 100755
new mode 100644
diff --git a/apps/media/ajax/api.php b/apps/media/ajax/api.php
old mode 100755
new mode 100644
diff --git a/apps/media/ajax/autoupdate.php b/apps/media/ajax/autoupdate.php
old mode 100755
new mode 100644
diff --git a/apps/media/appinfo/app.php b/apps/media/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/media/index.php b/apps/media/index.php
old mode 100755
new mode 100644
diff --git a/apps/media/js/collection.js b/apps/media/js/collection.js
index 0b5a9ef9a47446cce4c24bff2bf7fe7ec181f91b..03d577c7c98a6036025e5cbf26b3b73095c23162 100644
--- a/apps/media/js/collection.js
+++ b/apps/media/js/collection.js
@@ -112,7 +112,7 @@ Collection={
 							Collection.parent.find('tr').removeClass('active');
 							$('tr[data-artist="'+artist.name+'"]').addClass('active');
 						});
-						expander='';
+						var expander='';
 						if(artist.songs.length>1){
 							expander=$('<a class="expander">&gt;</a>');
 							expander.data('expanded',false);
diff --git a/apps/media/l10n/eo.php b/apps/media/l10n/eo.php
index a572c15cb4cbf653db3114cfb03f3155fad95507..429247bbc33b5e718893b55253d2fb1605293d0b 100644
--- a/apps/media/l10n/eo.php
+++ b/apps/media/l10n/eo.php
@@ -1,13 +1,13 @@
 <?php $TRANSLATIONS = array(
 "Music" => "Muziko",
 "Play" => "Ludi",
-"Pause" => "Paŭzi",
-"Previous" => "Maljena",
-"Next" => "Jena",
+"Pause" => "Paŭzigi",
+"Previous" => "Antaŭa",
+"Next" => "Sekva",
 "Mute" => "Silentigi",
 "Unmute" => "Malsilentigi",
 "Rescan Collection" => "Reskani la aron",
-"Artist" => "Verkinto",
+"Artist" => "Artisto",
 "Album" => "Albumo",
 "Title" => "Titolo"
 );
diff --git a/apps/media/l10n/es.php b/apps/media/l10n/es.php
index 8d654fd36cd26843f43152024344f03d37a9db37..100ab6a7a731b8bdbc741eabb3f40a9c7205c193 100644
--- a/apps/media/l10n/es.php
+++ b/apps/media/l10n/es.php
@@ -5,8 +5,8 @@
 "Previous" => "Anterior",
 "Next" => "Siguiente",
 "Mute" => "Silenciar",
-"Unmute" => "Sonar",
-"Rescan Collection" => "Buscar música nueva",
+"Unmute" => "Quitar silencio",
+"Rescan Collection" => "Buscar canciones nuevas",
 "Artist" => "Artista",
 "Album" => "Álbum",
 "Title" => "Título"
diff --git a/apps/media/l10n/fa.php b/apps/media/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..3bccdb0c50968c57b6d63d3aca82f1e15eed6907
--- /dev/null
+++ b/apps/media/l10n/fa.php
@@ -0,0 +1,13 @@
+<?php $TRANSLATIONS = array(
+"Music" => "موسیقی",
+"Play" => "پخش کردن",
+"Pause" => "توقف کوتاه",
+"Previous" => "قبلی",
+"Next" => "بعدی",
+"Mute" => "خفه کردن",
+"Unmute" => "باز گشایی صدا",
+"Rescan Collection" => "دوباره بازرسی مجموعه ها",
+"Artist" => "هنرمند",
+"Album" => "آلبوم",
+"Title" => "عنوان"
+);
diff --git a/apps/media/lib_ampache.php b/apps/media/lib_ampache.php
old mode 100755
new mode 100644
diff --git a/apps/media/lib_collection.php b/apps/media/lib_collection.php
old mode 100755
new mode 100644
diff --git a/apps/media/lib_media.php b/apps/media/lib_media.php
old mode 100755
new mode 100644
diff --git a/apps/media/lib_scanner.php b/apps/media/lib_scanner.php
old mode 100755
new mode 100644
diff --git a/apps/media/remote.php b/apps/media/remote.php
index 8a88c2b51ae93ede1b9f06f05c57817f621a1b9b..01add42b31545610031007f953cb859ccbd2844d 100644
--- a/apps/media/remote.php
+++ b/apps/media/remote.php
@@ -1,7 +1,11 @@
 <?php
+
+// only need filesystem apps
+$RUNTIME_APPTYPES=array('filesystem','authentication');
+OC_App::loadApps($RUNTIME_APPTYPES);
+
 if($path_info == '/ampache' || $path_info == '/ampache/'){
 	require_once(OC::$APPSROOT . '/apps/media/index.php');
 }else{
 	require_once(OC::$APPSROOT . '/apps/media/server/xml.server.php');
 }
-?>
\ No newline at end of file
diff --git a/apps/media/server/xml.server.php b/apps/media/server/xml.server.php
old mode 100755
new mode 100644
diff --git a/apps/media/settings.php b/apps/media/settings.php
old mode 100755
new mode 100644
diff --git a/apps/media/templates/music.php b/apps/media/templates/music.php
old mode 100755
new mode 100644
diff --git a/apps/media/templates/player.php b/apps/media/templates/player.php
old mode 100755
new mode 100644
diff --git a/apps/media/templates/settings.php b/apps/media/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/remoteStorage/WebDAV.php b/apps/remoteStorage/WebDAV.php
old mode 100755
new mode 100644
diff --git a/apps/remoteStorage/ajax/revokeToken.php b/apps/remoteStorage/ajax/revokeToken.php
old mode 100755
new mode 100644
index 302630267086c8b872960ea628bbcc7c021426bd..699b9e9aeec4e042ea5556cce9620e088003e613
--- a/apps/remoteStorage/ajax/revokeToken.php
+++ b/apps/remoteStorage/ajax/revokeToken.php
@@ -28,17 +28,9 @@
 
 // Do not load FS ...
 $RUNTIME_NOSETUPFS = true;
-
-require_once('../../../lib/base.php');
-
-require_once('../../../lib/user.php');
-require_once('../../../lib/public/user.php');
-
-require_once('../../../lib/app.php');
-require_once('../../../lib/public/app.php');
  
 OCP\App::checkAppEnabled('remoteStorage');
-require_once('../lib_remoteStorage.php');
+require_once('remoteStorage/lib_remoteStorage.php');
 
 ini_set('default_charset', 'UTF-8');
 #ini_set('error_reporting', '');
diff --git a/apps/remoteStorage/appinfo/app.php b/apps/remoteStorage/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/remoteStorage/auth.php b/apps/remoteStorage/auth.php
old mode 100755
new mode 100644
index fcbeda449101f0c28f7da72cec91d3bd04f11f39..a54be37b2e6dec7e2ba43aeed76487ba83aaf745
--- a/apps/remoteStorage/auth.php
+++ b/apps/remoteStorage/auth.php
@@ -67,7 +67,7 @@ if($userId && $appUrl && $categories) {
 	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 	<link rel="shortcut icon" href="../../../core/img/favicon.png" /><link rel="apple-touch-icon-precomposed" href="../../../core/img/favicon-touch.png" />
 			<link rel="stylesheet" href="../../../core/css/styles.css" type="text/css" media="screen" />
-			<link rel="stylesheet" href="?app=remoteStorage&getfile=auth.css" type="text/css" media="screen" />
+			<link rel="stylesheet" href="../../../core/css/auth.css" type="text/css" media="screen" />
 		</head>
 	<body id="body-login">
 	<div id="login">
@@ -78,7 +78,7 @@ if($userId && $appUrl && $categories) {
 		</header>
 		<section id="main">
 		<div id="oauth">
-			<h2><img src="?app=remoteStorage&getfile=remoteStorage-big.png" alt="remoteStorage" /></h2>
+			<h2><img src="../../../core/img/remoteStorage-big.png" alt="remoteStorage" /></h2>
 			<p><strong><?php $appUrlParts = explode('/', $_GET['redirect_uri']); echo htmlentities($appUrlParts[2]); ?></strong>
 			requests read &amp; write access to your 
 			<?php
diff --git a/apps/remoteStorage/lib_remoteStorage.php b/apps/remoteStorage/lib_remoteStorage.php
old mode 100755
new mode 100644
diff --git a/apps/remoteStorage/settings.php b/apps/remoteStorage/settings.php
old mode 100755
new mode 100644
diff --git a/apps/remoteStorage/templates/settings.php b/apps/remoteStorage/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/ajax/addtaskform.php b/apps/tasks/ajax/addtaskform.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/ajax/edittask.php b/apps/tasks/ajax/edittask.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/ajax/edittaskform.php b/apps/tasks/ajax/edittaskform.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/ajax/getdetails.php b/apps/tasks/ajax/getdetails.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/index.php b/apps/tasks/index.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/templates/part.taskform.php b/apps/tasks/templates/part.taskform.php
old mode 100755
new mode 100644
diff --git a/apps/tasks/templates/tasks.php b/apps/tasks/templates/tasks.php
old mode 100755
new mode 100644
diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/user_ldap/appinfo/database.xml b/apps/user_ldap/appinfo/database.xml
index 74c56fcf7435952fd189ffaefa4e5fab0a881f73..b228fa2796d88583d18ccc9fa62eadf60b5fd7af 100644
--- a/apps/user_ldap/appinfo/database.xml
+++ b/apps/user_ldap/appinfo/database.xml
@@ -29,7 +29,7 @@
    </field>
 
    <index>
-    <name>ldap_dn</name>
+    <name>ldap_dn_users</name>
     <unique>true</unique>
     <field>
      <name>ldap_dn</name>
@@ -37,7 +37,7 @@
    </index>
 
    <index>
-    <name>owncloud_name</name>
+    <name>owncloud_name_users</name>
     <unique>true</unique>
     <field>
      <name>owncloud_name</name>
@@ -72,7 +72,7 @@
    </field>
 
    <index>
-    <name>ldap_dn</name>
+    <name>ldap_dn_groups</name>
     <unique>true</unique>
     <field>
      <name>ldap_dn</name>
@@ -80,7 +80,7 @@
    </index>
 
    <index>
-    <name>owncloud_name</name>
+    <name>owncloud_name_groups</name>
     <unique>true</unique>
     <field>
      <name>owncloud_name</name>
diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php
new file mode 100644
index 0000000000000000000000000000000000000000..07afeeea8a11d2dde30fdb6db3a54727cd9469f3
--- /dev/null
+++ b/apps/user_ldap/appinfo/update.php
@@ -0,0 +1,9 @@
+<?php
+
+//from version 0.1 to 0.2
+$pw = OCP\Config::getAppValue('user_ldap', 'ldap_password');
+if(!is_null($pw)) {
+	$pwEnc = base64_encode($pw);
+	OCP\Config::setAppValue('user_ldap', 'ldap_agent_password', $pwEnc);
+	OC_Appconfig::deleteKey('user_ldap', 'ldap_password');
+}
\ No newline at end of file
diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version
index a0d78bd347e089e143f3ded0ecfb6dd6ba382545..57898bb4c247895c74142c0237a6fa68c93ee470 100644
--- a/apps/user_ldap/appinfo/version
+++ b/apps/user_ldap/appinfo/version
@@ -1 +1 @@
-0.1.90
\ No newline at end of file
+0.1.92
\ No newline at end of file
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
old mode 100755
new mode 100644
diff --git a/apps/user_ldap/lib_ldap.php b/apps/user_ldap/lib_ldap.php
old mode 100755
new mode 100644
index e8d91d0e037163fa562b88c581de36858aeb9c0b..5252f4cce7c47b23f32b9d63bbae26468584dbbf
--- a/apps/user_ldap/lib_ldap.php
+++ b/apps/user_ldap/lib_ldap.php
@@ -148,16 +148,6 @@ class OC_LDAP {
 
 		$record = $query->execute(array($name))->fetchOne();
 		return $record;
-		if($name=='Coyotes') {
-			echo("adsfasdf ");
-			var_dump($record);
-			die();
-		}
-		if(isset($record['ldap_dn'])) {
-			return $record['ldap_dn'];
-		}
-
-		return false;
 	}
 
 	/**
@@ -185,6 +175,7 @@ class OC_LDAP {
 	}
 
 	static public function dn2ocname($dn, $ldapname = null, $isUser = true) {
+		$dn = self::sanitizeDN($dn);
 		$table = self::getMapTable($isUser);
 		if($isUser) {
 			$nameAttribute = self::conf('ldapUserDisplayName');
@@ -207,6 +198,7 @@ class OC_LDAP {
 			$ldapname = self::readAttribute($dn, $nameAttribute);
 			$ldapname = $ldapname[0];
 		}
+		$ldapname = self::sanitizeUsername($ldapname);
 
 		//a new user/group! Then let's try to add it. We're shooting into the blue with the user/group name, assuming that in most cases there will not be a conflict. Otherwise an error will occur and we will continue with our second shot.
 		if(self::mapComponent($dn, $ldapname, $isUser)) {
@@ -264,16 +256,17 @@ class OC_LDAP {
 				continue;
 			}
 
-			//a new group! Then let's try to add it. We're shooting into the blue with the group name, assuming that in most cases there will not be a conflict
-			if(self::mapComponent($ldapObject['dn'], $ldapObject[$nameAttribute], $isUsers)) {
-				$ownCloudNames[] = $ldapObject[$nameAttribute];
+			//a new group! Then let's try to add it. We're shooting into the blue with the group name, assuming that in most cases there will not be a conflict. But first make sure, that the display name contains only allowed characters.
+			$ocname = self::sanitizeUsername($ldapObject[$nameAttribute]);
+			if(self::mapComponent($ldapObject['dn'], $ocname, $isUsers)) {
+				$ownCloudNames[] = $ocname;
 				continue;
 			}
 
 			//doh! There is a conflict. We need to distinguish between groups. Adding indexes is an idea, but not much of a help for the user. The DN is ugly, but for now the only reasonable way. But we transform it to a readable format and remove the first part to only give the path where this entry is located.
-			$oc_name = self::alternateOwnCloudName($ldapObject[$nameAttribute], $ldapObject['dn']);
-			if(self::mapComponent($ldapObject['dn'], $oc_name, $isUsers)) {
-				$ownCloudNames[] = $oc_name;
+			$ocname = self::alternateOwnCloudName($ocname, $ldapObject['dn']);
+			if(self::mapComponent($ldapObject['dn'], $ocname, $isUsers)) {
+				$ownCloudNames[] = $ocname;
 				continue;
 			}
 
@@ -293,7 +286,9 @@ class OC_LDAP {
 	 */
 	static private function alternateOwnCloudName($name, $dn) {
 		$ufn = ldap_dn2ufn($dn);
-		return $name . ' (' . trim(substr_replace($ufn, '', 0, strpos($ufn, ','))) . ')';
+		$name = $name . '@' . trim(substr_replace($ufn, '', 0, strpos($ufn, ',')));
+		$name = self::sanitizeUsername($name);
+		return $name;
 	}
 
 	/**
@@ -362,6 +357,7 @@ class OC_LDAP {
 	 */
 	static private function mapComponent($dn, $ocname, $isUser = true) {
 		$table = self::getMapTable($isUser);
+		$dn = self::sanitizeDN($dn);
 
 		$sqliteAdjustment = '';
 		$dbtype = OCP\Config::getSystemValue('dbtype');
@@ -482,13 +478,19 @@ class OC_LDAP {
 				$i = 0;
 			}
 			foreach($findings as $item) {
+				if(!is_array($item)) {
+					continue;
+				}
+				$item = array_change_key_case($item);
+
 				if($multiarray) {
 					foreach($attr as $key) {
+						$key = strtolower($key);
 						if(isset($item[$key])) {
 							if($key != 'dn'){
 								$selection[$i][$key] = $item[$key][0];
 							} else {
-								$selection[$i][$key] = $item[$key];
+								$selection[$i][$key] = self::sanitizeDN($item[$key]);
 							}
 						}
 
@@ -496,14 +498,14 @@ class OC_LDAP {
 					$i++;
 				} else {
 					//tribute to case insensitivity
-					if(!is_array($item)) {
-						continue;
-					}
-					$item = array_change_key_case($item);
 					$key = strtolower($attr[0]);
 
 					if(isset($item[$key])) {
-						$selection[] = $item[$key];
+						if($key == 'dn') {
+							$selection[] = self::sanitizeDN($item[$key]);
+						} else {
+							$selection[] = $item[$key];
+						}
 					}
 				}
 
@@ -514,6 +516,26 @@ class OC_LDAP {
 		return $findings;
 	}
 
+	static private function sanitizeDN($dn) {
+		//OID sometimes gives back DNs with whitespace after the comma a la "uid=foo, cn=bar, dn=..." We need to tackle this!
+		$dn = preg_replace('/,\s+/',',',$dn);
+
+		//make comparisons and everything work
+		$dn = strtolower($dn);
+
+		return $dn;
+	}
+
+	static private function sanitizeUsername($name) {
+		//REPLACEMENTS
+		$name = str_replace(' ', '_', $name);
+
+		//every remaining unallowed characters will be removed
+		$name = preg_replace('/[^a-zA-Z0-9_.@-]/', '', $name);
+
+		return $name;
+	}
+
 	/**
 	 * @brief combines the input filters with AND
 	 * @param $filters array, the filters to connect
@@ -577,16 +599,16 @@ class OC_LDAP {
 			self::$ldapHost             = OCP\Config::getAppValue('user_ldap', 'ldap_host', '');
 			self::$ldapPort             = OCP\Config::getAppValue('user_ldap', 'ldap_port', OC_USER_BACKEND_LDAP_DEFAULT_PORT);
 			self::$ldapAgentName        = OCP\Config::getAppValue('user_ldap', 'ldap_dn','');
-			self::$ldapAgentPassword    = OCP\Config::getAppValue('user_ldap', 'ldap_password','');
+			self::$ldapAgentPassword    = base64_decode(OCP\Config::getAppValue('user_ldap', 'ldap_agent_password',''));
 			self::$ldapBase             = OCP\Config::getAppValue('user_ldap', 'ldap_base', '');
 			self::$ldapBaseUsers        = OCP\Config::getAppValue('user_ldap', 'ldap_base_users',self::$ldapBase);
 			self::$ldapBaseGroups       = OCP\Config::getAppValue('user_ldap', 'ldap_base_groups', self::$ldapBase);
 			self::$ldapTLS              = OCP\Config::getAppValue('user_ldap', 'ldap_tls',0);
 			self::$ldapNoCase           = OCP\Config::getAppValue('user_ldap', 'ldap_nocase', 0);
-			self::$ldapUserDisplayName  = OCP\Config::getAppValue('user_ldap', 'ldap_display_name', OC_USER_BACKEND_LDAP_DEFAULT_DISPLAY_NAME);
+			self::$ldapUserDisplayName  = strtolower(OCP\Config::getAppValue('user_ldap', 'ldap_display_name', OC_USER_BACKEND_LDAP_DEFAULT_DISPLAY_NAME));
 			self::$ldapUserFilter       = OCP\Config::getAppValue('user_ldap', 'ldap_userlist_filter','objectClass=person');
 			self::$ldapLoginFilter      = OCP\Config::getAppValue('user_ldap', 'ldap_login_filter', '(uid=%uid)');
-			self::$ldapGroupDisplayName = OCP\Config::getAppValue('user_ldap', 'ldap_group_display_name', LDAP_GROUP_DISPLAY_NAME_ATTR);
+			self::$ldapGroupDisplayName = strtolower(OCP\Config::getAppValue('user_ldap', 'ldap_group_display_name', LDAP_GROUP_DISPLAY_NAME_ATTR));
 
 			if(empty(self::$ldapBaseUsers)) {
 				OCP\Util::writeLog('ldap', 'Base for Users is empty, using Base DN', OCP\Util::INFO);
diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php
old mode 100755
new mode 100644
index de7110fe9a849bc7fc3e02a7ba574fae686cd434..835b6a04e227dccf5a11d51a0615f6fec6570596
--- a/apps/user_ldap/settings.php
+++ b/apps/user_ldap/settings.php
@@ -20,14 +20,18 @@
  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
-$params = array('ldap_host', 'ldap_port', 'ldap_dn', 'ldap_password', 'ldap_base', 'ldap_base_users', 'ldap_base_groups', 'ldap_userlist_filter', 'ldap_login_filter', 'ldap_group_filter', 'ldap_display_name', 'ldap_tls', 'ldap_nocase', 'ldap_quota_def', 'ldap_quota_attr', 'ldap_email_attr', 'ldap_group_member_assoc_attribute');
+$params = array('ldap_host', 'ldap_port', 'ldap_dn', 'ldap_agent_password', 'ldap_base', 'ldap_base_users', 'ldap_base_groups', 'ldap_userlist_filter', 'ldap_login_filter', 'ldap_group_filter', 'ldap_display_name', 'ldap_tls', 'ldap_nocase', 'ldap_quota_def', 'ldap_quota_attr', 'ldap_email_attr', 'ldap_group_member_assoc_attribute');
 
 OCP\Util::addscript('user_ldap', 'settings');
 
 if ($_POST) {
 	foreach($params as $param){
 		if(isset($_POST[$param])){
-			OCP\Config::setAppValue('user_ldap', $param, $_POST[$param]);
+			if('ldap_agent_password' == $param) {
+				OCP\Config::setAppValue('user_ldap', $param, base64_encode($_POST[$param]));
+			} else {
+				OCP\Config::setAppValue('user_ldap', $param, $_POST[$param]);
+			}
 		}
 		elseif('ldap_tls' == $param) {
 			// unchecked checkboxes are not included in the post paramters
@@ -51,5 +55,6 @@ foreach($params as $param){
 $tmpl->assign( 'ldap_port', OCP\Config::getAppValue('user_ldap', 'ldap_port', OC_USER_BACKEND_LDAP_DEFAULT_PORT));
 $tmpl->assign( 'ldap_display_name', OCP\Config::getAppValue('user_ldap', 'ldap_display_name', OC_USER_BACKEND_LDAP_DEFAULT_DISPLAY_NAME));
 $tmpl->assign( 'ldap_group_member_assoc_attribute', OCP\Config::getAppValue('user_ldap', 'ldap_group_member_assoc_attribute', 'uniqueMember'));
+$tmpl->assign( 'ldap_agent_password', base64_decode(OCP\Config::getAppValue('user_ldap', 'ldap_agent_password')));
 
 return $tmpl->fetchPage();
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 48e136668d1620d4f84d57b02436e1b688d00236..d6c1a8ec0ecdcc27e2fe72d4f710e9d25c70f998 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -7,7 +7,7 @@
 	<fieldset id="ldapSettings-1">
 		<p><label for="ldap_host"><?php echo $l->t('Host');?><input type="text" id="ldap_host" name="ldap_host" value="<?php echo $_['ldap_host']; ?>"></label> <label for="ldap_base"><?php echo $l->t('Base');?></label><input type="text" id="ldap_base" name="ldap_base" value="<?php echo $_['ldap_base']; ?>" /></p>
 		<p><label for="ldap_dn"><?php echo $l->t('Name');?></label><input type="text" id="ldap_dn" name="ldap_dn" value="<?php echo $_['ldap_dn']; ?>" />
-		<label for="ldap_password"><?php echo $l->t('Password');?></label><input type="password" id="ldap_password" name="ldap_password" value="<?php echo $_['ldap_password']; ?>" />
+		<label for="ldap_agent_password"><?php echo $l->t('Password');?></label><input type="password" id="ldap_agent_password" name="ldap_agent_password" value="<?php echo $_['ldap_agent_password']; ?>" />
 		<small><?php echo $l->t('Leave both empty for anonymous bind for search, then bind with users credentials.');?></small></p>
 		<p><label for="ldap_login_filter"><?php echo $l->t('User Login Filter');?></label><input type="text" id="ldap_login_filter" name="ldap_login_filter" value="<?php echo $_['ldap_login_filter']; ?>" /><small><?php echo $l->t('use %%uid placeholder, e.g. uid=%%uid');?></small></p>
 		<p><label for="ldap_userlist_filter"><?php echo $l->t('User List Filter');?></label><input type="text" id="ldap_userlist_filter" name="ldap_userlist_filter" value="<?php echo $_['ldap_userlist_filter']; ?>" /><small><?php echo $l->t('without any placeholder, e.g. "objectClass=person".');?></small></p>
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
old mode 100755
new mode 100644
diff --git a/apps/user_migrate/admin.php b/apps/user_migrate/admin.php
old mode 100755
new mode 100644
diff --git a/apps/user_migrate/ajax/export.php b/apps/user_migrate/ajax/export.php
old mode 100755
new mode 100644
diff --git a/apps/user_migrate/appinfo/app.php b/apps/user_migrate/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/user_migrate/settings.php b/apps/user_migrate/settings.php
old mode 100755
new mode 100644
diff --git a/apps/user_migrate/templates/settings.php b/apps/user_migrate/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/appinfo/app.php b/apps/user_openid/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/appinfo/version b/apps/user_openid/appinfo/version
index ceab6e11ece0bcec917c12e11d350946f085d549..6da28dde76d6550e3d398a70a9a8231256774669 100644
--- a/apps/user_openid/appinfo/version
+++ b/apps/user_openid/appinfo/version
@@ -1 +1 @@
-0.1
\ No newline at end of file
+0.1.1
\ No newline at end of file
diff --git a/apps/user_openid/phpmyid.php b/apps/user_openid/phpmyid.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/settings.php b/apps/user_openid/settings.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/templates/nomode.php b/apps/user_openid/templates/nomode.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/templates/settings.php b/apps/user_openid/templates/settings.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/user.php b/apps/user_openid/user.php
old mode 100755
new mode 100644
diff --git a/apps/user_openid/user_openid.php b/apps/user_openid/user_openid.php
old mode 100755
new mode 100644
diff --git a/apps/user_webfinger/appinfo/app.php b/apps/user_webfinger/appinfo/app.php
old mode 100755
new mode 100644
diff --git a/apps/user_webfinger/host-meta.php b/apps/user_webfinger/host-meta.php
index c3d6f0ed2ca0cbcc927ce46824d1c5947741c8fd..32ffb512057f83237cd00463f6faa62807d01251 100644
--- a/apps/user_webfinger/host-meta.php
+++ b/apps/user_webfinger/host-meta.php
@@ -3,23 +3,8 @@ $hostMetaHeader = array(
 	'Access-Control-Allow-Origin' => '*',
 	'Content-Type' => 'application/xrd+json'
 );
-$ownCloudDir = dirname(dirname(dirname(__FILE__)));
-$docRoot = $_SERVER['DOCUMENT_ROOT'];
-try {
-		$webRoot = substr(realpath($ownCloudDir), strlen(realpath($docRoot)));
-} catch(Exception $e) {
-		// some servers fail on realpath(), let's try it the unsecure way:
-		$webRoot = substr($ownCloudDir, strlen($docRoot));
-}
 $serverName = $_SERVER['SERVER_NAME'];
-$lrddTmpl = 'http';
-if(isset($_SERVER['HTTPS'])) {
-		$lrddTmpl .= 's';
-}
-$lrddTmpl .= '://' . $serverName . $webRoot . '/public.php?service=webfinger&q={uri}';
-$hostMetaPath = $docRoot . '/.well-known/host-meta';
-$hostMetaDir = $docRoot . '/.well-known';
-$hostMetaContents = "{\"links\":[{\"rel\":\"lrdd\",\"template\":\"http://mich.oc/public.php?service=webfinger&q={uri}\"}]}";
+$hostMetaContents = '{"links":[{"rel":"lrdd","template":"http'.(isset($_SERVER['HTTPS'])?'s':'').'://'.$serverName.'/public.php?service=webfinger&q={uri}"}]}';
 foreach($hostMetaHeader as $header => $value) {
 	header($header . ": " . $value);
 }
diff --git a/apps/user_webfinger/webfinger.php b/apps/user_webfinger/webfinger.php
old mode 100755
new mode 100644
diff --git a/apps/remoteStorage/auth.css b/core/css/auth.css
similarity index 100%
rename from apps/remoteStorage/auth.css
rename to core/css/auth.css
diff --git a/apps/remoteStorage/remoteStorage-big.png b/core/img/remoteStorage-big.png
similarity index 100%
rename from apps/remoteStorage/remoteStorage-big.png
rename to core/img/remoteStorage-big.png
diff --git a/core/js/js.js b/core/js/js.js
index 90f1207780d0eb75efb57760b4e6d02977093f48..89a20a529f348e8806c41285e177781ff77df242 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -406,9 +406,9 @@ $(document).ready(function(){
 	$('#submit').hide();
 	$('#remember_login').hide();
 	$('#remember_login+label').hide();
-	$('#body-login input').keyup(function() {
+	$('input#user, input#password').keyup(function() {
 		var empty = false;
-		$('#body-login input').each(function() {
+		$('input#user, input#password').each(function() {
 			if ($(this).val() == '') {
 				empty = true;
 			}
diff --git a/core/l10n/ca.php b/core/l10n/ca.php
index 9c71d0d731a8c0a1f9b01020c6c4160be95cd515..baeb8bd55bba5f3a56986e2d0178eca1c1039675 100644
--- a/core/l10n/ca.php
+++ b/core/l10n/ca.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "No s'ha facilitat cap nom per l'aplicació.",
+"No category to add?" => "No voleu afegir cap categoria?",
+"This category already exists: " => "Aquesta categoria ja existeix:",
 "Owncloud password reset" => "Restableix la contrasenya d'Owncloud",
+"ownCloud password reset" => "estableix de nou la contrasenya Owncloud",
 "Use the following link to reset your password: {link}" => "Useu l'enllaç següent per restablir la contrasenya: {link}",
 "You will receive a link to reset your password via Email." => "Rebreu un enllaç al correu electrònic per reiniciar la contrasenya.",
 "Requested" => "Sol·licitat",
@@ -15,7 +19,10 @@
 "Apps" => "Aplicacions",
 "Admin" => "Administrador",
 "Help" => "Ajuda",
+"Access forbidden" => "Accés prohibit",
 "Cloud not found" => "No s'ha trobat el núvol",
+"Edit categories" => "Edita les categories",
+"Add" => "Afegeix",
 "Create an <strong>admin account</strong>" => "Crea un <strong>compte d'administrador</strong>",
 "Password" => "Contrasenya",
 "Advanced" => "Avançat",
diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php
index b3e57981a6d1f4904f7edffc7c99a7b3fccb7779..4ad9508f8131513b23344dc106dcb9aad40ad209 100644
--- a/core/l10n/cs_CZ.php
+++ b/core/l10n/cs_CZ.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Jméno aplikace nezadáno.",
+"No category to add?" => "Žádná kategorie k přidání?",
+"This category already exists: " => "Tato kategorie již existuje:",
 "Owncloud password reset" => "Reset hesla Owncloud",
+"ownCloud password reset" => "Reset hesla pro ownCloud",
 "Use the following link to reset your password: {link}" => "Heslo vyresetujete použitím následujícího odkazu: {link}",
 "You will receive a link to reset your password via Email." => "Bude Vám zaslán odkaz pro obnovu hesla",
 "Requested" => "Požadováno",
@@ -15,7 +19,10 @@
 "Apps" => "Aplikace",
 "Admin" => "Admin",
 "Help" => "Nápověda",
+"Access forbidden" => "Přístup odmítnut",
 "Cloud not found" => "Cloud nebyl nalezen",
+"Edit categories" => "Upravit kategorie",
+"Add" => "Přidat",
 "Create an <strong>admin account</strong>" => "Vytvořit <strong>účet správce</strong>",
 "Password" => "Heslo",
 "Advanced" => "Rozšířené volby",
diff --git a/core/l10n/de.php b/core/l10n/de.php
index 5e526440758971b9f597ed79a1dc2077639bcb46..f29382f8ef1491cbf40016fa5dbf00646c5066ed 100644
--- a/core/l10n/de.php
+++ b/core/l10n/de.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Applikationsname nicht angegeben",
+"No category to add?" => "Keine Kategorie hinzufügen?",
+"This category already exists: " => "Kategorie existiert bereits:",
 "Owncloud password reset" => "OwnCloud Passwort zurücksetzen",
+"ownCloud password reset" => "ownCloud Passwort zurücksetzen",
 "Use the following link to reset your password: {link}" => "Nutze folgenden Link, um dein Passwort zurückzusetzen: {link}",
 "You will receive a link to reset your password via Email." => "Sie erhalten einen Link, um Ihr Passwort per E-Mail zurückzusetzen.",
 "Requested" => "Angefragt",
@@ -15,7 +19,10 @@
 "Apps" => "Anwendungen",
 "Admin" => "Verwaltung",
 "Help" => "Hilfe",
+"Access forbidden" => "Zugang verboten",
 "Cloud not found" => "Cloud nicht verfügbar",
+"Edit categories" => "Kategorien ändern",
+"Add" => "Hinzufügen",
 "Create an <strong>admin account</strong>" => "<strong>Admin-Konto</strong> anlegen",
 "Password" => "Passwort",
 "Advanced" => "Erweitert",
diff --git a/core/l10n/el.php b/core/l10n/el.php
index 213994524ff4ab0f86ce89cc99dd0a9b15644490..1adf14af967d82b697613164b4384133d8d3e2ff 100644
--- a/core/l10n/el.php
+++ b/core/l10n/el.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Δε προσδιορίστηκε όνομα εφαρμογής",
+"No category to add?" => "Δεν έχετε να προστέσθέσεται μια κα",
+"This category already exists: " => "Αυτή η κατηγορία υπάρχει ήδη",
 "Owncloud password reset" => "Επανέκδοση κωδικού για το Owncloud",
+"ownCloud password reset" => "Επαναφορά κωδικού ownCloud",
 "Use the following link to reset your password: {link}" => "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}",
 "You will receive a link to reset your password via Email." => "Θα λάβετε ένα σύνδεσμο για να επαναφέρετε τον κωδικό πρόσβασής σας μέσω ηλεκτρονικού ταχυδρομείου.",
 "Requested" => "Ζητήθησαν",
@@ -15,7 +19,10 @@
 "Apps" => "Εφαρμογές",
 "Admin" => "Διαχειριστής",
 "Help" => "Βοήθεια",
+"Access forbidden" => "Δεν επιτρέπεται η πρόσβαση",
 "Cloud not found" => "Δεν βρέθηκε σύννεφο",
+"Edit categories" => "Επεξεργασία κατηγορίας",
+"Add" => "Προσθήκη",
 "Create an <strong>admin account</strong>" => "Δημιουργήστε έναν <strong>λογαριασμό διαχειριστή</strong>",
 "Password" => "Κωδικός",
 "Advanced" => "Για προχωρημένους",
diff --git a/core/l10n/es.php b/core/l10n/es.php
index 35d9d1150d8aae01c7589e4cabcb09d6f6e3d3ad..2d6068ed5f86d3211788fa2d27fb03127f3f2aba 100644
--- a/core/l10n/es.php
+++ b/core/l10n/es.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Nombre de la aplicación no provisto.",
+"No category to add?" => "¿Ninguna categoría para agregar?",
+"This category already exists: " => "Esta categoría ya existe: ",
 "Owncloud password reset" => "Restablecer contraseña de ownCloud",
+"ownCloud password reset" => "Reiniciar contraseña de ownCloud",
 "Use the following link to reset your password: {link}" => "Utiliza el siguiente enlace para restablecer tu contraseña: {link}",
 "You will receive a link to reset your password via Email." => "Recibirás un enlace por correo electrónico para restablecer tu contraseña",
 "Requested" => "Pedido",
@@ -15,13 +19,16 @@
 "Apps" => "Aplicaciones",
 "Admin" => "Administrador",
 "Help" => "Ayuda",
+"Access forbidden" => "Acceso denegado",
 "Cloud not found" => "No se ha encontrado la nube",
+"Edit categories" => "Editar categorías",
+"Add" => "Añadir",
 "Create an <strong>admin account</strong>" => "Crea una <strong>cuenta de administrador</strong>",
 "Password" => "Contraseña",
 "Advanced" => "Avanzado",
 "Data folder" => "Directorio de almacenamiento",
 "Configure the database" => "Configurar la base de datos",
-"will be used" => "serán utilizados",
+"will be used" => "se utilizarán",
 "Database user" => "Usuario de la base de datos",
 "Database password" => "Contraseña de la base de datos",
 "Database name" => "Nombre de la base de datos",
@@ -33,7 +40,7 @@
 "Lost your password?" => "¿Has perdido tu contraseña?",
 "remember" => "recuérdame",
 "Log in" => "Entrar",
-"You are logged out." => "Has cerrado sesión.",
+"You are logged out." => "Has cerrado la sesión.",
 "prev" => "anterior",
 "next" => "siguiente"
 );
diff --git a/core/l10n/et_EE.php b/core/l10n/et_EE.php
index 82a2e1c1717a0ef13ba3351ce994f958404685e0..7ecfb278afd118389ef8528e86c6f6e1e4ddd457 100644
--- a/core/l10n/et_EE.php
+++ b/core/l10n/et_EE.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Rakenduse nime pole sisestatud.",
+"No category to add?" => "Pole kategooriat, mida lisada?",
+"This category already exists: " => "See kategooria on juba olemas: ",
 "Owncloud password reset" => "Owncloud parooli taastamine",
+"ownCloud password reset" => "ownCloud parooli taastamine",
 "Use the following link to reset your password: {link}" => "Kasuta järgnevat linki oma parooli taastamiseks: {link}",
 "You will receive a link to reset your password via Email." => "Sinu parooli taastamise link saadetakse sulle e-postile.",
 "Requested" => "Kohustuslik",
@@ -15,7 +19,10 @@
 "Apps" => "Programmid",
 "Admin" => "Admin",
 "Help" => "Abiinfo",
+"Access forbidden" => "Ligipääs on keelatud",
 "Cloud not found" => "Pilve ei leitud",
+"Edit categories" => "Muuda kategooriaid",
+"Add" => "Lisa",
 "Create an <strong>admin account</strong>" => "Loo <strong>admini konto</strong>",
 "Password" => "Parool",
 "Advanced" => "Lisavalikud",
diff --git a/core/l10n/eu.php b/core/l10n/eu.php
index f59d98297d7c5a65ff419662c29bfe3307abca2b..3159350183f0c1f4801b259fb5fbd78b8009c00d 100644
--- a/core/l10n/eu.php
+++ b/core/l10n/eu.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Aplikazioaren izena falta da",
+"No category to add?" => "Ez dago gehitzeko kategoriarik?",
+"This category already exists: " => "Kategoria hau dagoeneko existitzen da:",
 "Owncloud password reset" => "Owncloudeko pasahitza berrezarri",
+"ownCloud password reset" => "ownCloud-en pasahitza berrezarri",
 "Use the following link to reset your password: {link}" => "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}",
 "You will receive a link to reset your password via Email." => "Zure pashitza berrezartzeko lotura bat jasoko duzu Epostaren bidez.",
 "Requested" => "Eskatuta",
@@ -15,7 +19,10 @@
 "Apps" => "Aplikazioak",
 "Admin" => "Kudeatzailea",
 "Help" => "Laguntza",
+"Access forbidden" => "Sarrera debekatuta",
 "Cloud not found" => "Ez da hodeia aurkitu",
+"Edit categories" => "Editatu kategoriak",
+"Add" => "Gehitu",
 "Create an <strong>admin account</strong>" => "Sortu <strong>kudeatzaile kontu<strong> bat",
 "Password" => "Pasahitza",
 "Advanced" => "Aurreratua",
diff --git a/core/l10n/fa.php b/core/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3cc3feddd8b9c882b83d5e30bdee9f8922212c1
--- /dev/null
+++ b/core/l10n/fa.php
@@ -0,0 +1,46 @@
+<?php $TRANSLATIONS = array(
+"Application name not provided." => "نام برنامه پیدا نشد",
+"No category to add?" => "آیا گروه دیگری برای افزودن ندارید",
+"This category already exists: " => "این گروه از قبل اضافه شده",
+"Owncloud password reset" => "گذرواژه ابرهای شما تغییرکرد",
+"ownCloud password reset" => "پسورد ابرهای شما تغییرکرد",
+"Use the following link to reset your password: {link}" => "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}",
+"You will receive a link to reset your password via Email." => "شما یک نامه الکترونیکی حاوی یک لینک جهت بازسازی گذرواژه دریافت خواهید کرد.",
+"Requested" => "درخواست",
+"Login failed!" => "ورود ناموفق بود",
+"Username" => "شناسه",
+"Request reset" => "درخواست دوباره سازی",
+"Your password was reset" => "گذرواژه شما تغییرکرد",
+"To login page" => "به صفحه ورود",
+"New password" => "گذرواژه جدید",
+"Reset password" => "دوباره سازی گذرواژه",
+"Personal" => "شخصی",
+"Users" => "کاربر ها",
+"Apps" => "برنامه",
+"Admin" => "مدیر",
+"Help" => "کمک",
+"Access forbidden" => "اجازه دسترسی به مناطق ممنوعه را ندارید",
+"Cloud not found" => "پیدا نشد",
+"Edit categories" => "ویرایش گروه ها",
+"Add" => "افزودن",
+"Create an <strong>admin account</strong>" => "لطفا یک <strong> شناسه برای مدیر</strong> بسازید",
+"Password" => "گذرواژه",
+"Advanced" => "حرفه ای",
+"Data folder" => "پوشه اطلاعاتی",
+"Configure the database" => "پایگاه داده برنامه ریزی شدند",
+"will be used" => "استفاده خواهد شد",
+"Database user" => "شناسه پایگاه داده",
+"Database password" => "پسورد پایگاه داده",
+"Database name" => "نام پایگاه داده",
+"Database host" => "هاست پایگاه داده",
+"Finish setup" => "اتمام نصب",
+"web services under your control" => "سرویس وب تحت کنترل شما",
+"Log out" => "خروج",
+"Settings" => "تنظیمات",
+"Lost your password?" => "آیا گذرواژه تان را به یاد نمی آورید؟",
+"remember" => "بیاد آوری",
+"Log in" => "ورود",
+"You are logged out." => "شما خارج شدید",
+"prev" => "بازگشت",
+"next" => "بعدی"
+);
diff --git a/core/l10n/fi_FI.php b/core/l10n/fi_FI.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d2e3310c35ba970bbb0fef73ab1fd3f7e09c12c
--- /dev/null
+++ b/core/l10n/fi_FI.php
@@ -0,0 +1,6 @@
+<?php $TRANSLATIONS = array(
+"Username" => "Käyttäjätunnus",
+"Password" => "Salasana",
+"Log out" => "Kirjaudu ulos",
+"You are logged out." => "Olet kirjautunut ulos."
+);
diff --git a/core/l10n/fr.php b/core/l10n/fr.php
index 64215442d89c7ce12bfa66b00f3fb2b3b403d512..8459fbbb6647c1f713dcf7bcb7226142e274c5a4 100644
--- a/core/l10n/fr.php
+++ b/core/l10n/fr.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Nom de l'application non fourni.",
+"No category to add?" => "Pas de catégorie à ajouter ?",
+"This category already exists: " => "Cette catégorie existe déjà : ",
 "Owncloud password reset" => "Réinitialisation de votre mot de passe Owncloud",
+"ownCloud password reset" => "Réinitialisation de votre mot de passe Owncloud",
 "Use the following link to reset your password: {link}" => "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}",
 "You will receive a link to reset your password via Email." => "Vous allez recevoir un e-mail contenant un lien pour réinitialiser votre mot de passe",
 "Requested" => "Demande envoyée",
@@ -15,7 +19,10 @@
 "Apps" => "Applications",
 "Admin" => "Administration",
 "Help" => "Aide",
+"Access forbidden" => "Accès interdit",
 "Cloud not found" => "Introuvable",
+"Edit categories" => "Modifier les catégories",
+"Add" => "Ajouter",
 "Create an <strong>admin account</strong>" => "Créer un <strong>compte administrateur</strong>",
 "Password" => "Mot de passe",
 "Advanced" => "Avancé",
diff --git a/core/l10n/hu_HU.php b/core/l10n/hu_HU.php
index 9a3637de61e901f78e015c21001e845d7e3765fd..fc1337d8defc075eabaf59115cc3fef9fea5f314 100644
--- a/core/l10n/hu_HU.php
+++ b/core/l10n/hu_HU.php
@@ -1,9 +1,17 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Alkalmazásnév hiányzik",
+"No category to add?" => "Nincs hozzáadandó kategória?",
+"This category already exists: " => "Ez a kategória már létezik",
+"Owncloud password reset" => "ownCloud jelszó-visszaállítás",
+"ownCloud password reset" => "ownCloud jelszó-visszaállítás",
+"Use the following link to reset your password: {link}" => "Használja az alábbi linket a jelszó-visszaállításhoz: {link}",
 "You will receive a link to reset your password via Email." => "Egy e-mailben kap értesítést a jelszóváltoztatás módjáról.",
 "Requested" => "Kért",
 "Login failed!" => "Belépés sikertelen!",
 "Username" => "Felhasználói név",
+"Request reset" => "Visszaállítás igénylése",
 "Your password was reset" => "Jelszó megváltoztatásra került",
+"To login page" => "A bejelentkező ablakhoz",
 "New password" => "Új jelszó",
 "Reset password" => "Jelszó beállítás",
 "Personal" => "Személyes",
@@ -11,7 +19,10 @@
 "Apps" => "Alkalmazások",
 "Admin" => "Adminisztráció",
 "Help" => "Súgó",
+"Access forbidden" => "Hozzáférés tiltva",
 "Cloud not found" => "Nem talált felhő",
+"Edit categories" => "Kategóriák szerkesztése",
+"Add" => "Hozzáadás",
 "Create an <strong>admin account</strong>" => "<strong>Adminisztrációs fiók</strong> létrehozása",
 "Password" => "Jelszó",
 "Advanced" => "Fejlett",
@@ -23,6 +34,7 @@
 "Database name" => "Adatbázis név",
 "Database host" => "Adatbázis szerver",
 "Finish setup" => "Beállítások befejezése",
+"web services under your control" => "webszolgáltatások az irányításod alatt",
 "Log out" => "Kilépés",
 "Settings" => "Beállítások",
 "Lost your password?" => "Elfelejtett jelszó?",
diff --git a/core/l10n/ia.php b/core/l10n/ia.php
index 2d41601d69add41a20b1be498a3a03c17e9d3a76..97e8dfc147b982a0092e9efd7b58e4bbb1515093 100644
--- a/core/l10n/ia.php
+++ b/core/l10n/ia.php
@@ -1,15 +1,24 @@
 <?php $TRANSLATIONS = array(
+"This category already exists: " => "Iste categoria jam existe:",
+"Owncloud password reset" => "Reinitialisation del contrasigno de Owncloud",
+"ownCloud password reset" => "Reinitialisation del contrasigno de ownCLoud",
 "Requested" => "Requestate",
-"Login failed!" => "Initio de session fallate!",
+"Login failed!" => "Initio de session fallite!",
 "Username" => "Nomine de usator",
 "Request reset" => "Requestar reinitialisation",
 "Your password was reset" => "Tu contrasigno esseva reinitialisate",
+"To login page" => "al pagina de initio de session",
 "New password" => "Nove contrasigno",
 "Reset password" => "Reinitialisar contrasigno",
+"Personal" => "Personal",
 "Users" => "Usatores",
 "Apps" => "Applicationes",
+"Admin" => "Administration",
 "Help" => "Adjuta",
+"Access forbidden" => "Accesso prohibite",
 "Cloud not found" => "Nube non trovate",
+"Edit categories" => "Modificar categorias",
+"Add" => "Adder",
 "Create an <strong>admin account</strong>" => "Crear un <strong>conto de administration</strong>",
 "Password" => "Contrasigno",
 "Advanced" => "Avantiate",
@@ -19,9 +28,14 @@
 "Database user" => "Usator de base de datos",
 "Database password" => "Contrasigno de base de datos",
 "Database name" => "Nomine de base de datos",
+"Database host" => "Hospite de base de datos",
+"web services under your control" => "servicios web sub tu controlo",
 "Log out" => "Clauder le session",
 "Settings" => "Configurationes",
+"Lost your password?" => "Tu perdeva le contrasigno?",
 "remember" => "memora",
+"Log in" => "Aperir session",
+"You are logged out." => "Tu session ha essite claudite.",
 "prev" => "prev",
 "next" => "prox"
 );
diff --git a/core/l10n/it.php b/core/l10n/it.php
index 26417590e013fa5012eb10259154a4d6d931e0c3..ce2352f0335c3bf40a8cae37e276cb91edbdc55c 100644
--- a/core/l10n/it.php
+++ b/core/l10n/it.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Nome dell'applicazione non fornito.",
+"No category to add?" => "Nessuna categoria da aggiungere?",
+"This category already exists: " => "Questa categoria esiste già: ",
 "Owncloud password reset" => "Ripristino password di Owncloud",
+"ownCloud password reset" => "Ripristino password di ownCloud",
 "Use the following link to reset your password: {link}" => "Usa il collegamento seguente per ripristinare la password: {link}",
 "You will receive a link to reset your password via Email." => "Riceverai un collegamento per ripristinare la tua password via email",
 "Requested" => "Richiesto",
@@ -15,7 +19,10 @@
 "Apps" => "Applicazioni",
 "Admin" => "Admin",
 "Help" => "Aiuto",
+"Access forbidden" => "Accesso negato",
 "Cloud not found" => "Cloud non trovata",
+"Edit categories" => "Modifica le categorie",
+"Add" => "Aggiungi",
 "Create an <strong>admin account</strong>" => "Crea un <strong>account amministratore</strong>",
 "Password" => "Password",
 "Advanced" => "Avanzate",
diff --git a/core/l10n/ko.php b/core/l10n/ko.php
index 2798a3c7c26dcb8a822da0cfbe78833d791ee8f1..44396b94f81e80e54c3a4870937f0aa750d1cdc5 100644
--- a/core/l10n/ko.php
+++ b/core/l10n/ko.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "응용 프로그램의 이름이 규정되어 있지 않습니다. ",
+"No category to add?" => "추가할 카테고리가 없습니까?",
+"This category already exists: " => "이 카테고리는 이미 존재합니다:",
 "Owncloud password reset" => "Owncloud 암호 재설정",
+"ownCloud password reset" => "ownCloud 비밀번호 재설정",
 "Use the following link to reset your password: {link}" => "다음 링크를 사용하여 암호를 초기화할 수 있습니다: {link}",
 "You will receive a link to reset your password via Email." => "전자 우편으로 암호 재설정 링크를 보냈습니다.",
 "Requested" => "요청함",
@@ -15,7 +19,10 @@
 "Apps" => "프로그램",
 "Admin" => "관리자",
 "Help" => "도움말",
+"Access forbidden" => "접근 금지",
 "Cloud not found" => "클라우드를 찾을 수 없습니다",
+"Edit categories" => "카테고리 편집",
+"Add" => "추가",
 "Create an <strong>admin account</strong>" => "<strong>관리자 계정</strong>을 만드십시오",
 "Password" => "암호",
 "Advanced" => "고급",
diff --git a/core/l10n/mk.php b/core/l10n/mk.php
index 0d88ec75790d700f567ccd217de3f8e18d73b3a5..7baac36f390ab6498f261bcc111df6eafc370a6b 100644
--- a/core/l10n/mk.php
+++ b/core/l10n/mk.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Име за апликацијата не е доставено.",
+"No category to add?" => "Нема категорија да се додаде?",
+"This category already exists: " => "Оваа категорија веќе постои:",
 "Owncloud password reset" => "Ресетирање на Owncloud лозинка",
+"ownCloud password reset" => "ресетирање на лозинка за ownCloud",
 "Use the following link to reset your password: {link}" => "Користете ја следната врска да ја ресетирате Вашата лозинка: {link}",
 "You will receive a link to reset your password via Email." => "Ќе добиете врска по е-пошта за да може да ја ресетирате Вашата лозинка.",
 "Requested" => "Побарано",
@@ -15,7 +19,10 @@
 "Apps" => "Апликации",
 "Admin" => "Админ",
 "Help" => "Помош",
+"Access forbidden" => "Забранет пристап",
 "Cloud not found" => "Облакот не е најден",
+"Edit categories" => "Уреди категории",
+"Add" => "Додади",
 "Create an <strong>admin account</strong>" => "Направете <strong>администраторска сметка</strong>",
 "Password" => "Лозинка",
 "Advanced" => "Напредно",
diff --git a/core/l10n/ms_MY.php b/core/l10n/ms_MY.php
index bf34440b737e110635f926f99316dbef42097136..5cf7a04b41dca104a6360ecc84530ccae6b0dd6e 100644
--- a/core/l10n/ms_MY.php
+++ b/core/l10n/ms_MY.php
@@ -16,6 +16,7 @@
 "Admin" => "Admin",
 "Help" => "Bantuan",
 "Cloud not found" => "Awan tidak dijumpai",
+"Add" => "Tambah",
 "Create an <strong>admin account</strong>" => "buat <strong>akaun admin</strong>",
 "Password" => "Kata laluan",
 "Advanced" => "Maju",
diff --git a/core/l10n/nl.php b/core/l10n/nl.php
index 3d444c92604a60dda05c099b7dbab08a5850ee91..0b804f4d176ec0bf72ecdc39e75afce135527a39 100644
--- a/core/l10n/nl.php
+++ b/core/l10n/nl.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
-"Owncloud password reset" => "reset je Owncloud wachtwoord",
+"Application name not provided." => "Applicatie naam niet gegeven.",
+"No category to add?" => "Geen categorie toevoegen?",
+"This category already exists: " => "De categorie bestaat al.",
+"Owncloud password reset" => "Reset je ownCloud wachtwoord",
+"ownCloud password reset" => "ownCloud wachtwoord herstellen",
 "Use the following link to reset your password: {link}" => "Gebruik de volgende link om je wachtwoord te resetten: {link}",
 "You will receive a link to reset your password via Email." => "U ontvangt een link om je wachtwoord opnieuw in te stellen via e-mail.",
 "Requested" => "Gevraagd",
@@ -15,7 +19,10 @@
 "Apps" => "Apps",
 "Admin" => "Beheerder",
 "Help" => "Help",
+"Access forbidden" => "Toegang verboden",
 "Cloud not found" => "Cloud niet gevonden",
+"Edit categories" => "Wijzigen categorieën",
+"Add" => "Toevoegen",
 "Create an <strong>admin account</strong>" => "Maak een <strong>beheerdersaccount</strong> aan",
 "Password" => "Wachtwoord",
 "Advanced" => "Geavanceerd",
diff --git a/core/l10n/pt_BR.php b/core/l10n/pt_BR.php
index ecafb3d777d8dcc783f39c0592f30dd86b3e6fb5..6f01d666f78705144416a96a4cacc6546ccd61ab 100644
--- a/core/l10n/pt_BR.php
+++ b/core/l10n/pt_BR.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Nome da aplicação não foi fornecido.",
+"No category to add?" => "Nenhuma categoria adicionada?",
+"This category already exists: " => "Essa categoria já existe",
 "Owncloud password reset" => "Mudar senha do Owncloud",
+"ownCloud password reset" => "Redefinir senha ownCloud",
 "Use the following link to reset your password: {link}" => "Use o seguinte link para redefinir sua senha: {link}",
 "You will receive a link to reset your password via Email." => "Você receberá um link para redefinir sua senha via e-mail.",
 "Requested" => "Solicitado",
@@ -15,7 +19,10 @@
 "Apps" => "Apps",
 "Admin" => "Admin",
 "Help" => "Ajuda",
+"Access forbidden" => "Acesso Proibido",
 "Cloud not found" => "Cloud não encontrado",
+"Edit categories" => "Editar categorias",
+"Add" => "Adicionar",
 "Create an <strong>admin account</strong>" => "Criar uma <strong>conta</strong> de <strong>administrador</strong>",
 "Password" => "Senha",
 "Advanced" => "Avançado",
diff --git a/core/l10n/sk_SK.php b/core/l10n/sk_SK.php
index 11ad408b8e5cee9353947b296a23c999054c8f5b..b09b4f561151bdb6781eee8ef83e6f5bf6e8172a 100644
--- a/core/l10n/sk_SK.php
+++ b/core/l10n/sk_SK.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Meno aplikácie nezadané.",
+"No category to add?" => "Žiadna kategória pre pridanie?",
+"This category already exists: " => "Táto kategória už existuje:",
 "Owncloud password reset" => "Obnova Owncloud hesla",
+"ownCloud password reset" => "Obnovenie hesla pre ownCloud",
 "Use the following link to reset your password: {link}" => "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}",
 "You will receive a link to reset your password via Email." => "Odkaz pre obnovenie hesla obdržíte E-mailom.",
 "Requested" => "Požiadané",
@@ -15,7 +19,10 @@
 "Apps" => "Aplikácie",
 "Admin" => "Administrácia",
 "Help" => "Pomoc",
+"Access forbidden" => "Prístup odmietnutý",
 "Cloud not found" => "Nedokážem nájsť",
+"Edit categories" => "Úprava kategórií",
+"Add" => "Pridať",
 "Create an <strong>admin account</strong>" => "Vytvoriť <strong>administrátorský účet</strong>",
 "Password" => "Heslo",
 "Advanced" => "Pokročilé",
diff --git a/core/l10n/sl.php b/core/l10n/sl.php
index d608db96162256c305b3ddcaf910fdfce69160d3..5cd8498ea250890ca0cf13a51b3b4e21ca522e97 100644
--- a/core/l10n/sl.php
+++ b/core/l10n/sl.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Ime aplikacije ni bilo določeno.",
+"No category to add?" => "Ni kategorije za dodajanje?",
+"This category already exists: " => "Ta kategorija že obstaja:",
 "Owncloud password reset" => "Ponastavi ownCloud geslo",
+"ownCloud password reset" => "Ponastavitev gesla ownCloud",
 "Use the following link to reset your password: {link}" => "Uporabite sledečo povezavo za ponastavitev gesla: {link}",
 "You will receive a link to reset your password via Email." => "Na e-pošto boste prejeli povezavo s katero lahko ponastavite vaše geslo.",
 "Requested" => "Zahtevano",
@@ -12,10 +16,13 @@
 "Reset password" => "Ponastavi geslo",
 "Personal" => "Osebno",
 "Users" => "Uporabniki",
-"Apps" => "Apps",
+"Apps" => "Aplikacije",
 "Admin" => "Admin",
 "Help" => "Pomoč",
+"Access forbidden" => "Dostop je prepovedan",
 "Cloud not found" => "Oblak ni bil najden",
+"Edit categories" => "Uredi kategorije",
+"Add" => "Dodaj",
 "Create an <strong>admin account</strong>" => "Ustvari <strong>skrbniški račun</strong>",
 "Password" => "Geslo",
 "Advanced" => "Napredne možnosti",
diff --git a/core/l10n/th_TH.php b/core/l10n/th_TH.php
index 1774d8400405c67e456589f898dff02433291799..2828381856145891aeb3c0452227c5841921ef34 100644
--- a/core/l10n/th_TH.php
+++ b/core/l10n/th_TH.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "ยังไม่ได้ตั้งชื่อแอพพลิเคชั่น",
+"No category to add?" => "ไม่มีหมวดหมู่ที่ต้องการเพิ่ม?",
+"This category already exists: " => "หมวดหมู่นี้มีอยู่แล้ว: ",
 "Owncloud password reset" => "เปลี่ยนรหัสผ่านใน Owncloud",
+"ownCloud password reset" => "รีเซ็ตรหัสผ่าน ownCloud",
 "Use the following link to reset your password: {link}" => "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}",
 "You will receive a link to reset your password via Email." => "คุณจะได้รับลิงค์เพื่อกำหนดรหัสผ่านใหม่ทางอีเมล์",
 "Requested" => "ส่งคำร้องเรียบร้อยแล้ว",
@@ -15,7 +19,10 @@
 "Apps" => "Apps",
 "Admin" => "ผู้ดูแลระบบ",
 "Help" => "ช่วยเหลือ",
+"Access forbidden" => "การเข้าถึงถูกหวงห้าม",
 "Cloud not found" => "ไม่พบ Cloud",
+"Edit categories" => "แก้ไขหมวดหมู่",
+"Add" => "เพิ่ม",
 "Create an <strong>admin account</strong>" => "สร้าง <strong>บัญชีผู้ดูแลระบบ</strong>",
 "Password" => "รหัสผ่าน",
 "Advanced" => "ขั้นสูง",
diff --git a/core/l10n/tr.php b/core/l10n/tr.php
index 8806c05ef5d540907d33ef27d5d692b9d09a2581..fc0f791d595a1639173d03bf203c940b502b757c 100644
--- a/core/l10n/tr.php
+++ b/core/l10n/tr.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "Uygulama adı verilmedi.",
+"No category to add?" => "Eklenecek kategori yok?",
+"This category already exists: " => "Bu kategori zaten mevcut: ",
 "Owncloud password reset" => "Owncloud parola sıfırlama",
+"ownCloud password reset" => "ownCloud parola sıfırlama",
 "Use the following link to reset your password: {link}" => "Bu bağlantıyı kullanarak parolanızı sıfırlayın: {link}",
 "You will receive a link to reset your password via Email." => "Parolanızı sıfırlamak için bir bağlantı Eposta olarak gönderilecek.",
 "Requested" => "İstendi",
@@ -15,7 +19,10 @@
 "Apps" => "Uygulamalar",
 "Admin" => "Yönetici",
 "Help" => "Yardı",
+"Access forbidden" => "Erişim yasaklı",
 "Cloud not found" => "Bulut bulunamadı",
+"Edit categories" => "Kategorileri düzenle",
+"Add" => "Ekle",
 "Create an <strong>admin account</strong>" => "Bir <strong>yönetici hesabı</strong> oluşturun",
 "Password" => "Parola",
 "Advanced" => "Gelişmiş",
diff --git a/core/l10n/zh_CN.php b/core/l10n/zh_CN.php
index 8a3daa097f36f7d5f4fd84c9a7644f2ca69c7183..e07add7cbb6170c616ecf233fc0f0d7644d95e0b 100644
--- a/core/l10n/zh_CN.php
+++ b/core/l10n/zh_CN.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "没有提供应用程序名称。",
+"No category to add?" => "没有可添加分类?",
+"This category already exists: " => "此分类已存在: ",
 "Owncloud password reset" => "重置 Owncloud 密码",
+"ownCloud password reset" => "重置 ownCloud 密码",
 "Use the following link to reset your password: {link}" => "使用以下链接重置您的密码:{link}",
 "You will receive a link to reset your password via Email." => "您将会收到包含可以重置密码链接的邮件。",
 "Requested" => "已请求",
@@ -15,7 +19,10 @@
 "Apps" => "应用",
 "Admin" => "管理员",
 "Help" => "帮助",
+"Access forbidden" => "访问禁止",
 "Cloud not found" => "未找到云",
+"Edit categories" => "编辑分类",
+"Add" => "添加",
 "Create an <strong>admin account</strong>" => "创建<strong>管理员账号</strong>",
 "Password" => "密码",
 "Advanced" => "高级",
diff --git a/core/l10n/zh_TW.php b/core/l10n/zh_TW.php
index f689568b5d4ccd45e6e43e6432a2700c2f0a7b3f..d958c6287239d565526599d09ae53a84b57fc857 100644
--- a/core/l10n/zh_TW.php
+++ b/core/l10n/zh_TW.php
@@ -1,5 +1,9 @@
 <?php $TRANSLATIONS = array(
+"Application name not provided." => "未提供應用程式名稱",
+"No category to add?" => "無分類添加?",
+"This category already exists: " => "此分類已經存在:",
 "Owncloud password reset" => "私有雲重設密碼",
+"ownCloud password reset" => "ownCloud 密碼重設",
 "Use the following link to reset your password: {link}" => "請循以下聯結重設你的密碼: (聯結) ",
 "You will receive a link to reset your password via Email." => "重設密碼的連結將會寄到你的電子郵件信箱",
 "Requested" => "已要求",
@@ -15,7 +19,10 @@
 "Apps" => "應用程式",
 "Admin" => "管理者",
 "Help" => "幫助",
+"Access forbidden" => "禁止存取",
 "Cloud not found" => "未發現雲",
+"Edit categories" => "編輯分類",
+"Add" => "添加",
 "Create an <strong>admin account</strong>" => "建立一個<strong>管理者帳號</strong>",
 "Password" => "密碼",
 "Advanced" => "進階",
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index b832ac2636fedbf79e7fb966a45f5e57fc3a63b5..e9d105ed04329934d5dcfcb9c032a46d1431a0c8 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -30,7 +30,7 @@
 		<header><div id="header">
 			<a href="<?php echo link_to('', 'index.php'); ?>" title="" id="owncloud"><img class="svg" src="<?php echo image_path('', 'logo-wide.svg'); ?>" alt="ownCloud" /></a>
 			<form class="searchbox" action="#" method="post">
-				<input id="searchbox" class="svg" type="search" name="query" value="<?php if(isset($_POST['query'])){echo $_POST['query'];};?>" autocomplete="off" />
+				<input id="searchbox" class="svg" type="search" name="query" value="<?php if(isset($_POST['query'])){echo htmlentities($_POST['query']);};?>" autocomplete="off" />
 			</form>
 			<a id="logout" href="<?php echo link_to('', 'index.php'); ?>?logout=true"><img class="svg" alt="<?php echo $l->t('Log out');?>" title="<?php echo $l->t('Log out');?>" src="<?php echo image_path('', 'actions/logout.svg'); ?>" /></a>
 		</div></header>
diff --git a/core/templates/login.php b/core/templates/login.php
index 4035dfe8a5af4204e8c5280d66c2e2680938c065..a40bf5c330a8da2a3cc0655b87f29c21f74b5b03 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -7,7 +7,7 @@
 		<?php endif; ?>
 		<p class="infield">
 			<label for="user" class="infield"><?php echo $l->t( 'Username' ); ?></label>
-			<input type="text" name="user" id="user" value="<?php echo !empty($_POST['user'])?htmlentities($_POST['user']).'"':'" autofocus'; ?> autocomplete="off" required />
+			<input type="text" name="user" id="user" value="<?php echo !empty($_POST['user'])?htmlentities($_POST['user'],ENT_COMPAT,'utf-8').'"':'" autofocus'; ?> autocomplete="off" required />
 		</p>
 		<p class="infield">
 			<label for="password" class="infield"><?php echo $l->t( 'Password' ); ?></label>
diff --git a/index.php b/index.php
index acca97de79622eb153ee266af4162779a179e30d..9cec3201e1c4d7891bb04923d24e1d3deea8c042 100644
--- a/index.php
+++ b/index.php
@@ -47,7 +47,10 @@ if($_SERVER['REQUEST_METHOD']=='PROPFIND'){
 	header('location: '.OC_Helper::linkToRemote('webdav'));
 	exit();
 }
-
+elseif(!OC_User::isLoggedIn() && substr(OC::$REQUESTEDFILE,-3) == 'css'){
+	OC_App::loadApps();
+	OC::loadfile();
+}
 // Someone is logged in :
 elseif(OC_User::isLoggedIn()) {
 	OC_App::loadApps();
diff --git a/l10n/af/calendar.po b/l10n/af/calendar.po
new file mode 100644
index 0000000000000000000000000000000000000000..1ab9a09ac7eb3bf687994403481260242dcdf28b
--- /dev/null
+++ b/l10n/af/calendar.po
@@ -0,0 +1,665 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2011-09-03 16:52+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ajax/categories/rescan.php:28
+msgid "No calendars found."
+msgstr ""
+
+#: ajax/categories/rescan.php:36
+msgid "No events found."
+msgstr ""
+
+#: ajax/event/edit.form.php:20
+msgid "Wrong calendar"
+msgstr ""
+
+#: ajax/settings/guesstimezone.php:25
+msgid "New Timezone:"
+msgstr ""
+
+#: ajax/settings/settimezone.php:22
+msgid "Timezone changed"
+msgstr ""
+
+#: ajax/settings/settimezone.php:24
+msgid "Invalid request"
+msgstr ""
+
+#: appinfo/app.php:23 templates/calendar.php:15
+#: templates/part.eventform.php:33 templates/part.showevent.php:31
+#: templates/settings.php:12
+msgid "Calendar"
+msgstr ""
+
+#: js/calendar.js:788
+msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
+msgstr ""
+
+#: lib/app.php:125
+msgid "Birthday"
+msgstr ""
+
+#: lib/app.php:126
+msgid "Business"
+msgstr ""
+
+#: lib/app.php:127
+msgid "Call"
+msgstr ""
+
+#: lib/app.php:128
+msgid "Clients"
+msgstr ""
+
+#: lib/app.php:129
+msgid "Deliverer"
+msgstr ""
+
+#: lib/app.php:130
+msgid "Holidays"
+msgstr ""
+
+#: lib/app.php:131
+msgid "Ideas"
+msgstr ""
+
+#: lib/app.php:132
+msgid "Journey"
+msgstr ""
+
+#: lib/app.php:133
+msgid "Jubilee"
+msgstr ""
+
+#: lib/app.php:134
+msgid "Meeting"
+msgstr ""
+
+#: lib/app.php:135
+msgid "Other"
+msgstr ""
+
+#: lib/app.php:136
+msgid "Personal"
+msgstr ""
+
+#: lib/app.php:137
+msgid "Projects"
+msgstr ""
+
+#: lib/app.php:138
+msgid "Questions"
+msgstr ""
+
+#: lib/app.php:139
+msgid "Work"
+msgstr ""
+
+#: lib/app.php:380
+msgid "unnamed"
+msgstr ""
+
+#: lib/object.php:330
+msgid "Does not repeat"
+msgstr ""
+
+#: lib/object.php:331
+msgid "Daily"
+msgstr ""
+
+#: lib/object.php:332
+msgid "Weekly"
+msgstr ""
+
+#: lib/object.php:333
+msgid "Every Weekday"
+msgstr ""
+
+#: lib/object.php:334
+msgid "Bi-Weekly"
+msgstr ""
+
+#: lib/object.php:335
+msgid "Monthly"
+msgstr ""
+
+#: lib/object.php:336
+msgid "Yearly"
+msgstr ""
+
+#: lib/object.php:343
+msgid "never"
+msgstr ""
+
+#: lib/object.php:344
+msgid "by occurrences"
+msgstr ""
+
+#: lib/object.php:345
+msgid "by date"
+msgstr ""
+
+#: lib/object.php:352
+msgid "by monthday"
+msgstr ""
+
+#: lib/object.php:353
+msgid "by weekday"
+msgstr ""
+
+#: lib/object.php:360 templates/settings.php:42
+msgid "Monday"
+msgstr ""
+
+#: lib/object.php:361
+msgid "Tuesday"
+msgstr ""
+
+#: lib/object.php:362
+msgid "Wednesday"
+msgstr ""
+
+#: lib/object.php:363
+msgid "Thursday"
+msgstr ""
+
+#: lib/object.php:364
+msgid "Friday"
+msgstr ""
+
+#: lib/object.php:365
+msgid "Saturday"
+msgstr ""
+
+#: lib/object.php:366 templates/settings.php:43
+msgid "Sunday"
+msgstr ""
+
+#: lib/object.php:373
+msgid "events week of month"
+msgstr ""
+
+#: lib/object.php:374
+msgid "first"
+msgstr ""
+
+#: lib/object.php:375
+msgid "second"
+msgstr ""
+
+#: lib/object.php:376
+msgid "third"
+msgstr ""
+
+#: lib/object.php:377
+msgid "fourth"
+msgstr ""
+
+#: lib/object.php:378
+msgid "fifth"
+msgstr ""
+
+#: lib/object.php:379
+msgid "last"
+msgstr ""
+
+#: lib/object.php:401
+msgid "January"
+msgstr ""
+
+#: lib/object.php:402
+msgid "February"
+msgstr ""
+
+#: lib/object.php:403
+msgid "March"
+msgstr ""
+
+#: lib/object.php:404
+msgid "April"
+msgstr ""
+
+#: lib/object.php:405
+msgid "May"
+msgstr ""
+
+#: lib/object.php:406
+msgid "June"
+msgstr ""
+
+#: lib/object.php:407
+msgid "July"
+msgstr ""
+
+#: lib/object.php:408
+msgid "August"
+msgstr ""
+
+#: lib/object.php:409
+msgid "September"
+msgstr ""
+
+#: lib/object.php:410
+msgid "October"
+msgstr ""
+
+#: lib/object.php:411
+msgid "November"
+msgstr ""
+
+#: lib/object.php:412
+msgid "December"
+msgstr ""
+
+#: lib/object.php:418
+msgid "by events date"
+msgstr ""
+
+#: lib/object.php:419
+msgid "by yearday(s)"
+msgstr ""
+
+#: lib/object.php:420
+msgid "by weeknumber(s)"
+msgstr ""
+
+#: lib/object.php:421
+msgid "by day and month"
+msgstr ""
+
+#: lib/search.php:32 lib/search.php:34 lib/search.php:37
+msgid "Date"
+msgstr ""
+
+#: lib/search.php:40
+msgid "Cal."
+msgstr ""
+
+#: templates/calendar.php:11
+msgid "All day"
+msgstr ""
+
+#: templates/calendar.php:12 templates/part.choosecalendar.php:22
+msgid "New Calendar"
+msgstr ""
+
+#: templates/calendar.php:13
+msgid "Missing fields"
+msgstr ""
+
+#: templates/calendar.php:14 templates/part.eventform.php:19
+#: templates/part.showevent.php:11
+msgid "Title"
+msgstr ""
+
+#: templates/calendar.php:16
+msgid "From Date"
+msgstr ""
+
+#: templates/calendar.php:17
+msgid "From Time"
+msgstr ""
+
+#: templates/calendar.php:18
+msgid "To Date"
+msgstr ""
+
+#: templates/calendar.php:19
+msgid "To Time"
+msgstr ""
+
+#: templates/calendar.php:20
+msgid "The event ends before it starts"
+msgstr ""
+
+#: templates/calendar.php:21
+msgid "There was a database fail"
+msgstr ""
+
+#: templates/calendar.php:40
+msgid "Week"
+msgstr ""
+
+#: templates/calendar.php:41
+msgid "Month"
+msgstr ""
+
+#: templates/calendar.php:42
+msgid "List"
+msgstr ""
+
+#: templates/calendar.php:48
+msgid "Today"
+msgstr ""
+
+#: templates/calendar.php:49
+msgid "Calendars"
+msgstr ""
+
+#: templates/calendar.php:67
+msgid "There was a fail, while parsing the file."
+msgstr ""
+
+#: templates/part.choosecalendar.php:1
+msgid "Choose active calendars"
+msgstr ""
+
+#: templates/part.choosecalendar.php:2
+msgid "Your calendars"
+msgstr ""
+
+#: templates/part.choosecalendar.php:27
+#: templates/part.choosecalendar.rowfields.php:5
+msgid "CalDav Link"
+msgstr ""
+
+#: templates/part.choosecalendar.php:31
+msgid "Shared calendars"
+msgstr ""
+
+#: templates/part.choosecalendar.php:48
+msgid "No shared calendars"
+msgstr ""
+
+#: templates/part.choosecalendar.rowfields.php:4
+msgid "Share Calendar"
+msgstr ""
+
+#: templates/part.choosecalendar.rowfields.php:6
+msgid "Download"
+msgstr ""
+
+#: templates/part.choosecalendar.rowfields.php:7
+msgid "Edit"
+msgstr ""
+
+#: templates/part.choosecalendar.rowfields.php:8
+#: templates/part.editevent.php:9
+msgid "Delete"
+msgstr ""
+
+#: templates/part.choosecalendar.rowfields.shared.php:4
+msgid "shared with you by"
+msgstr ""
+
+#: templates/part.editcalendar.php:9
+msgid "New calendar"
+msgstr ""
+
+#: templates/part.editcalendar.php:9
+msgid "Edit calendar"
+msgstr ""
+
+#: templates/part.editcalendar.php:12
+msgid "Displayname"
+msgstr ""
+
+#: templates/part.editcalendar.php:23
+msgid "Active"
+msgstr ""
+
+#: templates/part.editcalendar.php:29
+msgid "Calendar color"
+msgstr ""
+
+#: templates/part.editcalendar.php:42
+msgid "Save"
+msgstr ""
+
+#: templates/part.editcalendar.php:42 templates/part.editevent.php:8
+#: templates/part.newevent.php:6
+msgid "Submit"
+msgstr ""
+
+#: templates/part.editcalendar.php:43
+msgid "Cancel"
+msgstr ""
+
+#: templates/part.editevent.php:1
+msgid "Edit an event"
+msgstr ""
+
+#: templates/part.editevent.php:10
+msgid "Export"
+msgstr ""
+
+#: templates/part.eventform.php:8 templates/part.showevent.php:3
+msgid "Eventinfo"
+msgstr ""
+
+#: templates/part.eventform.php:9 templates/part.showevent.php:4
+msgid "Repeating"
+msgstr ""
+
+#: templates/part.eventform.php:10 templates/part.showevent.php:5
+msgid "Alarm"
+msgstr ""
+
+#: templates/part.eventform.php:11 templates/part.showevent.php:6
+msgid "Attendees"
+msgstr ""
+
+#: templates/part.eventform.php:13
+msgid "Share"
+msgstr ""
+
+#: templates/part.eventform.php:21
+msgid "Title of the Event"
+msgstr ""
+
+#: templates/part.eventform.php:27 templates/part.showevent.php:19
+msgid "Category"
+msgstr ""
+
+#: templates/part.eventform.php:29
+msgid "Separate categories with commas"
+msgstr ""
+
+#: templates/part.eventform.php:30
+msgid "Edit categories"
+msgstr ""
+
+#: templates/part.eventform.php:56 templates/part.showevent.php:55
+msgid "All Day Event"
+msgstr ""
+
+#: templates/part.eventform.php:60 templates/part.showevent.php:59
+msgid "From"
+msgstr ""
+
+#: templates/part.eventform.php:68 templates/part.showevent.php:67
+msgid "To"
+msgstr ""
+
+#: templates/part.eventform.php:76 templates/part.showevent.php:75
+msgid "Advanced options"
+msgstr ""
+
+#: templates/part.eventform.php:81 templates/part.showevent.php:80
+msgid "Location"
+msgstr ""
+
+#: templates/part.eventform.php:83
+msgid "Location of the Event"
+msgstr ""
+
+#: templates/part.eventform.php:89 templates/part.showevent.php:88
+msgid "Description"
+msgstr ""
+
+#: templates/part.eventform.php:91
+msgid "Description of the Event"
+msgstr ""
+
+#: templates/part.eventform.php:100 templates/part.showevent.php:98
+msgid "Repeat"
+msgstr ""
+
+#: templates/part.eventform.php:107 templates/part.showevent.php:105
+msgid "Advanced"
+msgstr ""
+
+#: templates/part.eventform.php:151 templates/part.showevent.php:149
+msgid "Select weekdays"
+msgstr ""
+
+#: templates/part.eventform.php:164 templates/part.eventform.php:177
+#: templates/part.showevent.php:162 templates/part.showevent.php:175
+msgid "Select days"
+msgstr ""
+
+#: templates/part.eventform.php:169 templates/part.showevent.php:167
+msgid "and the events day of year."
+msgstr ""
+
+#: templates/part.eventform.php:182 templates/part.showevent.php:180
+msgid "and the events day of month."
+msgstr ""
+
+#: templates/part.eventform.php:190 templates/part.showevent.php:188
+msgid "Select months"
+msgstr ""
+
+#: templates/part.eventform.php:203 templates/part.showevent.php:201
+msgid "Select weeks"
+msgstr ""
+
+#: templates/part.eventform.php:208 templates/part.showevent.php:206
+msgid "and the events week of year."
+msgstr ""
+
+#: templates/part.eventform.php:214 templates/part.showevent.php:212
+msgid "Interval"
+msgstr ""
+
+#: templates/part.eventform.php:220 templates/part.showevent.php:218
+msgid "End"
+msgstr ""
+
+#: templates/part.eventform.php:233 templates/part.showevent.php:231
+msgid "occurrences"
+msgstr ""
+
+#: templates/part.import.php:1
+msgid "Import a calendar file"
+msgstr ""
+
+#: templates/part.import.php:6
+msgid "Please choose the calendar"
+msgstr ""
+
+#: templates/part.import.php:10
+msgid "create a new calendar"
+msgstr ""
+
+#: templates/part.import.php:15
+msgid "Name of new calendar"
+msgstr ""
+
+#: templates/part.import.php:17
+msgid "Import"
+msgstr ""
+
+#: templates/part.import.php:20
+msgid "Importing calendar"
+msgstr ""
+
+#: templates/part.import.php:23
+msgid "Calendar imported successfully"
+msgstr ""
+
+#: templates/part.import.php:24
+msgid "Close Dialog"
+msgstr ""
+
+#: templates/part.newevent.php:1
+msgid "Create a new event"
+msgstr ""
+
+#: templates/part.showevent.php:1
+msgid "View an event"
+msgstr ""
+
+#: templates/part.showevent.php:23
+msgid "No categories selected"
+msgstr ""
+
+#: templates/part.showevent.php:25
+msgid "Select category"
+msgstr ""
+
+#: templates/part.showevent.php:37
+msgid "of"
+msgstr ""
+
+#: templates/part.showevent.php:62 templates/part.showevent.php:70
+msgid "at"
+msgstr ""
+
+#: templates/settings.php:14
+msgid "Timezone"
+msgstr ""
+
+#: templates/settings.php:31
+msgid "Check always for changes of the timezone"
+msgstr ""
+
+#: templates/settings.php:33
+msgid "Timeformat"
+msgstr ""
+
+#: templates/settings.php:35
+msgid "24h"
+msgstr ""
+
+#: templates/settings.php:36
+msgid "12h"
+msgstr ""
+
+#: templates/settings.php:40
+msgid "First day of the week"
+msgstr ""
+
+#: templates/settings.php:49
+msgid "Calendar CalDAV syncing address:"
+msgstr ""
+
+#: templates/share.dropdown.php:20
+msgid "Users"
+msgstr ""
+
+#: templates/share.dropdown.php:21
+msgid "select users"
+msgstr ""
+
+#: templates/share.dropdown.php:36 templates/share.dropdown.php:62
+msgid "Editable"
+msgstr ""
+
+#: templates/share.dropdown.php:48
+msgid "Groups"
+msgstr ""
+
+#: templates/share.dropdown.php:49
+msgid "select groups"
+msgstr ""
+
+#: templates/share.dropdown.php:75
+msgid "make public"
+msgstr ""
diff --git a/l10n/af/contacts.po b/l10n/af/contacts.po
new file mode 100644
index 0000000000000000000000000000000000000000..5bb8d1af225a0ac8c2a7bb7615facfcd6c4f2a31
--- /dev/null
+++ b/l10n/af/contacts.po
@@ -0,0 +1,664 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
+"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ajax/activation.php:19 ajax/updateaddressbook.php:32
+msgid "Error (de)activating addressbook."
+msgstr ""
+
+#: ajax/addcontact.php:59
+msgid "There was an error adding the contact."
+msgstr ""
+
+#: ajax/addproperty.php:40
+msgid "Cannot add empty property."
+msgstr ""
+
+#: ajax/addproperty.php:52
+msgid "At least one of the address fields has to be filled out."
+msgstr ""
+
+#: ajax/addproperty.php:62
+msgid "Trying to add duplicate property: "
+msgstr ""
+
+#: ajax/addproperty.php:120
+msgid "Error adding contact property."
+msgstr ""
+
+#: ajax/categories/categoriesfor.php:15
+msgid "No ID provided"
+msgstr ""
+
+#: ajax/categories/categoriesfor.php:27
+msgid "Error setting checksum."
+msgstr ""
+
+#: ajax/categories/delete.php:29
+msgid "No categories selected for deletion."
+msgstr ""
+
+#: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
+msgid "No address books found."
+msgstr ""
+
+#: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
+msgid "No contacts found."
+msgstr ""
+
+#: ajax/contactdetails.php:37
+msgid "Missing ID"
+msgstr ""
+
+#: ajax/contactdetails.php:41
+msgid "Error parsing VCard for ID: \""
+msgstr ""
+
+#: ajax/createaddressbook.php:18
+msgid "Cannot add addressbook with an empty name."
+msgstr ""
+
+#: ajax/createaddressbook.php:24
+msgid "Error adding addressbook."
+msgstr ""
+
+#: ajax/createaddressbook.php:30
+msgid "Error activating addressbook."
+msgstr ""
+
+#: ajax/currentphoto.php:40 ajax/oc_photo.php:40
+msgid "No contact ID was submitted."
+msgstr ""
+
+#: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
+msgid "Error loading image."
+msgstr ""
+
+#: ajax/currentphoto.php:51
+msgid "Error reading contact photo."
+msgstr ""
+
+#: ajax/currentphoto.php:61
+msgid "Error saving temporary file."
+msgstr ""
+
+#: ajax/currentphoto.php:64
+msgid "The loading photo is not valid."
+msgstr ""
+
+#: ajax/deletecard.php:37 ajax/saveproperty.php:58
+msgid "id is not set."
+msgstr ""
+
+#: ajax/deleteproperty.php:36
+msgid "Information about vCard is incorrect. Please reload the page."
+msgstr ""
+
+#: ajax/deleteproperty.php:43
+msgid "Error deleting contact property."
+msgstr ""
+
+#: ajax/editname.php:37
+msgid "Contact ID is missing."
+msgstr ""
+
+#: ajax/loadphoto.php:44
+msgid "Missing contact id."
+msgstr ""
+
+#: ajax/oc_photo.php:44
+msgid "No photo path was submitted."
+msgstr ""
+
+#: ajax/oc_photo.php:51
+msgid "File doesn't exist:"
+msgstr ""
+
+#: ajax/saveproperty.php:55
+msgid "element name is not set."
+msgstr ""
+
+#: ajax/saveproperty.php:61
+msgid "checksum is not set."
+msgstr ""
+
+#: ajax/saveproperty.php:78
+msgid "Information about vCard is incorrect. Please reload the page: "
+msgstr ""
+
+#: ajax/saveproperty.php:83
+msgid "Something went FUBAR. "
+msgstr ""
+
+#: ajax/saveproperty.php:153
+msgid "Error updating contact property."
+msgstr ""
+
+#: ajax/updateaddressbook.php:20
+msgid "Cannot update addressbook with an empty name."
+msgstr ""
+
+#: ajax/updateaddressbook.php:26
+msgid "Error updating addressbook."
+msgstr ""
+
+#: ajax/uploadimport.php:46 ajax/uploadimport.php:76
+msgid "Error uploading contacts to storage."
+msgstr ""
+
+#: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
+msgid "There is no error, the file uploaded with success"
+msgstr ""
+
+#: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
+msgstr ""
+
+#: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
+msgid ""
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
+"the HTML form"
+msgstr ""
+
+#: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
+msgid "The uploaded file was only partially uploaded"
+msgstr ""
+
+#: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
+msgid "No file was uploaded"
+msgstr ""
+
+#: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
+msgid "Missing a temporary folder"
+msgstr ""
+
+#: appinfo/app.php:22 templates/settings.php:3
+msgid "Contacts"
+msgstr ""
+
+#: lib/app.php:23
+msgid "Addressbook not found."
+msgstr ""
+
+#: lib/app.php:27
+msgid "This is not your addressbook."
+msgstr ""
+
+#: lib/app.php:38
+msgid "Contact could not be found."
+msgstr ""
+
+#: lib/app.php:94 templates/part.contact.php:109
+msgid "Address"
+msgstr ""
+
+#: lib/app.php:95
+msgid "Telephone"
+msgstr ""
+
+#: lib/app.php:96 templates/part.contact.php:108
+msgid "Email"
+msgstr ""
+
+#: lib/app.php:97 templates/part.contact.php:33 templates/part.contact.php:34
+#: templates/part.contact.php:104
+msgid "Organization"
+msgstr ""
+
+#: lib/app.php:109 lib/app.php:116 lib/app.php:126
+msgid "Work"
+msgstr ""
+
+#: lib/app.php:110 lib/app.php:114 lib/app.php:127
+msgid "Home"
+msgstr ""
+
+#: lib/app.php:115
+msgid "Mobile"
+msgstr ""
+
+#: lib/app.php:117
+msgid "Text"
+msgstr ""
+
+#: lib/app.php:118
+msgid "Voice"
+msgstr ""
+
+#: lib/app.php:119
+msgid "Message"
+msgstr ""
+
+#: lib/app.php:120
+msgid "Fax"
+msgstr ""
+
+#: lib/app.php:121
+msgid "Video"
+msgstr ""
+
+#: lib/app.php:122
+msgid "Pager"
+msgstr ""
+
+#: lib/app.php:128
+msgid "Internet"
+msgstr ""
+
+#: lib/hooks.php:79
+msgid "{name}'s Birthday"
+msgstr ""
+
+#: lib/search.php:22
+msgid "Contact"
+msgstr ""
+
+#: templates/index.php:13
+msgid "Add Contact"
+msgstr ""
+
+#: templates/index.php:14
+msgid "Addressbooks"
+msgstr ""
+
+#: templates/part.chooseaddressbook.php:1
+msgid "Configure Address Books"
+msgstr ""
+
+#: templates/part.chooseaddressbook.php:16
+msgid "New Address Book"
+msgstr ""
+
+#: templates/part.chooseaddressbook.php:17
+msgid "Import from VCF"
+msgstr ""
+
+#: templates/part.chooseaddressbook.php:22
+#: templates/part.chooseaddressbook.rowfields.php:8
+msgid "CardDav Link"
+msgstr ""
+
+#: templates/part.chooseaddressbook.rowfields.php:11
+msgid "Download"
+msgstr ""
+
+#: templates/part.chooseaddressbook.rowfields.php:14
+msgid "Edit"
+msgstr ""
+
+#: templates/part.chooseaddressbook.rowfields.php:17
+#: templates/part.contact.php:34 templates/part.contact.php:36
+#: templates/part.contact.php:38 templates/part.contact.php:42
+msgid "Delete"
+msgstr ""
+
+#: templates/part.contact.php:12
+msgid "Download contact"
+msgstr ""
+
+#: templates/part.contact.php:13
+msgid "Delete contact"
+msgstr ""
+
+#: templates/part.contact.php:19
+msgid "Drop photo to upload"
+msgstr ""
+
+#: templates/part.contact.php:29
+msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
+msgstr ""
+
+#: templates/part.contact.php:30
+msgid "Edit name details"
+msgstr ""
+
+#: templates/part.contact.php:35 templates/part.contact.php:105
+msgid "Nickname"
+msgstr ""
+
+#: templates/part.contact.php:36
+msgid "Enter nickname"
+msgstr ""
+
+#: templates/part.contact.php:37 templates/part.contact.php:106
+msgid "Birthday"
+msgstr ""
+
+#: templates/part.contact.php:38
+msgid "dd-mm-yyyy"
+msgstr ""
+
+#: templates/part.contact.php:39 templates/part.contact.php:111
+msgid "Groups"
+msgstr ""
+
+#: templates/part.contact.php:41
+msgid "Separate groups with commas"
+msgstr ""
+
+#: templates/part.contact.php:42
+msgid "Edit groups"
+msgstr ""
+
+#: templates/part.contact.php:55 templates/part.contact.php:69
+msgid "Preferred"
+msgstr ""
+
+#: templates/part.contact.php:56
+msgid "Please specify a valid email address."
+msgstr ""
+
+#: templates/part.contact.php:56
+msgid "Enter email address"
+msgstr ""
+
+#: templates/part.contact.php:60
+msgid "Mail to address"
+msgstr ""
+
+#: templates/part.contact.php:61
+msgid "Delete email address"
+msgstr ""
+
+#: templates/part.contact.php:70
+msgid "Enter phone number"
+msgstr ""
+
+#: templates/part.contact.php:74
+msgid "Delete phone number"
+msgstr ""
+
+#: templates/part.contact.php:84
+msgid "View on map"
+msgstr ""
+
+#: templates/part.contact.php:84
+msgid "Edit address details"
+msgstr ""
+
+#: templates/part.contact.php:95
+msgid "Add notes here."
+msgstr ""
+
+#: templates/part.contact.php:101
+msgid "Add field"
+msgstr ""
+
+#: templates/part.contact.php:103
+msgid "Profile picture"
+msgstr ""
+
+#: templates/part.contact.php:107
+msgid "Phone"
+msgstr ""
+
+#: templates/part.contact.php:110
+msgid "Note"
+msgstr ""
+
+#: templates/part.contactphoto.php:8
+msgid "Delete current photo"
+msgstr ""
+
+#: templates/part.contactphoto.php:9
+msgid "Edit current photo"
+msgstr ""
+
+#: templates/part.contactphoto.php:10
+msgid "Upload new photo"
+msgstr ""
+
+#: templates/part.contactphoto.php:11
+msgid "Select photo from ownCloud"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:9
+msgid "Edit address"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:14
+msgid "Type"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:22
+#: templates/part.edit_address_dialog.php:25
+msgid "PO Box"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:29
+#: templates/part.edit_address_dialog.php:32
+msgid "Extended"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:35
+#: templates/part.edit_address_dialog.php:38
+msgid "Street"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:41
+#: templates/part.edit_address_dialog.php:44
+msgid "City"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:47
+#: templates/part.edit_address_dialog.php:50
+msgid "Region"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:53
+#: templates/part.edit_address_dialog.php:56
+msgid "Zipcode"
+msgstr ""
+
+#: templates/part.edit_address_dialog.php:59
+#: templates/part.edit_address_dialog.php:62
+msgid "Country"
+msgstr ""
+
+#: templates/part.edit_categories_dialog.php:4
+msgid "Edit categories"
+msgstr ""
+
+#: templates/part.edit_categories_dialog.php:14
+msgid "Add"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:16
+msgid "Addressbook"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:23
+msgid "Hon. prefixes"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:27
+msgid "Miss"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:28
+msgid "Ms"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:29
+msgid "Mr"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:30
+msgid "Sir"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:31
+msgid "Mrs"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:32
+msgid "Dr"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:35
+msgid "Given name"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:37
+msgid "Additional names"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:39
+msgid "Family name"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:41
+msgid "Hon. suffixes"
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:45
+msgid "J.D."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:46
+msgid "M.D."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:47
+msgid "D.O."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:48
+msgid "D.C."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:49
+msgid "Ph.D."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:50
+msgid "Esq."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:51
+msgid "Jr."
+msgstr ""
+
+#: templates/part.edit_name_dialog.php:52
+msgid "Sn."
+msgstr ""
+
+#: templates/part.editaddressbook.php:9
+msgid "New Addressbook"
+msgstr ""
+
+#: templates/part.editaddressbook.php:9
+msgid "Edit Addressbook"
+msgstr ""
+
+#: templates/part.editaddressbook.php:12
+msgid "Displayname"
+msgstr ""
+
+#: templates/part.editaddressbook.php:23
+msgid "Active"
+msgstr ""
+
+#: templates/part.editaddressbook.php:29
+msgid "Save"
+msgstr ""
+
+#: templates/part.editaddressbook.php:29
+msgid "Submit"
+msgstr ""
+
+#: templates/part.editaddressbook.php:30
+#: templates/part.importaddressbook.php:28
+msgid "Cancel"
+msgstr ""
+
+#: templates/part.import.php:1
+msgid "Import a contacts file"
+msgstr ""
+
+#: templates/part.import.php:6
+msgid "Please choose the addressbook"
+msgstr ""
+
+#: templates/part.import.php:10
+msgid "create a new addressbook"
+msgstr ""
+
+#: templates/part.import.php:15
+msgid "Name of new addressbook"
+msgstr ""
+
+#: templates/part.import.php:17
+msgid "Import"
+msgstr ""
+
+#: templates/part.import.php:20
+msgid "Importing contacts"
+msgstr ""
+
+#: templates/part.import.php:23
+msgid "Contacts imported successfully"
+msgstr ""
+
+#: templates/part.import.php:24
+msgid "Close Dialog"
+msgstr ""
+
+#: templates/part.importaddressbook.php:9
+msgid "Import Addressbook"
+msgstr ""
+
+#: templates/part.importaddressbook.php:12
+msgid "Select address book to import to:"
+msgstr ""
+
+#: templates/part.importaddressbook.php:20
+msgid "Drop a VCF file to import contacts."
+msgstr ""
+
+#: templates/part.importaddressbook.php:21
+msgid "Select from HD"
+msgstr ""
+
+#: templates/part.no_contacts.php:2
+msgid "You have no contacts in your addressbook."
+msgstr ""
+
+#: templates/part.no_contacts.php:4
+msgid "Add contact"
+msgstr ""
+
+#: templates/part.no_contacts.php:5
+msgid "Configure addressbooks"
+msgstr ""
+
+#: templates/settings.php:4
+msgid "CardDAV syncing addresses"
+msgstr ""
+
+#: templates/settings.php:4
+msgid "more info"
+msgstr ""
+
+#: templates/settings.php:6
+msgid "Primary address (Kontact et al)"
+msgstr ""
+
+#: templates/settings.php:8
+msgid "iOS/OS X"
+msgstr ""
diff --git a/l10n/af/core.po b/l10n/af/core.po
new file mode 100644
index 0000000000000000000000000000000000000000..bebd27cfa2f1bc89f573df082cf2b767485fee39
--- /dev/null
+++ b/l10n/af/core.po
@@ -0,0 +1,196 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2011-07-25 16:05+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
+msgid "Application name not provided."
+msgstr ""
+
+#: ajax/vcategories/add.php:29
+msgid "No category to add?"
+msgstr ""
+
+#: ajax/vcategories/add.php:36
+msgid "This category already exists: "
+msgstr ""
+
+#: lostpassword/index.php:26
+msgid "Owncloud password reset"
+msgstr ""
+
+#: lostpassword/index.php:27
+msgid "ownCloud password reset"
+msgstr ""
+
+#: lostpassword/templates/email.php:1
+msgid "Use the following link to reset your password: {link}"
+msgstr ""
+
+#: lostpassword/templates/lostpassword.php:3
+msgid "You will receive a link to reset your password via Email."
+msgstr ""
+
+#: lostpassword/templates/lostpassword.php:5
+msgid "Requested"
+msgstr ""
+
+#: lostpassword/templates/lostpassword.php:8
+msgid "Login failed!"
+msgstr ""
+
+#: lostpassword/templates/lostpassword.php:11 templates/installation.php:25
+#: templates/login.php:9
+msgid "Username"
+msgstr ""
+
+#: lostpassword/templates/lostpassword.php:15
+msgid "Request reset"
+msgstr ""
+
+#: lostpassword/templates/resetpassword.php:4
+msgid "Your password was reset"
+msgstr ""
+
+#: lostpassword/templates/resetpassword.php:5
+msgid "To login page"
+msgstr ""
+
+#: lostpassword/templates/resetpassword.php:8
+msgid "New password"
+msgstr ""
+
+#: lostpassword/templates/resetpassword.php:11
+msgid "Reset password"
+msgstr ""
+
+#: strings.php:5
+msgid "Personal"
+msgstr ""
+
+#: strings.php:6
+msgid "Users"
+msgstr ""
+
+#: strings.php:7
+msgid "Apps"
+msgstr ""
+
+#: strings.php:8
+msgid "Admin"
+msgstr ""
+
+#: strings.php:9
+msgid "Help"
+msgstr ""
+
+#: templates/403.php:12
+msgid "Access forbidden"
+msgstr ""
+
+#: templates/404.php:12
+msgid "Cloud not found"
+msgstr ""
+
+#: templates/edit_categories_dialog.php:4
+msgid "Edit categories"
+msgstr ""
+
+#: templates/edit_categories_dialog.php:14
+msgid "Add"
+msgstr ""
+
+#: templates/installation.php:23
+msgid "Create an <strong>admin account</strong>"
+msgstr ""
+
+#: templates/installation.php:29 templates/login.php:13
+msgid "Password"
+msgstr ""
+
+#: templates/installation.php:35
+msgid "Advanced"
+msgstr ""
+
+#: templates/installation.php:37
+msgid "Data folder"
+msgstr ""
+
+#: templates/installation.php:44
+msgid "Configure the database"
+msgstr ""
+
+#: templates/installation.php:49 templates/installation.php:60
+#: templates/installation.php:70
+msgid "will be used"
+msgstr ""
+
+#: templates/installation.php:82
+msgid "Database user"
+msgstr ""
+
+#: templates/installation.php:86
+msgid "Database password"
+msgstr ""
+
+#: templates/installation.php:90
+msgid "Database name"
+msgstr ""
+
+#: templates/installation.php:96
+msgid "Database host"
+msgstr ""
+
+#: templates/installation.php:101
+msgid "Finish setup"
+msgstr ""
+
+#: templates/layout.guest.php:36
+msgid "web services under your control"
+msgstr ""
+
+#: templates/layout.user.php:35
+msgid "Log out"
+msgstr ""
+
+#: templates/layout.user.php:47 templates/layout.user.php:48
+msgid "Settings"
+msgstr ""
+
+#: templates/login.php:6
+msgid "Lost your password?"
+msgstr ""
+
+#: templates/login.php:17
+msgid "remember"
+msgstr ""
+
+#: templates/login.php:18
+msgid "Log in"
+msgstr ""
+
+#: templates/logout.php:1
+msgid "You are logged out."
+msgstr ""
+
+#: templates/part.pagenavi.php:3
+msgid "prev"
+msgstr ""
+
+#: templates/part.pagenavi.php:20
+msgid "next"
+msgstr ""
diff --git a/l10n/af/files.po b/l10n/af/files.po
new file mode 100644
index 0000000000000000000000000000000000000000..d2ea9dc44cb5077083751faddbf8fc6af89104f5
--- /dev/null
+++ b/l10n/af/files.po
@@ -0,0 +1,154 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2011-08-13 02:19+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ajax/upload.php:19
+msgid "There is no error, the file uploaded with success"
+msgstr ""
+
+#: ajax/upload.php:20
+msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
+msgstr ""
+
+#: ajax/upload.php:21
+msgid ""
+"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
+"the HTML form"
+msgstr ""
+
+#: ajax/upload.php:22
+msgid "The uploaded file was only partially uploaded"
+msgstr ""
+
+#: ajax/upload.php:23
+msgid "No file was uploaded"
+msgstr ""
+
+#: ajax/upload.php:24
+msgid "Missing a temporary folder"
+msgstr ""
+
+#: ajax/upload.php:25
+msgid "Failed to write to disk"
+msgstr ""
+
+#: appinfo/app.php:7
+msgid "Files"
+msgstr ""
+
+#: templates/admin.php:5
+msgid "File handling"
+msgstr ""
+
+#: templates/admin.php:7
+msgid "Maximum upload size"
+msgstr ""
+
+#: templates/admin.php:7
+msgid "max. possible: "
+msgstr ""
+
+#: templates/admin.php:9
+msgid "Needed for multi-file and folder downloads."
+msgstr ""
+
+#: templates/admin.php:9
+msgid "Enable ZIP-download"
+msgstr ""
+
+#: templates/admin.php:11
+msgid "0 is unlimited"
+msgstr ""
+
+#: templates/admin.php:12
+msgid "Maximum input size for ZIP files"
+msgstr ""
+
+#: templates/index.php:7
+msgid "New"
+msgstr ""
+
+#: templates/index.php:9
+msgid "Text file"
+msgstr ""
+
+#: templates/index.php:10
+msgid "Folder"
+msgstr ""
+
+#: templates/index.php:11
+msgid "From url"
+msgstr ""
+
+#: templates/index.php:21
+msgid "Upload"
+msgstr ""
+
+#: templates/index.php:27
+msgid "Cancel upload"
+msgstr ""
+
+#: templates/index.php:39
+msgid "Nothing in here. Upload something!"
+msgstr ""
+
+#: templates/index.php:47
+msgid "Name"
+msgstr ""
+
+#: templates/index.php:49
+msgid "Share"
+msgstr ""
+
+#: templates/index.php:51
+msgid "Download"
+msgstr ""
+
+#: templates/index.php:55
+msgid "Size"
+msgstr ""
+
+#: templates/index.php:56
+msgid "Modified"
+msgstr ""
+
+#: templates/index.php:56
+msgid "Delete all"
+msgstr ""
+
+#: templates/index.php:56
+msgid "Delete"
+msgstr ""
+
+#: templates/index.php:64
+msgid "Upload too large"
+msgstr ""
+
+#: templates/index.php:66
+msgid ""
+"The files you are trying to upload exceed the maximum size for file uploads "
+"on this server."
+msgstr ""
+
+#: templates/index.php:71
+msgid "Files are being scanned, please wait."
+msgstr ""
+
+#: templates/index.php:74
+msgid "Current scanning"
+msgstr ""
diff --git a/l10n/af/gallery.po b/l10n/af/gallery.po
new file mode 100644
index 0000000000000000000000000000000000000000..0c8fe687eb6b3d978aadd23c8a13f97706564012
--- /dev/null
+++ b/l10n/af/gallery.po
@@ -0,0 +1,58 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-01-15 13:48+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: appinfo/app.php:42
+msgid "Pictures"
+msgstr ""
+
+#: templates/index.php:16
+msgid "Rescan"
+msgstr ""
+
+#: templates/index.php:17
+msgid "Stop"
+msgstr ""
+
+#: templates/index.php:18
+msgid "Share"
+msgstr ""
+
+#: templates/index.php:19
+msgid "Settings"
+msgstr ""
+
+#: templates/view_album.php:19
+msgid "Back"
+msgstr ""
+
+#: templates/view_album.php:36
+msgid "Remove confirmation"
+msgstr ""
+
+#: templates/view_album.php:37
+msgid "Do you want to remove album"
+msgstr ""
+
+#: templates/view_album.php:40
+msgid "Change album name"
+msgstr ""
+
+#: templates/view_album.php:43
+msgid "New album name"
+msgstr ""
diff --git a/l10n/af/media.po b/l10n/af/media.po
new file mode 100644
index 0000000000000000000000000000000000000000..bca7b9059b2ff296612158c08b5acfa89966d59c
--- /dev/null
+++ b/l10n/af/media.po
@@ -0,0 +1,62 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2011-08-13 02:19+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: appinfo/app.php:32 templates/player.php:8
+msgid "Music"
+msgstr ""
+
+#: templates/music.php:3 templates/player.php:12
+msgid "Play"
+msgstr ""
+
+#: templates/music.php:4 templates/music.php:26 templates/player.php:13
+msgid "Pause"
+msgstr ""
+
+#: templates/music.php:5
+msgid "Previous"
+msgstr ""
+
+#: templates/music.php:6 templates/player.php:14
+msgid "Next"
+msgstr ""
+
+#: templates/music.php:7
+msgid "Mute"
+msgstr ""
+
+#: templates/music.php:8
+msgid "Unmute"
+msgstr ""
+
+#: templates/music.php:25
+msgid "Rescan Collection"
+msgstr ""
+
+#: templates/music.php:37
+msgid "Artist"
+msgstr ""
+
+#: templates/music.php:38
+msgid "Album"
+msgstr ""
+
+#: templates/music.php:39
+msgid "Title"
+msgstr ""
diff --git a/l10n/af/settings.po b/l10n/af/settings.po
new file mode 100644
index 0000000000000000000000000000000000000000..7429b434775fb7122185f211f41e346d9f099831
--- /dev/null
+++ b/l10n/af/settings.po
@@ -0,0 +1,183 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# 
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: ownCloud\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2011-07-25 16:05+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Afrikaans (http://www.transifex.net/projects/p/owncloud/language/af/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: af\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+#: ajax/lostpassword.php:14
+msgid "email Changed"
+msgstr ""
+
+#: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:19
+#: ajax/setlanguage.php:22
+msgid "Invalid request"
+msgstr ""
+
+#: ajax/openid.php:15
+msgid "OpenID Changed"
+msgstr ""
+
+#: ajax/setlanguage.php:17
+msgid "Language changed"
+msgstr ""
+
+#: personal.php:39 personal.php:40
+msgid "__language_name__"
+msgstr ""
+
+#: templates/admin.php:13
+msgid "Log"
+msgstr ""
+
+#: templates/admin.php:40
+msgid "More"
+msgstr ""
+
+#: templates/apps.php:8
+msgid "Add your App"
+msgstr ""
+
+#: templates/apps.php:22
+msgid "Select an App"
+msgstr ""
+
+#: templates/apps.php:25
+msgid "-licensed"
+msgstr ""
+
+#: templates/apps.php:25
+msgid "by"
+msgstr ""
+
+#: templates/help.php:8
+msgid "Documentation"
+msgstr ""
+
+#: templates/help.php:9
+msgid "Managing Big Files"
+msgstr ""
+
+#: templates/help.php:10
+msgid "Ask a question"
+msgstr ""
+
+#: templates/help.php:22
+msgid "Problems connecting to help database."
+msgstr ""
+
+#: templates/help.php:23
+msgid "Go there manually."
+msgstr ""
+
+#: templates/help.php:31
+msgid "Answer"
+msgstr ""
+
+#: templates/personal.php:8
+msgid "You use"
+msgstr ""
+
+#: templates/personal.php:8
+msgid "of the available"
+msgstr ""
+
+#: templates/personal.php:12
+msgid "Desktop and Mobile Syncing Clients"
+msgstr ""
+
+#: templates/personal.php:13
+msgid "Download"
+msgstr ""
+
+#: templates/personal.php:19
+msgid "Your password got changed"
+msgstr ""
+
+#: templates/personal.php:20
+msgid "Unable to change your password"
+msgstr ""
+
+#: templates/personal.php:21
+msgid "Current password"
+msgstr ""
+
+#: templates/personal.php:22
+msgid "New password"
+msgstr ""
+
+#: templates/personal.php:23
+msgid "show"
+msgstr ""
+
+#: templates/personal.php:24
+msgid "Change password"
+msgstr ""
+
+#: templates/personal.php:30
+msgid "Email"
+msgstr ""
+
+#: templates/personal.php:31
+msgid "Your email address"
+msgstr ""
+
+#: templates/personal.php:32
+msgid "Fill in an email address to enable password recovery"
+msgstr ""
+
+#: templates/personal.php:38 templates/personal.php:39
+msgid "Language"
+msgstr ""
+
+#: templates/personal.php:44
+msgid "Help translate"
+msgstr ""
+
+#: templates/personal.php:51
+msgid "use this address to connect to your ownCloud in your file manager"
+msgstr ""
+
+#: templates/users.php:15 templates/users.php:44
+msgid "Name"
+msgstr ""
+
+#: templates/users.php:16 templates/users.php:45
+msgid "Password"
+msgstr ""
+
+#: templates/users.php:17 templates/users.php:46 templates/users.php:60
+msgid "Groups"
+msgstr ""
+
+#: templates/users.php:22
+msgid "Create"
+msgstr ""
+
+#: templates/users.php:25
+msgid "Default Quota"
+msgstr ""
+
+#: templates/users.php:35 templates/users.php:74
+msgid "Other"
+msgstr ""
+
+#: templates/users.php:47
+msgid "Quota"
+msgstr ""
+
+#: templates/users.php:80
+msgid "Delete"
+msgstr ""
diff --git a/l10n/ar/contacts.po b/l10n/ar/contacts.po
index 23c90189752a9770c18a18dd12bd3e5e95ca5280..cf44000cd9a6634931a07653bde29e447bbbf1f0 100644
--- a/l10n/ar/contacts.po
+++ b/l10n/ar/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/language/ar/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "خطء خلال توقيف كتاب العناوين."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "خطء خلال اضافة معرفه جديده."
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/bg_BG/contacts.po b/l10n/bg_BG/contacts.po
index 2e1b8cb9f381e4b1bbcfb43b5eb7de43aa763225..635458a04e5a5c7224b62376b5b9871751ad45a4 100644
--- a/l10n/bg_BG/contacts.po
+++ b/l10n/bg_BG/contacts.po
@@ -6,9 +6,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.net/projects/p/owncloud/language/bg_BG/)\n"
 "MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -69,10 +69,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/ca/calendar.po b/l10n/ca/calendar.po
index c40ef3b906be822ec34470885917e4fe06da2730..09d8ca6da739be780dfa79c7130cc51053e83d94 100644
--- a/l10n/ca/calendar.po
+++ b/l10n/ca/calendar.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 11:26+0000\n"
+"Last-Translator: rogerc <rcalvoi@yahoo.com>\n"
 "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/language/ca/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,11 +21,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "No s'han trobat calendaris."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "No s'han trobat events."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -51,71 +51,71 @@ msgstr "Calendari"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Aniversari"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Feina"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Trucada"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Clients"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Remitent"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Vacances"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Idees"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Viatge"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Sant"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Reunió"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Altres"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Personal"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projectes"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Preguntes"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Feina"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "sense nom"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -364,7 +364,7 @@ msgstr "Seleccioneu calendaris actius"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Els vostres calendaris"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -373,15 +373,15 @@ msgstr "Enllaç CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Calendaris compartits"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "No hi ha calendaris compartits"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Comparteix el calendari"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -398,7 +398,7 @@ msgstr "Suprimeix"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "compartit amb vós"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -443,23 +443,23 @@ msgstr "Exporta"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Eventinfo"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Repetició"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarma"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Assistents"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Comparteix"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -471,11 +471,11 @@ msgstr "Categoria"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Separeu les categories amb comes"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Edita categories"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -596,11 +596,11 @@ msgstr "Crea un nou esdeveniment"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Mostra un event"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "No hi ha categories seleccionades"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -608,11 +608,11 @@ msgstr "Seleccioneu categoria"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "de"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "a"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -636,7 +636,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Primer dia de la setmana"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -644,24 +644,24 @@ msgstr "Adreça de sincronització del calendari CalDAV:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Usuaris"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "seleccioneu usuaris"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Editable"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Grups"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "seleccioneu grups"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "fes-ho public"
diff --git a/l10n/ca/contacts.po b/l10n/ca/contacts.po
index 8a4af845f0283992edb0d6b4687ff1c69fc323ad..d551cb21cbd18c39facae6bebc2c3d5cb7520241 100644
--- a/l10n/ca/contacts.po
+++ b/l10n/ca/contacts.po
@@ -8,9 +8,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/language/ca/)\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Error en (des)activar la llibreta d'adreces."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "S'ha produït un error en afegir el contacte."
 
@@ -37,7 +37,7 @@ msgstr "Almenys heu d'omplir un dels camps d'adreça."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Esteu intentant afegir una propietat duplicada:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -45,39 +45,35 @@ msgstr "Error en afegir la propietat del contacte."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "No heu facilitat cap ID"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Error en establir la suma de verificació."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "No heu seleccionat les categories a eliminar."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "No s'han trobat llibretes d'adreces."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "No s'han trobat contactes."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Falta la ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Error en analitzar la ID de la VCard: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "No es pot afegir una llibreta d'adreces amb un nom buit."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -89,27 +85,27 @@ msgstr "Error en activar la llibreta d'adreces."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "No s'ha tramès cap ID de contacte."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Error en carregar la imatge."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Error en llegir la foto del contacte."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Error en desar el fitxer temporal."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "La foto carregada no és vàlida."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "no s'ha establert la id."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -121,35 +117,35 @@ msgstr "Error en eliminar la propietat del contacte."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "falta la ID del contacte."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Falta la id del contacte."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "No heu tramès el camí de la foto."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "El fitxer no existeix:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "no s'ha establert el nom de l'element."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "no s'ha establert la suma de verificació."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Alguna cosa ha anat FUBAR."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -157,7 +153,7 @@ msgstr "Error en actualitzar la propietat del contacte."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "No es pot actualitzar la llibreta d'adreces amb un nom buit"
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -165,33 +161,33 @@ msgstr "Error en actualitzar la llibreta d'adreces."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Error en carregar contactes a l'emmagatzemament."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "No hi ha errors, el fitxer s'ha carregat correctament"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "El fitxer carregat supera la directiva upload_max_filesize de php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "El fitxer només s'ha carregat parcialment"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "No s'ha carregat cap fitxer"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Falta un fitxer temporal"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -199,7 +195,7 @@ msgstr "Contactes"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "No s'ha trobat la llibreta d'adreces."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -248,7 +244,7 @@ msgstr "Veu"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Missatge"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -264,11 +260,11 @@ msgstr "Paginador"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Aniversari de {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -284,7 +280,7 @@ msgstr "Llibretes d'adreces"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Configura les llibretes d'adreces"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -292,7 +288,7 @@ msgstr "Nova llibreta d'adreces"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importa de VFC"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -323,23 +319,23 @@ msgstr "Suprimeix el contacte"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Elimina la foto a carregar"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Edita detalls del nom"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Sobrenom"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Escriviu el sobrenom"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -347,19 +343,19 @@ msgstr "Aniversari"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Grups"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Separeu els grups amb comes"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Edita els grups"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -367,47 +363,47 @@ msgstr "Preferit"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Especifiqueu una adreça de correu electrònic correcta"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Escriviu una adreça de correu electrònic"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Envia per correu electrònic a l'adreça"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Elimina l'adreça de correu electrònic"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Escriviu el número de telèfon"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Elimina el número de telèfon"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Visualitza al mapa"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Edita els detalls de l'adreça"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Afegiu notes aquí."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Afegeix un camp"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Foto de perfil"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -415,27 +411,27 @@ msgstr "Telèfon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Nota"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Elimina la foto actual"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Edita la foto actual"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Carrega una foto nova"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Selecciona una foto de ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Edita l'adreça"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -478,7 +474,7 @@ msgstr "País"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Edita categories"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -490,79 +486,79 @@ msgstr "Llibreta d'adreces"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Prefix honorífic:"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Srta"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Sra"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Sr"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Senyor"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Sra"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Nom específic"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Noms addicionals"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Nom de familia"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Sufix honorífic:"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sn."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -595,76 +591,76 @@ msgstr "Cancel·la"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importa un fitxer de contactes"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Escolliu la llibreta d'adreces"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "crea una llibreta d'adreces nova"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Nom de la nova llibreta d'adreces"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importa"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "S'estan important contactes"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Els contactes s'han importat correctament"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Tanca el diàleg"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importa la llibreta d'adreces"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Seleccioneu la llibreta d'adreces a la que voleu importar:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Elimina un fitxer VCF per importar contactes."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Selecciona de HD"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "No teniu contactes a la llibreta d'adreces."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Afegeix un contacte"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Configura les llibretes d'adreces"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Adreces de sincronització CardDAV"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "més informació"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Adreça primària (Kontact i al)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/ca/core.po b/l10n/ca/core.po
index 129ec8c84a90499f3ef520a49023919563413ce9..83fd1522490becad5bd3cb38d270221bd83b2004 100644
--- a/l10n/ca/core.po
+++ b/l10n/ca/core.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 11:23+0000\n"
+"Last-Translator: rogerc <rcalvoi@yahoo.com>\n"
 "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/language/ca/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +21,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "No s'ha facilitat cap nom per l'aplicació."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "No voleu afegir cap categoria?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Aquesta categoria ja existeix:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -37,7 +37,7 @@ msgstr "Restableix la contrasenya d'Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "estableix de nou la contrasenya Owncloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -102,7 +102,7 @@ msgstr "Ajuda"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Accés prohibit"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +110,11 @@ msgstr "No s'ha trobat el núvol"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Edita les categories"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Afegeix"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,7 +161,7 @@ msgstr "Ordinador central de la base de dades"
 msgid "Finish setup"
 msgstr "Acaba la configuració"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "controleu els vostres serveis web"
 
diff --git a/l10n/ca/files.po b/l10n/ca/files.po
index 61d011024919167ac4b6f14953e646504882ca57..9fa0e17c56778fb31a112ca827881eadffb6bc36 100644
--- a/l10n/ca/files.po
+++ b/l10n/ca/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 11:30+0000\n"
+"Last-Translator: rogerc <rcalvoi@yahoo.com>\n"
 "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/language/ca/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "S'ha perdut un fitxer temporal"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Ha fallat en escriure al disc"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "Fitxers"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Gestió de fitxers"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "Mida màxima de pujada"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "màxim possible:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Necessari per fitxers múltiples i baixada de carpetes"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Activa la baixada ZIP"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 és sense límit"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Mida màxima d'entrada per fitxers ZIP"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "Carpeta"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Des de la url"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "Puja"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Cancel·la la pujada"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "Nom"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Comparteix"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "Modificat"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Esborra-ho tot"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "Els fitxers que esteu intentant pujar excedeixen la mida màxima de puja
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "S'estan escanejant els fitxers, espereu"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Actualment escanejant"
diff --git a/l10n/ca/gallery.po b/l10n/ca/gallery.po
index ea63e3610c7b3a91116e0ca71e6f57640660c25c..6cdc8d07e4ed754cbed04eef6d6f9122274afe84 100644
--- a/l10n/ca/gallery.po
+++ b/l10n/ca/gallery.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 13:38+0000\n"
+"Last-Translator: rogerc <rcalvoi@yahoo.com>\n"
 "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/language/ca/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Fotos"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +28,15 @@ msgstr "Escaneja de nou"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Atura"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Comparteix"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Arranjament"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +44,16 @@ msgstr "Enrera"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Elimina la confirmació"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Voleu eliminar l'àlbum"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Canvia el nom de l'àlbum"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nom nou de l'àlbum"
diff --git a/l10n/ca/settings.po b/l10n/ca/settings.po
index 9201bede086d327d543c1dc5fe4d1e73ca21fb40..4c4063a5b8d0689d94382a24c78f6581ff1d0d79 100644
--- a/l10n/ca/settings.po
+++ b/l10n/ca/settings.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 11:28+0000\n"
+"Last-Translator: rogerc <rcalvoi@yahoo.com>\n"
 "Language-Team: Catalan (http://www.transifex.net/projects/p/owncloud/language/ca/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -42,15 +42,15 @@ msgstr "Català"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Registre"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Més"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Afegeiu la vostra aplicació"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -66,11 +66,11 @@ msgstr "de"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentació"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Gestió de fitxers grans"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -98,11 +98,11 @@ msgstr "del disponible"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Clients de sincronització d'escriptori i de mòbil"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Baixada"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -170,11 +170,11 @@ msgstr "Crea"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Quota per defecte"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Altre"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/cs_CZ/calendar.po b/l10n/cs_CZ/calendar.po
index 1e72a7e5b4e828ccdc3b91888f6f97e59a3f5b23..5dca39cef64c43af2b0293ae801454900b1e7a66 100644
--- a/l10n/cs_CZ/calendar.po
+++ b/l10n/cs_CZ/calendar.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 08:18+0000\n"
+"Last-Translator: Michal Hrušecký <Michal@hrusecky.net>\n"
 "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,11 +22,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Žádné kalendáře nenalezeny."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Žádné události nenalezeny."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -52,71 +52,71 @@ msgstr "Kalendář"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "d. MMM[ yyyy]{ '&#8212;' d.[ MMM] yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Narozeniny"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Obchodní"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Hovor"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Klienti"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Doručovatel"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Prázdniny"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Nápady"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Cesta"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Výročí"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Schůzka"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Další"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Osobní"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projekty"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Dotazy"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Pracovní"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "nepojmenováno"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -365,7 +365,7 @@ msgstr "Vybrat aktivní kalendář"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Vaše kalendáře"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -374,15 +374,15 @@ msgstr "CalDav odkaz"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Sdílené kalendáře"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Žádné sdílené kalendáře"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Sdílet kalendář"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -399,7 +399,7 @@ msgstr "Odstranit"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "sdíleno s vámi uživatelem"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -444,23 +444,23 @@ msgstr "Export"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Informace o události"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Opakující se"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Účastníci"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Sdílet"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -472,11 +472,11 @@ msgstr "Kategorie"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Kategorie oddělené čárkami"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Upravit kategorie"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -597,11 +597,11 @@ msgstr "Vytvořit novou událost"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Zobrazit událost"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Žádné kategorie nevybrány"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -609,11 +609,11 @@ msgstr "Vyberte kategorii"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "z"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "v"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -637,7 +637,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Týden začína v"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -645,24 +645,24 @@ msgstr "Adresa pro synchronizaci kalendáře pomocí CalDAV:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Uživatelé"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "vybrat uživatele"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Upravovatelné"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Skupiny"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "vybrat skupiny"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "zveřejnit"
diff --git a/l10n/cs_CZ/contacts.po b/l10n/cs_CZ/contacts.po
index 61c73bbbe3a11ea057e8c0cb507c4470f00255a1..96ed72095b46019e52855fba8e533cadea2abb17 100644
--- a/l10n/cs_CZ/contacts.po
+++ b/l10n/cs_CZ/contacts.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 08:20+0000\n"
+"Last-Translator: Michal Hrušecký <Michal@hrusecky.net>\n"
 "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Chyba při (de)aktivaci adresáře."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Během přidávání kontaktu nastala chyba."
 
@@ -38,7 +38,7 @@ msgstr "Musí být uveden nejméně jeden z adresních údajů"
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Pokoušíte se přidat duplicitní atribut: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -46,39 +46,35 @@ msgstr "Chyba během přdávání údaje kontaktu."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "ID nezadáno"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Chyba při nastavování kontrolního součtu."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Žádné kategorie nebyly vybrány k smazání."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Žádný adresář nenalezen."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Žádné kontakty nenalezeny."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Chybí ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Chyba při parsování VCard pro ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Nelze přidat adresář s prázdným jménem."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -90,27 +86,27 @@ msgstr "Chyba při aktivaci adresáře."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Nebylo nastaveno ID kontaktu."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Chyba při načítání obrázku."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Chyba při načítání fotky kontaktu."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Chyba při ukládání dočasného souboru."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Načítaná fotka je vadná."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "id neni nastaveno."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -122,35 +118,35 @@ msgstr "Chyba při odstraňování údaje kontaktu."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Chybí ID kontaktu."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Chybí id kontaktu."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Žádná fotka nebyla nahrána."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Soubor neexistuje:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "jméno elementu není nastaveno."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "kontrolní součet není nastaven."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Informace o vCard je nesprávná. Obnovte stránku, prosím."
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Něco se pokazilo. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -158,7 +154,7 @@ msgstr "Chyba při aktualizaci údaje kontaktu."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Nelze aktualizovat adresář s prázdným jménem."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -166,33 +162,33 @@ msgstr "Chyba při aktualizaci adresáře."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Chyba při nahrávání kontaktů do úložiště."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Nevyskytla se žádná chyba, soubor byl úspěšně nahrán"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Nahrávaný soubor překračuje nastavení upload_max_filesize directive v php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Nahrávaný soubor překračuje nastavení MAX_FILE_SIZE z voleb HTML formuláře"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Nahrávaný soubor se nahrál pouze z části"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Žádný soubor nebyl nahrán"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Chybí dočasný adresář"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -200,7 +196,7 @@ msgstr "Kontakty"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adresář nenalezen."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -249,7 +245,7 @@ msgstr "Hlas"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Zpráva"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -265,11 +261,11 @@ msgstr "Pager"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Narozeniny {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -285,7 +281,7 @@ msgstr "Adresáře"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Nastavit adresáře"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -293,7 +289,7 @@ msgstr "Nový adresář"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importovat z VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -324,23 +320,23 @@ msgstr "Odstranit kontakt"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Přetáhněte sem fotku pro její nahrání"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně oddelené čárkami"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Upravit podrobnosti jména"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Přezdívka"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Zadejte přezdívku"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -348,19 +344,19 @@ msgstr "Narozeniny"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd. mm. yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Skupiny"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Oddělte skupiny čárkami"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Upravit skupiny"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -368,47 +364,47 @@ msgstr "Preferovaný"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Prosím zadejte platnou e-mailovou adresu"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Zadat e-mailovou adresu"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Odeslat na adresu"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Smazat e-mail"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Zadat telefoní číslo"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Smazat telefoní číslo"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Zobrazit na mapě"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Upravit podrobnosti adresy"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Zde můžete připsat poznámky."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Přidat políčko"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profilová fotka"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -416,27 +412,27 @@ msgstr "Telefon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Poznámka"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Smazat současnou fotku"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Upravit současnou fotku"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Nahrát novou fotku"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Vybrat fotku z ownCloudu"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Upravit adresu"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -479,7 +475,7 @@ msgstr "Země"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Upravit kategorie"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -491,11 +487,11 @@ msgstr "Adresář"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Tituly před"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Slečna"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
@@ -503,43 +499,43 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Pan"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Sir"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Paní"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Křestní jméno"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Další jména"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Příjmení"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Tituly za"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "JUDr."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "MUDr."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
@@ -551,19 +547,19 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "ml."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "st."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -596,76 +592,76 @@ msgstr "Storno"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importovat soubor kontaktů"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Prosím zvolte adresář"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "vytvořit nový adresář"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Jméno nového adresáře"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Import"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importování kontaktů"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontakty úspěšně importovány"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Zavírací dialog"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importovat adresář"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Vyberte adresář do kterého chcete importovat:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Pro import kontaktů sem přetáhněte soubor VCF"
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Vybrat z disku"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Nemáte žádné kontakty v adresáři."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Přidat kontakt"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Nastavit adresář"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Adresa pro synchronizaci pomocí CardDAV:"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "víc informací"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Hlavní adresa (Kontakt etc)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/cs_CZ/core.po b/l10n/cs_CZ/core.po
index 55a0b91919fe0f7cf963b54c2328cf9a974bb453..baf8d5f7c9ac9d26b538aa0f031d61ae161be8ac 100644
--- a/l10n/cs_CZ/core.po
+++ b/l10n/cs_CZ/core.po
@@ -5,13 +5,14 @@
 # Translators:
 # Jan Krejci <krejca85@gmail.com>, 2011.
 # Martin  <fireball@atlas.cz>, 2011, 2012.
+# Michal Hrušecký <Michal@hrusecky.net>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 20:06+0000\n"
+"Last-Translator: Michal Hrušecký <Michal@hrusecky.net>\n"
 "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +22,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Jméno aplikace nezadáno."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Žádná kategorie k přidání?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Tato kategorie již existuje:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -37,7 +38,7 @@ msgstr "Reset hesla Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Reset hesla pro ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -102,7 +103,7 @@ msgstr "Nápověda"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Přístup odmítnut"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +111,11 @@ msgstr "Cloud nebyl nalezen"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Upravit kategorie"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Přidat"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,7 +162,7 @@ msgstr "Hostitel databáze"
 msgid "Finish setup"
 msgstr "Dokončit instalaci"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "webové služby pod Vaší kontrolou"
 
diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po
index 28ecf948eba49418ca698f3e701624d79f4322ba..fed33acacdddb2ef9cbdacd460a45b8438954a1f 100644
--- a/l10n/cs_CZ/files.po
+++ b/l10n/cs_CZ/files.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 # Martin  <fireball@atlas.cz>, 2011, 2012.
+# Michal Hrušecký <Michal@hrusecky.net>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 21:11+0000\n"
+"Last-Translator: Michal Hrušecký <Michal@hrusecky.net>\n"
 "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +47,7 @@ msgstr "Chybí adresář pro sočasné soubory"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Zápis na disk se nezdařil"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +55,7 @@ msgstr "Soubory"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Nastavení chování k souborům"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +63,23 @@ msgstr "Maximální velikost ukládaných souborů"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "největší možná:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Potřeba pro vícesoborvé stahování a stahování adresářů"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Povolit ZIP-stahování"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 znamená bez omezení"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Maximální velikost vstupu pro ZIP soubory"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +95,7 @@ msgstr "Adresář"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Z url"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +103,7 @@ msgstr "Uložit"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Zrušit upload"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +115,7 @@ msgstr "Název"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Sdílet"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +131,7 @@ msgstr "Změněno"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Smazat vše"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +149,8 @@ msgstr "Soubory, které se snažíte uložit, překračují maximální velikost
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Soubory se prohledávají, prosím čekejte."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Aktuální prohledávání"
diff --git a/l10n/cs_CZ/gallery.po b/l10n/cs_CZ/gallery.po
index bbb2d426e0d0d4e5146a8bdd34c9355c4505fdfc..e2c673cceca832cd2e4104e2a38b3746da28f721 100644
--- a/l10n/cs_CZ/gallery.po
+++ b/l10n/cs_CZ/gallery.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-12 15:21+0000\n"
+"Last-Translator: Michal Hrušecký <Michal@hrusecky.net>\n"
 "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +22,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Obrázky"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -30,15 +30,15 @@ msgstr "Znovu prohledat"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Zastavit"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Sdílet"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Nastavení"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -46,16 +46,16 @@ msgstr "Zpět"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Potvrzení odebrání"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Chcete odstranit album?"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Změnit název alba"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Název nového alba"
diff --git a/l10n/cs_CZ/settings.po b/l10n/cs_CZ/settings.po
index 905c052777c195af6371ee7efb6adb8080c32c19..4852d3dfe6fe2664a0d786b6aac6b2be63e9ae4a 100644
--- a/l10n/cs_CZ/settings.po
+++ b/l10n/cs_CZ/settings.po
@@ -11,10 +11,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-12 16:13+0000\n"
+"Last-Translator: Michal Hrušecký <Michal@hrusecky.net>\n"
 "Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -45,15 +45,15 @@ msgstr "Česky"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Log"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Více"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Přidat vaší aplikaci"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -69,11 +69,11 @@ msgstr "podle"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentace"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Spravování velkých souborů"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -101,11 +101,11 @@ msgstr "z dostupných"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Klienti pro synchronizaci"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Stáhnout"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -149,7 +149,7 @@ msgstr "Jazyk"
 
 #: templates/personal.php:44
 msgid "Help translate"
-msgstr "Pomoc s překladem"
+msgstr "Pomoci překládat"
 
 #: templates/personal.php:51
 msgid "use this address to connect to your ownCloud in your file manager"
@@ -173,11 +173,11 @@ msgstr "Vytvořit"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Výchozí kvóta"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Jiné"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/da/contacts.po b/l10n/da/contacts.po
index 260499a6f0e5a903868847c5aad9badafafd87ac..03977ebbddcae41db96f400149ab50acd241e7f4 100644
--- a/l10n/da/contacts.po
+++ b/l10n/da/contacts.po
@@ -9,9 +9,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Danish (http://www.transifex.net/projects/p/owncloud/language/da/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Fejl ved (de)aktivering af adressebogen"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Der opstod en fejl ved tilføjelse af kontaktpersonen."
 
@@ -72,10 +72,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/de/calendar.po b/l10n/de/calendar.po
index c798023dcf7e66a56b998fcf397ef32d1568d9b8..863356c4523b5b4ba0f6424195ebe86bf969af08 100644
--- a/l10n/de/calendar.po
+++ b/l10n/de/calendar.po
@@ -10,10 +10,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 16:43+0000\n"
+"Last-Translator: goeck <admin@s-goecker.de>\n"
 "Language-Team: German (http://www.transifex.net/projects/p/owncloud/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,11 +23,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Keine Kalender gefunden"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Keine Termine gefunden"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -55,69 +55,69 @@ msgstr "Kalender"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Geburtstag"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Geschäftlich"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Anruf"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Kunden"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Lieferant"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Urlaub"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideen"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Reise"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubiläum"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Treffen"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Anderes"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Persönlich"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projekte"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Fragen"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Arbeit"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "unbenannt"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -366,7 +366,7 @@ msgstr "Aktive Kalender wählen"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Deine Kalender"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -375,15 +375,15 @@ msgstr "CalDAV-Link"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "geteilte Kalender"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Keine geteilten Kalender"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Kalender teilen"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -400,7 +400,7 @@ msgstr "Löschen"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "Von dir geteilt mit"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -445,23 +445,23 @@ msgstr "Exportieren"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Termininfo"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Wiederholen"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Teilnehmer"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Teilen"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -473,11 +473,11 @@ msgstr "Kategorie"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Kategorien trennen mittels Komma"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategorien ändern"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -598,11 +598,11 @@ msgstr "Neues Ereignis"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Termin öffnen"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Keine Kategorie ausgewählt"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -610,7 +610,7 @@ msgstr "Kategorie auswählen"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "von"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
@@ -638,7 +638,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "erster Wochentag"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -646,24 +646,24 @@ msgstr "Kalender CalDAV Synchronisationsadresse:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Nutzer"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "gewählte Nutzer"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "editierbar"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Gruppen"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "Wähle Gruppen"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "Veröffentlichen"
diff --git a/l10n/de/contacts.po b/l10n/de/contacts.po
index c6de2d7d145d45ac2a5f76ad9f2f4c891fa5a23b..3b1c71d6424ebfa472e4039a7f161f7e52ff07ad 100644
--- a/l10n/de/contacts.po
+++ b/l10n/de/contacts.po
@@ -4,17 +4,19 @@
 # 
 # Translators:
 #   <admin@s-goecker.de>, 2012.
+#   <fh@cbix.de>, 2012.
 #   <georg.stefan.germany@googlemail.com>, 2011.
 # Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
 # Jan-Christoph Borchardt <jan@unhosted.org>, 2011.
+# Michael Krell <m4dmike.mni@gmail.com>, 2012.
 #   <nelsonfritsch@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 17:10+0000\n"
+"Last-Translator: goeck <admin@s-goecker.de>\n"
 "Language-Team: German (http://www.transifex.net/projects/p/owncloud/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -26,7 +28,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "(De-)Aktivierung des Adressbuches fehlgeschlagen"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Erstellen des Kontakts fehlgeschlagen"
 
@@ -40,7 +42,7 @@ msgstr "Mindestens eines der Adressfelder muss ausgefüllt werden."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Versuche, doppelte Eigenschaft hinzuzufügen: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -48,39 +50,35 @@ msgstr "Kontakt ändern fehlgeschlagen"
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Keine ID angegeben"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Fehler beim Setzen der Prüfsumme."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Keine Kategorien zum Löschen ausgewählt."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Keine Adressbücher gefunden."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Keine Kontakte gefunden."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Fehlende ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Fehler beim Einlesen der VCard für die ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Bitte einen Namen für das Adressbuch angeben."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -92,27 +90,27 @@ msgstr "Adressbuchaktivierung fehlgeschlagen"
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Es wurde keine Kontakt-ID übermittelt."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Fehler beim Laden des Bildes."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Fehler beim auslesen des Kontaktfotos."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Fehler beim Speichern der temporären Datei."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Das Kontaktfoto ist fehlerhaft."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ID ist nicht angegeben."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -124,35 +122,35 @@ msgstr "Kontakteigenschaft löschen fehlgeschlagen"
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Keine Kontakt-ID angegeben."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Fehlende Kontakt-ID."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Kein Foto-Pfad übermittelt."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Datei existiert nicht: "
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "Kein Name für das Element angegeben."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "Keine Prüfsumme angegeben."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Irgendwas ist hier so richtig schief gelaufen. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -160,7 +158,7 @@ msgstr "Kontakteigenschaft aktualisieren fehlgeschlagen"
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Adressbuch kann nicht mir leeren Namen aktualisiert werden."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -168,33 +166,33 @@ msgstr "Adressbuch aktualisieren fehlgeschlagen"
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Übertragen der Kontakte fehlgeschlagen"
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Alles bestens, Datei erfolgreich übertragen."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Datei größer als durch die upload_max_filesize Direktive in php.ini erlaubt"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Datei größer als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Datei konnte nur teilweise übertragen werden"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Keine Datei konnte übertragen werden."
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Kein temporärer Ordner vorhanden"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -202,7 +200,7 @@ msgstr "Kontakte"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adressbuch nicht gefunden."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -251,7 +249,7 @@ msgstr "Anruf"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Mitteilung"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -267,11 +265,11 @@ msgstr "Pager"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Geburtstag von {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -287,7 +285,7 @@ msgstr "Adressbücher"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Adressbücher konfigurieren"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -295,7 +293,7 @@ msgstr "Neues Adressbuch"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Import von VCF Datei"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -326,23 +324,23 @@ msgstr "Kontakt löschen"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Zieh' ein Foto hierher zum hochladen"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts order Rückwärts mit Komma"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Namen ändern"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Spitzname"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Spitznamen angeben"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -350,19 +348,19 @@ msgstr "Geburtstag"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "TT-MM-JJJJ"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Gruppen"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Gruppen mit Komma trennen"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Gruppen editieren"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -370,47 +368,47 @@ msgstr "Bevorzugt"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Bitte eine gültige E-Mail-Adresse angeben."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "E-Mail-Adresse angeben."
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "E-Mail an diese Adresse schreiben"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "E-Mail-Adresse löschen"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Telefonnummer angeben"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Telefonnummer löschen"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Auf Karte anzeigen"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Adressinformationen ändern"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Füge hier Notizen ein."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Feld hinzufügen"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profil Bild"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -418,27 +416,27 @@ msgstr "Telefon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Notiz"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Derzeitiges Foto löschen"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Foto ändern"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Neues Foto hochladen"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Foto aus ownCloud auswählen"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Adresse ändern"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -481,7 +479,7 @@ msgstr "Land"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategorie ändern"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -493,47 +491,47 @@ msgstr "Adressbuch"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Höflichkeitspräfixe"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Frau"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Frau"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Herr"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Herr"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Frau"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Vorname"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Zusätzliche Namen"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Familienname"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Höflichkeitssuffixe"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
@@ -598,47 +596,47 @@ msgstr "Abbrechen"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Kontaktdatei importieren"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Bitte Adressbuch auswählen"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Neues Adressbuch erstellen"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Name des neuen Adressbuchs"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importieren"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Kontakte werden importiert"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontaktimport erfolgreich"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Dialog schließen"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Adressbuch importieren"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Adressbuch, in das importiert werden soll"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Zieh' eine VCF Datei hierher zum Kontaktimport"
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
@@ -646,28 +644,28 @@ msgstr ""
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Du hast keine Kontakte im Adressbuch."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Kontakt hinzufügen"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Adressbücher konfigurieren"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV Sync-Adressen"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "mehr Info"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "primäre Adresse (für Kontact o.ä. Programme)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/de/core.po b/l10n/de/core.po
index ea753ff31d2e75217acd4493c62fa9be5f39a7e0..c1287e768ae2d4c862756739cff64ba2763d2675 100644
--- a/l10n/de/core.po
+++ b/l10n/de/core.po
@@ -10,10 +10,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 07:32+0000\n"
+"Last-Translator: goeck <admin@s-goecker.de>\n"
 "Language-Team: German (http://www.transifex.net/projects/p/owncloud/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,15 +23,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Applikationsname nicht angegeben"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Keine Kategorie hinzufügen?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Kategorie existiert bereits:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -39,7 +39,7 @@ msgstr "OwnCloud Passwort zurücksetzen"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud Passwort zurücksetzen"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -104,7 +104,7 @@ msgstr "Hilfe"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Zugang verboten"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -112,11 +112,11 @@ msgstr "Cloud nicht verfügbar"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategorien ändern"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Hinzufügen"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -163,7 +163,7 @@ msgstr "Datenbank-Host"
 msgid "Finish setup"
 msgstr "Installation abschließen"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "web services under your control"
 
diff --git a/l10n/de/files.po b/l10n/de/files.po
index 690cc5bd5bf76a9a6879398d912fd6f61be7fdc8..d2126f7d1435b1937150087c18cddbde924c9f1e 100644
--- a/l10n/de/files.po
+++ b/l10n/de/files.po
@@ -6,14 +6,16 @@
 #   <admin@s-goecker.de>, 2012.
 # Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
 # Jan-Christoph Borchardt <jan@unhosted.org>, 2011.
+# Michael Krell <m4dmike.mni@gmail.com>, 2012.
 #   <nelsonfritsch@gmail.com>, 2012.
+# Thomas Müller <>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 16:55+0000\n"
+"Last-Translator: goeck <admin@s-goecker.de>\n"
 "Language-Team: German (http://www.transifex.net/projects/p/owncloud/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -49,7 +51,7 @@ msgstr "Temporärer Ordner fehlt."
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Fehler beim Schreiben auf Festplatte"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -65,23 +67,23 @@ msgstr "Maximale Größe"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "maximal möglich:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Für Mehrfachdateien- und Ordnerupload benötigt:"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "ZIP-Download aktivieren"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 bedeutet unbegrenzt"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Maximale Größe für ZIP Dateien"
 
 #: templates/index.php:7
 msgid "New"
@@ -97,7 +99,7 @@ msgstr "Ordner"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Von der URL"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -105,7 +107,7 @@ msgstr "Hochladen"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Upload abbrechen"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -117,7 +119,7 @@ msgstr "Name"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Teilen"
 
 #: templates/index.php:51
 msgid "Download"
@@ -133,7 +135,7 @@ msgstr "Bearbeitet"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Alle löschen"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -151,8 +153,8 @@ msgstr "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Serv
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Daten werden gescannt, bitte warten."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Scannen"
diff --git a/l10n/de/gallery.po b/l10n/de/gallery.po
index 9d1bc42901171c98c6b71abc6f99bfe5423f067b..09a14f9b753a77757cb3fce662e7d41440c3962a 100644
--- a/l10n/de/gallery.po
+++ b/l10n/de/gallery.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 07:29+0000\n"
+"Last-Translator: goeck <admin@s-goecker.de>\n"
 "Language-Team: German (http://www.transifex.net/projects/p/owncloud/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Bilder"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -29,15 +29,15 @@ msgstr "Rescan"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Stopp"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Teilen"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Einstellungen"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -45,16 +45,16 @@ msgstr "Zurück"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Bestätigung entfernen"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Soll das Album entfernt werden"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Albumname ändern"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Neuer Albumname"
diff --git a/l10n/de/settings.po b/l10n/de/settings.po
index e358815c1c64c029ff7bbd102394905190541c14..89f37949772c5125bd46c18668f6579060d98d88 100644
--- a/l10n/de/settings.po
+++ b/l10n/de/settings.po
@@ -10,10 +10,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 07:34+0000\n"
+"Last-Translator: goeck <admin@s-goecker.de>\n"
 "Language-Team: German (http://www.transifex.net/projects/p/owncloud/language/de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,15 +44,15 @@ msgstr "Deutsch"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Log"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "mehr"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Füge deine App hinzu"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -68,11 +68,11 @@ msgstr "von"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentation"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "große Dateien verwalten"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -100,11 +100,11 @@ msgstr "der verfügbaren"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Desktop und mobile Syncing Clienten"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Download"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -172,11 +172,11 @@ msgstr "Anlegen"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Standard Quota"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "andere"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/el/calendar.po b/l10n/el/calendar.po
index da609ae7f7b5eb29cdd0c8f162dd7163d8239155..ae438dca154535f61ed15ad28c2e48f9be813fd0 100644
--- a/l10n/el/calendar.po
+++ b/l10n/el/calendar.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 08:20+0000\n"
+"Last-Translator: Marios Bekatoros <>\n"
 "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/language/el/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,11 +22,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Δε βρέθηκαν ημερολόγια."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Δε βρέθηκαν γεγονότα."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -52,71 +52,71 @@ msgstr "Ημερολόγιο"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Γενέθλια"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Επιχείρηση"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Κλήση"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Πελάτες"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Παραδώσας"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Διακοπές"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ιδέες"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Ταξίδι"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Γιορτή"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Συνάντηση"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Άλλο"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Προσωπικό"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Έργα"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Ερωτήσεις"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Εργασία"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "ανώνυμο"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -357,7 +357,7 @@ msgstr "Ημερολόγια"
 
 #: templates/calendar.php:67
 msgid "There was a fail, while parsing the file."
-msgstr "Υπήρξε μια αποτυχία, κατά την αξιολόγηση του αρχείου."
+msgstr "Υπήρξε μια αποτυχία, κατά την σάρωση του αρχείου."
 
 #: templates/part.choosecalendar.php:1
 msgid "Choose active calendars"
@@ -365,7 +365,7 @@ msgstr "Επιλέξτε τα ενεργά ημερολόγια"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Τα ημερολόγια σου"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -374,15 +374,15 @@ msgstr "Σύνδεση CalDAV"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Κοινόχρηστα ημερολόγια"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Δεν υπάρχουν κοινόχρηστα ημερολόγια"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Διαμοίρασε ένα ημερολόγιο"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -399,7 +399,7 @@ msgstr "Διαγραφή"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "μοιράστηκε μαζί σας από "
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -444,23 +444,23 @@ msgstr "Εξαγωγή"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Πληροφορίες γεγονότος"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Επαναλαμβανόμενο"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Ειδοποίηση"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Συμμετέχοντες"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Διαμοίρασε"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -472,11 +472,11 @@ msgstr "Κατηγορία"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Διαχώρισε τις κατηγορίες με κόμμα"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Επεξεργασία κατηγοριών"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -597,11 +597,11 @@ msgstr "Δημιουργήστε ένα νέο συμβάν"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Εμφάνισε ένα γεγονός"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Δεν επελέγησαν  κατηγορίες"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -609,11 +609,11 @@ msgstr "Επιλέξτε κατηγορία"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "του"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "στο"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -637,7 +637,7 @@ msgstr "12ω"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Πρώτη μέρα της εβδομάδας"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -645,24 +645,24 @@ msgstr "Διεύθυνση για το συγχρονισμού του ημερ
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Χρήστες"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "επέλεξε χρήστες"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Επεξεργάσιμο"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Ομάδες"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "Επέλεξε ομάδες"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "κάνε το δημόσιο"
diff --git a/l10n/el/contacts.po b/l10n/el/contacts.po
index cf8345a8443828ce69be86f5bddf52289de7fa9b..11c4beb7b548c91c4d3a72f2e8c868a15aff02c4 100644
--- a/l10n/el/contacts.po
+++ b/l10n/el/contacts.po
@@ -10,9 +10,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/language/el/)\n"
 "MIME-Version: 1.0\n"
@@ -25,7 +25,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Σφάλμα κατά την προσθήκη επαφής."
 
@@ -39,7 +39,7 @@ msgstr "Πρέπει να συμπληρωθεί τουλάχιστον ένα 
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -47,39 +47,35 @@ msgstr "Σφάλμα προσθήκης ιδιότητας επαφής."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Δε δώθηκε ID"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Λάθος κατά τον ορισμό checksum "
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Δε επελέγησαν κατηγορίες για διαγραφή"
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Δε βρέθηκε βιβλίο διευθύνσεων"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Δεν βρέθηκαν επαφές"
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Λείπει ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Σφάλμα κατά την ανάγνωση του VCard για το ID:\""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Δε μπορεί να προστεθεί βιβλίο διευθύνσεων με κενό όνομα"
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -91,27 +87,27 @@ msgstr "Σφάλμα ενεργοποίησης βιβλίου διευθύνσ
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Δε υπεβλήθει ID επαφής"
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Σφάλμα φόρτωσης εικόνας"
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Σφάλμα ανάγνωσης εικόνας επαφής"
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Σφάλμα αποθήκευσης προσωρινού αρχείου"
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Η φορτωμένη φωτογραφία δεν είναι έγκυρη"
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "δεν ορίστηκε id"
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -123,35 +119,35 @@ msgstr "Σφάλμα διαγραφής ιδιότητας επαφής."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Λείπει ID επαφής"
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Απουσιαζει ID επαφής"
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Δε δόθηκε διαδρομή εικόνας"
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Το αρχείο δεν υπάρχει:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "δεν ορίστηκε όνομα στοιχείου"
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "δε ορίστηκε checksum "
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα:"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Κάτι χάθηκε στο άγνωστο"
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -159,7 +155,7 @@ msgstr "Σφάλμα ενημέρωσης ιδιότητας επαφής."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα"
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -167,33 +163,33 @@ msgstr "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Σφάλμα κατά την αποθήκευση επαφών"
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Δεν υπάρχει σφάλμα, το αρχείο ανέβηκε με επιτυχία "
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Το μέγεθος του αρχείου ξεπερνάει το upload_max_filesize του php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Το ανεβασμένο αρχείο υπερβαίνει το MAX_FILE_SIZE που ορίζεται στην  HTML φόρμα"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Το αρχείο ανέβηκε μερικώς"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Δεν ανέβηκε κάποιο αρχείο"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Λείπει ο προσωρινός φάκελος"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -201,7 +197,7 @@ msgstr "Επαφές"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Δε βρέθηκε βιβλίο διευθύνσεων"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -250,7 +246,7 @@ msgstr "Ομιλία"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Μήνυμα "
 
 #: lib/app.php:120
 msgid "Fax"
@@ -266,11 +262,11 @@ msgstr "Βομβητής"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Διαδίκτυο"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name} έχει Γενέθλια"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -286,7 +282,7 @@ msgstr "Βιβλία διευθύνσεων"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Ρυθμίστε το βιβλίο διευθύνσεων "
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -294,7 +290,7 @@ msgstr "Νέο βιβλίο διευθύνσεων"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Εισαγωγή από VCF αρχείο"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -325,23 +321,23 @@ msgstr "Διαγραφή επαφής"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Ρίξε μια φωτογραφία για ανέβασμα"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Αλλάξτε τις λεπτομέρειες ονόματος"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Παρατσούκλι"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Εισάγεται παρατσούκλι"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -349,19 +345,19 @@ msgstr "Γενέθλια"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "ΗΗ-ΜΜ-ΕΕΕΕ"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Ομάδες"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Διαχώρισε τις ομάδες με κόμμα "
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Επεξεργασία ομάδων"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -369,47 +365,47 @@ msgstr "Προτιμώμενο"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Εισήγαγε  διεύθυνση ηλεκτρονικού ταχυδρομείου"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Αποστολή σε διεύθυνση"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Διαγραφή διεύθυνση email"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Εισήγαγε αριθμό τηλεφώνου"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Διέγραψε αριθμό τηλεφώνου"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Προβολή στο χάρτη"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Επεξεργασία λεπτομερειών διεύθυνσης"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Πρόσθεσε τις σημειώσεις εδώ"
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Προσθήκη πεδίου"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Φωτογραφία προφίλ"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -417,27 +413,27 @@ msgstr "Τηλέφωνο"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Σημείωση"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Διαγραφή τρέχουσας φωτογραφίας"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Επεξεργασία τρέχουσας φωτογραφίας"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Ανέβασε νέα φωτογραφία"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Επέλεξε φωτογραφία από το ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Επεξεργασία διεύθυνσης"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -480,7 +476,7 @@ msgstr "Χώρα"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Επεξεργασία κατηγορίας"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -492,79 +488,79 @@ msgstr "Βιβλίο διευθύνσεων"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "προθέματα"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Δις"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Κα"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Κα"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Σερ"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Κα"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Δρ."
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Όνομα"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Επιπλέον ονόματα"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Επώνυμο"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "καταλήξεις"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sn."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -597,76 +593,76 @@ msgstr "Ακύρωση"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Εισαγωγή αρχείου επαφών"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Παρακαλώ επέλεξε βιβλίο διευθύνσεων"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Δημιουργία νέου βιβλίου διευθύνσεων"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Όνομα νέου βιβλίου διευθύνσεων"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Εισαγωγή"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Εισαγωγή επαφών"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Οι επαφές εισήχθησαν επιτυχώς"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Κλείσιμο διαλόγου"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Εισαγωγή βιβλίου διευθύνσεων"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών"
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Επιλογή από HD"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Δεν έχεις επαφές στο βιβλίο διευθύνσεων"
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Προσθήκη επαφής"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Ρύθμισε το βιβλίο διευθύνσεων"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "συγχρονισμός διευθύνσεων μέσω CardDAV "
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "περισσότερες πληροφορίες"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Κύρια διεύθυνση"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/el/core.po b/l10n/el/core.po
index 22fbc0ba12ed2cf6e0413e1620473c42ebc6598a..343b0692cd5ae5289b15b7900294eda976272ec0 100644
--- a/l10n/el/core.po
+++ b/l10n/el/core.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 16:35+0000\n"
+"Last-Translator: Marios Bekatoros <>\n"
 "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/language/el/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,15 +22,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Δε προσδιορίστηκε όνομα εφαρμογής"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Δεν έχετε να προστέσθέσεται μια κα"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Αυτή η κατηγορία υπάρχει ήδη"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -38,7 +38,7 @@ msgstr "Επανέκδοση κωδικού για το Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Επαναφορά κωδικού ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -103,7 +103,7 @@ msgstr "Βοήθεια"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Δεν επιτρέπεται η πρόσβαση"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -111,11 +111,11 @@ msgstr "Δεν βρέθηκε σύννεφο"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Επεξεργασία κατηγορίας"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Προσθήκη"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -162,7 +162,7 @@ msgstr "Διακομιστής βάσης δεδομένων"
 msgid "Finish setup"
 msgstr "Ολοκλήρωση εγκατάστασης"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "Υπηρεσίες web υπό τον έλεγχό σας"
 
diff --git a/l10n/el/files.po b/l10n/el/files.po
index 347a3551e497c3eb847838fb3770856d35a14d7b..c564866ebc1d9c9545438f022b456ffb25ab4d32 100644
--- a/l10n/el/files.po
+++ b/l10n/el/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 16:48+0000\n"
+"Last-Translator: Marios Bekatoros <>\n"
 "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/language/el/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "Λείπει ένας προσωρινός φάκελος"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Η εγγραφή στο δίσκο απέτυχε"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "Αρχεία"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Διαχείριση αρχείων"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "Μέγιστο μέγεθος μεταφόρτωσης"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "μέγιστο δυνατό:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Απαραίτητο για κατέβασμα πολλαπλών αρχείων και φακέλων"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Ενεργοποίηση κατεβάσματος ZIP"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 για απεριόριστο"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Μέγιστο μέγεθος για αρχεία ZIP"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "Φάκελος"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Από την διεύθυνση"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "Μεταφόρτωση"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Ακύρωση ανεβάσματος"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "Όνομα"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Διαμοίρασε"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "Τροποποιήθηκε"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Διαγραφή όλων"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "Τα αρχεία που προσπαθείτε να ανεβάσετε
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Τα αρχεία ανιχνεύονται, παρακαλώ περιμένετε"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Τρέχουσα αναζήτηση "
diff --git a/l10n/el/gallery.po b/l10n/el/gallery.po
index 833e0503e10d65dd6cfa5cea152694f18b004e60..85d5d3d4040d36db70a27fd94a28f96c400e2391 100644
--- a/l10n/el/gallery.po
+++ b/l10n/el/gallery.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 # Efstathios Iosifidis <iosifidis@opensuse.org>, 2012.
+# Marios Bekatoros <>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 06:56+0000\n"
+"Last-Translator: Marios Bekatoros <>\n"
 "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/language/el/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Εικόνες"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +29,15 @@ msgstr "Επανασάρωση"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Σταμάτησε"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Κοινοποίησε"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Ρυθμίσεις"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +45,16 @@ msgstr "Επιστροφή"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Αφαίρεση επιβεβαίωσης"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Θέλετε να αφαιρέσετε το άλμπουμ"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Αλλάξτε το όνομα του άλμπουμ"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Νέο όνομα άλμπουμ"
diff --git a/l10n/el/settings.po b/l10n/el/settings.po
index b2fd19d300820d4add1a78e5b9d15de38e613a6c..f757374f53d49ae2571ad57ad9f39cbfbb2ba7d4 100644
--- a/l10n/el/settings.po
+++ b/l10n/el/settings.po
@@ -11,10 +11,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 23:36+0000\n"
+"Last-Translator: Dimitris M. <monopatis@gmail.com>\n"
 "Language-Team: Greek (http://www.transifex.net/projects/p/owncloud/language/el/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -45,15 +45,15 @@ msgstr "__όνομα_γλώσσας__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Αρχείο καταγραφής"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Περισσότερο"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Πρόσθεσε τη δικιά σου εφαρμογή "
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -69,11 +69,11 @@ msgstr "από"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Τεκμηρίωση"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Διαχείριση μεγάλων αρχείων"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -101,11 +101,11 @@ msgstr "από τα διαθέσιμα"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Πελάτες συγχρονισμού για Desktop και Mobile"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Κατέβασε"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -141,7 +141,7 @@ msgstr "Διεύθυνση ηλεκτρονικού ταχυδρομείου σ
 
 #: templates/personal.php:32
 msgid "Fill in an email address to enable password recovery"
-msgstr "Συμπληρώστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου για να ενεργοποιηθεί ή ανάκτηση κωδικού πρόσβασης"
+msgstr "Συμπληρώστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου για να ενεργοποιηθεί η ανάκτηση κωδικού πρόσβασης"
 
 #: templates/personal.php:38 templates/personal.php:39
 msgid "Language"
@@ -173,11 +173,11 @@ msgstr "Δημιουργία"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Προεπιλεγμένο όριο"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Άλλα"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/eo/calendar.po b/l10n/eo/calendar.po
index 12ed52f9c406bff6235ed56830cb642f4c215dcc..6b95d99dfb07072e3610bca15a53cf8deef51d43 100644
--- a/l10n/eo/calendar.po
+++ b/l10n/eo/calendar.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 22:05+0000\n"
+"Last-Translator: mctpyt <mstreet@kde.org.ar>\n"
 "Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/language/eo/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +20,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Neniu kalendaro troviĝis."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Neniu okazaĵo troviĝis."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -50,71 +50,71 @@ msgstr "Kalendaro"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "d MMM[ yyyy]{ '&#8212;'d[ MMM] yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Naskiĝotago"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Negoco"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Voko"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Klientoj"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Livero"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Ferioj"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideoj"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Vojaĝo"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubileo"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Rendevuo"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Alia"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Persona"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projektoj"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Demandoj"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Laboro"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "nenomita"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -130,7 +130,7 @@ msgstr "Semajne"
 
 #: lib/object.php:333
 msgid "Every Weekday"
-msgstr "Tage"
+msgstr "Labortage"
 
 #: lib/object.php:334
 msgid "Bi-Weekly"
@@ -363,7 +363,7 @@ msgstr "Elektu aktivajn kalendarojn"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Viaj kalendaroj"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -372,15 +372,15 @@ msgstr "CalDav-a ligilo"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Kunhavigitaj kalendaroj"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Neniu kunhavigita kalendaro"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Kunhavigi kalendaron"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -397,7 +397,7 @@ msgstr "Forigi"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "kunhavigita kun vi fare de"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -442,23 +442,23 @@ msgstr "Elporti"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Informo de okazaĵo"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Ripetata"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarmo"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Ĉeestontoj"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Kunhavigi"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -470,11 +470,11 @@ msgstr "Kategorio"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Disigi kategoriojn per komoj"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Redakti kategoriojn"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -498,7 +498,7 @@ msgstr "Loko"
 
 #: templates/part.eventform.php:83
 msgid "Location of the Event"
-msgstr "Okazaĵoloko"
+msgstr "Loko de okazaĵo"
 
 #: templates/part.eventform.php:89 templates/part.showevent.php:88
 msgid "Description"
@@ -595,11 +595,11 @@ msgstr "Krei okazaĵon"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Vidi okazaĵon"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Neniu kategorio elektita"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -607,11 +607,11 @@ msgstr "Elekti kategorion"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "de"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "ĉe"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -635,7 +635,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Unua tago de la semajno"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,24 +643,24 @@ msgstr "Adreso de kalendarosinkronigo per CalDAV:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Uzantoj"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "elekti uzantojn"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Redaktebla"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Grupoj"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "elekti grupojn"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "publikigi"
diff --git a/l10n/eo/contacts.po b/l10n/eo/contacts.po
index 11c7bd31cda65edf0a1f71fd07a564e4f5c96553..f9ab4efffb593ba5259d283f341c73e9883f5a76 100644
--- a/l10n/eo/contacts.po
+++ b/l10n/eo/contacts.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 22:35+0000\n"
+"Last-Translator: mctpyt <mstreet@kde.org.ar>\n"
 "Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/language/eo/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Eraro dum (mal)aktivigo de adresaro."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Eraro okazis dum aldono de kontakto."
 
@@ -36,7 +36,7 @@ msgstr "Almenaŭ unu el la adreskampoj necesas pleniĝi."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Provante aldoni duobligitan propraĵon:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -44,7 +44,7 @@ msgstr "Eraro dum aldono de kontaktopropraĵo."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Neniu identigilo proviziĝis."
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
@@ -52,31 +52,27 @@ msgstr ""
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Neniu kategorio elektiĝis por forigi."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Neniu adresaro troviĝis."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Neniu kontakto troviĝis."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Mankas identigilo"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Eraro dum analizo de VCard por identigilo:"
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Ne eblas aldoni adresaron kun malplena nomo."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +84,27 @@ msgstr "Eraro dum aktivigo de adresaro."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Neniu kontaktidentigilo sendiĝis."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Eraro dum ŝargado de bildo."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Eraro dum lego de kontakta foto."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Eraro dum konservado de provizora dosiero."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "La alŝutata foto ne validas."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "identigilo ne agordiĝis."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,23 +116,23 @@ msgstr "Eraro dum forigo de kontaktopropraĵo."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Kontaktidentigilo mankas."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Mankas kontaktidentigilo."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Neniu vojo al foto sendiĝis."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Dosiero ne ekzistas:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "eronomo ne agordiĝis."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
@@ -148,7 +144,7 @@ msgstr ""
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Io FUBAR-is."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -156,7 +152,7 @@ msgstr "Eraro dum ĝisdatigo de kontaktopropraĵo."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Ne eblas ĝisdatigi adresaron kun malplena nomo."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -168,7 +164,7 @@ msgstr ""
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Ne estas eraro, la dosiero alŝutiĝis sukcese."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
@@ -182,15 +178,15 @@ msgstr ""
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "la alŝutita dosiero nur parte alŝutiĝis"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Neniu dosiero alŝutiĝis."
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Mankas provizora dosierujo."
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +194,7 @@ msgstr "Kontaktoj"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adresaro ne troviĝis."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +243,7 @@ msgstr "Voĉo"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Mesaĝo"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +259,11 @@ msgstr "Televokilo"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Interreto"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Naskiĝtago de {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +279,7 @@ msgstr "Adresaroj"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Agordi adresarojn"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +287,7 @@ msgstr "Nova adresaro"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Enporti el VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,23 +318,23 @@ msgstr "Forigi kontakton"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Demeti foton por alŝuti"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Redakti detalojn de nomo"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Kromnomo"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Enigu kromnomon"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +342,19 @@ msgstr "Naskiĝotago"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "yyyy-mm-dd"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Grupoj"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Disigi grupojn per komoj"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Redakti grupojn"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,43 +362,43 @@ msgstr "Preferata"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Bonvolu specifi validan retpoŝtadreson."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Enigi retpoŝtadreson"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Retpoŝtmesaĝo al adreso"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Forigi retpoŝþadreson"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Enigi telefonnumeron"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Forigi telefonnumeron"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Vidi en mapo"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Redakti detalojn de adreso"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Aldoni notojn ĉi tie."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Aldoni kampon"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
@@ -414,27 +410,27 @@ msgstr "Telefono"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Noto"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Forigi nunan foton"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Redakti nunan foton"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Alŝuti novan foton"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Elekti foton el ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Redakti adreson"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +473,7 @@ msgstr "Lando"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Redakti kategoriojn"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -517,7 +513,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Persona nomo"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
@@ -525,7 +521,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Familia nomo"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
@@ -594,39 +590,39 @@ msgstr "Nuligi"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Enporti kontaktodosieron"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Bonvolu elekti adresaron"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "krei novan adresaron"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Nomo de nova adresaro"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Enporti"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Enportante kontaktojn"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontaktoj enportiĝis sukcese"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Fermi dialogon"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Enporti adresaron"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
diff --git a/l10n/eo/files.po b/l10n/eo/files.po
index abaa587b400f404207a565ddf942cbfce95b6a59..e51a5621f5bd9bcd78551918a3f02e85a1821e5a 100644
--- a/l10n/eo/files.po
+++ b/l10n/eo/files.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 22:16+0000\n"
+"Last-Translator: mctpyt <mstreet@kde.org.ar>\n"
 "Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/language/eo/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +46,7 @@ msgstr "Mankas tempa dosierujo"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Malsukcesis skribo al disko"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +54,7 @@ msgstr "Dosieroj"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Dosieradministro"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +62,23 @@ msgstr "Maksimuma alŝutogrando"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "maks. ebla: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Necesa por elŝuto de pluraj dosieroj kaj dosierujoj."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Kapabligi ZIP-elŝuton"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 signifas senlime"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Maksimuma enirgrando por ZIP-dosieroj"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +94,7 @@ msgstr "Dosierujo"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "El URL"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +102,7 @@ msgstr "Alŝuti"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Nuligi alŝuton"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +114,7 @@ msgstr "Nomo"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Kunhavigi"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +130,7 @@ msgstr "Modifita"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Forigi ĉion"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +148,8 @@ msgstr "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon p
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Dosieroj estas skanataj, bonvolu atendi."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Nuna skano"
diff --git a/l10n/eo/media.po b/l10n/eo/media.po
index 7e7b99e47b1bc1eecb3a414b4c2ddd6001bda14b..ebae5495d2c5dadf457c63515be5b4c4af498187 100644
--- a/l10n/eo/media.po
+++ b/l10n/eo/media.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Michael Moroni <haikara90@gmail.com>, 2012.
 #   <mstreet@kde.org.ar>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-02-14 09:15+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 13:20+0000\n"
+"Last-Translator: Michael Moroni <haikara90@gmail.com>\n"
 "Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/language/eo/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,25 +19,25 @@ msgstr ""
 "Language: eo\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: appinfo/app.php:32 templates/player.php:9
+#: appinfo/app.php:32 templates/player.php:8
 msgid "Music"
 msgstr "Muziko"
 
-#: templates/music.php:3 templates/player.php:13
+#: templates/music.php:3 templates/player.php:12
 msgid "Play"
 msgstr "Ludi"
 
-#: templates/music.php:4 templates/music.php:26 templates/player.php:14
+#: templates/music.php:4 templates/music.php:26 templates/player.php:13
 msgid "Pause"
-msgstr "Paŭzi"
+msgstr "Paŭzigi"
 
 #: templates/music.php:5
 msgid "Previous"
-msgstr "Maljena"
+msgstr "Antaŭa"
 
-#: templates/music.php:6 templates/player.php:15
+#: templates/music.php:6 templates/player.php:14
 msgid "Next"
-msgstr "Jena"
+msgstr "Sekva"
 
 #: templates/music.php:7
 msgid "Mute"
@@ -52,7 +53,7 @@ msgstr "Reskani la aron"
 
 #: templates/music.php:37
 msgid "Artist"
-msgstr "Verkinto"
+msgstr "Artisto"
 
 #: templates/music.php:38
 msgid "Album"
diff --git a/l10n/eo/settings.po b/l10n/eo/settings.po
index 4e2c5d79e0a963c92493fa69d639f31e5f2a30ae..a3cfe311beda504c4a31b7455b9b1f06eec47bdb 100644
--- a/l10n/eo/settings.po
+++ b/l10n/eo/settings.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 22:11+0000\n"
+"Last-Translator: mctpyt <mstreet@kde.org.ar>\n"
 "Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/language/eo/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -41,15 +41,15 @@ msgstr "Esperanto"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Registro"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Pli"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Aldonu vian aplikaĵon"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -65,11 +65,11 @@ msgstr "de"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentaro"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Administrante grandajn dosierojn"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -97,11 +97,11 @@ msgstr "el la disponeblaj"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Labortablaj kaj porteblaj sinkronigoklientoj"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Elŝuti"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -169,11 +169,11 @@ msgstr "Krei"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Defaŭlta kvoto"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Alia"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/es/calendar.po b/l10n/es/calendar.po
index be4486e0f6831b8031a331917ce4d70b36113c3a..77ae9d0ad9e8e781331fbf687c05cc1832ba8026 100644
--- a/l10n/es/calendar.po
+++ b/l10n/es/calendar.po
@@ -5,14 +5,15 @@
 # Translators:
 # Javier Llorente <javier@opensuse.org>, 2012.
 #   <juanma@kde.org.ar>, 2011, 2012.
+# oSiNaReF  <>, 2012.
 #   <sergioballesterossolanas@gmail.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 15:24+0000\n"
+"Last-Translator: Javier Llorente <javier@opensuse.org>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,11 +23,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "No se encontraron calendarios."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "No se encontraron eventos."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -52,71 +53,71 @@ msgstr "Calendario"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Cumpleaños"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Negocios"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Llamada"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Clientes"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Entrega"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Festivos"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideas"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Viaje"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Aniversario"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Reunión"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Otro"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Personal"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Proyectos"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Preguntas"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Trabajo"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "Sin nombre"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -365,7 +366,7 @@ msgstr "Elige los calendarios activos"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Tus calendarios"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -374,15 +375,15 @@ msgstr "Enlace a CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Calendarios compartidos"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Calendarios no compartidos"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Compartir calendario"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -399,7 +400,7 @@ msgstr "Eliminar"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "compartido contigo por"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -444,23 +445,23 @@ msgstr "Exportar"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Información del evento"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Repetición"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarma"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Asistentes"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Compartir"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -472,11 +473,11 @@ msgstr "Categoría"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Separar categorías con comas"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Editar categorías"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -565,7 +566,7 @@ msgstr "Importar un archivo de calendario"
 
 #: templates/part.import.php:6
 msgid "Please choose the calendar"
-msgstr "Elija el calendario"
+msgstr "Por favor elige el calendario"
 
 #: templates/part.import.php:10
 msgid "create a new calendar"
@@ -597,11 +598,11 @@ msgstr "Crear un nuevo evento"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Ver un evento"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Ninguna categoría seleccionada"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -609,11 +610,11 @@ msgstr "Seleccionar categoría"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "de"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "a las"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -637,7 +638,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Primer día de la semana"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -645,24 +646,24 @@ msgstr "Dirección de sincronización de calendario CalDAV:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Usuarios"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "seleccionar usuarios"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Editable"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Grupos"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "seleccionar grupos"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "hacerlo público"
diff --git a/l10n/es/contacts.po b/l10n/es/contacts.po
index 7b9ed6c00519099012d6210be770ca2a666582ef..fb6ad1c86e779814269c542e8ab14602a54a6bd7 100644
--- a/l10n/es/contacts.po
+++ b/l10n/es/contacts.po
@@ -5,13 +5,14 @@
 # Translators:
 # Javier Llorente <javier@opensuse.org>, 2012.
 #   <juanma@kde.org.ar>, 2011, 2012.
+# oSiNaReF  <>, 2012.
 #   <sergioballesterossolanas@gmail.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +25,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Error al (des)activar libreta de direcciones."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Se ha producido un error al añadir el contacto."
 
@@ -38,7 +39,7 @@ msgstr "Al menos uno de los campos de direcciones se tiene que rellenar."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Intentando añadir una propiedad duplicada: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -46,39 +47,35 @@ msgstr "Error al añadir una propiedad del contacto."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "No se ha proporcionado una ID"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Error al establecer la suma de verificación."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "No se seleccionaron categorías para borrar."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "No se encontraron libretas de direcciones."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "No se encontraron contactos."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Falta la ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Error al analizar el VCard para la ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "No se puede añadir una libreta de direcciones sin nombre"
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -90,27 +87,27 @@ msgstr "Error al activar la libreta de direcciones."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "No se ha mandado ninguna ID de contacto."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Error cargando imagen."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Error leyendo fotografía del contacto."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Error al guardar archivo temporal."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "La foto que se estaba cargando no es válida."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "no se ha puesto ninguna ID."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -122,35 +119,35 @@ msgstr "Error al borrar una propiedad del contacto."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Falta la ID del contacto."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Falta la id del contacto."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "No se ha introducido la ruta de la foto."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Archivo inexistente:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "no se ha puesto ningún nombre de elemento."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "no se ha puesto ninguna suma de comprobación."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "La información sobre la vCard es incorrecta. Por favor, recarga la página:"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Plof. Algo ha fallado."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -158,7 +155,7 @@ msgstr "Error al actualizar una propiedad del contacto."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "No se puede actualizar una libreta de direcciones sin nombre."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -166,33 +163,33 @@ msgstr "Error al actualizar la libreta de direcciones."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Error al subir contactos al almacenamiento."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "No hay ningún error, el archivo se ha subido con éxito"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "El archivo subido sobrepasa la directiva upload_max_filesize de php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "El archivo subido sobrepasa la directiva MAX_FILE_SIZE especificada en el formulario HTML"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "El archivo se ha subido parcialmente"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "No se ha subido ningún archivo"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Falta la carpeta temporal"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -200,7 +197,7 @@ msgstr "Contactos"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Libreta de direcciones no encontrada."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -249,7 +246,7 @@ msgstr "Voz"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Mensaje"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -265,11 +262,11 @@ msgstr "Localizador"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Cumpleaños de {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -285,7 +282,7 @@ msgstr "Libretas de direcciones"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Configurar libretas de direcciones"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -293,7 +290,7 @@ msgstr "Nueva libreta de direcciones"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importar desde VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -324,23 +321,23 @@ msgstr "Eliminar contacto"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Suelta una foto para subirla"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formato personalizado, nombre abreviado, nombre completo, al revés o al revés con coma"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Editar los detalles del nombre"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Alias"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Introduce un alias"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -348,19 +345,19 @@ msgstr "Cumpleaños"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Grupos"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Separa los grupos con comas"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Editar grupos"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -368,47 +365,47 @@ msgstr "Preferido"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Por favor especifica una dirección de correo electrónico válida."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Introduce una dirección de correo electrónico"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Enviar por correo a la dirección"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Eliminar dirección de correo electrónico"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Introduce un número de teléfono"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Eliminar número de teléfono"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Ver en el mapa"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Editar detalles de la dirección"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Añade notas aquí."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Añadir campo"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Foto del perfil"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -416,27 +413,27 @@ msgstr "Teléfono"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Nota"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Eliminar fotografía actual"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Editar fotografía actual"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Subir nueva fotografía"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Seleccionar fotografía desde ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Editar dirección"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -479,7 +476,7 @@ msgstr "País"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Editar categorías"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -491,79 +488,79 @@ msgstr "Libreta de direcciones"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Prefijos honoríficos"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Srta"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Sra."
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Sr."
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Señor"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Sra"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Nombre"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Nombres adicionales"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Apellido"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Sufijos honoríficos"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Don"
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sn."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -596,76 +593,76 @@ msgstr "Cancelar"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importar archivo de contactos"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Por favor escoge la agenda"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "crear una nueva agenda"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Nombre de la nueva agenda"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importar"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importando contactos"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Contactos importados correctamente"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Cerrar Diálogo"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importar agenda"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Selecciona una agenda para importar a:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Suelta un archivo VCF para importar contactos."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Seleccionar del disco duro"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "No hay contactos en tu agenda."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Añadir contacto"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Configurar agenda"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Sincronizando direcciones"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "más información"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Dirección primaria (Kontact et al)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/es/core.po b/l10n/es/core.po
index fb0b4218f3a9cf74b573c5eeb894a31cdd7d49d1..e5c8d5775b632438637818938bedf5e3b3eedba6 100644
--- a/l10n/es/core.po
+++ b/l10n/es/core.po
@@ -5,15 +5,16 @@
 # Translators:
 # Javier Llorente <javier@opensuse.org>, 2012.
 #   <juanma@kde.org.ar>, 2011, 2012.
+# oSiNaReF  <>, 2012.
 #   <rom1dep@gmail.com>, 2011.
 #   <sergioballesterossolanas@gmail.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 15:32+0000\n"
+"Last-Translator: Javier Llorente <javier@opensuse.org>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,15 +24,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Nombre de la aplicación no provisto."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "¿Ninguna categoría para agregar?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Esta categoría ya existe: "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -39,7 +40,7 @@ msgstr "Restablecer contraseña de ownCloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Reiniciar contraseña de ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -104,7 +105,7 @@ msgstr "Ayuda"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Acceso denegado"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -112,11 +113,11 @@ msgstr "No se ha encontrado la nube"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Editar categorías"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Añadir"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -141,7 +142,7 @@ msgstr "Configurar la base de datos"
 #: templates/installation.php:49 templates/installation.php:60
 #: templates/installation.php:70
 msgid "will be used"
-msgstr "serán utilizados"
+msgstr "se utilizarán"
 
 #: templates/installation.php:82
 msgid "Database user"
@@ -163,7 +164,7 @@ msgstr "Host de la base de datos"
 msgid "Finish setup"
 msgstr "Completar la instalación"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "servicios web bajo tu control"
 
@@ -189,7 +190,7 @@ msgstr "Entrar"
 
 #: templates/logout.php:1
 msgid "You are logged out."
-msgstr "Has cerrado sesión."
+msgstr "Has cerrado la sesión."
 
 #: templates/part.pagenavi.php:3
 msgid "prev"
diff --git a/l10n/es/files.po b/l10n/es/files.po
index 3bb14520d8dc50217cb51915fbccc5d59f897013..dbedafbf25b362528b1f8dc2ef296ae081b90ae2 100644
--- a/l10n/es/files.po
+++ b/l10n/es/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 15:34+0000\n"
+"Last-Translator: Javier Llorente <javier@opensuse.org>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "Falta un directorio temporal"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "La escritura en disco ha fallado"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "Archivos"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Tratamiento de archivos"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "Tamaño máximo de subida"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "máx. posible:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Se necesita para descargas multi-archivo y de carpetas"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Habilitar descarga en ZIP"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 es ilimitado"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Tamaño máximo para archivos ZIP de entrada"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "Carpeta"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Desde la URL"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "Subir"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Cancelar subida"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "Nombre"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Compartir"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "Modificado"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Eliminar todo"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "Los archivos que estás intentando subir sobrepasan el tamaño máximo p
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Se están escaneando los archivos, por favor espere."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Escaneo actual"
diff --git a/l10n/es/gallery.po b/l10n/es/gallery.po
index ed047722ad38ac6647b5604524b399a5f7b82856..9486008860b955f039adc0b7630764f36bd37e44 100644
--- a/l10n/es/gallery.po
+++ b/l10n/es/gallery.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 15:29+0000\n"
+"Last-Translator: Javier Llorente <javier@opensuse.org>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +22,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Imágenes"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -30,15 +30,15 @@ msgstr "Refrescar"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Parar"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Compartir"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Preferencias"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -46,16 +46,16 @@ msgstr "Atrás"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Borrar confirmación"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "¿Quieres eliminar el álbum"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Cambiar nombre al álbum"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nuevo nombre de álbum"
diff --git a/l10n/es/media.po b/l10n/es/media.po
index acf288403f7dc2097927573643848ff8d853146d..eedcf2da4bfd210aba0e621f8d3a60ed74c28f8c 100644
--- a/l10n/es/media.po
+++ b/l10n/es/media.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Javier Llorente <javier@opensuse.org>, 2012.
 #   <sergioballesterossolanas@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-02-14 09:15+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 15:21+0000\n"
+"Last-Translator: Javier Llorente <javier@opensuse.org>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,15 +19,15 @@ msgstr ""
 "Language: es\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: appinfo/app.php:32 templates/player.php:9
+#: appinfo/app.php:32 templates/player.php:8
 msgid "Music"
 msgstr "Música"
 
-#: templates/music.php:3 templates/player.php:13
+#: templates/music.php:3 templates/player.php:12
 msgid "Play"
 msgstr "Reproducir"
 
-#: templates/music.php:4 templates/music.php:26 templates/player.php:14
+#: templates/music.php:4 templates/music.php:26 templates/player.php:13
 msgid "Pause"
 msgstr "Pausa"
 
@@ -34,7 +35,7 @@ msgstr "Pausa"
 msgid "Previous"
 msgstr "Anterior"
 
-#: templates/music.php:6 templates/player.php:15
+#: templates/music.php:6 templates/player.php:14
 msgid "Next"
 msgstr "Siguiente"
 
@@ -44,11 +45,11 @@ msgstr "Silenciar"
 
 #: templates/music.php:8
 msgid "Unmute"
-msgstr "Sonar"
+msgstr "Quitar silencio"
 
 #: templates/music.php:25
 msgid "Rescan Collection"
-msgstr "Buscar música nueva"
+msgstr "Buscar canciones nuevas"
 
 #: templates/music.php:37
 msgid "Artist"
diff --git a/l10n/es/settings.po b/l10n/es/settings.po
index da1068f645017e2e74eb500ae0f99d96c77f218a..225a2169d7ec28e3954cc51cea67650fbd5fb04f 100644
--- a/l10n/es/settings.po
+++ b/l10n/es/settings.po
@@ -6,15 +6,16 @@
 # Javier Llorente <javier@opensuse.org>, 2012.
 #   <juanma@kde.org.ar>, 2011, 2012.
 #   <monty_2731@hotmail.com>, 2011.
+# oSiNaReF  <>, 2012.
 #   <rom1dep@gmail.com>, 2011.
 #   <sergioballesterossolanas@gmail.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 15:30+0000\n"
+"Last-Translator: Javier Llorente <javier@opensuse.org>\n"
 "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/owncloud/language/es/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -45,15 +46,15 @@ msgstr "Castellano"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Registro"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Más"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Añade tu aplicación"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -69,11 +70,11 @@ msgstr "por"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentación"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Administra archivos grandes"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -101,11 +102,11 @@ msgstr "del total disponible de"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Clientes de sincronización móviles y de escritorio"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Descargar"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -153,7 +154,7 @@ msgstr "Ayúdanos a traducir"
 
 #: templates/personal.php:51
 msgid "use this address to connect to your ownCloud in your file manager"
-msgstr "utiliza esta dirección para conectar a tu ownCloud desde tu explorador de archivos"
+msgstr "utiliza esta dirección para conectar a tu ownCloud desde tu gestor de archivos"
 
 #: templates/users.php:15 templates/users.php:44
 msgid "Name"
@@ -173,11 +174,11 @@ msgstr "Crear"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Cuota predeterminada"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Otro"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/et_EE/calendar.po b/l10n/et_EE/calendar.po
index 5d005a0200a327f7e53306f772a01de0825b09c1..5fd1bfb92f7cc63c20fe1c25cde3c70d56b1d7e7 100644
--- a/l10n/et_EE/calendar.po
+++ b/l10n/et_EE/calendar.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 14:56+0000\n"
+"Last-Translator: Rivo Zängov <eraser@eraser.ee>\n"
 "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/language/et_EE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +20,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Kalendreid ei leitud."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Üritusi ei leitud."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -50,71 +50,71 @@ msgstr "Kalender"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Sünnipäev"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Äri"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Helista"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Kliendid"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Kohaletoimetaja"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Pühad"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideed"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Reis"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Juubel"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Kohtumine"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Muu"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Isiklik"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projektid"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Küsimused"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Töö"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "nimetu"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -363,7 +363,7 @@ msgstr "Vali aktiivsed kalendrid"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Sinu kalendrid"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -372,15 +372,15 @@ msgstr "CalDav Link"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Jagatud kalendrid"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Jagatud kalendreid pole"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Jaga kalendrit"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -397,7 +397,7 @@ msgstr "Kustuta"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "jagas sinuga"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -442,23 +442,23 @@ msgstr "Ekspordi"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Ürituse info"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Kordamine"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Osalejad"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Jaga"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -470,11 +470,11 @@ msgstr "Kategooria"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Eralda kategooriad komadega"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Muuda kategooriaid"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -595,11 +595,11 @@ msgstr "Loo sündmus"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Vaata üritust"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Ühtegi kategooriat pole valitud"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -607,11 +607,11 @@ msgstr "Salvesta kategooria"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "/"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "kell"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -635,7 +635,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Nädala esimene päev"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,24 +643,24 @@ msgstr "Kalendri CalDAV sünkroniseerimise aadress:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Kasutajad"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "valitud kasutajad"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Muudetav"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Grupid"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "valitud grupid"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "tee avalikuks"
diff --git a/l10n/et_EE/contacts.po b/l10n/et_EE/contacts.po
index a3297de82d0a2bc155abf3359da7a436a2295060..a93421ea9a6efc575325bf3d644b91fef78ad4ae 100644
--- a/l10n/et_EE/contacts.po
+++ b/l10n/et_EE/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/language/et_EE/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Viga aadressiraamatu (de)aktiveerimisel."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Konktakti lisamisel tekkis viga."
 
@@ -36,7 +36,7 @@ msgstr "Vähemalt üks aadressiväljadest peab olema täidetud."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Proovitakse lisada topeltomadust: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -44,39 +44,35 @@ msgstr "Viga konktakti korralikul lisamisel."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "ID-d pole sisestatud"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Viga kontrollsumma määramisel."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Kustutamiseks pole valitud ühtegi kategooriat."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Ei leitud ühtegi aadressiraamatut."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Ühtegi kontakti ei leitud."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Puudub ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Viga VCard-ist ID parsimisel: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Tühja nimega aadressiraamatut ei saa lisada."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +84,27 @@ msgstr "Viga aadressiraamatu aktiveerimisel."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Kontakti ID-d pole sisestatud."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Viga pildi laadimisel."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Viga kontakti foto lugemisel."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Viga ajutise faili salvestamisel."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Laetav pilt pole korrektne pildifail."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ID on määramata."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,35 +116,35 @@ msgstr "Viga konktaki korralikul kustutamisel."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Kontakti ID puudub."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Puuduv kontakti ID."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Foto asukohta pole määratud."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Faili pole olemas:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "elemendi nime pole määratud."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "kontrollsummat pole määratud."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "vCard info pole korrektne. Palun lae lehekülg uuesti: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Midagi läks tõsiselt metsa."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -156,7 +152,7 @@ msgstr "Viga konktaki korralikul uuendamisel."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Tühja nimega aadressiraamatut ei saa uuendada."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -164,33 +160,33 @@ msgstr "Viga aadressiraamatu uuendamisel."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Viga kontaktide üleslaadimisel kettale."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Ühtegi tõrget polnud, fail on üles laetud"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Üleslaetud fail ületab php.ini failis määratud upload_max_filesize suuruse"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Üleslaetud fail ületab MAX_FILE_SIZE suuruse, mis on HTML vormi jaoks määratud"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Fail laeti üles ainult osaliselt"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Ühtegi faili ei laetud üles"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Ajutiste failide kaust puudub"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +194,7 @@ msgstr "Kontaktid"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Aadressiraamatut ei leitud"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +243,7 @@ msgstr "Hääl"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Sõnum"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +259,11 @@ msgstr "Piipar"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name} sünnipäev"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +279,7 @@ msgstr "Aadressiraamatud"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Seadista aadressiraamatut"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +287,7 @@ msgstr "Uus aadressiraamat"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Impordi VCF-ist"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,23 +318,23 @@ msgstr "Kustuta kontakt"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Lohista üleslaetav foto siia"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Muuda nime üksikasju"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Hüüdnimi"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Sisesta hüüdnimi"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +342,19 @@ msgstr "Sünnipäev"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd.mm.yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Grupid"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Eralda grupid komadega"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Muuda gruppe"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,47 +362,47 @@ msgstr "Eelistatud"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Palun sisesta korrektne e-posti aadress."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Sisesta e-posti aadress"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Kiri aadressile"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Kustuta e-posti aadress"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Sisesta telefoninumber"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Kustuta telefoninumber"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Vaata kaardil"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Muuda aaressi infot"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Lisa märkmed siia."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Lisa väli"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profiili pilt"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -414,27 +410,27 @@ msgstr "Telefon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Märkus"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Kustuta praegune foto"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Muuda praegust pilti"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Lae üles uus foto"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Vali foto ownCloudist"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Muuda aadressi"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +473,7 @@ msgstr "Riik"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Muuda kategooriat"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -489,79 +485,79 @@ msgstr "Aadressiraamat"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Eesliited"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Preili"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Pr"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Hr"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Härra"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Proua"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Eesnimi"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Lisanimed"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Perekonnanimi"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Järelliited"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Senior."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -594,76 +590,76 @@ msgstr "Loobu"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Impordi kontaktifail"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Palun vali aadressiraamat"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "loo uus aadressiraamat"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Uue aadressiraamatu nimi"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Impordi"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Kontaktide importimine"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontaktid on imporditud"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Sulge dialoog"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Impordi aadressiraamat"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Vali aadressiraamat, millesse importida:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Lohista siia VCF-fail, millest kontakte importida."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Vali kõvakettalt"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Sinu aadressiraamatus pole ühtegi kontakti."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Lisa kontakt"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Seadista aadressiraamatuid"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV sünkroniseerimise aadressid"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "lisainfo"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Peamine aadress"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/et_EE/core.po b/l10n/et_EE/core.po
index d54159656f250888ded3210ce95cfe96653aa46a..9b5a48bbe2e35d21882b7f7106acff0f7fbd57e8 100644
--- a/l10n/et_EE/core.po
+++ b/l10n/et_EE/core.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 14:53+0000\n"
+"Last-Translator: Rivo Zängov <eraser@eraser.ee>\n"
 "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/language/et_EE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,15 +20,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Rakenduse nime pole sisestatud."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Pole kategooriat, mida lisada?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "See kategooria on juba olemas: "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -36,7 +36,7 @@ msgstr "Owncloud parooli taastamine"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud parooli taastamine"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -101,7 +101,7 @@ msgstr "Abiinfo"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Ligipääs on keelatud"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +109,11 @@ msgstr "Pilve ei leitud"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Muuda kategooriaid"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Lisa"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +160,7 @@ msgstr "Andmebaasi host"
 msgid "Finish setup"
 msgstr "Lõpeta seadistamine"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "veebiteenused sinu kontrolli all"
 
diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po
index e4a600afb5b78b0fa7fdb20faaeb985d4dc28d94..6045145acdfd822e1db70803f79cdbce9480cc7d 100644
--- a/l10n/et_EE/files.po
+++ b/l10n/et_EE/files.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 15:03+0000\n"
+"Last-Translator: Rivo Zängov <eraser@eraser.ee>\n"
 "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/language/et_EE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +46,7 @@ msgstr "Ajutiste failide kaust puudub"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Kettale kirjutamine ebaõnnestus"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +54,7 @@ msgstr "Failid"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Failide käsitlemine"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +62,23 @@ msgstr "Maksimaalne üleslaadimise suurus"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "maks. võimalik: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Vajalik mitme faili ja kausta allalaadimiste jaoks."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Luba ZIP-ina allalaadimine"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 tähendab piiramatut"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Maksimaalne ZIP-faili sisestatava faili suurus"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +94,7 @@ msgstr "Kaust"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "URL-ilt"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +102,7 @@ msgstr "Lae üles"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Tühista üleslaadimine"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +114,7 @@ msgstr "Nimi"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Jaga"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +130,7 @@ msgstr "Muudetud"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Kustuta kõik"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +148,8 @@ msgstr "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetav
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Faile skannitakse, palun oota"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Praegune skannimine"
diff --git a/l10n/et_EE/gallery.po b/l10n/et_EE/gallery.po
index 5f676b3a6192654013ba9165e30158bd0216f3dc..93abfcda3a50d5ceb8c5008c024105edfcf0bf27 100644
--- a/l10n/et_EE/gallery.po
+++ b/l10n/et_EE/gallery.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 14:59+0000\n"
+"Last-Translator: Rivo Zängov <eraser@eraser.ee>\n"
 "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/language/et_EE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Pildid"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +28,15 @@ msgstr "Skänni uuesti"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Peata"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Jaga"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Seaded"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +44,16 @@ msgstr "Tagasi"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Eemaldamise kinnitus"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Kas sa soovid albumit eemaldada"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Muuda albumi nime"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Uue albumi nimi"
diff --git a/l10n/et_EE/settings.po b/l10n/et_EE/settings.po
index 78406f590c5cf109bfc45e57e430d42e89bfe775..ff5dc06701c024b094ac60bc59b8400548d73cfd 100644
--- a/l10n/et_EE/settings.po
+++ b/l10n/et_EE/settings.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 14:57+0000\n"
+"Last-Translator: Rivo Zängov <eraser@eraser.ee>\n"
 "Language-Team: Estonian (Estonia) (http://www.transifex.net/projects/p/owncloud/language/et_EE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -42,15 +42,15 @@ msgstr "Eesti"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Logi"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Veel"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Lisa oma rakendus"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -66,11 +66,11 @@ msgstr "kelle poolt"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentatsioon"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Suurte failide haldamine"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -98,11 +98,11 @@ msgstr "saadaolevast"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Töölaua ja mobiiliga sünkroniseerimise rakendused"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Lae alla"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -170,11 +170,11 @@ msgstr "Lisa"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Vaikimisi kvoot"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Muu"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/eu/calendar.po b/l10n/eu/calendar.po
index c061980c2b163b728e461dcd1b2167768e287272..3ba3f9b00419717bd14abca414b5fe20daed7a9d 100644
--- a/l10n/eu/calendar.po
+++ b/l10n/eu/calendar.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 10:07+0000\n"
+"Last-Translator: asieriko <asieriko@gmail.com>\n"
 "Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/language/eu/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,11 +22,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Ez da egutegirik aurkitu."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Ez da gertaerarik aurkitu."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -54,69 +54,69 @@ msgstr "Egutegia"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Jaioteguna"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Negozioa"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Deia"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Bezeroak"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Banatzailea"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Oporrak"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideiak"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Bidaia"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Urteurrena"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Bilera"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Bestelakoa"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Pertsonala"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Proiektuak"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Galderak"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Lana"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "izengabea"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -152,7 +152,7 @@ msgstr "inoiz"
 
 #: lib/object.php:344
 msgid "by occurrences"
-msgstr ""
+msgstr "errepikapen kopuruagatik"
 
 #: lib/object.php:345
 msgid "by date"
@@ -365,7 +365,7 @@ msgstr "Aukeratu egutegi aktiboak"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Zure egutegiak"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -374,15 +374,15 @@ msgstr "CalDav lotura"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Elkarbanatutako egutegiak"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Ez dago elkarbanatutako egutegirik"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Elkarbanatu egutegia"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -399,7 +399,7 @@ msgstr "Ezabatu"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "honek zurekin elkarbanatu du"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -444,23 +444,23 @@ msgstr "Exportatu"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Gertaeraren informazioa"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Errepikapena"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarma"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Partaideak"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Elkarbanatu"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -472,11 +472,11 @@ msgstr "Kategoria"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Banatu kategoriak komekin"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Editatu kategoriak"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -597,11 +597,11 @@ msgstr "Sortu gertaera berria"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Ikusi gertaera bat"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Ez da kategoriarik hautatu"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -637,7 +637,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Asteko lehenego eguna"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -645,24 +645,24 @@ msgstr "Egutegiaren CalDAV sinkronizazio helbidea"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Erabiltzaileak"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "hautatutako erabiltzaileak"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Editagarria"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Taldeak"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "hautatutako taldeak"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "publikoa egin"
diff --git a/l10n/eu/contacts.po b/l10n/eu/contacts.po
index 59df64adc137f33d28905df0caff226ff91fb910..eaf9bc62e40a46b0d2f6d857dfc57a0a9447e795 100644
--- a/l10n/eu/contacts.po
+++ b/l10n/eu/contacts.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 09:58+0000\n"
+"Last-Translator: asieriko <asieriko@gmail.com>\n"
 "Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/language/eu/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Errore bat egon da helbide-liburua (des)gaitzen"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Errore bat egon da kontaktua gehitzerakoan"
 
@@ -46,7 +46,7 @@ msgstr "Errorea kontaktu propietatea gehitzean."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Ez da IDrik eman"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
@@ -54,28 +54,24 @@ msgstr ""
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Ez dira ezabatzeko kategoriak hautatu."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Ez da helbide libururik aurkitu."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Ez da kontakturik aurkitu."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "ID falta da"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
@@ -94,11 +90,11 @@ msgstr ""
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Errore bat izan da irudia kargatzearkoan."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Errore bat izan da kontaktuaren argazkia igotzerakoan."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
@@ -106,11 +102,11 @@ msgstr ""
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Kargatzen ari den argazkia ez da egokia."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "IDa ez da ezarri."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -122,11 +118,11 @@ msgstr "Errorea kontaktu propietatea ezabatzean."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Kontaktuaren IDa falta da."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Kontaktuaren IDa falta da."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
@@ -134,11 +130,11 @@ msgstr ""
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Fitxategia ez da existitzen:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "elementuaren izena ez da ezarri."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
@@ -158,7 +154,7 @@ msgstr "Errorea kontaktu propietatea eguneratzean."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Ezin da helbide liburua eguneratu izen huts batekin."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -166,11 +162,11 @@ msgstr "Errore bat egon da helbide liburua eguneratzen."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Errore bat egon da kontaktuak biltegira igotzerakoan."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Ez da errorerik egon, fitxategia ongi igo da"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
@@ -184,11 +180,11 @@ msgstr ""
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Igotako fitxategiaren zati bat bakarrik igo da"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Ez da fitxategirik igo"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
@@ -200,7 +196,7 @@ msgstr "Kontaktuak"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Helbide liburua ez da aurkitu"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -249,7 +245,7 @@ msgstr "Ahotsa"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Mezua"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -265,11 +261,11 @@ msgstr "Bilagailua"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name}ren jaioteguna"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -285,7 +281,7 @@ msgstr "Helbide Liburuak"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Konfiguratu Helbide Liburuak"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -293,7 +289,7 @@ msgstr "Helbide-liburu berria"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "VCFtik inportatu"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -324,7 +320,7 @@ msgstr "Ezabatu kontaktua"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Askatu argazkia igotzeko"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
@@ -332,15 +328,15 @@ msgstr ""
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Editatu izenaren zehaztasunak"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Ezizena"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Sartu ezizena"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -348,19 +344,19 @@ msgstr "Jaioteguna"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "yyyy-mm-dd"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Taldeak"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Banatu taldeak komekin"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Editatu taldeak"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -368,47 +364,47 @@ msgstr "Hobetsia"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Mesedez sartu eposta helbide egoki bat"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Sartu eposta helbidea"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Bidali helbidera"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Ezabatu eposta helbidea"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Sartu telefono zenbakia"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Ezabatu telefono zenbakia"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Ikusi mapan"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Editatu helbidearen zehaztasunak"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Gehitu oharrak hemen."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Gehitu eremua"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profilaren irudia"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -416,27 +412,27 @@ msgstr "Telefonoa"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Oharra"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Ezabatu oraingo argazkia"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Editatu oraingo argazkia"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Igo argazki berria"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Hautatu argazki bat ownCloudetik"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Editatu helbidea"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -479,7 +475,7 @@ msgstr "Herrialdea"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Editatu kategoriak"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -596,76 +592,76 @@ msgstr "Ezeztatu"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Inporatu kontaktuen fitxategia"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Mesedez, aukeratu helbide liburua"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "sortu helbide liburu berria"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Helbide liburuaren izena"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Inportatu"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Kontaktuak inportatzen"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontaktuak ongi inportatu dira"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Dialogoa itxi"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Inporatu helbide liburua"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Hautau helburuko helbide liburua:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Askatu VCF fitxategia kontaktuak inportatzeko."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Hautatu disko gogorretik"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Ez duzu kontakturik zure helbide liburuan."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Gehitu kontaktua"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Konfiguratu helbide liburuak"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV sinkronizazio helbideak"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "informazio gehiago"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Helbide nagusia"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/eu/core.po b/l10n/eu/core.po
index 03d9fc6188e86d56d19478a8234b97f14c54093e..35e7f5afb66e09eb1ebc2362c40d51e7746839e4 100644
--- a/l10n/eu/core.po
+++ b/l10n/eu/core.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 09:40+0000\n"
+"Last-Translator: asieriko <asieriko@gmail.com>\n"
 "Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/language/eu/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +21,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Aplikazioaren izena falta da"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Ez dago gehitzeko kategoriarik?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Kategoria hau dagoeneko existitzen da:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -37,7 +37,7 @@ msgstr "Owncloudeko pasahitza berrezarri"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud-en pasahitza berrezarri"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -102,7 +102,7 @@ msgstr "Laguntza"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Sarrera debekatuta"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +110,11 @@ msgstr "Ez da hodeia aurkitu"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Editatu kategoriak"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Gehitu"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,7 +161,7 @@ msgstr "Datubasearen hostalaria"
 msgid "Finish setup"
 msgstr "Bukatu konfigurazioa"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "web zerbitzuak zure kontrolpean"
 
diff --git a/l10n/eu/files.po b/l10n/eu/files.po
index 11cebade7b524acf91678820b8bc2f02f59f8720..04dbf77f5331b77b1580b386845234c1ced8e1b1 100644
--- a/l10n/eu/files.po
+++ b/l10n/eu/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 09:42+0000\n"
+"Last-Translator: asieriko <asieriko@gmail.com>\n"
 "Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/language/eu/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "Aldi baterako karpeta falta da"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Errore bat izan da diskoan idazterakoan"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "Fitxategiak"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Fitxategien kudeaketa"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "Igo daitekeen gehienezko tamaina"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "max, posiblea:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Beharrezkoa fitxategi-anitz eta karpeten deskargarako."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Gaitu ZIP-deskarga"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 mugarik gabe esan nahi du"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "ZIP fitxategien gehienezko tamaina"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "Karpeta"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "URLtik"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "Igo"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Ezeztatu igoera"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "Izena"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Elkarbanatu"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "Aldatuta"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Ezabatu dena"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartze
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Fitxategiak eskaneatzen ari da, itxoin mezedez."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Orain eskaneatzen ari da"
diff --git a/l10n/eu/gallery.po b/l10n/eu/gallery.po
index a6d041f7994b8f99079444583492393c83126be0..3f8cf5926782db3d9019f4d6822d1ef2df978c67 100644
--- a/l10n/eu/gallery.po
+++ b/l10n/eu/gallery.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 09:59+0000\n"
+"Last-Translator: asieriko <asieriko@gmail.com>\n"
 "Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/language/eu/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Argazkiak"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +28,15 @@ msgstr "Bireskaneatu"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Gelditu"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Elkarbanatu"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Ezarpenak"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +44,16 @@ msgstr "Atzera"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Ezabatu konfirmazioa"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Albuma ezabatu nahi al duzu"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Aldatu albumaren izena"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Album berriaren izena"
diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po
index 08d940e5b5789ef32b2bed943f9a3c87b23083f2..3982dd46b368d45af2010d49efa396c87179d7f0 100644
--- a/l10n/eu/settings.po
+++ b/l10n/eu/settings.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 09:44+0000\n"
+"Last-Translator: asieriko <asieriko@gmail.com>\n"
 "Language-Team: Basque (http://www.transifex.net/projects/p/owncloud/language/eu/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,11 +47,11 @@ msgstr ""
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Gehiago"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Gehitu zure aplikazioa"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -67,11 +67,11 @@ msgstr " Egilea:"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentazioa"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Fitxategi handien kudeaketa"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -99,11 +99,11 @@ msgstr "eta guztira erabil dezakezu "
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Mahaigain eta mugikorren sinkronizazio bezeroak"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Deskargatu"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -175,7 +175,7 @@ msgstr ""
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Besteak"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/fa/calendar.po b/l10n/fa/calendar.po
index 1f7a1b99177166187d7406357bc3fa779b3005f5..6dbb4fdd41e014da7e6eaed35985ae9972d89e52 100644
--- a/l10n/fa/calendar.po
+++ b/l10n/fa/calendar.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 17:11+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,647 +20,647 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "هیچ تقویمی پیدا نشد"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "هیچ رویدادی پیدا نشد"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
-msgstr ""
+msgstr "تقویم اشتباه"
 
 #: ajax/settings/guesstimezone.php:25
 msgid "New Timezone:"
-msgstr ""
+msgstr "زمان محلی جدید"
 
 #: ajax/settings/settimezone.php:22
 msgid "Timezone changed"
-msgstr ""
+msgstr "زمان محلی تغییر یافت"
 
 #: ajax/settings/settimezone.php:24
 msgid "Invalid request"
-msgstr ""
+msgstr "درخواست نامعتبر"
 
 #: appinfo/app.php:23 templates/calendar.php:15
 #: templates/part.eventform.php:33 templates/part.showevent.php:31
 #: templates/settings.php:12
 msgid "Calendar"
-msgstr ""
+msgstr "تقویم"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "DDD m[ yyyy]{ '&#8212;'[ DDD] m yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
-msgstr ""
+msgstr "روزتولد"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
-msgstr ""
+msgstr "تجارت"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
-msgstr ""
+msgstr "تماس گرفتن"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
-msgstr ""
+msgstr "مشتریان"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
-msgstr ""
+msgstr "نجات"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
-msgstr ""
+msgstr "روزهای تعطیل"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
-msgstr ""
+msgstr "ایده ها"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
-msgstr ""
+msgstr "سفر"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
-msgstr ""
+msgstr "سالگرد"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
-msgstr ""
+msgstr "ملاقات"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
-msgstr ""
+msgstr "دیگر"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
-msgstr ""
+msgstr "شخصی"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
-msgstr ""
+msgstr "پروژه ها"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
-msgstr ""
+msgstr "سوالات"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
-msgstr ""
+msgstr "کار"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "نام گذاری نشده"
 
 #: lib/object.php:330
 msgid "Does not repeat"
-msgstr ""
+msgstr "تکرار نکنید"
 
 #: lib/object.php:331
 msgid "Daily"
-msgstr ""
+msgstr "روزانه"
 
 #: lib/object.php:332
 msgid "Weekly"
-msgstr ""
+msgstr "هفتهگی"
 
 #: lib/object.php:333
 msgid "Every Weekday"
-msgstr ""
+msgstr "هرروز هفته"
 
 #: lib/object.php:334
 msgid "Bi-Weekly"
-msgstr ""
+msgstr "دوهفته"
 
 #: lib/object.php:335
 msgid "Monthly"
-msgstr ""
+msgstr "ماهانه"
 
 #: lib/object.php:336
 msgid "Yearly"
-msgstr ""
+msgstr "سالانه"
 
 #: lib/object.php:343
 msgid "never"
-msgstr ""
+msgstr "هرگز"
 
 #: lib/object.php:344
 msgid "by occurrences"
-msgstr ""
+msgstr "به وسیله ظهور"
 
 #: lib/object.php:345
 msgid "by date"
-msgstr ""
+msgstr "به وسیله تاریخ"
 
 #: lib/object.php:352
 msgid "by monthday"
-msgstr ""
+msgstr "به وسیله روزهای ماه"
 
 #: lib/object.php:353
 msgid "by weekday"
-msgstr ""
+msgstr "به وسیله روز های هفته"
 
 #: lib/object.php:360 templates/settings.php:42
 msgid "Monday"
-msgstr ""
+msgstr "دوشنبه"
 
 #: lib/object.php:361
 msgid "Tuesday"
-msgstr ""
+msgstr "سه شنبه"
 
 #: lib/object.php:362
 msgid "Wednesday"
-msgstr ""
+msgstr "چهارشنبه"
 
 #: lib/object.php:363
 msgid "Thursday"
-msgstr ""
+msgstr "پنجشنبه"
 
 #: lib/object.php:364
 msgid "Friday"
-msgstr ""
+msgstr "جمعه"
 
 #: lib/object.php:365
 msgid "Saturday"
-msgstr ""
+msgstr "شنبه"
 
 #: lib/object.php:366 templates/settings.php:43
 msgid "Sunday"
-msgstr ""
+msgstr "یکشنبه"
 
 #: lib/object.php:373
 msgid "events week of month"
-msgstr ""
+msgstr "رویداد های  هفته هایی از ماه"
 
 #: lib/object.php:374
 msgid "first"
-msgstr ""
+msgstr "اولین"
 
 #: lib/object.php:375
 msgid "second"
-msgstr ""
+msgstr "دومین"
 
 #: lib/object.php:376
 msgid "third"
-msgstr ""
+msgstr "سومین"
 
 #: lib/object.php:377
 msgid "fourth"
-msgstr ""
+msgstr "چهارمین"
 
 #: lib/object.php:378
 msgid "fifth"
-msgstr ""
+msgstr "پنجمین"
 
 #: lib/object.php:379
 msgid "last"
-msgstr ""
+msgstr "آخرین"
 
 #: lib/object.php:401
 msgid "January"
-msgstr ""
+msgstr "ژانویه"
 
 #: lib/object.php:402
 msgid "February"
-msgstr ""
+msgstr "فبریه"
 
 #: lib/object.php:403
 msgid "March"
-msgstr ""
+msgstr "مارس"
 
 #: lib/object.php:404
 msgid "April"
-msgstr ""
+msgstr "آوریل"
 
 #: lib/object.php:405
 msgid "May"
-msgstr ""
+msgstr "می"
 
 #: lib/object.php:406
 msgid "June"
-msgstr ""
+msgstr "ژوءن"
 
 #: lib/object.php:407
 msgid "July"
-msgstr ""
+msgstr "جولای"
 
 #: lib/object.php:408
 msgid "August"
-msgstr ""
+msgstr "آگوست"
 
 #: lib/object.php:409
 msgid "September"
-msgstr ""
+msgstr "سپتامبر"
 
 #: lib/object.php:410
 msgid "October"
-msgstr ""
+msgstr "اکتبر"
 
 #: lib/object.php:411
 msgid "November"
-msgstr ""
+msgstr "نوامبر"
 
 #: lib/object.php:412
 msgid "December"
-msgstr ""
+msgstr "دسامبر"
 
 #: lib/object.php:418
 msgid "by events date"
-msgstr ""
+msgstr "به وسیله رویداد های روزانه"
 
 #: lib/object.php:419
 msgid "by yearday(s)"
-msgstr ""
+msgstr "به وسیله روز های سال(ها)"
 
 #: lib/object.php:420
 msgid "by weeknumber(s)"
-msgstr ""
+msgstr "به وسیله شماره هفته(ها)"
 
 #: lib/object.php:421
 msgid "by day and month"
-msgstr ""
+msgstr "به وسیله روز و ماه"
 
 #: lib/search.php:32 lib/search.php:34 lib/search.php:37
 msgid "Date"
-msgstr ""
+msgstr "تاریخ"
 
 #: lib/search.php:40
 msgid "Cal."
-msgstr ""
+msgstr "تقویم."
 
 #: templates/calendar.php:11
 msgid "All day"
-msgstr ""
+msgstr "هرروز"
 
 #: templates/calendar.php:12 templates/part.choosecalendar.php:22
 msgid "New Calendar"
-msgstr ""
+msgstr "تقویم جدید"
 
 #: templates/calendar.php:13
 msgid "Missing fields"
-msgstr ""
+msgstr "فیلد های گم شده"
 
 #: templates/calendar.php:14 templates/part.eventform.php:19
 #: templates/part.showevent.php:11
 msgid "Title"
-msgstr ""
+msgstr "عنوان"
 
 #: templates/calendar.php:16
 msgid "From Date"
-msgstr ""
+msgstr "از تاریخ"
 
 #: templates/calendar.php:17
 msgid "From Time"
-msgstr ""
+msgstr "از ساعت"
 
 #: templates/calendar.php:18
 msgid "To Date"
-msgstr ""
+msgstr "به تاریخ"
 
 #: templates/calendar.php:19
 msgid "To Time"
-msgstr ""
+msgstr "به ساعت"
 
 #: templates/calendar.php:20
 msgid "The event ends before it starts"
-msgstr ""
+msgstr "رویداد قبل از شروع شدن تمام شده!"
 
 #: templates/calendar.php:21
 msgid "There was a database fail"
-msgstr ""
+msgstr "یک پایگاه داده فرو مانده است"
 
 #: templates/calendar.php:40
 msgid "Week"
-msgstr ""
+msgstr "هفته"
 
 #: templates/calendar.php:41
 msgid "Month"
-msgstr ""
+msgstr "ماه"
 
 #: templates/calendar.php:42
 msgid "List"
-msgstr ""
+msgstr "فهرست"
 
 #: templates/calendar.php:48
 msgid "Today"
-msgstr ""
+msgstr "امروز"
 
 #: templates/calendar.php:49
 msgid "Calendars"
-msgstr ""
+msgstr "تقویم ها"
 
 #: templates/calendar.php:67
 msgid "There was a fail, while parsing the file."
-msgstr ""
+msgstr "ناتوان در تجزیه پرونده"
 
 #: templates/part.choosecalendar.php:1
 msgid "Choose active calendars"
-msgstr ""
+msgstr "تقویم فعال را انتخاب کنید"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "تقویم های شما"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
 msgid "CalDav Link"
-msgstr ""
+msgstr "CalDav Link"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "تقویمهای به اشترک گذاری شده"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "هیچ تقویمی به  اشتراک گذارده نشده"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "تقویم را به اشتراک بگذارید"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
-msgstr ""
+msgstr "بارگیری"
 
 #: templates/part.choosecalendar.rowfields.php:7
 msgid "Edit"
-msgstr ""
+msgstr "ویرایش"
 
 #: templates/part.choosecalendar.rowfields.php:8
 #: templates/part.editevent.php:9
 msgid "Delete"
-msgstr ""
+msgstr "پاک کردن"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "به اشتراک گذارده شده به وسیله"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
-msgstr ""
+msgstr "تقویم جدید"
 
 #: templates/part.editcalendar.php:9
 msgid "Edit calendar"
-msgstr ""
+msgstr "ویرایش تقویم"
 
 #: templates/part.editcalendar.php:12
 msgid "Displayname"
-msgstr ""
+msgstr "نام برای نمایش"
 
 #: templates/part.editcalendar.php:23
 msgid "Active"
-msgstr ""
+msgstr "فعال"
 
 #: templates/part.editcalendar.php:29
 msgid "Calendar color"
-msgstr ""
+msgstr "رنگ تقویم"
 
 #: templates/part.editcalendar.php:42
 msgid "Save"
-msgstr ""
+msgstr "ذخیره سازی"
 
 #: templates/part.editcalendar.php:42 templates/part.editevent.php:8
 #: templates/part.newevent.php:6
 msgid "Submit"
-msgstr ""
+msgstr "ارسال"
 
 #: templates/part.editcalendar.php:43
 msgid "Cancel"
-msgstr ""
+msgstr "انصراف"
 
 #: templates/part.editevent.php:1
 msgid "Edit an event"
-msgstr ""
+msgstr "ویرایش رویداد"
 
 #: templates/part.editevent.php:10
 msgid "Export"
-msgstr ""
+msgstr "خروجی گرفتن"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "اطلاعات رویداد"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "در حال تکرار کردن"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "هشدار"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "شرکت کنندگان"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "به اشتراک گذاردن"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
-msgstr ""
+msgstr "عنوان رویداد"
 
 #: templates/part.eventform.php:27 templates/part.showevent.php:19
 msgid "Category"
-msgstr ""
+msgstr "نوع"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "گروه ها را به وسیله درنگ نما از هم جدا کنید"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "ویرایش گروه"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
-msgstr ""
+msgstr "رویداد های روزانه"
 
 #: templates/part.eventform.php:60 templates/part.showevent.php:59
 msgid "From"
-msgstr ""
+msgstr "از"
 
 #: templates/part.eventform.php:68 templates/part.showevent.php:67
 msgid "To"
-msgstr ""
+msgstr "به"
 
 #: templates/part.eventform.php:76 templates/part.showevent.php:75
 msgid "Advanced options"
-msgstr ""
+msgstr "تنظیمات حرفه ای"
 
 #: templates/part.eventform.php:81 templates/part.showevent.php:80
 msgid "Location"
-msgstr ""
+msgstr "منطقه"
 
 #: templates/part.eventform.php:83
 msgid "Location of the Event"
-msgstr ""
+msgstr "منطقه رویداد"
 
 #: templates/part.eventform.php:89 templates/part.showevent.php:88
 msgid "Description"
-msgstr ""
+msgstr "توضیحات"
 
 #: templates/part.eventform.php:91
 msgid "Description of the Event"
-msgstr ""
+msgstr "توضیحات درباره رویداد"
 
 #: templates/part.eventform.php:100 templates/part.showevent.php:98
 msgid "Repeat"
-msgstr ""
+msgstr "تکرار"
 
 #: templates/part.eventform.php:107 templates/part.showevent.php:105
 msgid "Advanced"
-msgstr ""
+msgstr "پیشرفته"
 
 #: templates/part.eventform.php:151 templates/part.showevent.php:149
 msgid "Select weekdays"
-msgstr ""
+msgstr "انتخاب روز های هفته "
 
 #: templates/part.eventform.php:164 templates/part.eventform.php:177
 #: templates/part.showevent.php:162 templates/part.showevent.php:175
 msgid "Select days"
-msgstr ""
+msgstr "انتخاب روز ها"
 
 #: templates/part.eventform.php:169 templates/part.showevent.php:167
 msgid "and the events day of year."
-msgstr ""
+msgstr "و رویداد های روز از سال"
 
 #: templates/part.eventform.php:182 templates/part.showevent.php:180
 msgid "and the events day of month."
-msgstr ""
+msgstr "و رویداد های روز از ماه"
 
 #: templates/part.eventform.php:190 templates/part.showevent.php:188
 msgid "Select months"
-msgstr ""
+msgstr "انتخاب ماه ها"
 
 #: templates/part.eventform.php:203 templates/part.showevent.php:201
 msgid "Select weeks"
-msgstr ""
+msgstr "انتخاب هفته ها"
 
 #: templates/part.eventform.php:208 templates/part.showevent.php:206
 msgid "and the events week of year."
-msgstr ""
+msgstr "و رویداد هفته ها از سال"
 
 #: templates/part.eventform.php:214 templates/part.showevent.php:212
 msgid "Interval"
-msgstr ""
+msgstr "فاصله"
 
 #: templates/part.eventform.php:220 templates/part.showevent.php:218
 msgid "End"
-msgstr ""
+msgstr "پایان"
 
 #: templates/part.eventform.php:233 templates/part.showevent.php:231
 msgid "occurrences"
-msgstr ""
+msgstr "ظهور"
 
 #: templates/part.import.php:1
 msgid "Import a calendar file"
-msgstr ""
+msgstr "یک پرونده حاوی تقویم وارد کنید"
 
 #: templates/part.import.php:6
 msgid "Please choose the calendar"
-msgstr ""
+msgstr "لطفا تقویم را انتخاب کنید"
 
 #: templates/part.import.php:10
 msgid "create a new calendar"
-msgstr ""
+msgstr "یک تقویم جدید ایجاد کنید"
 
 #: templates/part.import.php:15
 msgid "Name of new calendar"
-msgstr ""
+msgstr "نام تقویم جدید"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "ورودی دادن"
 
 #: templates/part.import.php:20
 msgid "Importing calendar"
-msgstr ""
+msgstr "درحال افزودن تقویم"
 
 #: templates/part.import.php:23
 msgid "Calendar imported successfully"
-msgstr ""
+msgstr "افزودن تقویم موفقیت آمیز بود"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "بستن دیالوگ"
 
 #: templates/part.newevent.php:1
 msgid "Create a new event"
-msgstr ""
+msgstr "یک رویداد ایجاد کنید"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "دیدن یک رویداد"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "هیچ گروهی انتخاب نشده"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
-msgstr ""
+msgstr "انتخاب گروه"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "از"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "در"
 
 #: templates/settings.php:14
 msgid "Timezone"
-msgstr ""
+msgstr "زمان محلی"
 
 #: templates/settings.php:31
 msgid "Check always for changes of the timezone"
-msgstr ""
+msgstr "همیشه بررسی کنید برای تغییر زمان محلی"
 
 #: templates/settings.php:33
 msgid "Timeformat"
-msgstr ""
+msgstr "نوع زمان"
 
 #: templates/settings.php:35
 msgid "24h"
-msgstr ""
+msgstr "24 ساعت"
 
 #: templates/settings.php:36
 msgid "12h"
-msgstr ""
+msgstr "12 ساعت"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "یکمین روز هفته"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
-msgstr ""
+msgstr "Calendar CalDAV syncing address :"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "کاربرها"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "انتخاب شناسه ها"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "قابل ویرایش"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "گروه ها"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "انتخاب گروه ها"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "عمومی سازی"
diff --git a/l10n/fa/contacts.po b/l10n/fa/contacts.po
index e7b7f7fb5b86c8df83277674d2cb876b7875a28b..288ff303804960efea9dfbce923e5a210b4bb706 100644
--- a/l10n/fa/contacts.po
+++ b/l10n/fa/contacts.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 17:44+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,650 +20,646 @@ msgstr ""
 
 #: ajax/activation.php:19 ajax/updateaddressbook.php:32
 msgid "Error (de)activating addressbook."
-msgstr ""
+msgstr "خطا در (غیر) فعال سازی کتابچه نشانه ها"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
-msgstr ""
+msgstr "یک خطا در افزودن اطلاعات شخص مورد نظر"
 
 #: ajax/addproperty.php:40
 msgid "Cannot add empty property."
-msgstr ""
+msgstr "نمیتوان یک  خاصیت خالی ایجاد کرد"
 
 #: ajax/addproperty.php:52
 msgid "At least one of the address fields has to be filled out."
-msgstr ""
+msgstr "At least one of the address fields has to be filled out. "
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "امتحان کردن برای وارد کردن مشخصات تکراری"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
-msgstr ""
+msgstr "خطا درهنگام افزودن ویژگی"
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "هیچ شناسه ای ارائه نشده"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "خطا در تنظیم checksum"
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "هیچ گروهی برای حذف شدن در نظر گرفته نشده"
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "هیچ کتابچه نشانی پیدا نشد"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "هیچ شخصی پیدا نشد"
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "نشانی گم شده"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "خطا در تجزیه کارت ویزا برای شناسه:"
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "نمیتوانید یک نام خالی را به کتابچه نشانی ها افزود"
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
-msgstr ""
+msgstr "خطا درهنگام افزودن کتابچه نشانی ها"
 
 #: ajax/createaddressbook.php:30
 msgid "Error activating addressbook."
-msgstr ""
+msgstr "خطا درهنگام فعال سازیکتابچه نشانی ها"
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "هیچ اطلاعاتی راجع به شناسه ارسال نشده"
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "خطا در بارگزاری تصویر"
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "خطا در خواندن اطلاعات تصویر"
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "خطا در ذخیره پرونده موقت"
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "بارگزاری تصویر امکان پذیر نیست"
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "شناسه تعیین نشده"
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
-msgstr ""
+msgstr "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید"
 
 #: ajax/deleteproperty.php:43
 msgid "Error deleting contact property."
-msgstr ""
+msgstr "خطا در هنگام پاک کرد ویژگی"
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "اطلاعات شناسه گم شده"
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "شما اطلاعات شناسه را فراموش کرده اید"
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "هیچ نشانی از تصویرارسال نشده"
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "پرونده وجود ندارد"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "نام اصلی تنظیم نشده است"
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "checksum تنظیم شده نیست"
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "چند چیز به FUBAR رفتند"
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
-msgstr ""
+msgstr "خطا در هنگام بروزرسانی  اطلاعات شخص مورد نظر"
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "نمی توانید کتابچه نشانی ها را با یک نام خالی بروزرسانی کنید"
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
-msgstr ""
+msgstr "خطا در هنگام بروزرسانی کتابچه نشانی ها"
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "خطا در هنگام بارگذاری و ذخیره سازی"
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "هیچ خطایی نیست بارگذاری پرونده موفقیت آمیز بود"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "حجم آپلود از طریق Php.ini تعیین می شود"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "حداکثر حجم قابل بار گذاری از طریق HTML MAX_FILE_SIZE است"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "پرونده بارگذاری شده فقط تاحدودی بارگذاری شده"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "هیچ پروندهای بارگذاری نشده"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "یک پوشه موقت گم شده"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
-msgstr ""
+msgstr "اشخاص"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "کتابچه نشانی ها یافت نشد"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
-msgstr ""
+msgstr "این کتابچه ی نشانه های شما نیست"
 
 #: lib/app.php:38
 msgid "Contact could not be found."
-msgstr ""
+msgstr "اتصال ویا تماسی یافت نشد"
 
 #: lib/app.php:94 templates/part.contact.php:109
 msgid "Address"
-msgstr ""
+msgstr "نشانی"
 
 #: lib/app.php:95
 msgid "Telephone"
-msgstr ""
+msgstr "تلفن"
 
 #: lib/app.php:96 templates/part.contact.php:108
 msgid "Email"
-msgstr ""
+msgstr "نشانی پست الکترنیک"
 
 #: lib/app.php:97 templates/part.contact.php:33 templates/part.contact.php:34
 #: templates/part.contact.php:104
 msgid "Organization"
-msgstr ""
+msgstr "نهاد(ارگان)"
 
 #: lib/app.php:109 lib/app.php:116 lib/app.php:126
 msgid "Work"
-msgstr ""
+msgstr "کار"
 
 #: lib/app.php:110 lib/app.php:114 lib/app.php:127
 msgid "Home"
-msgstr ""
+msgstr "خانه"
 
 #: lib/app.php:115
 msgid "Mobile"
-msgstr ""
+msgstr "موبایل"
 
 #: lib/app.php:117
 msgid "Text"
-msgstr ""
+msgstr "متن"
 
 #: lib/app.php:118
 msgid "Voice"
-msgstr ""
+msgstr "صدا"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "پیغام"
 
 #: lib/app.php:120
 msgid "Fax"
-msgstr ""
+msgstr "دورنگار:"
 
 #: lib/app.php:121
 msgid "Video"
-msgstr ""
+msgstr "رسانه تصویری"
 
 #: lib/app.php:122
 msgid "Pager"
-msgstr ""
+msgstr "صفحه"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "اینترنت"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "روز تولد {name} است"
 
 #: lib/search.php:22
 msgid "Contact"
-msgstr ""
+msgstr "اشخاص"
 
 #: templates/index.php:13
 msgid "Add Contact"
-msgstr ""
+msgstr "افزودن اطلاعات شخص مورد نظر"
 
 #: templates/index.php:14
 msgid "Addressbooks"
-msgstr ""
+msgstr "کتابچه ی نشانی ها"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "پیکر بندی کتابچه نشانی ها"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
-msgstr ""
+msgstr "کتابچه نشانه های جدید"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "وارد شده از VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
 msgid "CardDav Link"
-msgstr ""
+msgstr "CardDav Link"
 
 #: templates/part.chooseaddressbook.rowfields.php:11
 msgid "Download"
-msgstr ""
+msgstr "بارگیری"
 
 #: templates/part.chooseaddressbook.rowfields.php:14
 msgid "Edit"
-msgstr ""
+msgstr "ویرایش"
 
 #: templates/part.chooseaddressbook.rowfields.php:17
 #: templates/part.contact.php:34 templates/part.contact.php:36
 #: templates/part.contact.php:38 templates/part.contact.php:42
 msgid "Delete"
-msgstr ""
+msgstr "پاک کردن"
 
 #: templates/part.contact.php:12
 msgid "Download contact"
-msgstr ""
+msgstr "دانلود مشخصات اشخاص"
 
 #: templates/part.contact.php:13
 msgid "Delete contact"
-msgstr ""
+msgstr "پاک کردن  اطلاعات شخص مورد نظر"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "تصویر را به اینجا بکشید تا بار گذازی شود"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Format custom, Short name, Full name, Reverse or Reverse with comma"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "ویرایش نام جزئیات"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "نام مستعار"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "یک نام مستعار وارد کنید"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
-msgstr ""
+msgstr "روزتولد"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "گروه ها"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "جدا کردن گروه ها به وسیله درنگ نما"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "ویرایش گروه ها"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
-msgstr ""
+msgstr "مقدم"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "لطفا یک پست الکترونیکی معتبر وارد کنید"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "یک  پست الکترونیکی وارد کنید"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "به نشانی  ارسال شد"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "پاک کردن نشانی پست الکترونیکی"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "شماره تلفن راوارد کنید"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "پاک کردن شماره تلفن"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "دیدن روی نقشه"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "ویرایش جزئیات نشانی ها"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "اینجا یادداشت ها را بیافزایید"
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "اضافه کردن فیلد"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "تصویر پروفایل"
 
 #: templates/part.contact.php:107
 msgid "Phone"
-msgstr ""
+msgstr "شماره تلفن"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "یادداشت"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "پاک کردن تصویر کنونی"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "ویرایش تصویر کنونی"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "بار گذاری یک تصویر جدید"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "انتخاب یک تصویر از ابر های شما"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "ویرایش نشانی"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
-msgstr ""
+msgstr "نوع"
 
 #: templates/part.edit_address_dialog.php:22
 #: templates/part.edit_address_dialog.php:25
 msgid "PO Box"
-msgstr ""
+msgstr "صندوق پستی"
 
 #: templates/part.edit_address_dialog.php:29
 #: templates/part.edit_address_dialog.php:32
 msgid "Extended"
-msgstr ""
+msgstr "تمدید شده"
 
 #: templates/part.edit_address_dialog.php:35
 #: templates/part.edit_address_dialog.php:38
 msgid "Street"
-msgstr ""
+msgstr "خیابان"
 
 #: templates/part.edit_address_dialog.php:41
 #: templates/part.edit_address_dialog.php:44
 msgid "City"
-msgstr ""
+msgstr "شهر"
 
 #: templates/part.edit_address_dialog.php:47
 #: templates/part.edit_address_dialog.php:50
 msgid "Region"
-msgstr ""
+msgstr "ناحیه"
 
 #: templates/part.edit_address_dialog.php:53
 #: templates/part.edit_address_dialog.php:56
 msgid "Zipcode"
-msgstr ""
+msgstr "کد پستی"
 
 #: templates/part.edit_address_dialog.php:59
 #: templates/part.edit_address_dialog.php:62
 msgid "Country"
-msgstr ""
+msgstr "کشور"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "ویرایش گروه"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "افزودن"
 
 #: templates/part.edit_name_dialog.php:16
 msgid "Addressbook"
-msgstr ""
+msgstr "کتابچه ی نشانی ها"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "پیشوند های محترمانه"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "خانم"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "خانم"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "آقا"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "آقا"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "خانم"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "دکتر"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "نام معلوم"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "نام های دیگر"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "نام خانوادگی"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "پسوند های محترم"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "دکتری"
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sn."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
-msgstr ""
+msgstr "کتابچه نشانی جدید"
 
 #: templates/part.editaddressbook.php:9
 msgid "Edit Addressbook"
-msgstr ""
+msgstr "ویرایش کتابچه نشانی"
 
 #: templates/part.editaddressbook.php:12
 msgid "Displayname"
-msgstr ""
+msgstr "نام برای نمایش"
 
 #: templates/part.editaddressbook.php:23
 msgid "Active"
-msgstr ""
+msgstr "فعال"
 
 #: templates/part.editaddressbook.php:29
 msgid "Save"
-msgstr ""
+msgstr "ذخیره سازی"
 
 #: templates/part.editaddressbook.php:29
 msgid "Submit"
-msgstr ""
+msgstr "ارسال"
 
 #: templates/part.editaddressbook.php:30
 #: templates/part.importaddressbook.php:28
 msgid "Cancel"
-msgstr ""
+msgstr "انصراف"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "وارد کردن پرونده حاوی اطلاعات"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "لطفا یک کتابچه نشانی انتخاب کنید"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "یک کتابچه نشانی بسازید"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "نام کتابچه نشانی جدید"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "وارد کردن"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "وارد کردن اشخاص"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "اشخاص با موفقیت افزوده شدند"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "بستن دیالوگ"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "وارد کردن کتابچه نشانی"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "یک کتابچه نشانی انتخاب کنید تا وارد شود"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند"
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "انتخاب از دیسک سخت"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "شماهیچ شخصی در  کتابچه نشانی خود ندارید"
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "افزودن اطلاعات شخص مورد نظر"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "پیکربندی کتابچه ی نشانی ها"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV syncing addresses "
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "اطلاعات بیشتر"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "نشانی اولیه"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X "
diff --git a/l10n/fa/core.po b/l10n/fa/core.po
index 5ed8e3615daaa0199f28a7bba04f3973574b22f1..ab6eb385a810adc933ab2e14f44790acde94b199 100644
--- a/l10n/fa/core.po
+++ b/l10n/fa/core.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 14:05+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,178 +20,178 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "نام برنامه پیدا نشد"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "آیا گروه دیگری برای افزودن ندارید"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "این گروه از قبل اضافه شده"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
-msgstr ""
+msgstr "گذرواژه ابرهای شما تغییرکرد"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "پسورد ابرهای شما تغییرکرد"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
-msgstr ""
+msgstr "از لینک زیر جهت دوباره سازی پسورد استفاده کنید :\n{link}"
 
 #: lostpassword/templates/lostpassword.php:3
 msgid "You will receive a link to reset your password via Email."
-msgstr ""
+msgstr "شما یک نامه الکترونیکی حاوی یک لینک جهت بازسازی گذرواژه دریافت خواهید کرد."
 
 #: lostpassword/templates/lostpassword.php:5
 msgid "Requested"
-msgstr ""
+msgstr "درخواست"
 
 #: lostpassword/templates/lostpassword.php:8
 msgid "Login failed!"
-msgstr ""
+msgstr "ورود ناموفق بود"
 
 #: lostpassword/templates/lostpassword.php:11 templates/installation.php:25
 #: templates/login.php:9
 msgid "Username"
-msgstr ""
+msgstr "شناسه"
 
 #: lostpassword/templates/lostpassword.php:15
 msgid "Request reset"
-msgstr ""
+msgstr "درخواست دوباره سازی"
 
 #: lostpassword/templates/resetpassword.php:4
 msgid "Your password was reset"
-msgstr ""
+msgstr "گذرواژه شما تغییرکرد"
 
 #: lostpassword/templates/resetpassword.php:5
 msgid "To login page"
-msgstr ""
+msgstr "به صفحه ورود"
 
 #: lostpassword/templates/resetpassword.php:8
 msgid "New password"
-msgstr ""
+msgstr "گذرواژه جدید"
 
 #: lostpassword/templates/resetpassword.php:11
 msgid "Reset password"
-msgstr ""
+msgstr "دوباره سازی گذرواژه"
 
 #: strings.php:5
 msgid "Personal"
-msgstr ""
+msgstr "شخصی"
 
 #: strings.php:6
 msgid "Users"
-msgstr ""
+msgstr "کاربر ها"
 
 #: strings.php:7
 msgid "Apps"
-msgstr ""
+msgstr "برنامه"
 
 #: strings.php:8
 msgid "Admin"
-msgstr ""
+msgstr "مدیر"
 
 #: strings.php:9
 msgid "Help"
-msgstr ""
+msgstr "کمک"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "اجازه دسترسی به مناطق ممنوعه را ندارید"
 
 #: templates/404.php:12
 msgid "Cloud not found"
-msgstr ""
+msgstr "پیدا نشد"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "ویرایش گروه ها"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "افزودن"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
-msgstr ""
+msgstr "لطفا یک <strong> شناسه برای مدیر</strong> بسازید"
 
 #: templates/installation.php:29 templates/login.php:13
 msgid "Password"
-msgstr ""
+msgstr "گذرواژه"
 
 #: templates/installation.php:35
 msgid "Advanced"
-msgstr ""
+msgstr "حرفه ای"
 
 #: templates/installation.php:37
 msgid "Data folder"
-msgstr ""
+msgstr "پوشه اطلاعاتی"
 
 #: templates/installation.php:44
 msgid "Configure the database"
-msgstr ""
+msgstr "پایگاه داده برنامه ریزی شدند"
 
 #: templates/installation.php:49 templates/installation.php:60
 #: templates/installation.php:70
 msgid "will be used"
-msgstr ""
+msgstr "استفاده خواهد شد"
 
 #: templates/installation.php:82
 msgid "Database user"
-msgstr ""
+msgstr "شناسه پایگاه داده"
 
 #: templates/installation.php:86
 msgid "Database password"
-msgstr ""
+msgstr "پسورد پایگاه داده"
 
 #: templates/installation.php:90
 msgid "Database name"
-msgstr ""
+msgstr "نام پایگاه داده"
 
 #: templates/installation.php:96
 msgid "Database host"
-msgstr ""
+msgstr "هاست پایگاه داده"
 
 #: templates/installation.php:101
 msgid "Finish setup"
-msgstr ""
+msgstr "اتمام نصب"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
-msgstr ""
+msgstr "سرویس وب تحت کنترل شما"
 
 #: templates/layout.user.php:35
 msgid "Log out"
-msgstr ""
+msgstr "خروج"
 
 #: templates/layout.user.php:47 templates/layout.user.php:48
 msgid "Settings"
-msgstr ""
+msgstr "تنظیمات"
 
 #: templates/login.php:6
 msgid "Lost your password?"
-msgstr ""
+msgstr "آیا گذرواژه تان را به یاد نمی آورید؟"
 
 #: templates/login.php:17
 msgid "remember"
-msgstr ""
+msgstr "بیاد آوری"
 
 #: templates/login.php:18
 msgid "Log in"
-msgstr ""
+msgstr "ورود"
 
 #: templates/logout.php:1
 msgid "You are logged out."
-msgstr ""
+msgstr "شما خارج شدید"
 
 #: templates/part.pagenavi.php:3
 msgid "prev"
-msgstr ""
+msgstr "بازگشت"
 
 #: templates/part.pagenavi.php:20
 msgid "next"
-msgstr ""
+msgstr "بعدی"
diff --git a/l10n/fa/files.po b/l10n/fa/files.po
index eca43ac2b9293a2496d70d8187cc9008a809b389..3de912cfeaee523532c82533eee9806ea809c13b 100644
--- a/l10n/fa/files.po
+++ b/l10n/fa/files.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 14:23+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,136 +20,136 @@ msgstr ""
 
 #: ajax/upload.php:19
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "هیچ خطایی وجود ندارد فایل با موفقیت بار گذاری شد"
 
 #: ajax/upload.php:20
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "حداکثر حجم تعیین شده برای بارگذاری در php.ini قابل ویرایش است"
 
 #: ajax/upload.php:21
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "حداکثر حجم مجاز برای بارگذاری از طریق HTML \nMAX_FILE_SIZE"
 
 #: ajax/upload.php:22
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "مقدار کمی از فایل بارگذاری شده"
 
 #: ajax/upload.php:23
 msgid "No file was uploaded"
-msgstr ""
+msgstr "هیچ فایلی بارگذاری نشده"
 
 #: ajax/upload.php:24
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "یک پوشه موقت گم شده است"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "نوشتن بر روی دیسک سخت ناموفق بود"
 
 #: appinfo/app.php:7
 msgid "Files"
-msgstr ""
+msgstr "فایل ها"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "اداره پرونده ها"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
-msgstr ""
+msgstr "حداکثر اندازه بارگزاری"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "حداکثرمقدارممکن:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "احتیاج پیدا خواهد شد برای چند پوشه و پرونده"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "فعال سازی بارگیری پرونده های فشرده"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 نامحدود است"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "حداکثرمقدار برای بار گزاری پرونده های فشرده"
 
 #: templates/index.php:7
 msgid "New"
-msgstr ""
+msgstr "جدید"
 
 #: templates/index.php:9
 msgid "Text file"
-msgstr ""
+msgstr "فایل متنی"
 
 #: templates/index.php:10
 msgid "Folder"
-msgstr ""
+msgstr "پوشه"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "از نشانی"
 
 #: templates/index.php:21
 msgid "Upload"
-msgstr ""
+msgstr "بارگذاری"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "متوقف کردن بار گذاری"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
-msgstr ""
+msgstr "اینجا هیچ چیز نیست."
 
 #: templates/index.php:47
 msgid "Name"
-msgstr ""
+msgstr "نام"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "به اشتراک گذاری"
 
 #: templates/index.php:51
 msgid "Download"
-msgstr ""
+msgstr "بارگیری"
 
 #: templates/index.php:55
 msgid "Size"
-msgstr ""
+msgstr "اندازه"
 
 #: templates/index.php:56
 msgid "Modified"
-msgstr ""
+msgstr "تغییر یافته"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "پاک کردن همه"
 
 #: templates/index.php:56
 msgid "Delete"
-msgstr ""
+msgstr "پاک کردن"
 
 #: templates/index.php:64
 msgid "Upload too large"
-msgstr ""
+msgstr "حجم بارگذاری بسیار زیاد است"
 
 #: templates/index.php:66
 msgid ""
 "The files you are trying to upload exceed the maximum size for file uploads "
 "on this server."
-msgstr ""
+msgstr "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد"
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "پرونده ها در حال بازرسی هستند لطفا صبر کنید"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "بازرسی کنونی"
diff --git a/l10n/fa/gallery.po b/l10n/fa/gallery.po
index 2c11d28e48e1a18a257a15cb0bdc83df62130f3b..03771002293c9cedd7076b3eb1ab2ac896a14db4 100644
--- a/l10n/fa/gallery.po
+++ b/l10n/fa/gallery.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 16:59+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,40 +20,40 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "تصاویر"
 
 #: templates/index.php:16
 msgid "Rescan"
-msgstr ""
+msgstr "بازرسی دوباره"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "توقف"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "به اشتراک گذاری"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "تنظیمات"
 
 #: templates/view_album.php:19
 msgid "Back"
-msgstr ""
+msgstr "بازگشت"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "پاک کردن تصدیق"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "آیا مایل به پاک کردن آلبوم هستید؟"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "تغییر نام آلبوم"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "نام آلبوم جدید"
diff --git a/l10n/fa/media.po b/l10n/fa/media.po
index afb2a835c13adcce3c03bb0d7b63c99119297dfa..af18cfd0cc72cf602d6b70a32225c9ee5a50bc1d 100644
--- a/l10n/fa/media.po
+++ b/l10n/fa/media.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2011-08-13 02:19+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 14:28+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -17,46 +18,46 @@ msgstr ""
 "Language: fa\n"
 "Plural-Forms: nplurals=1; plural=0\n"
 
-#: appinfo/app.php:32 templates/player.php:9
+#: appinfo/app.php:32 templates/player.php:8
 msgid "Music"
-msgstr ""
+msgstr "موسیقی"
 
-#: templates/music.php:3 templates/player.php:13
+#: templates/music.php:3 templates/player.php:12
 msgid "Play"
-msgstr ""
+msgstr "پخش کردن"
 
-#: templates/music.php:4 templates/music.php:26 templates/player.php:14
+#: templates/music.php:4 templates/music.php:26 templates/player.php:13
 msgid "Pause"
-msgstr ""
+msgstr "توقف کوتاه"
 
 #: templates/music.php:5
 msgid "Previous"
-msgstr ""
+msgstr "قبلی"
 
-#: templates/music.php:6 templates/player.php:15
+#: templates/music.php:6 templates/player.php:14
 msgid "Next"
-msgstr ""
+msgstr "بعدی"
 
 #: templates/music.php:7
 msgid "Mute"
-msgstr ""
+msgstr "خفه کردن"
 
 #: templates/music.php:8
 msgid "Unmute"
-msgstr ""
+msgstr "باز گشایی صدا"
 
 #: templates/music.php:25
 msgid "Rescan Collection"
-msgstr ""
+msgstr "دوباره بازرسی مجموعه ها"
 
 #: templates/music.php:37
 msgid "Artist"
-msgstr ""
+msgstr "هنرمند"
 
 #: templates/music.php:38
 msgid "Album"
-msgstr ""
+msgstr "آلبوم"
 
 #: templates/music.php:39
 msgid "Title"
-msgstr ""
+msgstr "عنوان"
diff --git a/l10n/fa/settings.po b/l10n/fa/settings.po
index 5ea4448b1287abcbd36b495e91a8d728cdc77373..e75bed6f8e04c66d243f3ddab11f42c37d9c9773 100644
--- a/l10n/fa/settings.po
+++ b/l10n/fa/settings.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Hossein nag <h.sname@yahoo.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 15:00+0000\n"
+"Last-Translator: Hossein nag <h.sname@yahoo.com>\n"
 "Language-Team: Persian (http://www.transifex.net/projects/p/owncloud/language/fa/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,165 +20,165 @@ msgstr ""
 
 #: ajax/lostpassword.php:14
 msgid "email Changed"
-msgstr ""
+msgstr "پست الکترونیکی تغییر کرد"
 
 #: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:19
 #: ajax/setlanguage.php:22
 msgid "Invalid request"
-msgstr ""
+msgstr "درخواست غیر قابل قبول"
 
 #: ajax/openid.php:15
 msgid "OpenID Changed"
-msgstr ""
+msgstr "OpenID تغییر کرد"
 
 #: ajax/setlanguage.php:17
 msgid "Language changed"
-msgstr ""
+msgstr "زبان تغییر کرد"
 
 #: personal.php:39 personal.php:40
 msgid "__language_name__"
-msgstr ""
+msgstr "__language_name__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "کارنامه"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "بیشتر"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "برنامه خود را بیافزایید"
 
 #: templates/apps.php:22
 msgid "Select an App"
-msgstr ""
+msgstr "یک برنامه انتخاب کنید"
 
 #: templates/apps.php:25
 msgid "-licensed"
-msgstr ""
+msgstr "مجوزنامه"
 
 #: templates/apps.php:25
 msgid "by"
-msgstr ""
+msgstr "به وسیله"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "مستندات"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "مدیریت پرونده های بزرگ"
 
 #: templates/help.php:10
 msgid "Ask a question"
-msgstr ""
+msgstr "یک سوال بپرسید"
 
 #: templates/help.php:22
 msgid "Problems connecting to help database."
-msgstr ""
+msgstr "مشکلاتی برای وصل شدن به پایگاه داده کمکی"
 
 #: templates/help.php:23
 msgid "Go there manually."
-msgstr ""
+msgstr "بروید آنجا به صورت دستی"
 
 #: templates/help.php:31
 msgid "Answer"
-msgstr ""
+msgstr "پاسخ"
 
 #: templates/personal.php:8
 msgid "You use"
-msgstr ""
+msgstr "شما استفاده می کنید"
 
 #: templates/personal.php:8
 msgid "of the available"
-msgstr ""
+msgstr "از فعال ها"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr " ابزار مدیریت با دسکتاپ و موبایل"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "بارگیری"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
-msgstr ""
+msgstr "گذرواژه شما تغییر یافته"
 
 #: templates/personal.php:20
 msgid "Unable to change your password"
-msgstr ""
+msgstr "ناتوان در تغییر گذرواژه"
 
 #: templates/personal.php:21
 msgid "Current password"
-msgstr ""
+msgstr "گذرواژه کنونی"
 
 #: templates/personal.php:22
 msgid "New password"
-msgstr ""
+msgstr "گذرواژه جدید"
 
 #: templates/personal.php:23
 msgid "show"
-msgstr ""
+msgstr "نمایش"
 
 #: templates/personal.php:24
 msgid "Change password"
-msgstr ""
+msgstr "تغییر گذر واژه"
 
 #: templates/personal.php:30
 msgid "Email"
-msgstr ""
+msgstr "پست الکترونیکی"
 
 #: templates/personal.php:31
 msgid "Your email address"
-msgstr ""
+msgstr "پست الکترونیکی شما"
 
 #: templates/personal.php:32
 msgid "Fill in an email address to enable password recovery"
-msgstr ""
+msgstr "پست الکترونیکی را پرکنید  تا بازیابی گذرواژه فعال شود"
 
 #: templates/personal.php:38 templates/personal.php:39
 msgid "Language"
-msgstr ""
+msgstr "زبان"
 
 #: templates/personal.php:44
 msgid "Help translate"
-msgstr ""
+msgstr "به ترجمه آن کمک کنید"
 
 #: templates/personal.php:51
 msgid "use this address to connect to your ownCloud in your file manager"
-msgstr ""
+msgstr "از این نشانی برای وصل شدن به ابرهایتان در مدیرپرونده استفاده کنید"
 
 #: templates/users.php:15 templates/users.php:44
 msgid "Name"
-msgstr ""
+msgstr "نام"
 
 #: templates/users.php:16 templates/users.php:45
 msgid "Password"
-msgstr ""
+msgstr "گذرواژه"
 
 #: templates/users.php:17 templates/users.php:46 templates/users.php:60
 msgid "Groups"
-msgstr ""
+msgstr "گروه ها"
 
 #: templates/users.php:22
 msgid "Create"
-msgstr ""
+msgstr "ایجاد کردن"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "سهم پیش فرض"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "سایر"
 
 #: templates/users.php:47
 msgid "Quota"
-msgstr ""
+msgstr "سهم"
 
 #: templates/users.php:80
 msgid "Delete"
-msgstr ""
+msgstr "پاک کردن"
diff --git a/l10n/fi_FI/contacts.po b/l10n/fi_FI/contacts.po
index 82b556ed2702f48ce543411512630b55ab39f82a..8dbd3939d82aaa8b097577599f4984a3fd69251a 100644
--- a/l10n/fi_FI/contacts.po
+++ b/l10n/fi_FI/contacts.po
@@ -6,9 +6,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Finnish (Finland) (http://www.transifex.net/projects/p/owncloud/language/fi_FI/)\n"
 "MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -69,10 +69,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/fi_FI/core.po b/l10n/fi_FI/core.po
index a9a8d64f327361718037270b7442d9b4c90aeaf5..a92f341d790a6780a1dad265cb6b8eb78ce8c703 100644
--- a/l10n/fi_FI/core.po
+++ b/l10n/fi_FI/core.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Pekka Sutela <pekka.sutela@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 11:34+0000\n"
+"Last-Translator: Pekka Sutela <pekka.sutela@gmail.com>\n"
 "Language-Team: Finnish (Finland) (http://www.transifex.net/projects/p/owncloud/language/fi_FI/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -56,7 +57,7 @@ msgstr ""
 #: lostpassword/templates/lostpassword.php:11 templates/installation.php:25
 #: templates/login.php:9
 msgid "Username"
-msgstr ""
+msgstr "Käyttäjätunnus"
 
 #: lostpassword/templates/lostpassword.php:15
 msgid "Request reset"
@@ -120,7 +121,7 @@ msgstr ""
 
 #: templates/installation.php:29 templates/login.php:13
 msgid "Password"
-msgstr ""
+msgstr "Salasana"
 
 #: templates/installation.php:35
 msgid "Advanced"
@@ -159,13 +160,13 @@ msgstr ""
 msgid "Finish setup"
 msgstr ""
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr ""
 
 #: templates/layout.user.php:35
 msgid "Log out"
-msgstr ""
+msgstr "Kirjaudu ulos"
 
 #: templates/layout.user.php:47 templates/layout.user.php:48
 msgid "Settings"
@@ -185,7 +186,7 @@ msgstr ""
 
 #: templates/logout.php:1
 msgid "You are logged out."
-msgstr ""
+msgstr "Olet kirjautunut ulos."
 
 #: templates/part.pagenavi.php:3
 msgid "prev"
diff --git a/l10n/fr/calendar.po b/l10n/fr/calendar.po
index a84f0d186cbfaccc47de6302d82204349468af3a..84be2c67d3411ac43cb44d0e323a9674e0d8a33f 100644
--- a/l10n/fr/calendar.po
+++ b/l10n/fr/calendar.po
@@ -12,10 +12,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 17:01+0000\n"
+"Last-Translator: Borjan Tchakaloff <borjan@tchaka.fr>\n"
 "Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -25,11 +25,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Aucun calendrier n'a été trouvé."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Aucun événement n'a été trouvé."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -55,71 +55,71 @@ msgstr "Calendrier"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Anniversaire"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Professionnel"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Appel"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Clientèle"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Livraison"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Vacances"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Idées"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Déplacement"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubilé"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Meeting"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Autre"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Personnel"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projets"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Questions"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Travail"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "sans-nom"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -368,7 +368,7 @@ msgstr "Choix des calendriers actifs"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Vos calendriers"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -377,15 +377,15 @@ msgstr "Lien CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Calendriers partagés"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Aucun calendrier partagé"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Partager le calendrier"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -402,7 +402,7 @@ msgstr "Supprimer"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "partagé avec vous par"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -447,23 +447,23 @@ msgstr "Exporter"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Événement"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Occurences"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarmes"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Participants"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Partage"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -475,11 +475,11 @@ msgstr "Catégorie"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Séparer les catégories par des virgules"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Modifier les catégories"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -600,11 +600,11 @@ msgstr "Créer un nouvel événement"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Voir un événement"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Aucune catégorie sélectionnée"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -612,11 +612,11 @@ msgstr "Sélectionner une catégorie"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "de"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "à"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -640,7 +640,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Premier jour de la semaine"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -648,24 +648,24 @@ msgstr "Adresse de synchronisation du calendrier CalDAV :"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Utilisateurs"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "sélectionner les utilisateurs"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Modifiable"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Groupes"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "sélectionner les groupes"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "rendre public"
diff --git a/l10n/fr/contacts.po b/l10n/fr/contacts.po
index ca23f2caee8312c39ea15489d66c74efad12f808..fe2b333ea1f7ebef68c74ea891efff3eac5ce7ba 100644
--- a/l10n/fr/contacts.po
+++ b/l10n/fr/contacts.po
@@ -5,15 +5,16 @@
 # Translators:
 #   <fboulogne@april.org>, 2011.
 #   <gp4004@arghh.org>, 2011.
+#   <guiguidu31300@gmail.com>, 2012.
 # Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
 #   <rom1dep@gmail.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 22:26+0000\n"
+"Last-Translator: rom1dep <rom1dep@gmail.com>\n"
 "Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -25,7 +26,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Une erreur s'est produite lors de l'ajout du contact."
 
@@ -39,7 +40,7 @@ msgstr "Au moins un des champs d'adresses doit être complété."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Ajout d'une propriété en double:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -47,39 +48,35 @@ msgstr "Erreur lors de l'ajout du champ."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Aucun ID fourni"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Erreur lors du paramétrage du hachage."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Pas de catégories sélectionnées pour la suppression."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Pas de carnet d'adresses trouvé."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Aucun contact trouvé."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "ID manquant"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Erreur lors de l'analyse du VCard pour l'ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Ne peut être ajouté avec un nom vide."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -91,27 +88,27 @@ msgstr "Erreur lors de l'activation du carnet d'adresses."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Aucun ID de contact envoyé"
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Erreur lors du chargement de l'image."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Erreur de lecture de la photo du contact."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Erreur de sauvegarde du fichier temporaire."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "La photo chargée est invalide."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "L'ID n'est pas défini."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -123,35 +120,35 @@ msgstr "Erreur lors de la suppression du champ."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "L'ID du contact est manquant."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "ID contact manquant."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Le chemin de la photo n'a pas été envoyé."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Fichier inexistant:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "Le champ Nom n'est pas défini."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "L'hachage n'est pas défini."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Quelque chose est FUBAR."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -159,7 +156,7 @@ msgstr "Erreur lors de la mise à jour du champ."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Impossible de mettre à jour le carnet d'adresses avec un nom vide."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -167,33 +164,33 @@ msgstr "Erreur lors de la mise à jour du carnet d'adresses."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Erreur lors de l'envoi des contacts vers le stockage."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Il n'y a pas d'erreur, le fichier a été envoyé avec succes."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Le fichier envoyé dépasse la directive upload_max_filesize dans php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Le fichier envoyé dépasse la directive MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML."
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Le fichier envoyé n'a été que partiellement envoyé."
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Pas de fichier envoyé."
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Absence de dossier temporaire."
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -201,7 +198,7 @@ msgstr "Contacts"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Carnet d'adresses introuvable."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -209,7 +206,7 @@ msgstr "Ce n'est pas votre carnet d'adresses."
 
 #: lib/app.php:38
 msgid "Contact could not be found."
-msgstr "Ce contact n'a pas été trouvé."
+msgstr "Ce contact n'a pu être trouvé."
 
 #: lib/app.php:94 templates/part.contact.php:109
 msgid "Address"
@@ -250,7 +247,7 @@ msgstr "Voix"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Message"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -266,11 +263,11 @@ msgstr "Bipeur"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Anniversaire de {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -286,7 +283,7 @@ msgstr "Carnets d'adresses"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Paramétrer carnet d'adresses"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -294,7 +291,7 @@ msgstr "Nouveau Carnet d'adresses"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importer depuis VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -325,23 +322,23 @@ msgstr "Supprimer le contact"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Glisser une photo pour l'envoi"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Editer les noms"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Surnom"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Entrer un surnom"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -349,19 +346,19 @@ msgstr "Anniversaire"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "jj-mm-aaaa"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Groupes"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Séparer les groupes avec des virgules"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Editer les groupes"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -369,11 +366,11 @@ msgstr "Préféré"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Merci d'entrer une adresse e-mail valide."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Entrer une adresse e-mail"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
@@ -381,35 +378,35 @@ msgstr ""
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Supprimer l'adresse e-mail"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Entrer un numéro de téléphone"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Supprimer le numéro de téléphone"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Voir sur une carte"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Editer les adresses"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Ajouter des notes ici."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Ajouter un champ."
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Photo de profil"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -417,27 +414,27 @@ msgstr "Téléphone"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Note"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Supprimer la photo actuelle"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Editer la photo actuelle"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Envoyer une nouvelle photo"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Sélectionner une photo depuis ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Editer l'adresse"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -480,7 +477,7 @@ msgstr "Pays"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Editer les catégories"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -492,47 +489,47 @@ msgstr "Carnet d'adresses"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Préfixe hon."
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Mlle"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Mme"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "M."
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Sir"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Mme"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Prénom"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Nom supplémentaires"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Nom de famille"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Suffixes hon."
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
@@ -597,76 +594,76 @@ msgstr "Annuler"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importer un fichier de contacts"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Choisissez le carnet d'adresses SVP"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Créer un nouveau carnet d'adresses"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Nom du nouveau carnet d'adresses"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importer"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importation des contacts"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Contacts importés avec succes"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Fermer la boite de dialogue"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importer un carnet d'adresses."
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Selectionner le carnet d'adresses à importer vers:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Glisser un fichier VCF pour importer des contacts."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Selectionner depuis le disque dur"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Il n'y a pas de contact dans votre carnet d'adresses."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Ajouter un contact"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Paramétrer carnet d'adresses"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Synchronisation des contacts CardDAV"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "Plus d'infos"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Adresse principale"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/fr/core.po b/l10n/fr/core.po
index d1ebdd29888dc42ce0a68c82c851c6dff8d6d6cf..40e9c70c9eeee599e722108b9860d1e11a32e959 100644
--- a/l10n/fr/core.po
+++ b/l10n/fr/core.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 16:44+0000\n"
+"Last-Translator: Borjan Tchakaloff <borjan@tchaka.fr>\n"
 "Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,15 +20,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Nom de l'application non fourni."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Pas de catégorie à ajouter ?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Cette catégorie existe déjà : "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -36,7 +36,7 @@ msgstr "Réinitialisation de votre mot de passe Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Réinitialisation de votre mot de passe Owncloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -101,7 +101,7 @@ msgstr "Aide"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Accès interdit"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +109,11 @@ msgstr "Introuvable"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Modifier les catégories"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Ajouter"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +160,7 @@ msgstr "Serveur de la base de données"
 msgid "Finish setup"
 msgstr "Terminer l'installation"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "services web sous votre contrôle"
 
diff --git a/l10n/fr/files.po b/l10n/fr/files.po
index 6da50a346cb9968e6e10ab3e18ceab1bc8cfe4f9..ff22b000dcd6c654e41c41c7dd710ae6df0e75c2 100644
--- a/l10n/fr/files.po
+++ b/l10n/fr/files.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+#   <guiguidu31300@gmail.com>, 2012.
 #   <rom1dep@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 16:58+0000\n"
+"Last-Translator: guiguidu31300 <guiguidu31300@gmail.com>\n"
 "Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +47,7 @@ msgstr "Il manque un répertoire temporaire"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Erreur d'écriture sur le disque"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +55,7 @@ msgstr "Fichiers"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Gestion des fichiers"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +63,23 @@ msgstr "Taille max. d'envoi"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "Max. possible :"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Nécessaire pour le téléchargement de plusieurs fichiers et de dossiers."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Activer le téléchargement ZIP"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 est illimité"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Taille maximale pour les fichiers ZIP"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +95,7 @@ msgstr "Dossier"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Depuis URL"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +103,7 @@ msgstr "Envoyer"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Annuler envoi"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +115,7 @@ msgstr "Nom"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Partager"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +131,7 @@ msgstr "Modifié"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Supprimer tout"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +149,8 @@ msgstr "Les fichiers que vous essayez d'envoyer dépassent la taille maximale pe
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Les fichiers sont analysés, patientez svp."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Analyse en cours"
diff --git a/l10n/fr/gallery.po b/l10n/fr/gallery.po
index 5aeb8758504b0b4108e727980ad1f66a78a56656..f7e7eb78e10084e47b0ee595e1ea9478988702f6 100644
--- a/l10n/fr/gallery.po
+++ b/l10n/fr/gallery.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 17:04+0000\n"
+"Last-Translator: Borjan Tchakaloff <borjan@tchaka.fr>\n"
 "Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Images"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -29,15 +29,15 @@ msgstr "Analyser à nouveau"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Arrêter"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Partager"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Préférences"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -45,16 +45,16 @@ msgstr "Retour"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Enlever la confirmation"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Voulez-vous supprimer l'album"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Modifier le nom de l'album"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nouveau nom de l'album"
diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po
index 459baa38a506927372e3dfdc62f81b6b88d771b9..0e1f6da4e0209af31e9af0888a4575aab9e92921 100644
--- a/l10n/fr/settings.po
+++ b/l10n/fr/settings.po
@@ -4,16 +4,17 @@
 # 
 # Translators:
 #   <fboulogne@april.org>, 2011.
+#   <guiguidu31300@gmail.com>, 2012.
 # Jan-Christoph Borchardt <JanCBorchardt@fsfe.org>, 2011.
 #   <pierreamiel.giraud@gmail.com>, 2012.
-#   <rom1dep@gmail.com>, 2011.
+#   <rom1dep@gmail.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 21:39+0000\n"
+"Last-Translator: rom1dep <rom1dep@gmail.com>\n"
 "Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,15 +45,15 @@ msgstr "Français"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Journaux"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Plus"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Ajouter votre application"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -68,11 +69,11 @@ msgstr "par"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentation"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Gérer les gros fichiers"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -100,11 +101,11 @@ msgstr "d'espace de stockage sur un total de"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Clients de synchronisation Mobile et Ordinateur"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Télécharger"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -140,7 +141,7 @@ msgstr "Votre adresse e-mail"
 
 #: templates/personal.php:32
 msgid "Fill in an email address to enable password recovery"
-msgstr "Entrez votre adresse e-mail pour activer la réinitialisation de mot de passe"
+msgstr "Entrez votre adresse e-mail pour permettre la réinitialisation du mot de passe"
 
 #: templates/personal.php:38 templates/personal.php:39
 msgid "Language"
@@ -172,11 +173,11 @@ msgstr "Créer"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Quota par défaut"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Autre"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/gl/contacts.po b/l10n/gl/contacts.po
index c7aa024ee0c1d98a32f41071949956d726797b71..375b79dd7b2ffa48d25f211f82ff273474163b7d 100644
--- a/l10n/gl/contacts.po
+++ b/l10n/gl/contacts.po
@@ -8,9 +8,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Galician (http://www.transifex.net/projects/p/owncloud/language/gl/)\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Produciuse un erro (des)activando a axenda."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Produciuse un erro engadindo o contacto."
 
@@ -71,10 +71,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/he/contacts.po b/l10n/he/contacts.po
index fcd706bf70d6f408260dd0f7e98714361b39087f..8ba27a195b1f0ba3a948e5bd144a678b98820d29 100644
--- a/l10n/he/contacts.po
+++ b/l10n/he/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Hebrew (http://www.transifex.net/projects/p/owncloud/language/he/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/hr/contacts.po b/l10n/hr/contacts.po
index b3045f1af173210fdd202623c7bbc08e517e00d5..88f340006fe504f0b26ded8b97d3a26d76691b61 100644
--- a/l10n/hr/contacts.po
+++ b/l10n/hr/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Croatian (http://www.transifex.net/projects/p/owncloud/language/hr/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/hu_HU/calendar.po b/l10n/hu_HU/calendar.po
index 80fff75320315107343f5ef063f24b99dceb4e39..e3dacabef1a733a46132694e8a12b0433944a6f4 100644
--- a/l10n/hu_HU/calendar.po
+++ b/l10n/hu_HU/calendar.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 # Peter Borsa <peter.borsa@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 21:58+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +21,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Nem található naptár"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Nem található esemény"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -32,7 +33,7 @@ msgstr "Hibás naptár"
 
 #: ajax/settings/guesstimezone.php:25
 msgid "New Timezone:"
-msgstr ""
+msgstr "Új időzóna"
 
 #: ajax/settings/settimezone.php:22
 msgid "Timezone changed"
@@ -50,71 +51,71 @@ msgstr "Naptár"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Születésap"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Üzlet"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Hívás"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Kliensek"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Szállító"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Ünnepek"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ötletek"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Utazás"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Évforduló"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Találkozó"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Egyéb"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Személyes"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projektek"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Kérdések"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Munka"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "névtelen"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -146,151 +147,151 @@ msgstr "Évi"
 
 #: lib/object.php:343
 msgid "never"
-msgstr ""
+msgstr "soha"
 
 #: lib/object.php:344
 msgid "by occurrences"
-msgstr ""
+msgstr "előfordulás szerint"
 
 #: lib/object.php:345
 msgid "by date"
-msgstr ""
+msgstr "dátum szerint"
 
 #: lib/object.php:352
 msgid "by monthday"
-msgstr ""
+msgstr "hónap napja szerint"
 
 #: lib/object.php:353
 msgid "by weekday"
-msgstr ""
+msgstr "hét napja szerint"
 
 #: lib/object.php:360 templates/settings.php:42
 msgid "Monday"
-msgstr ""
+msgstr "Hétfő"
 
 #: lib/object.php:361
 msgid "Tuesday"
-msgstr ""
+msgstr "Kedd"
 
 #: lib/object.php:362
 msgid "Wednesday"
-msgstr ""
+msgstr "Szerda"
 
 #: lib/object.php:363
 msgid "Thursday"
-msgstr ""
+msgstr "Csütörtök"
 
 #: lib/object.php:364
 msgid "Friday"
-msgstr ""
+msgstr "Péntek"
 
 #: lib/object.php:365
 msgid "Saturday"
-msgstr ""
+msgstr "Szombat"
 
 #: lib/object.php:366 templates/settings.php:43
 msgid "Sunday"
-msgstr ""
+msgstr "Vasárnap"
 
 #: lib/object.php:373
 msgid "events week of month"
-msgstr ""
+msgstr "hónap heteinek sorszáma"
 
 #: lib/object.php:374
 msgid "first"
-msgstr ""
+msgstr "első"
 
 #: lib/object.php:375
 msgid "second"
-msgstr ""
+msgstr "második"
 
 #: lib/object.php:376
 msgid "third"
-msgstr ""
+msgstr "harmadik"
 
 #: lib/object.php:377
 msgid "fourth"
-msgstr ""
+msgstr "negyedik"
 
 #: lib/object.php:378
 msgid "fifth"
-msgstr ""
+msgstr "ötödik"
 
 #: lib/object.php:379
 msgid "last"
-msgstr ""
+msgstr "utolsó"
 
 #: lib/object.php:401
 msgid "January"
-msgstr ""
+msgstr "Január"
 
 #: lib/object.php:402
 msgid "February"
-msgstr ""
+msgstr "Február"
 
 #: lib/object.php:403
 msgid "March"
-msgstr ""
+msgstr "Március"
 
 #: lib/object.php:404
 msgid "April"
-msgstr ""
+msgstr "Április"
 
 #: lib/object.php:405
 msgid "May"
-msgstr ""
+msgstr "Május"
 
 #: lib/object.php:406
 msgid "June"
-msgstr ""
+msgstr "Június"
 
 #: lib/object.php:407
 msgid "July"
-msgstr ""
+msgstr "Július"
 
 #: lib/object.php:408
 msgid "August"
-msgstr ""
+msgstr "Augusztus"
 
 #: lib/object.php:409
 msgid "September"
-msgstr ""
+msgstr "Szeptember"
 
 #: lib/object.php:410
 msgid "October"
-msgstr ""
+msgstr "Október"
 
 #: lib/object.php:411
 msgid "November"
-msgstr ""
+msgstr "November"
 
 #: lib/object.php:412
 msgid "December"
-msgstr ""
+msgstr "December"
 
 #: lib/object.php:418
 msgid "by events date"
-msgstr ""
+msgstr "az esemény napja szerint"
 
 #: lib/object.php:419
 msgid "by yearday(s)"
-msgstr ""
+msgstr "az év napja(i) szerint"
 
 #: lib/object.php:420
 msgid "by weeknumber(s)"
-msgstr ""
+msgstr "a hét sorszáma szerint"
 
 #: lib/object.php:421
 msgid "by day and month"
-msgstr ""
+msgstr "nap és hónap szerint"
 
 #: lib/search.php:32 lib/search.php:34 lib/search.php:37
 msgid "Date"
-msgstr ""
+msgstr "Dátum"
 
 #: lib/search.php:40
 msgid "Cal."
-msgstr ""
+msgstr "Naptár"
 
 #: templates/calendar.php:11
 msgid "All day"
@@ -363,7 +364,7 @@ msgstr "Aktív naptár kiválasztása"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Naptárjaid"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -372,15 +373,15 @@ msgstr "CalDAV link"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Megosztott naptárak"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Nincs megosztott naptár"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Naptármegosztás"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -397,7 +398,7 @@ msgstr "Törlés"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "megosztotta veled: "
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -442,23 +443,23 @@ msgstr "Export"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Eseményinfó"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Ismétlődő"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Riasztás"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Résztvevők"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Megosztás"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -470,11 +471,11 @@ msgstr "Kategória"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Vesszővel válaszd el a kategóriákat"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategóriák szerkesztése"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -482,11 +483,11 @@ msgstr "Egész napos esemény"
 
 #: templates/part.eventform.php:60 templates/part.showevent.php:59
 msgid "From"
-msgstr ""
+msgstr "Ettől"
 
 #: templates/part.eventform.php:68 templates/part.showevent.php:67
 msgid "To"
-msgstr ""
+msgstr "Eddig"
 
 #: templates/part.eventform.php:76 templates/part.showevent.php:75
 msgid "Advanced options"
@@ -514,52 +515,52 @@ msgstr "Ismétlés"
 
 #: templates/part.eventform.php:107 templates/part.showevent.php:105
 msgid "Advanced"
-msgstr ""
+msgstr "Haladó"
 
 #: templates/part.eventform.php:151 templates/part.showevent.php:149
 msgid "Select weekdays"
-msgstr ""
+msgstr "Hétköznapok kiválasztása"
 
 #: templates/part.eventform.php:164 templates/part.eventform.php:177
 #: templates/part.showevent.php:162 templates/part.showevent.php:175
 msgid "Select days"
-msgstr ""
+msgstr "Napok kiválasztása"
 
 #: templates/part.eventform.php:169 templates/part.showevent.php:167
 msgid "and the events day of year."
-msgstr ""
+msgstr "és az éves esemény napja."
 
 #: templates/part.eventform.php:182 templates/part.showevent.php:180
 msgid "and the events day of month."
-msgstr ""
+msgstr "és a havi esemény napja."
 
 #: templates/part.eventform.php:190 templates/part.showevent.php:188
 msgid "Select months"
-msgstr ""
+msgstr "Hónapok kiválasztása"
 
 #: templates/part.eventform.php:203 templates/part.showevent.php:201
 msgid "Select weeks"
-msgstr ""
+msgstr "Hetek kiválasztása"
 
 #: templates/part.eventform.php:208 templates/part.showevent.php:206
 msgid "and the events week of year."
-msgstr ""
+msgstr "és az heti esemény napja."
 
 #: templates/part.eventform.php:214 templates/part.showevent.php:212
 msgid "Interval"
-msgstr ""
+msgstr "Időköz"
 
 #: templates/part.eventform.php:220 templates/part.showevent.php:218
 msgid "End"
-msgstr ""
+msgstr "Vége"
 
 #: templates/part.eventform.php:233 templates/part.showevent.php:231
 msgid "occurrences"
-msgstr ""
+msgstr "előfordulások"
 
 #: templates/part.import.php:1
 msgid "Import a calendar file"
-msgstr ""
+msgstr "Naptár-fájl importálása"
 
 #: templates/part.import.php:6
 msgid "Please choose the calendar"
@@ -567,11 +568,11 @@ msgstr "Válassz naptárat"
 
 #: templates/part.import.php:10
 msgid "create a new calendar"
-msgstr ""
+msgstr "új naptár létrehozása"
 
 #: templates/part.import.php:15
 msgid "Name of new calendar"
-msgstr ""
+msgstr "Új naptár neve"
 
 #: templates/part.import.php:17
 msgid "Import"
@@ -579,15 +580,15 @@ msgstr "Importálás"
 
 #: templates/part.import.php:20
 msgid "Importing calendar"
-msgstr ""
+msgstr "Naptár importálása"
 
 #: templates/part.import.php:23
 msgid "Calendar imported successfully"
-msgstr ""
+msgstr "Naptár sikeresen importálva"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Párbeszédablak bezárása"
 
 #: templates/part.newevent.php:1
 msgid "Create a new event"
@@ -595,11 +596,11 @@ msgstr "Új esemény létrehozása"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Esemény megtekintése"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Nincs kiválasztott kategória"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -607,11 +608,11 @@ msgstr "Kategória kiválasztása"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr ", tulaj "
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr ", "
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -619,7 +620,7 @@ msgstr "Időzóna"
 
 #: templates/settings.php:31
 msgid "Check always for changes of the timezone"
-msgstr ""
+msgstr "Mindig ellenőrizze az időzóna-változásokat"
 
 #: templates/settings.php:33
 msgid "Timeformat"
@@ -635,7 +636,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "A hét első napja"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,24 +644,24 @@ msgstr "Naptár CalDAV szinkronizálási cím:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Felhasználók"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "válassz felhasználókat"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Szerkeszthető"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Csoportok"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "válassz csoportokat"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "nyilvánossá tétel"
diff --git a/l10n/hu_HU/contacts.po b/l10n/hu_HU/contacts.po
index d780210c8a87b0e57ecaf8ded102ce4447359eaf..7cc910a4cae6e3a7357843e0cd5473be6985c3a0 100644
--- a/l10n/hu_HU/contacts.po
+++ b/l10n/hu_HU/contacts.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 #   <mail@tamas-nagy.net>, 2011.
 # Peter Borsa <peter.borsa@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 22:02+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,95 +22,91 @@ msgstr ""
 
 #: ajax/activation.php:19 ajax/updateaddressbook.php:32
 msgid "Error (de)activating addressbook."
-msgstr ""
+msgstr "Címlista (de)aktiválása sikertelen"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
-msgstr ""
+msgstr "Hiba a kontakt hozzáadásakor"
 
 #: ajax/addproperty.php:40
 msgid "Cannot add empty property."
-msgstr ""
+msgstr "Nem adható hozzá üres tulajdonság"
 
 #: ajax/addproperty.php:52
 msgid "At least one of the address fields has to be filled out."
-msgstr ""
+msgstr "Legalább egy címmező kitöltendő"
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Kísérlet dupla tulajdonság hozzáadására: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
-msgstr ""
+msgstr "Hiba a kontakt-tulajdonság hozzáadásakor"
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Nincs ID megadva"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Hiba az ellenőrzőösszeg beállításakor"
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Nincs kiválasztva törlendő kategória"
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Nem található címlista"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Nem található kontakt"
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Hiányzó ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "VCard elemzése sikertelen a következő ID-hoz: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Nem adható hozzá névtelen címlista"
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
-msgstr ""
+msgstr "Hiba a címlista hozzáadásakor"
 
 #: ajax/createaddressbook.php:30
 msgid "Error activating addressbook."
-msgstr ""
+msgstr "Címlista aktiválása sikertelen"
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Nincs ID megadva a kontakthoz"
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Kép betöltése sikertelen"
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "A kontakt képének beolvasása sikertelen"
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Ideiglenes fájl mentése sikertelen"
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "A kép érvénytelen"
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ID nincs beállítva"
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -117,89 +114,89 @@ msgstr "A vCardról szóló információ helytelen. Töltsd újra az oldalt."
 
 #: ajax/deleteproperty.php:43
 msgid "Error deleting contact property."
-msgstr ""
+msgstr "Hiba a kontakt-tulajdonság törlésekor"
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Hiányzik a kontakt ID"
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Hiányzik a kontakt ID"
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Nincs fénykép-útvonal megadva"
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "A fájl nem létezik:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "az elem neve nincs beállítva"
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "az ellenőrzőösszeg nincs beállítva"
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Helytelen információ a vCardról. Töltse újra az oldalt: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Valami balul sült el."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
-msgstr ""
+msgstr "Hiba a kontakt-tulajdonság frissítésekor"
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Üres névvel nem frissíthető a címlista"
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
-msgstr ""
+msgstr "Hiba a címlista frissítésekor"
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Hiba a kontaktok feltöltésekor"
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Nincs hiba, a fájl sikeresen feltöltődött"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "A feltöltött fájl mérete meghaladja az upload_max_filesize értéket a php.ini-ben"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "A feltöltött fájl mérete meghaladja a HTML form-ban megadott MAX_FILE_SIZE értéket"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "A fájl csak részlegesen lett feltöltve"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Nincs feltöltött fájl"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Hiányzik az ideiglenes könyvtár"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
-msgstr ""
+msgstr "Kontaktok"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Címlista nem található"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -224,15 +221,15 @@ msgstr "E-mail"
 #: lib/app.php:97 templates/part.contact.php:33 templates/part.contact.php:34
 #: templates/part.contact.php:104
 msgid "Organization"
-msgstr "Organizáció"
+msgstr "Szervezet"
 
 #: lib/app.php:109 lib/app.php:116 lib/app.php:126
 msgid "Work"
-msgstr "Munka"
+msgstr "Munkahelyi"
 
 #: lib/app.php:110 lib/app.php:114 lib/app.php:127
 msgid "Home"
-msgstr "Otthon"
+msgstr "Otthoni"
 
 #: lib/app.php:115
 msgid "Mobile"
@@ -248,7 +245,7 @@ msgstr "Hang"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Üzenet"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -260,19 +257,19 @@ msgstr "Video"
 
 #: lib/app.php:122
 msgid "Pager"
-msgstr "Lapozó"
+msgstr "Személyhívó"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name} születésnapja"
 
 #: lib/search.php:22
 msgid "Contact"
-msgstr ""
+msgstr "Kontakt"
 
 #: templates/index.php:13
 msgid "Add Contact"
@@ -280,28 +277,28 @@ msgstr "Kontakt hozzáadása"
 
 #: templates/index.php:14
 msgid "Addressbooks"
-msgstr ""
+msgstr "Címlisták"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Címlisták beállítása"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
-msgstr ""
+msgstr "Új címlista"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importálás VCF-ből"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
 msgid "CardDav Link"
-msgstr ""
+msgstr "CardDav hivatkozás"
 
 #: templates/part.chooseaddressbook.rowfields.php:11
 msgid "Download"
-msgstr ""
+msgstr "Letöltés"
 
 #: templates/part.chooseaddressbook.rowfields.php:14
 msgid "Edit"
@@ -315,31 +312,31 @@ msgstr "Törlés"
 
 #: templates/part.contact.php:12
 msgid "Download contact"
-msgstr ""
+msgstr "Kontakt letöltése"
 
 #: templates/part.contact.php:13
 msgid "Delete contact"
-msgstr ""
+msgstr "Kontakt törlése"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Húzza ide a feltöltendő képet"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Név részleteinek szerkesztése"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Becenév"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Becenév megadása"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -347,67 +344,67 @@ msgstr "Születésnap"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "yyyy-mm-dd"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Csoportok"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Vesszővel válassza el a csoportokat"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Csoportok szerkesztése"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
-msgstr ""
+msgstr "Előnyben részesített"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Adjon meg érvényes email címet"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Adja meg az email címet"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Postai cím"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Email cím törlése"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Adja meg a telefonszámot"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Telefonszám törlése"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Megtekintés a térképen"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Cím részleteinek szerkesztése"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Megjegyzések"
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Mező hozzáadása"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profilkép"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -415,31 +412,31 @@ msgstr "Telefonszám"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Jegyzet"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Aktuális kép törlése"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Aktuális kép szerkesztése"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Új kép feltöltése"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Kép kiválasztása ownCloud-ból"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Cím szerkesztése"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
-msgstr ""
+msgstr "Típus"
 
 #: templates/part.edit_address_dialog.php:22
 #: templates/part.edit_address_dialog.php:25
@@ -459,7 +456,7 @@ msgstr "Utca"
 #: templates/part.edit_address_dialog.php:41
 #: templates/part.edit_address_dialog.php:44
 msgid "City"
-msgstr "Helység"
+msgstr "Város"
 
 #: templates/part.edit_address_dialog.php:47
 #: templates/part.edit_address_dialog.php:50
@@ -478,193 +475,193 @@ msgstr "Ország"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategóriák szerkesztése"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Hozzáad"
 
 #: templates/part.edit_name_dialog.php:16
 msgid "Addressbook"
-msgstr ""
+msgstr "Címlista"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Előtag"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Miss"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Ms"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Mr"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Sir"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Mrs"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Teljes név"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "További nevek"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Családnév"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Utótag"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Ifj."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Id."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
-msgstr ""
+msgstr "Új Címlista"
 
 #: templates/part.editaddressbook.php:9
 msgid "Edit Addressbook"
-msgstr ""
+msgstr "Címlista szerkesztése"
 
 #: templates/part.editaddressbook.php:12
 msgid "Displayname"
-msgstr ""
+msgstr "Megjelenített név"
 
 #: templates/part.editaddressbook.php:23
 msgid "Active"
-msgstr ""
+msgstr "Aktív"
 
 #: templates/part.editaddressbook.php:29
 msgid "Save"
-msgstr ""
+msgstr "Mentés"
 
 #: templates/part.editaddressbook.php:29
 msgid "Submit"
-msgstr ""
+msgstr "Elküld"
 
 #: templates/part.editaddressbook.php:30
 #: templates/part.importaddressbook.php:28
 msgid "Cancel"
-msgstr ""
+msgstr "Mégsem"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Kontakt-fájl importálása"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Válassza ki a címlistát"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Címlista létrehozása"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Új címlista neve"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Import"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Kontaktok importálása"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontaktok importálása sikeres"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Párbeszédablak bezárása"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Címlista importálása"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Melyik címlistába történjen az importálás:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Húzza ide a VCF fájlt a kontaktok importálásához"
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Kiválasztás merevlemezről"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Nincs kontakt a címlistában"
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Kontakt hozzáadása"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Címlisták beállítása"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV szinkronizációs címek"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "további infó"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Elsődleges cím"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/hu_HU/core.po b/l10n/hu_HU/core.po
index c204b3e9232c9ae369f10f12c384edaa912d0747..72f237d2d16b37863f99853a7d78837aeda38f9c 100644
--- a/l10n/hu_HU/core.po
+++ b/l10n/hu_HU/core.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 #   <mail@tamas-nagy.net>, 2011.
 # Peter Borsa <peter.borsa@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 19:46+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,27 +22,27 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Alkalmazásnév hiányzik"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Nincs hozzáadandó kategória?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Ez a kategória már létezik"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
-msgstr ""
+msgstr "ownCloud jelszó-visszaállítás"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud jelszó-visszaállítás"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
-msgstr ""
+msgstr "Használja az alábbi linket a jelszó-visszaállításhoz: {link}"
 
 #: lostpassword/templates/lostpassword.php:3
 msgid "You will receive a link to reset your password via Email."
@@ -62,7 +63,7 @@ msgstr "Felhasználói név"
 
 #: lostpassword/templates/lostpassword.php:15
 msgid "Request reset"
-msgstr ""
+msgstr "Visszaállítás igénylése"
 
 #: lostpassword/templates/resetpassword.php:4
 msgid "Your password was reset"
@@ -70,7 +71,7 @@ msgstr "Jelszó megváltoztatásra került"
 
 #: lostpassword/templates/resetpassword.php:5
 msgid "To login page"
-msgstr ""
+msgstr "A bejelentkező ablakhoz"
 
 #: lostpassword/templates/resetpassword.php:8
 msgid "New password"
@@ -102,7 +103,7 @@ msgstr "Súgó"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Hozzáférés tiltva"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +111,11 @@ msgstr "Nem talált felhő"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategóriák szerkesztése"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Hozzáadás"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,9 +162,9 @@ msgstr "Adatbázis szerver"
 msgid "Finish setup"
 msgstr "Beállítások befejezése"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
-msgstr ""
+msgstr "webszolgáltatások az irányításod alatt"
 
 #: templates/layout.user.php:35
 msgid "Log out"
diff --git a/l10n/hu_HU/files.po b/l10n/hu_HU/files.po
index cb873dcae9ab76159197406a9731a99565599d9f..c846e2e6c5a514d5910e5a22dc43d0b7c4be4510 100644
--- a/l10n/hu_HU/files.po
+++ b/l10n/hu_HU/files.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 #   <mail@tamas-nagy.net>, 2011.
 # Peter Borsa <peter.borsa@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 19:33+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +48,7 @@ msgstr "Hiányzik az ideiglenes könyvtár"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Nem írható lemezre"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +56,7 @@ msgstr "Fájlok"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Fájlkezelés"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,39 +64,39 @@ msgstr "Maximális feltölthető fájlméret"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "max. lehetséges"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Kötegelt file- vagy mappaletöltéshez szükséges"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "ZIP-letöltés engedélyezése"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 = korlátlan"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "ZIP file-ok maximum mérete"
 
 #: templates/index.php:7
 msgid "New"
-msgstr ""
+msgstr "Új"
 
 #: templates/index.php:9
 msgid "Text file"
-msgstr ""
+msgstr "Szövegfájl"
 
 #: templates/index.php:10
 msgid "Folder"
-msgstr ""
+msgstr "Mappa"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "URL-ből"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +104,7 @@ msgstr "Feltöltés"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Feltöltés megszakítása"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +116,7 @@ msgstr "Név"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Megosztás"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +132,7 @@ msgstr "Módosítva"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Mindent töröl"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +150,8 @@ msgstr "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlmé
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "File-ok vizsgálata, kis türelmet"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Aktuális vizsgálat"
diff --git a/l10n/hu_HU/gallery.po b/l10n/hu_HU/gallery.po
index 0a6190f958d75a149a7b9fcf19b3c0bf8c2ad4d8..a732dbfcdad033a2b522063c19a4142021e90c82 100644
--- a/l10n/hu_HU/gallery.po
+++ b/l10n/hu_HU/gallery.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 21:43+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,40 +20,40 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Képek"
 
 #: templates/index.php:16
 msgid "Rescan"
-msgstr ""
+msgstr "Újravizsgálás"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Állj"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Megosztás"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Beállítások"
 
 #: templates/view_album.php:19
 msgid "Back"
-msgstr ""
+msgstr "Vissza"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Megerősítés eltávolítása"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "El akarja távolítani az albumot?"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Albumnév megváltoztatása"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Új albumnév"
diff --git a/l10n/hu_HU/media.po b/l10n/hu_HU/media.po
index e6e88d5abd75a88302caf93492ddc0eff86a54fd..bd041974a03bb5b12ecc001471b2ce7cde3edcb8 100644
--- a/l10n/hu_HU/media.po
+++ b/l10n/hu_HU/media.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 # Peter Borsa <peter.borsa@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-02-14 09:15+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 19:27+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -18,15 +19,15 @@ msgstr ""
 "Language: hu_HU\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: appinfo/app.php:32 templates/player.php:9
+#: appinfo/app.php:32 templates/player.php:8
 msgid "Music"
 msgstr "Zene"
 
-#: templates/music.php:3 templates/player.php:13
+#: templates/music.php:3 templates/player.php:12
 msgid "Play"
 msgstr "Lejátszás"
 
-#: templates/music.php:4 templates/music.php:26 templates/player.php:14
+#: templates/music.php:4 templates/music.php:26 templates/player.php:13
 msgid "Pause"
 msgstr "Szünet"
 
@@ -34,7 +35,7 @@ msgstr "Szünet"
 msgid "Previous"
 msgstr "Előző"
 
-#: templates/music.php:6 templates/player.php:15
+#: templates/music.php:6 templates/player.php:14
 msgid "Next"
 msgstr "Következő"
 
diff --git a/l10n/hu_HU/settings.po b/l10n/hu_HU/settings.po
index 6583aad33062c0bc91645e7fb635748d59759158..56c5d55264138be929607b0e188cc89eeed749dd 100644
--- a/l10n/hu_HU/settings.po
+++ b/l10n/hu_HU/settings.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Adam Toth <adazlord@gmail.com>, 2012.
 # Peter Borsa <peter.borsa@gmail.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 19:56+0000\n"
+"Last-Translator: Adam Toth <adazlord@gmail.com>\n"
 "Language-Team: Hungarian (Hungary) (http://www.transifex.net/projects/p/owncloud/language/hu_HU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: ajax/lostpassword.php:14
 msgid "email Changed"
-msgstr ""
+msgstr "Email megváltozott"
 
 #: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:19
 #: ajax/setlanguage.php:22
@@ -37,19 +38,19 @@ msgstr "A nyelv megváltozott"
 
 #: personal.php:39 personal.php:40
 msgid "__language_name__"
-msgstr ""
+msgstr "__language_name__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Napló"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Tovább"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "App hozzáadása"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -57,19 +58,19 @@ msgstr "Egy App kiválasztása"
 
 #: templates/apps.php:25
 msgid "-licensed"
-msgstr "-licenszelt"
+msgstr "-licencelt"
 
 #: templates/apps.php:25
 msgid "by"
-msgstr ""
+msgstr ":"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentáció"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Nagy fájlok kezelése"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -77,7 +78,7 @@ msgstr "Tégy fel egy kérdést"
 
 #: templates/help.php:22
 msgid "Problems connecting to help database."
-msgstr ""
+msgstr "Sikertelen csatlakozás a Súgó adatbázishoz"
 
 #: templates/help.php:23
 msgid "Go there manually."
@@ -89,23 +90,23 @@ msgstr "Válasz"
 
 #: templates/personal.php:8
 msgid "You use"
-msgstr ""
+msgstr "Használatban: "
 
 #: templates/personal.php:8
 msgid "of the available"
-msgstr "a rendelkezésre álló"
+msgstr ", rendelkezésre áll: "
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Asztali- és mobilkliensek kezelése"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Letöltés"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
-msgstr "A jelszó megváltozott"
+msgstr "A jelszavad megváltozott"
 
 #: templates/personal.php:20
 msgid "Unable to change your password"
@@ -121,7 +122,7 @@ msgstr "Új jelszó"
 
 #: templates/personal.php:23
 msgid "show"
-msgstr "Mutatás"
+msgstr "Mutat"
 
 #: templates/personal.php:24
 msgid "Change password"
@@ -129,15 +130,15 @@ msgstr "Jelszó megváltoztatása"
 
 #: templates/personal.php:30
 msgid "Email"
-msgstr ""
+msgstr "Email"
 
 #: templates/personal.php:31
 msgid "Your email address"
-msgstr ""
+msgstr "Email címed"
 
 #: templates/personal.php:32
 msgid "Fill in an email address to enable password recovery"
-msgstr ""
+msgstr "Töltsd ki az email címet, hogy engedélyezhesd a jelszó-visszaállítást"
 
 #: templates/personal.php:38 templates/personal.php:39
 msgid "Language"
@@ -145,7 +146,7 @@ msgstr "Nyelv"
 
 #: templates/personal.php:44
 msgid "Help translate"
-msgstr ""
+msgstr "Segíts lefordítani!"
 
 #: templates/personal.php:51
 msgid "use this address to connect to your ownCloud in your file manager"
@@ -169,15 +170,15 @@ msgstr "Létrehozás"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Alapértelmezett kvóta"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Egyéb"
 
 #: templates/users.php:47
 msgid "Quota"
-msgstr ""
+msgstr "Kvóta"
 
 #: templates/users.php:80
 msgid "Delete"
diff --git a/l10n/hy/contacts.po b/l10n/hy/contacts.po
index bcf2a0c06f063e274d14d182554d6ede13bb8187..aa1f44970c0751c0f598813276e79bb834b727dd 100644
--- a/l10n/hy/contacts.po
+++ b/l10n/hy/contacts.po
@@ -6,9 +6,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Armenian (http://www.transifex.net/projects/p/owncloud/language/hy/)\n"
 "MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -69,10 +69,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/ia/calendar.po b/l10n/ia/calendar.po
index 7d177d86a749497ea380596f3fa0bb5a0931bb36..6b9b70f7c16d7da93a2e46aca6e0a5adf30e5236 100644
--- a/l10n/ia/calendar.po
+++ b/l10n/ia/calendar.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 03:44+0000\n"
+"Last-Translator: Emilio Sepúlveda <emisepulvedam@gmail.com>\n"
 "Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/language/ia/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +20,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Necun calendarios trovate."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Nulle eventos trovate."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -52,85 +52,85 @@ msgstr "Calendario"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
-msgstr ""
+msgstr "Anniversario de nativitate"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
-msgstr ""
+msgstr "Affaires"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Appello"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
-msgstr ""
+msgstr "Clientes"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr ""
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
-msgstr ""
+msgstr "Dies feriate"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr ""
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr ""
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr ""
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Incontro"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Altere"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Personal"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projectos"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Demandas"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Travalio"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "sin nomine"
 
 #: lib/object.php:330
 msgid "Does not repeat"
-msgstr ""
+msgstr "Non repite"
 
 #: lib/object.php:331
 msgid "Daily"
-msgstr ""
+msgstr "Quotidian"
 
 #: lib/object.php:332
 msgid "Weekly"
-msgstr ""
+msgstr "Septimanal"
 
 #: lib/object.php:333
 msgid "Every Weekday"
-msgstr ""
+msgstr "Cata die"
 
 #: lib/object.php:334
 msgid "Bi-Weekly"
@@ -138,11 +138,11 @@ msgstr ""
 
 #: lib/object.php:335
 msgid "Monthly"
-msgstr ""
+msgstr "Mensual"
 
 #: lib/object.php:336
 msgid "Yearly"
-msgstr ""
+msgstr "Cata anno"
 
 #: lib/object.php:343
 msgid "never"
@@ -270,7 +270,7 @@ msgstr "Decembre"
 
 #: lib/object.php:418
 msgid "by events date"
-msgstr ""
+msgstr "per data de eventos"
 
 #: lib/object.php:419
 msgid "by yearday(s)"
@@ -282,7 +282,7 @@ msgstr ""
 
 #: lib/object.php:421
 msgid "by day and month"
-msgstr ""
+msgstr "per dia e mense"
 
 #: lib/search.php:32 lib/search.php:34 lib/search.php:37
 msgid "Date"
@@ -302,7 +302,7 @@ msgstr "Nove calendario"
 
 #: templates/calendar.php:13
 msgid "Missing fields"
-msgstr ""
+msgstr "Campos incomplete"
 
 #: templates/calendar.php:14 templates/part.eventform.php:19
 #: templates/part.showevent.php:11
@@ -363,7 +363,7 @@ msgstr "Selectionar calendarios active"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Tu calendarios"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -458,7 +458,7 @@ msgstr ""
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Compartir"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -474,7 +474,7 @@ msgstr ""
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Modificar categorias"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -518,12 +518,12 @@ msgstr "Avantiate"
 
 #: templates/part.eventform.php:151 templates/part.showevent.php:149
 msgid "Select weekdays"
-msgstr ""
+msgstr "Seliger dies del septimana"
 
 #: templates/part.eventform.php:164 templates/part.eventform.php:177
 #: templates/part.showevent.php:162 templates/part.showevent.php:175
 msgid "Select days"
-msgstr ""
+msgstr "Seliger dies"
 
 #: templates/part.eventform.php:169 templates/part.showevent.php:167
 msgid "and the events day of year."
@@ -567,7 +567,7 @@ msgstr "Selige el calendario"
 
 #: templates/part.import.php:10
 msgid "create a new calendar"
-msgstr ""
+msgstr "crear un nove calendario"
 
 #: templates/part.import.php:15
 msgid "Name of new calendar"
@@ -595,11 +595,11 @@ msgstr "Crear un nove evento"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Vide un evento"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Nulle categorias seligite"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -607,11 +607,11 @@ msgstr "Selectionar categoria"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "de"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "in"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -635,7 +635,7 @@ msgstr ""
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Prime die del septimana"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,7 +643,7 @@ msgstr ""
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Usatores"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
@@ -655,7 +655,7 @@ msgstr ""
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Gruppos"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
diff --git a/l10n/ia/contacts.po b/l10n/ia/contacts.po
index e04aeb72339c0aa67c4c6e9ad8182cd32433a28b..33da0ad226bd649c66c7c62aaa2d80150f4ce09d 100644
--- a/l10n/ia/contacts.po
+++ b/l10n/ia/contacts.po
@@ -8,9 +8,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/language/ia/)\n"
 "MIME-Version: 1.0\n"
@@ -23,13 +23,13 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
 #: ajax/addproperty.php:40
 msgid "Cannot add empty property."
-msgstr ""
+msgstr "Non pote adder proprietate vacue."
 
 #: ajax/addproperty.php:52
 msgid "At least one of the address fields has to be filled out."
@@ -57,11 +57,11 @@ msgstr ""
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Nulle adressario trovate"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Nulle contactos trovate."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
@@ -71,21 +71,17 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
-msgstr ""
+msgstr "Error durante que il addeva le adressario."
 
 #: ajax/createaddressbook.php:30
 msgid "Error activating addressbook."
-msgstr ""
+msgstr "Error in activar adressario"
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
@@ -93,7 +89,7 @@ msgstr ""
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Il habeva un error durante le cargamento del imagine."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
@@ -101,7 +97,7 @@ msgstr ""
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Error durante le scriptura in le file temporari"
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
@@ -187,11 +183,11 @@ msgstr ""
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Nulle file esseva incargate."
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Manca un dossier temporari"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -199,7 +195,7 @@ msgstr "Contactos"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adressario non trovate."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -248,7 +244,7 @@ msgstr "Voce"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Message"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -264,7 +260,7 @@ msgstr "Pager"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
@@ -297,7 +293,7 @@ msgstr ""
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
 msgid "CardDav Link"
-msgstr ""
+msgstr "Ligamine CardDav"
 
 #: templates/part.chooseaddressbook.rowfields.php:11
 msgid "Download"
@@ -335,11 +331,11 @@ msgstr ""
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Pseudonymo"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Inserer pseudonymo"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -351,7 +347,7 @@ msgstr ""
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Gruppos"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
@@ -359,7 +355,7 @@ msgstr ""
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Modificar gruppos"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -371,7 +367,7 @@ msgstr ""
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Entrar un adresse de e-posta"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
@@ -379,19 +375,19 @@ msgstr ""
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Deler adresse de E-posta"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Entrar un numero de telephono"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Deler numero de telephono"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Vider in un carta"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
@@ -399,15 +395,15 @@ msgstr ""
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Adder notas hic"
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Adder campo"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Imagine de profilo"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -415,27 +411,27 @@ msgstr "Phono"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Nota"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Deler photo currente"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Modificar photo currente"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Incargar nove photo"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Seliger photo ex ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Modificar adresses"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -478,7 +474,7 @@ msgstr "Pais"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Modificar categorias"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -490,11 +486,11 @@ msgstr "Adressario"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Prefixos honorific"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Senioretta"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
@@ -502,7 +498,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Sr."
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
@@ -510,27 +506,27 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Sra."
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr."
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Nomine date"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Nomines additional"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Nomine de familia"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Suffixos honorific"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
@@ -595,23 +591,23 @@ msgstr "Cancellar"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importar un file de contactos"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Per favor selige le adressario"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Crear un nove adressario"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Nomine del nove gruppo:"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importar"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
@@ -619,15 +615,15 @@ msgstr ""
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Contactos importate con successo."
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Clauder dialogo"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importar adressario."
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
@@ -647,7 +643,7 @@ msgstr ""
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Adder adressario"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
@@ -659,7 +655,7 @@ msgstr ""
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "plus info"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
@@ -667,4 +663,4 @@ msgstr ""
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/ia/core.po b/l10n/ia/core.po
index e4b27f798a3a790225872fe056012282fc9266ab..08b5615cb98c744a67e2086bd6377fbfe7570cc5 100644
--- a/l10n/ia/core.po
+++ b/l10n/ia/core.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 03:49+0000\n"
+"Last-Translator: Emilio Sepúlveda <emisepulvedam@gmail.com>\n"
 "Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/language/ia/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -28,15 +28,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Iste categoria jam existe:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
-msgstr ""
+msgstr "Reinitialisation del contrasigno de Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Reinitialisation del contrasigno de ownCLoud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -52,7 +52,7 @@ msgstr "Requestate"
 
 #: lostpassword/templates/lostpassword.php:8
 msgid "Login failed!"
-msgstr "Initio de session fallate!"
+msgstr "Initio de session fallite!"
 
 #: lostpassword/templates/lostpassword.php:11 templates/installation.php:25
 #: templates/login.php:9
@@ -69,7 +69,7 @@ msgstr "Tu contrasigno esseva reinitialisate"
 
 #: lostpassword/templates/resetpassword.php:5
 msgid "To login page"
-msgstr ""
+msgstr "al pagina de initio de session"
 
 #: lostpassword/templates/resetpassword.php:8
 msgid "New password"
@@ -81,7 +81,7 @@ msgstr "Reinitialisar contrasigno"
 
 #: strings.php:5
 msgid "Personal"
-msgstr ""
+msgstr "Personal"
 
 #: strings.php:6
 msgid "Users"
@@ -93,7 +93,7 @@ msgstr "Applicationes"
 
 #: strings.php:8
 msgid "Admin"
-msgstr ""
+msgstr "Administration"
 
 #: strings.php:9
 msgid "Help"
@@ -101,7 +101,7 @@ msgstr "Adjuta"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Accesso prohibite"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +109,11 @@ msgstr "Nube non trovate"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Modificar categorias"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Adder"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -154,15 +154,15 @@ msgstr "Nomine de base de datos"
 
 #: templates/installation.php:96
 msgid "Database host"
-msgstr ""
+msgstr "Hospite de base de datos"
 
 #: templates/installation.php:101
 msgid "Finish setup"
 msgstr ""
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
-msgstr ""
+msgstr "servicios web sub tu controlo"
 
 #: templates/layout.user.php:35
 msgid "Log out"
@@ -174,7 +174,7 @@ msgstr "Configurationes"
 
 #: templates/login.php:6
 msgid "Lost your password?"
-msgstr ""
+msgstr "Tu perdeva le contrasigno?"
 
 #: templates/login.php:17
 msgid "remember"
@@ -182,11 +182,11 @@ msgstr "memora"
 
 #: templates/login.php:18
 msgid "Log in"
-msgstr ""
+msgstr "Aperir session"
 
 #: templates/logout.php:1
 msgid "You are logged out."
-msgstr ""
+msgstr "Tu session ha essite claudite."
 
 #: templates/part.pagenavi.php:3
 msgid "prev"
diff --git a/l10n/ia/settings.po b/l10n/ia/settings.po
index 26a875ff17b9b4a42bb1e0efb47aaecb9efb04e7..352f0ac1276819efc06ca998ed7a9379b8ff33a5 100644
--- a/l10n/ia/settings.po
+++ b/l10n/ia/settings.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 03:49+0000\n"
+"Last-Translator: Emilio Sepúlveda <emisepulvedam@gmail.com>\n"
 "Language-Team: Interlingua (http://www.transifex.net/projects/p/owncloud/language/ia/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -26,7 +26,7 @@ msgstr ""
 #: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:19
 #: ajax/setlanguage.php:22
 msgid "Invalid request"
-msgstr ""
+msgstr "Requesta invalide"
 
 #: ajax/openid.php:15
 msgid "OpenID Changed"
@@ -42,15 +42,15 @@ msgstr "Interlingua"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Registro"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Plus"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Adder tu application"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -66,7 +66,7 @@ msgstr "per"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentation"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
@@ -102,7 +102,7 @@ msgstr ""
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Discargar"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -170,15 +170,15 @@ msgstr "Crear"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Quota predeterminate"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Altere"
 
 #: templates/users.php:47
 msgid "Quota"
-msgstr ""
+msgstr "Quota"
 
 #: templates/users.php:80
 msgid "Delete"
diff --git a/l10n/id/contacts.po b/l10n/id/contacts.po
index 11f1445a8535f7fc1b0968dd7b39efdb7f35c828..94c1539c37457c8ee5f79a96fbe135a6f0ad770c 100644
--- a/l10n/id/contacts.po
+++ b/l10n/id/contacts.po
@@ -6,9 +6,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Indonesian (http://www.transifex.net/projects/p/owncloud/language/id/)\n"
 "MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -69,10 +69,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/it/calendar.po b/l10n/it/calendar.po
index d917b63eaf2a14ce6a48b0007c02d34e116d017b..dcc55dbfef60d959ebd922845cf2be377757ddc6 100644
--- a/l10n/it/calendar.po
+++ b/l10n/it/calendar.po
@@ -14,10 +14,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 12:54+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/language/it/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -27,11 +27,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Nessun calendario trovato."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Nessun evento trovato."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -57,71 +57,71 @@ msgstr "Calendario"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Compleanno"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Azienda"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Chiama"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Clienti"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Consegna"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Vacanze"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Idee"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Viaggio"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Anniversario"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Riunione"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Altro"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Personale"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Progetti"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Domande"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Lavoro"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "senza nome"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -370,7 +370,7 @@ msgstr "Scegli i calendari attivi"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "I tuoi calendari"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -379,15 +379,15 @@ msgstr "Collegamento CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Calendari condivisi"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Nessun calendario condiviso"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Condividi calendario"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -404,7 +404,7 @@ msgstr "Elimina"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "condiviso con te da"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -449,23 +449,23 @@ msgstr "Esporta"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Informazioni evento"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Ripetizione"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Avviso"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Partecipanti"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Condividi"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -477,11 +477,11 @@ msgstr "Categoria"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Categorie separate con virgole"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Modifica le categorie"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -602,11 +602,11 @@ msgstr "Crea un nuovo evento"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Visualizza un evento"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Nessuna categoria selezionata"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -614,11 +614,11 @@ msgstr "Seleziona una categoria"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "di"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "alle"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -642,7 +642,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Primo giorno della settimana"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -650,24 +650,24 @@ msgstr "Indirizzo sincronizzazione calendario CalDAV:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Utenti"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "seleziona utenti"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Modificabile"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Gruppi"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "seleziona gruppi"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "rendi pubblico"
diff --git a/l10n/it/contacts.po b/l10n/it/contacts.po
index 9fb04d4bb25ac077dcafb09250d0a7e86813e7b5..88873e6864284394f4915c99b5d4cc1d220b1009 100644
--- a/l10n/it/contacts.po
+++ b/l10n/it/contacts.po
@@ -10,9 +10,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/language/it/)\n"
 "MIME-Version: 1.0\n"
@@ -25,7 +25,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Errore nel (dis)attivare la rubrica."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Si è verificato un errore nell'aggiunta del contatto."
 
@@ -39,7 +39,7 @@ msgstr "Deve essere riempito almeno un indirizzo."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "P"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -47,39 +47,35 @@ msgstr "Errore durante l'aggiunta della proprietà del contatto."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Nessun ID fornito"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Errore di impostazione del codice di controllo."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Nessuna categoria selezionata per l'eliminazione."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Nessuna rubrica trovata."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Nessun contatto trovato."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "ID mancante"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Errore in fase di elaborazione del file VCard per l'ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Impossibile aggiungere una rubrica senza nome."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -91,27 +87,27 @@ msgstr "Errore durante l'attivazione della rubrica."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Nessun ID di contatto inviato."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Errore di caricamento immagine."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Errore di lettura della foto del contatto."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Errore di salvataggio del file temporaneo."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "La foto caricata non è valida."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ID non impostato."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -123,35 +119,35 @@ msgstr "Errore durante l'eliminazione della proprietà del contatto."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Manca l'ID del contatto."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "ID di contatto mancante."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Non è stato inviato alcun percorso a una foto."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Il file non esiste:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "il nome dell'elemento non è impostato."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "il codice di controllo non è impostato."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Le informazioni della vCard non sono corrette. Ricarica la pagina: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Qualcosa è andato storto. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -159,7 +155,7 @@ msgstr "Errore durante l'aggiornamento della proprietà del contatto."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Impossibile aggiornare una rubrica senza nome."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -167,33 +163,33 @@ msgstr "Errore durante l'aggiornamento della rubrica."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Errore di invio dei contatti in archivio."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Non ci sono errori, il file è stato inviato correttamente"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Il file inviato supera la direttiva upload_max_filesize nel php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Il file inviato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Il file è stato inviato solo parzialmente"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Nessun file è stato inviato"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Manca una cartella temporanea"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -201,7 +197,7 @@ msgstr "Contatti"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Rubrica non trovata."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -250,7 +246,7 @@ msgstr "Voce"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Messaggio"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -266,11 +262,11 @@ msgstr "Cercapersone"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Data di nascita di {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -286,7 +282,7 @@ msgstr "Rubriche"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Configura rubrica"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -294,7 +290,7 @@ msgstr "Nuova rubrica"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importa da VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -325,23 +321,23 @@ msgstr "Elimina contatto"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Rilascia una foto da inviare"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Modifica dettagli del nome"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Pseudonimo"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Inserisci pseudonimo"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -349,19 +345,19 @@ msgstr "Compleanno"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "gg-mm-aaaa"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Gruppi"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Separa i gruppi con virgole"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Modifica gruppi"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -369,47 +365,47 @@ msgstr "Preferito"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Specifica un indirizzo email valido"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Inserisci indirizzo email"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Invia per email"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Elimina l'indirizzo email"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Inserisci il numero di telefono"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Elimina il numero di telefono"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Visualizza sulla mappa"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Modifica dettagli dell'indirizzo"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Aggiungi qui le note."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Aggiungi campo"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Immagine del profilo"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -417,27 +413,27 @@ msgstr "Telefono"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Nota"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Elimina la foto corrente"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Modifica la foto corrente"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Invia una nuova foto"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Seleziona la foto da ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Modifica indirizzo"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -480,7 +476,7 @@ msgstr "Stato"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Modifica categorie"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -492,79 +488,79 @@ msgstr "Rubrica"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Prefissi onorifici"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Sig.na"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Sig.ra"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Sig."
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Sig."
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Sig.ra"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dott."
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Nome"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Nomi aggiuntivi"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Cognome"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Suffissi onorifici"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sn."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -597,76 +593,76 @@ msgstr "Annulla"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importa un file di contatti"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Scegli la rubrica"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "crea una nuova rubrica"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Nome della nuova rubrica"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importa"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importazione contatti"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Contatti importati correttamente"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Chiudi finestra"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importa rubrica"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Seleziona la rubrica di destinazione:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Rilascia un file VCF per importare i contatti."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Seleziona da disco"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Non hai contatti nella rubrica."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Aggiungi contatto"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Configura rubriche"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Indirizzi di sincronizzazione CardDAV"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "altre informazioni"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Indirizzo principale (Kontact e altri)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/it/core.po b/l10n/it/core.po
index 698dc766ba171f7264e91e5bd1b3a1ede872cce1..550381b026754e10c3816d93133eeabf2a90d61b 100644
--- a/l10n/it/core.po
+++ b/l10n/it/core.po
@@ -11,10 +11,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 10:44+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/language/it/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -24,15 +24,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Nome dell'applicazione non fornito."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Nessuna categoria da aggiungere?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Questa categoria esiste già: "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -40,7 +40,7 @@ msgstr "Ripristino password di Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Ripristino password di ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -105,7 +105,7 @@ msgstr "Aiuto"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Accesso negato"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -113,11 +113,11 @@ msgstr "Cloud non trovata"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Modifica le categorie"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Aggiungi"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -164,7 +164,7 @@ msgstr "Host del database"
 msgid "Finish setup"
 msgstr "Termina la configurazione"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "servizi web nelle tue mani"
 
diff --git a/l10n/it/files.po b/l10n/it/files.po
index b88190f20c470f4653154852e5a050bb5035bb48..4b76071bb8cbdb82a3f12b9da78597b7e971bbad 100644
--- a/l10n/it/files.po
+++ b/l10n/it/files.po
@@ -10,10 +10,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 12:55+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/language/it/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -49,7 +49,7 @@ msgstr "Cartella temporanea mancante"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Scrittura su disco non riuscita"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -57,7 +57,7 @@ msgstr "File"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Gestione file"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -65,23 +65,23 @@ msgstr "Dimensione massima upload"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "numero mass.: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Necessario per lo scaricamento di file multipli e cartelle."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Abilita scaricamento ZIP"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 è illimitato"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Dimensione massima per i file ZIP"
 
 #: templates/index.php:7
 msgid "New"
@@ -97,7 +97,7 @@ msgstr "Cartella"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Da URL"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -105,7 +105,7 @@ msgstr "Carica"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Annulla invio"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -117,7 +117,7 @@ msgstr "Nome"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Condividi"
 
 #: templates/index.php:51
 msgid "Download"
@@ -133,7 +133,7 @@ msgstr "Modificato"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Elimina tutto"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -151,8 +151,8 @@ msgstr "I file che stai provando a caricare superano la dimensione massima conse
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Scansione dei file in corso, attendi"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Scansione corrente"
diff --git a/l10n/it/gallery.po b/l10n/it/gallery.po
index 86bf6ce47e60a5190ed728376a75ea7a4e1602c2..17d761b0da822879f52f9a53dbbcb3a8159bb994 100644
--- a/l10n/it/gallery.po
+++ b/l10n/it/gallery.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 10:42+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/language/it/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +22,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Immagini"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -30,15 +30,15 @@ msgstr "Nuova scansione"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Ferma"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Condividi"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Impostazioni"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -46,16 +46,16 @@ msgstr "Indietro"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Rimuovi conferma"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Vuoi rimuovere l'album"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Cambia il nome dell'album"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nuovo nome dell'album"
diff --git a/l10n/it/settings.po b/l10n/it/settings.po
index 71b0a3de90304e369e4ea8c01d12be392d0904db..dd27799948d410e80a4c10c8f7bbfc3820ace52d 100644
--- a/l10n/it/settings.po
+++ b/l10n/it/settings.po
@@ -13,10 +13,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 10:50+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/owncloud/language/it/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,15 +47,15 @@ msgstr "Italiano"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Registro"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Altro"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Aggiungi la tua applicazione"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -71,11 +71,11 @@ msgstr "da"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentazione"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Gestione file grandi"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -103,11 +103,11 @@ msgstr "su un totale di"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Client di sincronizzazione desktop e mobile"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Scaricamento"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -175,11 +175,11 @@ msgstr "Crea"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Quota predefinita"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Altro"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/ja_JP/contacts.po b/l10n/ja_JP/contacts.po
index 6c2dd04de97b9dd47608db766baaad4f3e758f81..6d85c9569f29ba175a85d6492cc667e5f0f37bde 100644
--- a/l10n/ja_JP/contacts.po
+++ b/l10n/ja_JP/contacts.po
@@ -6,9 +6,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Japanese (Japan) (http://www.transifex.net/projects/p/owncloud/language/ja_JP/)\n"
 "MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "電話帳の有効/無効化に失敗しました。"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "連絡先の追加でエラーが発生しました。"
 
@@ -69,10 +69,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/ko/calendar.po b/l10n/ko/calendar.po
index 741074dd5b4de723a366a0f0429c6ca2bcba7a64..a901c6fcce7c441cbdbc6f35f684fb47952ba930 100644
--- a/l10n/ko/calendar.po
+++ b/l10n/ko/calendar.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 19:41+0000\n"
+"Last-Translator: yunhye <limonade83@gmail.com>\n"
 "Language-Team: Korean (http://www.transifex.net/projects/p/owncloud/language/ko/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,11 +21,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "달력이 없습니다"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "일정이 없습니다"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -53,69 +53,69 @@ msgstr "달력"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "생일"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "사업"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "통화"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "클라이언트"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "배송"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "공휴일"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "생각"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "여행"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "기념일"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "미팅"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "기타"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "개인"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "프로젝트"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "질문"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "작업"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "익명의"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -364,7 +364,7 @@ msgstr "활성 달력 선택"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "내 달력"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -373,15 +373,15 @@ msgstr "CalDav 링크"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "공유 달력"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "달력 공유하지 않음"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "달력 공유"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -398,7 +398,7 @@ msgstr "삭제"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "로 인해 당신과 함께 공유"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -443,23 +443,23 @@ msgstr "출력"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "일정 정보"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "반복"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "알람"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "참석자"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "공유"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -471,11 +471,11 @@ msgstr "분류"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "쉼표로 카테고리 구분"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "카테고리 수정"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -596,11 +596,11 @@ msgstr "새 이벤트 만들기"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "일정 보기"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "선택된 카테고리 없음"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -608,11 +608,11 @@ msgstr "선택 카테고리"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "의"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "에서"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -636,7 +636,7 @@ msgstr "12시간"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "그 주의 첫째날"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -644,24 +644,24 @@ msgstr "달력 CalDav 동기화 주소"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "사용자"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "사용자 선택"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "편집 가능"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "그룹"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "선택 그룹"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "공개"
diff --git a/l10n/ko/contacts.po b/l10n/ko/contacts.po
index e4ed04e3ce97cd2de709e374a8a332092dca7f0c..d577b36173f435366120223c0fcbe5b62d34d07c 100644
--- a/l10n/ko/contacts.po
+++ b/l10n/ko/contacts.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+#   <limonade83@gmail.com>, 2012.
 # Shinjo Park <kde@peremen.name>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Korean (http://www.transifex.net/projects/p/owncloud/language/ko/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "주소록을 (비)활성화하는 데 실패했습니다."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "연락처를 추가하는 중 오류가 발생하였습니다."
 
@@ -44,39 +45,35 @@ msgstr "연락처 속성을 추가할 수 없습니다."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "제공되는 아이디 없음"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "오류 검사합계 설정"
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "삭제 카테고리를 선택하지 않았습니다. "
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "주소록을 찾을 수 없습니다."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "연락처를 찾을 수 없습니다."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "아이디 분실"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "성명란이 비어 주소록에 추가 할 수 없습니다."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +85,27 @@ msgstr "주소록을 활성화할 수 없습니다."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "접속 아이디가 기입되지 않았습니다."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "로딩 이미지 오류입니다."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "사진 읽기 오류"
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "임시 파일을 저장하는 동안 오류가 발생했습니다. "
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "로딩 사진이 유효하지 않습니다. "
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "아이디가 설정되어 있지 않습니다. "
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,11 +117,11 @@ msgstr "연락처 속성을 삭제할 수 없습니다."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "접속 아이디가 없습니다. "
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "접속 아이디 분실"
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
@@ -132,7 +129,7 @@ msgstr ""
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "파일이 존재하지 않습니다. "
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
@@ -186,11 +183,11 @@ msgstr ""
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "파일이 업로드 되어있지 않습니다"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "임시 폴더 분실"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +195,7 @@ msgstr "연락처"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "주소록을 찾을 수 없습니다."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +244,7 @@ msgstr "음성 번호"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "메세지"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +260,11 @@ msgstr "호출기"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "인터넷"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{이름}의 생일"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +280,7 @@ msgstr "주소록"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "주소록 구성"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +288,7 @@ msgstr "새 주소록"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "VCF에서 가져오기"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,7 +319,7 @@ msgstr "연락처 삭제"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Drop photo to upload"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
@@ -330,15 +327,15 @@ msgstr ""
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "이름 세부사항을 편집합니다. "
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "별명"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "별명 입력"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +343,19 @@ msgstr "생일"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "일-월-년"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "그룹"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "쉼표로 그룹 구분"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "그룹 편집"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,11 +363,11 @@ msgstr "선호함"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "올바른 이메일 주소를 입력하세요."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "이메일 주소 입력"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
diff --git a/l10n/ko/core.po b/l10n/ko/core.po
index 1f549212df73b8016429af9ff7c206dd62319433..79f253c0f792b99817457aa7ca25e7621b63a3ed 100644
--- a/l10n/ko/core.po
+++ b/l10n/ko/core.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 19:54+0000\n"
+"Last-Translator: yunhye <limonade83@gmail.com>\n"
 "Language-Team: Korean (http://www.transifex.net/projects/p/owncloud/language/ko/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +21,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "응용 프로그램의 이름이 규정되어 있지 않습니다. "
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "추가할 카테고리가 없습니까?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "이 카테고리는 이미 존재합니다:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -37,7 +37,7 @@ msgstr "Owncloud 암호 재설정"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud 비밀번호 재설정"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -102,7 +102,7 @@ msgstr "도움말"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "접근 금지"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +110,11 @@ msgstr "클라우드를 찾을 수 없습니다"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "카테고리 편집"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "추가"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,7 +161,7 @@ msgstr "데이터베이스 호스트"
 msgid "Finish setup"
 msgstr "설치 완료"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "내가 관리하는 웹 서비스"
 
diff --git a/l10n/ko/files.po b/l10n/ko/files.po
index ed19139e6408f7094e94853dc051206e4e806b3e..67ff7b80f9687ddd24eda20ef9d377b326079df1 100644
--- a/l10n/ko/files.po
+++ b/l10n/ko/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 20:11+0000\n"
+"Last-Translator: yunhye <limonade83@gmail.com>\n"
 "Language-Team: Korean (http://www.transifex.net/projects/p/owncloud/language/ko/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "임시 폴더가 사라짐"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "디스크에 쓰지 못했습니다"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "파일"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "파일 처리"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "최대 업로드 크기"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "최대. 가능한:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "멀티 파일 및 폴더 다운로드에 필요."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "ZIP- 다운로드 허용"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0은 무제한 입니다"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "ZIP 파일에 대한 최대 입력 크기"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "폴더"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "URL 에서"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "업로드"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "업로드 취소"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "이름"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "공유"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "수정됨"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "모두 삭제"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "이 파일이 서버에서 허용하는 최대 업로드 가능 용량
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "파일을 검색중입니다, 기다려 주십시오."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "커런트 스캐닝"
diff --git a/l10n/ko/gallery.po b/l10n/ko/gallery.po
index a55b890804dc303c401774d547282f761eec5098..301a0a524ecabd2b937d7f26c98f8b53d5eacdd2 100644
--- a/l10n/ko/gallery.po
+++ b/l10n/ko/gallery.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+#   <limonade83@gmail.com>, 2012.
 # Shinjo Park <kde@peremen.name>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 19:26+0000\n"
+"Last-Translator: yunhye <limonade83@gmail.com>\n"
 "Language-Team: Korean (http://www.transifex.net/projects/p/owncloud/language/ko/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "사진"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +29,15 @@ msgstr "재검색"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "정지"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "공유"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "세팅"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +45,16 @@ msgstr "뒤로"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "삭제 승인"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "앨범을 삭제하시겠습니까"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "앨범 이름 변경"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "새로운 앨범 이름"
diff --git a/l10n/ko/settings.po b/l10n/ko/settings.po
index d93ae4659980f5e1cd1be750fff61ffaf693cd7b..2c6d73a8a80696f72b1fc129b15f92cd342f3145 100644
--- a/l10n/ko/settings.po
+++ b/l10n/ko/settings.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+#   <limonade83@gmail.com>, 2012.
 # Shinjo Park <kde@peremen.name>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 20:00+0000\n"
+"Last-Translator: yunhye <limonade83@gmail.com>\n"
 "Language-Team: Korean (http://www.transifex.net/projects/p/owncloud/language/ko/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -41,15 +42,15 @@ msgstr "한국어"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "로그"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "더"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "앱 추가"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -65,11 +66,11 @@ msgstr " by "
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "문서"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "큰 파일 관리"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -97,11 +98,11 @@ msgstr "사용 가능:"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "데스크탑 및 모바일 동기화 클라이언트"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "다운로드"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -169,11 +170,11 @@ msgstr "만들기"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "기본 할당량"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "다른"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/lb/contacts.po b/l10n/lb/contacts.po
index 80a9e1851825d132fe2a770412f9ff0ced0fb31a..e30e74d4b77c034aba457a6558390c37b8213cc3 100644
--- a/l10n/lb/contacts.po
+++ b/l10n/lb/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Luxembourgish (http://www.transifex.net/projects/p/owncloud/language/lb/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/lt_LT/contacts.po b/l10n/lt_LT/contacts.po
index 526242427d03949865462a372b6670f793ea7f79..089033219dc52f9cb3eeb850f33e1b9d04dc0857 100644
--- a/l10n/lt_LT/contacts.po
+++ b/l10n/lt_LT/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Lithuanian (Lithuania) (http://www.transifex.net/projects/p/owncloud/language/lt_LT/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Klaida (de)aktyvuojant adresų knygą."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Pridedant kontaktą įvyko klaida."
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/mk/calendar.po b/l10n/mk/calendar.po
index eb8388c7085f38482b4134aac22ad1a1e20ad9f2..67387ce37528a87bdfe2ab6f8eab39f64b157855 100644
--- a/l10n/mk/calendar.po
+++ b/l10n/mk/calendar.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 19:07+0000\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
 "Language-Team: Macedonian (http://www.transifex.net/projects/p/owncloud/language/mk/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +20,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Не се најдени календари."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Не се најдени настани."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -50,71 +50,71 @@ msgstr "Календар"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Роденден"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Деловно"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Повикај"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Клиенти"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Доставувач"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Празници"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Идеи"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Патување"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Јубилеј"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Состанок"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Останато"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Лично"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Проекти"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Прашања"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Работа"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "неименувано"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -194,7 +194,7 @@ msgstr "Недела"
 
 #: lib/object.php:373
 msgid "events week of month"
-msgstr ""
+msgstr "седмични настани од месец"
 
 #: lib/object.php:374
 msgid "first"
@@ -363,7 +363,7 @@ msgstr "Избери активни календари"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Ваши календари"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -372,15 +372,15 @@ msgstr "Врска за CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Споделени календари"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Нема споделени календари"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Сподели календар"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -397,7 +397,7 @@ msgstr "Избриши"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "Споделен со вас од"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -442,23 +442,23 @@ msgstr "Извези"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Инфо за настан"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Повторување"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Аларм"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Присутни"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Сподели"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -470,11 +470,11 @@ msgstr "Категорија"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Одвоете ги категориите со запирка"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Уреди категории"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -527,11 +527,11 @@ msgstr "Избери денови"
 
 #: templates/part.eventform.php:169 templates/part.showevent.php:167
 msgid "and the events day of year."
-msgstr ""
+msgstr "и настаните ден од година."
 
 #: templates/part.eventform.php:182 templates/part.showevent.php:180
 msgid "and the events day of month."
-msgstr ""
+msgstr "и настаните ден од месец."
 
 #: templates/part.eventform.php:190 templates/part.showevent.php:188
 msgid "Select months"
@@ -543,7 +543,7 @@ msgstr "Избери седмици"
 
 #: templates/part.eventform.php:208 templates/part.showevent.php:206
 msgid "and the events week of year."
-msgstr ""
+msgstr "и настаните седмица од година."
 
 #: templates/part.eventform.php:214 templates/part.showevent.php:212
 msgid "Interval"
@@ -595,11 +595,11 @@ msgstr "Создади нов настан"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Погледај настан"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Нема избрано категории"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -607,11 +607,11 @@ msgstr "Избери категорија"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "од"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "на"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -635,7 +635,7 @@ msgstr "12ч"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Прв ден од седмицата"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,24 +643,24 @@ msgstr "CalDAV календар адресата за синхронизациј
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Корисници"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "избери корисници"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Изменливо"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Групи"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "избери групи"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "направи јавно"
diff --git a/l10n/mk/contacts.po b/l10n/mk/contacts.po
index 5d75fc0def8c9a32b768569f363ee1bf4a202e1f..e7c5f9c32fcaf469f67b43b15576168cee417a6d 100644
--- a/l10n/mk/contacts.po
+++ b/l10n/mk/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Macedonian (http://www.transifex.net/projects/p/owncloud/language/mk/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Грешка (де)активирање на адресарот."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Имаше грешка при додавање на контактот."
 
@@ -36,7 +36,7 @@ msgstr "Барем една од полињата за адреса треба 
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Се обидовте да внесете дупликат вредност:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -44,39 +44,35 @@ msgstr "Грешка при додавање на вредност за конт
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Нема доставено ИД"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Грешка во поставување сума за проверка."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Нема избрано категории за бришење."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Не се најдени адресари."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Не се најдени контакти."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Недостасува ИД"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Грешка при парсирање VCard за ИД: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Неможе да се внесе адресар со празно име."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +84,27 @@ msgstr "Грешка при активирање на адресарот."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Не беше доставено ИД за контакт."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Грешка во вчитување на слика."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Грешка во читање на контакт фотографија."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Грешка во снимање на привремена датотека."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Фотографијата која се вчитува е невалидна."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ид не е поставено."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,35 +116,35 @@ msgstr "Греш при бришење на вредноста за контак
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "ИД за контакт недостасува."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Недостасува ид за контакт."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Не беше поднесена патека за фотографија."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Не постои датотеката:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "име за елементот не е поставена."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "сумата за проверка не е поставена."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Нешто се расипа."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -156,7 +152,7 @@ msgstr "Грешка при ажурирање на вредноста за ко
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Неможе да се ажурира адресар со празно име."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -164,33 +160,33 @@ msgstr "Грешка при ажурирање на адресарот."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Грешка во снимање на контактите на диск."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Датотеката беше успешно подигната."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Големината на датотеката ја надминува upload_max_filesize директивата во php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Датотеката беше само делумно подигната."
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Не беше подигната датотека."
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Недостасува привремена папка"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +194,7 @@ msgstr "Контакти"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Адресарот не е најден."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +243,7 @@ msgstr "Глас"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Порака"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +259,11 @@ msgstr "Пејџер"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Интернет"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Роденден на {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +279,7 @@ msgstr "Адресари"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Конфигурирај адресар"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +287,7 @@ msgstr "Нов адресар"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Внеси од VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,23 +318,23 @@ msgstr "Избриши го контактот"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Довлечкај фотографија за да се подигне"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Уреди детали за име"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Прекар"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Внеси прекар"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +342,19 @@ msgstr "Роденден"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Групи"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Одвоете ги групите со запирка"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Уреди групи"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,47 +362,47 @@ msgstr "Претпочитано"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Ве молам внесете правилна адреса за е-пошта."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Внесете е-пошта"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Прати порака до адреса"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Избриши адреса за е-пошта"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Внесете телефонски број"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Избриши телефонски број"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Погледајте на мапа"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Уреди детали за адреса"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Внесете забелешки тука."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Додади поле"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Фотографија за профил"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -414,27 +410,27 @@ msgstr "Телефон"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Забелешка"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Избриши моментална фотографија"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Уреди моментална фотографија"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Подигни нова фотографија"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Изберете фотографија од ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Уреди адреса"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +473,7 @@ msgstr "Држава"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Уреди категории"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -489,79 +485,79 @@ msgstr "Адресар"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Префикси за титула"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Г-ца"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Г-ѓа"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Г-дин"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Сер"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Г-ѓа"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Др"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Лично име"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Дополнителни имиња"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Презиме"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Суфикси за титула"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "Д.М."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Д-р"
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Помлад."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Постар."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -594,76 +590,76 @@ msgstr "Откажи"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Внеси датотека со контакти"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Ве молам изберете адресар"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "креирај нов адресар"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Име на новиот адресар"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Внеси"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Внесување контакти"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Контаките беа внесени успешно"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Дијалог за затварање"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Внеси адресар"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Изберете адресар да се внесе:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Довлечкај VCF датотека да се внесат контакти."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Изберете од хард диск"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Немате контакти во Вашиот адресар."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Додади контакт"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Уреди адресари"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Адреса за синхронизација со CardDAV"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "повеќе информации"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Примарна адреса"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/mk/core.po b/l10n/mk/core.po
index 9aa8b2995ba016bace4096afd3db7a95cdd7d889..9dfaa377087c93b4315f5a8b3e5b8197c201c303 100644
--- a/l10n/mk/core.po
+++ b/l10n/mk/core.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 19:06+0000\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
 "Language-Team: Macedonian (http://www.transifex.net/projects/p/owncloud/language/mk/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +21,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Име за апликацијата не е доставено."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Нема категорија да се додаде?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Оваа категорија веќе постои:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -37,7 +37,7 @@ msgstr "Ресетирање на Owncloud лозинка"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ресетирање на лозинка за ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -102,7 +102,7 @@ msgstr "Помош"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Забранет пристап"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +110,11 @@ msgstr "Облакот не е најден"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Уреди категории"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Додади"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,7 +161,7 @@ msgstr "Сервер со база"
 msgid "Finish setup"
 msgstr "Заврши го подесувањето"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "веб сервиси под Ваша контрола"
 
diff --git a/l10n/mk/files.po b/l10n/mk/files.po
index 603a1cfc6ce8e256708ac95d9e8a16a11b4535eb..ebd16f87ac5900fb3e487473bd95afbde555de3f 100644
--- a/l10n/mk/files.po
+++ b/l10n/mk/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 19:07+0000\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
 "Language-Team: Macedonian (http://www.transifex.net/projects/p/owncloud/language/mk/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "Не постои привремена папка"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Неуспеав да запишам на диск"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "Датотеки"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Ракување со датотеки"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "Максимална големина за подигање"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "макс. можно:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Потребно за симнување повеќе-датотеки и папки."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Овозможи ZIP симнување "
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 е неограничено"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Максимална големина за внес на ZIP датотеки"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "Папка"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Од адреса"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "Подигни"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Откажи прикачување"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "Име"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Сподели"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "Променето"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Избриши сѐ"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "Датотеките кои се обидувате да ги подиг
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Се скенираат датотеки, ве молам почекајте."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Моментално скенирам"
diff --git a/l10n/mk/gallery.po b/l10n/mk/gallery.po
index cab31e4eaa6abbc0ae198990a405b731eac003b3..a65786dd3979f6acd1a83c60d884911b5b7b97e7 100644
--- a/l10n/mk/gallery.po
+++ b/l10n/mk/gallery.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 19:08+0000\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
 "Language-Team: Macedonian (http://www.transifex.net/projects/p/owncloud/language/mk/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Слики"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +28,15 @@ msgstr "Рескенирај"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Стоп"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Сподели"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Параметри"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +44,16 @@ msgstr "Назад"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Тргни потврда"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Дали сакате да го отстраните албумот"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Измени име на албумот"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Ново има на албумот"
diff --git a/l10n/mk/settings.po b/l10n/mk/settings.po
index f057d892ef5945294de9f076f3d6b98c423c546f..04a9829988e7d07222d1735879efb0f3f6c526e2 100644
--- a/l10n/mk/settings.po
+++ b/l10n/mk/settings.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 19:07+0000\n"
+"Last-Translator: Georgi Stanojevski <glisha@gmail.com>\n"
 "Language-Team: Macedonian (http://www.transifex.net/projects/p/owncloud/language/mk/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -41,15 +41,15 @@ msgstr "__language_name__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Записник"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Повеќе"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Додадете ја Вашата апликација"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -65,11 +65,11 @@ msgstr "од"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Документација"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Управување со големи датотеки"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -97,11 +97,11 @@ msgstr "од достапните"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Десктоп и мобилник клиенти за синхронизирање"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Преземање"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -169,11 +169,11 @@ msgstr "Создај"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Предефинирана квота"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Останато"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/ms_MY/contacts.po b/l10n/ms_MY/contacts.po
index 2e546c72cc85a2139c820b31bd4673c7d682a44b..3362ec4541616c4d8428651c10c43126d274d5b7 100644
--- a/l10n/ms_MY/contacts.po
+++ b/l10n/ms_MY/contacts.po
@@ -9,9 +9,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/language/ms_MY/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Ralat nyahaktif buku alamat."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Terdapat masalah menambah maklumat."
 
@@ -72,10 +72,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/ms_MY/core.po b/l10n/ms_MY/core.po
index 912a76618119e0a9ab2f497ac9ab27d0cfaba670..027aeb64eba96d1ff03845feb1ab01911af148bb 100644
--- a/l10n/ms_MY/core.po
+++ b/l10n/ms_MY/core.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 #   <hadri.hilmi@gmail.com>, 2011, 2012.
+# Hadri Hilmi <hadri.hilmi@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 10:33+0000\n"
+"Last-Translator: Hadri Hilmi <hadri.hilmi@gmail.com>\n"
 "Language-Team: Malay (Malaysia) (http://www.transifex.net/projects/p/owncloud/language/ms_MY/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -113,7 +114,7 @@ msgstr ""
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Tambah"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +161,7 @@ msgstr "Hos pangkalan data"
 msgid "Finish setup"
 msgstr "Setup selesai"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "Perkhidmatan web di bawah kawalan anda"
 
diff --git a/l10n/nb_NO/calendar.po b/l10n/nb_NO/calendar.po
index fa70988293272fef0a7838a44197c93815fcd858..f9b15afa192f7f0bad7ee57cd21a29df6bc7f79d 100644
--- a/l10n/nb_NO/calendar.po
+++ b/l10n/nb_NO/calendar.po
@@ -4,15 +4,16 @@
 # 
 # Translators:
 #   <ajarmund@gmail.com>, 2011, 2012.
+# Arvid Nornes <arvid.nornes@gmail.com>, 2012.
 # Christer Eriksson <post@hc3web.com>, 2012.
 #   <sondre@nettfrihet.no>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-12 08:30+0000\n"
+"Last-Translator: Arvid Nornes <arvid.nornes@gmail.com>\n"
 "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.net/projects/p/owncloud/language/nb_NO/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,11 +23,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Ingen kalendere funnet"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Ingen hendelser funnet"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -54,69 +55,69 @@ msgstr "Kalender"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Bursdag"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Forretninger"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr ""
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Kunder"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr ""
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Ferie"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideér"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Reise"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubileum"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Møte"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Annet"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "ersonlig"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Prosjekter"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Spørsmål"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Arbeid"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "uten navn"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -365,7 +366,7 @@ msgstr "Velg en aktiv kalender"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Dine kalendere"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -374,15 +375,15 @@ msgstr "CalDav-lenke"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Delte kalendere"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Ingen delte kalendere"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Del Kalender"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -399,7 +400,7 @@ msgstr "Slett"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "delt med deg"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -444,23 +445,23 @@ msgstr "Eksporter"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Hendelsesinformasjon"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Gjentas"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Deltakere"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Del"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -472,11 +473,11 @@ msgstr "Kategori"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Separer kategorier med komma"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Rediger kategorier"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -597,11 +598,11 @@ msgstr "Opprett en ny hendelse"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Se på hendelse"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Ingen kategorier valgt"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -637,7 +638,7 @@ msgstr "12 t"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Ukens første dag"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -645,24 +646,24 @@ msgstr "Kalender CalDAV synkroniseringsadresse"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Brukere"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "valgte brukere"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Redigerbar"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Grupper"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "velg grupper"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "gjør offentlig"
diff --git a/l10n/nb_NO/contacts.po b/l10n/nb_NO/contacts.po
index c6ebef7d9bb291784996456ab37bbb48887ba78e..359ffe19b0af5fe9255c7d051727e4e6a890d456 100644
--- a/l10n/nb_NO/contacts.po
+++ b/l10n/nb_NO/contacts.po
@@ -3,14 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+#   <ajarmund@gmail.com>, 2012.
 # Christer Eriksson <post@hc3web.com>, 2012.
 # Daniel  <i18n@daniel.priv.no>, 2012.
+#   <itssmail@yahoo.no>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.net/projects/p/owncloud/language/nb_NO/)\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +25,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Et problem oppsto med å (de)aktivere adresseboken."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Et problem oppsto med å legge til kontakten."
 
@@ -53,31 +55,27 @@ msgstr ""
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Ingen kategorier valgt for sletting."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Ingen adressebok funnet."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Ingen kontakter funnet."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Manglende ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Kan ikke legge til en adressebok uten navn."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -93,15 +91,15 @@ msgstr ""
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Klarte ikke å laste bilde."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Klarte ikke å lese kontaktbilde."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Klarte ikke å lagre midlertidig fil."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
@@ -125,15 +123,15 @@ msgstr ""
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Mangler kontakt-id."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Ingen filsti ble lagt inn."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Filen eksisterer ikke:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
@@ -149,7 +147,7 @@ msgstr ""
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Noe gikk fryktelig galt."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -157,7 +155,7 @@ msgstr "Et problem oppsto med å legge til kontaktfeltet."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Kan ikke oppdatere adressebøker uten navn."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -169,29 +167,29 @@ msgstr ""
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Pust ut, ingen feil. Filen ble lastet opp problemfritt"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Filen du prøvde å laste opp var større enn grensen upload_max_filesize i php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Filen du prøvde å laste opp var større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet."
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Filen du prøvde å laste opp ble kun delvis lastet opp"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Ingen filer ble lastet opp"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Mangler midlertidig mappe"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -199,7 +197,7 @@ msgstr "Kontakter"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adresseboken ble ikke funnet."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -248,7 +246,7 @@ msgstr "Svarer"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Melding"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -264,11 +262,11 @@ msgstr "Pager"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internett"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "bursdagen til {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -284,7 +282,7 @@ msgstr "Adressebøker"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Konfigurer adressebok"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -292,7 +290,7 @@ msgstr "Ny adressebok"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importer fra VDF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -323,7 +321,7 @@ msgstr "Slett kontakt"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Dra bilder hit for å laste opp"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
@@ -331,15 +329,15 @@ msgstr ""
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Endre detaljer rundt navn"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Kallenavn"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Skriv inn kallenavn"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -347,19 +345,19 @@ msgstr "Bursdag"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-åååå"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Grupper"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Skill gruppene med komma"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Endre grupper"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -371,7 +369,7 @@ msgstr ""
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Skriv inn e-postadresse"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
@@ -379,35 +377,35 @@ msgstr ""
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Fjern e-postadresse"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Skriv inn telefonnummer"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Fjern telefonnummer"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Se på kart"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Endre detaljer rundt adresse"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Legg inn notater her."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Legg til felt"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profilbilde"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -419,23 +417,23 @@ msgstr ""
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Fjern nåværende bilde"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Rediger nåværende bilde"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Last opp nytt bilde"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Velg bilde fra ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Endre adresse"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -478,7 +476,7 @@ msgstr "Land"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Endre kategorier"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -494,7 +492,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Frøken"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
@@ -502,7 +500,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Herr"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
@@ -510,27 +508,27 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Fru"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Fornavn"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Ev. mellomnavn"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Etternavn"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Titler"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
@@ -558,11 +556,11 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sr."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -595,39 +593,39 @@ msgstr "Avbryt"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importer en fil med kontakter."
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Vennligst velg adressebok"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Lag ny adressebok"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Navn på ny adressebok"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importer"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importerer kontakter"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontaktene ble importert uten feil"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Lukk dialog"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importer adressebok"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
@@ -647,7 +645,7 @@ msgstr ""
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Ny kontakt"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
@@ -659,7 +657,7 @@ msgstr ""
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "mer info"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
diff --git a/l10n/nb_NO/core.po b/l10n/nb_NO/core.po
index f2994735aabdc61c5fb9819379f6c2fa3d30849a..567def3384cdcb3901da18201167380916253c42 100644
--- a/l10n/nb_NO/core.po
+++ b/l10n/nb_NO/core.po
@@ -6,13 +6,14 @@
 #   <ajarmund@gmail.com>, 2011.
 # Christer Eriksson <post@hc3web.com>, 2012.
 # Daniel  <i18n@daniel.priv.no>, 2012.
+#   <itssmail@yahoo.no>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 11:04+0000\n"
+"Last-Translator: owncloud <itssmail@yahoo.no>\n"
 "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.net/projects/p/owncloud/language/nb_NO/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -162,7 +163,7 @@ msgstr "Databasevert"
 msgid "Finish setup"
 msgstr "Fullfør oppsetting"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "nettjenester under din kontroll"
 
diff --git a/l10n/nb_NO/files.po b/l10n/nb_NO/files.po
index 098c75422d6ab9552f7a9ce82278436313a24ab5..e777435c9d42899f302e3ca671b0b59d6abd9a5d 100644
--- a/l10n/nb_NO/files.po
+++ b/l10n/nb_NO/files.po
@@ -3,16 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
-#   <ajarmund@gmail.com>, 2011.
+#   <ajarmund@gmail.com>, 2011, 2012.
 # Christer Eriksson <post@hc3web.com>, 2012.
 # Daniel  <i18n@daniel.priv.no>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-12 08:20+0000\n"
+"Last-Translator: anjar <ajarmund@gmail.com>\n"
 "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.net/projects/p/owncloud/language/nb_NO/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -48,7 +48,7 @@ msgstr "Mangler en midlertidig mappe"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Klarte ikke å skrive til disk"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -56,7 +56,7 @@ msgstr "Filer"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Filhåndtering"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -64,23 +64,23 @@ msgstr "Maksimum opplastingsstørrelse"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "max. mulige:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Nødvendig for å laste ned mapper og mer enn én fil om gangen."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Aktiver nedlasting av ZIP"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 er ubegrenset"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Maksimal størrelse på ZIP-filer"
 
 #: templates/index.php:7
 msgid "New"
@@ -96,7 +96,7 @@ msgstr "Mappe"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Fra url"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -104,7 +104,7 @@ msgstr "Last opp"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Avbryt opplasting"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -116,7 +116,7 @@ msgstr "Navn"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Del"
 
 #: templates/index.php:51
 msgid "Download"
@@ -132,7 +132,7 @@ msgstr "Endret"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Slett alle"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -150,8 +150,8 @@ msgstr "Filene du prøver å laste opp er for store for å laste opp til denne s
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Skanner etter filer, vennligst vent."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Pågående skanning"
diff --git a/l10n/nb_NO/gallery.po b/l10n/nb_NO/gallery.po
index 01f72d7bfa8942e7783975f4206a13fa4db36745..d112af5146eba122b1c25933a6d62df9107d3d7c 100644
--- a/l10n/nb_NO/gallery.po
+++ b/l10n/nb_NO/gallery.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+#   <ajarmund@gmail.com>, 2012.
 # Christer Eriksson <post@hc3web.com>, 2012.
 # Daniel  <i18n@daniel.priv.no>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-12 07:59+0000\n"
+"Last-Translator: anjar <ajarmund@gmail.com>\n"
 "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.net/projects/p/owncloud/language/nb_NO/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +22,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Bilder"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -29,15 +30,15 @@ msgstr "Les inn på nytt"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Stopp"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Del"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Innstillinger"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -45,16 +46,16 @@ msgstr "Tilbake"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Fjern bekreftelse"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Ønsker du å slette albumet?"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Endre navn på album"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nytt navn på album"
diff --git a/l10n/nb_NO/settings.po b/l10n/nb_NO/settings.po
index 9af0024b605a9c9ace89b8ffda0d3d65da541c40..245e72ba7ca8acc5ffc1419a285e9d6a9cade33e 100644
--- a/l10n/nb_NO/settings.po
+++ b/l10n/nb_NO/settings.po
@@ -6,13 +6,14 @@
 #   <ajarmund@gmail.com>, 2011.
 # Christer Eriksson <post@hc3web.com>, 2012.
 # Daniel  <i18n@daniel.priv.no>, 2012.
+#   <itssmail@yahoo.no>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 10:18+0000\n"
+"Last-Translator: owncloud <itssmail@yahoo.no>\n"
 "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.net/projects/p/owncloud/language/nb_NO/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,15 +44,15 @@ msgstr "__language_name__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Logg"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Mer"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Legg til din App"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -67,7 +68,7 @@ msgstr "av"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentasjon"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
@@ -103,7 +104,7 @@ msgstr ""
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Last ned"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -171,7 +172,7 @@ msgstr "Opprett"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Standard Kvote"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
diff --git a/l10n/nl/calendar.po b/l10n/nl/calendar.po
index 535cf36f633ee1cb007abd767b94e33993aa2d3b..741d9504253304b8b7c69db07675d7bc4c7e3674 100644
--- a/l10n/nl/calendar.po
+++ b/l10n/nl/calendar.po
@@ -5,15 +5,16 @@
 # Translators:
 #   <bart.formosus@gmail.com>, 2011.
 #   <bartv@thisnet.nl>, 2011.
+# Erik Bent <hj.bent.60@gmail.com>, 2012.
 #   <jos@gelauff.net>, 2012.
 #   <pietje8501@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 06:37+0000\n"
+"Last-Translator: Erik Bent <hj.bent.60@gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,11 +24,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Geen kalenders gevonden."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Geen gebeurtenissen gevonden."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -53,71 +54,71 @@ msgstr "Kalender"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "d MMM[ yyyy]{ '&#8212;' d[ MMM] yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Verjaardag"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Zakelijk"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Bellen"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Klanten"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Leverancier"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Vakantie"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideeën"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Reis"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubileum"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Vergadering"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Ander"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Persoonlijk"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projecten"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Vragen"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Werk"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "onbekend"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -197,7 +198,7 @@ msgstr "Zondag"
 
 #: lib/object.php:373
 msgid "events week of month"
-msgstr ""
+msgstr "gebeurtenissen week van maand"
 
 #: lib/object.php:374
 msgid "first"
@@ -366,7 +367,7 @@ msgstr "Kies actieve kalenders"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Je kalenders"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -375,15 +376,15 @@ msgstr "CalDav Link"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Gedeelde kalenders"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Geen gedeelde kalenders"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Deel kalender"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -400,7 +401,7 @@ msgstr "Verwijderen"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "gedeeld met jou door"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -445,23 +446,23 @@ msgstr "Exporteren"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Geberurtenisinformatie"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Herhalend"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Deelnemers"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Delen"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -473,11 +474,11 @@ msgstr "Categorie"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Gescheiden door komma's"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Wijzig categorieën"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -530,11 +531,11 @@ msgstr "Selecteer dagen"
 
 #: templates/part.eventform.php:169 templates/part.showevent.php:167
 msgid "and the events day of year."
-msgstr ""
+msgstr "en de gebeurtenissen dag van het jaar"
 
 #: templates/part.eventform.php:182 templates/part.showevent.php:180
 msgid "and the events day of month."
-msgstr ""
+msgstr "en de gebeurtenissen dag van de maand"
 
 #: templates/part.eventform.php:190 templates/part.showevent.php:188
 msgid "Select months"
@@ -546,7 +547,7 @@ msgstr "Selecteer weken"
 
 #: templates/part.eventform.php:208 templates/part.showevent.php:206
 msgid "and the events week of year."
-msgstr ""
+msgstr "en de gebeurtenissen week van het jaar"
 
 #: templates/part.eventform.php:214 templates/part.showevent.php:212
 msgid "Interval"
@@ -598,11 +599,11 @@ msgstr "Maak een nieuwe afspraak"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Bekijk een gebeurtenis"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Geen categorieën geselecteerd"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -610,11 +611,11 @@ msgstr "Kies een categorie"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "van"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "op"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -638,7 +639,7 @@ msgstr "12uur"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Eerste dag van de week"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -646,24 +647,24 @@ msgstr "CalDAV kalender synchronisatie adres:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Gebruikers"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "kies gebruikers"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Te wijzigen"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Groepen"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "kies groep"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "maak publiek"
diff --git a/l10n/nl/contacts.po b/l10n/nl/contacts.po
index c78254ceb7608bb226a18d0d422fa6ac4fe84f5b..7118f749a361dcd640be62fa1a47ade9464ba411 100644
--- a/l10n/nl/contacts.po
+++ b/l10n/nl/contacts.po
@@ -5,15 +5,16 @@
 # Translators:
 #   <bart.formosus@gmail.com>, 2011.
 #   <bartv@thisnet.nl>, 2011.
+# Erik Bent <hj.bent.60@gmail.com>, 2012.
 #   <icewind1991@gmail.com>, 2012.
 #   <koen@vervloesem.eu>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 08:05+0000\n"
+"Last-Translator: Erik Bent <hj.bent.60@gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -25,7 +26,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Fout bij het (de)activeren van het adresboek."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Er was een fout bij het toevoegen van het contact."
 
@@ -39,7 +40,7 @@ msgstr "Minstens één van de adresvelden moet ingevuld worden."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Eigenschap bestaat al: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -47,39 +48,35 @@ msgstr "Fout bij het toevoegen van de contacteigenschap."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Geen ID opgegeven"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Instellen controlegetal mislukt"
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Geen categorieën geselecteerd om te verwijderen."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Geen adresboek gevonden"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Geen contracten gevonden"
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Ontbrekend ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Fout bij inlezen VCard voor ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Kan geen adresboek toevoegen zonder naam."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -91,27 +88,27 @@ msgstr "Fout bij het activeren van het adresboek."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Geen contact ID opgestuurd."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Fout bij laden plaatje."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Lezen van contact foto mislukt."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Tijdelijk bestand opslaan mislukt."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "De geladen foto is niet goed."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "id is niet ingesteld."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -123,35 +120,35 @@ msgstr "Fout bij het verwijderen van de contacteigenschap."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Contact ID ontbreekt."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Ontbrekende contact id."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Geen fotopad opgestuurd."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Bestand bestaat niet:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "onderdeel naam is niet opgegeven."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "controlegetal is niet opgegeven."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Informatie over vCard is fout. Herlaad de pagina: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Er ging iets totaal verkeerd. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -159,7 +156,7 @@ msgstr "Fout bij het updaten van de contacteigenschap."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Kan adresboek zonder naam niet wijzigen"
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -167,33 +164,33 @@ msgstr "Fout bij het updaten van het adresboek."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Fout bij opslaan van contacten."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "De upload van het bestand is goedgegaan."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Het bestand overschrijdt de upload_max_filesize instelling in php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Het bestand overschrijdt de MAX_FILE_SIZE instelling dat is opgegeven in het HTML formulier"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Het bestand is gedeeltelijk geüpload"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Er is geen bestand geüpload"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Er ontbreekt een tijdelijke map"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -201,7 +198,7 @@ msgstr "Contacten"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adresboek niet gevonden."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -250,7 +247,7 @@ msgstr "Stem"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Bericht"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -266,11 +263,11 @@ msgstr "Pieper"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name}'s verjaardag"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -286,7 +283,7 @@ msgstr "Adresboeken"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Instellen adresboeken"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -294,7 +291,7 @@ msgstr "Nieuw Adresboek"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importeer uit VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -325,23 +322,23 @@ msgstr "Verwijder contact"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Verwijder foto uit upload"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Wijzig naam gegevens"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Roepnaam"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Voer roepnaam in"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -349,19 +346,19 @@ msgstr "Verjaardag"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Groepen"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Gebruik komma bij meerder groepen"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Wijzig groepen"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -369,47 +366,47 @@ msgstr "Voorkeur"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Geef een geldig email adres op."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Voer email adres in"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Mail naar adres"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Verwijder email adres"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Voer telefoonnummer in"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Verwijdere telefoonnummer"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Bekijk op een kaart"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Wijzig adres gegevens"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Voeg notitie toe"
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Voeg veld toe"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profiel foto"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -417,27 +414,27 @@ msgstr "Telefoon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Notitie"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Verwijdere huidige foto"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Wijzig huidige foto"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Upload nieuwe foto"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Selecteer foto uit ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Wijzig adres"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -480,7 +477,7 @@ msgstr "Land"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Wijzig categorieën"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -492,7 +489,7 @@ msgstr "Adresboek"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Hon. prefixes"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
@@ -520,15 +517,15 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Voornaam"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Extra namen"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Achternaam"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
@@ -597,76 +594,76 @@ msgstr "Anuleren"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importeer een contacten bestand"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Kies een adresboek"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Maak een nieuw adresboek"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Naam van nieuw adresboek"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importeer"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importeren van contacten"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Contacten zijn geïmporteerd"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Sluit venster"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importeer adresboek"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Selecteer adresboek voor import:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Sleep een VCF bestand om de contacten te importeren."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Selecteer van schijf"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Je hebt geen contacten in je adresboek"
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Contactpersoon toevoegen"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Bewerken adresboeken"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV synchroniseert de adressen"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "meer informatie"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Standaardadres"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "IOS/OS X"
diff --git a/l10n/nl/core.po b/l10n/nl/core.po
index 49670c9cb1b583f8c85abfb8c4f9bf745d1f275f..6a1a51ac9eb60d871b129aaa0eefa3adb490bfe2 100644
--- a/l10n/nl/core.po
+++ b/l10n/nl/core.po
@@ -4,16 +4,17 @@
 # 
 # Translators:
 #   <bart.formosus@gmail.com>, 2011.
+# Erik Bent <hj.bent.60@gmail.com>, 2012.
 #   <icewind1991@gmail.com>, 2011.
 #   <koen@vervloesem.eu>, 2011.
 #   <pietje8501@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 06:48+0000\n"
+"Last-Translator: Erik Bent <hj.bent.60@gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,23 +24,23 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Applicatie naam niet gegeven."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Geen categorie toevoegen?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "De categorie bestaat al."
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
-msgstr "reset je Owncloud wachtwoord"
+msgstr "Reset je ownCloud wachtwoord"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud wachtwoord herstellen"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -104,7 +105,7 @@ msgstr "Help"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Toegang verboden"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -112,11 +113,11 @@ msgstr "Cloud niet gevonden"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Wijzigen categorieën"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Toevoegen"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -163,7 +164,7 @@ msgstr "Database server"
 msgid "Finish setup"
 msgstr "Installatie afronden"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "webdiensten die je beheerst"
 
diff --git a/l10n/nl/files.po b/l10n/nl/files.po
index 469334131dee911cea85b5432b619378f48bcd50..f32f2338a75d58065c9feb9a8d9d74789d30c50b 100644
--- a/l10n/nl/files.po
+++ b/l10n/nl/files.po
@@ -5,16 +5,17 @@
 # Translators:
 #   <bart.formosus@gmail.com>, 2011.
 #   <bartv@thisnet.nl>, 2011.
+# Erik Bent <hj.bent.60@gmail.com>, 2012.
 #   <icewind1991@gmail.com>, 2011.
 #   <koen@vervloesem.eu>, 2011.
 #   <pietje8501@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 06:21+0000\n"
+"Last-Translator: Erik Bent <hj.bent.60@gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -50,7 +51,7 @@ msgstr "Een tijdelijke map mist"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Schrijven naar schijf mislukt"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -58,7 +59,7 @@ msgstr "Bestanden"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Bestand"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -66,23 +67,23 @@ msgstr "Maximale bestandsgrootte voor uploads"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "max. mogelijk: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Nodig voor meerdere bestanden en mappen downloads."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Zet ZIP-download aan"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 is ongelimiteerd"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Maximale grootte voor ZIP bestanden"
 
 #: templates/index.php:7
 msgid "New"
@@ -98,7 +99,7 @@ msgstr "Map"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Van hyperlink"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -106,7 +107,7 @@ msgstr "Upload"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Upload afbreken"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -118,7 +119,7 @@ msgstr "Naam"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Delen"
 
 #: templates/index.php:51
 msgid "Download"
@@ -134,7 +135,7 @@ msgstr "Laatst aangepast"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Alles verwijderen"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -152,8 +153,8 @@ msgstr "De bestanden die u probeert te uploaden zijn groter dan de maximaal toeg
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Bestanden worden gescand, even wachten."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Er wordt gescand"
diff --git a/l10n/nl/gallery.po b/l10n/nl/gallery.po
index b2edcc9630b55f8d74328474c562c6465fccb289..bea85f9005e001a843ba77ce3691a1e9467d06c2 100644
--- a/l10n/nl/gallery.po
+++ b/l10n/nl/gallery.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Erik Bent <hj.bent.60@gmail.com>, 2012.
 #   <jos@gelauff.net>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 06:42+0000\n"
+"Last-Translator: Erik Bent <hj.bent.60@gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Plaatjes"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +29,15 @@ msgstr "Opnieuw doorzoeken"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Stop"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Deel"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Instellingen"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +45,16 @@ msgstr "Terug"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Verwijder bevestiging"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Wil je het album verwijderen: "
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Wijzig album naam"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nieuwe album naam"
diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po
index 8503a03b1e8435aa6ed76b96cdcaab17e1fd39bd..5d66cda9281e5f1dfd71801b3f89e06662701cfe 100644
--- a/l10n/nl/settings.po
+++ b/l10n/nl/settings.po
@@ -4,16 +4,17 @@
 # 
 # Translators:
 #   <bart.formosus@gmail.com>, 2011.
+# Erik Bent <hj.bent.60@gmail.com>, 2012.
 #   <icewind1991@gmail.com>, 2011, 2012.
 #   <koen@vervloesem.eu>, 2011.
 #   <pietje8501@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-15 06:27+0000\n"
+"Last-Translator: Erik Bent <hj.bent.60@gmail.com>\n"
 "Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -44,15 +45,15 @@ msgstr "Nederlands"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Log"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Meer"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Voeg je App toe"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -68,11 +69,11 @@ msgstr "door"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentatie"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Onderhoud van grote bestanden"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -100,11 +101,11 @@ msgstr "van de beschikbare"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Desktop en mobiele synchronisatie apparaten"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Download"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -172,11 +173,11 @@ msgstr "Creëer"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Standaard limiet"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Andere"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/nn_NO/contacts.po b/l10n/nn_NO/contacts.po
index d4478476c6bd6395a4ef103087bd1bc4a555ae27..4f4fe975b0cc7291f7acf503d3a582cb45549ba5 100644
--- a/l10n/nn_NO/contacts.po
+++ b/l10n/nn_NO/contacts.po
@@ -8,9 +8,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.net/projects/p/owncloud/language/nn_NO/)\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Ein feil oppstod ved (de)aktivering av adressebok."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Det kom ei feilmelding då kontakta vart lagt til."
 
@@ -71,10 +71,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/pl/contacts.po b/l10n/pl/contacts.po
index bce3d1f4916001bdfc76ae3f1b26261aff823526..6c063d3d2e415adee330773a0a9b37ee58fa6914 100644
--- a/l10n/pl/contacts.po
+++ b/l10n/pl/contacts.po
@@ -9,9 +9,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Polish (http://www.transifex.net/projects/p/owncloud/language/pl/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Błąd (de)aktywowania książki adresowej."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Wystąpił błąd podczas dodawania kontaktu."
 
@@ -72,10 +72,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/pt_BR/calendar.po b/l10n/pt_BR/calendar.po
index 27efe808e847576316c393c5ef69b2332ec089d3..5283c3162a1c957075ea0d1f73a7f863b0daeff9 100644
--- a/l10n/pt_BR/calendar.po
+++ b/l10n/pt_BR/calendar.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Guilherme Maluf Balzana <guimalufb@gmail.com>, 2012.
 # Thiago Vicente <thiagovice@gmail.com>, 2012.
 # Van Der Fran <transifex@vanderland.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 19:59+0000\n"
+"Last-Translator: Guilherme Maluf Balzana <guimalufb@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/owncloud/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,11 +22,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Nenhum calendário encontrado."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Nenhum evento encontrado."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -51,71 +52,71 @@ msgstr "Calendário"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Aniversário"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Negócio"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Chamada"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Clientes"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Entrega"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Feriados"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Idéias"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Jornada"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubileu"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Reunião"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Outros"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Pessoal"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projetos"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Perguntas"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Trabalho"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "sem nome"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -364,7 +365,7 @@ msgstr "Escolha calendários ativos"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Meus Calendários"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -373,15 +374,15 @@ msgstr "Link para CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Calendários Compartilhados"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Nenhum Calendário Compartilhado"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Compartilhar Calendário"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -398,7 +399,7 @@ msgstr "Excluir"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "compartilhado com você por"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -443,23 +444,23 @@ msgstr "Exportar"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Info de Evento"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Repetindo"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarme"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Participantes"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Compartilhar"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -471,11 +472,11 @@ msgstr "Categoria"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Separe as categorias por vírgulas"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Editar categorias"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -596,11 +597,11 @@ msgstr "Criar um novo evento"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Visualizar evento"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Nenhuma categoria selecionada"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -608,11 +609,11 @@ msgstr "Selecionar categoria"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "de"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "para"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -636,7 +637,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Primeiro dia da semana"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -644,24 +645,24 @@ msgstr "Sincronização de endereço do calendário CalDAV :"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Usuários"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "Selecione usuários"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Editável"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Grupos"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "Selecione grupos"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "Tornar público"
diff --git a/l10n/pt_BR/contacts.po b/l10n/pt_BR/contacts.po
index fd53038c6fa17b6bc1f37f2a12c9305a9c756590..1da3cea497a31295411ea56538bc7e6fc4f46c21 100644
--- a/l10n/pt_BR/contacts.po
+++ b/l10n/pt_BR/contacts.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Guilherme Maluf Balzana <guimalufb@gmail.com>, 2012.
 # Thiago Vicente <thiagovice@gmail.com>, 2012.
 # Van Der Fran <transifex@vanderland.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 16:43+0000\n"
+"Last-Translator: Guilherme Maluf Balzana <guimalufb@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/owncloud/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Erro ao (des)ativar agenda."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Ocorreu um erro ao adicionar o contato."
 
@@ -37,7 +38,7 @@ msgstr "Pelo menos um dos campos de endereço tem que ser preenchido."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Tentando adiciona propriedade duplicada:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -45,39 +46,35 @@ msgstr "Erro ao adicionar propriedade de contato."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "Nenhum ID fornecido"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Erro ajustando checksum."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Nenhum categoria selecionada para remoção."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Nenhuma agenda de endereços encontrada."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Nenhum contato encontrado."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Faltando ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Erro de identificação VCard para ID:"
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Não é possivel adicionar uma agenda de endereços com o nome em branco."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -89,27 +86,27 @@ msgstr "Erro ao ativar agenda."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Nenhum ID do contato foi submetido."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Erro ao carregar imagem."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Erro de leitura na foto do contato."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Erro ao salvar arquivo temporário."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Foto carregada não é válida."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ID não definido."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -121,35 +118,35 @@ msgstr "Erro ao excluir propriedade de contato."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "ID do contato está faltando."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Faltando ID do contato."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Nenhum caminho para foto foi submetido."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Arquivo não existe:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "nome do elemento não definido."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "checksum não definido."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Informação sobre vCard incorreto. Por favor, recarregue a página:"
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Something went FUBAR. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -157,7 +154,7 @@ msgstr "Erro ao atualizar propriedades do contato."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Não é possível atualizar sua agenda com um nome em branco."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -165,15 +162,15 @@ msgstr "Erro ao atualizar agenda."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Erro enviando contatos para armazenamento."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Arquivo enviado com sucesso"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "O arquivo enviado excede a diretiva upload_max_filesize em php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
diff --git a/l10n/pt_BR/core.po b/l10n/pt_BR/core.po
index 6cc599863022109466cf493b1500464639b256a3..be83e6bfe44fde831d68d04651944393446ede4b 100644
--- a/l10n/pt_BR/core.po
+++ b/l10n/pt_BR/core.po
@@ -4,15 +4,16 @@
 # 
 # Translators:
 #   <duda.nogueira@metasys.com.br>, 2011.
+# Guilherme Maluf Balzana <guimalufb@gmail.com>, 2012.
 # Thiago Vicente <thiagovice@gmail.com>, 2012.
 # Van Der Fran <transifex@vanderland.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 19:50+0000\n"
+"Last-Translator: Guilherme Maluf Balzana <guimalufb@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/owncloud/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,15 +23,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Nome da aplicação não foi fornecido."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Nenhuma categoria adicionada?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Essa categoria já existe"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -38,7 +39,7 @@ msgstr "Mudar senha do Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Redefinir senha ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -103,7 +104,7 @@ msgstr "Ajuda"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Acesso Proibido"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -111,11 +112,11 @@ msgstr "Cloud não encontrado"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Editar categorias"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Adicionar"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -162,7 +163,7 @@ msgstr "Banco de dados do host"
 msgid "Finish setup"
 msgstr "Concluir configuração"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "web services sob seu controle"
 
diff --git a/l10n/pt_BR/files.po b/l10n/pt_BR/files.po
index fa471ac6389012e6c6675340a16de21d4ce48e18..588b33fb7367a467ba4bb88bb471e483ddf8c241 100644
--- a/l10n/pt_BR/files.po
+++ b/l10n/pt_BR/files.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Guilherme Maluf Balzana <guimalufb@gmail.com>, 2012.
 # Thiago Vicente <thiagovice@gmail.com>, 2012.
-# Van Der Fran <transifex@vanderland.com>, 2011.
+# Van Der Fran <transifex@vanderland.com>, 2011, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-14 16:18+0000\n"
+"Last-Translator: Guilherme Maluf Balzana <guimalufb@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/owncloud/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +48,7 @@ msgstr "Pasta temporária não encontrada"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Falha ao escrever no disco"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +56,7 @@ msgstr "Arquivos"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Tratamento de Arquivo"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +64,23 @@ msgstr "Tamanho máximo para carregar"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "max. possível:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Necessário para multiplos arquivos e diretório de downloads."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Habilitar ZIP-download"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 para ilimitado"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Tamanho máximo para arquivo ZIP"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +96,7 @@ msgstr "Pasta"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "URL de origem"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,11 +104,11 @@ msgstr "Carregar"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Cancelar upload"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
-msgstr "Nada aqui.Carregar alguma coisa!"
+msgstr "Nada aqui.Carrege alguma coisa!"
 
 #: templates/index.php:47
 msgid "Name"
@@ -115,7 +116,7 @@ msgstr "Nome"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Compartilhar"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +132,7 @@ msgstr "Modificado"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Deletar Tudo"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +150,8 @@ msgstr "Os arquivos que você está tentando carregar excedeu o tamanho máximo
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Arquivos sendo escaneados, por favor aguarde."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Scanning atual"
diff --git a/l10n/pt_BR/gallery.po b/l10n/pt_BR/gallery.po
index 7f4efba75f0c8538c4705f067b802eb348841c98..da803b0599683d50667fb57ddcb96a66553c9470 100644
--- a/l10n/pt_BR/gallery.po
+++ b/l10n/pt_BR/gallery.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 # Thiago Vicente <thiagovice@gmail.com>, 2012.
+# Van Der Fran <transifex@vanderland.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-12 00:52+0000\n"
+"Last-Translator: Van Der Fran <transifex@vanderland.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/owncloud/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Fotos"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +29,15 @@ msgstr "Atualizar"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Parar"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Compartilhar"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Configuração"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +45,16 @@ msgstr "Voltar"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Confirmar apagar"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Voçe dezeja remover o album"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Mudar nome do album"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nome do novo album"
diff --git a/l10n/pt_BR/settings.po b/l10n/pt_BR/settings.po
index a655585e977816e43b799829d81ab4f909876edb..5043a358e3501a29008d377646ab34b049de21b3 100644
--- a/l10n/pt_BR/settings.po
+++ b/l10n/pt_BR/settings.po
@@ -4,15 +4,16 @@
 # 
 # Translators:
 #   <duda.nogueira@metasys.com.br>, 2011.
+# Guilherme Maluf Balzana <guimalufb@gmail.com>, 2012.
 # Thiago Vicente <thiagovice@gmail.com>, 2012.
 # Van Der Fran <transifex@vanderland.com>, 2011.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 20:01+0000\n"
+"Last-Translator: Guilherme Maluf Balzana <guimalufb@gmail.com>\n"
 "Language-Team: Portuguese (Brazil) (http://www.transifex.net/projects/p/owncloud/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,15 +44,15 @@ msgstr "Português"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Log"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Mais"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Adicione seu Aplicativo"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -67,11 +68,11 @@ msgstr "por"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Documentação"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Gerênciando Arquivos Grandes"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -99,11 +100,11 @@ msgstr "do disponível"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Sincronizando Desktop e Mobile"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Download"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -171,11 +172,11 @@ msgstr "Criar"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Quota Padrão"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Outro"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/pt_PT/contacts.po b/l10n/pt_PT/contacts.po
index 16c60c3bbf1eac06fa92814515c23ea2c00ca52e..908fc259a20272a2589dc8b633025e6049093e9b 100644
--- a/l10n/pt_PT/contacts.po
+++ b/l10n/pt_PT/contacts.po
@@ -9,9 +9,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/language/pt_PT/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Erro a (des)ativar o livro de endereços"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Erro ao adicionar contato"
 
@@ -72,10 +72,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/ro/contacts.po b/l10n/ro/contacts.po
index f0db0e1eb90ef4baed3eea6e13cadc8afc6e7a3e..d4d9f15b1c9ec43d39d298650372b853c276a0db 100644
--- a/l10n/ro/contacts.po
+++ b/l10n/ro/contacts.po
@@ -8,9 +8,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Romanian (http://www.transifex.net/projects/p/owncloud/language/ro/)\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "(Dez)activarea agendei a întâmpinat o eroare."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "O eroare a împiedicat adăugarea contactului."
 
@@ -71,10 +71,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/ru/contacts.po b/l10n/ru/contacts.po
index a72d4b02c65fab91517a5a7ba116c16a1ec474ee..aac272f8b9f9583546d19d58f04922e82113d10e 100644
--- a/l10n/ru/contacts.po
+++ b/l10n/ru/contacts.po
@@ -9,9 +9,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/language/ru/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Ошибка (де)активации адресной книги."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Произошла ошибка при добавлении контакта."
 
@@ -72,10 +72,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/sk_SK/calendar.po b/l10n/sk_SK/calendar.po
index ca8a96b92f941863fc476e86a43af9f61cf61a54..e853dfa3fa71ec34eb4bf21f4ed7153096f19b6b 100644
--- a/l10n/sk_SK/calendar.po
+++ b/l10n/sk_SK/calendar.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 17:21+0000\n"
+"Last-Translator: Roman Priesol <roman@priesol.net>\n"
 "Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/language/sk_SK/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,11 +21,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Nenašiel sa žiadny kalendár."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Nenašla sa žiadna udalosť."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -51,71 +51,71 @@ msgstr "Kalendár"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "d. MMM[ yyyy]{ '&#8212;' d.[ MMM] yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Narodeniny"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Podnikanie"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Hovor"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Klienti"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Doručovateľ"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Prázdniny"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Nápady"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Cesta"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Jubileá"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Stretnutia"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Ostatné"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Osobné"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projekty"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Otázky"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Práca"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "nepomenovaný"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -364,7 +364,7 @@ msgstr "Zvoľte aktívne kalendáre"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Vaše kalendáre"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -373,15 +373,15 @@ msgstr "CalDav odkaz"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Zdielané kalendáre"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Žiadne zdielané kalendáre"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Zdielať kalendár"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -398,7 +398,7 @@ msgstr "Odstrániť"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "zdielané s vami používateľom"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -443,23 +443,23 @@ msgstr "Exportovať"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Informácie o udalosti"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Opakovanie"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Účastníci"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Zdielať"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -471,11 +471,11 @@ msgstr "Kategória"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Kategórie oddelené čiarkami"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Úprava kategórií"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -596,11 +596,11 @@ msgstr "Vytvoriť udalosť"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Zobraziť udalosť"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Žiadne vybraté kategórie"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -608,11 +608,11 @@ msgstr "Vybrať kategóriu"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "z"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "v"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -636,7 +636,7 @@ msgstr "12h"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Prvý deň v týždni"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -644,24 +644,24 @@ msgstr "Synchronizačná adresa kalendára CalDAV: "
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Používatelia"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "vybrať používateľov"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Upravovateľné"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Skupiny"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "vybrať skupiny"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "zverejniť"
diff --git a/l10n/sk_SK/contacts.po b/l10n/sk_SK/contacts.po
index 6c3faab994012600f36ee2fb78bc8c14ff610a1f..a28db46e374d5baa8c8115ff7d3a4dca14696050 100644
--- a/l10n/sk_SK/contacts.po
+++ b/l10n/sk_SK/contacts.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 #   <intense.feel@gmail.com>, 2012.
+# Roman Priesol <roman@priesol.net>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 18:38+0000\n"
+"Last-Translator: Roman Priesol <roman@priesol.net>\n"
 "Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/language/sk_SK/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Chyba (de)aktivácie adresára."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Vyskytla sa chyba pri pridávaní kontaktu."
 
@@ -36,7 +37,7 @@ msgstr "Musí byť uvedený aspoň jeden adresný údaj."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Pokúšate sa pridať rovnaký atribút:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -44,39 +45,35 @@ msgstr "Chyba pridania údaju kontaktu"
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "ID nezadané"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Chyba pri nastavovaní kontrolného súčtu."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Žiadne kategórie neboli vybraté na odstránenie."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Žiadny adresár nenájdený."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Žiadne kontakty nenájdené."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Chýba ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Chyba pri vyňatí ID z VCard:"
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Nedá sa pridať adresár s prázdnym menom."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +85,27 @@ msgstr "Chyba aktivovania adresára."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Nebolo nastavené ID kontaktu."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Chyba pri nahrávaní obrázka."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Chyba pri čítaní fotky kontaktu."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Chyba pri ukladaní dočasného súboru."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Načítaná fotka je vadná."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ID nie je nastavené."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,35 +117,35 @@ msgstr "Chyba odstránenia údaju kontaktu."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Chýba ID kontaktu."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Chýba ID kontaktu."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Žiadna fotka nebola poslaná."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Súbor neexistuje:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "meno elementu nie je nastavené."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "kontrolný súčet nie je nastavený."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Informácia o vCard je nesprávna. Obnovte stránku, prosím."
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Niečo sa pokazilo."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -156,7 +153,7 @@ msgstr "Chyba aktualizovania údaju kontaktu."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Nedá sa upraviť adresár s prázdnym menom."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -164,33 +161,33 @@ msgstr "Chyba aktualizácie adresára."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Chyba pri ukladaní kontaktov na úložisko."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Nevyskytla sa žiadna chyba, súbor úspešne uložené."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Ukladaný súbor prekračuje nastavenie upload_max_filesize v php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára."
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Ukladaný súbor sa nahral len čiastočne"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Žiadny súbor nebol uložený"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Chýba dočasný priečinok"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +195,7 @@ msgstr "Kontakty"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adresár sa nenašiel."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +244,7 @@ msgstr "Odkazová schránka"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Správa"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +260,11 @@ msgstr "Pager"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "Narodeniny {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +280,7 @@ msgstr "Adresáre"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Nastaviť adresáre"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +288,7 @@ msgstr "Nový adresár"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Importovať z VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,23 +319,23 @@ msgstr "Odstrániť kontakt"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Pretiahnite sem fotku pre nahratie"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Upraviť podrobnosti mena"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Prezývka"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Zadajte prezývku"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +343,19 @@ msgstr "Narodeniny"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd. mm. yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Skupiny"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Oddelte skupiny čiarkami"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Úprava skupín"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,47 +363,47 @@ msgstr "Uprednostňované"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Prosím zadajte platnú e-mailovú adresu."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Zadajte e-mailové adresy"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Odoslať na adresu"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Odstrániť e-mailové adresy"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Zadajte telefónne číslo"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Odstrániť telefónne číslo"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Zobraziť na mape"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Upraviť podrobnosti adresy"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Tu môžete pridať poznámky."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Pridať pole"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profilová fotka"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -414,27 +411,27 @@ msgstr "Telefón"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Poznámka"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Odstrániť súčasnú fotku"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Upraviť súčasnú fotku"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Nahrať novú fotku"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Vybrať fotku z ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Upraviť adresu"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +474,7 @@ msgstr "Krajina"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Upraviť kategórie"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -489,55 +486,55 @@ msgstr "Adresár"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Tituly pred"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Slečna"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Pani"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Pán"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Sir"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Pani"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr."
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Krstné meno"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Ďalšie mená"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Priezvisko"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Tituly za"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "JUDr."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "MUDr."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
@@ -549,19 +546,19 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Ph.D."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "ml."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "st."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -594,76 +591,76 @@ msgstr "Zrušiť"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Importovať súbor kontaktu"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Prosím zvolte adresár"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "vytvoriť nový adresár"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Meno nového adresára"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Importovať"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Importovanie kontaktov"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Kontakty úspešne importované"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Zatvoriť ponuku"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Importovanie adresára"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Vyberte adresár, do ktorého chcete importovať:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Pretiahnite VCF súbor pre import kontaktov."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Vyberte z pevného disku"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Nemáte žiadne kontakty v adresári."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Pridať kontakt"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Nastaviť adresáre"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "Adresy pre synchronizáciu s CardDAV"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "viac informácií"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Predvolená adresa (Kontakt etc)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/sk_SK/core.po b/l10n/sk_SK/core.po
index 8bd238aa0535b41430ef436909051c33e46935f6..3bd9097321b8691f7b8e2fc22d308d710cf90eaa 100644
--- a/l10n/sk_SK/core.po
+++ b/l10n/sk_SK/core.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 #   <intense.feel@gmail.com>, 2011, 2012.
+# Roman Priesol <roman@priesol.net>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 17:12+0000\n"
+"Last-Translator: Roman Priesol <roman@priesol.net>\n"
 "Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/language/sk_SK/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,15 +21,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Meno aplikácie nezadané."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Žiadna kategória pre pridanie?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Táto kategória už existuje:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -36,7 +37,7 @@ msgstr "Obnova Owncloud hesla"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Obnovenie hesla pre ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -101,7 +102,7 @@ msgstr "Pomoc"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Prístup odmietnutý"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +110,11 @@ msgstr "Nedokážem nájsť"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Úprava kategórií"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Pridať"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +161,7 @@ msgstr "Server databázy"
 msgid "Finish setup"
 msgstr "Dokončiť inštaláciu"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "webové služby pod vašou kontrolou"
 
diff --git a/l10n/sk_SK/files.po b/l10n/sk_SK/files.po
index ba8253a6a7be2e6f582131da87a84e232d1ed780..42e440e484a1163c409b9e098d35c441649504bb 100644
--- a/l10n/sk_SK/files.po
+++ b/l10n/sk_SK/files.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 17:28+0000\n"
+"Last-Translator: Roman Priesol <roman@priesol.net>\n"
 "Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/language/sk_SK/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -47,7 +47,7 @@ msgstr "Chýbajúci dočasný priečinok"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Zápis na disk sa nepodaril"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -55,7 +55,7 @@ msgstr "Súbory"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Nastavenie správanie k súborom"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -63,23 +63,23 @@ msgstr "Maximálna veľkosť nahratia"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "najväčšie možné:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Vyžadované pre sťahovanie viacerých súborov a adresárov."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Povoliť sťahovanie ZIP súborov"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 znamená neobmedzené"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Najväčšia veľkosť ZIP súborov"
 
 #: templates/index.php:7
 msgid "New"
@@ -95,7 +95,7 @@ msgstr "Priečinok"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Z url"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -103,7 +103,7 @@ msgstr "Nahrať"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Zrušiť odosielanie"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -115,7 +115,7 @@ msgstr "Meno"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Zdielať"
 
 #: templates/index.php:51
 msgid "Download"
@@ -131,7 +131,7 @@ msgstr "Upravené"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Odstrániť všetko"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -149,8 +149,8 @@ msgstr "Súbory ktoré sa snažíte nahrať presahujú maximálnu veľkosť pre
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Súbory sa práve prehľadávajú, prosím čakajte."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Práve prehliadané"
diff --git a/l10n/sk_SK/gallery.po b/l10n/sk_SK/gallery.po
index be222a53565ac0a66553b1826c4cadf3a45b0293..e74a7b52c17d06a0aa6032cf7b3c8209ab16abeb 100644
--- a/l10n/sk_SK/gallery.po
+++ b/l10n/sk_SK/gallery.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 #   <intense.feel@gmail.com>, 2012.
+# Roman Priesol <roman@priesol.net>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 18:31+0000\n"
+"Last-Translator: Roman Priesol <roman@priesol.net>\n"
 "Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/language/sk_SK/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Obrázky"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +29,15 @@ msgstr "Znovu oskenovať"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Zastaviť"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Zdielať"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "nastavenia"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +45,16 @@ msgstr "Späť"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Potvrdenie odstránenia"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Chcete odstrániť album?"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Zmeniť meno albumu"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Nové meno albumu"
diff --git a/l10n/sk_SK/settings.po b/l10n/sk_SK/settings.po
index 5545f2428c04e517a4bd26dd503be32aed9d0ce8..28ec32ee4a5a1d13110c8a150625582a50f6d159 100644
--- a/l10n/sk_SK/settings.po
+++ b/l10n/sk_SK/settings.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-16 17:32+0000\n"
+"Last-Translator: Roman Priesol <roman@priesol.net>\n"
 "Language-Team: Slovak (Slovakia) (http://www.transifex.net/projects/p/owncloud/language/sk_SK/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +22,7 @@ msgstr ""
 
 #: ajax/lostpassword.php:14
 msgid "email Changed"
-msgstr "email Zmenený"
+msgstr "email zmenený"
 
 #: ajax/lostpassword.php:16 ajax/openid.php:17 ajax/setlanguage.php:19
 #: ajax/setlanguage.php:22
@@ -43,19 +43,19 @@ msgstr "Slovensky"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Záznam"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Viac"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Pridať vašu aplikáciu"
 
 #: templates/apps.php:22
 msgid "Select an App"
-msgstr "Vyberte Aplikáciu"
+msgstr "Vyberte aplikáciu"
 
 #: templates/apps.php:25
 msgid "-licensed"
@@ -67,11 +67,11 @@ msgstr "od"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentácia"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Spravovanie veľké súbory"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -99,11 +99,11 @@ msgstr "z dostupných"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Klienti pre synchronizáciu"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Stiahnúť"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -171,11 +171,11 @@ msgstr "Vytvoriť"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Predvolená kvóta"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Iné"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/sl/calendar.po b/l10n/sl/calendar.po
index c52750cd5716787153d01cf253c607ffdfbca25d..3d500321bf53383108c6b1797bb49f55145061ec 100644
--- a/l10n/sl/calendar.po
+++ b/l10n/sl/calendar.po
@@ -10,10 +10,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 11:19+0000\n"
+"Last-Translator: Peter Peroša <peter.perosa@gmail.com>\n"
 "Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/language/sl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -23,11 +23,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Ni bilo najdenih koledarjev."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Ni bilo najdenih dogodkov."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -53,71 +53,71 @@ msgstr "Koledar"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Rojstni dan"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "Poslovno"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Pokliči"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Stranke"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Dobavitelj"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Dopust"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Ideje"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Potovanje"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Obletnica"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Sestanek"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Ostalo"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Osebno"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projekt"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Vprašanja"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "Delo"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "neimenovan"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -366,7 +366,7 @@ msgstr "Izberite aktivne koledarje"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Vaši koledarji"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -375,15 +375,15 @@ msgstr "CalDav povezava"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Koledarji v souporabi"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Ni koledarjev v souporabi"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Daj koledar v souporabo"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -400,7 +400,7 @@ msgstr "Izbriši"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "z vami souporablja"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -445,23 +445,23 @@ msgstr "Izvozi"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Informacije od dogodku"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Ponavljanja"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Udeleženci"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Souporaba"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -473,11 +473,11 @@ msgstr "Kategorija"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Kategorije ločite z vejico"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Uredi kategorije"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -598,11 +598,11 @@ msgstr "Ustvari nov dogodek"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Poglej dogodek"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Nobena kategorija ni izbrana"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -610,11 +610,11 @@ msgstr "Izberi kategorijo"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "od"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "pri"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -638,7 +638,7 @@ msgstr "12ur"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Prvi dan v tednu"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -646,24 +646,24 @@ msgstr "CalDAV sinhronizacijski naslov koledarja:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Uporabniki"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "izberite uporabnike"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Možno urejanje"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Skupine"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "izberite skupine"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "objavi"
diff --git a/l10n/sl/contacts.po b/l10n/sl/contacts.po
index da6ded581f260e784280e6168a33d6fdd1da1896..8f8a78a9df6f6de602ee8aec7b49359911344463 100644
--- a/l10n/sl/contacts.po
+++ b/l10n/sl/contacts.po
@@ -9,9 +9,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/language/sl/)\n"
 "MIME-Version: 1.0\n"
@@ -24,7 +24,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Napaka med (de)aktivacijo imenika."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Med dodajanjem stika je prišlo do napake"
 
@@ -38,7 +38,7 @@ msgstr "Vsaj eno izmed polj je še potrebno izpolniti."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Poskušam dodati podvojeno lastnost:"
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -46,39 +46,35 @@ msgstr "Napaka pri dodajanju informacije o stiku."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "ID ni bil podan"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "Napaka pri nastavljanju nadzorne vsote."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Nobena kategorija ni bila izbrana za izbris."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Ni bilo najdenih imenikov."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Ni bilo najdenih stikov."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Manjkajoč ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "Napaka pri razčlenjevanju VCard za ID: \""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Ne morem dodati imenika s praznim imenom."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -90,27 +86,27 @@ msgstr "Napaka pri aktiviranju imenika."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "ID stika ni bil poslan."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "Napaka pri nalaganju slike."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Napaka pri branju slike stika."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Napaka pri shranjevanju začasne datoteke."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Slika, ki se nalaga ni veljavna."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "id ni nastavljen."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -122,35 +118,35 @@ msgstr "Napaka pri brisanju lastnosti stika."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Manjka ID stika."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Manjka id stika."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Pot slike ni bila poslana."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Datoteka ne obstaja:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "ime elementa ni nastavljeno."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "nadzorna vsota ni nastavljena."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Nekaj je šlo v franže. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -158,7 +154,7 @@ msgstr "Napaka pri posodabljanju lastnosti stika."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Ne morem posodobiti imenika s praznim imenom."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -166,33 +162,33 @@ msgstr "Napaka pri posodabljanju imenika."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Napaka pri nalaganju stikov v hrambo."
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Datoteka je bila uspešno naložena."
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Datoteka je bila le delno naložena"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Nobena datoteka ni bila naložena"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Manjka začasna mapa"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -200,7 +196,7 @@ msgstr "Stiki"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Imenik ni bil najden."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -249,7 +245,7 @@ msgstr "Glas"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "Sporočilo"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -265,11 +261,11 @@ msgstr "Pozivnik"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "Internet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name} - rojstni dan"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -285,7 +281,7 @@ msgstr "Imeniki"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Nastavi imenike"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -293,7 +289,7 @@ msgstr "Nov imenik"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "Uvozi iz VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -324,23 +320,23 @@ msgstr "Izbriši stik"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Spustite sliko tukaj, da bi jo naložili"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "Uredite podrobnosti imena"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Vzdevek"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Vnesite vzdevek"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -348,19 +344,19 @@ msgstr "Rojstni dan"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd. mm. yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Skupine"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Skupine ločite z vejicami"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Uredi skupine"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -368,47 +364,47 @@ msgstr "Prednosten"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Prosimo, če navedete veljaven e-poštni naslov."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Vnesite e-poštni naslov"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "E-pošta naslovnika"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Izbriši e-poštni naslov"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Vpiši telefonsko številko"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Izbriši telefonsko številko"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Prikaz na zemljevidu"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Uredi podrobnosti"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Opombe dodajte tukaj."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Dodaj polje"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Slika profila"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -416,27 +412,27 @@ msgstr "Telefon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Opomba"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Izbriši trenutno sliko"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Uredi trenutno sliko"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Naloži novo sliko"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "Izberi sliko iz ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Uredi naslov"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -479,7 +475,7 @@ msgstr "Dežela"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Uredi kategorije"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -491,79 +487,79 @@ msgstr "Imenik"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Predpone"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "gdč."
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "ga."
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "g."
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "g."
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "ga."
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "dr."
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Ime"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "Dodatna imena"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Priimek"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Pripone"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "univ. dipl. prav."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "dr. med."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "dr. med., spec. spl. med."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "dr. med., spec. kiropraktike"
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "dr."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "mlajši"
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "starejši"
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -596,76 +592,76 @@ msgstr "Prekliči"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Uvozi datoteko s stiki"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Prosimo, če izberete imenik"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Ustvari nov imenik"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Ime novega imenika"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "Uvozi"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Uvažam stike"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Stiki so bili uspešno uvoženi"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Zapri dialog"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Uvozi imenik"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "Izberite imenik v katerega boste uvažali:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Za uvoz stikov spustite VCF datoteko tukaj."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "Izberi iz HD"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "V vašem imeniku ni stikov."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Dodaj stik"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Nastavi imenike"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV naslovi za sinhronizacijo"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "več informacij"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Primarni naslov (za kontakt et al)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/sl/core.po b/l10n/sl/core.po
index c93b0ce1e1f48096c24cc7a4e5bd692b10274159..eea25582805a650a36fe696ce3175c5be6f46de6 100644
--- a/l10n/sl/core.po
+++ b/l10n/sl/core.po
@@ -4,14 +4,15 @@
 # 
 # Translators:
 #   <peter.perosa@gmail.com>, 2012.
+# Peter Peroša <peter.perosa@gmail.com>, 2012.
 #   <urossolar@hotmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 11:20+0000\n"
+"Last-Translator: Peter Peroša <peter.perosa@gmail.com>\n"
 "Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/language/sl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,15 +22,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Ime aplikacije ni bilo določeno."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Ni kategorije za dodajanje?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Ta kategorija že obstaja:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -37,7 +38,7 @@ msgstr "Ponastavi ownCloud geslo"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "Ponastavitev gesla ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -90,7 +91,7 @@ msgstr "Uporabniki"
 
 #: strings.php:7
 msgid "Apps"
-msgstr "Apps"
+msgstr "Aplikacije"
 
 #: strings.php:8
 msgid "Admin"
@@ -102,7 +103,7 @@ msgstr "Pomoč"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Dostop je prepovedan"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -110,11 +111,11 @@ msgstr "Oblak ni bil najden"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Uredi kategorije"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Dodaj"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -161,7 +162,7 @@ msgstr "Gostitelj podatkovne zbirke"
 msgid "Finish setup"
 msgstr "Dokončaj namestitev"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "spletne storitve pod vašim nadzorom"
 
diff --git a/l10n/sl/files.po b/l10n/sl/files.po
index b7d610c9ee110afa57e93bbc61fddceb2d7e53bb..9169710bee3fcff76b6be3838ba296570b7bcfe2 100644
--- a/l10n/sl/files.po
+++ b/l10n/sl/files.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 11:20+0000\n"
+"Last-Translator: Peter Peroša <peter.perosa@gmail.com>\n"
 "Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/language/sl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -48,7 +48,7 @@ msgstr "Manjka začasna mapa"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Pisanje na disk je spodletelo"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -56,7 +56,7 @@ msgstr "Datoteke"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Rokovanje z datotekami"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -64,23 +64,23 @@ msgstr "Največja velikost za nalaganje"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "največ mogoče:"
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Potrebno za prenose večih datotek in map."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "Omogoči ZIP-prejemanje"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 je neskončno"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "Največja vhodna velikost za ZIP datoteke"
 
 #: templates/index.php:7
 msgid "New"
@@ -96,7 +96,7 @@ msgstr "Mapa"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Iz url naslova"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -104,7 +104,7 @@ msgstr "Naloži"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Prekliči nalaganje"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -116,7 +116,7 @@ msgstr "Ime"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Souporaba"
 
 #: templates/index.php:51
 msgid "Download"
@@ -132,7 +132,7 @@ msgstr "Spremenjeno"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Izbriši vse"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -150,8 +150,8 @@ msgstr "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno veliko
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Preiskujem datoteke, prosimo počakajte."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Trenutno preiskujem"
diff --git a/l10n/sl/gallery.po b/l10n/sl/gallery.po
index f6aa559f457d6584e34dfcd3a66b479b0dbb7019..9e3e07ca7f563e45e78cf3d49add724a4a1aa09e 100644
--- a/l10n/sl/gallery.po
+++ b/l10n/sl/gallery.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 18:08+0000\n"
+"Last-Translator: Peter Peroša <peter.perosa@gmail.com>\n"
 "Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/language/sl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -22,7 +22,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Slike"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -30,15 +30,15 @@ msgstr "Ponovno preišči"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Stop"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Deli"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Nastavitve"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -46,16 +46,16 @@ msgstr "Nazaj"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Odstrani potrditev"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Ali želite odstraniti album"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Spremeni ime albuma"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Novo ime albuma"
diff --git a/l10n/sl/settings.po b/l10n/sl/settings.po
index 3e8986a84aea29fbcba344c8546cf21a5bed5eab..2652ed92e4c6c7379df07ac56971f300ef46190e 100644
--- a/l10n/sl/settings.po
+++ b/l10n/sl/settings.po
@@ -9,10 +9,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 18:12+0000\n"
+"Last-Translator: Peter Peroša <peter.perosa@gmail.com>\n"
 "Language-Team: Slovenian (http://www.transifex.net/projects/p/owncloud/language/sl/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,15 +43,15 @@ msgstr "__ime_jezika__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Dnevnik"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Več"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Dodajte vašo aplikacijo"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -67,11 +67,11 @@ msgstr "s strani"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dokumentacija"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Upravljanje velikih datotek"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -99,11 +99,11 @@ msgstr "od razpoložljivih"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Namizni in mobilni odjemalci za sinhronizacijo"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "Prenesi"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -171,11 +171,11 @@ msgstr "Ustvari"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Privzeta količinska omejitev"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Drugo"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/sr/contacts.po b/l10n/sr/contacts.po
index ec8a035c20cd9d4ca61040447966dcfb9e5c78c5..8ccf3378e02873e7d151a9ecb1707df991ed9251 100644
--- a/l10n/sr/contacts.po
+++ b/l10n/sr/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Serbian (http://www.transifex.net/projects/p/owncloud/language/sr/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/sr@latin/contacts.po b/l10n/sr@latin/contacts.po
index deeed6ab72e7c6961efd1e6d96c927fc72e233f0..cc66bf04f1c6980f7a841b642121d938521cfe8b 100644
--- a/l10n/sr@latin/contacts.po
+++ b/l10n/sr@latin/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Serbian (Latin) (http://www.transifex.net/projects/p/owncloud/language/sr@latin/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/sv/contacts.po b/l10n/sv/contacts.po
index 76372e20ccbdd341a231f8a591b880ed7f4e7fe8..fe61cfd8bff6901e7c0797f36b9040f35f0f3de1 100644
--- a/l10n/sv/contacts.po
+++ b/l10n/sv/contacts.po
@@ -8,9 +8,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/language/sv/)\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Fel när (av)aktivera adressbok"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Det uppstod ett fel när kontakt skulle läggas till"
 
@@ -71,10 +71,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/templates/bookmarks.pot b/l10n/templates/bookmarks.pot
index 33e9002b99e0c37e794ac99b1ac6ac7f26afc697..8fd8f393f2ea5eaf1c7a10381157458dfb2fc72f 100644
--- a/l10n/templates/bookmarks.pot
+++ b/l10n/templates/bookmarks.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/calendar.pot b/l10n/templates/calendar.pot
index 1e9d4da1079dc4b29fdfe6d00e67692feb07b7fc..c1ec762cb1ecb2f7c573269faf67c4bef45e65c4 100644
--- a/l10n/templates/calendar.pot
+++ b/l10n/templates/calendar.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -51,67 +51,67 @@ msgstr ""
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr ""
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr ""
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr ""
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr ""
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr ""
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr ""
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr ""
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr ""
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr ""
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr ""
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr ""
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr ""
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr ""
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr ""
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr ""
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
 msgstr ""
 
diff --git a/l10n/templates/contacts.pot b/l10n/templates/contacts.pot
index ca4788a9aa432385dbcc8f95aa1e23e7e54bae1c..84598402cd6e9602897a5c3225cf4671b58e99bd 100644
--- a/l10n/templates/contacts.pot
+++ b/l10n/templates/contacts.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -69,10 +69,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot
index 5b399f0cb3a9453471e3f98e4f07eb65987d1cfa..18d15c38dca40bfc6b902982b934a8e6c97e1aa6 100644
--- a/l10n/templates/core.pot
+++ b/l10n/templates/core.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -159,7 +159,7 @@ msgstr ""
 msgid "Finish setup"
 msgstr ""
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr ""
 
diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot
index 4616ec5195c8630e90ddb5d6ac0e2d801397ad40..d3d0f0a57d88397ca7d35525ae7e7472e0cc7c6c 100644
--- a/l10n/templates/files.pot
+++ b/l10n/templates/files.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/gallery.pot b/l10n/templates/gallery.pot
index 1bd915fec11bc0702e12b5cb7dc6c7e9542de1e3..b81b86d3c00953d104ac1a5c91b72d210bf75795 100644
--- a/l10n/templates/gallery.pot
+++ b/l10n/templates/gallery.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/media.pot b/l10n/templates/media.pot
index b356fba6109a91aa7de952163d0f68c5564d6259..94331c8a87a7453b357b02157a0efbab70fdc8b0 100644
--- a/l10n/templates/media.pot
+++ b/l10n/templates/media.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,15 +17,15 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: appinfo/app.php:32 templates/player.php:9
+#: appinfo/app.php:32 templates/player.php:8
 msgid "Music"
 msgstr ""
 
-#: templates/music.php:3 templates/player.php:13
+#: templates/music.php:3 templates/player.php:12
 msgid "Play"
 msgstr ""
 
-#: templates/music.php:4 templates/music.php:26 templates/player.php:14
+#: templates/music.php:4 templates/music.php:26 templates/player.php:13
 msgid "Pause"
 msgstr ""
 
@@ -33,7 +33,7 @@ msgstr ""
 msgid "Previous"
 msgstr ""
 
-#: templates/music.php:6 templates/player.php:15
+#: templates/music.php:6 templates/player.php:14
 msgid "Next"
 msgstr ""
 
diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot
index f406acf394030063fa0d937d0a64f5b310038fb1..c349a9548f3608eaff66b63e8f99643e02f3cf7b 100644
--- a/l10n/templates/settings.pot
+++ b/l10n/templates/settings.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/th_TH/calendar.po b/l10n/th_TH/calendar.po
index 63d1950c30b72b3e7d67f1cc6698b3c5ef99d843..e79d87ac5c4e48737fc225fa22b0e3045477bed4 100644
--- a/l10n/th_TH/calendar.po
+++ b/l10n/th_TH/calendar.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# AriesAnywhere Anywhere <ariesanywhere@gmail.com>, 2012.
 # AriesAnywhere Anywhere <ariesanywherer@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 12:30+0000\n"
+"Last-Translator: AriesAnywhere Anywhere <ariesanywhere@gmail.com>\n"
 "Language-Team: Thai (Thailand) (http://www.transifex.net/projects/p/owncloud/language/th_TH/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +21,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "ไม่พบปฏิทินที่ต้องการ"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "ไม่พบกิจกรรมที่ต้องการ"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -50,71 +51,71 @@ msgstr "ปฏิทิน"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "วันเกิด"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "ธุรกิจ"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "โทรติดต่อ"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "ลูกค้า"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "จัดส่ง"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "วันหยุด"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "ไอเดีย"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "การเดินทาง"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "งานเลี้ยง"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "นัดประชุม"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "อื่นๆ"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "ส่วนตัว"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "โครงการ"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "คำถาม"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "งาน"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "ไม่มีชื่อ"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -363,7 +364,7 @@ msgstr "เลือกปฏิทินที่ต้องการใช้
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "ปฏิทินของคุณ"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -372,15 +373,15 @@ msgstr "ลิงค์ CalDav"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "ปฏิทินที่เปิดแชร์"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "ไม่มีปฏิทินที่เปิดแชร์ไว้"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "เปิดแชร์ปฏิทิน"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -397,7 +398,7 @@ msgstr "ลบ"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "แชร์ให้คุณโดย"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -442,23 +443,23 @@ msgstr "ส่งออกข้อมูล"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "ข้อมูลเกี่ยวกับกิจกรรม"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "ทำซ้ำ"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "แจ้งเตือน"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "ผู้เข้าร่วมกิจกรรม"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "แชร์"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -470,11 +471,11 @@ msgstr "หมวดหมู่"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "คั่นระหว่างรายการหมวดหมู่ด้วยเครื่องหมายจุลภาคหรือคอมม่า"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "แก้ไขหมวดหมู่"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -595,11 +596,11 @@ msgstr "สร้างกิจกรรมใหม่"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "ดูกิจกรรม"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "ยังไม่ได้เลือกหมวดหมู่"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -607,11 +608,11 @@ msgstr "เลือกหมวดหมู่"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "ของ"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "ที่"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -635,7 +636,7 @@ msgstr "12 ช.ม."
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "วันแรกของสัปดาห์"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,24 +644,24 @@ msgstr "ที่อยู่ในการเชื่อมข้อมูล
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "ผู้ใช้งาน"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "เลือกผู้ใช้งาน"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "สามารถแก้ไขได้"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "กลุ่ม"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "เลือกกลุ่ม"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "กำหนดเป็นสาธารณะ"
diff --git a/l10n/th_TH/contacts.po b/l10n/th_TH/contacts.po
index 9ca416be0049617ae10b4ca09d03390ad0ae151c..57e39309076ab0d7172ccc3bc6acb9660e1ba343 100644
--- a/l10n/th_TH/contacts.po
+++ b/l10n/th_TH/contacts.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# AriesAnywhere Anywhere <ariesanywhere@gmail.com>, 2012.
 # AriesAnywhere Anywhere <ariesanywherer@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Thai (Thailand) (http://www.transifex.net/projects/p/owncloud/language/th_TH/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "เกิดข้อผิดพลาดใน (ยกเลิก)การเปิดใช้งานสมุดบันทึกที่อยู่"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "เกิดข้อผิดพลาดในการเพิ่มรายชื่อผู้ติดต่อใหม่"
 
@@ -36,7 +37,7 @@ msgstr "อย่างน้อยที่สุดช่องข้อมู
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -44,39 +45,35 @@ msgstr "เกิดข้อผิดพลาดในการเพิ่ม
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "ยังไม่ได้ใส่รหัส"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "เกิดข้อผิดพลาดในการตั้งค่า checksum"
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "ยังไม่ได้เลือกหมวดหมู่ที่ต้องการลบ"
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "ไม่พบข้อมูลการติดต่อที่ต้องการ"
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "รหัสสูญหาย"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "พบข้อผิดพลาดในการแยกรหัส VCard:\""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "ไม่สามารถเพิ่มสมุดบันทึกที่อยู่โดยไม่มีชื่อได้"
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +85,27 @@ msgstr "เกิดข้อผิดพลาดในการเปิดใ
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา"
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "เกิดข้อผิดพลาดในการโหลดรูปภาพ"
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "เกิดข้อผิดพลาดในการอ่านรูปภาพของข้อมูลการติดต่อ"
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "เกิดข้อผิดพลาดในการบันทึกไฟล์ชั่วคราว"
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "โหลดรูปภาพไม่ถูกต้อง"
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "ยังไม่ได้กำหนดรหัส"
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,35 +117,35 @@ msgstr "เกิดข้อผิดพลาดในการลบราย
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "รหัสข้อมูลการติดต่อเกิดการสูญหาย"
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "รหัสข้อมูลการติดต่อเกิดการสูญหาย"
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "ไม่พบตำแหน่งพาธของรูปภาพ"
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "ไม่มีไฟล์ดังกล่าว"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "ยังไม่ได้กำหนดชื่อ"
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "ยังไม่ได้กำหนดค่า checksum"
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "มีบางอย่างเกิดการ FUBAR. "
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -156,7 +153,7 @@ msgstr "เกิดข้อผิดพลาดในการอัพเด
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้"
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -164,33 +161,33 @@ msgstr "เกิดข้อผิดพลาดในการอัพเด
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "เกิดข้อผิดพลาดในการอัพโหลดข้อมูลการติดต่อไปยังพื้นที่จัดเก็บข้อมูล"
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง upload_max_filesize ที่อยู่ในไฟล์ php.ini"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง MAX_FILE_SIZE ที่ถูกระบุไว้ในรูปแบบของ HTML"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "ไฟล์ถูกอัพโหลดได้เพียงบางส่วนเท่านั้น"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "ไม่มีไฟล์ที่ถูกอัพโหลด"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "โฟลเดอร์ชั่วคราวเกิดการสูญหาย"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +195,7 @@ msgstr "ข้อมูลการติดต่อ"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +244,7 @@ msgstr "เสียงพูด"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "ข้อความ"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +260,11 @@ msgstr "เพจเจอร์"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "อินเทอร์เน็ต"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "วันเกิดของ {name}"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +280,7 @@ msgstr "สมุดบันทึกที่อยู่"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "กำหนดค่าสมุดบันทึกที่อยู่"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +288,7 @@ msgstr "สร้างสมุดบันทึกข้อมูลการ
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "นำเข้าจาก VCF"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,23 +319,23 @@ msgstr "ลบข้อมูลการติดต่อ"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "วางรูปภาพที่ต้องการอัพโหลด"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "แก้ไขรายละเอียดของชื่อ"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "ชื่อเล่น"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "กรอกชื่อเล่น"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +343,19 @@ msgstr "วันเกิด"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "dd-mm-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "กลุ่ม"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "คั่นระหว่างรายชื่อกลุ่มด้วยเครื่องหมายจุลภาีคหรือคอมม่า"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "แก้ไขกลุ่ม"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,47 +363,47 @@ msgstr "พิเศษ"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "กรุณาระบุที่อยู่อีเมลที่ถูกต้อง"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "กรอกที่อยู่อีเมล"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "ส่งอีเมลไปที่"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "ลบที่อยู่อีเมล"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "กรอกหมายเลขโทรศัพท์"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "ลบหมายเลขโทรศัพท์"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "ดูบนแผนที่"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "แก้ไขรายละเอียดที่อยู่"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "เพิ่มหมายเหตุกำกับไว้ที่นี่"
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "เพิ่มช่องรับข้อมูล"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "รูปภาพโปรไฟล์"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -414,27 +411,27 @@ msgstr "โทรศัพท์"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "หมายเหตุ"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "ลบรูปภาพปัจจุบัน"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "แก้ไขรูปภาพปัจจุบัน"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "อัพโหลดรูปภาพใหม่"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "เลือกรูปภาพจาก ownCloud"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "แก้ไขที่อยู่"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +474,7 @@ msgstr "ประเทศ"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "แก้ไขหมวดหมู่"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -489,79 +486,79 @@ msgstr "สมุดบันทึกที่อยู่"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "คำนำหน้าชื่อคนรัก"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "นางสาว"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "น.ส."
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "นาย"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "คุณ"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "นาง"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "ดร."
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "ชื่อที่ใช้"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "ชื่ออื่นๆ"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "ชื่อครอบครัว"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "คำแนบท้ายชื่อคนรัก"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "M.D."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "ปริญญาเอก"
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "จูเนียร์"
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "ซีเนียร์"
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -594,76 +591,76 @@ msgstr "ยกเลิก"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "นำเข้าไฟล์ข้อมูลการติดต่อ"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "กรุณาเลือกสมุดบันทึกที่อยู่"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "สร้างสมุดบันทึกที่อยู่ใหม่"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "นำเข้า"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "นำเข้าข้อมูลการติดต่อ"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "ข้อมูลการติดต่อถูกนำเข้าข้อมูลเรียบร้อยแล้ว"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "ปิดกล่องข้อความ"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "นำเข้าข้อมูลสมุดบันทึกที่อยู่"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "เลือกสมุดบันทึกที่อยู่ที่ต้องการนำเข้า:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ"
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "เลือกจากฮาร์ดดิส"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ"
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "เพิ่มชื่อผู้ติดต่อ"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "กำหนดค่าสมุดบันทึกที่อยู่"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "ที่อยู่ที่ใช้เชื่อมข้อมูลกับ CardDAV"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "ข้อมูลเพิ่มเติม"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "ที่อยู่หลัก (สำหรับติดต่อ)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/th_TH/core.po b/l10n/th_TH/core.po
index d76b788789112de052ed4a6479e0d1ee13dd27d3..54854376e73396f02068238a9a7a3e08606749b6 100644
--- a/l10n/th_TH/core.po
+++ b/l10n/th_TH/core.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# AriesAnywhere Anywhere <ariesanywhere@gmail.com>, 2012.
 # AriesAnywhere Anywhere <ariesanywherer@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 12:35+0000\n"
+"Last-Translator: AriesAnywhere Anywhere <ariesanywhere@gmail.com>\n"
 "Language-Team: Thai (Thailand) (http://www.transifex.net/projects/p/owncloud/language/th_TH/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,15 +21,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "ยังไม่ได้ตั้งชื่อแอพพลิเคชั่น"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "ไม่มีหมวดหมู่ที่ต้องการเพิ่ม?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "หมวดหมู่นี้มีอยู่แล้ว: "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -36,7 +37,7 @@ msgstr "เปลี่ยนรหัสผ่านใน Owncloud"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "รีเซ็ตรหัสผ่าน ownCloud"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -101,7 +102,7 @@ msgstr "ช่วยเหลือ"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "การเข้าถึงถูกหวงห้าม"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +110,11 @@ msgstr "ไม่พบ Cloud"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "แก้ไขหมวดหมู่"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "เพิ่ม"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +161,7 @@ msgstr "Database host"
 msgid "Finish setup"
 msgstr "ติดตั้งเรียบร้อยแล้ว"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "web services under your control"
 
diff --git a/l10n/th_TH/files.po b/l10n/th_TH/files.po
index a20a23564547af5abcabce0a28b2b4e5caab3515..74001582a8da7c1efea5dbd750e4ee6807529a13 100644
--- a/l10n/th_TH/files.po
+++ b/l10n/th_TH/files.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# AriesAnywhere Anywhere <ariesanywhere@gmail.com>, 2012.
 # AriesAnywhere Anywhere <ariesanywherer@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 12:33+0000\n"
+"Last-Translator: AriesAnywhere Anywhere <ariesanywhere@gmail.com>\n"
 "Language-Team: Thai (Thailand) (http://www.transifex.net/projects/p/owncloud/language/th_TH/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +47,7 @@ msgstr "แฟ้มเอกสารชั่วคราวเกิดกา
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +55,7 @@ msgstr "ไฟล์"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "การจัดกาไฟล์"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +63,23 @@ msgstr "ขนาดไฟล์สูงสุดที่อัพโหลด
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "จำนวนสูงสุดที่สามารถทำได้: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "จำเป็นต้องใช้สำหรับการดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์หรือดาวน์โหลดทั้งโฟลเดอร์"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "อนุญาตให้ดาวน์โหลดเป็นไฟล์ ZIP ได้"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 หมายถึงไม่จำกัด"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "ขนาดไฟล์ ZIP สูงสุด"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +95,7 @@ msgstr "แฟ้มเอกสาร"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "จาก url"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +103,7 @@ msgstr "อัพโหลด"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "ยกเลิกการอัพโหลด"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +115,7 @@ msgstr "ชื่อ"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "แชร์"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +131,7 @@ msgstr "ปรับปรุงล่าสุด"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "ลบทั้งหมด"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +149,8 @@ msgstr "ไฟล์ที่คุณพยายามที่จะอัพ
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "ไฟล์ที่กำลังสแกนอยู่ขณะนี้"
diff --git a/l10n/th_TH/gallery.po b/l10n/th_TH/gallery.po
index 34bc8fa693fd3afbf57bd14d36fc0354538ac6d4..277830cd2b09dcfa63e2276a6d41679a87aa44bd 100644
--- a/l10n/th_TH/gallery.po
+++ b/l10n/th_TH/gallery.po
@@ -3,14 +3,15 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# AriesAnywhere Anywhere <ariesanywhere@gmail.com>, 2012.
 # AriesAnywhere Anywhere <ariesanywherer@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 12:24+0000\n"
+"Last-Translator: AriesAnywhere Anywhere <ariesanywhere@gmail.com>\n"
 "Language-Team: Thai (Thailand) (http://www.transifex.net/projects/p/owncloud/language/th_TH/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "รูปภาพ"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +29,15 @@ msgstr "ตรวจสอบอีกครั้ง"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "หยุด"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "แชร์"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "ตั้งค่า"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +45,16 @@ msgstr "ย้อนกลับ"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "การยืนยันการลบ"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "คุณต้องการลบอัลบั้มออกหรือไม่"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "เปลี่ยนชื่ออัลบั้ม"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "ชื่อใหม่ของอัลบั้ม"
diff --git a/l10n/th_TH/settings.po b/l10n/th_TH/settings.po
index 92f5f21f831e1028112897fa3d54668b72523d17..b726c8143f64a2f284093b265c38a74c342db164 100644
--- a/l10n/th_TH/settings.po
+++ b/l10n/th_TH/settings.po
@@ -3,15 +3,16 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# AriesAnywhere Anywhere <ariesanywhere@gmail.com>, 2012.
 # AriesAnywhere Anywhere <ariesanywherer@gmail.com>, 2012.
 #   <icewind1991@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 12:26+0000\n"
+"Last-Translator: AriesAnywhere Anywhere <ariesanywhere@gmail.com>\n"
 "Language-Team: Thai (Thailand) (http://www.transifex.net/projects/p/owncloud/language/th_TH/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -42,15 +43,15 @@ msgstr "ภาษาไทย"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "บันทึกการเปลี่ยนแปลง"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "เพิ่มเติม"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "เพิ่มแอปของคุณ"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -66,11 +67,11 @@ msgstr "โดย"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "เอกสารคู่มือการใช้งาน"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "การจัดการไฟล์ขนาดใหญ่"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -98,11 +99,11 @@ msgstr "จากจำนวนที่ใช้ได้"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "โปรแกรมเชื่อมข้อมูลไฟล์สำหรับเครื่องเดสก์ท็อปและมือถือ"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "ดาวน์โหลด"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -170,11 +171,11 @@ msgstr "สร้าง"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "โควต้าที่กำหนดไว้เริ่มต้น"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "อื่นๆ"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/tr/calendar.po b/l10n/tr/calendar.po
index 66c06ff3d114bc27882ac6bba5fa098769ab4a51..31f3d4b68c1bbcbe0a7cb45489acaa9348d99d7e 100644
--- a/l10n/tr/calendar.po
+++ b/l10n/tr/calendar.po
@@ -5,13 +5,14 @@
 # Translators:
 #   <ahmet_kaplan@hotmail.com>, 2012.
 # Aranel Surion <aranel@aranelsurion.org>, 2011, 2012.
+# Necdet Yücel <necdetyucel@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 11:01+0000\n"
+"Last-Translator: Necdet Yücel <necdetyucel@gmail.com>\n"
 "Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/language/tr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,11 +22,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "Takvim yok."
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "Etkinlik yok."
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -51,71 +52,71 @@ msgstr "Takvim"
 
 #: js/calendar.js:788
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
-msgstr ""
+msgstr "AAA g[ yyyy]{ '&#8212;'[ AAA] g yyyy}"
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "Doğum günü"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "İş"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "Arama"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "Müşteriler"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "Teslimatçı"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "Tatil günleri"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "Fikirler"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "Seyahat"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "Yıl dönümü"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "Toplantı"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "Diğer"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "Kişisel"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "Projeler"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "Sorular"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "İş"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "isimsiz"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -195,7 +196,7 @@ msgstr "Pazar"
 
 #: lib/object.php:373
 msgid "events week of month"
-msgstr ""
+msgstr "ayın etkinlikler haftası"
 
 #: lib/object.php:374
 msgid "first"
@@ -364,7 +365,7 @@ msgstr "Aktif takvimleri seçin"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "Takvimleriniz"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -373,15 +374,15 @@ msgstr "CalDav Bağlantısı"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "Paylaşılan"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "Paylaşılan takvim yok"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "Takvimi paylaş"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -398,7 +399,7 @@ msgstr "Sil"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "sizinle paylaşılmış"
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -443,23 +444,23 @@ msgstr "Dışa aktar"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "Etkinlik bilgisi"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "Tekrarlama"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "Alarm"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "Katılanlar"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "Paylaş"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -471,11 +472,11 @@ msgstr "Kategori"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "Kategorileri virgülle ayırın"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategorileri düzenle"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -528,11 +529,11 @@ msgstr "Günleri seçin"
 
 #: templates/part.eventform.php:169 templates/part.showevent.php:167
 msgid "and the events day of year."
-msgstr ""
+msgstr "ve yılın etkinlikler günü."
 
 #: templates/part.eventform.php:182 templates/part.showevent.php:180
 msgid "and the events day of month."
-msgstr ""
+msgstr "ve ayın etkinlikler günü."
 
 #: templates/part.eventform.php:190 templates/part.showevent.php:188
 msgid "Select months"
@@ -544,7 +545,7 @@ msgstr "Haftaları seç"
 
 #: templates/part.eventform.php:208 templates/part.showevent.php:206
 msgid "and the events week of year."
-msgstr ""
+msgstr "ve yılın etkinkinlikler haftası."
 
 #: templates/part.eventform.php:214 templates/part.showevent.php:212
 msgid "Interval"
@@ -556,11 +557,11 @@ msgstr "Son"
 
 #: templates/part.eventform.php:233 templates/part.showevent.php:231
 msgid "occurrences"
-msgstr ""
+msgstr "olaylar"
 
 #: templates/part.import.php:1
 msgid "Import a calendar file"
-msgstr ""
+msgstr "Takvim dosyasını içeri aktar"
 
 #: templates/part.import.php:6
 msgid "Please choose the calendar"
@@ -568,7 +569,7 @@ msgstr "Lütfen takvimi seçin"
 
 #: templates/part.import.php:10
 msgid "create a new calendar"
-msgstr ""
+msgstr "Yeni bir takvim oluştur"
 
 #: templates/part.import.php:15
 msgid "Name of new calendar"
@@ -580,15 +581,15 @@ msgstr "İçe Al"
 
 #: templates/part.import.php:20
 msgid "Importing calendar"
-msgstr ""
+msgstr "Takvim içe aktarılıyor"
 
 #: templates/part.import.php:23
 msgid "Calendar imported successfully"
-msgstr ""
+msgstr "Takvim başarıyla içe aktarıldı"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Diyalogu kapat"
 
 #: templates/part.newevent.php:1
 msgid "Create a new event"
@@ -596,11 +597,11 @@ msgstr "Yeni olay oluştur"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "Bir olay görüntüle"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "Kategori seçilmedi"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -608,11 +609,11 @@ msgstr "Kategori seçin"
 
 #: templates/part.showevent.php:37
 msgid "of"
-msgstr ""
+msgstr "nın"
 
 #: templates/part.showevent.php:62 templates/part.showevent.php:70
 msgid "at"
-msgstr ""
+msgstr "üzerinde"
 
 #: templates/settings.php:14
 msgid "Timezone"
@@ -620,7 +621,7 @@ msgstr "Zaman dilimi"
 
 #: templates/settings.php:31
 msgid "Check always for changes of the timezone"
-msgstr ""
+msgstr "Sürekli zaman dilimi değişikliklerini kontrol et"
 
 #: templates/settings.php:33
 msgid "Timeformat"
@@ -636,32 +637,32 @@ msgstr "12s"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "Haftanın ilk günü"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
-msgstr "CalDAV Takvim senkron adresi:"
+msgstr "CalDAV Takvim eşzamanlama adresi:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "Kullanıcılar"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "kullanıcıları seç"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "Düzenlenebilir"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "Gruplar"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "grupları seç"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "kamuyla paylaş"
diff --git a/l10n/tr/contacts.po b/l10n/tr/contacts.po
index 464cd0e83719d0d55f8bc1410dcd7325f1aa8845..462a165eb23fa59fdc78ef567975921d37f45e07 100644
--- a/l10n/tr/contacts.po
+++ b/l10n/tr/contacts.po
@@ -4,12 +4,13 @@
 # 
 # Translators:
 # Aranel Surion <aranel@aranelsurion.org>, 2011, 2012.
+# Necdet Yücel <necdetyucel@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/language/tr/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +23,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "Adres defteri etkisizleştirilirken hata oluştu."
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "Kişi eklenirken hata oluştu."
 
@@ -36,7 +37,7 @@ msgstr "En az bir adres alanı doldurulmalı."
 
 #: ajax/addproperty.php:62
 msgid "Trying to add duplicate property: "
-msgstr ""
+msgstr "Yinelenen özellik eklenmeye çalışılıyor: "
 
 #: ajax/addproperty.php:120
 msgid "Error adding contact property."
@@ -44,39 +45,35 @@ msgstr "Kişi özelliği eklenirken hata oluştu."
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "ID verilmedi"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "İmza oluşturulurken hata."
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
-msgstr ""
+msgstr "Silmek için bir kategori seçilmedi."
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "Adres defteri bulunamadı."
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "Bağlantı bulunamadı."
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "Eksik ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
-msgstr ""
-
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
+msgstr "ID için VCard ayrıştırılamadı:\""
 
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
-msgstr ""
+msgstr "Adres defterini isimsiz ekleyemezsiniz."
 
 #: ajax/createaddressbook.php:24
 msgid "Error adding addressbook."
@@ -88,27 +85,27 @@ msgstr "Adres defteri etkinleştirilirken hata oluştu."
 
 #: ajax/currentphoto.php:40 ajax/oc_photo.php:40
 msgid "No contact ID was submitted."
-msgstr ""
+msgstr "Bağlantı ID'si girilmedi."
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "İmaj yükleme hatası."
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "Bağlantı fotoğrafı okunamadı."
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "Geçici dosya kaydetme hatası."
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
-msgstr ""
+msgstr "Yüklenecek fotograf geçerli değil."
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "id atanmamış."
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,35 +117,35 @@ msgstr "Kişi özelliği silinirken hata oluştu."
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "Bağlantı ID'si eksik."
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "Eksik bağlantı id'si."
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
-msgstr ""
+msgstr "Fotoğraf girilmedi."
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "Dosya mevcut değil:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
-msgstr ""
+msgstr "eleman ismi atanmamış."
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "checksum atanmamış."
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
-msgstr ""
+msgstr "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: "
 
 #: ajax/saveproperty.php:83
 msgid "Something went FUBAR. "
-msgstr ""
+msgstr "Bir şey FUBAR gitti."
 
 #: ajax/saveproperty.php:153
 msgid "Error updating contact property."
@@ -156,7 +153,7 @@ msgstr "Kişi özelliği güncellenirken hata oluştu."
 
 #: ajax/updateaddressbook.php:20
 msgid "Cannot update addressbook with an empty name."
-msgstr ""
+msgstr "Adres defterini boş bir isimle güncelleyemezsiniz."
 
 #: ajax/updateaddressbook.php:26
 msgid "Error updating addressbook."
@@ -164,33 +161,33 @@ msgstr "Adres defteri güncellenirken hata oluştu."
 
 #: ajax/uploadimport.php:46 ajax/uploadimport.php:76
 msgid "Error uploading contacts to storage."
-msgstr ""
+msgstr "Bağlantıları depoya yükleme hatası"
 
 #: ajax/uploadimport.php:59 ajax/uploadphoto.php:85
 msgid "There is no error, the file uploaded with success"
-msgstr ""
+msgstr "Dosya başarıyla yüklendi, hata oluşmadı"
 
 #: ajax/uploadimport.php:60 ajax/uploadphoto.php:86
 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini"
-msgstr ""
+msgstr "Dosyanın boyutu php.ini dosyasındaki upload_max_filesize limitini aşıyor"
 
 #: ajax/uploadimport.php:61 ajax/uploadphoto.php:87
 msgid ""
 "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
 "the HTML form"
-msgstr ""
+msgstr "Yüklenecek dosyanın boyutu HTML formunda belirtilen MAX_FILE_SIZE limitini aşıyor"
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "Dosya kısmen karşıya yüklenebildi"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "Hiç dosya gönderilmedi"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
-msgstr ""
+msgstr "Geçici dizin eksik"
 
 #: appinfo/app.php:22 templates/settings.php:3
 msgid "Contacts"
@@ -198,7 +195,7 @@ msgstr "Kişiler"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "Adres defteri bulunamadı."
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -247,7 +244,7 @@ msgstr "Ses"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "mesaj"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,11 +260,11 @@ msgstr "Sayfalayıcı"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "İnternet"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name}'nin Doğumgünü"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +280,7 @@ msgstr "Adres defterleri"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "Adres Defterlerini Yapılandır"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +288,7 @@ msgstr "Yeni Adres Defteri"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "VCF'den içeri aktar"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -322,23 +319,23 @@ msgstr "Kişiyi sil"
 
 #: templates/part.contact.php:19
 msgid "Drop photo to upload"
-msgstr ""
+msgstr "Fotoğrafı yüklenmesi için bırakın"
 
 #: templates/part.contact.php:29
 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma"
-msgstr ""
+msgstr "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters"
 
 #: templates/part.contact.php:30
 msgid "Edit name details"
-msgstr ""
+msgstr "İsim detaylarını düzenle"
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "Takma ad"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "Takma adı girin"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +343,19 @@ msgstr "Doğum günü"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "gg-aa-yyyy"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "Gruplar"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "Grupları birbirinden virgülle ayırın"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "Grupları düzenle"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,47 +363,47 @@ msgstr "Tercih edilen"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "Lütfen geçerli bir eposta adresi belirtin."
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "Eposta adresini girin"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "Eposta adresi"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "Eposta adresini sil"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "Telefon numarasını gir"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "Telefon numarasını sil"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "Haritada gör"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "Adres detaylarını düzenle"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
-msgstr ""
+msgstr "Notları buraya ekleyin."
 
 #: templates/part.contact.php:101
 msgid "Add field"
-msgstr ""
+msgstr "Alan ekle"
 
 #: templates/part.contact.php:103
 msgid "Profile picture"
-msgstr ""
+msgstr "Profil resmi"
 
 #: templates/part.contact.php:107
 msgid "Phone"
@@ -414,27 +411,27 @@ msgstr "Telefon"
 
 #: templates/part.contact.php:110
 msgid "Note"
-msgstr ""
+msgstr "Not"
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "Mevcut fotoğrafı sil"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "Mevcut fotoğrafı düzenle"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "Yeni fotoğraf yükle"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "ownCloud'dan bir fotoğraf seç"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "Adresi düzenle"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +474,7 @@ msgstr "Ülke"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategorileri düzenle"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -489,79 +486,79 @@ msgstr "Adres defteri"
 
 #: templates/part.edit_name_dialog.php:23
 msgid "Hon. prefixes"
-msgstr ""
+msgstr "Kısaltmalar"
 
 #: templates/part.edit_name_dialog.php:27
 msgid "Miss"
-msgstr ""
+msgstr "Bayan"
 
 #: templates/part.edit_name_dialog.php:28
 msgid "Ms"
-msgstr ""
+msgstr "Bayan"
 
 #: templates/part.edit_name_dialog.php:29
 msgid "Mr"
-msgstr ""
+msgstr "Bay"
 
 #: templates/part.edit_name_dialog.php:30
 msgid "Sir"
-msgstr ""
+msgstr "Bay"
 
 #: templates/part.edit_name_dialog.php:31
 msgid "Mrs"
-msgstr ""
+msgstr "Bayan"
 
 #: templates/part.edit_name_dialog.php:32
 msgid "Dr"
-msgstr ""
+msgstr "Dr"
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "Verilen isim"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
-msgstr ""
+msgstr "İlave isimler"
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "Soyad"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
-msgstr ""
+msgstr "Kısaltmalar"
 
 #: templates/part.edit_name_dialog.php:45
 msgid "J.D."
-msgstr ""
+msgstr "J.D."
 
 #: templates/part.edit_name_dialog.php:46
 msgid "M.D."
-msgstr ""
+msgstr "Dr."
 
 #: templates/part.edit_name_dialog.php:47
 msgid "D.O."
-msgstr ""
+msgstr "D.O."
 
 #: templates/part.edit_name_dialog.php:48
 msgid "D.C."
-msgstr ""
+msgstr "D.C."
 
 #: templates/part.edit_name_dialog.php:49
 msgid "Ph.D."
-msgstr ""
+msgstr "Dr."
 
 #: templates/part.edit_name_dialog.php:50
 msgid "Esq."
-msgstr ""
+msgstr "Esq."
 
 #: templates/part.edit_name_dialog.php:51
 msgid "Jr."
-msgstr ""
+msgstr "Jr."
 
 #: templates/part.edit_name_dialog.php:52
 msgid "Sn."
-msgstr ""
+msgstr "Sn."
 
 #: templates/part.editaddressbook.php:9
 msgid "New Addressbook"
@@ -594,76 +591,76 @@ msgstr "İptal"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "Bağlantı dosyasını içeri aktar"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "Yeni adres defterini seç"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "Yeni adres defteri oluştur"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "Yeni adres defteri için isim"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "İçe aktar"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "Bağlantıları içe aktar"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "Bağlantılar başarıyla içe aktarıldı"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "Diyaloğu kapat"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
-msgstr ""
+msgstr "Adres defterini içeri aktar"
 
 #: templates/part.importaddressbook.php:12
 msgid "Select address book to import to:"
-msgstr ""
+msgstr "İçe aktarılacak adres defterini seçin:"
 
 #: templates/part.importaddressbook.php:20
 msgid "Drop a VCF file to import contacts."
-msgstr ""
+msgstr "Bağlantıları içe aktarmak için bir VCF dosyası bırakın."
 
 #: templates/part.importaddressbook.php:21
 msgid "Select from HD"
-msgstr ""
+msgstr "HD'den seç"
 
 #: templates/part.no_contacts.php:2
 msgid "You have no contacts in your addressbook."
-msgstr ""
+msgstr "Adres defterinizde hiç bağlantı yok."
 
 #: templates/part.no_contacts.php:4
 msgid "Add contact"
-msgstr ""
+msgstr "Bağlatı ekle"
 
 #: templates/part.no_contacts.php:5
 msgid "Configure addressbooks"
-msgstr ""
+msgstr "Adres defterini yapılandır"
 
 #: templates/settings.php:4
 msgid "CardDAV syncing addresses"
-msgstr ""
+msgstr "CardDAV adresleri eşzamanlıyor"
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "daha fazla bilgi"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "Birincil adres (Bağlantı ve arkadaşları)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/tr/core.po b/l10n/tr/core.po
index a25e41fb64b1db4958c5fb0cde6a62b468142720..97183a80b4d1871c301c8de6228f25275749a339 100644
--- a/l10n/tr/core.po
+++ b/l10n/tr/core.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 06:54+0000\n"
+"Last-Translator: Aranel Surion <aranel@aranelsurion.org>\n"
 "Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/language/tr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,15 +20,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "Uygulama adı verilmedi."
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "Eklenecek kategori yok?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "Bu kategori zaten mevcut: "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -36,7 +36,7 @@ msgstr "Owncloud parola sıfırlama"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud parola sıfırlama"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -101,7 +101,7 @@ msgstr "Yardı"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "Erişim yasaklı"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +109,11 @@ msgstr "Bulut bulunamadı"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "Kategorileri düzenle"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "Ekle"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +160,7 @@ msgstr "Veritabanı sunucusu"
 msgid "Finish setup"
 msgstr "Kurulumu tamamla"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "kontrolünüzdeki web servisleri"
 
diff --git a/l10n/tr/files.po b/l10n/tr/files.po
index fcb16ee63989bebf400a851a1d2f94ba6bdc824b..3c400f699cba0c2b0f677fdf4f669215a00d5c63 100644
--- a/l10n/tr/files.po
+++ b/l10n/tr/files.po
@@ -4,13 +4,14 @@
 # 
 # Translators:
 # Aranel Surion <aranel@aranelsurion.org>, 2011, 2012.
+# Necdet Yücel <necdetyucel@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 09:42+0000\n"
+"Last-Translator: Necdet Yücel <necdetyucel@gmail.com>\n"
 "Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/language/tr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +47,7 @@ msgstr "Geçici bir klasör eksik"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "Diske yazılamadı"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +55,7 @@ msgstr "Dosyalar"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "Dosya taşıma"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +63,23 @@ msgstr "Maksimum yükleme boyutu"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "mümkün olan en fazla: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "Çoklu dosya ve dizin indirmesi için gerekli."
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "ZIP indirmeyi aktif et"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 limitsiz demektir"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "ZIP dosyaları için en fazla girdi sayısı"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +95,7 @@ msgstr "Klasör"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "Url'den"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +103,7 @@ msgstr "Yükle"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "Yüklemeyi iptal et"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +115,7 @@ msgstr "Ad"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "Paylaş"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +131,7 @@ msgstr "Değiştirilme"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "Hepsini sil"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +149,8 @@ msgstr "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "Dosyalar taranıyor, lütfen bekleyin."
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "Güncel tarama"
diff --git a/l10n/tr/gallery.po b/l10n/tr/gallery.po
index 464e9656760a2c192b2507e18402d664b189028b..90a706647b16be6d704e0b2845387c1df204f617 100644
--- a/l10n/tr/gallery.po
+++ b/l10n/tr/gallery.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 06:53+0000\n"
+"Last-Translator: Aranel Surion <aranel@aranelsurion.org>\n"
 "Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/language/tr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "Resimler"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -29,15 +29,15 @@ msgstr "Yeniden Tara "
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "Durdur"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "Paylaş"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "Ayarlar"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -45,16 +45,16 @@ msgstr "Geri"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "Doğrulamayı kaldır"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "Albümü silmek istiyor musunuz"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "Albüm adını değiştir"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "Yeni albüm adı"
diff --git a/l10n/tr/settings.po b/l10n/tr/settings.po
index 0c20f4e0485bb55223008431d20228d6d20c392b..06d49d28e20f04bb2c5d5eab18172f9d12ba5284 100644
--- a/l10n/tr/settings.po
+++ b/l10n/tr/settings.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-10 06:55+0000\n"
+"Last-Translator: Aranel Surion <aranel@aranelsurion.org>\n"
 "Language-Team: Turkish (http://www.transifex.net/projects/p/owncloud/language/tr/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -41,15 +41,15 @@ msgstr "__dil_adı__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "Günlük"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "Devamı"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "Uygulamanı Ekle"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -65,11 +65,11 @@ msgstr "yapan"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "Dökümantasyon"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "Büyük Dosyaların Yönetimi"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -97,11 +97,11 @@ msgstr "mevcut olandan"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "Masaüstü ve Mobil Senkron İstemcileri"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "İndir"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -169,11 +169,11 @@ msgstr "Oluştur"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "Varsayılan Kota"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "Diğer"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/l10n/uk/contacts.po b/l10n/uk/contacts.po
index ba9fd904d858eca4e8d0d21bf7d57ab88235d3ae..3112261ed7b2dcab0dc5c7c9c1d27578162a609e 100644
--- a/l10n/uk/contacts.po
+++ b/l10n/uk/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Ukrainian (http://www.transifex.net/projects/p/owncloud/language/uk/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr ""
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr ""
 
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
diff --git a/l10n/zh_CN/calendar.po b/l10n/zh_CN/calendar.po
index c7757d95e12e9581f7709c4c1bd1189d71b820bb..743ec435b135325c719b18363f280ef0e1d29127 100644
--- a/l10n/zh_CN/calendar.po
+++ b/l10n/zh_CN/calendar.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 23:50+0000\n"
+"Last-Translator: csslayer <wengxt@gmail.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/language/zh_CN/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,11 +20,11 @@ msgstr ""
 
 #: ajax/categories/rescan.php:28
 msgid "No calendars found."
-msgstr ""
+msgstr "无法找到日历。"
 
 #: ajax/categories/rescan.php:36
 msgid "No events found."
-msgstr ""
+msgstr "无法找到事件。"
 
 #: ajax/event/edit.form.php:20
 msgid "Wrong calendar"
@@ -52,69 +52,69 @@ msgstr "日历"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "生日"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "商务"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "呼叫"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "客户"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "派送"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "节日"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "想法"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "旅行"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "周年纪念"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "会议"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "其他"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "个人"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "项目"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "问题"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "工作"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
-msgstr ""
+msgstr "未命名"
 
 #: lib/object.php:330
 msgid "Does not repeat"
@@ -363,7 +363,7 @@ msgstr "选择活动日历"
 
 #: templates/part.choosecalendar.php:2
 msgid "Your calendars"
-msgstr ""
+msgstr "您的日历"
 
 #: templates/part.choosecalendar.php:27
 #: templates/part.choosecalendar.rowfields.php:5
@@ -372,15 +372,15 @@ msgstr "CalDav 链接"
 
 #: templates/part.choosecalendar.php:31
 msgid "Shared calendars"
-msgstr ""
+msgstr "共享的日历"
 
 #: templates/part.choosecalendar.php:48
 msgid "No shared calendars"
-msgstr ""
+msgstr "无共享的日历"
 
 #: templates/part.choosecalendar.rowfields.php:4
 msgid "Share Calendar"
-msgstr ""
+msgstr "共享日历"
 
 #: templates/part.choosecalendar.rowfields.php:6
 msgid "Download"
@@ -397,7 +397,7 @@ msgstr "删除"
 
 #: templates/part.choosecalendar.rowfields.shared.php:4
 msgid "shared with you by"
-msgstr ""
+msgstr "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               "
 
 #: templates/part.editcalendar.php:9
 msgid "New calendar"
@@ -442,11 +442,11 @@ msgstr "导出"
 
 #: templates/part.eventform.php:8 templates/part.showevent.php:3
 msgid "Eventinfo"
-msgstr ""
+msgstr "事件信息"
 
 #: templates/part.eventform.php:9 templates/part.showevent.php:4
 msgid "Repeating"
-msgstr ""
+msgstr "重复"
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
@@ -454,11 +454,11 @@ msgstr ""
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "参加者"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "共享"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -470,11 +470,11 @@ msgstr "分类"
 
 #: templates/part.eventform.php:29
 msgid "Separate categories with commas"
-msgstr ""
+msgstr "用逗号分隔分类"
 
 #: templates/part.eventform.php:30
 msgid "Edit categories"
-msgstr ""
+msgstr "编辑分类"
 
 #: templates/part.eventform.php:56 templates/part.showevent.php:55
 msgid "All Day Event"
@@ -595,11 +595,11 @@ msgstr "创建新事件"
 
 #: templates/part.showevent.php:1
 msgid "View an event"
-msgstr ""
+msgstr "查看事件"
 
 #: templates/part.showevent.php:23
 msgid "No categories selected"
-msgstr ""
+msgstr "无选中分类"
 
 #: templates/part.showevent.php:25
 msgid "Select category"
@@ -635,7 +635,7 @@ msgstr "12小时"
 
 #: templates/settings.php:40
 msgid "First day of the week"
-msgstr ""
+msgstr "每周的第一天"
 
 #: templates/settings.php:49
 msgid "Calendar CalDAV syncing address:"
@@ -643,24 +643,24 @@ msgstr "日历CalDAV 同步地址:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "用户"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "选中用户"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "可编辑"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "分组"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "选中分组"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
-msgstr ""
+msgstr "公开"
diff --git a/l10n/zh_CN/contacts.po b/l10n/zh_CN/contacts.po
index 9ea76ae978d0ab0fff8cea41e984e9ca7201ca5d..f7e92dfd662a4d482670e55893fc45e1e20da5de 100644
--- a/l10n/zh_CN/contacts.po
+++ b/l10n/zh_CN/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/language/zh_CN/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "(取消)激活地址簿错误。"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "添加联系人时出错。"
 
@@ -48,7 +48,7 @@ msgstr ""
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
-msgstr ""
+msgstr "设置校验值错误。"
 
 #: ajax/categories/delete.php:29
 msgid "No categories selected for deletion."
@@ -56,24 +56,20 @@ msgstr ""
 
 #: ajax/categories/delete.php:36 ajax/categories/rescan.php:28
 msgid "No address books found."
-msgstr ""
+msgstr "找不到地址簿。"
 
 #: ajax/categories/delete.php:44 ajax/categories/rescan.php:36
 msgid "No contacts found."
-msgstr ""
+msgstr "找不到联系人。"
 
 #: ajax/contactdetails.php:37
 msgid "Missing ID"
-msgstr ""
+msgstr "缺少 ID"
 
 #: ajax/contactdetails.php:41
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
@@ -92,15 +88,15 @@ msgstr ""
 
 #: ajax/currentphoto.php:47 ajax/oc_photo.php:57 ajax/oc_photo.php:60
 msgid "Error loading image."
-msgstr ""
+msgstr "加载图片错误。"
 
 #: ajax/currentphoto.php:51
 msgid "Error reading contact photo."
-msgstr ""
+msgstr "读取联系人照片错误。"
 
 #: ajax/currentphoto.php:61
 msgid "Error saving temporary file."
-msgstr ""
+msgstr "保存临时文件错误。"
 
 #: ajax/currentphoto.php:64
 msgid "The loading photo is not valid."
@@ -108,7 +104,7 @@ msgstr ""
 
 #: ajax/deletecard.php:37 ajax/saveproperty.php:58
 msgid "id is not set."
-msgstr ""
+msgstr "没有设置 id。"
 
 #: ajax/deleteproperty.php:36
 msgid "Information about vCard is incorrect. Please reload the page."
@@ -120,11 +116,11 @@ msgstr "删除联系人属性错误。"
 
 #: ajax/editname.php:37
 msgid "Contact ID is missing."
-msgstr ""
+msgstr "缺少联系人 ID。"
 
 #: ajax/loadphoto.php:44
 msgid "Missing contact id."
-msgstr ""
+msgstr "缺少联系人 ID。"
 
 #: ajax/oc_photo.php:44
 msgid "No photo path was submitted."
@@ -132,7 +128,7 @@ msgstr ""
 
 #: ajax/oc_photo.php:51
 msgid "File doesn't exist:"
-msgstr ""
+msgstr "文件不存在:"
 
 #: ajax/saveproperty.php:55
 msgid "element name is not set."
@@ -140,7 +136,7 @@ msgstr ""
 
 #: ajax/saveproperty.php:61
 msgid "checksum is not set."
-msgstr ""
+msgstr "未设置校验值。"
 
 #: ajax/saveproperty.php:78
 msgid "Information about vCard is incorrect. Please reload the page: "
@@ -182,11 +178,11 @@ msgstr ""
 
 #: ajax/uploadimport.php:62 ajax/uploadphoto.php:88
 msgid "The uploaded file was only partially uploaded"
-msgstr ""
+msgstr "已上传文件只上传了部分"
 
 #: ajax/uploadimport.php:63 ajax/uploadphoto.php:89
 msgid "No file was uploaded"
-msgstr ""
+msgstr "没有文件被上传"
 
 #: ajax/uploadimport.php:64 ajax/uploadphoto.php:90
 msgid "Missing a temporary folder"
@@ -198,7 +194,7 @@ msgstr "联系人"
 
 #: lib/app.php:23
 msgid "Addressbook not found."
-msgstr ""
+msgstr "未找到地址簿。"
 
 #: lib/app.php:27
 msgid "This is not your addressbook."
@@ -263,11 +259,11 @@ msgstr "传呼机"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "互联网"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
-msgstr ""
+msgstr "{name} 的生日"
 
 #: lib/search.php:22
 msgid "Contact"
@@ -283,7 +279,7 @@ msgstr "地址簿"
 
 #: templates/part.chooseaddressbook.php:1
 msgid "Configure Address Books"
-msgstr ""
+msgstr "配置地址簿"
 
 #: templates/part.chooseaddressbook.php:16
 msgid "New Address Book"
@@ -291,7 +287,7 @@ msgstr "新建地址簿"
 
 #: templates/part.chooseaddressbook.php:17
 msgid "Import from VCF"
-msgstr ""
+msgstr "从 VCF 导入"
 
 #: templates/part.chooseaddressbook.php:22
 #: templates/part.chooseaddressbook.rowfields.php:8
@@ -334,11 +330,11 @@ msgstr ""
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "昵称"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "输入昵称"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -346,19 +342,19 @@ msgstr "生日"
 
 #: templates/part.contact.php:38
 msgid "dd-mm-yyyy"
-msgstr ""
+msgstr "yyyy-mm-dd"
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "分组"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
-msgstr ""
+msgstr "用逗号隔开分组"
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "编辑分组"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -366,35 +362,35 @@ msgstr "偏好"
 
 #: templates/part.contact.php:56
 msgid "Please specify a valid email address."
-msgstr ""
+msgstr "请指定合法的电子邮件地址"
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "输入电子邮件地址"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
-msgstr ""
+msgstr "发送邮件到地址"
 
 #: templates/part.contact.php:61
 msgid "Delete email address"
-msgstr ""
+msgstr "删除电子邮件地址"
 
 #: templates/part.contact.php:70
 msgid "Enter phone number"
-msgstr ""
+msgstr "输入电话号码"
 
 #: templates/part.contact.php:74
 msgid "Delete phone number"
-msgstr ""
+msgstr "删除电话号码"
 
 #: templates/part.contact.php:84
 msgid "View on map"
-msgstr ""
+msgstr "在地图上显示"
 
 #: templates/part.contact.php:84
 msgid "Edit address details"
-msgstr ""
+msgstr "编辑地址细节。"
 
 #: templates/part.contact.php:95
 msgid "Add notes here."
@@ -418,23 +414,23 @@ msgstr ""
 
 #: templates/part.contactphoto.php:8
 msgid "Delete current photo"
-msgstr ""
+msgstr "删除当前照片"
 
 #: templates/part.contactphoto.php:9
 msgid "Edit current photo"
-msgstr ""
+msgstr "编辑当前照片"
 
 #: templates/part.contactphoto.php:10
 msgid "Upload new photo"
-msgstr ""
+msgstr "上传新照片"
 
 #: templates/part.contactphoto.php:11
 msgid "Select photo from ownCloud"
-msgstr ""
+msgstr "从 ownCloud 选择照片"
 
 #: templates/part.edit_address_dialog.php:9
 msgid "Edit address"
-msgstr ""
+msgstr "编辑地址"
 
 #: templates/part.edit_address_dialog.php:14
 msgid "Type"
@@ -477,7 +473,7 @@ msgstr "国家"
 
 #: templates/part.edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "编辑分类"
 
 #: templates/part.edit_categories_dialog.php:14
 msgid "Add"
@@ -517,7 +513,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:35
 msgid "Given name"
-msgstr ""
+msgstr "名"
 
 #: templates/part.edit_name_dialog.php:37
 msgid "Additional names"
@@ -525,7 +521,7 @@ msgstr ""
 
 #: templates/part.edit_name_dialog.php:39
 msgid "Family name"
-msgstr ""
+msgstr "姓"
 
 #: templates/part.edit_name_dialog.php:41
 msgid "Hon. suffixes"
@@ -594,35 +590,35 @@ msgstr "取消"
 
 #: templates/part.import.php:1
 msgid "Import a contacts file"
-msgstr ""
+msgstr "导入联系人文件"
 
 #: templates/part.import.php:6
 msgid "Please choose the addressbook"
-msgstr ""
+msgstr "请选择地址簿"
 
 #: templates/part.import.php:10
 msgid "create a new addressbook"
-msgstr ""
+msgstr "创建新地址簿"
 
 #: templates/part.import.php:15
 msgid "Name of new addressbook"
-msgstr ""
+msgstr "新地址簿名称"
 
 #: templates/part.import.php:17
 msgid "Import"
-msgstr ""
+msgstr "导入"
 
 #: templates/part.import.php:20
 msgid "Importing contacts"
-msgstr ""
+msgstr "导入联系人"
 
 #: templates/part.import.php:23
 msgid "Contacts imported successfully"
-msgstr ""
+msgstr "联系人导入成功"
 
 #: templates/part.import.php:24
 msgid "Close Dialog"
-msgstr ""
+msgstr "关闭对话框"
 
 #: templates/part.importaddressbook.php:9
 msgid "Import Addressbook"
@@ -658,12 +654,12 @@ msgstr ""
 
 #: templates/settings.php:4
 msgid "more info"
-msgstr ""
+msgstr "更多信息"
 
 #: templates/settings.php:6
 msgid "Primary address (Kontact et al)"
-msgstr ""
+msgstr "首选地址 (Kontact 等)"
 
 #: templates/settings.php:8
 msgid "iOS/OS X"
-msgstr ""
+msgstr "iOS/OS X"
diff --git a/l10n/zh_CN/core.po b/l10n/zh_CN/core.po
index cd0974136385f3746c7a5b824086bd42b01cc946..e9f69c4c79b505f313cce918ae48b306da7ffba4 100644
--- a/l10n/zh_CN/core.po
+++ b/l10n/zh_CN/core.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 20:53+0000\n"
+"Last-Translator: csslayer <wengxt@gmail.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/language/zh_CN/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,15 +20,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "没有提供应用程序名称。"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "没有可添加分类?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "此分类已存在: "
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -36,7 +36,7 @@ msgstr "重置 Owncloud 密码"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "重置 ownCloud 密码"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -101,7 +101,7 @@ msgstr "帮助"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "访问禁止"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -109,11 +109,11 @@ msgstr "未找到云"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "编辑分类"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "添加"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -160,7 +160,7 @@ msgstr "数据库主机"
 msgid "Finish setup"
 msgstr "安装完成"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "由您掌控的网络服务"
 
diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po
index 28452ae2cdbc7224c1533ec8624b14a10d00a65a..5d85d3c8a93816f534aa5dd0903e127ecaa8b079 100644
--- a/l10n/zh_CN/files.po
+++ b/l10n/zh_CN/files.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 21:07+0000\n"
+"Last-Translator: csslayer <wengxt@gmail.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/language/zh_CN/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +46,7 @@ msgstr "缺少临时目录"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "写入磁盘失败"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -54,7 +54,7 @@ msgstr "文件"
 
 #: templates/admin.php:5
 msgid "File handling"
-msgstr ""
+msgstr "文件处理"
 
 #: templates/admin.php:7
 msgid "Maximum upload size"
@@ -62,23 +62,23 @@ msgstr "最大上传大小"
 
 #: templates/admin.php:7
 msgid "max. possible: "
-msgstr ""
+msgstr "最大可能: "
 
 #: templates/admin.php:9
 msgid "Needed for multi-file and folder downloads."
-msgstr ""
+msgstr "多文件和文件夹下载需要此项。"
 
 #: templates/admin.php:9
 msgid "Enable ZIP-download"
-msgstr ""
+msgstr "启用 ZIP 下载"
 
 #: templates/admin.php:11
 msgid "0 is unlimited"
-msgstr ""
+msgstr "0 为无限制"
 
 #: templates/admin.php:12
 msgid "Maximum input size for ZIP files"
-msgstr ""
+msgstr "ZIP 文件的最大输入大小"
 
 #: templates/index.php:7
 msgid "New"
@@ -94,7 +94,7 @@ msgstr "文件夹"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "来自地址"
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +102,7 @@ msgstr "上传"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "取消上传"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +114,7 @@ msgstr "名称"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "共享"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +130,7 @@ msgstr "修改日期"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "删除所有"
 
 #: templates/index.php:56
 msgid "Delete"
@@ -148,8 +148,8 @@ msgstr "您正尝试上传的文件超过了此服务器可以上传的最大大
 
 #: templates/index.php:71
 msgid "Files are being scanned, please wait."
-msgstr ""
+msgstr "文件正在被扫描,请稍候。"
 
 #: templates/index.php:74
 msgid "Current scanning"
-msgstr ""
+msgstr "当前扫描"
diff --git a/l10n/zh_CN/gallery.po b/l10n/zh_CN/gallery.po
index e07ea9859f45549ad2ffc71b6ce007dc7f619d87..f6c2a5881884377b3fc0f1d3c0872d4c5292427e 100644
--- a/l10n/zh_CN/gallery.po
+++ b/l10n/zh_CN/gallery.po
@@ -8,10 +8,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-09 20:55+0000\n"
+"Last-Translator: csslayer <wengxt@gmail.com>\n"
 "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/language/zh_CN/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +21,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "图片"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -29,15 +29,15 @@ msgstr "重新扫描"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "停止"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "分享"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "设置"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -45,16 +45,16 @@ msgstr "返回"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "移除确认"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "您是否想要移除相册"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "修改相册名称"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "新相册名称"
diff --git a/l10n/zh_TW/calendar.po b/l10n/zh_TW/calendar.po
index d272c25e94a8759661c6feb433d1e7f0e02cf465..9f25d3327142febd079a4b005f815e166b226e44 100644
--- a/l10n/zh_TW/calendar.po
+++ b/l10n/zh_TW/calendar.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 10:34+0000\n"
+"Last-Translator: Donahue Chuang <soshinwu@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/owncloud/language/zh_TW/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -52,67 +52,67 @@ msgstr "日曆"
 msgid "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}"
 msgstr ""
 
-#: lib/app.php:122
+#: lib/app.php:125
 msgid "Birthday"
 msgstr "生日"
 
-#: lib/app.php:123
+#: lib/app.php:126
 msgid "Business"
 msgstr "商業"
 
-#: lib/app.php:124
+#: lib/app.php:127
 msgid "Call"
 msgstr "呼叫"
 
-#: lib/app.php:125
+#: lib/app.php:128
 msgid "Clients"
 msgstr "客戶"
 
-#: lib/app.php:126
+#: lib/app.php:129
 msgid "Deliverer"
 msgstr "遞送者"
 
-#: lib/app.php:127
+#: lib/app.php:130
 msgid "Holidays"
 msgstr "節日"
 
-#: lib/app.php:128
+#: lib/app.php:131
 msgid "Ideas"
 msgstr "主意"
 
-#: lib/app.php:129
+#: lib/app.php:132
 msgid "Journey"
 msgstr "旅行"
 
-#: lib/app.php:130
+#: lib/app.php:133
 msgid "Jubilee"
 msgstr "周年慶"
 
-#: lib/app.php:131
+#: lib/app.php:134
 msgid "Meeting"
 msgstr "會議"
 
-#: lib/app.php:132
+#: lib/app.php:135
 msgid "Other"
 msgstr "其他"
 
-#: lib/app.php:133
+#: lib/app.php:136
 msgid "Personal"
 msgstr "個人"
 
-#: lib/app.php:134
+#: lib/app.php:137
 msgid "Projects"
 msgstr "計畫"
 
-#: lib/app.php:135
+#: lib/app.php:138
 msgid "Questions"
 msgstr "問題"
 
-#: lib/app.php:136
+#: lib/app.php:139
 msgid "Work"
 msgstr "工作"
 
-#: lib/app.php:377
+#: lib/app.php:380
 msgid "unnamed"
 msgstr ""
 
@@ -450,15 +450,15 @@ msgstr ""
 
 #: templates/part.eventform.php:10 templates/part.showevent.php:5
 msgid "Alarm"
-msgstr ""
+msgstr "鬧鐘"
 
 #: templates/part.eventform.php:11 templates/part.showevent.php:6
 msgid "Attendees"
-msgstr ""
+msgstr "出席者"
 
 #: templates/part.eventform.php:13
 msgid "Share"
-msgstr ""
+msgstr "分享"
 
 #: templates/part.eventform.php:21
 msgid "Title of the Event"
@@ -643,23 +643,23 @@ msgstr "CalDAV 的日曆同步地址:"
 
 #: templates/share.dropdown.php:20
 msgid "Users"
-msgstr ""
+msgstr "使用者"
 
 #: templates/share.dropdown.php:21
 msgid "select users"
-msgstr ""
+msgstr "選擇使用者"
 
 #: templates/share.dropdown.php:36 templates/share.dropdown.php:62
 msgid "Editable"
-msgstr ""
+msgstr "可編輯"
 
 #: templates/share.dropdown.php:48
 msgid "Groups"
-msgstr ""
+msgstr "群組"
 
 #: templates/share.dropdown.php:49
 msgid "select groups"
-msgstr ""
+msgstr "選擇群組"
 
 #: templates/share.dropdown.php:75
 msgid "make public"
diff --git a/l10n/zh_TW/contacts.po b/l10n/zh_TW/contacts.po
index 7e3b271c3ae6c98b933289616d42838bfaa19878..0e0a28e54952a8f53937d55dbc4ec1b978baba49 100644
--- a/l10n/zh_TW/contacts.po
+++ b/l10n/zh_TW/contacts.po
@@ -7,9 +7,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-13 17:52+0000\n"
 "Last-Translator: icewind <icewind1991@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/owncloud/language/zh_TW/)\n"
 "MIME-Version: 1.0\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "Error (de)activating addressbook."
 msgstr "在啟用或關閉電話簿時發生錯誤"
 
-#: ajax/addcontact.php:58
+#: ajax/addcontact.php:59
 msgid "There was an error adding the contact."
 msgstr "添加通訊錄發生錯誤"
 
@@ -44,7 +44,7 @@ msgstr "添加通訊錄內容中發生錯誤"
 
 #: ajax/categories/categoriesfor.php:15
 msgid "No ID provided"
-msgstr ""
+msgstr "未提供 ID"
 
 #: ajax/categories/categoriesfor.php:27
 msgid "Error setting checksum."
@@ -70,10 +70,6 @@ msgstr ""
 msgid "Error parsing VCard for ID: \""
 msgstr ""
 
-#: ajax/contactdetails.php:53
-msgid "Unknown"
-msgstr ""
-
 #: ajax/createaddressbook.php:18
 msgid "Cannot add addressbook with an empty name."
 msgstr ""
@@ -247,7 +243,7 @@ msgstr "語音"
 
 #: lib/app.php:119
 msgid "Message"
-msgstr ""
+msgstr "訊息"
 
 #: lib/app.php:120
 msgid "Fax"
@@ -263,7 +259,7 @@ msgstr "呼叫器"
 
 #: lib/app.php:128
 msgid "Internet"
-msgstr ""
+msgstr "網際網路"
 
 #: lib/hooks.php:79
 msgid "{name}'s Birthday"
@@ -334,11 +330,11 @@ msgstr ""
 
 #: templates/part.contact.php:35 templates/part.contact.php:105
 msgid "Nickname"
-msgstr ""
+msgstr "綽號"
 
 #: templates/part.contact.php:36
 msgid "Enter nickname"
-msgstr ""
+msgstr "輸入綽號"
 
 #: templates/part.contact.php:37 templates/part.contact.php:106
 msgid "Birthday"
@@ -350,7 +346,7 @@ msgstr ""
 
 #: templates/part.contact.php:39 templates/part.contact.php:111
 msgid "Groups"
-msgstr ""
+msgstr "群組"
 
 #: templates/part.contact.php:41
 msgid "Separate groups with commas"
@@ -358,7 +354,7 @@ msgstr ""
 
 #: templates/part.contact.php:42
 msgid "Edit groups"
-msgstr ""
+msgstr "編輯群組"
 
 #: templates/part.contact.php:55 templates/part.contact.php:69
 msgid "Preferred"
@@ -370,7 +366,7 @@ msgstr ""
 
 #: templates/part.contact.php:56
 msgid "Enter email address"
-msgstr ""
+msgstr "輸入電子郵件地址"
 
 #: templates/part.contact.php:60
 msgid "Mail to address"
diff --git a/l10n/zh_TW/core.po b/l10n/zh_TW/core.po
index 576c61ce2cda6716d1b19b32241d75dd89c83a06..6a60cc71fe5d0d28a3eff6347bdb7fcef47a780b 100644
--- a/l10n/zh_TW/core.po
+++ b/l10n/zh_TW/core.po
@@ -3,13 +3,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 # 
 # Translators:
+# Donahue Chuang <soshinwu@gmail.com>, 2012.
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:31+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 10:41+0000\n"
+"Last-Translator: Donahue Chuang <soshinwu@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/owncloud/language/zh_TW/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,15 +20,15 @@ msgstr ""
 
 #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23
 msgid "Application name not provided."
-msgstr ""
+msgstr "未提供應用程式名稱"
 
 #: ajax/vcategories/add.php:29
 msgid "No category to add?"
-msgstr ""
+msgstr "無分類添加?"
 
 #: ajax/vcategories/add.php:36
 msgid "This category already exists: "
-msgstr ""
+msgstr "此分類已經存在:"
 
 #: lostpassword/index.php:26
 msgid "Owncloud password reset"
@@ -35,7 +36,7 @@ msgstr "私有雲重設密碼"
 
 #: lostpassword/index.php:27
 msgid "ownCloud password reset"
-msgstr ""
+msgstr "ownCloud 密碼重設"
 
 #: lostpassword/templates/email.php:1
 msgid "Use the following link to reset your password: {link}"
@@ -100,7 +101,7 @@ msgstr "幫助"
 
 #: templates/403.php:12
 msgid "Access forbidden"
-msgstr ""
+msgstr "禁止存取"
 
 #: templates/404.php:12
 msgid "Cloud not found"
@@ -108,11 +109,11 @@ msgstr "未發現雲"
 
 #: templates/edit_categories_dialog.php:4
 msgid "Edit categories"
-msgstr ""
+msgstr "編輯分類"
 
 #: templates/edit_categories_dialog.php:14
 msgid "Add"
-msgstr ""
+msgstr "添加"
 
 #: templates/installation.php:23
 msgid "Create an <strong>admin account</strong>"
@@ -159,7 +160,7 @@ msgstr "資料庫主機"
 msgid "Finish setup"
 msgstr "完成設定"
 
-#: templates/layout.guest.php:37
+#: templates/layout.guest.php:36
 msgid "web services under your control"
 msgstr "網路服務已在你控制"
 
diff --git a/l10n/zh_TW/files.po b/l10n/zh_TW/files.po
index 7281f022692fc210eb1bfdaab6cee5497208e7cf..390457c1146b244b54fa8878d9e14b6975c06808 100644
--- a/l10n/zh_TW/files.po
+++ b/l10n/zh_TW/files.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 10:37+0000\n"
+"Last-Translator: Donahue Chuang <soshinwu@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/owncloud/language/zh_TW/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +46,7 @@ msgstr "遺失暫存資料夾"
 
 #: ajax/upload.php:25
 msgid "Failed to write to disk"
-msgstr ""
+msgstr "寫入硬碟失敗"
 
 #: appinfo/app.php:7
 msgid "Files"
@@ -94,7 +94,7 @@ msgstr "資料夾"
 
 #: templates/index.php:11
 msgid "From url"
-msgstr ""
+msgstr "由 url "
 
 #: templates/index.php:21
 msgid "Upload"
@@ -102,7 +102,7 @@ msgstr "上傳"
 
 #: templates/index.php:27
 msgid "Cancel upload"
-msgstr ""
+msgstr "取消上傳"
 
 #: templates/index.php:39
 msgid "Nothing in here. Upload something!"
@@ -114,7 +114,7 @@ msgstr "名稱"
 
 #: templates/index.php:49
 msgid "Share"
-msgstr ""
+msgstr "分享"
 
 #: templates/index.php:51
 msgid "Download"
@@ -130,7 +130,7 @@ msgstr "修改"
 
 #: templates/index.php:56
 msgid "Delete all"
-msgstr ""
+msgstr "全部刪除"
 
 #: templates/index.php:56
 msgid "Delete"
diff --git a/l10n/zh_TW/gallery.po b/l10n/zh_TW/gallery.po
index 6eabc2cb1c1bbf0e353a79119e21c8a8c88bc166..b428d045e351616de1e4111a3344a1440189bd43 100644
--- a/l10n/zh_TW/gallery.po
+++ b/l10n/zh_TW/gallery.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:33+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 10:36+0000\n"
+"Last-Translator: Donahue Chuang <soshinwu@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/owncloud/language/zh_TW/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -20,7 +20,7 @@ msgstr ""
 
 #: appinfo/app.php:42
 msgid "Pictures"
-msgstr ""
+msgstr "圖片"
 
 #: templates/index.php:16
 msgid "Rescan"
@@ -28,15 +28,15 @@ msgstr "重新掃描"
 
 #: templates/index.php:17
 msgid "Stop"
-msgstr ""
+msgstr "停止"
 
 #: templates/index.php:18
 msgid "Share"
-msgstr ""
+msgstr "分享"
 
 #: templates/index.php:19
 msgid "Settings"
-msgstr ""
+msgstr "設定"
 
 #: templates/view_album.php:19
 msgid "Back"
@@ -44,16 +44,16 @@ msgstr "返回"
 
 #: templates/view_album.php:36
 msgid "Remove confirmation"
-msgstr ""
+msgstr "移除確認"
 
 #: templates/view_album.php:37
 msgid "Do you want to remove album"
-msgstr ""
+msgstr "你確定要移除相簿嗎"
 
 #: templates/view_album.php:40
 msgid "Change album name"
-msgstr ""
+msgstr "變更相簿名稱"
 
 #: templates/view_album.php:43
 msgid "New album name"
-msgstr ""
+msgstr "新相簿名稱"
diff --git a/l10n/zh_TW/settings.po b/l10n/zh_TW/settings.po
index 002b9d57ef2ba60acb8792bee030208fc3ad41dc..8f19b70306511bf5f55c0858508648c91cbf5a19 100644
--- a/l10n/zh_TW/settings.po
+++ b/l10n/zh_TW/settings.po
@@ -7,10 +7,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: ownCloud\n"
-"Report-Msgid-Bugs-To: http://owncloud.shapado.com/\n"
-"POT-Creation-Date: 2012-05-09 12:29+0200\n"
-"PO-Revision-Date: 2012-05-09 10:32+0000\n"
-"Last-Translator: icewind <icewind1991@gmail.com>\n"
+"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
+"POT-Creation-Date: 2012-05-13 19:52+0200\n"
+"PO-Revision-Date: 2012-05-11 10:33+0000\n"
+"Last-Translator: Donahue Chuang <soshinwu@gmail.com>\n"
 "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/owncloud/language/zh_TW/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -41,15 +41,15 @@ msgstr "__語言_名稱__"
 
 #: templates/admin.php:13
 msgid "Log"
-msgstr ""
+msgstr "紀錄"
 
 #: templates/admin.php:40
 msgid "More"
-msgstr ""
+msgstr "更多"
 
 #: templates/apps.php:8
 msgid "Add your App"
-msgstr ""
+msgstr "添加你的 App"
 
 #: templates/apps.php:22
 msgid "Select an App"
@@ -65,11 +65,11 @@ msgstr "由"
 
 #: templates/help.php:8
 msgid "Documentation"
-msgstr ""
+msgstr "文件"
 
 #: templates/help.php:9
 msgid "Managing Big Files"
-msgstr ""
+msgstr "管理大檔案"
 
 #: templates/help.php:10
 msgid "Ask a question"
@@ -97,11 +97,11 @@ msgstr "可用"
 
 #: templates/personal.php:12
 msgid "Desktop and Mobile Syncing Clients"
-msgstr ""
+msgstr "桌機與手機同步客戶端"
 
 #: templates/personal.php:13
 msgid "Download"
-msgstr ""
+msgstr "下載"
 
 #: templates/personal.php:19
 msgid "Your password got changed"
@@ -169,11 +169,11 @@ msgstr "創造"
 
 #: templates/users.php:25
 msgid "Default Quota"
-msgstr ""
+msgstr "預設容量限制"
 
 #: templates/users.php:35 templates/users.php:74
 msgid "Other"
-msgstr ""
+msgstr "其他"
 
 #: templates/users.php:47
 msgid "Quota"
diff --git a/lib/app.php b/lib/app.php
index bc4f9c87e96759a8300127bd7950b3d976b20204..554724d238b22774a0ac6208712dc2aff84f36d5 100644
--- a/lib/app.php
+++ b/lib/app.php
@@ -65,9 +65,7 @@ class OC_App{
 		$apps = self::getEnabledApps();
 		foreach( $apps as $app ){
 			if((is_null($types) or self::isType($app,$types))){
-				if(is_file(OC::$APPSROOT.'/apps/'.$app.'/appinfo/app.php')){
-					require( $app.'/appinfo/app.php' );
-				}
+				self::loadApp($app);
 			}
 		}
 
@@ -78,7 +76,17 @@ class OC_App{
 	}
 
 	/**
-	 * check if an app is of a sepcific type
+	 * load a single app
+	 * @param string app
+	 */
+	public static function loadApp($app){
+		if(is_file(OC::$APPSROOT.'/apps/'.$app.'/appinfo/app.php')){
+			require_once( $app.'/appinfo/app.php' );
+		}
+	}
+
+	/**
+	 * check if an app is of a specific type
 	 * @param string $app
 	 * @param string/array $types
 	 */
@@ -106,19 +114,22 @@ class OC_App{
 			self::$appTypes=OC_Appconfig::getValues(false,'types');
 		}
 
-		//get it from info.xml if we haven't cached it
-		if(!isset(self::$appTypes[$app])){
-			$appData=self::getAppInfo($app);
-			if(isset($appData['types'])){
-				self::$appTypes[$app]=implode(',',$appData['types']);
-			}else{
-				self::$appTypes[$app]='';
-			}
+		return explode(',',self::$appTypes[$app]);
+	}
 
-			OC_Appconfig::setValue($app,'types',implode(',',self::$appTypes[$app]));
+	/**
+	 * read app types from info.xml and cache them in the database
+	 */
+	public static function setAppTypes($app){
+		$appData=self::getAppInfo($app);
+		
+		if(isset($appData['types'])){
+			$appTypes=implode(',',$appData['types']);
+		}else{
+			$appTypes='';
 		}
 
-		return explode(',',self::$appTypes[$app]);
+		OC_Appconfig::setValue($app,'types',$appTypes);
 	}
 
 	/**
@@ -534,6 +545,8 @@ class OC_App{
 		foreach($appData['public'] as $name=>$path){
 			OCP\CONFIG::setAppValue('core', 'public_'.$name, '/apps/'.$appid.'/'.$path);
 		}
+
+		self::setAppTypes($appid);
 	}
 
 	/**
diff --git a/lib/archive/tar.php b/lib/archive/tar.php
old mode 100755
new mode 100644
diff --git a/lib/archive/zip.php b/lib/archive/zip.php
old mode 100755
new mode 100644
diff --git a/lib/base.php b/lib/base.php
index ddf410c3163417174deb54efdb61191462b0ec0f..52a497e076d0bef8d8d2eab356e837f9ffafb2e0 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -289,12 +289,12 @@ class OC{
 				$appswebroot = (string) OC::$APPSWEBROOT;
 				$webroot = (string) OC::$WEBROOT;
 				$filepath = OC::$APPSROOT . '/apps/' . OC::$REQUESTEDAPP . '/' . OC::$REQUESTEDFILE;
-				$cssfile = file_get_contents($filepath);
-				$cssfile = str_replace('%appswebroot%', $appswebroot, $cssfile);
-				$cssfile = str_replace('%webroot%', $webroot, $cssfile);
 				header('Content-Type: text/css');
 				OC_Response::enableCaching();
 				OC_Response::setLastModifiedHeader(filemtime($filepath));
+				$cssfile = file_get_contents($filepath);
+				$cssfile = str_replace('%appswebroot%', $appswebroot, $cssfile);
+				$cssfile = str_replace('%webroot%', $webroot, $cssfile);
 				OC_Response::setETagHeader(md5($cssfile));
 				header('Content-Length: '.strlen($cssfile));
 				echo $cssfile;
diff --git a/lib/db.php b/lib/db.php
index 9899f30e75c45eb13b23860f174b74c56a7e929a..08bd06df95ec45b0f331636f01e2098e13d4cc81 100644
--- a/lib/db.php
+++ b/lib/db.php
@@ -96,6 +96,11 @@ class OC_DB {
 		$user = OC_Config::getValue( "dbuser", "" );
 		$pass = OC_Config::getValue( "dbpassword", "" );
 		$type = OC_Config::getValue( "dbtype", "sqlite" );
+		if(strpos($host,':')){
+			list($host,$port)=explode(':',$host,2);
+		}else{
+			$port=false;
+		}
 		$opts = array();
 		$datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT.'/data' );
 		
@@ -110,11 +115,19 @@ class OC_DB {
 					$dsn='sqlite:'.$datadir.'/'.$name.'.db';
 					break;
 				case 'mysql':
-					$dsn='mysql:dbname='.$name.';host='.$host;
+					if($port){
+						$dsn='mysql:dbname='.$name.';host='.$host.';port='.$port;
+					}else{
+						$dsn='mysql:dbname='.$name.';host='.$host;
+					}
 					$opts[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES 'UTF8'";
 					break;
 				case 'pgsql':
-					$dsn='pgsql:dbname='.$name.';host='.$host;
+					if($port){
+						$dsn='pgsql:dbname='.$name.';host='.$host.';port='.$port;
+					}else{
+						$dsn='pgsql:dbname='.$name.';host='.$host;
+					}
 					break;
 			}
 			try{
@@ -395,7 +408,8 @@ class OC_DB {
 		
 		if (PEAR::isError($op)) {
 			$error = $op->getMessage();
-			OC_Log::write('core','Failed to update database structure ('.$error.')',OC_Log::FATAL);
+			$detail = $op->getDebugInfo();
+			OC_Log::write('core','Failed to update database structure ('.$error.', '.$detail.')',OC_Log::FATAL);
 			return false;
 		}
 		return true;
diff --git a/lib/filecache.php b/lib/filecache.php
index 9ec307cc8129bec673b8515de7588d5245e2c196..a94349e19cb9c58387f3477384282c238cab61a3 100644
--- a/lib/filecache.php
+++ b/lib/filecache.php
@@ -564,9 +564,13 @@ class OC_FileCache{
 		}
 		if(!$view->is_readable($path)) return; //cant read, nothing we can do
 		clearstatcache();
-		$stat=$view->stat($path);
 		$mimetype=$view->getMimeType($path);
-		$writable=$view->is_writable($path);
+		$stat=$view->stat($path);
+		if($mimetype=='httpd/unix-directory'){
+			$writable=$view->is_writable($path.'/');
+		}else{
+			$writable=$view->is_writable($path);
+		}
 		$stat['mimetype']=$mimetype;
 		$stat['writable']=$writable;
 		if($path=='/'){
diff --git a/lib/files.php b/lib/files.php
index 5d4d73630eb8d016af7ff33ad9cc50017c87b9e5..b405cf1749f73eef0187aa26932799acc71cd946 100644
--- a/lib/files.php
+++ b/lib/files.php
@@ -102,6 +102,7 @@ class OC_Files {
 			header('Content-Transfer-Encoding: binary');
 			OC_Response::disableCaching();
 			if($zip){
+				ini_set('zlib.output_compression', 'off');
 				header('Content-Type: application/zip');
 				header('Content-Length: ' . filesize($filename));
 			}else{
diff --git a/lib/group.php b/lib/group.php
index 9b2959d1f73c77cfa3dba3e8a0b4f88679d220ae..1e0216a932b93a47bb18f481569eeee1ab708fb5 100644
--- a/lib/group.php
+++ b/lib/group.php
@@ -177,7 +177,11 @@ class OC_Group {
 				if(!$backend->implementsActions(OC_GROUP_BACKEND_ADD_TO_GROUP))
 					continue;
 
-				$succes|=$backend->addToGroup($uid, $gid);
+				if($backend->groupExists($gid)){
+					$succes|=$backend->addToGroup($uid, $gid);
+				}
+			}
+			if($succes){
 				OC_Hook::emit( "OC_User", "post_addToGroup", array( "uid" => $uid, "gid" => $gid ));
 			}
 			return $succes;
diff --git a/lib/installer.php b/lib/installer.php
index e1f30ebe272f6761115c114ae29c1fd1814f1346..731eaaa903099d7a128f43ec845a885dbefed0a0 100644
--- a/lib/installer.php
+++ b/lib/installer.php
@@ -193,6 +193,9 @@ class OC_Installer{
 		foreach($info['public'] as $name=>$path){
 			OCP\CONFIG::setAppValue('core', 'public_'.$name, '/apps/'.$info['id'].'/'.$path);
 		}
+
+		OC_App::setAppTypes($info['id']);
+		
 		return $info['id'];
 	}
 
@@ -318,6 +321,9 @@ class OC_Installer{
 		foreach($info['public'] as $name=>$path){
 			OCP\CONFIG::setAppValue('core', 'public_'.$name, '/apps/'.$app.'/'.$path);
 		}
+		
+		OC_App::setAppTypes($info['id']);
+		
 		return $info;
 	}
 
diff --git a/lib/json.php b/lib/json.php
index 6782bad8bb70dc95a2f3f7dc287a0bf8f449388c..f3bbe9ac89976767adf01441d329970fc0457631 100644
--- a/lib/json.php
+++ b/lib/json.php
@@ -73,7 +73,7 @@ class OC_JSON{
 	* Encode and print $data in json format
 	*/
 	public static function encodedPrint($data,$setContentType=true){
-		if(!isset($_SERVER['PATH_INFO'])) {
+		if(!isset($_SERVER['PATH_INFO']) || $_SERVER['PATH_INFO'] == '') {
 			if($setContentType){
 				self::setContentTypeHeader();
 			}
diff --git a/lib/template.php b/lib/template.php
index 57e9c15f5e689a6c79ae0a6ed53f71e38ab6259a..e908c76bfadf0c2ba76af716b5d2bf0f78e3b911 100644
--- a/lib/template.php
+++ b/lib/template.php
@@ -156,7 +156,10 @@ class OC_Template{
 		$this->application = $app;
 		$this->vars = array();
 		$this->l10n = OC_L10N::get($app);
-
+                header('X-Frame-Options: Sameorigin');
+                header('X-XSS-Protection: 1; mode=block');
+                header('X-Content-Type-Options: nosniff');
+ 
 		$this->findTemplate($name);
 	}
 
diff --git a/lib/user.php b/lib/user.php
index 816caff8dd8de2f0db2cb1117ee0f7f054758476..056d1307543c408093541138ed9e1f3d00eb2202 100644
--- a/lib/user.php
+++ b/lib/user.php
@@ -123,6 +123,11 @@ class OC_User {
 		if(trim($uid) == ''){
 			throw new Exception('A valid username must be provided');
 		}
+		// No empty password
+		if(trim($password) == ''){
+			throw new Exception('A valid password must be provided');
+		}
+		
 		// Check if user already exists
 		if( self::userExists($uid) ){
 			throw new Exception('The username is already being used');
@@ -299,9 +304,10 @@ class OC_User {
 	 * @brief Check if the password is correct
 	 * @param $uid The username
 	 * @param $password The password
-	 * @returns true/false
+	 * @returns string
 	 *
 	 * Check if the password is correct without logging in the user
+	 * returns the user id or false
 	 */
 	public static function checkPassword( $uid, $password ){
 		foreach(self::$_usedBackends as $backend){
diff --git a/lib/user/database.php b/lib/user/database.php
index 4738a8948cb65fd28a0580e19b6535cf9b84e6f7..894ccffb79107c482751818bf859c2bc06e4db90 100644
--- a/lib/user/database.php
+++ b/lib/user/database.php
@@ -117,9 +117,10 @@ class OC_User_Database extends OC_User_Backend {
 	 * @brief Check if the password is correct
 	 * @param $uid The username
 	 * @param $password The password
-	 * @returns true/false
+	 * @returns string
 	 *
 	 * Check if the password is correct without logging in the user
+	 * returns the user id or false
 	 */
 	public function checkPassword( $uid, $password ){
 		$query = OC_DB::prepare( "SELECT uid, password FROM *PREFIX*users WHERE uid = ?" );
diff --git a/lib/user/dummy.php b/lib/user/dummy.php
index cfc96c5c52de0dbe074dbcf993487e5d79a713dc..03d5c3256dace86d4a8093b4f97523f464b6ae37 100644
--- a/lib/user/dummy.php
+++ b/lib/user/dummy.php
@@ -81,9 +81,10 @@ class OC_User_Dummy extends OC_User_Backend {
 		* @brief Check if the password is correct
 		* @param $uid The username
 		* @param $password The password
-		* @returns true/false
+		* @returns string
 		*
 		* Check if the password is correct without logging in the user
+		* returns the user id or false
 		*/
 	public function checkPassword($uid, $password){
 		if(isset($this->users[$uid])){
diff --git a/lib/user/example.php b/lib/user/example.php
index 7481014de77c5fb54ff8183abfdd529886e10573..b6a2091b68583291d1cb57335861e97116a70ac2 100644
--- a/lib/user/example.php
+++ b/lib/user/example.php
@@ -66,9 +66,10 @@ abstract class OC_User_Example extends OC_User_Backend {
 		* @brief Check if the password is correct
 		* @param $uid The username
 		* @param $password The password
-		* @returns true/false
+		* @returns string
 		*
 		* Check if the password is correct without logging in the user
+		* returns the user id or false
 		*/
 	public function checkPassword($uid, $password){
 		return OC_USER_BACKEND_NOT_IMPLEMENTED;
diff --git a/public.php b/public.php
index 27a75adec9319275b84f6642c76e9522f5760acf..f974e1c50d2329b7a8ea702552d181935561fa57 100644
--- a/public.php
+++ b/public.php
@@ -1,10 +1,15 @@
 <?php
 $RUNTIME_NOSETUPFS = true;
-//$RUNTIME_NOAPPS = TRUE;
+$RUNTIME_NOAPPS = TRUE;
 require_once('lib/base.php');
 $file = OCP\CONFIG::getAppValue('core', 'public_' . strip_tags($_GET['service']));
 if(is_null($file)){
 	header('HTTP/1.0 404 Not Found');
 	exit;
 }
-require_once(OC::$APPSROOT . $file);
\ No newline at end of file
+
+$parts=explode('/',$file);
+$app=$parts[2];
+OC_App::loadApp($app);
+
+require_once(OC::$APPSROOT . $file);
diff --git a/remote.php b/remote.php
index 2a7ab167d048c3dbe0b1060fddabf9a3c6207906..44b85f762f58d11b57e343c55300e6975274ea96 100644
--- a/remote.php
+++ b/remote.php
@@ -1,8 +1,12 @@
 <?php
 $RUNTIME_NOSETUPFS = true;
-//$RUNTIME_NOAPPS = TRUE;
+$RUNTIME_NOAPPS = TRUE;
 require_once('lib/base.php');
-$path_info = $_SERVER['PATH_INFO'];
+if (array_key_exists('PATH_INFO', $_SERVER)){
+	$path_info = $_SERVER['PATH_INFO'];
+}else{
+	$path_info = substr($_SERVER['PHP_SELF'], strpos($_SERVER['PHP_SELF'], basename(__FILE__)) + strlen(basename(__FILE__)));
+}
 if (!$pos = strpos($path_info, '/', 1)) {
 	$pos = strlen($path_info);
 }
@@ -12,5 +16,10 @@ if(is_null($file)){
 	header('HTTP/1.0 404 Not Found');
 	exit;
 }
+
+$parts=explode('/',$file);
+$app=$parts[2];
+OC_App::loadApp($app);
+
 $baseuri = OC::$WEBROOT . '/remote.php/'.$service.'/';
 require_once(OC::$APPSROOT . $file);
\ No newline at end of file
diff --git a/settings/js/apps.js b/settings/js/apps.js
index c15f0f30473659ac729e94db6e0db60784272e73..8aa54463b3bed3d8fec7638683631a749ce8354b 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -34,6 +34,7 @@ $(document).ready(function(){
 		return false;
 	});
 	$('#rightcontent input.enable').click(function(){
+		var element = $(this);
 		var app=$(this).data('appid');
 		var active=$(this).data('active');
 		if(app){
@@ -42,6 +43,12 @@ $(document).ready(function(){
 					if(!result || result.status!='success'){
 						OC.dialogs.alert('Error','Error while disabling app');
 					}
+					else {
+						element.data('active',false);
+						element.val(t('settings','Enable'));
+						var appData=$('#leftcontent li[data-id="'+app+'"]');
+						appData.active=false;
+					}
 				},'json');
 				$('#leftcontent li[data-id="'+app+'"]').removeClass('active');
 			}else{
@@ -49,14 +56,15 @@ $(document).ready(function(){
 					if(!result || result.status!='success'){
 						OC.dialogs.alert('Error','Error while enabling app');
 					}
+					else {
+						element.data('active',true);
+						element.val(t('settings','Disable'));
+						var appData=$('#leftcontent li[data-id="'+app+'"]');
+						appData.active=true;
+					}
 				},'json');
 				$('#leftcontent li[data-id="'+app+'"]').addClass('active');
 			}
-			active=!active;
-			$(this).data('active',active);
-			$(this).val((active)?t('settings','Disable'):t('settings','Enable'));
-			var appData=$('#leftcontent li[data-id="'+app+'"]');
-			appData.active=active;
 		}
 	});
 });
diff --git a/settings/js/users.js b/settings/js/users.js
index 971da7abe98c3f3951bb677d85d890c8bf89a796..7c3c3d37b18e3f09cb04fa86c138eeb123b43802 100644
--- a/settings/js/users.js
+++ b/settings/js/users.js
@@ -157,6 +157,7 @@ $(document).ready(function(){
 	$('#newuser').submit(function(event){
 		event.preventDefault();
 		var username=$('#newusername').val();
+		var password=$('#newuserpassword').val();
 		if($('#content table tbody tr').filterAttr('data-uid',username).length>0){
 			OC.dialogs.alert('The username is already being used', 'Error creating user');
 			return;
@@ -165,7 +166,10 @@ $(document).ready(function(){
 			OC.dialogs.alert('A valid username must be provided', 'Error creating user');
 			return false;
 		}
-		var password=$('#newuserpassword').val();
+		if($.trim(password) == '') {
+			OC.dialogs.alert('A valid password must be provided', 'Error creating user');
+			return false;
+		}
 		var groups=$('#newusergroups').prev().children('div').data('settings').checked;
 		$('#newuser').get(0).reset();
 		$.post(
diff --git a/settings/l10n/ca.php b/settings/l10n/ca.php
index eefd87cd94940957c545da47611b4cc42468bd6c..89558041ae3dc1d0283f3c918bd3d06919240408 100644
--- a/settings/l10n/ca.php
+++ b/settings/l10n/ca.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID ha canviat",
 "Language changed" => "S'ha canviat l'idioma",
 "__language_name__" => "Català",
+"Log" => "Registre",
+"More" => "Més",
+"Add your App" => "Afegeiu la vostra aplicació",
 "Select an App" => "Seleccioneu una aplicació",
 "-licensed" => "- amb llicència",
 "by" => "de",
+"Documentation" => "Documentació",
+"Managing Big Files" => "Gestió de fitxers grans",
 "Ask a question" => "Feu una pregunta",
 "Problems connecting to help database." => "Problemes per connectar amb la base de dades d'ajuda.",
 "Go there manually." => "Vés-hi manualment.",
 "Answer" => "Resposta",
 "You use" => "Esteu usant",
 "of the available" => "del disponible",
+"Desktop and Mobile Syncing Clients" => "Clients de sincronització d'escriptori i de mòbil",
+"Download" => "Baixada",
 "Your password got changed" => "La contrasenya ha canviat",
 "Unable to change your password" => "No s'ha pogut canviar la contrasenya",
 "Current password" => "Contrasenya actual",
@@ -29,6 +36,8 @@
 "Password" => "Contrasenya",
 "Groups" => "Grups",
 "Create" => "Crea",
+"Default Quota" => "Quota per defecte",
+"Other" => "Altre",
 "Quota" => "Quota",
 "Delete" => "Suprimeix"
 );
diff --git a/settings/l10n/cs_CZ.php b/settings/l10n/cs_CZ.php
index 04bb1daf443c12ea3a8af44efebfa6c8a2282be6..9beb4215e0f87bbaffc923272e4cfc061533cdd4 100644
--- a/settings/l10n/cs_CZ.php
+++ b/settings/l10n/cs_CZ.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID změněn",
 "Language changed" => "Jazyk byl změněn",
 "__language_name__" => "Česky",
+"Log" => "Log",
+"More" => "Více",
+"Add your App" => "Přidat vaší aplikaci",
 "Select an App" => "Vyberte aplikaci",
 "-licensed" => "-licencováno",
 "by" => "podle",
+"Documentation" => "Dokumentace",
+"Managing Big Files" => "Spravování velkých souborů",
 "Ask a question" => "Zeptat se",
 "Problems connecting to help database." => "Problémy s připojením k databázi s nápovědou.",
 "Go there manually." => "Přejít ručně.",
 "Answer" => "Odpověď",
 "You use" => "Využíváte",
 "of the available" => "z dostupných",
+"Desktop and Mobile Syncing Clients" => "Klienti pro synchronizaci",
+"Download" => "Stáhnout",
 "Your password got changed" => "Vaše heslo bylo změněno",
 "Unable to change your password" => "Vaše heslo se nepodařilo změnit",
 "Current password" => "Aktuální heslo",
@@ -23,12 +30,14 @@
 "Your email address" => "Vaše emailová adresa",
 "Fill in an email address to enable password recovery" => "Pro povolení změny hesla vyplňte email adresu",
 "Language" => "Jazyk",
-"Help translate" => "Pomoc s překladem",
+"Help translate" => "Pomoci překládat",
 "use this address to connect to your ownCloud in your file manager" => "tuto adresu použijte pro připojení k ownCloud ve Vašem správci souborů",
 "Name" => "Jméno",
 "Password" => "Heslo",
 "Groups" => "Skupiny",
 "Create" => "Vytvořit",
+"Default Quota" => "Výchozí kvóta",
+"Other" => "Jiné",
 "Quota" => "Kvóta",
 "Delete" => "Vymazat"
 );
diff --git a/settings/l10n/de.php b/settings/l10n/de.php
index 22ba0b604345974a7356a18b4478a6a15b22a12f..6c4cbc52c69dcc4a36533f21d5decd7827b89883 100644
--- a/settings/l10n/de.php
+++ b/settings/l10n/de.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID geändert",
 "Language changed" => "Sprache geändert",
 "__language_name__" => "Deutsch",
+"Log" => "Log",
+"More" => "mehr",
+"Add your App" => "Füge deine App hinzu",
 "Select an App" => "Wähle eine Anwendung aus",
 "-licensed" => "-lizenziert",
 "by" => "von",
+"Documentation" => "Dokumentation",
+"Managing Big Files" => "große Dateien verwalten",
 "Ask a question" => "Stell eine Frage",
 "Problems connecting to help database." => "Probleme bei der Verbindung zur Hilfe-Datenbank.",
 "Go there manually." => "Datenbank direkt besuchen.",
 "Answer" => "Antwort",
 "You use" => "Du nutzt",
 "of the available" => "der verfügbaren",
+"Desktop and Mobile Syncing Clients" => "Desktop und mobile Syncing Clienten",
+"Download" => "Download",
 "Your password got changed" => "Dein Passwort wurde geändert.",
 "Unable to change your password" => "Passwort konnte nicht geändert werden",
 "Current password" => "Aktuelles Passwort",
@@ -29,6 +36,8 @@
 "Password" => "Passwort",
 "Groups" => "Gruppen",
 "Create" => "Anlegen",
+"Default Quota" => "Standard Quota",
+"Other" => "andere",
 "Quota" => "Quota",
 "Delete" => "Löschen"
 );
diff --git a/settings/l10n/el.php b/settings/l10n/el.php
index fadcfc51f7fb3fbb459f3251bebb26bc7228d777..44875b8ef7166123f6d25c416824522e5a415657 100644
--- a/settings/l10n/el.php
+++ b/settings/l10n/el.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "Το OpenID άλλαξε",
 "Language changed" => "Η γλώσσα άλλαξε",
 "__language_name__" => "__όνομα_γλώσσας__",
+"Log" => "Αρχείο καταγραφής",
+"More" => "Περισσότερο",
+"Add your App" => "Πρόσθεσε τη δικιά σου εφαρμογή ",
 "Select an App" => "Επιλέξτε μια εφαρμογή",
 "-licensed" => "-με άδεια",
 "by" => "από",
+"Documentation" => "Τεκμηρίωση",
+"Managing Big Files" => "Διαχείριση μεγάλων αρχείων",
 "Ask a question" => "Ρωτήστε μια ερώτηση",
 "Problems connecting to help database." => "Προβλήματα κατά τη σύνδεση με τη βάση δεδομένων βοήθειας.",
 "Go there manually." => "Χειροκίνητη μετάβαση.",
 "Answer" => "Απάντηση",
 "You use" => "Χρησιμοποιείτε",
 "of the available" => "από τα διαθέσιμα",
+"Desktop and Mobile Syncing Clients" => "Πελάτες συγχρονισμού για Desktop και Mobile",
+"Download" => "Κατέβασε",
 "Your password got changed" => "Ο κωδικός πρόσβασής σας άλλαξε",
 "Unable to change your password" => "Δεν ήταν δυνατή η αλλαγή του κωδικού πρόσβασης",
 "Current password" => "Τρέχων κωδικός πρόσβασης",
@@ -21,7 +28,7 @@
 "Change password" => "Αλλαγή κωδικού πρόσβασης",
 "Email" => "Email",
 "Your email address" => "Διεύθυνση ηλεκτρονικού ταχυδρομείου σας",
-"Fill in an email address to enable password recovery" => "Συμπληρώστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου για να ενεργοποιηθεί ή ανάκτηση κωδικού πρόσβασης",
+"Fill in an email address to enable password recovery" => "Συμπληρώστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου για να ενεργοποιηθεί η ανάκτηση κωδικού πρόσβασης",
 "Language" => "Γλώσσα",
 "Help translate" => "Βοηθήστε στην μετάφραση",
 "use this address to connect to your ownCloud in your file manager" => "χρησιμοποιήστε αυτή τη διεύθυνση για να συνδεθείτε στο ownCloud σας από το διαχειριστή αρχείων σας",
@@ -29,6 +36,8 @@
 "Password" => "Κωδικός",
 "Groups" => "Ομάδες",
 "Create" => "Δημιουργία",
+"Default Quota" => "Προεπιλεγμένο όριο",
+"Other" => "Άλλα",
 "Quota" => "Σύνολο χώρου",
 "Delete" => "Διαγραφή"
 );
diff --git a/settings/l10n/eo.php b/settings/l10n/eo.php
index fd3647324fd1a4c8c52138d189789c94de1ebe90..15010b47c9a29746aef474fe1686dd1f0b665db0 100644
--- a/settings/l10n/eo.php
+++ b/settings/l10n/eo.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "La agordo de OpenID estas ŝanĝita",
 "Language changed" => "La lingvo estas ŝanĝita",
 "__language_name__" => "Esperanto",
+"Log" => "Registro",
+"More" => "Pli",
+"Add your App" => "Aldonu vian aplikaĵon",
 "Select an App" => "Elekti aplikaĵon",
 "-licensed" => "-permesila",
 "by" => "de",
+"Documentation" => "Dokumentaro",
+"Managing Big Files" => "Administrante grandajn dosierojn",
 "Ask a question" => "Faru demandon",
 "Problems connecting to help database." => "Problemoj okazis dum konektado al la helpa datumbazo.",
 "Go there manually." => "Iri tien mane.",
 "Answer" => "Respondi",
 "You use" => "Vi uzas",
 "of the available" => "el la disponeblaj",
+"Desktop and Mobile Syncing Clients" => "Labortablaj kaj porteblaj sinkronigoklientoj",
+"Download" => "Elŝuti",
 "Your password got changed" => "Via pasvorto ŝanĝiĝis",
 "Unable to change your password" => "Ne eblis ŝanĝi vian pasvorton",
 "Current password" => "Nuna pasvorto",
@@ -29,6 +36,8 @@
 "Password" => "Pasvorto",
 "Groups" => "Grupoj",
 "Create" => "Krei",
+"Default Quota" => "Defaŭlta kvoto",
+"Other" => "Alia",
 "Quota" => "Kvoto",
 "Delete" => "Forigi"
 );
diff --git a/settings/l10n/es.php b/settings/l10n/es.php
index dd2f45075d0f1e8b863316ba13ee9827268abe61..adc1b5ff963121b4099b817d829874b2c3b61e21 100644
--- a/settings/l10n/es.php
+++ b/settings/l10n/es.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID cambiado",
 "Language changed" => "Idioma cambiado",
 "__language_name__" => "Castellano",
+"Log" => "Registro",
+"More" => "Más",
+"Add your App" => "Añade tu aplicación",
 "Select an App" => "Seleccionar una aplicación",
 "-licensed" => "-autorizado",
 "by" => "por",
+"Documentation" => "Documentación",
+"Managing Big Files" => "Administra archivos grandes",
 "Ask a question" => "Hacer una pregunta",
 "Problems connecting to help database." => "Problemas al conectar con la base de datos de ayuda.",
 "Go there manually." => "Ir manualmente",
 "Answer" => "Respuesta",
 "You use" => "Estás utilizando",
 "of the available" => "del total disponible de",
+"Desktop and Mobile Syncing Clients" => "Clientes de sincronización móviles y de escritorio",
+"Download" => "Descargar",
 "Your password got changed" => "Tu contraseña ha sido cambiada",
 "Unable to change your password" => "No se ha podido cambiar tu contraseña",
 "Current password" => "Contraseña actual",
@@ -24,11 +31,13 @@
 "Fill in an email address to enable password recovery" => "Escribe una dirección de correo electrónico para restablecer la contraseña",
 "Language" => "Idioma",
 "Help translate" => "Ayúdanos a traducir",
-"use this address to connect to your ownCloud in your file manager" => "utiliza esta dirección para conectar a tu ownCloud desde tu explorador de archivos",
+"use this address to connect to your ownCloud in your file manager" => "utiliza esta dirección para conectar a tu ownCloud desde tu gestor de archivos",
 "Name" => "Nombre",
 "Password" => "Contraseña",
 "Groups" => "Grupos",
 "Create" => "Crear",
+"Default Quota" => "Cuota predeterminada",
+"Other" => "Otro",
 "Quota" => "Cuota",
 "Delete" => "Eliminar"
 );
diff --git a/settings/l10n/et_EE.php b/settings/l10n/et_EE.php
index f72ff821477b7344440be3ed426fb2cacd62fc80..905f02fcb75b27b4f723ec0ca33b2823509fab3f 100644
--- a/settings/l10n/et_EE.php
+++ b/settings/l10n/et_EE.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID on muudetud",
 "Language changed" => "Keel on muudetud",
 "__language_name__" => "Eesti",
+"Log" => "Logi",
+"More" => "Veel",
+"Add your App" => "Lisa oma rakendus",
 "Select an App" => "Vali programm",
 "-licensed" => "-litsenseeritud",
 "by" => "kelle poolt",
+"Documentation" => "Dokumentatsioon",
+"Managing Big Files" => "Suurte failide haldamine",
 "Ask a question" => "Küsi küsimus",
 "Problems connecting to help database." => "Probleemid abiinfo andmebaasiga ühendumisel.",
 "Go there manually." => "Mine sinna käsitsi.",
 "Answer" => "Vasta",
 "You use" => "Sa kasutad",
 "of the available" => "saadaolevast",
+"Desktop and Mobile Syncing Clients" => "Töölaua ja mobiiliga sünkroniseerimise rakendused",
+"Download" => "Lae alla",
 "Your password got changed" => "Sinu parooli on muudetud",
 "Unable to change your password" => "Sa ei saa oma parooli muuta",
 "Current password" => "Praegune parool",
@@ -29,6 +36,8 @@
 "Password" => "Parool",
 "Groups" => "Grupid",
 "Create" => "Lisa",
+"Default Quota" => "Vaikimisi kvoot",
+"Other" => "Muu",
 "Quota" => "Mahupiir",
 "Delete" => "Kustuta"
 );
diff --git a/settings/l10n/eu.php b/settings/l10n/eu.php
index c62fdde6e0195213d69779d6fa8e54883f1252a1..015746c61c152e86299623438bd0437c465f615d 100644
--- a/settings/l10n/eu.php
+++ b/settings/l10n/eu.php
@@ -4,15 +4,21 @@
 "OpenID Changed" => "OpenID aldatuta",
 "Language changed" => "Hizkuntza aldatuta",
 "__language_name__" => "Euskera",
+"More" => "Gehiago",
+"Add your App" => "Gehitu zure aplikazioa",
 "Select an App" => "Aukeratu programa bat",
 "-licensed" => "lizentziarekin",
 "by" => " Egilea:",
+"Documentation" => "Dokumentazioa",
+"Managing Big Files" => "Fitxategi handien kudeaketa",
 "Ask a question" => "Egin galdera bat",
 "Problems connecting to help database." => "Arazoak daude laguntza datubasera konektatzeko.",
 "Go there manually." => "Joan hara eskuz.",
 "Answer" => "Erantzun",
 "You use" => "Erabiltzen ari zara ",
 "of the available" => "eta guztira erabil dezakezu ",
+"Desktop and Mobile Syncing Clients" => "Mahaigain eta mugikorren sinkronizazio bezeroak",
+"Download" => "Deskargatu",
 "Your password got changed" => "Zure pasahitza aldatu da",
 "Unable to change your password" => "Ezin izan da zure pasahitza aldatu",
 "Current password" => "Uneko pasahitza",
@@ -29,6 +35,7 @@
 "Password" => "Pasahitza",
 "Groups" => "Taldeak",
 "Create" => "Sortu",
+"Other" => "Besteak",
 "Quota" => "Kuota",
 "Delete" => "Ezabatu"
 );
diff --git a/settings/l10n/fa.php b/settings/l10n/fa.php
new file mode 100644
index 0000000000000000000000000000000000000000..745a6332a172fd53f812f4f2db55d01eddac86f6
--- /dev/null
+++ b/settings/l10n/fa.php
@@ -0,0 +1,43 @@
+<?php $TRANSLATIONS = array(
+"email Changed" => "پست الکترونیکی تغییر کرد",
+"Invalid request" => "درخواست غیر قابل قبول",
+"OpenID Changed" => "OpenID تغییر کرد",
+"Language changed" => "زبان تغییر کرد",
+"__language_name__" => "__language_name__",
+"Log" => "کارنامه",
+"More" => "بیشتر",
+"Add your App" => "برنامه خود را بیافزایید",
+"Select an App" => "یک برنامه انتخاب کنید",
+"-licensed" => "مجوزنامه",
+"by" => "به وسیله",
+"Documentation" => "مستندات",
+"Managing Big Files" => "مدیریت پرونده های بزرگ",
+"Ask a question" => "یک سوال بپرسید",
+"Problems connecting to help database." => "مشکلاتی برای وصل شدن به پایگاه داده کمکی",
+"Go there manually." => "بروید آنجا به صورت دستی",
+"Answer" => "پاسخ",
+"You use" => "شما استفاده می کنید",
+"of the available" => "از فعال ها",
+"Desktop and Mobile Syncing Clients" => " ابزار مدیریت با دسکتاپ و موبایل",
+"Download" => "بارگیری",
+"Your password got changed" => "گذرواژه شما تغییر یافته",
+"Unable to change your password" => "ناتوان در تغییر گذرواژه",
+"Current password" => "گذرواژه کنونی",
+"New password" => "گذرواژه جدید",
+"show" => "نمایش",
+"Change password" => "تغییر گذر واژه",
+"Email" => "پست الکترونیکی",
+"Your email address" => "پست الکترونیکی شما",
+"Fill in an email address to enable password recovery" => "پست الکترونیکی را پرکنید  تا بازیابی گذرواژه فعال شود",
+"Language" => "زبان",
+"Help translate" => "به ترجمه آن کمک کنید",
+"use this address to connect to your ownCloud in your file manager" => "از این نشانی برای وصل شدن به ابرهایتان در مدیرپرونده استفاده کنید",
+"Name" => "نام",
+"Password" => "گذرواژه",
+"Groups" => "گروه ها",
+"Create" => "ایجاد کردن",
+"Default Quota" => "سهم پیش فرض",
+"Other" => "سایر",
+"Quota" => "سهم",
+"Delete" => "پاک کردن"
+);
diff --git a/settings/l10n/fr.php b/settings/l10n/fr.php
index cbafbc40d7bc222e9fab2463dca19563544dbe8e..33e035b89ff93e0f24830469cdba6462329ba74c 100644
--- a/settings/l10n/fr.php
+++ b/settings/l10n/fr.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "Identifiant OpenID changé",
 "Language changed" => "Langue changée",
 "__language_name__" => "Français",
+"Log" => "Journaux",
+"More" => "Plus",
+"Add your App" => "Ajouter votre application",
 "Select an App" => "Sélectionner une Application",
 "-licensed" => "sous licence",
 "by" => "par",
+"Documentation" => "Documentation",
+"Managing Big Files" => "Gérer les gros fichiers",
 "Ask a question" => "Poser une question",
 "Problems connecting to help database." => "Problème de connexion à la base de données d'aide.",
 "Go there manually." => "S'y rendre manuellement.",
 "Answer" => "Réponse",
 "You use" => "Vous utilisez",
 "of the available" => "d'espace de stockage sur un total de",
+"Desktop and Mobile Syncing Clients" => "Clients de synchronisation Mobile et Ordinateur",
+"Download" => "Télécharger",
 "Your password got changed" => "Votre mot de passe a été changé",
 "Unable to change your password" => "Impossible de changer votre mot de passe",
 "Current password" => "Mot de passe actuel",
@@ -21,7 +28,7 @@
 "Change password" => "Changer de mot de passe",
 "Email" => "E-mail",
 "Your email address" => "Votre adresse e-mail",
-"Fill in an email address to enable password recovery" => "Entrez votre adresse e-mail pour activer la réinitialisation de mot de passe",
+"Fill in an email address to enable password recovery" => "Entrez votre adresse e-mail pour permettre la réinitialisation du mot de passe",
 "Language" => "Langue",
 "Help translate" => "Aidez à traduire",
 "use this address to connect to your ownCloud in your file manager" => "utilisez cette adresse pour vous connecter à votre ownCloud depuis un explorateur de fichiers",
@@ -29,6 +36,8 @@
 "Password" => "Mot de passe",
 "Groups" => "Groupes",
 "Create" => "Créer",
+"Default Quota" => "Quota par défaut",
+"Other" => "Autre",
 "Quota" => "Quota",
 "Delete" => "Supprimer"
 );
diff --git a/settings/l10n/hu_HU.php b/settings/l10n/hu_HU.php
index a74571d5738f97ad22c4587256247d1d864dcba7..704ccf7b5852a87ad93901ca01c316a97ce2e927 100644
--- a/settings/l10n/hu_HU.php
+++ b/settings/l10n/hu_HU.php
@@ -1,24 +1,43 @@
 <?php $TRANSLATIONS = array(
+"email Changed" => "Email megváltozott",
 "Invalid request" => "Érvénytelen kérés",
 "OpenID Changed" => "OpenID megváltozott",
 "Language changed" => "A nyelv megváltozott",
+"__language_name__" => "__language_name__",
+"Log" => "Napló",
+"More" => "Tovább",
+"Add your App" => "App hozzáadása",
 "Select an App" => "Egy App kiválasztása",
-"-licensed" => "-licenszelt",
+"-licensed" => "-licencelt",
+"by" => ":",
+"Documentation" => "Dokumentáció",
+"Managing Big Files" => "Nagy fájlok kezelése",
 "Ask a question" => "Tégy fel egy kérdést",
+"Problems connecting to help database." => "Sikertelen csatlakozás a Súgó adatbázishoz",
 "Go there manually." => "Menj oda kézzel",
 "Answer" => "Válasz",
-"of the available" => "a rendelkezésre álló",
-"Your password got changed" => "A jelszó megváltozott",
+"You use" => "Használatban: ",
+"of the available" => ", rendelkezésre áll: ",
+"Desktop and Mobile Syncing Clients" => "Asztali- és mobilkliensek kezelése",
+"Download" => "Letöltés",
+"Your password got changed" => "A jelszavad megváltozott",
 "Unable to change your password" => "Nem lehet megváltoztatni a jelszavad",
 "Current password" => "Jelenlegi jelszó",
 "New password" => "Új jelszó",
-"show" => "Mutatás",
+"show" => "Mutat",
 "Change password" => "Jelszó megváltoztatása",
+"Email" => "Email",
+"Your email address" => "Email címed",
+"Fill in an email address to enable password recovery" => "Töltsd ki az email címet, hogy engedélyezhesd a jelszó-visszaállítást",
 "Language" => "Nyelv",
+"Help translate" => "Segíts lefordítani!",
 "use this address to connect to your ownCloud in your file manager" => "Használd ezt a címet hogy csatlakozz a saját ownCloud rendszeredhez a fájlkezelődben",
 "Name" => "Név",
 "Password" => "Jelszó",
 "Groups" => "Csoportok",
 "Create" => "Létrehozás",
+"Default Quota" => "Alapértelmezett kvóta",
+"Other" => "Egyéb",
+"Quota" => "Kvóta",
 "Delete" => "Törlés"
 );
diff --git a/settings/l10n/ia.php b/settings/l10n/ia.php
index b6c0fb03ccab8771f73d7946559f98e21c2e99ad..ad1360f176fbe8fc5f21bfcd9208a4a067164045 100644
--- a/settings/l10n/ia.php
+++ b/settings/l10n/ia.php
@@ -1,13 +1,19 @@
 <?php $TRANSLATIONS = array(
+"Invalid request" => "Requesta invalide",
 "OpenID Changed" => "OpenID cambiate",
 "Language changed" => "Linguage cambiate",
 "__language_name__" => "Interlingua",
+"Log" => "Registro",
+"More" => "Plus",
+"Add your App" => "Adder tu application",
 "Select an App" => "Selectionar un app",
 "by" => "per",
+"Documentation" => "Documentation",
 "Ask a question" => "Facer un question",
 "Answer" => "Responsa",
 "You use" => "Tu usa",
 "of the available" => "del disponibile",
+"Download" => "Discargar",
 "Your password got changed" => "Tu contrasigno esseva cambiate",
 "Unable to change your password" => "Non pote cambiar tu contrasigno",
 "Current password" => "Contrasigno currente",
@@ -23,5 +29,8 @@
 "Password" => "Contrasigno",
 "Groups" => "Gruppos",
 "Create" => "Crear",
+"Default Quota" => "Quota predeterminate",
+"Other" => "Altere",
+"Quota" => "Quota",
 "Delete" => "Deler"
 );
diff --git a/settings/l10n/it.php b/settings/l10n/it.php
index a690255ddec19c6ae815d0ce3b24cf8269b3caa6..6d746e76d7de5395598c0c90009a6a86d8f3022c 100644
--- a/settings/l10n/it.php
+++ b/settings/l10n/it.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID modificato",
 "Language changed" => "Lingua modificata",
 "__language_name__" => "Italiano",
+"Log" => "Registro",
+"More" => "Altro",
+"Add your App" => "Aggiungi la tua applicazione",
 "Select an App" => "Seleziona un'applicazione",
 "-licensed" => "-rilasciato",
 "by" => "da",
+"Documentation" => "Documentazione",
+"Managing Big Files" => "Gestione file grandi",
 "Ask a question" => "Fai una domanda",
 "Problems connecting to help database." => "Problemi di connessione al database di supporto.",
 "Go there manually." => "Raggiungilo manualmente.",
 "Answer" => "Risposta",
 "You use" => "Stai utilizzando",
 "of the available" => "su un totale di",
+"Desktop and Mobile Syncing Clients" => "Client di sincronizzazione desktop e mobile",
+"Download" => "Scaricamento",
 "Your password got changed" => "La tua password è stata cambiata",
 "Unable to change your password" => "Modifica password non riuscita",
 "Current password" => "Password attuale",
@@ -29,6 +36,8 @@
 "Password" => "Password",
 "Groups" => "Gruppi",
 "Create" => "Crea",
+"Default Quota" => "Quota predefinita",
+"Other" => "Altro",
 "Quota" => "Quote",
 "Delete" => "Elimina"
 );
diff --git a/settings/l10n/ko.php b/settings/l10n/ko.php
index 7f51dcf0f2947e581963284909e0de521deda25c..cd17cba4eef61e9996f5d9c85a222d5121cfe165 100644
--- a/settings/l10n/ko.php
+++ b/settings/l10n/ko.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID 변경됨",
 "Language changed" => "언어가 변경되었습니다",
 "__language_name__" => "한국어",
+"Log" => "로그",
+"More" => "더",
+"Add your App" => "앱 추가",
 "Select an App" => "프로그램 선택",
 "-licensed" => " 라이선스 사용",
 "by" => " by ",
+"Documentation" => "문서",
+"Managing Big Files" => "큰 파일 관리",
 "Ask a question" => "질문하기",
 "Problems connecting to help database." => "데이터베이스에 연결하는 데 문제가 발생하였습니다.",
 "Go there manually." => "직접 갈 수 있습니다.",
 "Answer" => "대답",
 "You use" => "현재 사용 중:",
 "of the available" => "사용 가능:",
+"Desktop and Mobile Syncing Clients" => "데스크탑 및 모바일 동기화 클라이언트",
+"Download" => "다운로드",
 "Your password got changed" => "암호가 변경되었습니다",
 "Unable to change your password" => "암호를 변경할 수 없음",
 "Current password" => "현재 암호",
@@ -29,6 +36,8 @@
 "Password" => "암호",
 "Groups" => "그룹",
 "Create" => "만들기",
+"Default Quota" => "기본 할당량",
+"Other" => "다른",
 "Quota" => "할당량",
 "Delete" => "삭제"
 );
diff --git a/settings/l10n/mk.php b/settings/l10n/mk.php
index 9a6bac14cb71bb6357946c7c83589dcdcf10a5b2..bf24e9e44b93cd65016af39406eadd23372435bf 100644
--- a/settings/l10n/mk.php
+++ b/settings/l10n/mk.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID сменето",
 "Language changed" => "Јазикот е сменет",
 "__language_name__" => "__language_name__",
+"Log" => "Записник",
+"More" => "Повеќе",
+"Add your App" => "Додадете ја Вашата апликација",
 "Select an App" => "Избери аппликација",
 "-licensed" => "-licensed",
 "by" => "од",
+"Documentation" => "Документација",
+"Managing Big Files" => "Управување со големи датотеки",
 "Ask a question" => "Постави прашање",
 "Problems connecting to help database." => "Проблем при поврзување со базата за помош",
 "Go there manually." => "Оди таму рачно.",
 "Answer" => "Одговор",
 "You use" => "Вие користите",
 "of the available" => "од достапните",
+"Desktop and Mobile Syncing Clients" => "Десктоп и мобилник клиенти за синхронизирање",
+"Download" => "Преземање",
 "Your password got changed" => "Вашата лозинка беше сменета",
 "Unable to change your password" => "Вашата лозинка неможе да се смени",
 "Current password" => "Моментална лозинка",
@@ -29,6 +36,8 @@
 "Password" => "Лозинка",
 "Groups" => "Групи",
 "Create" => "Создај",
+"Default Quota" => "Предефинирана квота",
+"Other" => "Останато",
 "Quota" => "Квота",
 "Delete" => "Избриши"
 );
diff --git a/settings/l10n/nb_NO.php b/settings/l10n/nb_NO.php
index 5628f61b4133aa4b24d079c7784251896cb2c890..8a633ef431cdc91cde8c3ec24163e8bbbaac2887 100644
--- a/settings/l10n/nb_NO.php
+++ b/settings/l10n/nb_NO.php
@@ -4,15 +4,20 @@
 "OpenID Changed" => "OpenID endret",
 "Language changed" => "Språk endret",
 "__language_name__" => "__language_name__",
+"Log" => "Logg",
+"More" => "Mer",
+"Add your App" => "Legg til din App",
 "Select an App" => "Velg en app",
 "-licensed" => "-lisensiert",
 "by" => "av",
+"Documentation" => "Dokumentasjon",
 "Ask a question" => "Still et spørsmål",
 "Problems connecting to help database." => "Problemer med å koble til hjelp-databasen",
 "Go there manually." => "Gå dit manuelt",
 "Answer" => "Svar",
 "You use" => "Du bruker",
 "of the available" => "av den tilgjengelige",
+"Download" => "Last ned",
 "Your password got changed" => "Passordet ditt ble endret",
 "Unable to change your password" => "Kunne ikke endre passordet ditt",
 "Current password" => "Nåværende passord",
@@ -29,6 +34,7 @@
 "Password" => "Passord",
 "Groups" => "Grupper",
 "Create" => "Opprett",
+"Default Quota" => "Standard Kvote",
 "Quota" => "Kvote",
 "Delete" => "Slett"
 );
diff --git a/settings/l10n/nl.php b/settings/l10n/nl.php
index 987bc9330a4849562781f85bf8798adc385faec3..cca0067a2d719abdd63310741c3156a9e2c7cbfb 100644
--- a/settings/l10n/nl.php
+++ b/settings/l10n/nl.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID is aangepast",
 "Language changed" => "Taal aangepast",
 "__language_name__" => "Nederlands",
+"Log" => "Log",
+"More" => "Meer",
+"Add your App" => "Voeg je App toe",
 "Select an App" => "Selecteer een app",
 "-licensed" => "-gelicentieerd",
 "by" => "door",
+"Documentation" => "Documentatie",
+"Managing Big Files" => "Onderhoud van grote bestanden",
 "Ask a question" => "Stel een vraag",
 "Problems connecting to help database." => "Problemen bij het verbinden met de helpdatabank.",
 "Go there manually." => "Ga er zelf heen.",
 "Answer" => "Beantwoord",
 "You use" => "U gebruikt",
 "of the available" => "van de beschikbare",
+"Desktop and Mobile Syncing Clients" => "Desktop en mobiele synchronisatie apparaten",
+"Download" => "Download",
 "Your password got changed" => "Uw wachtwoord is aangepast",
 "Unable to change your password" => "Niet in staat om uw wachtwoord te wijzigen",
 "Current password" => "Huidig wachtwoord",
@@ -29,6 +36,8 @@
 "Password" => "Wachtwoord",
 "Groups" => "Groepen",
 "Create" => "Creëer",
+"Default Quota" => "Standaard limiet",
+"Other" => "Andere",
 "Quota" => "Limieten",
 "Delete" => "verwijderen"
 );
diff --git a/settings/l10n/pt_BR.php b/settings/l10n/pt_BR.php
index 20404aacfc6ef37c191f3aab8c3cb104d5282f9e..51b99382a4872924f579ac65e2aaf2316ffb437e 100644
--- a/settings/l10n/pt_BR.php
+++ b/settings/l10n/pt_BR.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "Mudou OpenID",
 "Language changed" => "Mudou Idioma",
 "__language_name__" => "Português",
+"Log" => "Log",
+"More" => "Mais",
+"Add your App" => "Adicione seu Aplicativo",
 "Select an App" => "Selecione uma Aplicação",
 "-licensed" => "-licenciados",
 "by" => "por",
+"Documentation" => "Documentação",
+"Managing Big Files" => "Gerênciando Arquivos Grandes",
 "Ask a question" => "Faça uma pergunta",
 "Problems connecting to help database." => "Problemas ao conectar na base de dados.",
 "Go there manually." => "Ir manualmente.",
 "Answer" => "Resposta",
 "You use" => "Você usa",
 "of the available" => "do disponível",
+"Desktop and Mobile Syncing Clients" => "Sincronizando Desktop e Mobile",
+"Download" => "Download",
 "Your password got changed" => "Sua senha foi modificada",
 "Unable to change your password" => "Não é possivel alterar a sua senha",
 "Current password" => "Senha atual",
@@ -29,6 +36,8 @@
 "Password" => "Senha",
 "Groups" => "Grupos",
 "Create" => "Criar",
+"Default Quota" => "Quota Padrão",
+"Other" => "Outro",
 "Quota" => "Cota",
 "Delete" => "Apagar"
 );
diff --git a/settings/l10n/sk_SK.php b/settings/l10n/sk_SK.php
index c7869c6096cbaf87b1931995702d9a89e4c12a55..e465a149cf31c172d6515b461b303d31afc711f9 100644
--- a/settings/l10n/sk_SK.php
+++ b/settings/l10n/sk_SK.php
@@ -1,18 +1,25 @@
 <?php $TRANSLATIONS = array(
-"email Changed" => "email Zmenený",
+"email Changed" => "email zmenený",
 "Invalid request" => "Neplatná požiadavka",
 "OpenID Changed" => "OpenID zmenené",
 "Language changed" => "Jazyk zmenený",
 "__language_name__" => "Slovensky",
-"Select an App" => "Vyberte Aplikáciu",
+"Log" => "Záznam",
+"More" => "Viac",
+"Add your App" => "Pridať vašu aplikáciu",
+"Select an App" => "Vyberte aplikáciu",
 "-licensed" => "-licencované",
 "by" => "od",
+"Documentation" => "Dokumentácia",
+"Managing Big Files" => "Spravovanie veľké súbory",
 "Ask a question" => "Opýtajte sa otázku",
 "Problems connecting to help database." => "Problémy spojené s pomocnou databázou.",
 "Go there manually." => "Prejsť tam ručne.",
 "Answer" => "Odpoveď",
 "You use" => "Používate",
 "of the available" => "z dostupných",
+"Desktop and Mobile Syncing Clients" => "Klienti pre synchronizáciu",
+"Download" => "Stiahnúť",
 "Your password got changed" => "Vaše heslo sa zmenilo",
 "Unable to change your password" => "Nedokážem zmeniť vaše heslo",
 "Current password" => "Aktuálne heslo",
@@ -29,6 +36,8 @@
 "Password" => "Heslo",
 "Groups" => "Skupiny",
 "Create" => "Vytvoriť",
+"Default Quota" => "Predvolená kvóta",
+"Other" => "Iné",
 "Quota" => "Kvóta",
 "Delete" => "Odstrániť"
 );
diff --git a/settings/l10n/sl.php b/settings/l10n/sl.php
index 44ce1e77f980d459199cac4ac6a8fdd8472e48e8..b83a3f343e9a7824dcff0a5d918bbca4471e5d9b 100644
--- a/settings/l10n/sl.php
+++ b/settings/l10n/sl.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID je bil spremenjen",
 "Language changed" => "Jezik je bil spremenjen",
 "__language_name__" => "__ime_jezika__",
+"Log" => "Dnevnik",
+"More" => "Več",
+"Add your App" => "Dodajte vašo aplikacijo",
 "Select an App" => "Izberite aplikacijo",
 "-licensed" => "-licencirana",
 "by" => "s strani",
+"Documentation" => "Dokumentacija",
+"Managing Big Files" => "Upravljanje velikih datotek",
 "Ask a question" => "Postavi vprašanje",
 "Problems connecting to help database." => "Težave pri povezovanju s podatkovno zbirko pomoči.",
 "Go there manually." => "Pojdi tja ročno.",
 "Answer" => "Odgovor",
 "You use" => "Uporabljate",
 "of the available" => "od razpoložljivih",
+"Desktop and Mobile Syncing Clients" => "Namizni in mobilni odjemalci za sinhronizacijo",
+"Download" => "Prenesi",
 "Your password got changed" => "Vaše geslo je bilo spremenjeno",
 "Unable to change your password" => "Vašega gesla ni bilo mogoče spremeniti.",
 "Current password" => "Trenutno geslo",
@@ -29,6 +36,8 @@
 "Password" => "Geslo",
 "Groups" => "Skupine",
 "Create" => "Ustvari",
+"Default Quota" => "Privzeta količinska omejitev",
+"Other" => "Drugo",
 "Quota" => "Količinska omejitev",
 "Delete" => "Izbriši"
 );
diff --git a/settings/l10n/th_TH.php b/settings/l10n/th_TH.php
index 3a9b35bf12f6faffe5878ab8d260f774af450960..47c20bd911e9bdc0c1c9e908836fe682a882b82f 100644
--- a/settings/l10n/th_TH.php
+++ b/settings/l10n/th_TH.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "เปลี่ยนชื่อบัญชี OpenID แล้ว",
 "Language changed" => "เปลี่ยนภาษาเรียบร้อยแล้ว",
 "__language_name__" => "ภาษาไทย",
+"Log" => "บันทึกการเปลี่ยนแปลง",
+"More" => "เพิ่มเติม",
+"Add your App" => "เพิ่มแอปของคุณ",
 "Select an App" => "เลือก App",
 "-licensed" => "-ได้รับอนุญาติแล้ว",
 "by" => "โดย",
+"Documentation" => "เอกสารคู่มือการใช้งาน",
+"Managing Big Files" => "การจัดการไฟล์ขนาดใหญ่",
 "Ask a question" => "สอบถามข้อมูล",
 "Problems connecting to help database." => "เกิดปัญหาในการเชื่อมต่อกับฐานข้อมูลช่วยเหลือ",
 "Go there manually." => "ไปที่นั่นด้วยตนเอง",
 "Answer" => "คำตอบ",
 "You use" => "คุณใช้พื้นที่ไป",
 "of the available" => "จากจำนวนที่ใช้ได้",
+"Desktop and Mobile Syncing Clients" => "โปรแกรมเชื่อมข้อมูลไฟล์สำหรับเครื่องเดสก์ท็อปและมือถือ",
+"Download" => "ดาวน์โหลด",
 "Your password got changed" => "เปลี่ยนรหัสผ่านเรียบร้อยแล้ว",
 "Unable to change your password" => "ไม่สามารถเปลี่ยนรหัสผ่านของคุณได้",
 "Current password" => "รหัสผ่านปัจจุบัน",
@@ -29,6 +36,8 @@
 "Password" => "รหัสผ่าน",
 "Groups" => "กลุ่ม",
 "Create" => "สร้าง",
+"Default Quota" => "โควต้าที่กำหนดไว้เริ่มต้น",
+"Other" => "อื่นๆ",
 "Quota" => "พื้นที่",
 "Delete" => "ลบ"
 );
diff --git a/settings/l10n/tr.php b/settings/l10n/tr.php
index df5c023e497d9afde54d5d6717d69b696bd0994f..8c065575e9b05b6bc51628c5297eb814a7e24901 100644
--- a/settings/l10n/tr.php
+++ b/settings/l10n/tr.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID Değiştirildi",
 "Language changed" => "Dil değiştirildi",
 "__language_name__" => "__dil_adı__",
+"Log" => "Günlük",
+"More" => "Devamı",
+"Add your App" => "Uygulamanı Ekle",
 "Select an App" => "Bir uygulama seçin",
 "-licensed" => "-lisanslı",
 "by" => "yapan",
+"Documentation" => "Dökümantasyon",
+"Managing Big Files" => "Büyük Dosyaların Yönetimi",
 "Ask a question" => "Bir soru sorun",
 "Problems connecting to help database." => "Yardım veritabanına bağlanmada sorunlar var.",
 "Go there manually." => "Oraya elle gidin.",
 "Answer" => "Cevap",
 "You use" => "Kullanıyorsunuz",
 "of the available" => "mevcut olandan",
+"Desktop and Mobile Syncing Clients" => "Masaüstü ve Mobil Senkron İstemcileri",
+"Download" => "İndir",
 "Your password got changed" => "Parolanız değiştirildi",
 "Unable to change your password" => "Parolanız değiştirilemiyor",
 "Current password" => "Mevcut parola",
@@ -29,6 +36,8 @@
 "Password" => "Parola",
 "Groups" => "Gruplar",
 "Create" => "Oluştur",
+"Default Quota" => "Varsayılan Kota",
+"Other" => "Diğer",
 "Quota" => "Kota",
 "Delete" => "Sil"
 );
diff --git a/settings/l10n/zh_TW.php b/settings/l10n/zh_TW.php
index d62eb84eb91aa01323a17fc97452c084e0695b54..2132bef03ed4ec41585ad8a792262362fd69cfb9 100644
--- a/settings/l10n/zh_TW.php
+++ b/settings/l10n/zh_TW.php
@@ -4,15 +4,22 @@
 "OpenID Changed" => "OpenID 已變更",
 "Language changed" => "語言已變更",
 "__language_name__" => "__語言_名稱__",
+"Log" => "紀錄",
+"More" => "更多",
+"Add your App" => "添加你的 App",
 "Select an App" => "選擇一個應用程式",
 "-licensed" => "-已許可",
 "by" => "由",
+"Documentation" => "文件",
+"Managing Big Files" => "管理大檔案",
 "Ask a question" => "提問",
 "Problems connecting to help database." => "連接到求助資料庫發生問題",
 "Go there manually." => "手動前往",
 "Answer" => "答案",
 "You use" => "你使用",
 "of the available" => "可用",
+"Desktop and Mobile Syncing Clients" => "桌機與手機同步客戶端",
+"Download" => "下載",
 "Your password got changed" => "你的密碼已變更",
 "Unable to change your password" => "無法變更你的密碼",
 "Current password" => "目前密碼",
@@ -29,6 +36,8 @@
 "Password" => "密碼",
 "Groups" => "群組",
 "Create" => "創造",
+"Default Quota" => "預設容量限制",
+"Other" => "其他",
 "Quota" => "容量限制",
 "Delete" => "刪除"
 );
diff --git a/tests/lib/archive.php b/tests/lib/archive.php
old mode 100755
new mode 100644
diff --git a/tests/lib/archive/tar.php b/tests/lib/archive/tar.php
old mode 100755
new mode 100644
diff --git a/tests/lib/archive/zip.php b/tests/lib/archive/zip.php
old mode 100755
new mode 100644