diff --git a/core/composer.json b/core/composer.json
index ac90480..4a109a2 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -2,6 +2,11 @@
   "name": "drupal/drupal",
   "description": "Drupal is an open source content management platform powering millions of websites and applications.",
   "license": "GPL-2.0+",
+  "repositories": [{
+    "type": "vcs",
+    "url": "https://github.com/msonnabaum/phpunit.git"
+  }
+  ],
   "require": {
     "symfony/class-loader": "2.2.0-BETA2",
     "symfony/dependency-injection": "2.2.0-BETA2",
@@ -17,7 +22,8 @@
     "guzzle/http": "3.1.0",
     "kriswallsmith/assetic": "1.1.0-alpha1",
     "symfony-cmf/routing": "dev-master#ea4a10",
-    "easyrdf/easyrdf": "0.8.0-beta.1"
+    "easyrdf/easyrdf": "0.8.0-beta.1",
+    "phpunit/phpunit": "3.7 as dev-3.7"
   },
   "minimum-stability": "dev"
 }
diff --git a/core/composer.lock b/core/composer.lock
index 6709d12..6327fd7 100644
--- a/core/composer.lock
+++ b/core/composer.lock
@@ -1,5 +1,5 @@
 {
-    "hash": "ab5b183002f04155958ac5b57ed29032",
+    "hash": "a8c56a3549ec70f775e4bf795e65a993",
     "packages": [
         {
             "name": "doctrine/common",
@@ -379,6 +379,361 @@
             ]
         },
         {
+            "name": "phpunit/php-code-coverage",
+            "version": "1.2.x-dev",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "6b99bb605f9fb946161239a4f26f3c186cd261fd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6b99bb605f9fb946161239a4f26f3c186cd261fd",
+                "reference": "6b99bb605f9fb946161239a4f26f3c186cd261fd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-file-iterator": ">=1.3.0@stable",
+                "phpunit/php-token-stream": ">=1.1.3@stable",
+                "phpunit/php-text-template": ">=1.1.1@stable"
+            },
+            "suggest": {
+                "ext-dom": "*",
+                "ext-xdebug": ">=2.0.5"
+            },
+            "time": "2013-02-02 10:49:26",
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "testing",
+                "coverage",
+                "xunit"
+            ]
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "2deb24c65ea78e126daa8d45b2089ddc29ec1d26"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2deb24c65ea78e126daa8d45b2089ddc29ec1d26",
+                "reference": "2deb24c65ea78e126daa8d45b2089ddc29ec1d26",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2013-01-07 10:47:05",
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "File/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ]
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "1eeef106193d2f8c539728e566bb4793071a9e18"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/1eeef106193d2f8c539728e566bb4793071a9e18",
+                "reference": "1eeef106193d2f8c539728e566bb4793071a9e18",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2013-01-07 10:56:17",
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "Text/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ]
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.x-dev",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/sebastianbergmann/php-timer.git",
+                "reference": "ecf7920b27003a9412b07dad79dbb5ad1249e6c3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/ecf7920b27003a9412b07dad79dbb5ad1249e6c3",
+                "reference": "ecf7920b27003a9412b07dad79dbb5ad1249e6c3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "time": "2013-01-30 06:08:51",
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ]
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "c25dd88e1592e66dee2553c99ef244203d5a1b98"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c25dd88e1592e66dee2553c99ef244203d5a1b98",
+                "reference": "c25dd88e1592e66dee2553c99ef244203d5a1b98",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "time": "2013-01-07 10:56:35",
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ]
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "3.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/msonnabaum/phpunit.git",
+                "reference": "3.7.0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/msonnabaum/phpunit/zipball/3.7.0",
+                "reference": "3.7.0",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-file-iterator": ">=1.3.1@stable",
+                "phpunit/php-text-template": ">=1.1.1@stable",
+                "phpunit/php-code-coverage": ">=1.2.0@stable",
+                "phpunit/php-timer": ">=1.0.2@stable",
+                "phpunit/phpunit-mock-objects": ">=1.2.0@stable",
+                "symfony/yaml": ">=2.1.0@stable",
+                "ext-dom": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*"
+            },
+            "suggest": {
+                "phpunit/php-invoker": ">=1.1.0@stable",
+                "ext-json": "*",
+                "ext-simplexml": "*",
+                "ext-tokenizer": "*"
+            },
+            "time": "2012-09-19 05:07:48",
+            "bin": [
+                "composer/bin/phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.7.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "PHPUnit/Autoload.php"
+                ]
+            },
+            "include-path": [
+                "",
+                "../../symfony/yaml/"
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "http://www.phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "xunit",
+                "testing"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+                "irc": "irc://irc.freenode.net/phpunit",
+                "source": "https://github.com/msonnabaum/phpunit/tree/3.7.0"
+            }
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "1.2.x-dev",
+            "source": {
+                "type": "git",
+                "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "d49b5683200b5db9b1c64cb06f52f50d147891c4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/d49b5683200b5db9b1c64cb06f52f50d147891c4",
+                "reference": "d49b5683200b5db9b1c64cb06f52f50d147891c4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "phpunit/php-text-template": ">=1.1.1@stable"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "time": "2013-02-05 07:46:41",
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHPUnit/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ]
+        },
+        {
             "name": "psr/log",
             "version": "1.0.0",
             "source": {
@@ -476,7 +831,7 @@
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/ClassLoader/archive/v2.2.0-BETA2.zip",
+                "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/v2.2.0-BETA2",
                 "reference": "v2.2.0-BETA2",
                 "shasum": ""
             },
@@ -685,7 +1040,7 @@
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/HttpKernel/archive/v2.2.0-BETA2.zip",
+                "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.2.0-BETA2",
                 "reference": "v2.2.0-BETA2",
                 "shasum": ""
             },
@@ -796,7 +1151,7 @@
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/Routing/archive/v2.2.0-BETA2.zip",
+                "url": "https://api.github.com/repos/symfony/Routing/zipball/v2.2.0-BETA2",
                 "reference": "v2.2.0-BETA2",
                 "shasum": ""
             },
@@ -898,26 +1253,26 @@
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Translation",
-                "reference": "v2.2.0-BETA2"
+                "reference": "v2.2.0-RC2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Translation/zipball/v2.2.0-BETA2",
-                "reference": "v2.2.0-BETA2",
+                "url": "https://api.github.com/repos/symfony/Translation/zipball/v2.2.0-RC2",
+                "reference": "v2.2.0-RC2",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "require-dev": {
-                "symfony/config": "2.2.*",
-                "symfony/yaml": "2.2.*"
+                "symfony/config": ">=2.0,<2.3-dev",
+                "symfony/yaml": ">=2.2,<3.0"
             },
             "suggest": {
                 "symfony/config": "2.2.*",
                 "symfony/yaml": "2.2.*"
             },
-            "time": "2013-01-17 15:25:59",
+            "time": "2013-02-08 16:10:57",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -1017,7 +1372,7 @@
             },
             "dist": {
                 "type": "zip",
-                "url": "https://github.com/symfony/Yaml/archive/v2.2.0-BETA2.zip",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.2.0-BETA2",
                 "reference": "v2.2.0-BETA2",
                 "shasum": ""
             },
@@ -1105,7 +1460,12 @@
     ],
     "packages-dev": null,
     "aliases": [
-
+        {
+            "alias": "dev-3.7",
+            "alias_normalized": "dev-3.7",
+            "version": "3.7.0.0",
+            "package": "phpunit/phpunit"
+        }
     ],
     "minimum-stability": "dev",
     "stability-flags": {
diff --git a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php b/core/modules/breakpoint/tests/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
similarity index 94%
rename from core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
rename to core/modules/breakpoint/tests/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
index d0ee5fb..1e2524f 100644
--- a/core/modules/breakpoint/lib/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
+++ b/core/modules/breakpoint/tests/Drupal/breakpoint/Tests/BreakpointMediaQueryTest.php
@@ -6,14 +6,16 @@
 
 namespace Drupal\breakpoint\Tests;
 
-use Drupal\simpletest\UnitTestBase;
+use Drupal\Tests\UnitTestCase;
 use Drupal\breakpoint\Plugin\Core\Entity\Breakpoint;
 use Drupal\breakpoint\InvalidBreakpointMediaQueryException;
 
 /**
  * Tests for media queries in a breakpoint.
+ *
+ * @group Breakpoint
  */
-class BreakpointMediaQueryTest extends UnitTestBase {
+class BreakpointMediaQueryTest extends UnitTestCase {
 
   public static function getInfo() {
     return array(
@@ -116,7 +118,7 @@ public function testInvalidMediaQueries() {
         $this->assertFalse(Breakpoint::isValidMediaQuery($media_query), $media_query . ' is not valid.');
       }
       catch (InvalidBreakpointMediaQueryException $e) {
-        $this->assertTrue(TRUE, format_string('%media_query is not valid.', array('%media_query' => $media_query)));
+        $this->assertTrue(TRUE, sprintf('%s is not valid.', $media_query));
       }
     }
   }
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index d7adb65..4eb114d 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -130,6 +130,23 @@ function simpletest_run_tests($test_list, $reporter = 'drupal') {
     ->useDefaults(array('test_id'))
     ->execute();
 
+  $phpunit_results = simpletest_run_phpunit_tests($test_id, $test_list['UnitTest']);
+  // Insert the results of the phpunit test run into the db so the results are
+  // displayed along with simpletest's results.
+  $query = db_insert('simpletest')->fields(array_keys($phpunit_results[0]));
+  foreach ($phpunit_results as $result) {
+    $query->values($result);
+  }
+  $query->execute();
+
+  if (!array_key_exists('WebTest', $test_list) || empty($test_list['WebTest'])) {
+    // Early return if there are no WebTests to run.
+    return $test_id;
+  }
+
+  // Contine with SimpleTests only.
+  $test_list = $test_list['WebTest'];
+
   // Clear out the previous verbose files.
   file_unmanaged_delete_recursive('public://simpletest/verbose');
 
@@ -157,6 +174,84 @@ function simpletest_run_tests($test_list, $reporter = 'drupal') {
 }
 
 /**
+ * Executes phpunit tests and returns the results of the run.
+ *
+ * @param $test_id
+ *   The current test ID.
+ * @param $unescaped_test_classnames
+ *   An array of test class names, including full namespaces, to be passed as
+ *   a regular expression to phpunit's --filter option.
+ *
+ * @return array
+ *   The parsed results of phpunit's junit xml output, in the format of the 
+ *   simpletest table's schema.
+ */
+function simpletest_run_phpunit_tests($test_id, array $unescaped_test_classnames) {
+  $phpunit_file = simpletest_phpunit_xml_filepath($test_id);
+  simpletest_phpunit_run_command($unescaped_test_classnames, $phpunit_file);
+  return simpletest_phpunit_xml_to_rows($test_id, $phpunit_file);
+}
+
+/**
+ * Returns the path to use for phpunit's --log-junit option.
+ *
+ * @param $test_id
+ *   The current test ID.
+ * @return string
+ *   Path to the phpunit xml file to use for the current test_id.
+ */
+function simpletest_phpunit_xml_filepath($test_id) {
+  return drupal_realpath('public://simpletest') . '/phpunit-' . $test_id . '.xml';
+}
+
+/**
+ * Returns the path to core's phpunit.xml.dist configuration file.
+ *
+ * @return string
+ *   Path to core's phpunit.xml.dist configuration file.
+ */
+function simpletest_phpunit_configuration_filepath() {
+  return DRUPAL_ROOT . '/core/phpunit.xml.dist';
+}
+
+/**
+ * Executes the phpunit command. We do this via exec in a subshell so that the
+ * environment is isolated when running tests via the simpletest UI.
+ *
+ * @param array $unescaped_test_classnames
+ *   An array of test class names, including full namespaces, to be passed as
+ *   a regular expression to phpunit's --filter option.
+ * @param string $phpunit_file
+ *   A filepath to use for phpunit's --log-junit option.
+ */
+function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpunit_file) {
+  $phpunit_bin = DRUPAL_ROOT . "/core/vendor/bin/phpunit";
+
+  // Double escape namespaces so they'll work in a regexp.
+  $escaped_test_classnames = array_map(function($class) {
+    return addslashes($class);
+  }, $unescaped_test_classnames);
+
+  $filter_string = implode("|", $escaped_test_classnames);
+
+  $command = array(
+    $phpunit_bin,
+    '--filter',
+    escapeshellarg($filter_string),
+    '--log-junit',
+    escapeshellarg($phpunit_file),
+  );
+
+  // Need to change directories before running the command so that we can use
+  // relative paths in the configuration file's exclusions.
+  $old_cwd = getcwd();
+  chdir(DRUPAL_ROOT . "/core");
+  $ret = exec(join($command, " "));
+  chdir($old_cwd);
+  return $ret;
+}
+
+/**
  * Batch operation callback.
  */
 function _simpletest_batch_operation($test_list_init, $test_id, &$context) {
@@ -397,10 +492,22 @@ function simpletest_classloader_register() {
     $matches = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.' . $info['extension'] . '$/', $info['dir']);
     foreach ($matches as $name => $file) {
       drupal_classloader_register($name, dirname($file->uri));
+      drupal_classloader()->registerNamespace('Drupal\\' . $name . '\\Tests', DRUPAL_ROOT . '/' . dirname($file->uri) . '/tests');
       // While being there, prime drupal_get_filename().
       drupal_get_filename($type, $name, $file->uri);
     }
   }
+
+  // Register the core test directory so we can find Drupal\UnitTestCase.
+  drupal_classloader()->registerNamespace('Drupal\\Tests', DRUPAL_ROOT . '/core/tests');
+
+  // Manually register phpunit prefixes because they use a classmap instead of a
+  // prefix. This can be safely removed if we move to using composer's
+  // autoloader with a classmap.
+  drupal_classloader()->registerPrefixes(array(
+    'PHPUnit' => DRUPAL_ROOT . '/core/vendor/phpunit/phpunit',
+    'File_Iterator' => DRUPAL_ROOT . '/core/vendor/phpunit/php-file-iterator/',
+  ));
 }
 
 /**
@@ -568,3 +675,64 @@ function simpletest_library_info() {
 
   return $libraries;
 }
+
+/**
+ * Get PHPUnit Classes
+ *
+ * @param bool $name_only
+ *  If TRUE, returns a flat array of class names only.
+ */
+function simpletest_phpunit_get_available_tests() {
+  // Load the PHPUnit configuration file, which tells us where to find the tests.
+  $phpunit_config = simpletest_phpunit_configuration_filepath();
+  $configuration = PHPUnit_Util_Configuration::getInstance($phpunit_config);
+  // Find all the tests and get a list of unique class names.
+  $test_suite = $configuration->getTestSuiteConfiguration(NULL);
+  $test_classes = array();
+  foreach ($test_suite AS $test) {
+    $name = get_class($test);
+    if (!array_key_exists($name, $test_classes)) {
+      $test_classes[$name] =  $test->getInfo();
+    }
+  }
+
+  return $test_classes;
+}
+
+/**
+ * Converts phpunit's junit xml output to an array of rows that can be inserted
+ * into the simpletest results table.
+ *
+ * @param $test_id
+ *   The current test ID.
+ * @param $phpunit_xml_file
+ *   Path to the phpunit xml file.
+ */
+function simpletest_phpunit_xml_to_rows($test_id, $phpunit_xml_file) {
+  $contents = file_get_contents($phpunit_xml_file);
+  $xml = new SimpleXMLElement($contents);
+  $records = array();
+  foreach ($xml->testsuite as $testsuite) {
+    foreach ($testsuite as $suite) {
+      foreach ($suite as $testcase) {
+        $message = '';
+        if ($testcase->failure) {
+          $lines = explode("\n", $testcase->failure);
+          $message = $lines[2];
+        }
+        $attributes = $testcase->attributes();
+        $records[] = array(
+          'test_id' => $test_id,
+          'test_class' => (string)$attributes->class,
+          'status' => empty($testcase->failure) ? 'pass' : 'fail',
+          'message' => $message,
+          'message_group' => 'Other', // TODO: Check on the proper values for this.
+          'function' => $attributes->class . '->' . $attributes->name . '()',
+          'line' => (string)$attributes->line,
+          'file' => (string)$attributes->file,
+        );
+      }
+    }
+  }
+  return $records;
+}
diff --git a/core/modules/simpletest/simpletest.pages.inc b/core/modules/simpletest/simpletest.pages.inc
index 7fe64d7..d228357 100644
--- a/core/modules/simpletest/simpletest.pages.inc
+++ b/core/modules/simpletest/simpletest.pages.inc
@@ -8,7 +8,7 @@
 /**
  * List tests arranged in groups that can be selected and run.
  */
-function simpletest_test_form($form) {
+function simpletest_test_form($form, &$form_state) {
   $form['tests'] = array(
     '#type' => 'details',
     '#title' => t('Tests'),
@@ -21,6 +21,9 @@ function simpletest_test_form($form) {
 
   // Generate the list of tests arranged by group.
   $groups = simpletest_test_get_all();
+  $groups['PHPUnit'] = simpletest_phpunit_get_available_tests();
+  $form_state['storage']['PHPUnit'] = $groups['PHPUnit'];
+
   foreach ($groups as $group => $tests) {
     $form['tests']['table'][$group] = array(
       '#collapsed' => TRUE,
@@ -180,11 +183,15 @@ function simpletest_test_form_submit($form, &$form_state) {
   // Get list of tests.
   $tests_list = array();
   simpletest_classloader_register();
+
+  $phpunit_all = array_keys($form_state['storage']['PHPUnit']);
+
   foreach ($form_state['values'] as $class_name => $value) {
     // Since class_exists() will likely trigger an autoload lookup,
     // we do the fast check first.
     if ($value === 1 && class_exists($class_name)) {
-      $tests_list[] = $class_name;
+      $test_type = in_array($class_name, $phpunit_all) ? 'UnitTest' : 'WebTest';
+      $tests_list[$test_type][] = $class_name;
     }
   }
   if (count($tests_list) > 0 ) {
@@ -519,4 +526,3 @@ function simpletest_settings_form_validate($form, &$form_state) {
     form_set_error('simpletest_httpauth_username', t('HTTP authentication credentials must include a username in addition to a password.'));
   }
 }
-
diff --git a/core/phpunit.xml.dist b/core/phpunit.xml.dist
new file mode 100644
index 0000000..6ca7e89
--- /dev/null
+++ b/core/phpunit.xml.dist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit bootstrap="tests/bootstrap.php" colors="true">
+  <testsuites>
+    <testsuite name="Drupal Unit Test Suite">
+      <directory>./tests/*</directory>
+      <directory>./modules/*/tests/*</directory>
+      <directory>../modules/*/tests/*</directory>
+      <directory>../sites/*/modules/*/tests/*</directory>
+      <!-- Exclude files that end in Test.php that aren't actually phpunit tests. -->
+      <exclude>./modules/config/tests/config_test/lib/Drupal/config_test</exclude>
+      <exclude>./modules/views/tests/views_test_data/lib/Drupal/views_test_data</exclude>
+    </testsuite>
+  </testsuites>
+</phpunit>
+
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/BackendChainImplementationUnitTest.php b/core/tests/Drupal/Tests/Core/Cache/BackendChainImplementationUnitTest.php
similarity index 72%
rename from core/modules/system/lib/Drupal/system/Tests/Cache/BackendChainImplementationUnitTest.php
rename to core/tests/Drupal/Tests/Core/Cache/BackendChainImplementationUnitTest.php
index 9c528ce..2a3db3d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Cache/BackendChainImplementationUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Cache/BackendChainImplementationUnitTest.php
@@ -2,20 +2,20 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Cache\BackendChainImplementationUnitTest.
+ * Definition of Drupal\Tests\Core\Cache\BackendChainImplementationUnitTest.
  */
 
-namespace Drupal\system\Tests\Cache;
+namespace Drupal\Tests\Core\Cache;
 
 use Drupal\Core\Cache\CacheBackendInterface;
 use Drupal\Core\Cache\BackendChain;
 use Drupal\Core\Cache\MemoryBackend;
-use Drupal\simpletest\UnitTestBase;
+use Drupal\Tests\UnitTestCase;
 
 /**
  * Tests implementation-specific functionality of the BackendChain backend.
  */
-class BackendChainImplementationUnitTest extends UnitTestBase {
+class BackendChainImplementationUnitTest extends UnitTestCase {
 
   public static function getInfo() {
     return array(
@@ -95,16 +95,16 @@ public function setUp() {
    */
   public function testGet() {
     $cached = $this->chain->get('t123');
-    $this->assertNotIdentical(FALSE, $cached, 'Got key that is on all backends');
-    $this->assertIdentical(1231, $cached->data, 'Got the key from the backend 1');
+    $this->assertNotEquals(FALSE, $cached, 'Got key that is on all backends');
+    $this->assertEquals(1231, $cached->data, 'Got the key from the backend 1');
 
     $cached = $this->chain->get('t23');
-    $this->assertNotIdentical(FALSE, $cached, 'Got key that is on backends 2 and 3');
-    $this->assertIdentical(232, $cached->data, 'Got the key from the backend 2');
+    $this->assertNotEquals(FALSE, $cached, 'Got key that is on backends 2 and 3');
+    $this->assertEquals(232, $cached->data, 'Got the key from the backend 2');
 
     $cached = $this->chain->get('t3');
-    $this->assertNotIdentical(FALSE, $cached, 'Got key that is on the backend 3');
-    $this->assertIdentical(33, $cached->data, 'Got the key from the backend 3');
+    $this->assertNotEquals(FALSE, $cached, 'Got key that is on the backend 3');
+    $this->assertEquals(33, $cached->data, 'Got the key from the backend 3');
   }
 
   /**
@@ -114,15 +114,15 @@ public function testGetMultiple() {
     $cids = array('t123', 't23', 't3', 't4');
 
     $ret = $this->chain->getMultiple($cids);
-    $this->assertIdentical($ret['t123']->data, 1231, 'Got key 123 and value is from the first backend');
-    $this->assertIdentical($ret['t23']->data, 232, 'Got key 23 and value is from the second backend');
-    $this->assertIdentical($ret['t3']->data, 33, 'Got key 3 and value is from the third backend');
+    $this->assertEquals($ret['t123']->data, 1231, 'Got key 123 and value is from the first backend');
+    $this->assertEquals($ret['t23']->data, 232, 'Got key 23 and value is from the second backend');
+    $this->assertEquals($ret['t3']->data, 33, 'Got key 3 and value is from the third backend');
     $this->assertFalse(array_key_exists('t4', $ret), "Didn't get the nonexistent key");
 
     $this->assertFalse(in_array('t123', $cids), "Existing key 123 has been removed from &\$cids");
     $this->assertFalse(in_array('t23', $cids), "Existing key 23 has been removed from &\$cids");
     $this->assertFalse(in_array('t3', $cids), "Existing key 3 has been removed from &\$cids");
-    $this->assert(in_array('t4', $cids), "Non existing key 4 is still in &\$cids");
+    $this->assertTrue(in_array('t4', $cids), "Non existing key 4 is still in &\$cids");
   }
 
   /**
@@ -132,16 +132,16 @@ public function testSet() {
     $this->chain->set('test', 123);
 
     $cached = $this->firstBackend->get('test');
-    $this->assertNotIdentical(FALSE, $cached, 'Test key is in the first backend');
-    $this->assertIdentical(123, $cached->data, 'Test key has the right value');
+    $this->assertNotEquals(FALSE, $cached, 'Test key is in the first backend');
+    $this->assertEquals(123, $cached->data, 'Test key has the right value');
 
     $cached = $this->secondBackend->get('test');
-    $this->assertNotIdentical(FALSE, $cached, 'Test key is in the second backend');
-    $this->assertIdentical(123, $cached->data, 'Test key has the right value');
+    $this->assertNotEquals(FALSE, $cached, 'Test key is in the second backend');
+    $this->assertEquals(123, $cached->data, 'Test key has the right value');
 
     $cached = $this->thirdBackend->get('test');
-    $this->assertNotIdentical(FALSE, $cached, 'Test key is in the third backend');
-    $this->assertIdentical(123, $cached->data, 'Test key has the right value');
+    $this->assertNotEquals(FALSE, $cached, 'Test key is in the third backend');
+    $this->assertEquals(123, $cached->data, 'Test key has the right value');
   }
 
   /**
@@ -151,20 +151,20 @@ public function testDelete() {
     $this->chain->set('test', 5);
 
     $cached = $this->firstBackend->get('test');
-    $this->assertNotIdentical(FALSE, $cached, 'Test key has been added to the first backend');
+    $this->assertNotEquals(FALSE, $cached, 'Test key has been added to the first backend');
     $cached = $this->secondBackend->get('test');
-    $this->assertNotIdentical(FALSE, $cached, 'Test key has been added to the first backend');
+    $this->assertNotEquals(FALSE, $cached, 'Test key has been added to the first backend');
     $cached = $this->thirdBackend->get('test');
-    $this->assertNotIdentical(FALSE, $cached, 'Test key has been added to the first backend');
+    $this->assertNotEquals(FALSE, $cached, 'Test key has been added to the first backend');
 
     $this->chain->delete('test');
 
     $cached = $this->firstBackend->get('test');
-    $this->assertIdentical(FALSE, $cached, 'Test key is removed from the first backend');
+    $this->assertEquals(FALSE, $cached, 'Test key is removed from the first backend');
     $cached = $this->secondBackend->get('test');
-    $this->assertIdentical(FALSE, $cached, 'Test key is removed from the second backend');
+    $this->assertEquals(FALSE, $cached, 'Test key is removed from the second backend');
     $cached = $this->thirdBackend->get('test');
-    $this->assertIdentical(FALSE, $cached, 'Test key is removed from the third backend');
+    $this->assertEquals(FALSE, $cached, 'Test key is removed from the third backend');
   }
 
   /**
@@ -173,13 +173,13 @@ public function testDelete() {
   public function testGetHasPropagated() {
     $this->chain->get('t23');
     $cached = $this->firstBackend->get('t23');
-    $this->assertNotIdentical(FALSE, $cached, 'Test 2 has been propagated to the first backend');
+    $this->assertNotEquals(FALSE, $cached, 'Test 2 has been propagated to the first backend');
 
     $this->chain->get('t3');
     $cached = $this->firstBackend->get('t3');
-    $this->assertNotIdentical(FALSE, $cached, 'Test 3 has been propagated to the first backend');
+    $this->assertNotEquals(FALSE, $cached, 'Test 3 has been propagated to the first backend');
     $cached = $this->secondBackend->get('t3');
-    $this->assertNotIdentical(FALSE, $cached, 'Test 3 has been propagated to the second backend');
+    $this->assertNotEquals(FALSE, $cached, 'Test 3 has been propagated to the second backend');
   }
 
   /**
@@ -190,15 +190,15 @@ public function testGetMultipleHasPropagated() {
     $this->chain->getMultiple($cids);
 
     $cached = $this->firstBackend->get('t3');
-    $this->assertNotIdentical(FALSE, $cached, 'Test 3 has been propagated to the first backend');
-    $this->assertIdentical(33, $cached->data, 'And value has been kept');
+    $this->assertNotEquals(FALSE, $cached, 'Test 3 has been propagated to the first backend');
+    $this->assertEquals(33, $cached->data, 'And value has been kept');
     $cached = $this->secondBackend->get('t3');
-    $this->assertNotIdentical(FALSE, $cached, 'Test 3 has been propagated to the second backend');
-    $this->assertIdentical(33, $cached->data, 'And value has been kept');
+    $this->assertNotEquals(FALSE, $cached, 'Test 3 has been propagated to the second backend');
+    $this->assertEquals(33, $cached->data, 'And value has been kept');
 
     $cached = $this->firstBackend->get('t23');
-    $this->assertNotIdentical(FALSE, $cached, 'Test 2 has been propagated to the first backend');
-    $this->assertIdentical(232, $cached->data, 'And value has been kept');
+    $this->assertNotEquals(FALSE, $cached, 'Test 2 has been propagated to the first backend');
+    $this->assertEquals(232, $cached->data, 'And value has been kept');
   }
 
   /**
@@ -209,7 +209,7 @@ public function testNotEmptyIfOneBackendHasTheKey() {
 
     // This is the only test that needs to start with an empty chain.
     $this->chain->deleteAll();
-    $this->assert($this->chain->isEmpty(), 'Chain have been emptied by the deleteAll() call');
+    $this->assertTrue($this->chain->isEmpty(), 'Chain have been emptied by the deleteAll() call');
 
     $this->secondBackend->set('test', 5);
     $this->assertFalse($this->chain->isEmpty(), 'Chain is not empty anymore now that the second backend has something');
@@ -237,7 +237,7 @@ public function testDeleteTagsPropagation() {
     // Create two cache entries with the same tag and tag value.
     $this->chain->set('test_cid_clear1', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag' => 2));
     $this->chain->set('test_cid_clear2', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag' => 2));
-    $this->assertNotIdentical(FALSE, $this->firstBackend->get('test_cid_clear1')
+    $this->assertNotEquals(FALSE, $this->firstBackend->get('test_cid_clear1')
       && $this->firstBackend->get('test_cid_clear2')
       && $this->secondBackend->get('test_cid_clear1')
       && $this->secondBackend->get('test_cid_clear2')
@@ -247,7 +247,7 @@ public function testDeleteTagsPropagation() {
 
     // Invalidate test_tag of value 1. This should invalidate both entries.
     $this->chain->deleteTags(array('test_tag' => 2));
-    $this->assertIdentical(FALSE, $this->firstBackend->get('test_cid_clear1')
+    $this->assertEquals(FALSE, $this->firstBackend->get('test_cid_clear1')
       && $this->firstBackend->get('test_cid_clear2')
       && $this->secondBackend->get('test_cid_clear1')
       && $this->secondBackend->get('test_cid_clear2')
@@ -258,7 +258,7 @@ public function testDeleteTagsPropagation() {
     // Create two cache entries with the same tag and an array tag value.
     $this->chain->set('test_cid_clear1', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag' => array(1)));
     $this->chain->set('test_cid_clear2', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag' => array(1)));
-    $this->assertNotIdentical(FALSE, $this->firstBackend->get('test_cid_clear1')
+    $this->assertNotEquals(FALSE, $this->firstBackend->get('test_cid_clear1')
       && $this->firstBackend->get('test_cid_clear2')
       && $this->secondBackend->get('test_cid_clear1')
       && $this->secondBackend->get('test_cid_clear2')
@@ -268,7 +268,7 @@ public function testDeleteTagsPropagation() {
 
     // Invalidate test_tag of value 1. This should invalidate both entries.
     $this->chain->deleteTags(array('test_tag' => array(1)));
-    $this->assertIdentical(FALSE, $this->firstBackend->get('test_cid_clear1')
+    $this->assertEquals(FALSE, $this->firstBackend->get('test_cid_clear1')
       && $this->firstBackend->get('test_cid_clear2')
       && $this->secondBackend->get('test_cid_clear1')
       && $this->secondBackend->get('test_cid_clear2')
@@ -280,7 +280,7 @@ public function testDeleteTagsPropagation() {
     $this->chain->set('test_cid_clear1', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag' => array(1)));
     $this->chain->set('test_cid_clear2', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag' => array(2)));
     $this->chain->set('test_cid_clear3', 'foo', CacheBackendInterface::CACHE_PERMANENT, array('test_tag_foo' => array(3)));
-    $this->assertNotIdentical(FALSE, $this->firstBackend->get('test_cid_clear1')
+    $this->assertNotEquals(FALSE, $this->firstBackend->get('test_cid_clear1')
       && $this->firstBackend->get('test_cid_clear2')
       && $this->firstBackend->get('test_cid_clear3')
       && $this->secondBackend->get('test_cid_clear1')
@@ -292,7 +292,7 @@ public function testDeleteTagsPropagation() {
       'Three cached items were created in all backends.');
 
     $this->chain->deleteTags(array('test_tag_foo' => array(3)));
-    $this->assertNotIdentical(FALSE, $this->firstBackend->get('test_cid_clear1')
+    $this->assertNotEquals(FALSE, $this->firstBackend->get('test_cid_clear1')
       && $this->firstBackend->get('test_cid_clear2')
       && $this->secondBackend->get('test_cid_clear1')
       && $this->secondBackend->get('test_cid_clear2')
@@ -300,7 +300,7 @@ public function testDeleteTagsPropagation() {
       && $this->thirdBackend->get('test_cid_clear2'),
       'Cached items not matching the tag were not cleared from any of the backends.');
 
-    $this->assertIdentical(FALSE, $this->firstBackend->get('test_cid_clear3')
+    $this->assertEquals(FALSE, $this->firstBackend->get('test_cid_clear3')
       && $this->secondBackend->get('test_cid_clear3')
       && $this->thirdBackend->get('test_cid_clear3'),
       'Cached item matching the tag was removed from all backends.');
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php b/core/tests/Drupal/Tests/Core/Cache/GenericCacheBackendUnitTestBase.php
similarity index 90%
rename from core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php
rename to core/tests/Drupal/Tests/Core/Cache/GenericCacheBackendUnitTestBase.php
index 5820202..9ca9bb7 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php
+++ b/core/tests/Drupal/Tests/Core/Cache/GenericCacheBackendUnitTestBase.php
@@ -2,15 +2,13 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Cache\GenericCacheBackendUnitTestBase.
+ * Definition of Drupal\Tests\Core\Cache\GenericCacheBackendUnitTestCase.
  */
 
-namespace Drupal\system\Tests\Cache;
+namespace Drupal\Tests\Core\Cache;
 
 use Drupal\Core\Cache\CacheBackendInterface;
-use Drupal\simpletest\UnitTestBase;
-
-use stdClass;
+use Drupal\Tests\UnitTestCase;
 
 /**
  * Tests any cache backend.
@@ -22,7 +20,7 @@
  * @see DatabaseBackendUnitTestCase
  *   For a full working implementation.
  */
-abstract class GenericCacheBackendUnitTestBase extends UnitTestBase {
+abstract class GenericCacheBackendUnitTestCase extends UnitTestCase {
 
   /**
    * Array of objects implementing Drupal\Core\Cache\CacheBackendInterface.
@@ -136,20 +134,20 @@ public function tearDown() {
   public function testSetGet() {
     $backend = $this->getCacheBackend();
 
-    $this->assertIdentical(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1.");
+    $this->assertEquals(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1.");
     $backend->set('test1', 7);
     $cached = $backend->get('test1');
     $this->assert(is_object($cached), "Backend returned an object for cache id test1.");
-    $this->assertIdentical(7, $cached->data);
+    $this->assertEquals(7, $cached->data);
     $this->assertTrue($cached->valid, 'Item is marked as valid.');
     $this->assertEqual($cached->created, REQUEST_TIME, 'Created time is correct.');
     $this->assertEqual($cached->expire, CacheBackendInterface::CACHE_PERMANENT, 'Expire time is correct.');
 
-    $this->assertIdentical(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2.");
+    $this->assertEquals(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2.");
     $backend->set('test2', array('value' => 3), REQUEST_TIME + 3);
     $cached = $backend->get('test2');
     $this->assert(is_object($cached), "Backend returned an object for cache id test2.");
-    $this->assertIdentical(array('value' => 3), $cached->data);
+    $this->assertEquals(array('value' => 3), $cached->data);
     $this->assertTrue($cached->valid, 'Item is marked as valid.');
     $this->assertEqual($cached->created, REQUEST_TIME, 'Created time is correct.');
     $this->assertEqual($cached->expire, REQUEST_TIME + 3, 'Expire time is correct.');
@@ -169,22 +167,22 @@ public function testSetGet() {
   public function testDelete() {
     $backend = $this->getCacheBackend();
 
-    $this->assertIdentical(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1.");
+    $this->assertEquals(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1.");
     $backend->set('test1', 7);
     $this->assert(is_object($backend->get('test1')), "Backend returned an object for cache id test1.");
 
-    $this->assertIdentical(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2.");
+    $this->assertEquals(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2.");
     $backend->set('test2', 3);
     $this->assert(is_object($backend->get('test2')), "Backend returned an object for cache id %cid.");
 
     $backend->delete('test1');
-    $this->assertIdentical(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1 after deletion.");
+    $this->assertEquals(FALSE, $backend->get('test1'), "Backend does not contain data for cache id test1 after deletion.");
 
     $cached = $backend->get('test2');
     $this->assert(is_object($backend->get('test2')), "Backend still has an object for cache id test2.");
 
     $backend->delete('test2');
-    $this->assertIdentical(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2 after deletion.");
+    $this->assertEquals(FALSE, $backend->get('test2'), "Backend does not contain data for cache id test2 after deletion.");
   }
 
   /**
@@ -211,7 +209,7 @@ public function testValueTypeIsKept() {
     foreach ($variables as $cid => $value) {
       $object = $backend->get($cid);
       $this->assert(is_object($object), sprintf("Backend returned an object for cache id %s.", $cid));
-      $this->assertIdentical($value, $object->data, sprintf("Data of cached id %s kept is identical in type and value", $cid));
+      $this->assertEquals($value, $object->data, sprintf("Data of cached id %s kept is identical in type and value", $cid));
     }
   }
 
@@ -255,10 +253,10 @@ public function testGetMultiple() {
     $this->assertFalse(isset($ret['test19']), "Nonexistent cache id test19 is not set.");
     $this->assertFalse(isset($ret['test21']), "Nonexistent cache id test21 is not set.");
     // Test values.
-    $this->assertIdentical($ret['test2']->data, 3, "Existing cache id test2 has the correct value.");
-    $this->assertIdentical($ret['test3']->data, 5, "Existing cache id test3 has the correct value.");
-    $this->assertIdentical($ret['test6']->data, 13, "Existing cache id test6 has the correct value.");
-    $this->assertIdentical($ret['test7']->data, 17, "Existing cache id test7 has the correct value.");
+    $this->assertEquals($ret['test2']->data, 3, "Existing cache id test2 has the correct value.");
+    $this->assertEquals($ret['test3']->data, 5, "Existing cache id test3 has the correct value.");
+    $this->assertEquals($ret['test6']->data, 13, "Existing cache id test6 has the correct value.");
+    $this->assertEquals($ret['test7']->data, 17, "Existing cache id test7 has the correct value.");
     // Test $cids array - ensure it contains cache id's that do not exist.
     $this->assert(in_array('test19', $cids), "Nonexistent cache id test19 is in cids array.");
     $this->assert(in_array('test21', $cids), "Nonexistent cache id test21 is in cids array.");
@@ -285,9 +283,9 @@ public function testGetMultiple() {
     $this->assertFalse(isset($ret['test6']), "Deleted cache id test6 is not set");
     $this->assertFalse(isset($ret['test21']), "Nonexistent cache id test21 is not set");
     // Test values.
-    $this->assertIdentical($ret['test2']->data, 3, "Existing cache id test2 has the correct value.");
-    $this->assertIdentical($ret['test7']->data, 17, "Existing cache id test7 has the correct value.");
-    $this->assertIdentical($ret['test19']->data, 57, "Added cache id test19 has the correct value.");
+    $this->assertEquals($ret['test2']->data, 3, "Existing cache id test2 has the correct value.");
+    $this->assertEquals($ret['test7']->data, 17, "Existing cache id test7 has the correct value.");
+    $this->assertEquals($ret['test19']->data, 57, "Added cache id test19 has the correct value.");
     // Test $cids array - ensure it contains cache id's that do not exist.
     $this->assert(in_array('test3', $cids), "Deleted cache id test3 is in cids array.");
     $this->assert(in_array('test6', $cids), "Deleted cache id test6 is in cids array.");
@@ -340,10 +338,10 @@ public function testDeleteMultiple() {
     ));
 
     // Test if expected keys have been deleted.
-    $this->assertIdentical(FALSE, $backend->get('test1'), "Cache id test1 deleted.");
-    $this->assertIdentical(FALSE, $backend->get('test3'), "Cache id test3 deleted.");
-    $this->assertIdentical(FALSE, $backend->get('test5'), "Cache id test5 deleted.");
-    $this->assertIdentical(FALSE, $backend->get('test7'), "Cache id test7 deleted.");
+    $this->assertEquals(FALSE, $backend->get('test1'), "Cache id test1 deleted.");
+    $this->assertEquals(FALSE, $backend->get('test3'), "Cache id test3 deleted.");
+    $this->assertEquals(FALSE, $backend->get('test5'), "Cache id test5 deleted.");
+    $this->assertEquals(FALSE, $backend->get('test7'), "Cache id test7 deleted.");
 
     // Test if expected keys exist.
     $this->assertNotIdentical(FALSE, $backend->get('test2'), "Cache id test2 exists.");
@@ -351,8 +349,8 @@ public function testDeleteMultiple() {
     $this->assertNotIdentical(FALSE, $backend->get('test6'), "Cache id test6 exists.");
 
     // Test if that expected keys do not exist.
-    $this->assertIdentical(FALSE, $backend->get('test19'), "Cache id test19 does not exist.");
-    $this->assertIdentical(FALSE, $backend->get('test21'), "Cache id test21 does not exist.");
+    $this->assertEquals(FALSE, $backend->get('test19'), "Cache id test19 does not exist.");
+    $this->assertEquals(FALSE, $backend->get('test21'), "Cache id test21 does not exist.");
   }
 
   /**
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/NullBackendTest.php b/core/tests/Drupal/Tests/Core/Cache/NullBackendTest.php
similarity index 78%
rename from core/modules/system/lib/Drupal/system/Tests/Cache/NullBackendTest.php
rename to core/tests/Drupal/Tests/Core/Cache/NullBackendTest.php
index 3882401..b304116 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Cache/NullBackendTest.php
+++ b/core/tests/Drupal/Tests/Core/Cache/NullBackendTest.php
@@ -2,18 +2,18 @@
 
 /**
  * @file
- * Definition of Drupal\system\Tests\Cache\NullBackendTest.
+ * Definition of Drupal\Tests\Core\Cache\NullBackendTest.
  */
 
-namespace Drupal\system\Tests\Cache;
+namespace Drupal\Tests\Core\Cache;
 
 use Drupal\Core\Cache\NullBackend;
-use Drupal\simpletest\UnitTestBase;
+use Drupal\Tests\UnitTestCase;
 
 /**
  * Tests the cache NullBackend.
  */
-class NullBackendTest extends UnitTestBase {
+class NullBackendTest extends UnitTestCase {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/NestedArrayUnitTest.php b/core/tests/Drupal/Tests/Core/NestedArrayUnitTest.php
similarity index 69%
rename from core/modules/system/lib/Drupal/system/Tests/Common/NestedArrayUnitTest.php
rename to core/tests/Drupal/Tests/Core/NestedArrayUnitTest.php
index ff61ae6..8473517 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/NestedArrayUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/NestedArrayUnitTest.php
@@ -2,18 +2,20 @@
 
 /**
  * @file
- * Contains \Drupal\system\Tests\Common\NestedArrayUnitTest.
+ * Contains \Drupal\Core\NestedArrayUnitTest.
  */
 
-namespace Drupal\system\Tests\Common;
+namespace Drupal\Tests\Core;
 
 use Drupal\Component\Utility\NestedArray;
-use Drupal\simpletest\UnitTestBase;
+use Drupal\Tests\UnitTestCase;
 
 /**
  * Tests the NestedArray helper class.
+ *
+ * @group System
  */
-class NestedArrayUnitTest extends UnitTestBase {
+class NestedArrayUnitTest extends UnitTestCase {
 
   /**
    * Form array to check.
@@ -51,26 +53,26 @@ function setUp() {
   function testGetValue() {
     // Verify getting a value of a nested element.
     $value = NestedArray::getValue($this->form, $this->parents);
-    $this->assertEqual($value['#value'], 'Nested element', 'Nested element value found.');
+    $this->assertEquals($value['#value'], 'Nested element', 'Nested element value found.');
 
     // Verify changing a value of a nested element by reference.
     $value = &NestedArray::getValue($this->form, $this->parents);
     $value['#value'] = 'New value';
     $value = NestedArray::getValue($this->form, $this->parents);
-    $this->assertEqual($value['#value'], 'New value', 'Nested element value was changed by reference.');
-    $this->assertEqual($this->form['details']['element']['#value'], 'New value', 'Nested element value was changed by reference.');
+    $this->assertEquals($value['#value'], 'New value', 'Nested element value was changed by reference.');
+    $this->assertEquals($this->form['details']['element']['#value'], 'New value', 'Nested element value was changed by reference.');
 
     // Verify that an existing key is reported back.
     $key_exists = NULL;
     NestedArray::getValue($this->form, $this->parents, $key_exists);
-    $this->assertIdentical($key_exists, TRUE, 'Existing key found.');
+    $this->assertEquals($key_exists, TRUE, 'Existing key found.');
 
     // Verify that a non-existing key is reported back and throws no errors.
     $key_exists = NULL;
     $parents = $this->parents;
     $parents[] = 'foo';
     NestedArray::getValue($this->form, $parents, $key_exists);
-    $this->assertIdentical($key_exists, FALSE, 'Non-existing key not found.');
+    $this->assertEquals($key_exists, FALSE, 'Non-existing key not found.');
   }
 
   /**
@@ -84,8 +86,8 @@ function testSetValue() {
 
     // Verify setting the value of a nested element.
     NestedArray::setValue($this->form, $this->parents, $new_value);
-    $this->assertEqual($this->form['details']['element']['#value'], 'New value', 'Changed nested element value found.');
-    $this->assertIdentical($this->form['details']['element']['#required'], TRUE, 'New nested element value found.');
+    $this->assertEquals($this->form['details']['element']['#value'], 'New value', 'Changed nested element value found.');
+    $this->assertEquals($this->form['details']['element']['#required'], TRUE, 'New nested element value found.');
   }
 
   /**
@@ -99,13 +101,13 @@ function testUnsetValue() {
     $parents[] = 'foo';
     NestedArray::unsetValue($this->form, $parents, $key_existed);
     $this->assertTrue(isset($this->form['details']['element']['#value']), 'Outermost nested element key still exists.');
-    $this->assertIdentical($key_existed, FALSE, 'Non-existing key not found.');
+    $this->assertEquals($key_existed, FALSE, 'Non-existing key not found.');
 
     // Verify unsetting a nested element.
     $key_existed = NULL;
     NestedArray::unsetValue($this->form, $this->parents, $key_existed);
     $this->assertFalse(isset($this->form['details']['element']), 'Removed nested element not found.');
-    $this->assertIdentical($key_existed, TRUE, 'Existing key was found.');
+    $this->assertEquals($key_existed, TRUE, 'Existing key was found.');
   }
 
   /**
@@ -113,12 +115,12 @@ function testUnsetValue() {
    */
   function testKeyExists() {
     // Verify that existing key is found.
-    $this->assertIdentical(NestedArray::keyExists($this->form, $this->parents), TRUE, 'Nested key found.');
+    $this->assertEquals(NestedArray::keyExists($this->form, $this->parents), TRUE, 'Nested key found.');
 
     // Verify that non-existing keys are not found.
     $parents = $this->parents;
     $parents[] = 'foo';
-    $this->assertIdentical(NestedArray::keyExists($this->form, $parents), FALSE, 'Non-existing nested key not found.');
+    $this->assertEquals(NestedArray::keyExists($this->form, $parents), FALSE, 'Non-existing nested key not found.');
   }
 
   /**
@@ -141,6 +143,6 @@ function testMergeDeepArray() {
       'language' => 'en',
       'html' => TRUE,
     );
-    $this->assertIdentical(NestedArray::mergeDeepArray(array($link_options_1, $link_options_2)), $expected, 'NestedArray::mergeDeepArray() returned a properly merged array.');
+    $this->assertEquals(NestedArray::mergeDeepArray(array($link_options_1, $link_options_2)), $expected, 'NestedArray::mergeDeepArray() returned a properly merged array.');
   }
 }
diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php
new file mode 100644
index 0000000..e89d21b
--- /dev/null
+++ b/core/tests/Drupal/Tests/UnitTestCase.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\UnitTestCase.
+ */
+namespace Drupal\Tests;
+
+class UnitTestCase extends \PHPUnit_Framework_TestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'test name',
+      'description' => 'test description',
+      'group' => 'somegroup',
+    );
+  }
+
+  /**
+   * Generates a random string containing letters and numbers.
+   *
+   * The string will always start with a letter. The letters may be upper or
+   * lower case. This method is better for restricted inputs that do not
+   * accept certain characters. For example, when testing input fields that
+   * require machine readable values (i.e. without spaces and non-standard
+   * characters) this method is best.
+   *
+   * Do not use this method when testing unvalidated user input. Instead, use
+   * Drupal\simpletest\TestBase::randomString().
+   *
+   * @param $length
+   *   Length of random string to generate.
+   *
+   * @return
+   *   Randomly generated string.
+   *
+   * @see Drupal\simpletest\TestBase::randomString()
+   */
+  public static function randomName($length = 8) {
+    $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
+    $max = count($values) - 1;
+    $str = chr(mt_rand(97, 122));
+    for ($i = 1; $i < $length; $i++) {
+      $str .= chr($values[mt_rand(0, $max)]);
+    }
+    return $str;
+  }
+
+  /**
+   * Fire an assertion that is always positive.
+   *
+   * @param $message
+   *   (optional) A message to display with the assertion. Do not translate
+   *   messages: use format_string() to embed variables in the message text, not
+   *   t(). If left blank, a default message will be displayed.
+   * @param $group
+   *   (optional) The group this message is in, which is displayed in a column
+   *   in test output. Use 'Debug' to indicate this is debugging output. Do not
+   *   translate this string. Defaults to 'Other'; most tests do not override
+   *   this default.
+   * @return
+   *   TRUE.
+   */
+  protected function pass($message = NULL, $group = 'Other') {
+    return $this->assertTrue($message, $group);
+  }
+}
diff --git a/core/tests/bootstrap.php b/core/tests/bootstrap.php
new file mode 100644
index 0000000..6c947df
--- /dev/null
+++ b/core/tests/bootstrap.php
@@ -0,0 +1,13 @@
+<?php
+
+// Register the namespaces we'll need to autoload from.
+$loader = require __DIR__ . "/../vendor/autoload.php";
+$loader->add('Drupal\\', __DIR__);
+$loader->add('Drupal\Core', __DIR__ . "/../../core/lib");
+$loader->add('Drupal\Component', __DIR__ . "/../../core/lib");
+
+foreach (scandir(__DIR__ . "/../modules") as $module) {
+  $loader->add('Drupal\\' . $module, __DIR__ . "/../modules/" . $module . "/lib");
+}
+// Look into removing this later.
+define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
diff --git a/core/vendor/README.txt b/core/vendor/README.txt
deleted file mode 100644
index 33a40f5..0000000
--- a/core/vendor/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-3rd party libraries provided by Drupal core should be placed in this directory.
-They should not be modified from their original form at any time. They should
-be changed only to keep up to date with upstream projects.
-
-Code in this directory MAY be licensed under a GPL-compatible non-GPL license.
-If so, it must be properly documented in COPYRIGHT.txt.
diff --git a/core/vendor/autoload.php b/core/vendor/autoload.php
index 299fea1..6e0d5f7 100644
--- a/core/vendor/autoload.php
+++ b/core/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer' . '/autoload_real.php';
 
-return ComposerAutoloaderInitf05567eba27abe19ce0204f90ff18248::getLoader();
+return ComposerAutoloaderInit7ff6703a948fec33ad3ec525166a5755::getLoader();
diff --git a/core/vendor/bin/phpunit b/core/vendor/bin/phpunit
new file mode 120000
index 0000000..d284b32
--- /dev/null
+++ b/core/vendor/bin/phpunit
@@ -0,0 +1 @@
+../phpunit/phpunit/composer/bin/phpunit
\ No newline at end of file
diff --git a/core/vendor/composer/autoload_classmap.php b/core/vendor/composer/autoload_classmap.php
index 590381a..413ca78 100644
--- a/core/vendor/composer/autoload_classmap.php
+++ b/core/vendor/composer/autoload_classmap.php
@@ -6,5 +6,229 @@
 $baseDir = dirname($vendorDir);
 
 return array(
+    'File_Iterator' => $baseDir . '/vendor/phpunit/php-file-iterator/File/Iterator.php',
+    'File_Iterator_Facade' => $baseDir . '/vendor/phpunit/php-file-iterator/File/Iterator/Facade.php',
+    'File_Iterator_Factory' => $baseDir . '/vendor/phpunit/php-file-iterator/File/Iterator/Factory.php',
+    'PHPUnit_Framework_MockObject_Builder_Identity' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Identity.php',
+    'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/InvocationMocker.php',
+    'PHPUnit_Framework_MockObject_Builder_Match' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Match.php',
+    'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/MethodNameMatch.php',
+    'PHPUnit_Framework_MockObject_Builder_Namespace' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Namespace.php',
+    'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/ParametersMatch.php',
+    'PHPUnit_Framework_MockObject_Builder_Stub' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Stub.php',
+    'PHPUnit_Framework_MockObject_Generator' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator.php',
+    'PHPUnit_Framework_MockObject_Invocation' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation.php',
+    'PHPUnit_Framework_MockObject_InvocationMocker' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/InvocationMocker.php',
+    'PHPUnit_Framework_MockObject_Invocation_Object' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Object.php',
+    'PHPUnit_Framework_MockObject_Invocation_Static' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Static.php',
+    'PHPUnit_Framework_MockObject_Invokable' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invokable.php',
+    'PHPUnit_Framework_MockObject_Matcher' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher.php',
+    'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyInvokedCount.php',
+    'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyParameters.php',
+    'PHPUnit_Framework_MockObject_Matcher_Invocation' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Invocation.php',
+    'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtIndex.php',
+    'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+    'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedCount.php',
+    'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedRecorder.php',
+    'PHPUnit_Framework_MockObject_Matcher_MethodName' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/MethodName.php',
+    'PHPUnit_Framework_MockObject_Matcher_Parameters' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Parameters.php',
+    'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/StatelessInvocation.php',
+    'PHPUnit_Framework_MockObject_MockBuilder' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockBuilder.php',
+    'PHPUnit_Framework_MockObject_MockObject' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockObject.php',
+    'PHPUnit_Framework_MockObject_Stub' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub.php',
+    'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ConsecutiveCalls.php',
+    'PHPUnit_Framework_MockObject_Stub_Exception' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Exception.php',
+    'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/MatcherCollection.php',
+    'PHPUnit_Framework_MockObject_Stub_Return' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Return.php',
+    'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnArgument.php',
+    'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnCallback.php',
+    'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnSelf.php',
+    'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnValueMap.php',
+    'PHPUnit_Framework_MockObject_Verifiable' => $baseDir . '/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Verifiable.php',
+    'PHP_CodeCoverage' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php',
+    'PHP_CodeCoverage_Driver' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver.php',
+    'PHP_CodeCoverage_Driver_Xdebug' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver/Xdebug.php',
+    'PHP_CodeCoverage_Exception' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Exception.php',
+    'PHP_CodeCoverage_Filter' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Filter.php',
+    'PHP_CodeCoverage_Report_Clover' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Clover.php',
+    'PHP_CodeCoverage_Report_Factory' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Factory.php',
+    'PHP_CodeCoverage_Report_HTML' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML.php',
+    'PHP_CodeCoverage_Report_HTML_Renderer' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer.php',
+    'PHP_CodeCoverage_Report_HTML_Renderer_Dashboard' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Dashboard.php',
+    'PHP_CodeCoverage_Report_HTML_Renderer_Directory' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Directory.php',
+    'PHP_CodeCoverage_Report_HTML_Renderer_File' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/File.php',
+    'PHP_CodeCoverage_Report_Node' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node.php',
+    'PHP_CodeCoverage_Report_Node_Directory' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Directory.php',
+    'PHP_CodeCoverage_Report_Node_File' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/File.php',
+    'PHP_CodeCoverage_Report_Node_Iterator' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Iterator.php',
+    'PHP_CodeCoverage_Report_PHP' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/PHP.php',
+    'PHP_CodeCoverage_Report_Text' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Text.php',
+    'PHP_CodeCoverage_Util' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util.php',
+    'PHP_CodeCoverage_Util_InvalidArgumentHelper' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util/InvalidArgumentHelper.php',
+    'PHP_CodeCoverage_Version' => $baseDir . '/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Version.php',
+    'PHP_Timer' => $baseDir . '/vendor/phpunit/php-timer/PHP/Timer.php',
+    'PHP_Token' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_TokenWithScope' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_TokenWithScopeAndVisibility' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ABSTRACT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_AMPERSAND' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_AND_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ARRAY' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ARRAY_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_AS' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_AT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_BACKTICK' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_BAD_CHARACTER' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_BOOLEAN_AND' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_BOOLEAN_OR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_BOOL_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_BREAK' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CALLABLE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CARET' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CASE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CATCH' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CHARACTER' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLASS' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLASS_C' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLONE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLOSE_BRACKET' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLOSE_CURLY' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLOSE_SQUARE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CLOSE_TAG' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_COLON' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_COMMA' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_COMMENT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CONCAT_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CONST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CONSTANT_ENCAPSED_STRING' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CONTINUE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_CURLY_OPEN' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DEC' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DECLARE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DEFAULT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DIR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DIV' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DIV_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DNUMBER' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DO' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOC_COMMENT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOLLAR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOUBLE_ARROW' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOUBLE_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOUBLE_COLON' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_DOUBLE_QUOTES' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ECHO' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ELSE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ELSEIF' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_EMPTY' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENCAPSED_AND_WHITESPACE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENDDECLARE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENDFOR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENDFOREACH' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENDIF' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENDSWITCH' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ENDWHILE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_END_HEREDOC' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_EVAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_EXCLAMATION_MARK' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_EXIT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_EXTENDS' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_FILE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_FINAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_FOR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_FOREACH' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_FUNCTION' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_FUNC_C' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_GLOBAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_GOTO' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_GT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_HALT_COMPILER' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IF' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IMPLEMENTS' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INC' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INCLUDE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INCLUDE_ONCE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INLINE_HTML' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INSTANCEOF' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INSTEADOF' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INTERFACE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_INT_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_ISSET' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IS_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IS_GREATER_OR_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IS_IDENTICAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IS_NOT_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IS_NOT_IDENTICAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_IS_SMALLER_OR_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_Includes' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LINE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LIST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LNUMBER' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LOGICAL_AND' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LOGICAL_OR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LOGICAL_XOR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_LT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_METHOD_C' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_MINUS' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_MINUS_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_MOD_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_MULT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_MUL_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_NAMESPACE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_NEW' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_NS_C' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_NS_SEPARATOR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_NUM_STRING' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OBJECT_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OBJECT_OPERATOR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OPEN_BRACKET' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OPEN_CURLY' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OPEN_SQUARE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OPEN_TAG' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OPEN_TAG_WITH_ECHO' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_OR_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PERCENT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PIPE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PLUS' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PLUS_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PRINT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PRIVATE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PROTECTED' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_PUBLIC' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_QUESTION_MARK' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_REQUIRE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_REQUIRE_ONCE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_RETURN' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_SEMICOLON' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_SL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_SL_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_SR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_SR_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_START_HEREDOC' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_STATIC' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_STRING' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_STRING_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_STRING_VARNAME' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_SWITCH' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_Stream' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token/Stream.php',
+    'PHP_Token_Stream_CachingFactory' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token/Stream/CachingFactory.php',
+    'PHP_Token_THROW' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_TILDE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_TRAIT' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_TRAIT_C' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_TRY' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_UNSET' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_UNSET_CAST' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_USE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_VAR' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_VARIABLE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_WHILE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_WHITESPACE' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
+    'PHP_Token_XOR_EQUAL' => $baseDir . '/vendor/phpunit/php-token-stream/PHP/Token.php',
     'SessionHandlerInterface' => $baseDir . '/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php',
+    'Text_Template' => $baseDir . '/vendor/phpunit/php-text-template/Text/Template.php',
 );
diff --git a/core/vendor/composer/autoload_real.php b/core/vendor/composer/autoload_real.php
index b67069e..5d378cc 100644
--- a/core/vendor/composer/autoload_real.php
+++ b/core/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php generated by Composer
 
-class ComposerAutoloaderInitf05567eba27abe19ce0204f90ff18248
+class ComposerAutoloaderInit7ff6703a948fec33ad3ec525166a5755
 {
     private static $loader;
 
@@ -19,13 +19,17 @@ public static function getLoader()
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInitf05567eba27abe19ce0204f90ff18248', 'loadClassLoader'));
+        spl_autoload_register(array('ComposerAutoloaderInit7ff6703a948fec33ad3ec525166a5755', 'loadClassLoader'));
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInitf05567eba27abe19ce0204f90ff18248', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit7ff6703a948fec33ad3ec525166a5755', 'loadClassLoader'));
 
         $vendorDir = dirname(__DIR__);
         $baseDir = dirname($vendorDir);
 
+        $includePaths = require __DIR__ . '/include_paths.php';
+        array_push($includePaths, get_include_path());
+        set_include_path(join(PATH_SEPARATOR, $includePaths));
+
         $map = require __DIR__ . '/autoload_namespaces.php';
         foreach ($map as $namespace => $path) {
             $loader->add($namespace, $path);
@@ -38,6 +42,8 @@ public static function getLoader()
 
         $loader->register(true);
 
+        require $vendorDir . '/phpunit/phpunit/PHPUnit/Autoload.php';
+
         return $loader;
     }
 }
diff --git a/core/vendor/composer/include_paths.php b/core/vendor/composer/include_paths.php
new file mode 100644
index 0000000..533f1c8
--- /dev/null
+++ b/core/vendor/composer/include_paths.php
@@ -0,0 +1,17 @@
+<?php
+
+// include_paths.php generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    $vendorDir . '/phpunit/php-text-template/',
+    $vendorDir . '/phpunit/phpunit-mock-objects/',
+    $vendorDir . '/phpunit/php-timer/',
+    $vendorDir . '/phpunit/php-token-stream/',
+    $vendorDir . '/phpunit/php-file-iterator/',
+    $vendorDir . '/phpunit/php-code-coverage/',
+    $vendorDir . '/phpunit/phpunit/',
+    $vendorDir . '/phpunit/phpunit/../../symfony/yaml',
+);
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index 5b3d732..a10d21c 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -388,7 +388,7 @@
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/HttpKernel/archive/v2.2.0-BETA2.zip",
+            "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/v2.2.0-BETA2",
             "reference": "v2.2.0-BETA2",
             "shasum": ""
         },
@@ -459,7 +459,7 @@
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/Routing/archive/v2.2.0-BETA2.zip",
+            "url": "https://api.github.com/repos/symfony/Routing/zipball/v2.2.0-BETA2",
             "reference": "v2.2.0-BETA2",
             "shasum": ""
         },
@@ -509,57 +509,6 @@
         "homepage": "http://symfony.com"
     },
     {
-        "name": "symfony-cmf/routing",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
-        "target-dir": "Symfony/Cmf/Component/Routing",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/symfony-cmf/Routing",
-            "reference": "ea4a10"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/72df1da07b3c4edf16df169fb7987f504070fe0d",
-            "reference": "ea4a10",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.3.2",
-            "symfony/routing": ">=2.1,<2.3-dev",
-            "symfony/http-kernel": ">=2.1,<2.3-dev"
-        },
-        "time": "2013-01-24 16:09:01",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0-dev"
-            }
-        },
-        "installation-source": "source",
-        "autoload": {
-            "psr-0": {
-                "Symfony\\Cmf\\Component\\Routing": ""
-            }
-        },
-        "notification-url": "https://packagist.org/downloads/",
-        "license": [
-            "MIT"
-        ],
-        "authors": [
-            {
-                "name": "Symfony CMF Community",
-                "homepage": "https://github.com/symfony-cmf/Routing/contributors"
-            }
-        ],
-        "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
-        "homepage": "http://cmf.symfony.com",
-        "keywords": [
-            "database",
-            "routing"
-        ]
-    },
-    {
         "name": "easyrdf/easyrdf",
         "version": "0.8.0-beta.1",
         "version_normalized": "0.8.0.0-beta1",
@@ -616,76 +565,319 @@
         ]
     },
     {
-        "name": "symfony/class-loader",
-        "version": "v2.2.0-BETA2",
-        "version_normalized": "2.2.0.0-beta2",
-        "target-dir": "Symfony/Component/ClassLoader",
+        "name": "phpunit/php-text-template",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/ClassLoader",
-            "reference": "v2.2.0-BETA2"
+            "url": "git://github.com/sebastianbergmann/php-text-template.git",
+            "reference": "1eeef106193d2f8c539728e566bb4793071a9e18"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/ClassLoader/archive/v2.2.0-BETA2.zip",
-            "reference": "v2.2.0-BETA2",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/1eeef106193d2f8c539728e566bb4793071a9e18",
+            "reference": "1eeef106193d2f8c539728e566bb4793071a9e18",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
-        "require-dev": {
-            "symfony/finder": "2.2.*"
+        "time": "2013-01-07 10:56:17",
+        "type": "library",
+        "installation-source": "source",
+        "autoload": {
+            "classmap": [
+                "Text/"
+            ]
         },
-        "time": "2013-01-23 20:21:00",
+        "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            ""
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sb@sebastian-bergmann.de",
+                "role": "lead"
+            }
+        ],
+        "description": "Simple template engine.",
+        "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+        "keywords": [
+            "template"
+        ]
+    },
+    {
+        "name": "phpunit/phpunit-mock-objects",
+        "version": "1.2.x-dev",
+        "version_normalized": "1.2.9999999.9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "git://github.com/sebastianbergmann/phpunit-mock-objects.git",
+            "reference": "d49b5683200b5db9b1c64cb06f52f50d147891c4"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/d49b5683200b5db9b1c64cb06f52f50d147891c4",
+            "reference": "d49b5683200b5db9b1c64cb06f52f50d147891c4",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3",
+            "phpunit/php-text-template": ">=1.1.1@stable"
+        },
+        "suggest": {
+            "ext-soap": "*"
+        },
+        "time": "2013-02-05 07:46:41",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.2-dev"
+        "installation-source": "source",
+        "autoload": {
+            "classmap": [
+                "PHPUnit/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            ""
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sb@sebastian-bergmann.de",
+                "role": "lead"
             }
+        ],
+        "description": "Mock Object library for PHPUnit",
+        "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+        "keywords": [
+            "mock",
+            "xunit"
+        ]
+    },
+    {
+        "name": "phpunit/php-timer",
+        "version": "1.0.x-dev",
+        "version_normalized": "1.0.9999999.9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "git://github.com/sebastianbergmann/php-timer.git",
+            "reference": "ecf7920b27003a9412b07dad79dbb5ad1249e6c3"
         },
-        "installation-source": "dist",
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/ecf7920b27003a9412b07dad79dbb5ad1249e6c3",
+            "reference": "ecf7920b27003a9412b07dad79dbb5ad1249e6c3",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2013-01-30 06:08:51",
+        "type": "library",
+        "installation-source": "source",
         "autoload": {
-            "psr-0": {
-                "Symfony\\Component\\ClassLoader\\": ""
+            "classmap": [
+                "PHP/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            ""
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sb@sebastian-bergmann.de",
+                "role": "lead"
             }
+        ],
+        "description": "Utility class for timing",
+        "homepage": "https://github.com/sebastianbergmann/php-timer/",
+        "keywords": [
+            "timer"
+        ]
+    },
+    {
+        "name": "phpunit/php-token-stream",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "git://github.com/sebastianbergmann/php-token-stream.git",
+            "reference": "c25dd88e1592e66dee2553c99ef244203d5a1b98"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c25dd88e1592e66dee2553c99ef244203d5a1b98",
+            "reference": "c25dd88e1592e66dee2553c99ef244203d5a1b98",
+            "shasum": ""
+        },
+        "require": {
+            "ext-tokenizer": "*",
+            "php": ">=5.3.3"
+        },
+        "time": "2013-01-07 10:56:35",
+        "type": "library",
+        "installation-source": "source",
+        "autoload": {
+            "classmap": [
+                "PHP/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            ""
+        ],
         "license": [
-            "MIT"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@symfony.com"
-            },
+                "name": "Sebastian Bergmann",
+                "email": "sb@sebastian-bergmann.de",
+                "role": "lead"
+            }
+        ],
+        "description": "Wrapper around PHP's tokenizer extension.",
+        "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+        "keywords": [
+            "tokenizer"
+        ]
+    },
+    {
+        "name": "phpunit/php-file-iterator",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "git://github.com/sebastianbergmann/php-file-iterator.git",
+            "reference": "2deb24c65ea78e126daa8d45b2089ddc29ec1d26"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2deb24c65ea78e126daa8d45b2089ddc29ec1d26",
+            "reference": "2deb24c65ea78e126daa8d45b2089ddc29ec1d26",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2013-01-07 10:47:05",
+        "type": "library",
+        "installation-source": "source",
+        "autoload": {
+            "classmap": [
+                "File/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            ""
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "http://symfony.com/contributors"
+                "name": "Sebastian Bergmann",
+                "email": "sb@sebastian-bergmann.de",
+                "role": "lead"
             }
         ],
-        "description": "Symfony ClassLoader Component",
-        "homepage": "http://symfony.com"
+        "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+        "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+        "keywords": [
+            "filesystem",
+            "iterator"
+        ]
     },
     {
-        "name": "symfony/yaml",
+        "name": "phpunit/php-code-coverage",
+        "version": "1.2.x-dev",
+        "version_normalized": "1.2.9999999.9999999-dev",
+        "source": {
+            "type": "git",
+            "url": "git://github.com/sebastianbergmann/php-code-coverage.git",
+            "reference": "ec7f6f388ca315b6520f61be670ff82fa6ce68fb"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ec7f6f388ca315b6520f61be670ff82fa6ce68fb",
+            "reference": "ec7f6f388ca315b6520f61be670ff82fa6ce68fb",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3",
+            "phpunit/php-file-iterator": ">=1.3.0@stable",
+            "phpunit/php-token-stream": ">=1.1.3@stable",
+            "phpunit/php-text-template": ">=1.1.1@stable"
+        },
+        "suggest": {
+            "ext-dom": "*",
+            "ext-xdebug": ">=2.0.5"
+        },
+        "time": "2013-01-07 10:45:42",
+        "type": "library",
+        "installation-source": "source",
+        "autoload": {
+            "classmap": [
+                "PHP/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "include-path": [
+            ""
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sb@sebastian-bergmann.de",
+                "role": "lead"
+            }
+        ],
+        "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+        "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+        "keywords": [
+            "testing",
+            "coverage",
+            "xunit"
+        ]
+    },
+    {
+        "name": "symfony/class-loader",
         "version": "v2.2.0-BETA2",
         "version_normalized": "2.2.0.0-beta2",
-        "target-dir": "Symfony/Component/Yaml",
+        "target-dir": "Symfony/Component/ClassLoader",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/Yaml",
+            "url": "https://github.com/symfony/ClassLoader",
             "reference": "v2.2.0-BETA2"
         },
         "dist": {
             "type": "zip",
-            "url": "https://github.com/symfony/Yaml/archive/v2.2.0-BETA2.zip",
+            "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/v2.2.0-BETA2",
             "reference": "v2.2.0-BETA2",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3"
         },
+        "require-dev": {
+            "symfony/finder": "2.2.*"
+        },
         "time": "2013-01-23 20:21:00",
         "type": "library",
         "extra": {
@@ -696,7 +888,7 @@
         "installation-source": "dist",
         "autoload": {
             "psr-0": {
-                "Symfony\\Component\\Yaml\\": ""
+                "Symfony\\Component\\ClassLoader\\": ""
             }
         },
         "notification-url": "https://packagist.org/downloads/",
@@ -713,7 +905,7 @@
                 "homepage": "http://symfony.com/contributors"
             }
         ],
-        "description": "Symfony Yaml Component",
+        "description": "Symfony ClassLoader Component",
         "homepage": "http://symfony.com"
     },
     {
@@ -1141,5 +1333,182 @@
             "client",
             "Guzzle"
         ]
+    },
+    {
+        "name": "symfony/yaml",
+        "version": "v2.2.0-BETA2",
+        "version_normalized": "2.2.0.0-beta2",
+        "target-dir": "Symfony/Component/Yaml",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/Yaml",
+            "reference": "v2.2.0-BETA2"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/Yaml/zipball/v2.2.0-BETA2",
+            "reference": "v2.2.0-BETA2",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2013-01-23 20:21:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.2-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Component\\Yaml\\": ""
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Fabien Potencier",
+                "email": "fabien@symfony.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "http://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony Yaml Component",
+        "homepage": "http://symfony.com"
+    },
+    {
+        "name": "phpunit/phpunit",
+        "version": "3.7.0",
+        "version_normalized": "3.7.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/msonnabaum/phpunit.git",
+            "reference": "3.7.0"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/msonnabaum/phpunit/zipball/3.7.0",
+            "reference": "3.7.0",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3",
+            "phpunit/php-file-iterator": ">=1.3.1@stable",
+            "phpunit/php-text-template": ">=1.1.1@stable",
+            "phpunit/php-code-coverage": ">=1.2.0@stable",
+            "phpunit/php-timer": ">=1.0.2@stable",
+            "phpunit/phpunit-mock-objects": ">=1.2.0@stable",
+            "symfony/yaml": ">=2.1.0@stable",
+            "ext-dom": "*",
+            "ext-pcre": "*",
+            "ext-reflection": "*",
+            "ext-spl": "*"
+        },
+        "suggest": {
+            "phpunit/php-invoker": ">=1.1.0@stable",
+            "ext-json": "*",
+            "ext-simplexml": "*",
+            "ext-tokenizer": "*"
+        },
+        "time": "2012-09-19 05:07:48",
+        "bin": [
+            "composer/bin/phpunit"
+        ],
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.7.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "PHPUnit/Autoload.php"
+            ]
+        },
+        "include-path": [
+            "",
+            "../../symfony/yaml/"
+        ],
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@phpunit.de",
+                "role": "lead"
+            }
+        ],
+        "description": "The PHP Unit Testing framework.",
+        "homepage": "http://www.phpunit.de/",
+        "keywords": [
+            "phpunit",
+            "xunit",
+            "testing"
+        ],
+        "support": {
+            "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+            "irc": "irc://irc.freenode.net/phpunit",
+            "source": "https://github.com/msonnabaum/phpunit/tree/3.7.0"
+        }
+    },
+    {
+        "name": "symfony-cmf/routing",
+        "version": "dev-master",
+        "version_normalized": "9999999-dev",
+        "target-dir": "Symfony/Cmf/Component/Routing",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony-cmf/Routing",
+            "reference": "ea4a10"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/72df1da07b3c4edf16df169fb7987f504070fe0d",
+            "reference": "ea4a10",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.2",
+            "symfony/routing": ">=2.1,<2.3-dev",
+            "symfony/http-kernel": ">=2.1,<2.3-dev"
+        },
+        "time": "2013-01-24 16:09:01",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0-dev"
+            }
+        },
+        "installation-source": "source",
+        "autoload": {
+            "psr-0": {
+                "Symfony\\Cmf\\Component\\Routing": ""
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Symfony CMF Community",
+                "homepage": "https://github.com/symfony-cmf/Routing/contributors"
+            }
+        ],
+        "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
+        "homepage": "http://cmf.symfony.com",
+        "keywords": [
+            "database",
+            "routing"
+        ]
     }
 ]
diff --git a/core/vendor/phpunit/php-code-coverage/.gitattributes b/core/vendor/phpunit/php-code-coverage/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/php-code-coverage/.travis.yml b/core/vendor/phpunit/php-code-coverage/.travis.yml
new file mode 100644
index 0000000..1e089eb
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/.travis.yml
@@ -0,0 +1,24 @@
+language: php
+
+php:
+    - 5.3
+    - 5.4
+
+before_script:
+    - mkdir -p vendor/SebastianBergmann
+    - git clone --branch=3.7 --depth=100 --quiet git://github.com/sebastianbergmann/phpunit.git vendor/phpunit
+    - git clone --branch=1.2 --depth=100 --quiet git://github.com/sebastianbergmann/phpunit-mock-objects.git vendor/phpunit-mock-objects
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-text-template.git vendor/php-text-template
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-token-stream.git vendor/php-token-stream
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-file-iterator.git vendor/php-file-iterator
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-timer.git vendor/php-timer
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/version.git vendor/version
+    - ln -s ~/builds/sebastianbergmann/php-code-coverage/vendor/version/src ~/builds/sebastianbergmann/php-code-coverage/vendor/SebastianBergmann/Version
+    - git clone --branch=master --depth=100 --quiet git://github.com/pear/pear-core.git vendor/pear-core
+    - git clone --branch=trunk --depth=100 --quiet git://github.com/pear/Console_Getopt.git vendor/console-getopt
+
+script: php -d include_path=vendor/php-text-template:vendor/php-token-stream:vendor/php-file-iterator:vendor/phpunit:vendor/phpunit-mock-objects:vendor/php-timer:vendor/php-invoker:vendor/pear-core:vendor/console-getopt:vendor:. ./vendor/phpunit/phpunit.php --configuration ./build/travis-ci.xml
+
+notifications:
+  email: false
+  irc: "irc.freenode.org#phpunit"
diff --git a/core/vendor/phpunit/php-code-coverage/ChangeLog.markdown b/core/vendor/phpunit/php-code-coverage/ChangeLog.markdown
new file mode 100644
index 0000000..273fa03
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/ChangeLog.markdown
@@ -0,0 +1,55 @@
+PHP_CodeCoverage 1.2
+====================
+
+This is the list of changes for the PHP_CodeCoverage 1.2 release series.
+
+PHP_CodeCoverage 1.2.7
+----------------------
+
+* The `html5shiv.js` is now bundled.
+* Fixed sebastianbergmann/phpunit#702: `@coversNothing` didn't work as documented.
+
+PHP_CodeCoverage 1.2.6
+----------------------
+
+* Fixed #126: `E_NOTICE` thrown when generating coverage report.
+
+PHP_CodeCoverage 1.2.5
+----------------------
+
+* Fixed regression introduced in PHP_CodeCoverage 1.2.4.
+
+PHP_CodeCoverage 1.2.4
+----------------------
+
+* Fixed #123: Incorrect code coverage for interfaces.
+
+PHP_CodeCoverage 1.2.3
+----------------------
+
+* Implemented #116: Do not rely on autoloader class map to populate blacklist.
+* Added support for parentheses after method names in the `@covers` annotation.
+* When `addUncoveredFilesFromWhitelist=FALSE` is set then files that are whitelisted but not covered by a single test are now excluded from the code coverage.
+* Fixed #81: Non-english locales broke the coverage bars in the HTML report.
+* Fixed #118: Percentage for tested classes and traits displayed incorrectly.
+* Fixed #121: One line `@covers` annotations did not work.
+
+PHP_CodeCoverage 1.2.2
+----------------------
+
+* Fixed #115: Backwards compatibility wrapper for `trait_exists()` does not work.
+
+PHP_CodeCoverage 1.2.1
+----------------------
+
+* Fixed invalid markup in the HTML report.
+* The version number is now displayed when using PHP_CodeCoverage from a Composer install or Git checkout.
+
+PHP_CodeCoverage 1.2.0
+----------------------
+
+* The HTML report has been redesigned.
+* The new `@coversDefaultClass` annotation enables short `@covers` annotations when working with long class names or namespaces.
+* The new `@coversNothing` annotation can be used so tests do not record any code coverage. Useful for integration testing. 
+* When `processUncoveredFilesFromWhitelist=FALSE` is set then files that are whitelisted but not covered by a single test are now included in the code coverage but with all lines, including those that are not executable, counted as not executed.
+* PHP_CodeCoverage 1.2 is only supported on PHP 5.3.3 (or later) and PHP 5.4.7 (or later) is highly recommended.
diff --git a/core/vendor/phpunit/php-code-coverage/LICENSE b/core/vendor/phpunit/php-code-coverage/LICENSE
new file mode 100644
index 0000000..95d1822
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/LICENSE
@@ -0,0 +1,33 @@
+PHP_CodeCoverage
+
+Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php
new file mode 100644
index 0000000..7f051f2
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php
@@ -0,0 +1,801 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+// @codeCoverageIgnoreStart
+// @codingStandardsIgnoreStart
+/**
+ * @SuppressWarnings(PHPMD)
+ */
+if (!function_exists('trait_exists')) {
+    function trait_exists($name)
+    {
+        return FALSE;
+    }
+}
+// @codingStandardsIgnoreEnd
+// @codeCoverageIgnoreEnd
+
+/**
+ * Provides collection functionality for PHP code coverage information.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage
+{
+    /**
+     * @var PHP_CodeCoverage_Driver
+     */
+    protected $driver;
+
+    /**
+     * @var PHP_CodeCoverage_Filter
+     */
+    protected $filter;
+
+    /**
+     * @var boolean
+     */
+    protected $cacheTokens = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $forceCoversAnnotation = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $mapTestClassNameToCoveredClassName = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $addUncoveredFilesFromWhitelist = TRUE;
+
+    /**
+     * @var boolean
+     */
+    protected $processUncoveredFilesFromWhitelist = FALSE;
+
+    /**
+     * @var mixed
+     */
+    protected $currentId;
+
+    /**
+     * Code coverage data.
+     *
+     * @var array
+     */
+    protected $data = array();
+
+    /**
+     * Test data.
+     *
+     * @var array
+     */
+    protected $tests = array();
+
+    /**
+     * Constructor.
+     *
+     * @param PHP_CodeCoverage_Driver $driver
+     * @param PHP_CodeCoverage_Filter $filter
+     */
+    public function __construct(PHP_CodeCoverage_Driver $driver = NULL, PHP_CodeCoverage_Filter $filter = NULL)
+    {
+        if ($driver === NULL) {
+            $driver = new PHP_CodeCoverage_Driver_Xdebug;
+        }
+
+        if ($filter === NULL) {
+            $filter = new PHP_CodeCoverage_Filter;
+        }
+
+        $this->driver = $driver;
+        $this->filter = $filter;
+    }
+
+    /**
+     * Returns the PHP_CodeCoverage_Report_Node_* object graph
+     * for this PHP_CodeCoverage object.
+     *
+     * @return PHP_CodeCoverage_Report_Node_Directory
+     * @since  Method available since Release 1.1.0
+     */
+    public function getReport()
+    {
+        $factory = new PHP_CodeCoverage_Report_Factory;
+
+        return $factory->create($this);
+    }
+
+    /**
+     * Clears collected code coverage data.
+     */
+    public function clear()
+    {
+        $this->currentId = NULL;
+        $this->data      = array();
+        $this->tests     = array();
+    }
+
+    /**
+     * Returns the PHP_CodeCoverage_Filter used.
+     *
+     * @return PHP_CodeCoverage_Filter
+     */
+    public function filter()
+    {
+        return $this->filter;
+    }
+
+    /**
+     * Returns the collected code coverage data.
+     *
+     * @return array
+     * @since  Method available since Release 1.1.0
+     */
+    public function getData()
+    {
+        if ($this->addUncoveredFilesFromWhitelist) {
+            $this->addUncoveredFilesFromWhitelist();
+        }
+
+        // We need to apply the blacklist filter a second time
+        // when no whitelist is used.
+        if (!$this->filter->hasWhitelist()) {
+            $this->applyListsFilter($this->data);
+        }
+
+        return $this->data;
+    }
+
+    /**
+     * Returns the test data.
+     *
+     * @return array
+     * @since  Method available since Release 1.1.0
+     */
+    public function getTests()
+    {
+        return $this->tests;
+    }
+
+    /**
+     * Start collection of code coverage information.
+     *
+     * @param  mixed   $id
+     * @param  boolean $clear
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function start($id, $clear = FALSE)
+    {
+        if (!is_bool($clear)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        if ($clear) {
+            $this->clear();
+        }
+
+        $this->currentId = $id;
+
+        $this->driver->start();
+    }
+
+    /**
+     * Stop collection of code coverage information.
+     *
+     * @param  boolean $append
+     * @return array
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function stop($append = TRUE)
+    {
+        if (!is_bool($append)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        $data = $this->driver->stop();
+        $this->append($data, NULL, $append);
+
+        $this->currentId = NULL;
+
+        return $data;
+    }
+
+    /**
+     * Appends code coverage data.
+     *
+     * @param array   $data
+     * @param mixed   $id
+     * @param boolean $append
+     */
+    public function append(array $data, $id = NULL, $append = TRUE)
+    {
+        if ($id === NULL) {
+            $id = $this->currentId;
+        }
+
+        if ($id === NULL) {
+            throw new PHP_CodeCoverage_Exception;
+        }
+
+        $this->applyListsFilter($data);
+        $this->initializeFilesThatAreSeenTheFirstTime($data);
+
+        if (!$append) {
+            return;
+        }
+
+        if ($id != 'UNCOVERED_FILES_FROM_WHITELIST') {
+            $this->applyCoversAnnotationFilter($data, $id);
+        }
+
+        if (empty($data)) {
+            return;
+        }
+
+        $status = NULL;
+
+        if ($id instanceof PHPUnit_Framework_TestCase) {
+            $status = $id->getStatus();
+            $id     = get_class($id) . '::' . $id->getName();
+        }
+
+        else if ($id instanceof PHPUnit_Extensions_PhptTestCase) {
+            $id = $id->getName();
+        }
+
+        $this->tests[$id] = $status;
+
+        foreach ($data as $file => $lines) {
+            if (!$this->filter->isFile($file)) {
+                continue;
+            }
+
+            foreach ($lines as $k => $v) {
+                if ($v == 1) {
+                    $this->data[$file][$k][] = $id;
+                }
+            }
+        }
+    }
+
+    /**
+     * Merges the data from another instance of PHP_CodeCoverage.
+     *
+     * @param PHP_CodeCoverage $that
+     */
+    public function merge(PHP_CodeCoverage $that)
+    {
+        foreach ($that->data as $file => $lines) {
+            if (!isset($this->data[$file])) {
+                if (!$this->filter->isFiltered($file)) {
+                    $this->data[$file] = $lines;
+                }
+
+                continue;
+            }
+
+            foreach ($lines as $line => $data) {
+                if ($data !== NULL) {
+                    if (!isset($this->data[$file][$line])) {
+                        $this->data[$file][$line] = $data;
+                    } else {
+                        $this->data[$file][$line] = array_unique(
+                          array_merge($this->data[$file][$line], $data)
+                        );
+                    }
+                }
+            }
+        }
+
+        $this->tests = array_merge($this->tests, $that->getTests());
+    }
+
+    /**
+     * @param  boolean $flag
+     * @throws PHP_CodeCoverage_Exception
+     * @since  Method available since Release 1.1.0
+     */
+    public function setCacheTokens($flag)
+    {
+        if (!is_bool($flag)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        $this->cacheTokens = $flag;
+    }
+
+    /**
+     * @param boolean $flag
+     * @since Method available since Release 1.1.0
+     */
+    public function getCacheTokens()
+    {
+        return $this->cacheTokens;
+    }
+
+    /**
+     * @param  boolean $flag
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function setForceCoversAnnotation($flag)
+    {
+        if (!is_bool($flag)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        $this->forceCoversAnnotation = $flag;
+    }
+
+    /**
+     * @param  boolean $flag
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function setMapTestClassNameToCoveredClassName($flag)
+    {
+        if (!is_bool($flag)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        $this->mapTestClassNameToCoveredClassName = $flag;
+    }
+
+    /**
+     * @param  boolean $flag
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function setAddUncoveredFilesFromWhitelist($flag)
+    {
+        if (!is_bool($flag)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        $this->addUncoveredFilesFromWhitelist = $flag;
+    }
+
+    /**
+     * @param  boolean $flag
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function setProcessUncoveredFilesFromWhitelist($flag)
+    {
+        if (!is_bool($flag)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        $this->processUncoveredFilesFromWhitelist = $flag;
+    }
+
+    /**
+     * Applies the @covers annotation filtering.
+     *
+     * @param array $data
+     * @param mixed $id
+     */
+    protected function applyCoversAnnotationFilter(&$data, $id)
+    {
+        if ($id instanceof PHPUnit_Framework_TestCase) {
+            $testClassName    = get_class($id);
+            $linesToBeCovered = $this->getLinesToBeCovered(
+              $testClassName, $id->getName()
+            );
+
+            if ($linesToBeCovered === FALSE) {
+                $data = array();
+                return;
+            }
+
+            if ($this->mapTestClassNameToCoveredClassName &&
+                empty($linesToBeCovered)) {
+                $testedClass = substr($testClassName, 0, -4);
+
+                if (class_exists($testedClass)) {
+                    $class = new ReflectionClass($testedClass);
+
+                    $linesToBeCovered = array(
+                      $class->getFileName() => range(
+                        $class->getStartLine(), $class->getEndLine()
+                      )
+                    );
+                }
+            }
+        } else {
+            $linesToBeCovered = array();
+        }
+
+        if (!empty($linesToBeCovered)) {
+            $data = array_intersect_key($data, $linesToBeCovered);
+
+            foreach (array_keys($data) as $filename) {
+                $data[$filename] = array_intersect_key(
+                  $data[$filename], array_flip($linesToBeCovered[$filename])
+                );
+            }
+        }
+
+        else if ($this->forceCoversAnnotation) {
+            $data = array();
+        }
+    }
+
+    /**
+     * Applies the blacklist/whitelist filtering.
+     *
+     * @param array $data
+     */
+    protected function applyListsFilter(&$data)
+    {
+        foreach (array_keys($data) as $filename) {
+            if ($this->filter->isFiltered($filename)) {
+                unset($data[$filename]);
+            }
+        }
+    }
+
+    /**
+     * @since Method available since Release 1.1.0
+     */
+    protected function initializeFilesThatAreSeenTheFirstTime($data)
+    {
+        foreach ($data as $file => $lines) {
+            if ($this->filter->isFile($file) && !isset($this->data[$file])) {
+                $this->data[$file] = array();
+
+                foreach ($lines as $k => $v) {
+                    $this->data[$file][$k] = $v == -2 ? NULL : array();
+                }
+            }
+        }
+    }
+
+    /**
+     * Processes whitelisted files that are not covered.
+     */
+    protected function addUncoveredFilesFromWhitelist()
+    {
+        $data           = array();
+        $uncoveredFiles = array_diff(
+          $this->filter->getWhitelist(), array_keys($this->data)
+        );
+
+        foreach ($uncoveredFiles as $uncoveredFile) {
+            if (!file_exists($uncoveredFile)) {
+                continue;
+            }
+
+            if ($this->processUncoveredFilesFromWhitelist) {
+                $this->processUncoveredFileFromWhitelist(
+                  $uncoveredFile, $data, $uncoveredFiles
+                );
+            } else {
+                $data[$uncoveredFile] = array();
+
+                $lines = count(file($uncoveredFile));
+
+                for ($i = 1; $i <= $lines; $i++) {
+                    $data[$uncoveredFile][$i] = -1;
+                }
+            }
+        }
+
+        $this->append($data, 'UNCOVERED_FILES_FROM_WHITELIST');
+    }
+
+    /**
+     * @param string $uncoveredFile
+     * @param array  $data
+     * @param array  $uncoveredFiles
+     */
+    protected function processUncoveredFileFromWhitelist($uncoveredFile, array &$data, array $uncoveredFiles)
+    {
+        $this->driver->start();
+        include_once $uncoveredFile;
+        $coverage = $this->driver->stop();
+
+        foreach ($coverage as $file => $fileCoverage) {
+            if (!isset($data[$file]) &&
+                in_array($file, $uncoveredFiles)) {
+                foreach (array_keys($fileCoverage) as $key) {
+                    if ($fileCoverage[$key] == 1) {
+                        $fileCoverage[$key] = -1;
+                    }
+                }
+
+                $data[$file] = $fileCoverage;
+            }
+        }
+    }
+
+    /**
+     * Returns the files and lines a test method wants to cover.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 1.2.0
+     */
+    protected function getLinesToBeCovered($className, $methodName)
+    {
+        $codeToCoverList = array();
+        $result          = array();
+
+        // @codeCoverageIgnoreStart
+        if (($pos = strpos($methodName, ' ')) !== FALSE) {
+            $methodName = substr($methodName, 0, $pos);
+        }
+        // @codeCoverageIgnoreEnd
+
+        $class = new ReflectionClass($className);
+
+        try {
+            $method = new ReflectionMethod($className, $methodName);
+        }
+
+        catch (ReflectionException $e) {
+            return array();
+        }
+
+        $docComment = substr($class->getDocComment(), 3, -2) . PHP_EOL . substr($method->getDocComment(), 3, -2);
+
+        $templateMethods = array(
+          'setUp', 'assertPreConditions', 'assertPostConditions', 'tearDown'
+        );
+
+        foreach ($templateMethods as $templateMethod) {
+            if ($class->hasMethod($templateMethod)) {
+                $reflector   = $class->getMethod($templateMethod);
+                $docComment .= PHP_EOL . substr($reflector->getDocComment(), 3, -2);
+                unset($reflector);
+            }
+        }
+
+        if (strpos($docComment, '@coversNothing') !== FALSE) {
+            return FALSE;
+        }
+
+        $classShortcut = preg_match_all(
+          '(@coversDefaultClass\s+(?P<coveredClass>.*?)\s*$)m',
+          $class->getDocComment(),
+          $matches
+        );
+
+        if ($classShortcut) {
+            if ($classShortcut > 1) {
+                throw new PHP_CodeCoverage_Exception(
+                  sprintf(
+                    'More than one @coversClass annotation in class or interface "%s".',
+                    $className
+                  )
+                );
+            }
+
+            $classShortcut = $matches['coveredClass'][0];
+        }
+
+        $match = preg_match_all(
+          '(@covers\s+(?P<coveredElement>.*?)\s*(\(\s*\))?\s*$)m',
+          $docComment,
+          $matches
+        );
+
+        if ($match) {
+            foreach ($matches['coveredElement'] as $coveredElement) {
+                if ($classShortcut && strncmp($coveredElement, '::', 2) === 0) {
+                    $coveredElement = $classShortcut . $coveredElement;
+                }
+
+                $codeToCoverList = array_merge(
+                  $codeToCoverList,
+                  $this->resolveCoversToReflectionObjects($coveredElement)
+                );
+            }
+
+            foreach ($codeToCoverList as $codeToCover) {
+                $fileName = $codeToCover->getFileName();
+
+                if (!isset($result[$fileName])) {
+                    $result[$fileName] = array();
+                }
+
+                $result[$fileName] = array_unique(
+                  array_merge(
+                    $result[$fileName],
+                    range(
+                      $codeToCover->getStartLine(), $codeToCover->getEndLine()
+                    )
+                  )
+                );
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * @param  string $coveredElement
+     * @return array
+     * @since  Method available since Release 1.2.0
+     */
+    protected function resolveCoversToReflectionObjects($coveredElement)
+    {
+        $codeToCoverList = array();
+
+        if (strpos($coveredElement, '::') !== FALSE) {
+            list($className, $methodName) = explode('::', $coveredElement);
+
+            if (isset($methodName[0]) && $methodName[0] == '<') {
+                $classes = array($className);
+
+                foreach ($classes as $className) {
+                    if (!class_exists($className) &&
+                        !interface_exists($className)) {
+                        throw new PHP_CodeCoverage_Exception(
+                          sprintf(
+                            'Trying to @cover not existing class or ' .
+                            'interface "%s".',
+                            $className
+                          )
+                        );
+                    }
+
+                    $class   = new ReflectionClass($className);
+                    $methods = $class->getMethods();
+                    $inverse = isset($methodName[1]) && $methodName[1] == '!';
+
+                    if (strpos($methodName, 'protected')) {
+                        $visibility = 'isProtected';
+                    }
+
+                    else if (strpos($methodName, 'private')) {
+                        $visibility = 'isPrivate';
+                    }
+
+                    else if (strpos($methodName, 'public')) {
+                        $visibility = 'isPublic';
+                    }
+
+                    foreach ($methods as $method) {
+                        if ($inverse && !$method->$visibility()) {
+                            $codeToCoverList[] = $method;
+                        }
+
+                        else if (!$inverse && $method->$visibility()) {
+                            $codeToCoverList[] = $method;
+                        }
+                    }
+                }
+            } else {
+                $classes = array($className);
+
+                foreach ($classes as $className) {
+                    if ($className == '' && function_exists($methodName)) {
+                        $codeToCoverList[] = new ReflectionFunction(
+                          $methodName
+                        );
+                    } else {
+                        if (!((class_exists($className) ||
+                               interface_exists($className) ||
+                               trait_exists($className)) &&
+                              method_exists($className, $methodName))) {
+                            throw new PHP_CodeCoverage_Exception(
+                              sprintf(
+                                'Trying to @cover not existing method "%s::%s".',
+                                $className,
+                                $methodName
+                              )
+                            );
+                        }
+
+                        $codeToCoverList[] = new ReflectionMethod(
+                          $className, $methodName
+                        );
+                    }
+                }
+            }
+        } else {
+            $extended = FALSE;
+
+            if (strpos($coveredElement, '<extended>') !== FALSE) {
+                $coveredElement = str_replace(
+                  '<extended>', '', $coveredElement
+                );
+
+                $extended = TRUE;
+            }
+
+            $classes = array($coveredElement);
+
+            if ($extended) {
+                $classes = array_merge(
+                  $classes,
+                  class_implements($coveredElement),
+                  class_parents($coveredElement)
+                );
+            }
+
+            foreach ($classes as $className) {
+                if (!class_exists($className) &&
+                    !interface_exists($className) &&
+                    !trait_exists($className)) {
+                    throw new PHP_CodeCoverage_Exception(
+                      sprintf(
+                        'Trying to @cover not existing class or ' .
+                        'interface "%s".',
+                        $className
+                      )
+                    );
+                }
+
+                $codeToCoverList[] = new ReflectionClass($className);
+            }
+        }
+
+        return $codeToCoverList;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php
new file mode 100644
index 0000000..3289140
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+require_once 'File/Iterator/Autoload.php';
+require_once 'PHP/Token/Stream/Autoload.php';
+require_once 'Text/Template/Autoload.php';
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'php_codecoverage' => '/CodeCoverage.php',
+            'php_codecoverage_driver' => '/CodeCoverage/Driver.php',
+            'php_codecoverage_driver_xdebug' => '/CodeCoverage/Driver/Xdebug.php',
+            'php_codecoverage_exception' => '/CodeCoverage/Exception.php',
+            'php_codecoverage_filter' => '/CodeCoverage/Filter.php',
+            'php_codecoverage_report_clover' => '/CodeCoverage/Report/Clover.php',
+            'php_codecoverage_report_factory' => '/CodeCoverage/Report/Factory.php',
+            'php_codecoverage_report_html' => '/CodeCoverage/Report/HTML.php',
+            'php_codecoverage_report_html_renderer' => '/CodeCoverage/Report/HTML/Renderer.php',
+            'php_codecoverage_report_html_renderer_dashboard' => '/CodeCoverage/Report/HTML/Renderer/Dashboard.php',
+            'php_codecoverage_report_html_renderer_directory' => '/CodeCoverage/Report/HTML/Renderer/Directory.php',
+            'php_codecoverage_report_html_renderer_file' => '/CodeCoverage/Report/HTML/Renderer/File.php',
+            'php_codecoverage_report_node' => '/CodeCoverage/Report/Node.php',
+            'php_codecoverage_report_node_directory' => '/CodeCoverage/Report/Node/Directory.php',
+            'php_codecoverage_report_node_file' => '/CodeCoverage/Report/Node/File.php',
+            'php_codecoverage_report_node_iterator' => '/CodeCoverage/Report/Node/Iterator.php',
+            'php_codecoverage_report_php' => '/CodeCoverage/Report/PHP.php',
+            'php_codecoverage_report_text' => '/CodeCoverage/Report/Text.php',
+            'php_codecoverage_util' => '/CodeCoverage/Util.php',
+            'php_codecoverage_util_invalidargumenthelper' => '/CodeCoverage/Util/InvalidArgumentHelper.php',
+            'php_codecoverage_version' => '/CodeCoverage/Version.php'
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php.in b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php.in
new file mode 100644
index 0000000..3df43be
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Autoload.php.in
@@ -0,0 +1,70 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+require_once 'File/Iterator/Autoload.php';
+require_once 'PHP/Token/Stream/Autoload.php';
+require_once 'Text/Template/Autoload.php';
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            ___CLASSLIST___
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver.php
new file mode 100644
index 0000000..5cd7912
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for code coverage drivers.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+interface PHP_CodeCoverage_Driver
+{
+    /**
+     * Start collection of code coverage information.
+     */
+    public function start();
+
+    /**
+     * Stop collection of code coverage information.
+     *
+     * @return array
+     */
+    public function stop();
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver/Xdebug.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver/Xdebug.php
new file mode 100644
index 0000000..a169a22
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Driver/Xdebug.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Driver for Xdebug's code coverage functionality.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ * @codeCoverageIgnore
+ */
+class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver
+{
+    /**
+     * Constructor.
+     */
+    public function __construct()
+    {
+        if (!extension_loaded('xdebug')) {
+            throw new PHP_CodeCoverage_Exception('Xdebug is not loaded.');
+        }
+
+        if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') &&
+            !ini_get('xdebug.coverage_enable')) {
+            throw new PHP_CodeCoverage_Exception(
+              'You need to set xdebug.coverage_enable=On in your php.ini.'
+            );
+        }
+    }
+
+    /**
+     * Start collection of code coverage information.
+     */
+    public function start()
+    {
+        xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE);
+    }
+
+    /**
+     * Stop collection of code coverage information.
+     *
+     * @return array
+     */
+    public function stop()
+    {
+        $codeCoverage = xdebug_get_code_coverage();
+        xdebug_stop_code_coverage();
+
+        return $codeCoverage;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Exception.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Exception.php
new file mode 100644
index 0000000..412a4e1
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Exception.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Exception class for PHP_CodeCoverage component.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Exception extends RuntimeException
+{
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Filter.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Filter.php
new file mode 100644
index 0000000..966a0b9
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Filter.php
@@ -0,0 +1,343 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Filter for blacklisting and whitelisting of code coverage information.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_Filter
+{
+    /**
+     * Source files that are blacklisted.
+     *
+     * @var array
+     */
+    protected $blacklistedFiles = array();
+
+    /**
+     * Source files that are whitelisted.
+     *
+     * @var array
+     */
+    protected $whitelistedFiles = array();
+
+    /**
+     * @var boolean
+     */
+    protected $blacklistPrefilled = FALSE;
+
+    /**
+     * Adds a directory to the blacklist (recursively).
+     *
+     * @param string $directory
+     * @param string $suffix
+     * @param string $prefix
+     */
+    public function addDirectoryToBlacklist($directory, $suffix = '.php', $prefix = '')
+    {
+        $facade = new File_Iterator_Facade;
+        $files  = $facade->getFilesAsArray(
+          $directory, $suffix, $prefix
+        );
+
+        foreach ($files as $file) {
+            $this->addFileToBlacklist($file);
+        }
+    }
+
+    /**
+     * Adds a file to the blacklist.
+     *
+     * @param string $filename
+     */
+    public function addFileToBlacklist($filename)
+    {
+        $this->blacklistedFiles[realpath($filename)] = TRUE;
+    }
+
+    /**
+     * Adds files to the blacklist.
+     *
+     * @param array $files
+     */
+    public function addFilesToBlacklist(array $files)
+    {
+        foreach ($files as $file) {
+            $this->addFileToBlacklist($file);
+        }
+    }
+
+    /**
+     * Removes a directory from the blacklist (recursively).
+     *
+     * @param string $directory
+     * @param string $suffix
+     * @param string $prefix
+     */
+    public function removeDirectoryFromBlacklist($directory, $suffix = '.php', $prefix = '')
+    {
+        $facade = new File_Iterator_Facade;
+        $files  = $facade->getFilesAsArray(
+          $directory, $suffix, $prefix
+        );
+
+        foreach ($files as $file) {
+            $this->removeFileFromBlacklist($file);
+        }
+    }
+
+    /**
+     * Removes a file from the blacklist.
+     *
+     * @param string $filename
+     */
+    public function removeFileFromBlacklist($filename)
+    {
+        $filename = realpath($filename);
+
+        if (isset($this->blacklistedFiles[$filename])) {
+            unset($this->blacklistedFiles[$filename]);
+        }
+    }
+
+    /**
+     * Adds a directory to the whitelist (recursively).
+     *
+     * @param string $directory
+     * @param string $suffix
+     * @param string $prefix
+     */
+    public function addDirectoryToWhitelist($directory, $suffix = '.php', $prefix = '')
+    {
+        $facade = new File_Iterator_Facade;
+        $files  = $facade->getFilesAsArray(
+          $directory, $suffix, $prefix
+        );
+
+        foreach ($files as $file) {
+            $this->addFileToWhitelist($file);
+        }
+    }
+
+    /**
+     * Adds a file to the whitelist.
+     *
+     * @param string $filename
+     */
+    public function addFileToWhitelist($filename)
+    {
+        $this->whitelistedFiles[realpath($filename)] = TRUE;
+    }
+
+    /**
+     * Adds files to the whitelist.
+     *
+     * @param array $files
+     */
+    public function addFilesToWhitelist(array $files)
+    {
+        foreach ($files as $file) {
+            $this->addFileToWhitelist($file);
+        }
+    }
+
+    /**
+     * Removes a directory from the whitelist (recursively).
+     *
+     * @param string $directory
+     * @param string $suffix
+     * @param string $prefix
+     */
+    public function removeDirectoryFromWhitelist($directory, $suffix = '.php', $prefix = '')
+    {
+        $facade = new File_Iterator_Facade;
+        $files  = $facade->getFilesAsArray(
+          $directory, $suffix, $prefix
+        );
+
+        foreach ($files as $file) {
+            $this->removeFileFromWhitelist($file);
+        }
+    }
+
+    /**
+     * Removes a file from the whitelist.
+     *
+     * @param string $filename
+     */
+    public function removeFileFromWhitelist($filename)
+    {
+        $filename = realpath($filename);
+
+        if (isset($this->whitelistedFiles[$filename])) {
+            unset($this->whitelistedFiles[$filename]);
+        }
+    }
+
+    /**
+     * Checks whether a filename is a real filename.
+     *
+     * @param string $filename
+     */
+    public function isFile($filename)
+    {
+        if ($filename == '-' ||
+            strpos($filename, 'eval()\'d code') !== FALSE ||
+            strpos($filename, 'runtime-created function') !== FALSE ||
+            strpos($filename, 'runkit created function') !== FALSE ||
+            strpos($filename, 'assert code') !== FALSE ||
+            strpos($filename, 'regexp code') !== FALSE) {
+            return FALSE;
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * Checks whether or not a file is filtered.
+     *
+     * When the whitelist is empty (default), blacklisting is used.
+     * When the whitelist is not empty, whitelisting is used.
+     *
+     * @param  string  $filename
+     * @param  boolean $ignoreWhitelist
+     * @return boolean
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function isFiltered($filename)
+    {
+        $filename = realpath($filename);
+
+        if (!empty($this->whitelistedFiles)) {
+            return !isset($this->whitelistedFiles[$filename]);
+        }
+
+        if (!$this->blacklistPrefilled) {
+            $this->prefillBlacklist();
+        }
+
+        return isset($this->blacklistedFiles[$filename]);
+    }
+
+    /**
+     * Returns the list of blacklisted files.
+     *
+     * @return array
+     */
+    public function getBlacklist()
+    {
+        return array_keys($this->blacklistedFiles);
+    }
+
+    /**
+     * Returns the list of whitelisted files.
+     *
+     * @return array
+     */
+    public function getWhitelist()
+    {
+        return array_keys($this->whitelistedFiles);
+    }
+
+    /**
+     * Returns whether this filter has a whitelist.
+     *
+     * @return boolean
+     * @since  Method available since Release 1.1.0
+     */
+    public function hasWhitelist()
+    {
+        return !empty($this->whitelistedFiles);
+    }
+
+    /**
+     * @since Method available since Release 1.2.3
+     */
+    protected function prefillBlacklist()
+    {
+        $this->addDirectoryContainingClassToBlacklist('File_Iterator');
+        $this->addDirectoryContainingClassToBlacklist('PHP_CodeCoverage');
+        $this->addDirectoryContainingClassToBlacklist('PHP_Invoker');
+        $this->addDirectoryContainingClassToBlacklist('PHP_Timer');
+        $this->addDirectoryContainingClassToBlacklist('PHP_Token');
+        $this->addDirectoryContainingClassToBlacklist('PHPUnit_Framework_TestCase', 2);
+        $this->addDirectoryContainingClassToBlacklist('PHPUnit_Extensions_Database_TestCase', 2);
+        $this->addDirectoryContainingClassToBlacklist('PHPUnit_Framework_MockObject_Generator', 2);
+        $this->addDirectoryContainingClassToBlacklist('PHPUnit_Extensions_SeleniumTestCase', 2);
+        $this->addDirectoryContainingClassToBlacklist('PHPUnit_Extensions_Story_TestCase', 2);
+        $this->addDirectoryContainingClassToBlacklist('Text_Template');
+        $this->addDirectoryContainingClassToBlacklist('Symfony\Component\Yaml\Yaml');
+
+        $this->blacklistPrefilled = TRUE;
+    }
+
+    /**
+     * @param string  $className
+     * @param integer $parent
+     * @since Method available since Release 1.2.3
+     */
+    protected function addDirectoryContainingClassToBlacklist($className, $parent = 1)
+    {
+        if (!class_exists($className)) {
+            return;
+        }
+
+        $reflector = new ReflectionClass($className);
+        $directory = $reflector->getFileName();
+
+        for ($i = 0; $i < $parent; $i++) {
+            $directory = dirname($directory);
+        }
+
+        $this->addDirectoryToBlacklist($directory);
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Clover.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Clover.php
new file mode 100644
index 0000000..0365854
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Clover.php
@@ -0,0 +1,346 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Generates a Clover XML logfile from an PHP_CodeCoverage object.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_Report_Clover
+{
+    /**
+     * @param  PHP_CodeCoverage $coverage
+     * @param  string           $target
+     * @param  string           $name
+     * @return string
+     */
+    public function process(PHP_CodeCoverage $coverage, $target = NULL, $name = NULL)
+    {
+        $xmlDocument = new DOMDocument('1.0', 'UTF-8');
+        $xmlDocument->formatOutput = TRUE;
+
+        $xmlCoverage = $xmlDocument->createElement('coverage');
+        $xmlCoverage->setAttribute('generated', (int)$_SERVER['REQUEST_TIME']);
+        $xmlDocument->appendChild($xmlCoverage);
+
+        $xmlProject = $xmlDocument->createElement('project');
+        $xmlProject->setAttribute('timestamp', (int)$_SERVER['REQUEST_TIME']);
+
+        if (is_string($name)) {
+            $xmlProject->setAttribute('name', $name);
+        }
+
+        $xmlCoverage->appendChild($xmlProject);
+
+        $packages = array();
+        $report   = $coverage->getReport();
+        unset($coverage);
+
+        foreach ($report as $item) {
+            $namespace = 'global';
+
+            if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
+                continue;
+            }
+
+            $xmlFile = $xmlDocument->createElement('file');
+            $xmlFile->setAttribute('name', $item->getPath());
+
+            $classes      = $item->getClassesAndTraits();
+            $coverage     = $item->getCoverageData();
+            $lines        = array();
+            $ignoredLines = $item->getIgnoredLines();
+
+            foreach ($classes as $className => $class) {
+                $classStatements        = 0;
+                $coveredClassStatements = 0;
+                $coveredMethods         = 0;
+
+                foreach ($class['methods'] as $methodName => $method) {
+                    $methodCount        = 0;
+                    $methodLines        = 0;
+                    $methodLinesCovered = 0;
+
+                    for ($i  = $method['startLine'];
+                         $i <= $method['endLine'];
+                         $i++) {
+                        if (isset($ignoredLines[$i])) {
+                            continue;
+                        }
+
+                        $add   = TRUE;
+                        $count = 0;
+
+                        if (isset($coverage[$i])) {
+                            if ($coverage[$i] !== NULL) {
+                                $classStatements++;
+                                $methodLines++;
+                            } else {
+                                $add = FALSE;
+                            }
+
+                            $count = count($coverage[$i]);
+
+                            if ($count > 0) {
+                                $coveredClassStatements++;
+                                $methodLinesCovered++;
+                            }
+                        } else {
+                            $add = FALSE;
+                        }
+
+                        $methodCount = max($methodCount, $count);
+
+                        if ($add) {
+                            $lines[$i] = array(
+                              'count' => $count, 'type'  => 'stmt'
+                            );
+                        }
+                    }
+
+                    if ($methodCount > 0) {
+                        $coveredMethods++;
+                    }
+
+                    $lines[$method['startLine']] = array(
+                      'count' => $methodCount,
+                      'crap'  => $method['crap'],
+                      'type'  => 'method',
+                      'name'  => $methodName
+                    );
+                }
+
+                if (!empty($class['package']['namespace'])) {
+                    $namespace = $class['package']['namespace'];
+                }
+
+                $xmlClass = $xmlDocument->createElement('class');
+                $xmlClass->setAttribute('name', $className);
+                $xmlClass->setAttribute('namespace', $namespace);
+
+                if (!empty($class['package']['fullPackage'])) {
+                    $xmlClass->setAttribute(
+                      'fullPackage', $class['package']['fullPackage']
+                    );
+                }
+
+                if (!empty($class['package']['category'])) {
+                    $xmlClass->setAttribute(
+                      'category', $class['package']['category']
+                    );
+                }
+
+                if (!empty($class['package']['package'])) {
+                    $xmlClass->setAttribute(
+                      'package', $class['package']['package']
+                    );
+                }
+
+                if (!empty($class['package']['subpackage'])) {
+                    $xmlClass->setAttribute(
+                      'subpackage', $class['package']['subpackage']
+                    );
+                }
+
+                $xmlFile->appendChild($xmlClass);
+
+                $xmlMetrics = $xmlDocument->createElement('metrics');
+                $xmlMetrics->setAttribute('methods', count($class['methods']));
+                $xmlMetrics->setAttribute('coveredmethods', $coveredMethods);
+                $xmlMetrics->setAttribute('conditionals', 0);
+                $xmlMetrics->setAttribute('coveredconditionals', 0);
+                $xmlMetrics->setAttribute('statements', $classStatements);
+                $xmlMetrics->setAttribute(
+                  'coveredstatements', $coveredClassStatements
+                );
+                $xmlMetrics->setAttribute(
+                  'elements',
+                  count($class['methods']) +
+                  $classStatements
+                  /* + conditionals */);
+                $xmlMetrics->setAttribute(
+                  'coveredelements',
+                  $coveredMethods +
+                  $coveredClassStatements
+                  /* + coveredconditionals */
+                );
+                $xmlClass->appendChild($xmlMetrics);
+            }
+
+            foreach ($coverage as $line => $data) {
+                if ($data === NULL ||
+                    isset($lines[$line]) ||
+                    isset($ignoredLines[$line])) {
+                    continue;
+                }
+
+                $lines[$line] = array(
+                  'count' => count($data), 'type' => 'stmt'
+                );
+            }
+
+            ksort($lines);
+
+            foreach ($lines as $line => $data) {
+                if (isset($ignoredLines[$line])) {
+                    continue;
+                }
+
+                $xmlLine = $xmlDocument->createElement('line');
+                $xmlLine->setAttribute('num', $line);
+                $xmlLine->setAttribute('type', $data['type']);
+
+                if (isset($data['name'])) {
+                    $xmlLine->setAttribute('name', $data['name']);
+                }
+
+                if (isset($data['crap'])) {
+                    $xmlLine->setAttribute('crap', $data['crap']);
+                }
+
+                $xmlLine->setAttribute('count', $data['count']);
+                $xmlFile->appendChild($xmlLine);
+            }
+
+            $linesOfCode = $item->getLinesOfCode();
+
+            $xmlMetrics = $xmlDocument->createElement('metrics');
+            $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
+            $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
+            $xmlMetrics->setAttribute('classes', $item->getNumClassesAndTraits());
+            $xmlMetrics->setAttribute('methods', $item->getNumMethods());
+            $xmlMetrics->setAttribute(
+              'coveredmethods', $item->getNumTestedMethods()
+            );
+            $xmlMetrics->setAttribute('conditionals', 0);
+            $xmlMetrics->setAttribute('coveredconditionals', 0);
+            $xmlMetrics->setAttribute(
+              'statements', $item->getNumExecutableLines()
+            );
+            $xmlMetrics->setAttribute(
+              'coveredstatements', $item->getNumExecutedLines()
+            );
+            $xmlMetrics->setAttribute(
+              'elements',
+              $item->getNumMethods() +
+              $item->getNumExecutableLines()
+              /* + conditionals */
+            );
+            $xmlMetrics->setAttribute(
+              'coveredelements',
+              $item->getNumTestedMethods() +
+              $item->getNumExecutedLines()
+              /* + coveredconditionals */
+            );
+            $xmlFile->appendChild($xmlMetrics);
+
+            if ($namespace == 'global') {
+                $xmlProject->appendChild($xmlFile);
+            } else {
+                if (!isset($packages[$namespace])) {
+                    $packages[$namespace] = $xmlDocument->createElement(
+                      'package'
+                    );
+
+                    $packages[$namespace]->setAttribute('name', $namespace);
+                    $xmlProject->appendChild($packages[$namespace]);
+                }
+
+                $packages[$namespace]->appendChild($xmlFile);
+            }
+        }
+
+        $linesOfCode = $report->getLinesOfCode();
+
+        $xmlMetrics = $xmlDocument->createElement('metrics');
+        $xmlMetrics->setAttribute('files', count($report));
+        $xmlMetrics->setAttribute('loc', $linesOfCode['loc']);
+        $xmlMetrics->setAttribute('ncloc', $linesOfCode['ncloc']);
+        $xmlMetrics->setAttribute(
+          'classes', $report->getNumClassesAndTraits()
+        );
+        $xmlMetrics->setAttribute('methods', $report->getNumMethods());
+        $xmlMetrics->setAttribute(
+          'coveredmethods', $report->getNumTestedMethods()
+        );
+        $xmlMetrics->setAttribute('conditionals', 0);
+        $xmlMetrics->setAttribute('coveredconditionals', 0);
+        $xmlMetrics->setAttribute(
+          'statements', $report->getNumExecutableLines()
+        );
+        $xmlMetrics->setAttribute(
+          'coveredstatements', $report->getNumExecutedLines()
+        );
+        $xmlMetrics->setAttribute(
+          'elements',
+          $report->getNumMethods() +
+          $report->getNumExecutableLines()
+          /* + conditionals */
+        );
+        $xmlMetrics->setAttribute(
+          'coveredelements',
+          $report->getNumTestedMethods() +
+          $report->getNumExecutedLines()
+          /* + coveredconditionals */
+        );
+        $xmlProject->appendChild($xmlMetrics);
+
+        if ($target !== NULL) {
+            if (!is_dir(dirname($target))) {
+                mkdir(dirname($target), 0777, TRUE);
+            }
+
+            return $xmlDocument->save($target);
+        } else {
+            return $xmlDocument->saveXML();
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Factory.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Factory.php
new file mode 100644
index 0000000..ab0f400
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Factory.php
@@ -0,0 +1,280 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Factory for PHP_CodeCoverage_Report_Node_* object graphs.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_Factory
+{
+    /**
+     * @param PHP_CodeCoverage $coverage
+     */
+    public function create(PHP_CodeCoverage $coverage)
+    {
+        $files      = $coverage->getData();
+        $commonPath = $this->reducePaths($files);
+        $root       = new PHP_CodeCoverage_Report_Node_Directory(
+                        $commonPath, NULL
+                      );
+
+        $this->addItems(
+          $root,
+          $this->buildDirectoryStructure($files),
+          $coverage->getTests(),
+          $coverage->getCacheTokens()
+        );
+
+        return $root;
+    }
+
+    /**
+     * @param PHP_CodeCoverage_Report_Node_Directory $root
+     * @param array                                  $items
+     * @param array                                  $tests
+     * @param boolean                                $cacheTokens
+     */
+    protected function addItems(PHP_CodeCoverage_Report_Node_Directory $root, array $items, array $tests, $cacheTokens)
+    {
+        foreach ($items as $key => $value) {
+            if (substr($key, -2) == '/f') {
+                $key = substr($key, 0, -2);
+
+                if (file_exists($root->getPath() . DIRECTORY_SEPARATOR . $key)) {
+                    $root->addFile($key, $value, $tests, $cacheTokens);
+                }
+            } else {
+                $child = $root->addDirectory($key);
+                $this->addItems($child, $value, $tests, $cacheTokens);
+            }
+        }
+    }
+
+    /**
+     * Builds an array representation of the directory structure.
+     *
+     * For instance,
+     *
+     * <code>
+     * Array
+     * (
+     *     [Money.php] => Array
+     *         (
+     *             ...
+     *         )
+     *
+     *     [MoneyBag.php] => Array
+     *         (
+     *             ...
+     *         )
+     * )
+     * </code>
+     *
+     * is transformed into
+     *
+     * <code>
+     * Array
+     * (
+     *     [.] => Array
+     *         (
+     *             [Money.php] => Array
+     *                 (
+     *                     ...
+     *                 )
+     *
+     *             [MoneyBag.php] => Array
+     *                 (
+     *                     ...
+     *                 )
+     *         )
+     * )
+     * </code>
+     *
+     * @param  array $files
+     * @return array
+     */
+    protected function buildDirectoryStructure($files)
+    {
+        $result = array();
+
+        foreach ($files as $path => $file) {
+            $path    = explode('/', $path);
+            $pointer = &$result;
+            $max     = count($path);
+
+            for ($i = 0; $i < $max; $i++) {
+                if ($i == ($max - 1)) {
+                    $type = '/f';
+                } else {
+                    $type = '';
+                }
+
+                $pointer = &$pointer[$path[$i] . $type];
+            }
+
+            $pointer = $file;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Reduces the paths by cutting the longest common start path.
+     *
+     * For instance,
+     *
+     * <code>
+     * Array
+     * (
+     *     [/home/sb/Money/Money.php] => Array
+     *         (
+     *             ...
+     *         )
+     *
+     *     [/home/sb/Money/MoneyBag.php] => Array
+     *         (
+     *             ...
+     *         )
+     * )
+     * </code>
+     *
+     * is reduced to
+     *
+     * <code>
+     * Array
+     * (
+     *     [Money.php] => Array
+     *         (
+     *             ...
+     *         )
+     *
+     *     [MoneyBag.php] => Array
+     *         (
+     *             ...
+     *         )
+     * )
+     * </code>
+     *
+     * @param  array $files
+     * @return string
+     */
+    protected function reducePaths(&$files)
+    {
+        if (empty($files)) {
+            return '.';
+        }
+
+        $commonPath = '';
+        $paths      = array_keys($files);
+
+        if (count($files) == 1) {
+            $commonPath                 = dirname($paths[0]) . '/';
+            $files[basename($paths[0])] = $files[$paths[0]];
+
+            unset($files[$paths[0]]);
+
+            return $commonPath;
+        }
+
+        $max = count($paths);
+
+        for ($i = 0; $i < $max; $i++) {
+            // strip phar:// prefixes
+            if (strpos($paths[$i], 'phar://') === 0) {
+                $paths[$i] = substr($paths[$i], 7);
+            }
+            $paths[$i] = explode(DIRECTORY_SEPARATOR, $paths[$i]);
+
+            if (empty($paths[$i][0])) {
+                $paths[$i][0] = DIRECTORY_SEPARATOR;
+            }
+        }
+
+        $done = FALSE;
+        $max  = count($paths);
+
+        while (!$done) {
+            for ($i = 0; $i < $max - 1; $i++) {
+                if (!isset($paths[$i][0]) ||
+                    !isset($paths[$i+1][0]) ||
+                    $paths[$i][0] != $paths[$i+1][0]) {
+                    $done = TRUE;
+                    break;
+                }
+            }
+
+            if (!$done) {
+                $commonPath .= $paths[0][0];
+
+                if ($paths[0][0] != DIRECTORY_SEPARATOR) {
+                    $commonPath .= DIRECTORY_SEPARATOR;
+                }
+
+                for ($i = 0; $i < $max; $i++) {
+                    array_shift($paths[$i]);
+                }
+            }
+        }
+
+        $original = array_keys($files);
+        $max      = count($original);
+
+        for ($i = 0; $i < $max; $i++) {
+            $files[join('/', $paths[$i])] = $files[$original[$i]];
+            unset($files[$original[$i]]);
+        }
+
+        ksort($files);
+
+        return substr($commonPath, 0, -1);
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML.php
new file mode 100644
index 0000000..b254625
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Generates an HTML report from an PHP_CodeCoverage object.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_Report_HTML
+{
+    /**
+     * @var string
+     */
+    protected $templatePath;
+
+    /**
+     * @var string
+     */
+    protected $charset;
+
+    /**
+     * @var string
+     */
+    protected $generator;
+
+    /**
+     * @var integer
+     */
+    protected $lowUpperBound;
+
+    /**
+     * @var integer
+     */
+    protected $highLowerBound;
+
+    /**
+     * @var boolean
+     */
+    protected $highlight;
+
+    /**
+     * Constructor.
+     *
+     * @param array $options
+     */
+    public function __construct($charset = 'UTF-8', $highlight = FALSE, $lowUpperBound = 35, $highLowerBound = 70, $generator = '')
+    {
+        $this->charset        = $charset;
+        $this->generator      = $generator;
+        $this->highLowerBound = $highLowerBound;
+        $this->highlight      = $highlight;
+        $this->lowUpperBound  = $lowUpperBound;
+
+        $this->templatePath = sprintf(
+          '%s%sHTML%sRenderer%sTemplate%s',
+
+          dirname(__FILE__),
+          DIRECTORY_SEPARATOR,
+          DIRECTORY_SEPARATOR,
+          DIRECTORY_SEPARATOR,
+          DIRECTORY_SEPARATOR
+        );
+    }
+
+    /**
+     * @param PHP_CodeCoverage $coverage
+     * @param string           $target
+     */
+    public function process(PHP_CodeCoverage $coverage, $target)
+    {
+        $target = $this->getDirectory($target);
+        $report = $coverage->getReport();
+        unset($coverage);
+
+        if (!isset($_SERVER['REQUEST_TIME'])) {
+            $_SERVER['REQUEST_TIME'] = time();
+        }
+
+        $date = date('D M j G:i:s T Y', $_SERVER['REQUEST_TIME']);
+
+        $dashboard = new PHP_CodeCoverage_Report_HTML_Renderer_Dashboard(
+          $this->templatePath,
+          $this->charset,
+          $this->generator,
+          $date,
+          $this->lowUpperBound,
+          $this->highLowerBound
+        );
+
+        $directory = new PHP_CodeCoverage_Report_HTML_Renderer_Directory(
+          $this->templatePath,
+          $this->charset,
+          $this->generator,
+          $date,
+          $this->lowUpperBound,
+          $this->highLowerBound
+        );
+
+        $file = new PHP_CodeCoverage_Report_HTML_Renderer_File(
+          $this->templatePath,
+          $this->charset,
+          $this->generator,
+          $date,
+          $this->lowUpperBound,
+          $this->highLowerBound,
+          $this->highlight
+        );
+
+        $dashboard->render($report, $target . 'index.dashboard.html');
+        $directory->render($report, $target . 'index.html');
+
+        foreach ($report as $node) {
+            $id = $node->getId();
+
+            if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
+                $dashboard->render($node, $target . $id . '.dashboard.html');
+                $directory->render($node, $target . $id . '.html');
+            } else {
+                $file->render($node, $target . $id . '.html');
+            }
+        }
+
+        $this->copyFiles($target);
+    }
+
+    /**
+     * @param string $target
+     */
+    protected function copyFiles($target)
+    {
+        $dir = $this->getDirectory($target . 'css');
+        copy($this->templatePath . 'css/bootstrap.min.css', $dir . 'bootstrap.min.css');
+        copy($this->templatePath . 'css/bootstrap-responsive.min.css', $dir . 'bootstrap-responsive.min.css');
+        copy($this->templatePath . 'css/style.css', $dir . 'style.css');
+
+        $dir = $this->getDirectory($target . 'js');
+        copy($this->templatePath . 'js/bootstrap.min.js', $dir . 'bootstrap.min.js');
+        copy($this->templatePath . 'js/highcharts.js', $dir . 'highcharts.js');
+        copy($this->templatePath . 'js/jquery.min.js', $dir . 'jquery.min.js');
+        copy($this->templatePath . 'js/html5shiv.js', $dir . 'html5shiv.js');
+
+        $dir = $this->getDirectory($target . 'img');
+        copy($this->templatePath . 'img/glyphicons-halflings.png', $dir . 'glyphicons-halflings.png');
+        copy($this->templatePath . 'img/glyphicons-halflings-white.png', $dir . 'glyphicons-halflings-white.png');
+    }
+
+    /**
+     * @param  string $directory
+     * @return string
+     * @throws PHP_CodeCoverage_Exception
+     * @since  Method available since Release 1.2.0
+     */
+    protected function getDirectory($directory)
+    {
+        if (substr($directory, -1, 1) != DIRECTORY_SEPARATOR) {
+            $directory .= DIRECTORY_SEPARATOR;
+        }
+
+        if (is_dir($directory)) {
+            return $directory;
+        }
+
+        if (@mkdir($directory, 0777, TRUE)) {
+            return $directory;
+        }
+
+        throw new PHP_CodeCoverage_Exception(
+          sprintf(
+            'Directory "%s" does not exist.',
+            $directory
+          )
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer.php
new file mode 100644
index 0000000..90fceb3
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Base class for PHP_CodeCoverage_Report_Node renderers.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+abstract class PHP_CodeCoverage_Report_HTML_Renderer
+{
+    /**
+     * @var string
+     */
+    protected $templatePath;
+
+    /**
+     * @var string
+     */
+    protected $charset;
+
+    /**
+     * @var string
+     */
+    protected $generator;
+
+    /**
+     * @var string
+     */
+    protected $date;
+
+    /**
+     * @var integer
+     */
+    protected $lowUpperBound;
+
+    /**
+     * @var integer
+     */
+    protected $highLowerBound;
+
+    /**
+     * Constructor.
+     *
+     * @param string  $templatePath
+     * @param string  $charset
+     * @param string  $generator
+     * @param string  $date
+     * @param integer $lowUpperBound
+     * @param integer $highLowerBound
+     */
+    public function __construct($templatePath, $charset, $generator, $date, $lowUpperBound, $highLowerBound)
+    {
+        $this->templatePath   = $templatePath;
+        $this->charset        = $charset;
+        $this->generator      = $generator;
+        $this->date           = $date;
+        $this->lowUpperBound  = $lowUpperBound;
+        $this->highLowerBound = $highLowerBound;
+    }
+
+    /**
+     * @param  Text_Template $template
+     * @param  array         $data
+     * @return string
+     */
+    protected function renderItemTemplate(Text_Template $template, array $data)
+    {
+        $classesBar    = '&nbsp;';
+        $classesLevel  = 'None';
+        $classesNumber = '&nbsp;';
+
+        if (isset($data['numClasses']) && $data['numClasses'] > 0) {
+            $classesLevel = $this->getColorLevel($data['testedClassesPercent']);
+
+            $classesNumber = $data['numTestedClasses'] . ' / ' .
+                             $data['numClasses'];
+
+            $classesBar = $this->getCoverageBar(
+              $data['testedClassesPercent']
+            );
+        }
+
+        $methodsBar    = '&nbsp;';
+        $methodsLevel  = 'None';
+        $methodsNumber = '&nbsp;';
+
+        if ($data['numMethods'] > 0) {
+            $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']);
+
+            $methodsNumber = $data['numTestedMethods'] . ' / ' .
+                             $data['numMethods'];
+
+            $methodsBar = $this->getCoverageBar(
+              $data['testedMethodsPercent']
+            );
+        }
+
+        $linesBar    = '&nbsp;';
+        $linesLevel  = 'None';
+        $linesNumber = '&nbsp;';
+
+        if ($data['numExecutableLines'] > 0) {
+            $linesLevel = $this->getColorLevel($data['linesExecutedPercent']);
+
+            $linesNumber = $data['numExecutedLines'] . ' / ' .
+                           $data['numExecutableLines'];
+
+            $linesBar = $this->getCoverageBar(
+              $data['linesExecutedPercent']
+            );
+        }
+
+        $template->setVar(
+          array(
+            'icon' => isset($data['icon']) ? $data['icon'] : '',
+            'crap' => isset($data['crap']) ? $data['crap'] : '',
+            'name' => $data['name'],
+            'lines_bar' => $linesBar,
+            'lines_executed_percent' => $data['linesExecutedPercentAsString'],
+            'lines_level' => $linesLevel,
+            'lines_number' => $linesNumber,
+            'methods_bar' => $methodsBar,
+            'methods_tested_percent' => $data['testedMethodsPercentAsString'],
+            'methods_level' => $methodsLevel,
+            'methods_number' => $methodsNumber,
+            'classes_bar' => $classesBar,
+            'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '',
+            'classes_level' => $classesLevel,
+            'classes_number' => $classesNumber
+          )
+        );
+
+        return $template->render();
+    }
+
+    /**
+     * @param Text_Template                $template
+     * @param PHP_CodeCoverage_Report_Node $node
+     */
+    protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node)
+    {
+        $template->setVar(
+          array(
+            'id'               => $node->getId(),
+            'full_path'        => $node->getPath(),
+            'breadcrumbs'      => $this->getBreadcrumbs($node),
+            'charset'          => $this->charset,
+            'date'             => $this->date,
+            'version'          => PHP_CodeCoverage_Version::id(),
+            'php_version'      => PHP_VERSION,
+            'generator'        => $this->generator,
+            'low_upper_bound'  => $this->lowUpperBound,
+            'high_lower_bound' => $this->highLowerBound
+          )
+        );
+    }
+
+    protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node)
+    {
+        $breadcrumbs = '';
+
+        $path = $node->getPathAsArray();
+
+        foreach ($path as $step) {
+            if ($step !== $node) {
+                $breadcrumbs .= sprintf(
+                  '        <li><a href="%s.html">%s</a> <span class="divider">/</span></li>' . "\n",
+                  $step->getId(),
+                  $step->getName()
+                );
+            } else {
+                $breadcrumbs .= sprintf(
+                  '        <li class="active">%s</li>' . "\n",
+                  $step->getName()
+                );
+
+                if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
+                    $breadcrumbs .= sprintf(
+                      '        <li>(<a href="%s.dashboard.html">Dashboard</a>)</li>' . "\n",
+                      $step->getId()
+                    );
+                }
+            }
+        }
+
+        return $breadcrumbs;
+    }
+
+    protected function getCoverageBar($percent)
+    {
+        $level = $this->getColorLevel($percent);
+
+        $template = new Text_Template(
+          $this->templatePath . 'coverage_bar.html'
+        );
+
+        $template->setVar(array('level' => $level, 'percent' => sprintf("%.2F", $percent)));
+
+        return $template->render();
+    }
+
+    /**
+     * @param  integer $percent
+     * @return string
+     */
+    protected function getColorLevel($percent)
+    {
+        if ($percent < $this->lowUpperBound) {
+            return 'danger';
+        }
+
+        else if ($percent >= $this->lowUpperBound &&
+                 $percent <  $this->highLowerBound) {
+            return 'warning';
+        }
+
+        else {
+            return 'success';
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Dashboard.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Dashboard.php
new file mode 100644
index 0000000..f0767ac
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Dashboard.php
@@ -0,0 +1,256 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer
+{
+    /**
+     * @param PHP_CodeCoverage_Report_Node_Directory $node
+     * @param string                                 $file
+     */
+    public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file)
+    {
+        $classes  = $node->getClassesAndTraits();
+        $template = new Text_Template(
+          $this->templatePath . 'dashboard.html'
+        );
+
+        $this->setCommonTemplateVariables($template, $node);
+
+        $template->setVar(
+          array(
+            'least_tested_methods' => $this->leastTestedMethods($classes),
+            'top_project_risks'    => $this->topProjectRisks($classes),
+            'cc_values'            => $this->classComplexity($classes),
+            'ccd_values'           => $this->classCoverageDistribution($classes),
+            'backlink'             => basename(str_replace('.dashboard', '', $file))
+          )
+        );
+
+        $template->renderTo($file);
+    }
+
+    /**
+     * Returns the data for the Class Complexity chart.
+     *
+     * @param  array $classes
+     * @return string
+     */
+    protected function classComplexity(array $classes)
+    {
+        $data = array();
+
+        foreach ($classes as $name => $class) {
+            $data[] = array(
+              $class['coverage'],
+              $class['ccn'],
+              sprintf(
+                '<a href="%s">%s</a>',
+                $class['link'],
+                $name
+              )
+            );
+        }
+
+        return json_encode($data);
+    }
+
+    /**
+     * Returns the data for the Class Coverage Distribution chart.
+     *
+     * @param  array $classes
+     * @return string
+     */
+    protected function classCoverageDistribution(array $classes)
+    {
+        $data = array(
+          '0%'      => 0,
+          '0-10%'   => 0,
+          '10-20%'  => 0,
+          '20-30%'  => 0,
+          '30-40%'  => 0,
+          '40-50%'  => 0,
+          '50-60%'  => 0,
+          '60-70%'  => 0,
+          '70-80%'  => 0,
+          '80-90%'  => 0,
+          '90-100%' => 0,
+          '100%'    => 0
+        );
+
+        foreach ($classes as $class) {
+            if ($class['coverage'] == 0) {
+                $data['0%']++;
+            }
+
+            else if ($class['coverage'] == 100) {
+                $data['100%']++;
+            }
+
+            else {
+                $key = floor($class['coverage']/10)*10;
+                $key = $key . '-' . ($key + 10) . '%';
+                $data[$key]++;
+            }
+        }
+
+        return json_encode(array_values($data));
+    }
+
+    /**
+     * Returns the least tested methods.
+     *
+     * @param  array   $classes
+     * @param  integer $max
+     * @return string
+     */
+    protected function leastTestedMethods(array $classes, $max = 10)
+    {
+        $methods = array();
+
+        foreach ($classes as $className => $class) {
+            foreach ($class['methods'] as $methodName => $method) {
+                if ($method['coverage'] < 100) {
+                    if ($className != '*') {
+                        $key = $className . '::' . $methodName;
+                    } else {
+                        $key = $methodName;
+                    }
+
+                    $methods[$key] = $method['coverage'];
+                }
+            }
+        }
+
+        asort($methods);
+
+        $methods = array_slice($methods, 0, min($max, count($methods)));
+        $buffer  = '';
+
+        foreach ($methods as $name => $coverage) {
+            list($class, $method) = explode('::', $name);
+
+            $buffer .= sprintf(
+              '              <li><a href="%s">%s</a> (%d%%)</li>' . "\n",
+              $classes[$class]['methods'][$method]['link'],
+              $name,
+              $coverage
+            );
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Returns the top project risks according to the CRAP index.
+     *
+     * @param  array   $classes
+     * @param  integer $max
+     * @return string
+     */
+    protected function topProjectRisks(array $classes, $max = 10)
+    {
+        $risks = array();
+
+        foreach ($classes as $className => $class) {
+            if ($class['coverage'] < 100 &&
+                $class['ccn'] > count($class['methods'])) {
+                $risks[$className] = $class['crap'];
+            }
+        }
+
+        arsort($risks);
+
+        $buffer = '';
+        $risks  = array_slice($risks, 0, min($max, count($risks)));
+
+        foreach ($risks as $name => $crap) {
+            $buffer .= sprintf(
+              '              <li><a href="%s">%s</a> (%d)</li>' . "\n",
+              $classes[$name]['link'],
+              $name,
+              $crap
+            );
+        }
+
+        return $buffer;
+    }
+
+    protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node)
+    {
+        $breadcrumbs = '';
+
+        $path = $node->getPathAsArray();
+
+        foreach ($path as $step) {
+            if ($step !== $node) {
+                $breadcrumbs .= sprintf(
+                  '        <li><a href="%s.html">%s</a> <span class="divider">/</span></li>' . "\n",
+                  $step->getId(),
+                  $step->getName()
+                );
+            } else {
+                $breadcrumbs .= sprintf(
+                  '        <li><a href="%s.html">%s</a></li>' . "\n" .
+                  '        <li class="active">(Dashboard)</li>' . "\n",
+                  $step->getId(),
+                  $step->getName()
+                );
+            }
+        }
+
+        return $breadcrumbs;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Directory.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Directory.php
new file mode 100644
index 0000000..c38f844
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Directory.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Renders a PHP_CodeCoverage_Report_Node_Directory node.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_HTML_Renderer_Directory extends PHP_CodeCoverage_Report_HTML_Renderer
+{
+    /**
+     * @param PHP_CodeCoverage_Report_Node_Directory $node
+     * @param string                                 $file
+     */
+    public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file)
+    {
+        $template = new Text_Template($this->templatePath . 'directory.html');
+
+        $this->setCommonTemplateVariables($template, $node);
+
+        $items = $this->renderItem($node, TRUE);
+
+        foreach ($node->getDirectories() as $item) {
+            $items .= $this->renderItem($item);
+        }
+
+        foreach ($node->getFiles() as $item) {
+            $items .= $this->renderItem($item);
+        }
+
+        $template->setVar(
+          array(
+            'id'    => $node->getId(),
+            'items' => $items
+          )
+        );
+
+        $template->renderTo($file);
+    }
+
+    /**
+     * @param  PHP_CodeCoverage_Report_Node $item
+     * @param  boolean                      $total
+     * @return string
+     */
+    protected function renderItem(PHP_CodeCoverage_Report_Node $item, $total = FALSE)
+    {
+        $data = array(
+          'numClasses'                   => $item->getNumClassesAndTraits(),
+          'numTestedClasses'             => $item->getNumTestedClassesAndTraits(),
+          'numMethods'                   => $item->getNumMethods(),
+          'numTestedMethods'             => $item->getNumTestedMethods(),
+          'linesExecutedPercent'         => $item->getLineExecutedPercent(FALSE),
+          'linesExecutedPercentAsString' => $item->getLineExecutedPercent(),
+          'numExecutedLines'             => $item->getNumExecutedLines(),
+          'numExecutableLines'           => $item->getNumExecutableLines(),
+          'testedMethodsPercent'         => $item->getTestedMethodsPercent(FALSE),
+          'testedMethodsPercentAsString' => $item->getTestedMethodsPercent(),
+          'testedClassesPercent'         => $item->getTestedClassesAndTraitsPercent(FALSE),
+          'testedClassesPercentAsString' => $item->getTestedClassesAndTraitsPercent()
+        );
+
+        if ($total) {
+            $data['name'] = 'Total';
+        } else {
+            $data['name'] = sprintf(
+              '<a href="%s.html">%s</a>',
+              $item->getId(),
+              $item->getName()
+            );
+
+            if ($item instanceof PHP_CodeCoverage_Report_Node_Directory) {
+                $data['icon'] = '<i class="icon-folder-open"></i> ';
+            } else {
+                $data['icon'] = '<i class="icon-file"></i> ';
+            }
+        }
+
+        return $this->renderItemTemplate(
+          new Text_Template($this->templatePath . 'directory_item.html'),
+          $data
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/File.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/File.php
new file mode 100644
index 0000000..351028b
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/File.php
@@ -0,0 +1,583 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+// @codeCoverageIgnoreStart
+if (!defined('T_TRAIT')) {
+    define('T_TRAIT', 1001);
+}
+
+if (!defined('T_INSTEADOF')) {
+    define('T_INSTEADOF', 1002);
+}
+
+if (!defined('T_CALLABLE')) {
+    define('T_CALLABLE', 1003);
+}
+// @codeCoverageIgnoreEnd
+
+/**
+ * Renders a PHP_CodeCoverage_Report_Node_File node.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_HTML_Renderer_File extends PHP_CodeCoverage_Report_HTML_Renderer
+{
+    /**
+     * @var boolean
+     */
+    protected $highlight;
+
+    /**
+     * Constructor.
+     *
+     * @param string  $templatePath
+     * @param string  $charset
+     * @param string  $generator
+     * @param string  $date
+     * @param integer $lowUpperBound
+     * @param integer $highLowerBound
+     * @param boolean $highlight
+     */
+    public function __construct($templatePath, $charset, $generator, $date, $lowUpperBound, $highLowerBound, $highlight)
+    {
+        parent::__construct(
+          $templatePath,
+          $charset,
+          $generator,
+          $date,
+          $lowUpperBound,
+          $highLowerBound
+        );
+
+        $this->highlight = $highlight;
+    }
+
+    /**
+     * @param PHP_CodeCoverage_Report_Node_File $node
+     * @param string                            $file
+     */
+    public function render(PHP_CodeCoverage_Report_Node_File $node, $file)
+    {
+        $template = new Text_Template($this->templatePath . 'file.html');
+
+        $template->setVar(
+          array(
+            'items' => $this->renderItems($node),
+            'lines' => $this->renderSource($node)
+          )
+        );
+
+        $this->setCommonTemplateVariables($template, $node);
+
+        $template->renderTo($file);
+    }
+
+    /**
+     * @param  PHP_CodeCoverage_Report_Node_File $node
+     * @return string
+     */
+    protected function renderItems(PHP_CodeCoverage_Report_Node_File $node)
+    {
+        $template = new Text_Template($this->templatePath . 'file_item.html');
+
+        $methodItemTemplate = new Text_Template(
+          $this->templatePath . 'method_item.html'
+        );
+
+        $items = $this->renderItemTemplate(
+          $template,
+          array(
+            'name'                         => 'Total',
+            'numClasses'                   => $node->getNumClassesAndTraits(),
+            'numTestedClasses'             => $node->getNumTestedClassesAndTraits(),
+            'numMethods'                   => $node->getNumMethods(),
+            'numTestedMethods'             => $node->getNumTestedMethods(),
+            'linesExecutedPercent'         => $node->getLineExecutedPercent(FALSE),
+            'linesExecutedPercentAsString' => $node->getLineExecutedPercent(),
+            'numExecutedLines'             => $node->getNumExecutedLines(),
+            'numExecutableLines'           => $node->getNumExecutableLines(),
+            'testedMethodsPercent'         => $node->getTestedMethodsPercent(FALSE),
+            'testedMethodsPercentAsString' => $node->getTestedMethodsPercent(),
+            'testedClassesPercent'         => $node->getTestedClassesAndTraitsPercent(FALSE),
+            'testedClassesPercentAsString' => $node->getTestedClassesAndTraitsPercent(),
+            'crap'                         => '<acronym title="Change Risk Anti-Patterns (CRAP) Index">CRAP</acronym>'
+          )
+        );
+
+        $items .= $this->renderFunctionItems(
+          $node->getFunctions(), $methodItemTemplate
+        );
+
+        $items .= $this->renderTraitOrClassItems(
+          $node->getTraits(), $template, $methodItemTemplate
+        );
+
+        $items .= $this->renderTraitOrClassItems(
+          $node->getClasses(), $template, $methodItemTemplate
+        );
+
+        return $items;
+    }
+
+    /**
+     * @param  array         $items
+     * @param  Text_Template $template
+     * @return string
+     */
+    protected function renderTraitOrClassItems(array $items, Text_Template $template, Text_Template $methodItemTemplate)
+    {
+        if (empty($items)) {
+            return '';
+        }
+
+        $buffer = '';
+
+        foreach ($items as $name => $item) {
+            $numMethods       = count($item['methods']);
+            $numTestedMethods = 0;
+
+            foreach ($item['methods'] as $method) {
+                if ($method['executedLines'] == $method['executableLines']) {
+                    $numTestedMethods++;
+                }
+            }
+
+            $buffer .= $this->renderItemTemplate(
+              $template,
+              array(
+                'name'                         => $name,
+                'numClasses'                   => 1,
+                'numTestedClasses'             => $numTestedMethods == $numMethods ? 1 : 0,
+                'numMethods'                   => $numMethods,
+                'numTestedMethods'             => $numTestedMethods,
+                'linesExecutedPercent'         => PHP_CodeCoverage_Util::percent(
+                                                    $item['executedLines'],
+                                                    $item['executableLines'],
+                                                    FALSE
+                                                  ),
+                'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent(
+                                                    $item['executedLines'],
+                                                    $item['executableLines'],
+                                                    TRUE
+                                                  ),
+                'numExecutedLines'             => $item['executedLines'],
+                'numExecutableLines'           => $item['executableLines'],
+                'testedMethodsPercent'         => PHP_CodeCoverage_Util::percent(
+                                                    $numTestedMethods,
+                                                    $numMethods,
+                                                    FALSE
+                                                  ),
+                'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent(
+                                                    $numTestedMethods,
+                                                    $numMethods,
+                                                    TRUE
+                                                  ),
+                'testedClassesPercent'         => PHP_CodeCoverage_Util::percent(
+                                                    $numTestedMethods == $numMethods ? 1 : 0,
+                                                    1,
+                                                    FALSE
+                                                  ),
+                'testedClassesPercentAsString' => PHP_CodeCoverage_Util::percent(
+                                                    $numTestedMethods == $numMethods ? 1 : 0,
+                                                    1,
+                                                    TRUE
+                                                  ),
+                'crap'                         => $item['crap']
+              )
+            );
+
+            foreach ($item['methods'] as $method) {
+                $buffer .= $this->renderFunctionOrMethodItem(
+                  $methodItemTemplate, $method, '&nbsp;'
+                );
+            }
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * @param  array         $functions
+     * @param  Text_Template $template
+     * @return string
+     */
+    protected function renderFunctionItems(array $functions, Text_Template $template)
+    {
+        if (empty($functions)) {
+            return '';
+        }
+
+        $buffer = '';
+
+        foreach ($functions as $function) {
+            $buffer .= $this->renderFunctionOrMethodItem(
+              $template, $function
+            );
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * @param  Text_Template $template
+     * @return string
+     */
+    protected function renderFunctionOrMethodItem(Text_Template $template, array $item, $indent = '')
+    {
+        $numTestedItems = $item['executedLines'] == $item['executableLines'] ? 1 : 0;
+
+        return $this->renderItemTemplate(
+          $template,
+          array(
+            'name'                         => sprintf(
+                                                '%s<a href="#%d">%s</a>',
+                                                $indent,
+                                                $item['startLine'],
+                                                htmlspecialchars($item['signature'])
+                                              ),
+            'numMethods'                   => 1,
+            'numTestedMethods'             => $numTestedItems,
+            'linesExecutedPercent'         => PHP_CodeCoverage_Util::percent(
+                                                $item['executedLines'],
+                                                $item['executableLines'],
+                                                FALSE
+                                              ),
+            'linesExecutedPercentAsString' => PHP_CodeCoverage_Util::percent(
+                                                $item['executedLines'],
+                                                $item['executableLines'],
+                                                TRUE
+                                              ),
+            'numExecutedLines'             => $item['executedLines'],
+            'numExecutableLines'           => $item['executableLines'],
+            'testedMethodsPercent'         => PHP_CodeCoverage_Util::percent(
+                                                $numTestedItems,
+                                                1,
+                                                FALSE
+                                              ),
+            'testedMethodsPercentAsString' => PHP_CodeCoverage_Util::percent(
+                                                $numTestedItems,
+                                                1,
+                                                TRUE
+                                              ),
+            'crap'                         => $item['crap']
+          )
+        );
+    }
+
+    /**
+     * @param  PHP_CodeCoverage_Report_Node_File $node
+     * @return string
+     */
+    protected function renderSource(PHP_CodeCoverage_Report_Node_File $node)
+    {
+        $coverageData = $node->getCoverageData();
+        $ignoredLines = $node->getIgnoredLines();
+        $testData     = $node->getTestData();
+        $codeLines    = $this->loadFile($node->getPath());
+        $lines        = '';
+        $i            = 1;
+
+        foreach ($codeLines as $line) {
+            $numTests       = '';
+            $trClass        = '';
+            $popoverContent = '';
+            $popoverTitle   = '';
+
+            if (!isset($ignoredLines[$i]) && isset($coverageData[$i])) {
+                $numTests = count($coverageData[$i]);
+
+                if ($coverageData[$i] === NULL) {
+                    $trClass = ' class="warning"';
+                }
+
+                else if ($numTests == 0) {
+                    $trClass = ' class="danger"';
+                }
+
+                else {
+                    $trClass        = ' class="success popin"';
+                    $popoverContent = '<ul>';
+
+                    if ($numTests > 1) {
+                        $popoverTitle = $numTests . ' tests cover line ' . $i;
+                    } else {
+                        $popoverTitle = '1 test covers line ' . $i;
+                    }
+
+                    foreach ($coverageData[$i] as $test) {
+                        switch ($testData[$test]) {
+                            case 0: {
+                                $testCSS = ' class="success"';
+                            }
+                            break;
+
+                            case 1:
+                            case 2: {
+                                $testCSS = ' class="warning"';
+                            }
+                            break;
+
+                            case 3: {
+                                $testCSS = ' class="danger"';
+                            }
+                            break;
+
+                            case 4: {
+                                $testCSS = ' class="danger"';
+                            }
+                            break;
+
+                            default: {
+                                $testCSS = '';
+                            }
+                        }
+
+                        $popoverContent .= sprintf(
+                          '<li%s>%s</li>',
+
+                          $testCSS,
+                          htmlspecialchars($test)
+                        );
+                    }
+
+                    $popoverContent .= '</ul>';
+                }
+            }
+
+            if (!empty($popoverTitle)) {
+                $popover = sprintf(
+                  ' data-title="%s" data-content="%s" data-placement="bottom" data-html="true"',
+                  $popoverTitle,
+                  htmlspecialchars($popoverContent)
+                );
+            } else {
+                $popover = '';
+            }
+
+            $lines .= sprintf(
+              '     <tr%s%s><td><div align="right"><a name="%d"></a><a href="#%d">%d</a></div></td><td class="codeLine">%s</td></tr>' . "\n",
+              $trClass,
+              $popover,
+              $i,
+              $i,
+              $i,
+              !$this->highlight ? htmlspecialchars($line) : $line
+            );
+
+            $i++;
+        }
+
+        return $lines;
+    }
+
+    /**
+     * @param  string $file
+     * @return array
+     */
+    protected function loadFile($file)
+    {
+        $buffer = file_get_contents($file);
+        $lines  = explode("\n", str_replace("\t", '    ', $buffer));
+        $result = array();
+
+        if (count($lines) == 0) {
+            return $result;
+        }
+
+        $lines = array_map('rtrim', $lines);
+
+        if (!$this->highlight) {
+            unset($lines[count($lines)-1]);
+            return $lines;
+        }
+
+        $tokens     = token_get_all($buffer);
+        $stringFlag = FALSE;
+        $i          = 0;
+        $result[$i] = '';
+
+        foreach ($tokens as $j => $token) {
+            if (is_string($token)) {
+                if ($token === '"' && $tokens[$j - 1] !== '\\') {
+                    $result[$i] .= sprintf(
+                      '<span class="string">%s</span>',
+
+                      htmlspecialchars($token)
+                    );
+
+                    $stringFlag = !$stringFlag;
+                } else {
+                    $result[$i] .= sprintf(
+                      '<span class="keyword">%s</span>',
+
+                      htmlspecialchars($token)
+                    );
+                }
+
+                continue;
+            }
+
+            list ($token, $value) = $token;
+
+            $value = str_replace(
+              array("\t", ' '),
+              array('&nbsp;&nbsp;&nbsp;&nbsp;', '&nbsp;'),
+              htmlspecialchars($value)
+            );
+
+            if ($value === "\n") {
+                $result[++$i] = '';
+            } else {
+                $lines = explode("\n", $value);
+
+                foreach ($lines as $jj => $line) {
+                    $line = trim($line);
+
+                    if ($line !== '') {
+                        if ($stringFlag) {
+                            $colour = 'string';
+                        } else {
+                            switch ($token) {
+                                case T_INLINE_HTML: {
+                                    $colour = 'html';
+                                }
+                                break;
+
+                                case T_COMMENT:
+                                case T_DOC_COMMENT: {
+                                    $colour = 'comment';
+                                }
+                                break;
+
+                                case T_ABSTRACT:
+                                case T_ARRAY:
+                                case T_AS:
+                                case T_BREAK:
+                                case T_CALLABLE:
+                                case T_CASE:
+                                case T_CATCH:
+                                case T_CLASS:
+                                case T_CLONE:
+                                case T_CONTINUE:
+                                case T_DEFAULT:
+                                case T_ECHO:
+                                case T_ELSE:
+                                case T_ELSEIF:
+                                case T_EMPTY:
+                                case T_ENDDECLARE:
+                                case T_ENDFOR:
+                                case T_ENDFOREACH:
+                                case T_ENDIF:
+                                case T_ENDSWITCH:
+                                case T_ENDWHILE:
+                                case T_EXIT:
+                                case T_EXTENDS:
+                                case T_FINAL:
+                                case T_FOREACH:
+                                case T_FUNCTION:
+                                case T_GLOBAL:
+                                case T_IF:
+                                case T_IMPLEMENTS:
+                                case T_INCLUDE:
+                                case T_INCLUDE_ONCE:
+                                case T_INSTANCEOF:
+                                case T_INSTEADOF:
+                                case T_INTERFACE:
+                                case T_ISSET:
+                                case T_LOGICAL_AND:
+                                case T_LOGICAL_OR:
+                                case T_LOGICAL_XOR:
+                                case T_NAMESPACE:
+                                case T_NEW:
+                                case T_PRIVATE:
+                                case T_PROTECTED:
+                                case T_PUBLIC:
+                                case T_REQUIRE:
+                                case T_REQUIRE_ONCE:
+                                case T_RETURN:
+                                case T_STATIC:
+                                case T_THROW:
+                                case T_TRAIT:
+                                case T_TRY:
+                                case T_UNSET:
+                                case T_USE:
+                                case T_VAR:
+                                case T_WHILE: {
+                                    $colour = 'keyword';
+                                }
+                                break;
+
+                                default: {
+                                    $colour = 'default';
+                                }
+                            }
+                        }
+
+                        $result[$i] .= sprintf(
+                          '<span class="%s">%s</span>',
+
+                          $colour,
+                          $line
+                        );
+                    }
+
+                    if (isset($lines[$jj + 1])) {
+                        $result[++$i] = '';
+                    }
+                }
+            }
+        }
+
+        unset($result[count($result)-1]);
+
+        return $result;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist
new file mode 100644
index 0000000..73a11a1
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/coverage_bar.html.dist
@@ -0,0 +1,3 @@
+       <div class="progress progress-{level}" style="width: 100px;">
+        <div class="bar" style="width: {percent}%;"></div>
+       </div>
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap-responsive.min.css b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..5cb833f
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.2.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */@-ms-viewport{width:device-width}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css
new file mode 100644
index 0000000..140f731
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.2.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover{color:#808080}.text-warning{color:#c09853}a.text-warning:hover{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover{color:#2d6987}.text-success{color:#468847}a.text-success:hover{color:#356635}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media .pull-left{margin-right:10px}.media .pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/style.css b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/style.css
new file mode 100644
index 0000000..2ef1628
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/css/style.css
@@ -0,0 +1,86 @@
+body {
+ padding-top: 10px;
+}
+
+.popover {
+ width: 600px;
+}
+
+.table td {
+ padding-top: 3px;
+ padding-bottom: 3px;
+}
+
+.table-condensed td {
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.table .progress {
+ margin-bottom: inherit;
+}
+
+.table-borderless th, .table-borderless td {
+ border: 0 !important;
+}
+
+.table tbody td.success, li.success, span.success {
+ background-color: #dff0d8;
+}
+
+.table tbody tr.danger, .table tbody td.danger, li.danger, span.danger {
+ background-color: #f2dede;
+}
+
+.table tbody td.warning, li.warning, span.warning {
+ background-color: #fcf8e3;
+}
+
+.table tbody td.info {
+ background-color: #d9edf7;
+}
+
+td.big {
+ width: 100px;
+}
+
+td.small {
+}
+
+td.codeLine {
+ font-family: monospace;
+ white-space: pre;
+}
+
+td span.comment {
+ color: #888a85;
+}
+
+td span.default {
+ color: #2e3436;
+}
+
+td span.html {
+ color: #888a85;
+}
+
+td span.keyword {
+ color: #2e3436;
+ font-weight: bold;
+}
+
+pre span.string {
+ color: #2e3436;
+}
+
+span.success, span.warning, span.danger {
+ margin-right: 2px;
+ padding-left: 10px;
+ padding-right: 10px;
+ text-align: center;
+}
+
+#classCoverageDistribution, #classComplexity {
+ height: 200px;
+ width: 475px;
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist
new file mode 100644
index 0000000..eb58b36
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/dashboard.html.dist
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+  <meta charset="{charset}">
+  <title>Dashboard for {full_path}</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <link href="css/bootstrap.min.css" rel="stylesheet">
+  <link href="css/bootstrap-responsive.min.css" rel="stylesheet">
+  <link href="css/style.css" rel="stylesheet">
+  <!--[if lt IE 9]>
+  <script src="js/html5shiv.js"></script>
+  <![endif]-->
+ </head>
+ <body>
+  <header>
+   <div class="container">
+    <div class="row">
+     <div class="span12">
+      <ul class="breadcrumb">
+{breadcrumbs}
+      </ul>
+     </div>
+    </div>
+   </div>
+  </header>
+  <div class="container">
+   <div class="row">
+    <div class="span6">
+     <h2>Class Coverage Distribution</h2>
+     <div id="classCoverageDistribution"></div>
+    </div>
+    <div class="span6">
+     <h2>Class Complexity</h2>
+     <div id="classComplexity"></div>
+    </div>
+   </div>
+   <div class="row">
+    <div class="span6">
+     <h2>Top Project Risks</h2>
+     <ul>
+{top_project_risks}
+     </ul>
+    </div>
+    <div class="span6">
+     <h2>Least Tested Methods</h2>
+     <ul>
+{least_tested_methods}
+     </ul>
+    </div>
+   </div>
+   <footer>
+    <p>
+     <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {version}</a> using <a href="http://www.php.net/" target="_top">PHP {php_version}</a>{generator} at {date}.</small>
+    </p>
+   </footer>
+  </div>
+  <script src="js/bootstrap.min.js" type="text/javascript"></script>
+  <script src="js/jquery.min.js" type="text/javascript"></script>
+  <script src="js/highcharts.js" type="text/javascript"></script>
+  <script type="text/javascript">
+  $(document).ready(function() {
+        var classCoverageDistribution = new Highcharts.Chart({
+           chart: {
+              renderTo: 'classCoverageDistribution',
+              type: 'column'
+           },
+           title: {text: ''},
+           legend: {enabled: false},
+           credits: {enabled: false},
+           tooltip: {enabled: false},
+           xAxis: {
+               labels: {style: {fontSize: '8px'}},
+               categories: [
+               '0%','0-10%','10-20%','20-30%','30-40%','40-50%','50-60%','60-70%','70-80%','80-90%','90-100%','100%'
+               ]
+          },
+          yAxis: {
+              title: '',
+              labels: {style: {fontSize: '8px'}},
+          },
+          series: [{
+              data: {ccd_values}
+          }],
+        });
+
+      var classComplexity = new Highcharts.Chart({
+          chart: {
+            renderTo: 'classComplexity',
+            type: 'scatter'
+          },
+          title: {text: ''},
+          legend: {enabled: false},
+          credits: {enabled: false},
+          xAxis: {
+             title: {text: 'Code Coverage (in percent)'},
+             labels: {enabled: true},
+          },
+          yAxis: {
+            title: 'Cyclomatic Complexity',
+            labels: {enabled: true},
+          },
+          tooltip: {
+              formatter: function() {
+                  return this.point.config[2];
+              }
+          },
+          series: [{
+            data: {cc_values},
+            marker: {
+                symbol: 'diamond'
+            }
+          }],
+      });
+  });
+  </script>
+ </body>
+</html>
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist
new file mode 100644
index 0000000..347440c
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/directory.html.dist
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+  <meta charset="{charset}">
+  <title>Code Coverage for {full_path}</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <link href="css/bootstrap.min.css" rel="stylesheet">
+  <link href="css/bootstrap-responsive.min.css" rel="stylesheet">
+  <link href="css/style.css" rel="stylesheet">
+  <!--[if lt IE 9]>
+  <script src="js/html5shiv.js"></script>
+  <![endif]-->
+ </head>
+ <body>
+  <header>
+   <div class="container">
+    <div class="row">
+     <div class="span12">
+      <ul class="breadcrumb">
+{breadcrumbs}
+      </ul>
+     </div>
+    </div>
+   </div>
+  </header>
+  <div class="container">
+   <table class="table table-bordered">
+    <thead>
+     <tr>
+      <td>&nbsp;</td>
+      <td colspan="9"><div align="center"><strong>Code Coverage</strong></div></td>
+     </tr>
+     <tr>
+      <td>&nbsp;</td>
+      <td colspan="3"><div align="center"><strong>Lines</strong></div></td>
+      <td colspan="3"><div align="center"><strong>Functions and Methods</strong></div></td>
+      <td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
+     </tr>
+    </thead>
+    <tbody>
+{items}
+    </tbody>
+   </table>
+   <footer>
+    <h4>Legend</h4>
+    <p>
+     <span class="danger"><strong>Low</strong>: 0% to {low_upper_bound}%</span>
+     <span class="warning"><strong>Medium</strong>: {low_upper_bound}% to {high_lower_bound}%</span>
+     <span class="success"><strong>High</strong>: {high_lower_bound}% to 100%</span>
+    </p>
+    <p>
+     <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {version}</a> using <a href="http://www.php.net/" target="_top">PHP {php_version}</a>{generator} at {date}.</small>
+    </p>
+   </footer>
+  </div>
+  <script src="js/bootstrap.min.js" type="text/javascript"></script>
+ </body>
+</html>
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist
new file mode 100644
index 0000000..4a19a06
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/directory_item.html.dist
@@ -0,0 +1,13 @@
+     <tr>
+      <td class="{lines_level}">{icon}{name}</td>
+      <td class="{lines_level} big">{lines_bar}</td>
+      <td class="{lines_level} small"><div align="right">{lines_executed_percent}</div></td>
+      <td class="{lines_level} small"><div align="right">{lines_number}</div></td>
+      <td class="{methods_level} big">{methods_bar}</td>
+      <td class="{methods_level} small"><div align="right">{methods_tested_percent}</div></td>
+      <td class="{methods_level} small"><div align="right">{methods_number}</div></td>
+      <td class="{classes_level} big">{classes_bar}</td>
+      <td class="{classes_level} small"><div align="right">{classes_tested_percent}</div></td>
+      <td class="{classes_level} small"><div align="right">{classes_number}</div></td>
+     </tr>
+
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist
new file mode 100644
index 0000000..31a513e
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/file.html.dist
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+  <meta charset="{charset}">
+  <title>Code Coverage for {full_path}</title>
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <link href="css/bootstrap.min.css" rel="stylesheet">
+  <link href="css/bootstrap-responsive.min.css" rel="stylesheet">
+  <link href="css/style.css" rel="stylesheet">
+  <!--[if lt IE 9]>
+  <script src="js/html5shiv.js"></script>
+  <![endif]-->
+ </head>
+ <body>
+  <header>
+   <div class="container">
+    <div class="row">
+     <div class="span12">
+      <ul class="breadcrumb">
+{breadcrumbs}
+      </ul>
+     </div>
+    </div>
+   </div>
+  </header>
+  <div class="container">
+   <table class="table table-bordered">
+    <thead>
+     <tr>
+      <td>&nbsp;</td>
+      <td colspan="10"><div align="center"><strong>Code Coverage</strong></div></td>
+     </tr>
+     <tr>
+      <td>&nbsp;</td>
+      <td colspan="3"><div align="center"><strong>Classes and Traits</strong></div></td>
+      <td colspan="4"><div align="center"><strong>Functions and Methods</strong></div></td>
+      <td colspan="3"><div align="center"><strong>Lines</strong></div></td>
+     </tr>
+    </thead>
+    <tbody>
+{items}
+    </tbody>
+   </table>
+   <table class="table table-borderless table-condensed">
+    <tbody>
+{lines}
+    </tbody>
+   </table>
+   <footer>
+    <h4>Legend</h4>
+    <p>
+     <span class="success"><strong>Executed</strong></span>
+     <span class="danger"><strong>Not Executed</strong></span>
+     <span class="warning"><strong>Dead Code</strong></span>
+    </p>
+    <p>
+     <small>Generated by <a href="http://github.com/sebastianbergmann/php-code-coverage" target="_top">PHP_CodeCoverage {version}</a> using <a href="http://www.php.net/" target="_top">PHP {php_version}</a>{generator} at {date}.</small>
+    </p>
+   </footer>
+  </div>
+  <script src="js/jquery.min.js" type="text/javascript"></script>
+  <script src="js/bootstrap.min.js" type="text/javascript"></script>
+  <script type="text/javascript">$('.popin').popover({trigger: 'hover'});</script>
+ </body>
+</html>
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist
new file mode 100644
index 0000000..7bff4e5
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/file_item.html.dist
@@ -0,0 +1,14 @@
+     <tr>
+      <td class="{classes_level}">{name}</td>
+      <td class="{classes_level} big">{classes_bar}</td>
+      <td class="{classes_level} small"><div align="right">{classes_tested_percent}</div></td>
+      <td class="{classes_level} small"><div align="right">{classes_number}</div></td>
+      <td class="{methods_level} big">{methods_bar}</td>
+      <td class="{methods_level} small"><div align="right">{methods_tested_percent}</div></td>
+      <td class="{methods_level} small"><div align="right">{methods_number}</div></td>
+      <td class="{methods_level} small">{crap}</td>
+      <td class="{lines_level} big">{lines_bar}</td>
+      <td class="{lines_level} small"><div align="right">{lines_executed_percent}</div></td>
+      <td class="{lines_level} small"><div align="right">{lines_number}</div></td>
+     </tr>
+
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/img/glyphicons-halflings-white.png b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/img/glyphicons-halflings-white.png
@@ -0,0 +1,23 @@
+‰PNG
+
+   IHDR  Õ   Ÿ   ˜Ó³{  ÙPLTEÿÿÿ      ùùùÿÿÿ   ÿÿÿýýýmmm   ÿÿÿÿÿÿÿÿÿ      ÿÿÿðððþþþööö   üüü      ÿÿÿÿÿÿÚÚÚ   ÂÂÂôôôÿÿÿÿÿÿôôô÷÷÷ÿÿÿ      ³³³ýýý   âââ°°°ÿÿÿÿÿÿûûûçççþþþÿÿÿ   ííí   ÏÏÏ   ýýýöööíííûûûçççúúúááá’’’þþþþþþÁÁÁ˜˜˜tttáááÐÐÐ   óóó»»»¡¡¡€€€ýýýÔÔÔbbbÿÿÿÕÕÕøøøÜÜÜúúúûûûéééûûûýýýýýýÑÑÑòòòüüüøøøëëëüüü¶¶¶ÆÆÆåååîîîõõõýýýeeegggððð¶¶¶ààà÷÷÷úúúéééåååúúúøøøËËËÿÿÿ„„„ñññxxx÷÷÷ÝÝÝùùùÈÈÈÒÒÒìììúúúÞÞÞâââæææóóó›››¨¨¨¥¥¥ÜÜÜîîîÿÿÿñññÉÉÉðððÿÿÿÿÿÿÞÞÞÆÆÆ¼¼¼ëëëÖÖÖÐÐÐâââùùùôôôâââìììõõõ´´´ÿÿÿýýýûûûüüüúúúæææ   äääüüü÷÷÷°°°™™™ýýýìììüüüÁÁÁéééÿÿÿÚÚÚððððððõõõñññþþþøøøþþþŽŽŽâââûûûùùùÜÜÜÿÿÿòòòúúúŸŸŸííí÷÷÷öööèèèóóóúúúõõõõõõ¦¦¦ËËËúúúøøøÓÓÓëëëúúúëëëªªªóóóííí¢¢¢ÏÏÏÚÚÚÖÖÖ¢¢¢ëëëâââùùùUUUÍÍÍÿÿÿÖÖÖãããáááêêêüüüÿÿÿöööûûûóóóôôôÌÌÌÿÿÿÿÿÿùùùõõõÿÿÿòòòýýý   ÙÙÙüüüûûûüüüééé¿¿¿ûûûêêêéééþþþÿÿÿørOæ   òtRNS  ÔÏñ#ïŸ_
+/©ðÆâ¿oS·ß?†ÅCákD¯ÂÀOS_ ¥š²ŒÓ6Ðà>4!~a§@1Ñ_'oÄn¢Ò‹‘€M†¡“3±BQj™¶p&%!lµÃ"Xqr;€— A[‚<`‰am}4…3/0Iˆ¨PCM!6(*gK&YQ¦GDP,å`’{VP¤-êxÁ)hÝ7‡e1]ôˆßW¿³$—‡1ƒbÄzSÜ•cOÙÍ]ÀŠ–U;Zi<N#×)	86pVàò”:h#ù0Z„QÔJN†¾EDTŒÞ~õ‡^  -IDATx^ì‡#Ç™¦¿b'4A$Ah “)Ãp†3š<MF9Y9XÁ²,ÛrÎiÖöÚ¾ÝÛ|›s¼Ût9çœsÎùÞ¿àXÝ kº¾jvó@­l_¿’Iÿž*~hôƒ >é»'yÜ"€âÐÐ‘ÝØ†‰K64ÖYœ*.vè@²¸îŽc.};‡ïŸtN%¨DIª˜ÊÐ	!Z¶Ð5LñH£2Ú6 ŒƒÉ¯ŽÖ"ŠÔ-b±E,,)Ê ÀBŒ·¦>m¹ªÃãúnøö6pmŸRöO
+wm@°ÝÌVÝ#?É'C…È‘Z#©Žqž‡ìÀbÒÓ|$½:Ü)‰Â/E¾%÷ânR¹q—CàhnµÉ%õiÓÌ“­º¶¶ß}lƒm
+?iÿdâdÃ"€,Ø­Ç `¬Hñ"r.z¡¼‹ŽÁ~ýìü(bðQÜU&ê½—)–5õêX#•§ òé™EMªæÜR<Í*p[€[%.©OÉÌ£˜¥k7“ lIo°ý¨ý“¶ßJ°F ¥lV!Ì¡ÄƒuH‚`Æ¼™€—›ç‚&¢,Çz´ÉRk$¤ò¨|$ölŠ»¼Xbü¢âéÇjßªÈdU±û?Î£$Hµî¸©W±¾$Uû'…ÆÅHÜE3*Õ­º€µµU\}ê­ý†(Ò
+¤zhVk}gÇu«Rk$¤ò%¨|‰T¨|Úêck¦ç³"ãžä±Dç”ý«ƒ_W+‹®”Ê.QòÒÅ)Õ@«ý“Æ½€H¢À›Íbµs¸ÔlžŽT´©·Dÿô­R Ä2Xm£#aÝêº3lYÃÎzÌj¹ŽÔã’š#!Þ	4þJ´Ä8Ñ( Œòcµv™‰¾t]­a·˜T™Çàø	Ò÷ DÎ…à¼áQ?^-‹Õ_^$:\ÿìÞV	 $«•N|ì=(vˆZ'q6¹Zð×†‡×üB5VìÌî!y†´¼3äßKœÿã±¿bà v4Œñxðëê£âR]al—í!ÔþIÛo‡P‰@Åt¥äVy”ºîàLïÿÙªmlµÚ¿I¨Ub|[*°¶lke'*¾WdîÀÝdà³ðïD·Ó}\W›ƒ_Wß´ù¶¤rÐNÚ?™øÛvÞ«ÁÛ²X%§Ž0u‡öoui*„üJV·€Æ¦‡b%†}ôãˆi5I¥YlNŸE-wÐÏ‚ûf_W3mþIåà…Äý“…—-ŒmƒÊ¬²Q)“SµÖk´«TC7êím¤<"ÄôÜŒ‡b‹T|ìÆ'¦Õ$µÒ˜Ÿ£óóÖR&>¥êOpœõºš¾ù…ê6Ý¬Òöçú½t±¨î¥S­ŽN\©×¯LŒîmÕø\ÈÎÑÊÄr@¦3žuT
+b7úÓt.5.q©ôÈ3²r0ü=™8TÂ¿ªi­J©\ëÈ6uF
+”²R¸32^÷íñ'ÅªŠóÀí±xˆâI«	ïÒF„8O{%8­žkJšÓMSÈ´dâBEdæÑè ïW‚CYÃ÷O:/OŒN/—I‹ê_=½€xFE”Ñ! Í=¥æi:oÁ~’¡· yþ?¶š'·š'·š[Í“[Í“[Í“[Í“[Í­–è».¹U>±$÷P–Æ¦Šc%†] Û\c©´:é|	ý,e¯SœZ,‘oš¿XríäÎËXº!ëRæ”ÇÆò@áZøv‚ ‡0Ôç> ?Á*ç®Ô<ðþÕ |ø«¼N6þ0ú¹;{¯ažd³ê2Ôév+Däó^tààúÑ[q !òÛžV}Èøf«œÛ¨ÏŽÎ×Yÿêeà¥—€Ë)Vyl|"f÷UÇ²qˆ@ëˆÇ¼˜4Y-˜³YýÍ-!¶6a“žŠB:o%ñJ¤ÛI±´—UQ|£UÆK¨O `¢®=\ý´­ò:ë0¾°Àx…±Paó‰Ìuˆ@œ»!ç»K†âPÏdÕxhw1>×$jÎ³“vöZdàè™xñ«ÕSšUAÅ&[URßd•ý7ðÃ¸Âz·ký«/˜œðr¢U^¬Žä £ó—w:I.àVÇ®ëôÿc>qî„œí.!·zSÛr&«³Õ2…)Wgù	¾…R	-ÎiãQ	8¿çØûPa\Ðž×U%•iÝ¡¦þUï_=àÃpÊø	›Lu ê(îžN¹?†Ÿ 0?Ã†:]½Î¬ä†ÔÏt¬B%“U|™úù²¡NsorNÿ¹f¶ú	ø,»P	!­v"
+Y¬6¼hLï_­ @ @…bé·s¯c¶¬£qg˜v4|Â|0lÏŸÐëÔ$SŒõ9ŽîòbÊ±šÑj#ŽŸ£~žƒÁÒÏ?o²÷}‘‘ƒð}7sAPm:IV¹=n•÷¯
+!ôþÕ{±›{ÍÝh¼ÎEà¢ª£8¤s èu €ÍoL®ëÈTð$ñ„õ;VÝú¹­sõöcqìD¦3ðø¸ñüÛà¼‚3.D«Bˆ«éý«³ B4 Ì&ìV'ØÜTÅ	`õà½Dï 6ÿ™žšÏ·óqýyùjû8V‰Õæ*ëÖíX%ý³›@s«\ÞjrNµ$à|ö=5þÎ† 'ìmUÂ«iý«Kýi€%C™ÉIð:ssaÆ…`*`óµ=úl½÷)>ÈuÕ˜MeuSš›·¨Iò_ÎO÷ˆLü£_©}o&©íÀjzÿêÝ pèºþ{¨¤ÖáÜlu:OñÁ®«ÆÌ)«s¤%Q@ãÍ$Þ<]f›	€ xO%…÷PCbhr2£ÕôþÕ ¼Ÿèý PK·Êëpžf5½NÃ«3^o«ù©ú¼]êe²JÊêÁ¤iÐB˜œ464†€^tï‡uÙ²þUÖŒ:G4'¿ò22YêpÎëˆÌu¦G'/PyÙ4?¡þè.ÕæSB„P_>‘ÑëšI	1t3Î“÷BäÉ­æÉ­æÉ­æÉ­æVóäVóäVóäVóäVs«æÃ]î³!×67(ªÇg¯¤¥‹Šyƒ°@†”4>QÚò ßÕV«F­}^X×‡ìÚ¼ˆ’Õjµ¦e÷26	Lž³Ð%žòY´Gâhû³šl‰C­}­)Óâ<
+ˆ!ÚE ôðÇE½PçZWZ™½ŒV+þ@Â†ÏR5{@ou—É†4²‚²&… „˜´H…Ñ¬6÷eµy V‹ˆÝ€˜VÅ¥ÖÁ¬¾ácqZ„Þ’©rìÓJÆçyBêæyžÓˆFzÑõFN¢$¢HbÈÈÕ³*+jÕqòÑÎÀ Ú«˜kÝ¿UàX„¯lºe·ìÄö¾Ä1“ÕÊÚdà0d^õ-‘B%‰ƒ}êœø¸{Yõ¡™%rÇ*Òj5Ak5¦u«³"Ì,·:~éÒ¸áY¾Ü~
+h™÷ûÄSA~¿­6ì¼fuÁlÕ‡fµŠ{ÈµQtATHÐZˆkÀªŠÆ­/ _°¸ÕSŸî¼náû¹
+±u']bù]|m`«B…ñÄÁÏÀ¡J,O$íÁdu]·Zs®ÀFLß:©Äùúú›aõø‹À‹Ç™ÕÂÌT4Ïoà~by?wpÇjæ»¥ÖAœ…Ø(€xù]„Â†¦ú…ªfÕí¶~anÖ§/ž©¸¿^ÈdÕÚ²öcØÚú ˜Õ‡,!ÄÐ1©øi&–xi_VK@ip«Íƒ9¯ÐÞVi%a;Õ¯L?‰0J“*¹’šÅª5Ü¶¸UÑ·Š“'Á¬ºx^î²6âV[¥^ à{öeU™ÈÒ|—:0ø=0‡»ÈdÛ«o‡¨ç*J“q%•[­ÆõYÃN¸˜.sQ„L‹udš[2×ð9þIýó:WÁn—ÔÈÿÐÙŽÊm™Xl¥Úƒ¾6×!lNl‡ÙVÙÕ§KU¼¤¤jVã\J%©UßŠßB°ŽLcKfáb×ö>a“=Òb›~¹R]aG%[ú÷×js@«<i[Ð¥*^.d;UI©R+ëOD˜2eÊÜ¶å ú¡QÃãN3©4"1£…ÝÒø†èg£0àúÃu”\‡äI}ÜÁãÐwFVØÿ4y/DžÜjžÜjžÜjn5On5On5On5On5·ê¶hà,Ò·Ur«®]¬º]L^¿—§ƒ%JŽ»DƒÆ÷iÉ­ºÏGÑÔß´®/ Û%='qŠÃ¥)ÈÙòç:ŒQË<¿X¡.«å'ô£‡[•@ùPŸêÐÄvÃ/É¼°¡ˆò¸>/9ðMØ·Ý˜U×>yÉ²XÇ@}³”ëëF¢´tÜg^‚ÛvO\°žÓ¸wv‚p•Ï¯z3›K5i¤!$P>”ÄÅ€¹'Ò”VÆ›¬”¢Lž2r´ú@¤UMÃÉKÃúZ¯õ‰¹å6Ö×ÀtwŒë§ŸÂ¦bä„mß1âh|ô|É]}~¹0øÀMjA ¢À´Ò(Jâ ŠÝÁ­JP68ÌC&yrÈÌ×‰e}­jŽ_cËJ½?êI0¬¯kêÛ>Âš«W™‹áø	Æû‹™¯é|¡B¾Þá."TEXd Ô8”Ä!cwµ*E(ÎJ)ÊåÉ!Î[W"­j_ÔÃáÐ¢eX_×ÐXB;¤÷¯o°†O0~?¬:P½Cã(.²í¶±[·Ž‘‘ò!Wq£%ßÔ*leÃÀY)E™<^ˆKåZ¹T•60Ö.ðõ#«µøA\ý¤Á5;RmÆtkdÂ/8§)5~‚¿ ¬^0Ú #åCkg–¦¶eÍÌy)²—±Í¶¿‘ÔºÒ °6Ä¥ª<€(?Æ×&ÉõõuîA„áVŸ’õm0^h.—tÌxR*ô×aô©'ö:,¥H§|èÅ–ªÏl5z„;8+e¦#b'#|û}2Æw(|Kc–J½Èl6ë€¶¾®wù‹^‚ÕŒo×—iúœ3HÓêR	–ŽÌ”9Š,Y“gP«Ö°:Nœ[5SÃöû‰R‡!¢§ä[)•ç]€úœi}` úúºm¬’¸N±4Ð¥¹²ãvÑ`|;f¬(®´Fïlt©„¢LÔ8”ÄÃ·Z#½Aï–¤O%ÕÀY)N¹U®5YêÑeœ¼d–JÎE3dZØ°’þÇ<Èx·ÇñØÉñä¶e •@ùPÚ§ÏþÎFúTRœ•2S¡Â·ßüÎ¦/uˆZ°~ðšCæ3ÇÔXÊz¼ÍÓU¨žâxõ\2s«ñä¶e •DùD.çÉåfBO&enÝ'iÈåR%™?Fy¸VsS~$uˆ®mœw()Á´r”ºo³0*Dí˜Õi!3½:On[Bµ!sÊ‡Bäp>Ý£HTÙ1òè;ö8M×jnÊ¤‘Ó¤ï¼äqpÞ1hò^ˆ<¹Õ<¹Õ<¹ÕÜjžÜjžÜjžÜjžÜjnÕÜßû–qÕ(qpõOkª’Ô}¸ßøI?TY8H«®mhyK¸Ìu5ÍÏÂÎIœt÷eÕnQBÞ—`µRÄÂ`¯·EÀPË­Ú¦ö˜½¹xû™«ž½>¹>€â‘¡yt¾{?|œ×'j)”ÉÆ€µ}YUÛÏäUùÛÜ{ç@Vå‡/€J1ìF+€¬¿7ä€‰[OW«O[æùø¹‘‰y³ÇUY«ª•ˆõ!?BôÈD%D™Wj¼>-Ai6x£z)»ÕÎU 	R½ùª±’7dõÙŠ@µg‡ˆ ëï•\†soØ)œaÏ4ßzfŒ[«W+•±>¹¸«œÿPô>ä
+|•ÛqLãÑG8vâ¸âêÈ£„˜l´j©µ2ZíÆtÜß+åŒV¥ÔA¬6g<„/ŽæQ‚H­çSrÎ£“ÑçÖd}ØùYqàÔg]€sY]ç;]FëCª@5¼YÓÕ–5ÎC©3å8oÙ)kš1'ûüd6«>T*ËÊ†’§Uz(¥m)ûâ®CD`‡ÖHe/¾.ñ:ç—zN¥È9pgo&NC¦×ƒŒÞ‡¼>¶WÓøÕ°_’ñHj ñ)¤Xe6F„  7p’m¾-è`'Öc†»Ü.Õ«‹ÂAZ=³þ^Ée8÷ÂF×;<ËûÄJ1{óãŠ+8'€Éª'„Ö‡\Aµ*¿Òø[²‹ñR$UãY)V¹óAyÉƒŒw)ŽEc#<ÕT‡ƒ”»\vW<U1ïIØ˜CDo‹ÆYoÈ·]ßwmÎawŠæ:B¹ :'§Z+²vé}ÈÁ|¡0Ñëq†«Ã1ŽPªÎƒá*€¤u•T«Í7 óF3Ž±9½ÒëA}$Ýåf»+îoÈüç[Åè½I±5ö÷Ê°þÞ½x(&Í”Ýñi µ»Ê¼YÞñ:c¿Pp*Ž»bœœÂ¸Jˆ²‘j•V7 l¬jtsNk¦œv—ËïŠ»[ºfy3ÀŒg]ê÷÷‚õ÷¾uœœÂàé²±¹ÈægçJøŒE†0)ViÅ‚µ¢Ã¹èÁƒ”»\vW<°Ugøt §eï~Bï[ÂÕÀàAÖ†‰‡ÙHµJ—È'å.—Ýn•œ&	1Ô”½û	ý½o%gÍ±_Ÿ‰Næ
+¦›”5ê.W×ìõ3y/Džïd«yr«¹Õ<¹Õ<¹Õ<¹Õ<¹Õ<¹ÕÜjžÜª{•¾­“÷wawˆ:6ºdJ§;&Õþí3‹ptlŒŒ±asõÕŸ²äÕW_UßÞÄT€_'9{?ða«†…Ô¬ÃÄì•l /0«÷ádHgqll±cæÿúÏ8ÄR‚yùè€”žm=Ë¢š_ŒÍºå–[Ô·71¯x"Ü"ÛÆSÖIfV“ûrñüŒx3Ï3y•) hÔðÇhÌÕ »ˆ0‹®‘?ÑrÙó©5—xšû°Šþ_ü-ÚÆùÈjÕõÝäÆ÷õõ‹¬Ñ‡oO:çë$›­– XBX J¬êÑ£1¼ˆãÃ#Öˆu7½`ózu2àü{ï“\;äëuÜ—±9@¨0ÛÅV$2X››SßøâËæ&ú¦ÓBaÌý[ïOÚ~‘Ñj´N2ß Èª/­Žšüjz_® €Ûn A±¬ÞÙé§¿èˆ~ÀÂÚuøÚh @GLüOýeÉµÏÇ?TˆÅàf<V…˜÷¬×eûˆ@µÁ* õ-}ñe÷¤@Àí0Ztü/~¿†¼”íXm0Û*æŽÕÈ*ü¡H'\—¯«¬²ó¬uúëSìE·Ôm¬LÖ»ñÑ6€³Ðåü;+{l›Ê5Û½¯«Áé?u*©™­š_æ«	Ni-:…I@,;†]ÿÓØÉW²Yý`	*Å«úß€n ÀSOñõ~nç¶ÛäWýP².Ìcüò¬°Z‹TÄu§¾ö Po^Çƒ7óãÛüwð‰B®RBãW_m djÆŠ•…Øý‡´üBÞÛÿ6Ñ:íÏ*—ÚHÒÊíæ]ÿ³è§ÑÌdµQ>•{R­®«ÉëÉýºtÛn(–ÏzÏ!S×7o
+×ï€×Ie®Žî™w õ3]ÔçbÜ—üäÇ8¹5|Æi·Ï æêRÛ ÚJkÊ±Z‘RO+ê8£U&µ:]•Z‰ieR‰’¬¢<I™¬~°|Ñd•¯Ÿ,ƒjõë¦Ÿ{‡Æ;Ã7ï…U èÝŒÏX¸Bˆ‰§`Ñø‘[èu5~Ú=züqêµµÅ°‹Þ¹e Ëç¼b–c5úÌÉoÖôÛ{;Ñîöê€ß©ø@;¦îän*TÄµ2©$Ü¨ŽŠ0Þ'³Y-?
+•j“[åZ£ëjµÀúÓ­ºvÿæçi‡-èŽ*rD{êmL-,L¡=ìÄyÀŸm¡ãx‹¶úc:±ú§WeõÊêévÒ±ÊûoÃÅ„Œ
+Àº"dFÉØÖþ8[çT}ÓµFÏ-ùIËÞVð‰lV[PÁ—³¼³)DVC¬8Ýª}|kZÌÏÖý±Æ{±•ÉÉYž|òïxrrÙÑxaò÷ðG_ÔÖÎ>‰(üóJËMŠÞ—7—³«ÒZ@Œ²5Ýa^äº\G˜z™¯sª¾éÏU‚Ò*¥rMÏe³zT¬^Ê:É¬‚õÍ¦X=>Ü$
+bi>³U&X¬Qoybb¹GÄøkøÍ8¯ –
+ÅÒ˜óýÿn).Õ¤òœÙð oã¥À^Mmád³ZƒÊóië$s«ªo–oÞê*{»4ììÑeLb¤LÙ³""mx: `:mÉkž[ØgeTˆÑ‡Þ¬)Á„'0*T˜›Bá€{!úîIÞ‘'·š'·š'·š'·š[Í“[Í“[Í“[Í“[]˜ZˆƒÜjQŠ.e'/¸®y÷vQ¤71ø(Z&†óÒX‘õ?(_œšZ”œÇº”){tÄÚ€m˜ZíÿÀWÑÏ)­«-C“ŠÓò´¶jqání,Ì‹Ÿ"áIv‹¦½ULØ!h¢™Ùê›¿îñ©¯Ýsçk’óAcrN‚ôþä½šÑ„€…VE4ö0úy˜XÜÒ~å4zÊ¸Vã³°%·ñ,é¹ßû)føÃÀqtÃp˜u¦~ãÞø©ŽÑ*ý“©^æÖ0:åýÏéÜ²ö3ÿ3…ÃÏJÎâOô(¦·ö£›ZB?K™^ Àv]’un ŸlçúÿôWþÀ‚¶i0´p6­ˆ[ì°©àC_5Xý#ú[¿öwX3ábñÎå»«ÄR½{ùÎâ¢NKðAîÏÿŒée S«èÓeª|Ýã¹wñ¢ÇxâºÊÞsôño>ÖP\å„”Ô•6Ò;nVÛm¯fëI$àø‰ÇûVÍ“J- ÛJ%ÖŒ¼Ž0¯óUwûYÐŽÉSõóó×n‘uÿÒmÿè—®Æù«xzµÒË—VŸÆ«ÚIµvnôWÿÚ_ÿqLZØÇòé"_—X®z‡Ã÷Æ 8Ç]Ap—‰ƒˆÍ?†¶CÍ‹ Ž‘ž5È4ˆ·3ñŽzw(Ü{7e²*È²`Û°¬!AÔQ“:ñKUnõ•¿Âÿzë]ú1y†V„ø›Ga°úCÿêm0îPY
+ÙšUx6TT&·hVï9V§
+þîßÓ¬žzÃ‘  1[÷X®z‡ZœËÕî„Ð9ªe¢r›qóJ¸³¸NDß/ù¬¹g·þX¦ë*9o—ðíN6«DÃÃ`Ë{à÷ªIï%ËM´z9Â—ãTûQŽŸà–ˆþþ7fö\"jþÃ_3ÙþÖç~xBá'€ŸùÜ·ˆˆY›]*KÐŒãî“«%"úÔç5«"ðÈqxq~ü’Æ•=·‘¨j¼´ºSá>j¤Vç·&~]2 xzÀF¸ÕíŸ1X•§_yÞùDÀÎ<#N’ÕîïRB÷Ô}KôÏÿÅ/ói‰Šy†ù¿õË!V^¢ñË¿e²JŸ‰‡}/FkïñAßú7Ÿû· âëS©È×+.–(ec—ˆJ:˜zðƒªóW“ZšŠ°ëª–wïÒÙQ™þáðÅž~aÛÒê„ØÍ„öpç6,e5í¯,¬+¢–”Á,ýûÿð­óñ÷ÿt±võ%O^OøüO}ã×Ÿ -Oüú7>e²ÚkC¦6£waô_þëC¢‹|½â›9‘‘×*•šÎ‡ØWÆñ¸Aª)×U¶Jgê8<ýZ€´šx^?„ÿ¾2²u¶­Yýí³õè*^?ûÛÚ‡KC­Z¤[‚ÿ©ÿù0.’–àCµ¯@m¾çÓçß$-ßÄ/~ž|Y¥å[eþwƒeQ ýŸÙ×¶&cëÊOž4s|‰œc’§JåûŸwsïûXÍ8/ñš¼Î6Ï/Ú¼;ç'F¯LN^8]ÛeadëZ1'®Ü °ž÷^†Úü™û¼‡L³‘sBdü%Ó+M¢·`ÝãSKö8×¤²÷«ìº*ƒª)gl#Ž3"Ä’gÑŠ˜SÇã‹Ž©qtcxxƒš|H>–¬Æø=ðŒ:³ÅçýÎmÊjÕå¬ßÿìÕUßòÁóv£qìys©Ü’žLglþC6+[FÍSWg…ö“9õ˜ƒwV3¼1µA	ëN”ßD¾<Íû«ËÂ$5eÿ(s„ú¡ ÿ[Ð    Û¨bú—³‡žaF.”¨]±K¡îÇ    IEND®B`‚
\ No newline at end of file
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/img/glyphicons-halflings.png b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/img/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/img/glyphicons-halflings.png
@@ -0,0 +1,52 @@
+‰PNG
+
+   IHDR  Õ   Ÿ   ‹Â   tEXtSoftware Adobe ImageReadyqÉe<  1¡IDATxÚí}ml\Eº¦W²´^Éº¶D$|nw'þ ;vÑŽÇ8m0ù˜k<fÙ8Ù€³<Ëh3$ˆ b,mnä Ì£ Ò“¸×¾«0ñÞL Y`6s'>¬Q¼¿®·îŸýSû¾§ºúœnŸSõV§;1K½G‰ÛösêÔ©ó>Uo½ÇõTU•1cÆ–YuÖ¼ÅìcÞùa&÷£Â#C,pØšÄ¸>kÚºŸ¶ú–UƒLW
+-sÆnÇ3Vq¼ë~Nšþ£ïoÖücèÇøI»~LÅ £{ÿà-	ÆúñH8%_èïM²Â£wöB¿â²6EW²Õ,Ä¢p†¼‚¬ÅYþ2+­(Y³ë°ð@ ï±&áóA»/š¶¤Žµ3kXãhàßØ-aïª³×AÀÔè<>Pø•Œ'\Á£›JË;(ø}†# ›Qz„–ÿ”€‡:4Ãý%m?nf¢ntK*À¯²ælË9JÉØÚ+¡DÞîI§ýYu1Y‘¨¬Z^œ (]YYE­¾f@ìÀâÐž®lXáîz]‡U×t¥	¨u¹¾&á5-Pš¤íW€}ƒþ@tð‘|Ý#Lõ˜Y’=û´sðŸÈÜ‚¬Æù,w#+¾Rñ”+?‘Æ‹aÖxÑÿ	Xé0ø"ea)týGÝ*Ô¡wV®wëV^ªÂ rf%xB(qÖ¼¼4>šüWÕG¶#ÝñŽlWU<ÐÌøÑ»XJVÑ¶·“l÷‹¬Á¾RýÄî$kýDVrÓI¯®£é¤7:ðX<s>%Xà1¾N²ŽEzùºw–Š§;yÒî9ïzÀ9øOÔ%~–ã—~¥áu©ÊÉ—*ú=±ªªÄçIÑx‘cáy}®öY(þ£ëoÖ•u
+Â±N$«^¬jŸþî®»ÿe\õ‰iXíñœ¬]Ùã;Y-¥r‡ö ×ã¬Ñ²Š&¾>º!¥zlYÉaVHVNÔ°Ï9=‡‹]Š=‡ý˜°ÇmR¯ÌMÞýŽd»¯OUC©JUiT}rñW¾¨W'ŸÚ¹uª¸)Ê¢„é÷ËF"YUþ#ðüPã×¾Ÿ„çê&Ü‘íÐ…ÏèÌRåOÀª‹ØwyzÛém$«ª»O²Ñßþs?  +^FTÛÁêÝßIEáq÷%¹ó&™›¬‚¨~ç>îMÕÁÇ}]±áÔ–â»wî»A†ï™?
+[Ëú÷Nteexnî(åæŽª•Ÿ«BºdÏMTÙªpÊ¥šnqÿqîSé?šøØbW–û¼èXmW6ñÎx*{V_ã»øû©!VÃjÎ§ðsã»VL^jï‘Â…XkÏQj©Uôÿ®Ð6œ×ësk”õÌ©n~ý[üqòÇ¸þ-ÿ¦`ØO‘ É:G¦ôÈë”Ý7â‡ßlµƒ"k¸™ýÇãísRùeŠ2ª®vòQÕ=ÎQÆ¼JÏU­X`¡gžQy~	ÄîKƒ·È°Ü°E°]Ôþ#ðüPã»ç:—t¦Ùd¶\T½/uÇñ÷›Úøãç;þØ³ù:¨JËc-%'¦ eçÿq“Õ
+?j¼"/yh†…¬4Ž¬8¢Zišñ¿ÂùÔÒ1ò|JUÿ§ïuð>¢¾_ÄÿÍNëÌÝ;hxw¿NUÓJ²QU7\é¹jó©„Ì®bT¢:£¯˜³ÊBá?6ñþ£ëo½J°Â1ÎŠ%ˆóI
+UY-IƒïÙi4{„=ŸrÇ¤7ˆª@)HˆKçJ+†f˜4ÏXþ8C×dÃ?'jØƒ1ôÅü ’•NÑò×<›3Ú9üŸ’ÕE<Œwß¬†€V‡÷z—E}àý^_eæª´p¥çªtë¶¾3úŠ9«,ãªë?ºø±g’lÍY÷OÖÀ¸<öŒÎxªxÕ|†º’aØŽùªUe—…ªðFõ²Óë‡	ó1Ú;“{EFÓ0`ÿÆãDÅR‘¦ü+’UÖYiDåÙßÑ4ë?ŠY`|B‡¾s2ÈÜyip›Iÿqã»>WÕoý§Vœ¹áTùüGÛßzg#ø
+%–‹ÏD0#Ü 3žª˜[t¦i™Ø¢º(U×,Ä]Î125Ù|îøNÅÌ­fwØ7w³ æšíÆø¿u+¾ÂŠÙÂ]¨Dµb]ßÂK¦ œÙxbWêÕ›7|ã•Ð’ú‡Xã•›•®ü{UÝÖÇ‰cù™G•ÏôñX‡kÂ¬þ|‹(ÿ h)IUÌa)ÿlp 3ùlúîÔuPUü]D’ð—)©/7~4W‰¸t5å¼J}±ûV¿éù
+Xõ0«§†zæ ËVM©ÃÆ;>¾GÔ™Õ^è ¯|ø¸gF:Îä£jaZé»ö^)74C#jîwr,ÐµSõlõüGuØ;1éÌvÏm><Ñ)¿}ªò«<½ëðVZueÛ DçŸ+jÕy‡–ë¯«J6V{jý±’K­>´†Z÷ÕáQÕ–ïý·&þmZ:ž–¾1ïU¡MBå~¢åò
+ÆaíÀƒ:ä/áœ—:KÿWžWOÒ &…­ŸªºY´ª®2fìùñ7cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜±åg¥È*3fìF5ÝLb´‘¥NŽÁ2#Tf=Cé`!–üZG¯Ueê£‡‡e‚Å2VÃ©Ï<œ1mkS¤ÉåÅ4iÏ—*.š{Nü8X™aj~ŽéïÚ€ânAšx,ÿ—×%fE:Ã|éY˜DV÷j
+žë¬Â¢Úlg6Â(:«k~Œ¥÷MöMâ×5?¦4	]WO·>ºøè¯‹W¥È£—Z”iGü|˜QËGüJe´çK[YcÕµ¹pmjE\f/¾ÇŽ8&¼OQÿ3Í ‹âœöý.3t¹êt2'½-Và8ßùá…pƒXµS°rÇY#J!«ûñQð¸ê ƒ"¤,ub×@F­³úKß:¾uÜ^íùiy©ª[]<.Cw¯‹ ƒ¯+W\)¿ïb¼ª
+k¯r-¡åƒî.M¢t¤Ú€ÔM¨‘qÆÊ„õÀ²þÓÛ°§·¦#$^X$žÑ"œ§‰½»ñV`•TŠ4™máÒ~÷w%Pµp1·š|…+&UxÔY‰Š8«Å*Âr²8:£ìæ¬ ôàk7QÐƒÒ€Tªºëâ“Êú¸ð“Ö$ˆÛÐŽõÎÆ™¿
+S>~§Sü®õµ„jÌsá­:5Þq.w°&_Z.ôX=•ª‰ü:Þˆbwë`”ÁÒ _àkd‚{'¢Ê0Û:ØdÇÜsÔþ#ð«q«¾i!224Óö•ünq‰\’9„-‘ªKUTäsSU½ìuVo•@;¼U®³zÛ>^ú¡=¼—N²Ûö•ªîúp¼¼>oõ…PÁ¿O…ÇÚ
+ @Iûêú@à£×'G“j5©o¯*U®>îä^«*‘e›w‹ä>Í«Ê§‡×á« Q°†”5Í„¯Êç†<$ç#ž5¶JÒÙ»ñ¨jÒö6eî)ðÛ_ýîùûd]±Ó2‚°–B:À‡ª^ò(*²:8JÊÁÑYÕSé¬†®òÒïKÝ—“è]U4_Ærj¤{Üõá5’×‡ãaÇ‘/íyó—Vÿ?“ìG¿tÿäG¿¬Ôõ‰b@xPUŸä7O3§|ªéª	ÿI°òQ5ÎÝQü³GwÄ	*(;³w¢f·0*×PðUU<Y¤Æ”ˆÿñ¶v†²¼þb¡ÎtÂö5{2!ë,}©Š½ìÒ¦–”:)·Îj2Ok™Îª’'ÖŠ0I.q\(Ä%ojQË¦âÄ–Õ‡ãa<ê¶ëÔ‹”exÜAgt‹û'£[d;×¸Ûù«ªú`rÈcd»ìž¦–j ŠP¹FUÝ$”UeJ½I6ÙTü³É&Z}ªªîz¿Þõ(•z÷vfu¨zÏ ¿›{}Û¿ßÑåÝžlx“ÎUõZïè¬ŠÇ.×Yå²ŸbÌÎç%»†Ž—¨nwÀ·@×Ç©¿¸S9ÞÖ|Åºs%Ú>Ë_õo#§üž9Ø\¤EU~ÿ/ÝÚ÷t(r[½QµªZu™ûOo;°ŸËèÛ!MrU»]ÛÎ0TÓêcpDÅ‘Õ? .¬õÚcÎêPuí±Íç¬F€²€™û²;œ¼ªŠL_¹©ª«³ŠùSÞÓb}¸R/ŒJ_Ëç+ßÔh¥2$õaµ£i­UÕÇ©¿¸S9>¿Ð„}7ª6rÊ©µzuùÞíùà~å›½4­ýoÄ¨
+1Jœ­€Ñ
+µŒ^±Ì˜ãÀ~££i CÞ¸5Àÿ5<PïÚ¾rï/ÄG¾ÿYëkà«µ”—5¢mK
+€‹2å§ªžÎª5,ÂßÞ?ñ1'ÓjÃ“Q”úÀpTë¾ºðöÆ
+*¼ó~ÑI?HÕ×ò«):´úºµ\©ùùûèøJª:3çÑ´UGo)XðÄ.ÌÃ‹¼±ê*j‹\÷¾?}ßã‰ŽÅG~A{Y#ÆW/3ªêé¬¶¿!Ê¼ãø=ßïCögÅu	*Ôþõu_õðÞ®+«Qeëƒ5Âw¯:øÊÏUé†êËK©Š?UœW‹1j\ÇÆS5/<«z7P^Öð÷ª<,S¤¿jˆUU8üÜªêè¬v,Š2‡_Æï‡_ßûiÚë»Š®î«^Ÿª¥ÖR5^v¤öNl>G×¹]úg…þõwö¼sùnzTuO=Š?/“ÓÛýzÆ²c>ÚþÎŸb¶#7Ö»cg’æk¿þÞ›TU—j÷©*-T=]Ýúèãuu}¯£>Ý¨ÚNÐ­Ùø[]â”:%/_›®ëS÷z]6D.Ôm®‡ƒ¬ÄìD7UÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cæú£ì´>ÞJ4hëPP…®+«§A›;'G_®XK¡ÚmL«…˜5I.},wFFu§Þm$S–-¥E-;Ã•
+C3I-`ÏBëßRÕx1¾ˆÒ“T±JÝ•;hÎŠœ8£DêYøªJ‚o;´çÀþÞÙYÂš5ŒM²ÍçäK·¬É°Mµ;šª¾%Pº”Ž d9Kîh”ø€nç´D[z¯ÅgVhè,®¥'Cº
+p!^MÖ(³WK2ªX¥>UQ‚Ä%âö°^ƒ›p8	Ë½Ö^#Î–Ø„+.@—ÔñgêCêz%É”-Pr
+–‚¸K¿Xÿˆ
+¼…‚¦nÓÁ·>½»×=‹Õ”ÞÑ¨ðÅeSvR—×£’L—zªò½Ö5%9UQS ¢¡\ŒW‘Õ«ÙÊKÕö'Üh™p)Ã´
+J·”r˜h¡ßžîM0ÊF¢Î(f_¤R5ñ/É//§Gïä+óª‹õþ£±¶x	1"è¿þ³¨eSðú5…
+­Ö:Tõöf¾ð=+Š7ÉQÉ§§\Œ—“µ²TE¢¡ §süà¼¬ïrÆßÞY®s8ú•&†kíìùû¶ÿ­ª#pSÕŠ5Mà³Tªb«ªDÜŠ[Ng¡5QÒ\sÇí 5PB@[ñ 8É¨‘V1ªª¢¤¯¬&ö¦4Wsy[šÇ¾
+ŸwÒU€½ñ2²V–ª¶îì7ÁÂ7”€jïÄÔÐÔÐÞ‰d^~Yf·íC©«_‚Àh;a.ÌÇê&†M®
+i §ÂU–ªººªWpzs`>÷/Ö"¤Ô'OòIöáÚÛ²ç‹y‰Š›€¬:ÏBzdõÃû“µòTôŸqÂ£ï=Ð¹Š­b:…‚°"ü½ºùm«/¾Ñ-/PÜ÷WÁDQóÇ´Íâÿ5Éîþ7Ÿªºúªúmå`ôHý¥%AÚóVµÒ!ÉH¼Ô›×¿¥µ÷@"Q£¶ zãÅÞ‹|ëß’TÖ¿þ-ï³*OUý^ºûÒ¦6üº©­û!Èî‹Cw„kÑ|h¢&Hd5ŽLEYày‘Ž'ÙÆ£7Ÿª%½*Ó<C'@­l Œ„™b!w L»WW(%øÒÛCßæ4¯ƒƒæû£¹3\»ú“„³¤ûÐxá­ôú·¼Ï*ª½³§·QF¼Ò¨…<ñém§·…ŽºƒÐßƒg?ß‰ÌÃû¨¤¸^±)DŠ}†{ßUŽªÖ˜|Q­›ÏÕ=C'@­| Œuw L»×‚Q°E¯=‘?þx+Öx¥"¾Ûþ—gýÝäSÕïOÔÒ¨jëä×ˆ.ÔÁfqj[ýè›Yà£ÀGÍ¤ýCÃìáç„“m>{èü=)­°ÆZ¯%Ù¿§P	»Œú*GÕæÜ]ëÀ•È /— ¸8LÔÍ wº$?8üñM¹)\Ä¯«ä£µ/#ª7U‡fd7'6´\h1ï
+vI’f”EIr˜˜Ç=½1øwöÜ\òWKÖžVZÄHKüœgþZ‰ƒÍ¡$m¤äx·‹ÉÒ %œËÝ`j}ÔTuTöQJZ¯è*H>*QÝxkLFT¿ÀïÞy†“UÕÅ¡-†)‘Ã´b¾®iA¨Ùó|q`Á¿F­'ÁŸÔ+	˜áç4^Q¶y´x‹ÎH)’î#Ät^­•?@]^`AÕRêSŠªq¨jgžB:År<hÌ†ÊRn…ÕÊzÔ”ßPÎ¦Ë)§ò[+•nêÒMÙXþH!‡¦´¹0æçI÷‰”rœË¯ïsKÏ¡Õ§UãR2ðËT	Xýg Æ´Ú³EýcÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆnŽÁj¹À²¨Ç´yÆŒIˆÚxQüqº7fMƒîË4EÌFŸ±.Ãú—34<.çi”á’;›áeÐ’iš²²1c%9ùºæîK	éÊî†Í 2ÍJC”ìnÆÕwÙüøEÂ¤ùcFùŠ‚´†¡`Žà5v6«%Ë¿]ø3¸ªT«üyìÄ`~š¨a¢²²[[ÛJ«>K÷Û·l<2ï-4¿YŠçKâhgQ°®öLÓÄxœV§wÞP¶ì~ÑÉMõÎ¦¾‘¸0l 3šÆ…ÖaÅŠITˆÈ€hwJ¬m¼¨¬èÁ¨­™xIM¤Õ¹¥¸|«U7xË†S½³~2ß•?ŠkW1k¥ü½C3]Ùã;Y­•nSÞ—ºÒ‘AíeºXÊYzø8,'‚x‰<k7Kx‘ƒÞÂ]Öù$³¥x¾$Žvë´g˜T#wû“;oðÉýòÂ@Èz¡_VÐÚ÷mán|¢HÖµïËhåØZg-^TAn«¯-‡)ƒà–¯@4[*Ô9xKãÅÆ‹çÖÁ²²j>Å!,¬VtË:eù°Ô—Âqn8%oh²ÊéS„(2è\Q‡Ë^éaigéáñí¸F—¸3€³v³TUDV¸l’QÈê…§¬W¥cÝí%’UàåªeŽq©4ŸÒÂº/í¾U¾¥$†_æŸQ!Âä´>¼µøÉÕt×|é ×,È›G<tßC÷¥Á[ÔxTXmf|ì·<©ÄOÚ¡¯MTÙ|(w:ÌÜã_XÚ¤Óþj7w°´³tñ¼å »
+AXßÍ¦ªpÙ$‰^xZ«R±îö¤‘ÕÁëj¬x”îæÖ`ð3=â^±ñll±+Ë—e»QâÙ8g8V‡‘+þ9MËïë/£ªÀž –oè14snb›¡ëtXÙÜÛsŠýÉü×vEÀl+@\Œ’e¸,å,·cÑ®â<§(†ÂiõHVYªr—¥QÃO7£aÝíI©‘>Q%dÕ#jUÕ†³|;H¯Ø[bÈÂÁî¹Î¬Ç#ÊÊÆá¡«ó,Wés7NT1~ÝÔém&Ç»²{' \­–ãŸ¾·’bíBKJ¾o8å%·!˜…€$•ªQ—›¨Ïj:©‡/¦RX)$SyªÞ³ä§ëR°…DUg_Dûƒè»¦ÆJÏ\ÑýêµªjßN®¨Ö–SU;~·?¶÷O‰¼h˜ssýdáõÆ£}“6Î(T<ÍÕ_ž4ÉïÜb5øõÔÖ £^NªöøNŒ%8QejF¼7toç¤îMyÛÓ©ê`)g[§‡/¦ÒÐÌÇ÷Ü|ªºïÁ?òÆÓ©JÁæåuÜG§ºýãLïå•ŽÞ/=£CTÜ hdÊifHºÔøcÇžùæÙâG4öŒ,¼îøóáõŽ²`’DÕžÃ{'xý£ÊG_p/5øâ‰@m +×$jVÔH¨¼Š3Õa"…*Å©,å,¡ûH¿JÒµ¯È¸…T^Qyª¢o&IÃ‰žJUVwW§ýÃLçeM¸ø~ñ×3t¢¢½“²»A©ã6ôÎÚÁrÌÝwÉ¤Ê6œ²Õ¿í¿ Ðò\0HÀL%LªX5ê’c¨¡Æç“@ HHÃƒZ‹º|NVÜË+7WM«Ã{ü­¦¨cigéâ…à*¼Îê¤È¸UšªÜ7iÃ‰ž«Ð±zŠˆúdõ *Ì?¯gtäÇXõ‘í8îõÌO©°XÍî°:ïô]2üÉ]Ùp^°¸++òÇ>Áø¸A”èÛVÚ›Eí{âæá“´DB.È&¨/ÅÒÎÒÃã56Ÿƒ©AãrxY#Ü•÷yá)ô£cKQtÈªó²¦à~­ Îð¶ÿ­êõŒÇÅ! ì™;¶C}ÊƒîÈtf{æ6Ÿƒ$N§üVsjþ¹wup˜Z)zÅý|ú-”wìg+nÞMVjÆ/d+U½°”³Ê~Í¯ÄÛêÅ²i—ó:_ixš£wµêhqŸƒr>©é§ƒ-Íx«ë¼¬)ºßÝ·ÚyÐÆR=! ì–ÓÈÃ¬:øŠJ/lÌÊIk‡ÔÃV@¹nåÝ7ï475ãç8«ZõØKÑJæ(þœUxšzñ1w)^ê \ŸÔ£žözÈªó²¦¨c‚¨©2fÌØèvª+‡6fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜±2›®Nï÷oŸC–\žõ¯¸ F1Ö´Ø¨UZ÷JVÌš\®4ÍéôÆM§÷û†gq1z{&³YúT
+£,ðHX~D­uÁ\Ágô÷}xþ>½+Y±ÀèdNÞÌ®†ïo‘l¸Z´X+F¥Ó[ž/jÃÿ+S~2/jVîò¹8óJ»r^­Ûïè³Ô‰]J}JÅï é*Û<£í2Ô°&£JÝ£ë¥jOµöM@âÑ¯#0àà¥Oß[‰úS‰Ê÷·°‡†XÓB^uzùe…\§×Á»]…ïýd®ßüd.°¥—/„ ÔxXE
+¢f'vÑëO»_´¦“‹HŠ${è%;•kçt7Þßm¼ƒÅ‘|òúd{a¡ÞŠµ^£Ô…Ç›¢ÚŽE§†5Ê‹¦ÑBr]W·ú¬=¨_¹šÑÃSA¼»†f(ø0  …ÙoU×5Çq,ë_\×lÿuzËªuz¼ûã»²¸ö×oâš=Yiå÷Î~|§ˆ
+0+¬=VŒÕòµö”ò… ¨J—Øª³Ý/²›Þ½ÔzMÖÐ\÷zCåLÃÿ±Ã[Uõ:|k*^8"¶\WÙš\.¨ïXTjX5ÎSk½F‹u\”1çƒ ­ž—q'Žöm¿Ä£/ñQ¿”UØ•£*«AÉ½DNZ×®?_¨[#ŒË4þ:½^j|Â5LÊGù­|| ©­ÂÃ¸ÂBW{6[uQF©¿¸µ.1Š´$qFÈí9´Ç‡IHg)\÷˜ÕÍàž5°ê>CÃ#ÇÃuöXÜZ¡é$Ÿ#*<Èß«sRÉv¹1Tj>J¸ºm>*§«ãÆ#‰¢(®é
+Éé[F¦hÄs×©õ5õÕ*jQÊ¼–&š†è&×ý&Pêˆã»çŠ›L®Ó[ÞQ”áª1*üÔ«‡ ¯š;¤Ÿ´X}ÓI•Î°À[Q„?Þq¨Q½ZHèóûä÷Ý™•ÕñÖžV¶ŠEsB’¼CÔZ9¾éJTK¶Ë«¢—ÛtuŠp¡«Ë·ºê/©Oïì±´,.k¡Ud‰sƒOHMg4=-)ï+Ø¿èý“h2Á¹N¯ƒw÷/r|WÖQn=·GIUù;“˜'ª„j,¬ÔvðîfñÇ³þÏí™p¿e¬¨ú$õàºÇVGTYñsBZÄO‡1pçj:ü˜›¨rü±Ž"n©TUSCgœœrÇve§†¤AìÛ˜±™Â˜FèC+Õ–#‹[J–¸òTeý'v9-Ô3	Dîm¨Ó»Ôuýuz¼ûã¶˜?ÎÝ0»• ”oËÿ÷	¢ÒêãhÕxð«u‰YõÐ&“·î§‹»_”54×=fµÐÀ07‡ÿk×œUÕð0‡·]D:Ôøæ‚ä‡Ïj±dwÐ/+žÚP¨¡GUVóäSŽç<ù”\2¨u¦»at´cÕ^zYÜR²Ä…mCÔ+ÔÒ7´¼þ¼#‹ã,|ú:½Åi™N¯ƒw÷º*|^sàÜmå|”X>î–’Ðª^ýÝ1\—#ÁÓÍ¹”	&˜¤%§{,2À¸Uˆª>ˆÝŽ.c05zØ#ª
+oëg…öNà£×O+©©QÊì“­’ï ‚®•¢óÅ,ÎÌË—Å-%K\ù´Òî[S_`ýyŠ«+›úb÷­¹_9Šë4ÞÒð"£U©ò+‡çÎŽap’}²I­¸èè[óM,Bª.ÞNtñœàÇwªH—Ûj”æ¼¬…ü¬E‰ºïœú…žLÒÍß€0DX(©kÚµ§¶¸”…NoU§÷{†gquz
+RèwkÕ§Rx'ÖuZà[šóÙÞ3'Ÿ¥zÝyy²¸×“%®<U…ŽhN[¹¦è®õtz¿x1ã c—cý«õ]FÝ¯ÕB¨"]a[J·˜¬úDÕ½[cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3Vƒes{L+3VH]YPºA	>ûsŸ½¦ÿ Æ•úàü3jYF\ÙÚs¸â÷=m1ª&ÔúŒVÙ•ÂAÉ¼?k\+]Æ6yïï¾“¾»1ŠÃêgtÝOIW7öaïl|1«ì­É è©õÎÆ>$]e7ÈÚØ¿W¯I¼e?Þ¦ÑL#•àÿ>|Çÿ½ó
+íÒ­±´]ÚÒ
+p±M5M­UdIú² 61íýÔ ûeÇ¼Y½Gððþî»híO n‡Ô3çÕ­R:^×k_'Yuuq#ìáçpõ#
+âJ¿‡Ÿ‹¨2Öx¥™ñël>×ÿOjª®ÙÌõØcY²é¦ƒ¬!•Ú¡+ðsZ/üíìÞ×D‘}Ïá2ž AƒYm™”® ˆp®c#Æ<'x»ÏSKx–Ÿ`å¦*W[,e|‘6â·BÿH)ã¶¤kj•ÈÙp™»D¾U(2qzx‡¨9éÕÒÉ*tqa™/,ê
+Z[¿¯	0Ï>ýìÓ¨§ÖœóŒ…xN)fïÄƒûÃ@qÕ¨‡ÍÑþFUÕ¿—w(·¸a;Ë‹ð>Ò|T†c|Ôw2 Æ÷µeiT]*æ!_\•WG{
+§è]¬^ÐÛÝ…ßÉZ5ÌÔí¸t|‘6ÎoYHÈÎÈëßaé½¿¬ÛþþO@¿=í«„¸Ämy^akä¿º¸ñEü.¾¨ÒÅuô‹îzà®]#Ù¥¹ hWvü(ëî:Ô,•ã6ÉõA“ëß‰JçÂïFaœâÞ\â‚w©øW×ô¦ex>v¡<çë?|ý‡¶Ô&i_¾q†zëÏð”É]e²R_Ä7©|& c*kÖ€4fÔñÈ,J «U—øÜ_Äh“ø\1A¤„îîèù•¿ùµ¥÷ºu\·ý-‰L\Ïœ^çê~ÔP¹hrÃÉ*tqa0¯ƒfTêâ:ßMUùÅ;qÔ>µet‹u¹MÙÏYÃÖA>†Ž€á«þ).,ù ;É¦ïCÚbwÛjE)øÔW°â¾ÅÏ…ÆFÓ«@þs4¢e¢6^äµQ9oI}4Èx<û“Õ.ÕB?¢–BÕÂß«ë#ˆš$‘åHxì.x9,•Ìa!®RTèpgd5ºÿ‰¥÷úxB·ýeŠŽü².L7@¥*ïž
+AsduttSëâVUaà‹RU|–I	xG¶ßƒ$T®üÃëýñ­Ÿ¬›Âë#_œùIF÷MÂŒö_Xõ@fõo÷ÙÂQ°IDÍúI²¾I?|÷%Ž¿÷¥$Ûrê	¥ž¹{œŸ‰ôÌEÔÛNÄ¸ÜwÞ•ó²qqé?ÕíéâDØ½}­}o•/`Ó£ªCT±i	¬ñ<QýR{\yYÇéÇŠïFÁšòQJkhûÊûœí¯^?Us:ÙE‡ý|]ÜÖüVò )Z|HÝjsWöáç‘|éH'|Ôîo‘‚ûò=d|ƒß¼j ƒ#âùTçÿÚ%ŸOáÈ	Wúá! N#ÇwÌ1[i¼H(½ðSV½ùÜæs¬ú…ŸÚ[=ÔÉˆŠ©ã7Ÿ³ç•1ÿÈ³¾…ÿT]A GÔæ›ì²ý3À•¥ªCT×»ùlR½Ý•CV9Qý\V#Ü› ðNÞÓjüË‡1µ/îsŽl ¢R•ÏÉ%^s1“®ŽnUÕjÆ¤¨ø,½x}ÿ…f—´Wö|JuKØwþž­p”íýÐçS½³m,ð<œ‚7<Ößÿ
+ˆ‡È»¯ÿ…Õ[ÃR<&”€¢pý÷?¸ïÉ'Ûï,°Ð™‰ïŽ\Í;ìïÌÊ5ªbH$ä3Ç#¸Q“4\ì¸âø_ï§×>È/§ywãOº§rD9©ï—YUD]êà˜	Î‰Ãú¤¢@sÊåè]ÙÁ¿+'UaL}ÛûhƒšrÌU±Ýßç'7º:ººsU|k)Hú€@§ôáˆñhßN¾qž#è›ÏµÁ8Œïy­Ë­àX²ÇÏÅ±#ö¶wýÙ
+´1!•í‰ÆR'7âçfÈuã×“»²0Šù¾¿Ýp¤!WˆºÃ–W+NmÙp¶\£ª š-‡ioD$Ï £ãògúÙ Ë…%%ï¼ÃømÊíV€]”Ì±œ™ráw*²ÊZÞ}¿ùy›+L»
+N¾äoçu©jÚ}Îxt‡ô•“¢ƒ)lSŸïtuqõ¨Úx±ûÒém NyKÌUª OnDbƒhf}ëk¼>Î6ÞuÀfTï%þøÃÀ{‡ö¦ <ñ®¸’úÛmj¼¤FÍcÂmU¾Ã¯«ì¡ùcßò;°wŠí8ž‚@dG¹FUAµü&©‚ ÉçêÑË=nðqÕ5]iP¼ˆù}§zê:¹kâ¼¶‘Ý-¼ÄÊ“»	Îšl*'U›zãax«W…µÔFÖdZº¸zTí¾NR“s+’ˆ#«ùø wÎÀzgi:·°MB„Àqø¿žtúMÐül#¨^Ö'G™ß£Œ*^ÚtÛ{œØÕ=§rEý¹êR“ºnQù$adJlÄ02%Ÿ®TÚŠ^Š„ÔÝ<Ó~g§?ÖOóf*U×^óÆ?üœ:¬½N¢Šž”®+›o¶[àP¾UÒs’|çQ“»R']çVó-L)HK¿äžmYËÕnµ\±¿4}Y©ëVÓD½ÎhÉÍøRð©ºê;g¢Õ-©û'…3a×¡æM¨D­h£}´1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒ3fÌ˜1cÆŒýÿk¸*Èš4í`Læ$bÙ	ªòœÖUêì²ë4\dtœ×Ö'žÿ®>…HÈ„|Õ.–Ü+Y+/‡GçyšÎó2ÅOCWvþÓò¹3v,«'kiaåÏÊØÈ­ô¥W³¿‰ŒO6ß¯Eô=Hv
+$L°l¹xI¾èº/†˜}Š^]èÚøÑÓxŒ™\3ÔèæÉ®5¯ç °¤ÿQÑT&Gç9AÔy^Žø¶¯úÿiä•}OÜó[5Þ±Æwq¥4,sJJ×ÖI.myEÔ^ë%ˆÍ–'VñB~½d×¯‰Î}ã*þj÷­*‡	~™ÈuÁTå®k†õ¡\f†KÐ¬Ì*¶®Y]›ÀóÙ_v'IÙÖË¨æºáëöé‘©6ÒXš—oÿç'Ÿj&uÍìÉ§nÿgúèT]oíò„ÚŒþÆ9”«©ó\*¾wVHÓ–¿|Ì	Å>Œþ:ò5EFø'J¿‰ËýÉ`î¶Ä©!ëòA¦¯˜ØÃê® É
+ÄÙçe~ÀÇ_;ªÌð5ç×±ÏŠ©ûŒà¸é•‹m_&þO÷¿Æ«ViÚÅÝë<}"«éºð°hW9ÖX±6öÐKPÆ£G…"ëÆ­£?¹ó/Á÷”åO¯^Ø÷ëhC¦HáØÐLû¬cß«¬iÂÌP¥ªjßãÿ)}ûûÐQQÕ¦‰#tM§g¾°9ÿÆÔxGw—‚ïÊÙ~d;_åJ+ßRá»²¸<üõë;¶e¢ŒÛÞÂ5/Qs¥/5º²N[òÉ!´a+„N‰PÏb+üÑº’éIÆ}´ûÒà-ƒ·t_âq“U=–MKÜÊžÙYÇÜþ5nožá*ÊÇÚîv—Þv·bŽÊŠ{]¸â¤|”~	Z¨{-èÿˆú¾¸ë‡^ˆý›ÿFVviÏµ3™YaÙÒü˜ô«=6nŒ­ødS;œ-ŸÍ´^;°uêªª^þ|ð¿=úó_Èw+°ú"‹ŽøÊàiÝ&4¡ól“#´w‚“iíûr|W–ô‡œ3Uø$Ûý"Jì~‘ŠçO@]~tÎâRJV³©MH¿w:Ì¦“¼ìÕ@?ÿþ>ëO¥Ëé?èvdrº²tS§*$í&~1>‰ÚÀ¨«äÖÝZ}^ùnÍL(ôÆ]Âf*ª&ž*èQž’aßIÊÇðÐê„|”Œ3Ô*°—‹÷O¢ê?ª¬úç‘Áÿrÿ?¶*ñ¶³4ˆGyz[äk/täk—‚Q–ÏÏ–µÏöWC¿CÙKºk/Ýúx§¼5×|ùäSÎ*`’ÏÏ¹Î³˜Q±ÜÂâ¦E¾w”›œy’
+o‘ØK«YqTøbªúãß$ÙÎóÏ-/PtªsZNî›KÎÛQ¾¹*>§‰Ý¢ì‰ÝåU™@»Ð"JQ;¢ÄÏÂ¹&¼
+ŠLxÒ;+Tã/+¿ôÚOÝèµŸÊÃ>è»(T²›þ?Ä·D^N*©'Âpöï·öþ$I¤¶õWÖõÔW~Ó=üæJ|ÐÔ_‰óUTeÁÄ7Ö°P`ÿ;CYjkà=ßsßU[«åmß™-¼úÆ;°};³2|÷¥w¶€o«1ƒp‘0‚Æ~>†ð0Ûßõm·õ
+@JïrÇŸócÙ·4¢ÍœØâ?qÅ÷\ÕUUéIV?2…åL©‚/Æ+Ð¨ê„¾<½Ü‡^TõÛÛ¥?t©j\ÐJr£¸ÜÒ€Ü§˜B*Á˜³þŽ=kÿmü¨¿þXï,n}a¿Þ©¬Õ’¹Iaù¡dìp×·öãlñl{\ïú6v8”¤Rµªê…Ÿº·­²Ò²™ä¹f¥1¹ÝF|ÕÂ;äeó=\DÂß,D¥:Ïˆ¢rñ˜xQTâ—Ž’*|{n¶‰S
+9~à=ü}Ó•¾ÉG~%jû:D…©j­<Óáž«:£ªjO%Œþð
+ï$T8!jÿìÓÛvmÛå|'O¤‰Ð—‡ÁÂ¹âž±z\vsIv`ÿÈ”¨Ê¨jµ-¡^›$-€Î^¬ èGQ¯¡{ÛmŸ¥¾`ÒTûš#Ûc‹Öž­ã¸Ÿ|nâ.ßªNŽ$Þ÷OÇÖÄûÉ«šJUV¿áìÊ¼›t,ßéÝýâjÆg¶-÷…þûmï­ðNV¶£ó„zÌþ:ÏŸÀ—(ÓÎ™*|1UÕx=Y±Ök*üƒûùt«ÎM³þÏ÷NÈåNÝDUÏhK™«ò ØžX(åˆ„Rvñ!±#B_—«c¿xï€R§·Å¹‰Œªo¶E5Dg>?úf›¤©XQ‡¨QéË”|@‹"ÓÕ¡M‘—£ìÈveC×>ôÒm×O$HãÞ#]Y”µ®I=ÜÁŽ)_Àëë`©‡ƒkø©¦*
+’:aØ>!X³çË!›ªWÖ^Ýô†wÒ’œ¶l'è<;øvwgIÀÓt¤_Û?Jh”Ÿ`ƒ#E:fdx=¢–6Wu<ƒ†ÒÒöÌ ÛÓ‹âd2¦di¾×ŸË‚Œc#hÂ¬c4íßû Ô?<´çÐHº¤à»FYo´ûVp¿Nñž;„Ý·J\ûÀ ö¶‰Ïÿ>„`(Šˆét¸3{Û>â¦ŠÁã;;q†ºF±‰‡xÝ4Yc«ã‰µS¿$w¿. ½……—dÝÐa*k£«ó|£ðQÕ,¿í+xñ’¹ýs^¨Kß«ÒæªüP^Üéîn€OÖ®L5m­IÛwl?-.Ê²ÓÛÒ÷J8§FÔÃê…ÕýB.-:2…ÀÈ”Ý!ÐÎêÌ/AÊ#bÕÛ_m%ÌIÄ(œ”â$|¼PZ[¯÷¥ 1½G¬{^ç#µ®òòÄo>×3×õmèw?'Çcx¬£·[ü^•:W•k/—`'=ÿ°Ð~Ö¥ÆêúWÒ(õgQ¶ªbfv7UŽzÉèMþ3µ‘©Æ+Ø‘Kç:ÏÑ4|GñCtªùAË+KôÿÊ¨ú{@©ÊÐÆ–±[0ø5íðý±ÿE›|yn4M    IEND®B`‚
\ No newline at end of file
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js
new file mode 100644
index 0000000..6eeb15c
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function($){"use strict";$(function(){$.support.transition=function(){var transitionEnd=function(){var name,el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(name in transEndEventNames)if(void 0!==el.style[name])return transEndEventNames[name]}();return transitionEnd&&{end:transitionEnd}}()})}(window.jQuery),!function($){"use strict";var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.prototype.close=function(e){function removeElement(){$parent.trigger("closed").remove()}var $parent,$this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.on($.support.transition.end,removeElement):removeElement())};var old=$.fn.alert;$.fn.alert=function(option){return this.each(function(){var $this=$(this),data=$this.data("alert");data||$this.data("alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})},$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.alert.data-api",dismiss,Alert.prototype.close)}(window.jQuery),!function($){"use strict";var Button=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.button.defaults,options)};Button.prototype.setState=function(state){var d="disabled",$el=this.$element,data=$el.data(),val=$el.is("input")?"val":"html";state+="Text",data.resetText||$el.data("resetText",$el[val]()),$el[val](data[state]||this.options[state]),setTimeout(function(){"loadingText"==state?$el.addClass(d).attr(d,d):$el.removeClass(d).removeAttr(d)},0)},Button.prototype.toggle=function(){var $parent=this.$element.closest('[data-toggle="buttons-radio"]');$parent&&$parent.find(".active").removeClass("active"),this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=function(option){return this.each(function(){var $this=$(this),data=$this.data("button"),options="object"==typeof option&&option;data||$this.data("button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})},$.fn.button.defaults={loadingText:"loading..."},$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.button.data-api","[data-toggle^=button]",function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),$btn.button("toggle")})}(window.jQuery),!function($){"use strict";var Carousel=function(element,options){this.$element=$(element),this.options=options,"hover"==this.options.pause&&this.$element.on("mouseenter",$.proxy(this.pause,this)).on("mouseleave",$.proxy(this.cycle,this))};Carousel.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},to:function(pos){var $active=this.$element.find(".item.active"),children=$active.parent().children(),activePos=children.index($active),that=this;if(!(pos>children.length-1||0>pos))return this.sliding?this.$element.one("slid",function(){that.to(pos)}):activePos==pos?this.pause().cycle():this.slide(pos>activePos?"next":"prev",$(children[pos]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition.end&&(this.$element.trigger($.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(type,next){var e,$active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(this.sliding=!0,isCycling&&this.pause(),$next=$next.length?$next:this.$element.find(".item")[fallback](),e=$.Event("slide",{relatedTarget:$next[0]}),!$next.hasClass("active")){if($.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(e),e.isDefaultPrevented())return;$next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),this.$element.one($.support.transition.end,function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger("slid")},0)})}else{if(this.$element.trigger(e),e.isDefaultPrevented())return;$active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return isCycling&&this.cycle(),this}}};var old=$.fn.carousel;$.fn.carousel=function(option){return this.each(function(){var $this=$(this),data=$this.data("carousel"),options=$.extend({},$.fn.carousel.defaults,"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.cycle()})},$.fn.carousel.defaults={interval:5e3,pause:"hover"},$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.carousel.data-api","[data-slide]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")),options=$.extend({},$target.data(),$this.data());$target.carousel(options),e.preventDefault()})}(window.jQuery),!function($){"use strict";var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.collapse.defaults,options),this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.prototype={constructor:Collapse,dimension:function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},show:function(){var dimension,scroll,actives,hasData;if(!this.transitioning){if(dimension=this.dimension(),scroll=$.camelCase(["scroll",dimension].join("-")),actives=this.$parent&&this.$parent.find("> .accordion-group > .in"),actives&&actives.length){if(hasData=actives.data("collapse"),hasData&&hasData.transitioning)return;actives.collapse("hide"),hasData||actives.data("collapse",null)}this.$element[dimension](0),this.transition("addClass",$.Event("show"),"shown"),$.support.transition&&this.$element[dimension](this.$element[0][scroll])}},hide:function(){var dimension;this.transitioning||(dimension=this.dimension(),this.reset(this.$element[dimension]()),this.transition("removeClass",$.Event("hide"),"hidden"),this.$element[dimension](0))},reset:function(size){var dimension=this.dimension();return this.$element.removeClass("collapse")[dimension](size||"auto")[0].offsetWidth,this.$element[null!==size?"addClass":"removeClass"]("collapse"),this},transition:function(method,startEvent,completeEvent){var that=this,complete=function(){"show"==startEvent.type&&that.reset(),that.transitioning=0,that.$element.trigger(completeEvent)};this.$element.trigger(startEvent),startEvent.isDefaultPrevented()||(this.transitioning=1,this.$element[method]("in"),$.support.transition&&this.$element.hasClass("collapse")?this.$element.one($.support.transition.end,complete):complete())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var old=$.fn.collapse;$.fn.collapse=function(option){return this.each(function(){var $this=$(this),data=$this.data("collapse"),options="object"==typeof option&&option;data||$this.data("collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})},$.fn.collapse.defaults={toggle:!0},$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.collapse.data-api","[data-toggle=collapse]",function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),option=$(target).data("collapse")?"toggle":$this.data();$this[$(target).hasClass("in")?"addClass":"removeClass"]("collapsed"),$(target).collapse(option)})}(window.jQuery),!function($){"use strict";function clearMenus(){$(toggle).each(function(){getParent($(this)).removeClass("open")})}function getParent($this){var $parent,selector=$this.attr("data-target");return selector||(selector=$this.attr("href"),selector=selector&&/#/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),$parent.length||($parent=$this.parent()),$parent}var toggle="[data-toggle=dropdown]",Dropdown=function(element){var $el=$(element).on("click.dropdown.data-api",this.toggle);$("html").on("click.dropdown.data-api",function(){$el.parent().removeClass("open")})};Dropdown.prototype={constructor:Dropdown,toggle:function(){var $parent,isActive,$this=$(this);if(!$this.is(".disabled, :disabled"))return $parent=getParent($this),isActive=$parent.hasClass("open"),clearMenus(),isActive||$parent.toggleClass("open"),$this.focus(),!1},keydown:function(e){var $this,$items,$parent,isActive,index;if(/(38|40|27)/.test(e.keyCode)&&($this=$(this),e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled"))){if($parent=getParent($this),isActive=$parent.hasClass("open"),!isActive||isActive&&27==e.keyCode)return $this.click();$items=$("[role=menu] li:not(.divider):visible a",$parent),$items.length&&(index=$items.index($items.filter(":focus")),38==e.keyCode&&index>0&&index--,40==e.keyCode&&$items.length-1>index&&index++,~index||(index=0),$items.eq(index).focus())}}};var old=$.fn.dropdown;$.fn.dropdown=function(option){return this.each(function(){var $this=$(this),data=$this.data("dropdown");data||$this.data("dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})},$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.dropdown.data-api touchstart.dropdown.data-api",clearMenus).on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("touchstart.dropdown.data-api",".dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",toggle+", [role=menu]",Dropdown.prototype.keydown)}(window.jQuery),!function($){"use strict";var Modal=function(element,options){this.options=options,this.$element=$(element).delegate('[data-dismiss="modal"]',"click.dismiss.modal",$.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};Modal.prototype={constructor:Modal,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var that=this,e=$.Event("show");this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(document.body),that.$element.show(),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus(),transition?that.$element.one($.support.transition.end,function(){that.$element.focus().trigger("shown")}):that.$element.focus().trigger("shown")}))},hide:function(e){e&&e.preventDefault(),e=$.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),$(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),$.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var that=this;$(document).on("focusin.modal",function(e){that.$element[0]===e.target||that.$element.has(e.target).length||that.$element.focus()})},escape:function(){var that=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&that.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var that=this,timeout=setTimeout(function(){that.$element.off($.support.transition.end),that.hideModal()},500);this.$element.one($.support.transition.end,function(){clearTimeout(timeout),that.hideModal()})},hideModal:function(){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(callback){var animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;this.$backdrop=$('<div class="modal-backdrop '+animate+'" />').appendTo(document.body),this.$backdrop.click("static"==this.options.backdrop?$.proxy(this.$element[0].focus,this.$element[0]):$.proxy(this.hide,this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),doAnimate?this.$backdrop.one($.support.transition.end,callback):callback()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one($.support.transition.end,$.proxy(this.removeBackdrop,this)):this.removeBackdrop()):callback&&callback()}};var old=$.fn.modal;$.fn.modal=function(option){return this.each(function(){var $this=$(this),data=$this.data("modal"),options=$.extend({},$.fn.modal.defaults,$this.data(),"object"==typeof option&&option);data||$this.data("modal",data=new Modal(this,options)),"string"==typeof option?data[option]():options.show&&data.show()})},$.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());e.preventDefault(),$target.modal(option).one("hide",function(){$this.focus()})})}(window.jQuery),!function($){"use strict";var Tooltip=function(element,options){this.init("tooltip",element,options)};Tooltip.prototype={constructor:Tooltip,init:function(type,element,options){var eventIn,eventOut;this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.enabled=!0,"click"==this.options.trigger?this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this)):"manual"!=this.options.trigger&&(eventIn="hover"==this.options.trigger?"mouseenter":"focus",eventOut="hover"==this.options.trigger?"mouseleave":"blur",this.$element.on(eventIn+"."+this.type,this.options.selector,$.proxy(this.enter,this)),this.$element.on(eventOut+"."+this.type,this.options.selector,$.proxy(this.leave,this))),this.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(options){return options=$.extend({},$.fn[this.type].defaults,options,this.$element.data()),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},enter:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return self.options.delay&&self.options.delay.show?(clearTimeout(this.timeout),self.hoverState="in",this.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show),void 0):self.show()},leave:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),self.options.delay&&self.options.delay.hide?(self.hoverState="out",this.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide),void 0):self.hide()},show:function(){var $tip,inside,pos,actualWidth,actualHeight,placement,tp;if(this.hasContent()&&this.enabled){switch($tip=this.tip(),this.setContent(),this.options.animation&&$tip.addClass("fade"),placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,inside=/in/.test(placement),$tip.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),pos=this.getPosition(inside),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight,inside?placement.split(" ")[1]:placement){case"bottom":tp={top:pos.top+pos.height,left:pos.left+pos.width/2-actualWidth/2};break;case"top":tp={top:pos.top-actualHeight,left:pos.left+pos.width/2-actualWidth/2};break;case"left":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left-actualWidth};break;case"right":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left+pos.width}}$tip.offset(tp).addClass(placement).addClass("in")}},setContent:function(){var $tip=this.tip(),title=this.getTitle();$tip.find(".tooltip-inner")[this.options.html?"html":"text"](title),$tip.removeClass("fade in top bottom left right")},hide:function(){function removeWithAnimation(){var timeout=setTimeout(function(){$tip.off($.support.transition.end).detach()},500);$tip.one($.support.transition.end,function(){clearTimeout(timeout),$tip.detach()})}var $tip=this.tip();return $tip.removeClass("in"),$.support.transition&&this.$tip.hasClass("fade")?removeWithAnimation():$tip.detach(),this},fixTitle:function(){var $e=this.$element;($e.attr("title")||"string"!=typeof $e.attr("data-original-title"))&&$e.attr("data-original-title",$e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(inside){return $.extend({},inside?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},tip:function(){return this.$tip=this.$tip||$(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);self[self.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var old=$.fn.tooltip;$.fn.tooltip=function(option){return this.each(function(){var $this=$(this),data=$this.data("tooltip"),options="object"==typeof option&&option;data||$this.data("tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]()})},$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!1},$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(window.jQuery),!function($){"use strict";var Popover=function(element,options){this.init("popover",element,options)};Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype,{constructor:Popover,setContent:function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content")[this.options.html?"html":"text"](content),$tip.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var content,$e=this.$element,o=this.options;return content=$e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},tip:function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var old=$.fn.popover;$.fn.popover=function(option){return this.each(function(){var $this=$(this),data=$this.data("popover"),options="object"==typeof option&&option;data||$this.data("popover",data=new Popover(this,options)),"string"==typeof option&&data[option]()})},$.fn.popover.Constructor=Popover,$.fn.popover.defaults=$.extend({},$.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>'}),$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(window.jQuery),!function($){"use strict";function ScrollSpy(element,options){var href,process=$.proxy(this.process,this),$element=$(element).is("body")?$(window):$(element);this.options=$.extend({},$.fn.scrollspy.defaults,options),this.$scrollElement=$element.on("scroll.scroll-spy.data-api",process),this.selector=(this.options.target||(href=$(element).attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=$("body"),this.refresh(),this.process()}ScrollSpy.prototype={constructor:ScrollSpy,refresh:function(){var $targets,self=this;this.offsets=$([]),this.targets=$([]),$targets=this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#\w/.test(href)&&$(href);return $href&&$href.length&&[[$href.position().top+self.$scrollElement.scrollTop(),href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},process:function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,maxScroll=scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(scrollTop>=maxScroll)return activeTarget!=(i=targets.last()[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||offsets[i+1]>=scrollTop)&&this.activate(targets[i])},activate:function(target){var active,selector;this.activeTarget=target,$(this.selector).parent(".active").removeClass("active"),selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parent("li").addClass("active"),active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate")}};var old=$.fn.scrollspy;$.fn.scrollspy=function(option){return this.each(function(){var $this=$(this),data=$this.data("scrollspy"),options="object"==typeof option&&option;data||$this.data("scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})},$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.defaults={offset:10},$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);$spy.scrollspy($spy.data())})})}(window.jQuery),!function($){"use strict";var Tab=function(element){this.element=$(element)};Tab.prototype={constructor:Tab,show:function(){var previous,$target,e,$this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$this.parent("li").hasClass("active")||(previous=$ul.find(".active:last a")[0],e=$.Event("show",{relatedTarget:previous}),$this.trigger(e),e.isDefaultPrevented()||($target=$(selector),this.activate($this.parent("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown",relatedTarget:previous})})))},activate:function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one($.support.transition.end,next):next(),$active.removeClass("in")}};var old=$.fn.tab;$.fn.tab=function(option){return this.each(function(){var $this=$(this),data=$this.data("tab");data||$this.data("tab",data=new Tab(this)),"string"==typeof option&&data[option]()})},$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),$(this).tab("show")})}(window.jQuery),!function($){"use strict";var Typeahead=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.typeahead.defaults,options),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=$(this.options.menu),this.shown=!1,this.listen()};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(val)).change(),this.hide()},updater:function(item){return item},show:function(){var pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:pos.top+pos.height,left:pos.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var items;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(items=$.isFunction(this.source)?this.source(this.query,$.proxy(this.process,this)):this.source,items?this.process(items):this)},process:function(items){var that=this;return items=$.grep(items,function(item){return that.matcher(item)}),items=this.sorter(items),items.length?this.render(items.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(item){return~item.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(items){for(var item,beginswith=[],caseSensitive=[],caseInsensitive=[];item=items.shift();)item.toLowerCase().indexOf(this.query.toLowerCase())?~item.indexOf(this.query)?caseSensitive.push(item):caseInsensitive.push(item):beginswith.push(item);return beginswith.concat(caseSensitive,caseInsensitive)},highlighter:function(item){var query=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return item.replace(RegExp("("+query+")","ig"),function($1,match){return"<strong>"+match+"</strong>"})},render:function(items){var that=this;return items=$(items).map(function(i,item){return i=$(that.options.item).attr("data-value",item),i.find("a").html(that.highlighter(item)),i[0]}),items.first().addClass("active"),this.$menu.html(items),this},next:function(){var active=this.$menu.find(".active").removeClass("active"),next=active.next();next.length||(next=$(this.$menu.find("li")[0])),next.addClass("active")},prev:function(){var active=this.$menu.find(".active").removeClass("active"),prev=active.prev();prev.length||(prev=this.$menu.find("li").last()),prev.addClass("active")},listen:function(){this.$element.on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("keyup",$.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",$.proxy(this.keydown,this)),this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this))},eventSupported:function(eventName){var isSupported=eventName in this.$element;return isSupported||(this.$element.setAttribute(eventName,"return;"),isSupported="function"==typeof this.$element[eventName]),isSupported},move:function(e){if(this.shown){switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(e){this.suppressKeyPressRepeat||this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(){var that=this;setTimeout(function(){that.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(e){this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")}};var old=$.fn.typeahead;$.fn.typeahead=function(option){return this.each(function(){var $this=$(this),data=$this.data("typeahead"),options="object"==typeof option&&option;data||$this.data("typeahead",data=new Typeahead(this,options)),"string"==typeof option&&data[option]()})},$.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},$.fn.typeahead.Constructor=Typeahead,$.fn.typeahead.noConflict=function(){return $.fn.typeahead=old,this},$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);$this.data("typeahead")||(e.preventDefault(),$this.typeahead($this.data()))})}(window.jQuery),!function($){"use strict";var Affix=function(element,options){this.options=$.extend({},$.fn.affix.defaults,options),this.$window=$(window).on("scroll.affix.data-api",$.proxy(this.checkPosition,this)).on("click.affix.data-api",$.proxy(function(){setTimeout($.proxy(this.checkPosition,this),1)},this)),this.$element=$(element),this.checkPosition()};Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var affix,scrollHeight=$(document).height(),scrollTop=this.$window.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetBottom=offset.bottom,offsetTop=offset.top,reset="affix affix-top affix-bottom";"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top()),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom()),affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1,this.affixed!==affix&&(this.affixed=affix,this.unpin="bottom"==affix?position.top-scrollTop:null,this.$element.removeClass(reset).addClass("affix"+(affix?"-"+affix:"")))}};var old=$.fn.affix;$.fn.affix=function(option){return this.each(function(){var $this=$(this),data=$this.data("affix"),options="object"==typeof option&&option;data||$this.data("affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})},$.fn.affix.Constructor=Affix,$.fn.affix.defaults={offset:0},$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),$spy.affix(data)})})}(window.jQuery);
\ No newline at end of file
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/highcharts.js b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/highcharts.js
new file mode 100644
index 0000000..a77be0b
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/highcharts.js
@@ -0,0 +1,246 @@
+/*
+ Highcharts JS v2.3.3 (2012-10-04)
+
+ (c) 2009-2011 Torstein HÃ¸nsi
+
+ License: www.highcharts.com/license
+*/
+(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function ka(){for(var a=0,b=arguments,c=b.length,d={};a<c;a++)d[b[a++]]=b[a];return d}function w(a,b){return parseInt(a,b||10)}function la(a){return typeof a==="string"}function X(a){return typeof a==="object"}function Ha(a){return Object.prototype.toString.call(a)==="[object Array]"}function Aa(a){return typeof a==="number"}function ma(a){return J.log(a)/J.LN10}function ba(a){return J.pow(10,a)}function Ba(a,b){for(var c=a.length;c--;)if(a[c]===
+b){a.splice(c,1);break}}function t(a){return a!==x&&a!==null}function z(a,b,c){var d,e;if(la(b))t(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(t(b)&&X(b))for(d in b)a.setAttribute(d,b[d]);return e}function na(a){return Ha(a)?a:[a]}function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],typeof c!=="undefined"&&c!==null)return c}function H(a,b){if(Ca&&b&&b.opacity!==x)b.filter="alpha(opacity="+b.opacity*100+")";r(a.style,b)}function Q(a,b,c,d,e){a=C.createElement(a);
+b&&r(a,b);e&&H(a,{padding:0,border:R,margin:0});c&&H(a,c);d&&d.appendChild(a);return a}function ca(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);return c}function Ia(a,b,c,d){var e=M.lang,f=a;b===-1?(b=(a||0).toString(),a=b.indexOf(".")>-1?b.split(".")[1].length:0):a=isNaN(b=L(b))?2:b;var b=a,c=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=f<0?"-":"",a=String(w(f=L(+f||0).toFixed(b))),g=a.length>3?a.length%3:0;return e+(g?a.substr(0,g)+d:"")+a.substr(g).replace(/(\d{3})(?=\d)/g,
+"$1"+d)+(b?c+L(f-a).toFixed(b).slice(2):"")}function sa(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function hb(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(a=b[d],e<=(b[d]+(b[d+1]||b[d]))/2)break;a*=c;return a}function Nb(a,b){var c=b||[[zb,[1,2,5,10,20,25,50,100,200,500]],[ib,[1,2,5,10,15,30]],[Ua,[1,2,5,10,15,30]],[Ja,[1,2,3,4,6,8,12]],[oa,[1,2]],[Va,[1,2]],[Ka,[1,2,3,4,6]],[ta,null]],d=
+c[c.length-1],e=B[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=B[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+B[c[g+1][0]])/2)break;e===B[ta]&&a<5*e&&(f=[1,2,5]);e===B[ta]&&a<5*e&&(f=[1,2,5]);c=hb(a/e,f);return{unitRange:e,count:c,unitName:d[0]}}function Ob(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),b=a.unitRange,j=a.count;b>=B[ib]&&(i.setMilliseconds(0),i.setSeconds(b>=B[Ua]?0:j*T(i.getSeconds()/j)));if(b>=B[Ua])i[Ab](b>=B[Ja]?0:j*T(i[jb]()/j));if(b>=B[Ja])i[Bb](b>=B[oa]?0:j*T(i[kb]()/
+j));if(b>=B[oa])i[lb](b>=B[Ka]?1:j*T(i[La]()/j));b>=B[Ka]&&(i[Cb](b>=B[ta]?0:j*T(i[Wa]()/j)),h=i[Xa]());b>=B[ta]&&(h-=h%j,i[Db](h));if(b===B[Va])i[lb](i[La]()-i[mb]()+o(d,1));d=1;h=i[Xa]();for(var k=i.getTime(),l=i[Wa](),m=i[La](),i=g?0:(864E5+i.getTimezoneOffset()*6E4)%864E5;k<c;)e.push(k),b===B[ta]?k=Ya(h+d*j,0):b===B[Ka]?k=Ya(h,l+d*j):!g&&(b===B[oa]||b===B[Va])?k=Ya(h,l,m+d*j*(b===B[oa]?1:7)):(k+=b*j,b<=B[Ja]&&k%B[oa]===i&&(f[k]=oa)),d++;e.push(k);e.info=r(a,{higherRanks:f,totalRange:b*j});return e}
+function Eb(){this.symbol=this.color=0}function Fb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:d});for(e=0;e<c;e++)delete a[e].ss_i}function Ma(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Da(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Ea(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Na(a){Za||(Za=Q(ia));a&&Za.appendChild(a);Za.innerHTML=""}function $a(a,
+b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else K.console&&console.log(c)}function ea(a){return parseFloat(a.toPrecision(14))}function ua(a,b){Oa=o(a,b.animation)}function Gb(){var a=M.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";Ya=a?Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};jb=b+"Minutes";kb=b+"Hours";mb=b+"Day";La=b+"Date";Wa=b+"Month";Xa=b+"FullYear";Ab=c+"Minutes";Bb=c+"Hours";lb=c+"Date";Cb=c+"Month";
+Db=c+"FullYear"}function va(){}function Pa(a,b,c){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;c||this.addLabel()}function nb(a,b){this.axis=a;if(b)this.options=b,this.id=b.id;return this}function Hb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:
+0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function ob(){this.init.apply(this,arguments)}function pb(a,b){var c=b.borderWidth,d=b.style,e=w(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=a.renderer.label("",0,0,b.shape,null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).hide().add();U||this.label.shadow(b.shadow);this.shared=b.shared}
+function qb(a,b){var c=U?"":b.chart.zoomType;this.zoomX=/x/.test(c);this.zoomY=/y/.test(c);this.options=b;this.chart=a;this.init(a,b.tooltip)}function rb(a){this.init(a)}function sb(a,b){var c,d=a.series;a.series=null;c=A(M,a);c.series=a.series=d;var d=c.chart,e=d.margin,e=X(e)?e:[e,e,e,e];this.optionsMarginTop=o(d.marginTop,e[0]);this.optionsMarginRight=o(d.marginRight,e[1]);this.optionsMarginBottom=o(d.marginBottom,e[2]);this.optionsMarginLeft=o(d.marginLeft,e[3]);this.runChartClick=(e=d.events)&&
+!!e.click;this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;this.init(e)}var x,C=document,K=window,J=Math,s=J.round,T=J.floor,wa=J.ceil,y=J.max,O=J.min,L=J.abs,V=J.cos,Y=J.sin,xa=J.PI,ab=xa*2/360,Fa=navigator.userAgent,Ib=K.opera,Ca=/msie/i.test(Fa)&&!Ib,Qa=C.documentMode===8,tb=/AppleWebKit/.test(Fa),bb=/Firefox/.test(Fa),pa="http://www.w3.org/2000/svg",Z=!!C.createElementNS&&!!C.createElementNS(pa,"svg").createSVGRect,Pb=bb&&parseInt(Fa.split("Firefox/")[1],
+10)<4,U=!Z&&!Ca&&!!C.createElement("canvas").getContext,Ra,fa=C.documentElement.ontouchstart!==x,Jb={},ub=0,Za,M,cb,Oa,vb,B,ya=function(){},ia="div",R="none",wb="rgba(192,192,192,"+(Z?1.0E-6:0.0020)+")",zb="millisecond",ib="second",Ua="minute",Ja="hour",oa="day",Va="week",Ka="month",ta="year",Ya,jb,kb,mb,La,Wa,Xa,Ab,Bb,lb,Cb,Db,$={};K.Highcharts={};cb=function(a,b,c){if(!t(b)||isNaN(b))return"Invalid date";var a=o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b),e,f=d[kb](),g=d[mb](),h=d[La](),i=d[Wa](),j=d[Xa](),
+k=M.lang,l=k.weekdays,b={a:l[g].substr(0,3),A:l[g],d:sa(h),e:h,b:k.shortMonths[i],B:k.months[i],m:sa(i+1),y:j.toString().substr(2,2),Y:j,H:sa(f),I:sa(f%12||12),l:f%12||12,M:sa(d[jb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:sa(d.getSeconds()),L:sa(s(b%1E3),3)};for(e in b)a=a.replace("%"+e,b[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};Eb.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};B=ka(zb,1,ib,1E3,Ua,6E4,Ja,36E5,
+oa,864E5,Va,6048E5,Ka,2592E6,ta,31556952E3);vb={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-
+1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e=d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};(function(a){K.HighchartsAdapter=K.HighchartsAdapter||a&&{init:function(b){var c=a.fx,d=c.step,e,f=a.Tween,g=f&&f.propHooks;a.extend(a.easing,{easeOutQuad:function(a,b,c,d,e){return-d*(b/=e)*(b-2)+c}});a.each(["cur","_default","width","height"],function(a,b){var e=
+d,k,l;b==="cur"?e=c.prototype:b==="_default"&&f&&(e=g[b],b="set");(k=e[b])&&(e[b]=function(c){c=a?c:this;l=c.elem;return l.attr?l.attr(c.prop,b==="cur"?x:c.now):k.apply(this,arguments)})});e=function(a){var c=a.elem,d;if(!a.started)d=b.init(c,c.d,c.toD),a.start=d[0],a.end=d[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))};f?g.d={set:e}:d.d=e;this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],
+a[c],c,a)===!1)return c}},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e=0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},merge:function(){var b=arguments;return a.extend(!0,null,b[0],b[1],b[2],b[3])},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=C.removeEventListener?"removeEventListener":"detachEvent";C[e]&&!b[e]&&(b[e]=function(){});a(b).unbind(c,
+d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!Ca&&d&&(delete d.layerX,delete d.layerY);r(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a,b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===x)c.pageX=a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=
+a(b);if(c.d)b.toD=c.d,c.d=1;e.stop();e.animate(c,d)},stop:function(b){a(b).stop()}}})(K.jQuery);var ga=K.HighchartsAdapter,G=ga||{};ga&&ga.init.call(ga,vb);var db=G.adapterRun,Qb=G.getScript,Rb=G.inArray,n=G.each,Kb=G.grep,Sb=G.offset,Sa=G.map,A=G.merge,I=G.addEvent,S=G.removeEvent,E=G.fireEvent,Lb=G.washMouseEvent,xb=G.animate,eb=G.stop,G={enabled:!0,align:"center",x:0,y:15,style:{color:"#666",fontSize:"11px",lineHeight:"14px"}};M={colors:"#4572A7,#AA4643,#89A54E,#80699B,#3D96AE,#DB843D,#92A8CD,#A47D7C,#B5CA92".split(","),
+symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,
+canvasToolsURL:"http://code.highcharts.com/2.3.3/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/2.3.3/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacingTop:10,spacingRight:10,spacingBottom:15,spacingLeft:10,style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},
+position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",y:15,style:{color:"#3E576F",fontSize:"16px"}},subtitle:{text:"",align:"center",y:30,style:{color:"#6D869F"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,shadow:!0,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:A(G,{enabled:!1,formatter:function(){return this.y},
+verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#3E576F",inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#3E576F",fontSize:"12px"},itemHoverStyle:{color:"#000"},
+itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:2,borderRadius:5,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",
+hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,shared:U,snap:fa?25:10,style:{color:"#333333",fontSize:"12px",padding:"5px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},
+style:{cursor:"pointer",color:"#909090",fontSize:"10px"}}};var W=M.plotOptions,ga=W.line;Gb();var qa=function(a){var b=[],c;(function(a){(c=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a))?b=[w(c[1]),w(c[2]),w(c[3]),parseFloat(c[4],10)]:(c=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))&&(b=[w(c[1],16),w(c[2],16),w(c[3],16),1])})(a);return{get:function(c){return b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?
+b[3]:"rgba("+b.join(",")+")":a},brighten:function(a){if(Aa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=w(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},setOpacity:function(a){b[3]=a;return this}}};va.prototype={init:function(a,b){this.element=b==="span"?Q(b):C.createElementNS(pa,b);this.renderer=a;this.attrSetters={}},animate:function(a,b,c){b=o(b,Oa,!0);eb(this);if(b){b=A(b);if(c)b.complete=c;xb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),
+i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,u=this;la(a)&&t(b)&&(c=a,a={},a[c]=b);if(la(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),u=z(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&(u=parseFloat(u));else for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==x&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text"){for(e=0;e<g.childNodes.length;e++)f=g.childNodes[e],z(f,"x")===z(g,"x")&&
+z(f,"x",d);this.rotation&&z(g,"transform","rotate("+this.rotation+" "+d+" "+w(a.y||z(g,"y"))+")")}else if(c==="fill")d=i.color(d,g,c);else if(h==="circle"&&(c==="x"||c==="y"))c={x:"cx",y:"cy"}[c]||c;else if(h==="rect"&&c==="r")z(g,{rx:d,ry:d}),j=!0;else if(c==="translateX"||c==="translateY"||c==="rotation"||c==="verticalAlign")j=p=!0;else if(c==="stroke")d=i.color(d,g,c);else if(c==="dashstyle")if(c="stroke-dasharray",d=d&&d.toLowerCase(),d==="solid")d=R;else{if(d){d=d.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot",
+"3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=d.length;e--;)d[e]=w(d[e])*a["stroke-width"];d=d.join(",")}}else if(c==="isTracker")this[c]=d;else if(c==="width")d=w(d);else if(c==="align")c="text-anchor",d={left:"start",center:"middle",right:"end"}[d];else if(c==="title")e=g.getElementsByTagName("title")[0],e||(e=C.createElementNS(pa,"title"),g.appendChild(e)),e.textContent=
+d;c==="strokeWidth"&&(c="stroke-width");tb&&c==="stroke-width"&&d===0&&(d=1.0E-6);this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&&(m||(this.symbolAttr(a),m=!0),j=!0);if(l&&/^(width|height|visibility|x|y|d|transform)$/.test(c))for(e=l.length;e--;)z(l[e],c,c==="height"?y(d-(l[e].cutHeight||0),0):d);if((c==="width"||c==="height")&&h==="rect"&&d<0)d=0;this[c]=d;p&&this.updateTransform();c==="text"?(d!==this.textStr&&delete this.bBox,this.textStr=d,this.added&&i.buildText(this)):
+j||z(g,c,d)}return u},symbolAttr:function(a){var b=this;n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=o(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":R)},crisp:function(a,b,c,d,e){var f,g={},h={},i,a=a||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;i=s(a)%2/2;h.x=T(b||this.x||0)+i;h.y=T(c||this.y||0)+i;h.width=T((d||this.width||
+0)-2*i);h.height=T((e||this.height||0)-2*i);h.strokeWidth=a;for(f in h)this[f]!==h[f]&&(this[f]=g[f]=h[f]);return g},css:function(a){var b=this.element,b=a&&a.width&&b.nodeName.toLowerCase()==="text",c,d="",e=function(a,b){return"-"+b.toLowerCase()};if(a&&a.color)a.fill=a.color;this.styles=a=r(this.styles,a);U&&b&&delete a.width;if(Ca&&!Z)b&&delete a.width,H(this.element,a);else{for(c in a)d+=c.replace(/([A-Z])/g,e)+":"+a[c]+";";this.attr({style:d})}b&&this.added&&this.renderer.buildText(this);return this},
+on:function(a,b){var c=b;fa&&a==="click"&&(a="touchstart",c=function(a){a.preventDefault();b()});this.element["on"+a]=c;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();this.styles=r(this.styles,
+a);H(this.element,a);return this},htmlGetBBox:function(){var a=this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position="absolute";b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left",j=this.shadows;if(c||d)H(b,{marginLeft:c,
+marginTop:d}),j&&n(j,function(a){H(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&n(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k,l,j=this.rotation,m,p=0,u=1,p=0,da;m=w(this.textWidth);var q=this.xCorr||0,D=this.yCorr||0,aa=[j,g,b.innerHTML,this.textWidth].join(",");k={};if(aa!==this.cTT){if(t(j))a.isSVG?(q=Ca?"-ms-transform":tb?"-webkit-transform":bb?"MozTransform":Ib?"-o-transform":"",k[q]=k.transform="rotate("+j+"deg)"):(p=j*ab,u=V(p),p=Y(p),k.filter=j?["progid:DXImageTransform.Microsoft.Matrix(M11=",
+u,", M12=",-p,", M21=",p,", M22=",u,", sizingMethod='auto expand')"].join(""):R),H(b,k);k=o(this.elemWidth,b.offsetWidth);l=o(this.elemHeight,b.offsetHeight);k>m&&/[ \-]/.test(b.innerText)&&(H(b,{width:m+"px",display:"block",whiteSpace:"normal"}),k=m);m=a.fontMetrics(b.style.fontSize).b;q=u<0&&-k;D=p<0&&-l;da=u*p<0;q+=p*m*(da?1-h:h);D-=u*m*(j?da?h:1-h:1);i&&(q-=k*h*(u<0?-1:1),j&&(D-=l*h*(p<0?-1:1)),H(b,{textAlign:g}));this.xCorr=q;this.yCorr=D}H(b,{left:e+q+"px",top:f+D+"px"});this.cTT=aa}}else this.alignOnAdd=
+!0},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.inverted,d=this.rotation,e=[];c&&(a+=this.attr("width"),b+=this.attr("height"));(a||b)&&e.push("translate("+a+","+b+")");c?e.push("rotate(90) scale(-1,1)"):d&&e.push("rotate("+d+" "+(this.x||0)+" "+(this.y||0)+")");e.length&&z(this.element,"transform",e.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){a?(this.alignOptions=a,this.alignByTranslate=b,c||
+this.renderer.alignedObjects.push(this)):(a=this.alignOptions,b=this.alignByTranslate);var c=o(c,this.renderer),d=a.align,e=a.verticalAlign,f=(c.x||0)+(a.x||0),g=(c.y||0)+(a.y||0),h={};if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=s(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=s(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(){var a=
+this.bBox,b=this.renderer,c,d=this.rotation,e=this.element,f=this.styles,g=d*ab;if(!a){if(e.namespaceURI===pa||b.forExport){try{a=e.getBBox?r({},e.getBBox()):{width:e.offsetWidth,height:e.offsetHeight}}catch(h){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG&&(b=a.width,c=a.height,d))a.width=L(c*Y(g))+L(b*V(g)),a.height=L(c*V(g))+L(b*Y(g));if(Ca&&f&&f.fontSize==="11px"&&c===22.700000762939453)a.height=14;this.bBox=a}return a},show:function(){return this.attr({visibility:"visible"})},
+hide:function(){return this.attr({visibility:"hidden"})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=z(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=w(g);if(c.handleZ)for(c=0;c<e.length;c++)if(a=e[c],b=z(a,"zIndex"),a!==f&&(w(b)>g||!t(g)&&t(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;E(this,"add");return this},safeRemoveChild:function(a){var b=
+a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d,e;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=null;eb(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(e=0;e<a.stops.length;e++)a.stops[e]=a.stops[e].destroy();a.stops=null}a.safeRemoveChild(b);c&&n(c,function(b){a.safeRemoveChild(b)});Ba(a.renderer.alignedObjects,a);for(d in a)delete a[d];return null},empty:function(){for(var a=this.element,b=a.childNodes,c=b.length;c--;)a.removeChild(b[c])},
+shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=o(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+o(a.offsetX,1)+", "+o(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;z(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*e,"stroke-width":h,transform:"translate"+k,fill:R});if(c)z(f,"height",y(z(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f):g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this}};var ra=function(){this.init.apply(this,
+arguments)};ra.prototype={Element:va,init:function(a,b,c,d){var e=location,f;f=this.createElement("svg").attr({xmlns:pa,version:"1.1"});a.appendChild(f.element);this.isSVG=!0;this.box=f.element;this.boxWrapper=f;this.alignedObjects=[];this.url=(bb||tb)&&C.getElementsByTagName("base").length?e.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.defs=this.createElement("defs").add();this.forExport=d;this.gradients={};this.setSize(b,c,!1);var g;if(bb&&a.getBoundingClientRect)this.subPixelFix=
+b=function(){H(a,{left:0,top:0});g=a.getBoundingClientRect();H(a,{left:wa(g.left)-g.left+"px",top:wa(g.top)-g.top+"px"})},b(),I(K,"resize",b)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Ea(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&S(K,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,
+a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=o(a.textStr,"").toString().replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g),d=b.childNodes,e=/style="([^"]+)"/,f=/href="([^"]+)"/,g=z(b,"x"),h=a.styles,i=h&&h.width&&w(h.width),j=h&&h.lineHeight,k,h=d.length,l=[];h--;)b.removeChild(d[h]);i&&!a.added&&this.box.appendChild(b);
+c[c.length-1]===""&&c.pop();n(c,function(c,d){var h,da=0,q,c=c.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");h=c.split("|||");n(h,function(c){if(c!==""||h.length===1){var m={},o=C.createElementNS(pa,"tspan"),n;e.test(c)&&(n=c.match(e)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),z(o,"style",n));f.test(c)&&(z(o,"onclick",'location.href="'+c.match(f)[1]+'"'),H(o,{cursor:"pointer"}));c=(c.replace(/<(.|\n)*?>/g,"")||" ").replace(/&lt;/g,"<").replace(/&gt;/g,">");o.appendChild(C.createTextNode(c));
+da?m.dx=3:m.x=g;if(!da){if(d){!Z&&a.renderer.forExport&&H(o,{display:"block"});q=K.getComputedStyle&&w(K.getComputedStyle(k,null).getPropertyValue("line-height"));if(!q||isNaN(q)){var F;if(!(F=j))if(!(F=k.offsetHeight))l[d]=b.getBBox?b.getBBox().height:a.renderer.fontMetrics(b.style.fontSize).h,F=s(l[d]-(l[d-1]||0))||18;q=F}z(o,"dy",q)}k=o}z(o,m);b.appendChild(o);da++;if(i)for(var c=c.replace(/([^\^])-/g,"$1- ").split(" "),t=[];c.length||t.length;)delete a.bBox,F=a.getBBox().width,m=F>i,!m||c.length===
+1?(c=t,t=[],c.length&&(o=C.createElementNS(pa,"tspan"),z(o,{dy:j||16,x:g}),n&&z(o,"style",n),b.appendChild(o),F>i&&(i=F))):(o.removeChild(o.firstChild),t.unshift(c.pop())),c.length&&o.appendChild(C.createTextNode(c.join(" ").replace(/- /g,"-")))}})})},button:function(a,b,c,d,e,f,g){var h=this.label(a,b,c),i=0,j,k,l,m,p,a={x1:0,y1:0,x2:0,y2:1},e=A(ka("stroke-width",1,"stroke","#999","fill",ka("linearGradient",a,"stops",[[0,"#FFF"],[1,"#DDD"]]),"r",3,"padding",3,"style",ka("color","black")),e);l=e.style;
+delete e.style;f=A(e,ka("stroke","#68A","fill",ka("linearGradient",a,"stops",[[0,"#FFF"],[1,"#ACF"]])),f);m=f.style;delete f.style;g=A(e,ka("stroke","#68A","fill",ka("linearGradient",a,"stops",[[0,"#9BD"],[1,"#CDF"]])),g);p=g.style;delete g.style;I(h.element,"mouseenter",function(){h.attr(f).css(m)});I(h.element,"mouseleave",function(){j=[e,f,g][i];k=[l,m,p][i];h.attr(j).css(k)});h.setState=function(a){(i=a)?a===2&&h.attr(g).css(p):h.attr(e).css(l)};return h.on("click",function(){d.call(h)}).attr(e).css(r({cursor:"default"},
+l))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=s(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=s(a[2])+b%2/2);return a},path:function(a){var b={fill:R};Ha(a)?b.d=a:X(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=X(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(X(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;return this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0})},rect:function(a,b,c,d,e,f){e=X(a)?
+a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,fill:R});return e.attr(X(a)?a:e.crisp(f,a,b,y(c,0),y(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return t(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:R};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);
+f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(s(b),s(c),d,e,f),i=/^url\((.*?)\)$/,j,k;h?(g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f)):i.test(a)&&(k=function(a,b){a.attr({width:b[0],height:b[1]});a.alignByTranslate||a.translate(-s(b[0]/2),-s(b[1]/2))},j=a.match(i)[1],a=Jb[j],g=this.image(j).attr({x:b,y:c}),a?k(g,a):(g.attr({width:0,
+height:0}),Q("img",{onload:function(){k(g,Jb[j]=[this.width,this.height])},src:j})));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+
+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-1.0E-6,d=e.innerR,h=e.open,i=V(f),j=Y(f),k=V(g),g=Y(g),e=e.end-f<xa?0:1;return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]}},clipRect:function(a,b,c,d){var e="highcharts-"+ub++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;return a},color:function(a,b,c){var d=this,e,f=/^rgba/,g;a&&a.linearGradient?
+g="linearGradient":a&&a.radialGradient&&(g="radialGradient");if(g){var c=a[g],h=d.gradients,i,j,k,b=b.radialReference;if(!c.id||!h[c.id])Ha(c)&&(a[g]=c={x1:c[0],y1:c[1],x2:c[2],y2:c[3],gradientUnits:"userSpaceOnUse"}),g==="radialGradient"&&b&&!t(c.gradientUnits)&&r(c,{cx:b[0]-b[2]/2+c.cx*b[2],cy:b[1]-b[2]/2+c.cy*b[2],r:c.r*b[2],gradientUnits:"userSpaceOnUse"}),c.id="highcharts-"+ub++,h[c.id]=i=d.createElement(g).attr(c).add(d.defs),i.stops=[],n(a.stops,function(a){f.test(a[1])?(e=qa(a[1]),j=e.get("rgb"),
+k=e.get("a")):(j=a[1],k=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":j,"stop-opacity":k}).add(i);i.stops.push(a)});return"url("+d.url+"#"+c.id+")"}else return f.test(a)?(e=qa(a),z(b,c+"-opacity",e.get("a")),e.get("rgb")):(b.removeAttribute(c+"-opacity"),a)},text:function(a,b,c,d){var e=M.chart.style,f=U||!Z&&this.forExport;if(d&&!this.forExport)return this.html(a,b,c);b=s(o(b,0));c=s(o(c,0));a=this.createElement("text").attr({x:b,y:c,text:a}).css({fontFamily:e.fontFamily,fontSize:e.fontSize});
+f&&a.css({position:"absolute"});a.x=b;a.y=c;return a},html:function(a,b,c){var d=M.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=function(a,b){b==="align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:s(b),y:s(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss;if(h.isSVG)e.add=function(a){var b,
+c=h.box.parentNode,d=[];if(a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||Q(ia,{className:z(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};return e},fontMetrics:function(a){var a=
+w(a||11),a=a<24?a+4:s(a*1.2),b=s(a*0.8);return{h:a,b:b}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a=p.styles,a=a&&a.textAlign,b=aa*(1-D),c;c=h?0:yb;if(t(Ga)&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(Ga-q.width);(b!==u.x||c!==u.y)&&u.attr({x:b,y:c});u.x=b;u.y=c}function k(a,b){o?o.attr(a,b):fb[a]=b}function l(){u.add(p);p.attr({text:a,x:b,y:c});t(e)&&p.attr({anchorX:e,anchorY:f})}var m=this,p=m.g(i),u=m.text("",0,0,g).attr({zIndex:1}),o,q,D=0,aa=3,Ga,v,F,y,P=0,fb={},yb,g=p.attrSetters;
+I(p,"add",l);g.width=function(a){Ga=a;return!1};g.height=function(a){v=a;return!1};g.padding=function(a){t(a)&&a!==aa&&(aa=a,j());return!1};g.align=function(a){D={left:0,center:0.5,right:1}[a];return!1};g.text=function(a,b){u.attr(b,a);var c;c=u.element.style;q=(Ga===void 0||v===void 0||p.styles.textAlign)&&u.getBBox();p.width=(Ga||q.width||0)+2*aa;p.height=(v||q.height||0)+2*aa;yb=aa+m.fontMetrics(c&&c.fontSize).b;if(!o)c=h?-yb:0,p.box=o=d?m.symbol(d,-D*aa,c,p.width,p.height):m.rect(-D*aa,c,p.width,
+p.height,0,fb["stroke-width"]),o.add(p);o.attr(A({width:p.width,height:p.height},fb));fb=null;j();return!1};g["stroke-width"]=function(a,b){P=a%2/2;k(b,a);return!1};g.stroke=g.fill=g.r=function(a,b){k(b,a);return!1};g.anchorX=function(a,b){e=a;k(b,a+P-F);return!1};g.anchorY=function(a,b){f=a;k(b,a-y);return!1};g.x=function(a){p.x=a;a-=D*((Ga||q.width)+aa);F=s(a);p.attr("translateX",F);return!1};g.y=function(a){y=p.y=s(a);p.attr("translateY",a);return!1};var w=p.css;return r(p,{css:function(a){if(a){var b=
+{},a=A({},a);n("fontSize,fontWeight,fontFamily,color,lineHeight,width".split(","),function(c){a[c]!==x&&(b[c]=a[c],delete a[c])});u.css(b)}return w.call(p,a)},getBBox:function(){return o.getBBox()},shadow:function(a){o.shadow(a);return p},destroy:function(){S(p,"add",l);S(p.element,"mouseenter");S(p.element,"mouseleave");u&&(u=u.destroy());o&&(o=o.destroy());va.prototype.destroy.call(p)}})}};Ra=ra;var ja;if(!Z&&!U){ja={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",
+";"];(b==="shape"||b===ia)&&d.push("left:0;top:0;width:1px;height:1px;");Qa&&d.push("visibility: ",b===ia?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=b===ia||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=Q(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();E(this,"add");
+return this},updateTransform:va.prototype.htmlUpdateTransform,attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,u=this;la(a)&&t(b)&&(c=a,a={},a[c]=b);if(la(a))c=a,u=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==x&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),
+k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");e=d.length;for(m=[];e--;)m[e]=Aa(d[e])?s(d[e]*10)-5:d[e]==="Z"?"x":d[e];d=m.join(" ")||"x";f.path=d;if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(c==="width"||c==="height")d=y(0,d),this[c]=d,this.updateClipping?(this[c]=d,this.updateClipping()):
+g[c]=d,m=!0;else if(c==="x"||c==="y")this[c]=d,g[{x:"left",y:"top"}[c]]=d;else if(c==="class")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,Aa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||Q(i.prepVML(["<stroke/>"]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")h==="SPAN"?g.color=d:(f.filled=d!==R?!0:!1,d=i.color(d,f,c,this),c="fillcolor");
+else if(h==="shape"&&c==="rotation")this[c]=d,f.style.left=-s(Y(d*ab)+1)+"px",f.style.top=s(V(d*ab))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;else if(c==="text")this.bBox=null,f.innerHTML=d,m=!0;m||(Qa?f[c]=d:z(f,c,d))}return u},clip:function(a){var b=this,c,d=b.element,e=d.parentNode;a?(c=a.members,c.push(b),b.destroyClip=function(){Ba(c,b)},e&&e.className==="highcharts-tracker"&&!Qa&&H(d,{visibility:"hidden"}),a=a.getCSS(b)):(b.destroyClip&&
+b.destroyClip(),a={clip:Qa?"inherit":"rect(auto)"});return b.css(a)},css:va.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Na(a)},destroy:function(){this.destroyClip&&this.destroyClip();return va.prototype.destroy.apply(this)},empty:function(){for(var a=this.element.childNodes,b=a.length,c;b--;)c=a[b],c.parentNode.removeChild(c)},on:function(a,b){this.element["on"+a]=function(){var a=K.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;
+if(c===9||c===11)a[c-4]=a[c-2]=w(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,u;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);u=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="',m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=Q(g.prepVML(j),null,{left:w(i.left)+o(a.offsetX,1),top:w(i.top)+
+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=['<stroke color="',a.color||"black",'" opacity="',u*e,'"/>'];Q(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};ja=ca(va,ja);var ha={Element:ja,isIE8:Fa.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(ia);e=d.element;e.style.position="relative";a.appendChild(d.element);this.box=e;this.boxWrapper=d;this.setSize(b,c,!1);if(!C.namespaces.hcv)C.namespaces.add("hcv",
+"urn:schemas-microsoft-com:vml"),C.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=X(a);return r(e,{members:[],left:f?a.x:a,top:f?a.y:b,width:f?a.width:c,height:f?a.height:d,getCSS:function(a){var b=a.inverted,c=this.top,d=this.left,e=d+this.width,f=c+this.height,c={clip:"rect("+s(b?d:c)+"px,"+s(b?f:e)+"px,"+
+s(b?e:f)+"px,"+s(b?c:d)+"px)"};!b&&Qa&&a.element.nodeName!=="IMG"&&r(c,{width:e+"px",height:f+"px"});return c},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=R;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,p,u,o,q,D,t="",a=a.stops,s,v=[],F=function(){h=['<fill colors="'+v.join(",")+'" opacity="',o,'" o:opacity2="',u,'" type="',i,'" ',t,'focus="100%" method="any" />'];
+Q(e.prepVML(h),null,null,b)};p=a[0];s=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);s[0]<1&&a.push([1,s[1]]);n(a,function(a,b){g.test(a[1])?(f=qa(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);v.push(a[0]*100+"% "+k);b?(o=l,q=k):(u=l,D=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,t='angle="'+(90-J.atan((m-a)/(p-c))*180/xa)+'"',F();else{var j=m.r,r=j*2,P=j*2,y=m.cx,x=m.cy,A=b.radialReference,w,j=function(){A&&(w=d.getBBox(),y+=(A[0]-w.x)/w.width-
+0.5,x+=(A[1]-w.y)/w.height-0.5,r*=A[2]/w.width,P*=A[2]/w.height);t='src="'+M.global.VMLRadialGradientURL+'" size="'+r+","+P+'" origin="0.5,0.5" position="'+y+","+x+'" color2="'+D+'" ';F()};d.added?j():I(d,"add",j);j=q}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=qa(a),h=["<",c,' opacity="',f.get("a"),'"/>'],Q(this.prepVML(h),null,null,b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1;j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",
+' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:ra.prototype.html,path:function(a){var b={coordsize:"10 10"};Ha(a)?b.d=a:X(a)&&r(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){return this.symbol("circle").attr({x:a-c,y:b-c,width:2*c,height:2*c})},g:function(a){var b;
+a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(ia).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){if(X(a))b=a.y,c=a.width,d=a.height,f=a.strokeWidth,a=a.x;var g=this.symbol("rect");g.r=e;return g.attr(g.crisp(f,a,b,y(c,0),y(d,0)))},invertChild:function(a,b){var c=b.style;H(a,{flip:"x",left:w(c.width)-1,top:w(c.height)-1,rotation:-90})},
+symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=V(f),d=Y(f),i=V(g),j=Y(g),k=e.innerR,l=0.08/h,m=k&&0.1/k||0;if(g-f===0)return["x"];else 2*xa-g+f<l?i=-l:g-f<m&&(i=V(f+m));f=["wa",a-h,b-h,a+h,b+h,a+h*c,b+h*d,a+h*i,b+h*j];e.open&&!k&&f.push("e","M",a,b);f.push("at",a-k,b-k,a+k,b+k,a+k*i,b+k*j,a+k*c,b+k*d,"x","e");return f},circle:function(a,b,c,d){return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!t(e)||!e.r?f=ra.prototype.symbols.square.apply(0,
+arguments):(h=O(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};ja=function(){this.init.apply(this,arguments)};ja.prototype=A(ra.prototype,ha);Ra=ja}var gb,Mb;if(U)gb=function(){pa="http://www.w3.org/1999/xhtml"},gb.prototype.symbols={},Mb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,
+d){b.length===0&&Qb(d,a);b.push(c)}}}();Ra=ja||gb||ra;Pa.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.horiz,e=a.categories,f=this.pos,g=b.labels,h=a.tickPositions,d=e&&d&&e.length&&!g.step&&!g.staggerLines&&!g.rotation&&c.plotWidth/h.length||!d&&c.plotWidth/2,i=f===h[0],j=f===h[h.length-1],k=e&&t(e[f])?e[f]:f,e=this.label,h=h.info,l;a.isDatetimeAxis&&h&&(l=b.dateTimeLabelFormats[h.higherRanks[f]||h.unitName]);this.isFirst=i;this.isLast=j;b=a.labelFormatter.call({axis:a,
+chart:c,isFirst:i,isLast:j,dateTimeLabelFormat:l,value:a.isLog?ea(ba(k)):k});f=d&&{width:y(1,s(d-2*(g.padding||10)))+"px"};f=r(f,g.style);if(t(e))e&&e.attr({text:b}).css(f);else{d={align:g.align};if(Aa(g.rotation))d.rotation=g.rotation;this.label=t(b)&&g.enabled?c.renderer.text(b,0,0,g.useHTML).attr(d).css(f).add(a.labelGroup):null}},getLabelSize:function(){var a=this.label,b=this.axis;return a?(this.labelBBox=a.getBBox())[b.horiz?"height":"width"]:0},getLabelSides:function(){var a=this.axis.options.labels,
+b=this.labelBBox.width,a=b*{left:0,center:0.5,right:1}[a.align]-a.x;return[-a,b-a]},handleOverflow:function(a,b){var c=!0,d=this.axis,e=d.chart,f=this.isFirst,g=this.isLast,h=b.x,i=d.reversed,j=d.tickPositions;if(f||g){var k=this.getLabelSides(),l=k[0],k=k[1],e=e.plotLeft,m=e+d.len,j=(d=d.ticks[j[a+(f?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[f?0:1];f&&!i||g&&i?h+l<e&&(h=e-l,d&&h+k>j&&(c=!1)):h+k>m&&(h=m-k,d&&h+l<j&&(c=!1));b.x=h}return c},getPosition:function(a,b,c,d){var e=this.axis,
+f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed,i=i.staggerLines,a=a+e.x-(f&&d?f*j*(k?-1:1):0),b=b+e.y-(f&&!d?f*j*(k?1:-1):0);t(e.y)||(b+=w(c.styles.lineHeight)*0.9-c.getBBox().height/2);i&&(b+=g/(h||
+1)%i*16);return{x:a,y:b}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b){var c=this.axis,d=c.options,e=c.chart.renderer,f=c.horiz,g=this.type,h=this.label,i=this.pos,j=d.labels,k=this.gridLine,l=g?g+"Grid":"grid",m=g?g+"Tick":"tick",p=d[l+"LineWidth"],u=d[l+"LineColor"],n=d[l+"LineDashStyle"],q=d[m+"Length"],l=d[m+"Width"]||0,D=d[m+"Color"],t=d[m+"Position"],m=this.mark,s=j.step,v=!0,F=c.tickmarkOffset,r=this.getPosition(f,i,F,b),P=
+r.x,r=r.y,y=c.staggerLines;if(p){i=c.getPlotLinePath(i+F,p,b);if(k===x){k={stroke:u,"stroke-width":p};if(n)k.dashstyle=n;if(!g)k.zIndex=1;this.gridLine=k=p?e.path(i).attr(k).add(c.gridGroup):null}if(!b&&k&&i)k[this.isNew?"attr":"animate"]({d:i})}if(l&&q)t==="inside"&&(q=-q),c.opposite&&(q=-q),g=this.getMarkPath(P,r,q,l,f,e),m?m.animate({d:g}):this.mark=e.path(g).attr({stroke:D,"stroke-width":l}).add(c.axisGroup);if(h&&!isNaN(P))h.xy=r=this.getLabelPosition(P,r,h,f,j,F,a,s),this.isFirst&&!o(d.showFirstLabel,
+1)||this.isLast&&!o(d.showLastLabel,1)?v=!1:!y&&f&&j.overflow==="justify"&&!this.handleOverflow(a,r)&&(v=!1),s&&a%s&&(v=!1),v?(h[this.isNew?"attr":"animate"](r),h.show(),this.isNew=!1):h.hide()},destroy:function(){Ea(this,this.axis)}};nb.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=(b.pointRange||0)/2,e=a.options,f=e.label,g=a.label,h=e.width,i=e.to,j=e.from,k=t(j)&&t(i),l=e.value,m=e.dashStyle,p=a.svgElem,u=[],n,q=e.color,D=e.zIndex,s=e.events,r=b.chart.renderer;b.isLog&&(j=ma(j),
+i=ma(i),l=ma(l));if(h){if(u=b.getPlotLinePath(l,h),d={stroke:q,"stroke-width":h},m)d.dashstyle=m}else if(k){if(j=y(j,b.min-d),i=O(i,b.max+d),u=b.getPlotBandPath(j,i,e),d={fill:q},e.borderWidth)d.stroke=e.borderColor,d["stroke-width"]=e.borderWidth}else return;if(t(D))d.zIndex=D;if(p)u?p.animate({d:u},null,p.onGetPath):(p.hide(),p.onGetPath=function(){p.show()});else if(u&&u.length&&(a.svgElem=p=r.path(u).attr(d).add(),s))for(n in e=function(b){p.on(b,function(c){s[b].apply(a,[c])})},s)e(n);if(f&&
+t(f.text)&&u&&u.length&&b.width>0&&b.height>0){f=A({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=r.text(f.text,0,0).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:D}).css(f.style).add();b=[u[1],u[4],o(u[6],u[1])];u=[u[2],u[5],o(u[7],u[2])];c=Ma(b);k=Ma(u);g.align(f,!1,{x:c,y:k,width:Da(b)-c,height:Da(u)-k});g.show()}else g&&g.hide();return a},destroy:function(){Ba(this.axis.plotLinesAndBands,this);Ea(this,this.axis)}};
+Hb.prototype={destroy:function(){Ea(this,this.axis)},setTotal:function(a){this.cum=this.total=a},render:function(a){var b=this.options.formatter.call(this);this.label?this.label.attr({text:b,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(b,0,0).css(this.options.style).attr({align:this.textAlign,rotation:this.options.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=this.isNegative,g=c.translate(this.percent?100:this.total,0,0,0,
+1),c=c.translate(0),c=L(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e.attr({visibility:this.options.crop===!1||d.isInsidePlot(f.x,f.y)?Z?"inherit":"visible":"hidden"})}};ob.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",
+labels:G,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#6D869F",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,
+labels:{align:"right",x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Y-values"},stackLabels:{enabled:!1,formatter:function(){return this.total},style:G.style}},defaultLeftAxisOptions:{labels:{align:"right",x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{align:"left",x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{align:"center",x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{align:"center",
+x:0,y:-5},title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.xOrY=(this.isXAxis=c)?"x":"y";this.opposite=b.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(b);var d=this.options,e=d.type,f=e==="datetime";this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.staggerLines=this.horiz&&d.labels.staggerLines;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.categories=d.categories;this.isLog=
+e==="logarithmic";this.isLinked=t(d.linkedTo);this.isDatetimeAxis=f;this.tickmarkOffset=d.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.min=this.max=null;var g,d=this.options.events;a.axes.push(this);a[c?"xAxis":"yAxis"].push(this);this.series=[];if(a.inverted&&c&&this.reversed===x)this.reversed=
+!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;this.addPlotLine=this.addPlotBand=this.addPlotBandOrLine;for(g in d)I(this,g,d[g]);if(this.isLog)this.val2lin=ma,this.lin2val=ba},setOptions:function(a){this.options=A(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],A(M[this.isXAxis?"xAxis":"yAxis"],a))},defaultLabelFormatter:function(){var a=
+this.axis,b=this.value,c=this.dateTimeLabelFormat,d=M.lang.numericSymbols,e=d&&d.length,f,g=a.isLog?b:a.tickInterval;if(a.categories)f=b;else if(c)f=cb(c,b);else if(e&&g>=1E3)for(;e--&&f===x;)a=Math.pow(1E3,e+1),g>=a&&d[e]!==null&&(f=Ia(b/a,-1)+d[e]);f===x&&(f=b>=1E3?Ia(b,0):Ia(b,-1));return f},getSeriesExtremes:function(){var a=this,b=a.chart,c=a.stacks,d=[],e=[],f;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;n(a.series,function(g){if(g.visible||!b.options.chart.ignoreHiddenSeries){var h=g.options,
+i,j,k,l,m,p,u,n,q,D=h.threshold,s,r=[],v=0;a.hasVisibleSeries=!0;if(a.isLog&&D<=0)D=h.threshold=null;if(a.isXAxis){if(h=g.xData,h.length)a.dataMin=O(o(a.dataMin,h[0]),Ma(h)),a.dataMax=y(o(a.dataMax,h[0]),Da(h))}else{var F,w,P,A=g.cropped,z=g.xAxis.getExtremes(),C=!!g.modifyValue;i=h.stacking;a.usePercentage=i==="percent";if(i)m=h.stack,l=g.type+o(m,""),p="-"+l,g.stackKey=l,j=d[l]||[],d[l]=j,k=e[p]||[],e[p]=k;if(a.usePercentage)a.dataMin=0,a.dataMax=99;h=g.processedXData;u=g.processedYData;s=u.length;
+for(f=0;f<s;f++)if(n=h[f],q=u[f],i&&(w=(F=q<D)?k:j,P=F?p:l,q=w[n]=t(w[n])?ea(w[n]+q):q,c[P]||(c[P]={}),c[P][n]||(c[P][n]=new Hb(a,a.options.stackLabels,F,n,m,i)),c[P][n].setTotal(q)),q!==null&&q!==x&&(C&&(q=g.modifyValue(q)),A||(h[f+1]||n)>=z.min&&(h[f-1]||n)<=z.max))if(n=q.length)for(;n--;)q[n]!==null&&(r[v++]=q[n]);else r[v++]=q;if(!a.usePercentage&&r.length)a.dataMin=O(o(a.dataMin,r[0]),Ma(r)),a.dataMax=y(o(a.dataMax,r[0]),Da(r));if(t(D))if(a.dataMin>=D)a.dataMin=D,a.ignoreMinPadding=!0;else if(a.dataMax<
+D)a.dataMax=D,a.ignoreMaxPadding=!0}}})},translate:function(a,b,c,d,e,f){var g=this.len,h=1,i=0,j=d?this.oldTransA:this.transA,d=d?this.oldMin:this.min,e=this.options.ordinal||this.isLog&&e;if(!j)j=this.transA;c&&(h*=-1,i=g);this.reversed&&(h*=-1,i-=h*g);b?(this.reversed&&(a=g-a),a=a/j+d,e&&(a=this.lin2val(a))):(e&&(a=this.val2lin(a)),a=h*(a-d)*j+i+h*this.minPixelPadding+(f?j*this.pointRange/2:0));return a},getPlotLinePath:function(a,b,c){var d=this.chart,e=this.left,f=this.top,g,h,i,a=this.translate(a,
+null,null,c),j=c&&d.oldChartHeight||d.chartHeight,k=c&&d.oldChartWidth||d.chartWidth,l;g=this.transB;c=h=s(a+g);g=i=s(j-a-g);if(isNaN(a))l=!0;else if(this.horiz){if(g=f,i=j-this.bottom,c<e||c>e+this.width)l=!0}else if(c=e,h=k-this.right,g<f||g>f+this.height)l=!0;return l?null:d.renderer.crispLine(["M",c,g,"L",h,i],b||0)},getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b),d=this.getPlotLinePath(a);d&&c?d.push(c[4],c[5],c[1],c[2]):d=null;return d},getLinearTickPositions:function(a,b,c){for(var d,
+b=ea(T(b/a)*a),c=ea(wa(c/a)*a),e=[];b<=c;){e.push(b);b=ea(b+a);if(b===d)break;d=b}return e},getLogTickPositions:function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=s(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=T(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)j=ma(ba(f)*e[h]),j>b&&g.push(k),k>c&&(l=!0),k=j}else if(b=ba(b),c=ba(c),a=e[d?"minorTickInterval":"tickInterval"],
+a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=hb(a,null,J.pow(10,T(J.log(a)/J.LN10))),g=Sa(this.getLinearTickPositions(a,b,c),ma),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g},getMinorTickPositions:function(){var a=this.tickPositions,b=this.minorTickInterval,c=[],d,e;if(this.isLog){e=a.length;for(d=1;d<e;d++)c=c.concat(this.getLogTickPositions(b,a[d-1],a[d],!0))}else for(a=this.min+(a[0]-this.min)%b;a<=
+this.max;a+=b)c.push(a);return c},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===x&&!this.isLog)t(a.min)||t(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===x||h<f)f=h}),this.minRange=O(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){var k=this.minRange;d=(k-c+b)/2;d=[b-d,o(a.min,b-d)];if(e)d[2]=this.dataMin;
+b=Da(d);c=[b+k,o(a.max,b+k)];if(e)c[2]=this.dataMax;c=Ma(c);c-b<k&&(d[0]=c-k,d[1]=o(a.min,c-k),b=Da(d))}this.min=b;this.max=c},setAxisTranslation:function(){var a=this.max-this.min,b=0,c,d=0,e=0,f=this.linkedParent,g=this.transA;if(this.isXAxis)f?(d=f.minPointOffset,e=f.pointRangePadding):n(this.series,function(a){var f=a.pointRange,g=a.options.pointPlacement,k=a.closestPointRange;b=y(b,f);d=y(d,g?0:f/2);e=y(e,g==="on"?0:f);!a.noSharedTooltip&&t(k)&&(c=t(c)?O(c,k):k)}),this.minPointOffset=d,this.pointRangePadding=
+e,this.pointRange=b,this.closestPointRange=c;this.oldTransA=g;this.translationSlope=this.transA=g=this.len/(a+e||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=g*d},setTickPositions:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,u=b.categories;h?(b.linkedParent=c[g?"xAxis":"yAxis"][d.linkedTo],c=b.linkedParent.getExtremes(),
+b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&$a(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&O(b.min,o(b.dataMin,b.min))<=0&&$a(10,1),b.min=ea(ma(b.min)),b.max=ea(ma(b.max));if(b.range&&(b.userMin=b.min=y(b.min,b.max-b.range),b.userMax=b.max,a))b.range=null;b.adjustForMinRange();if(!u&&!b.usePercentage&&!h&&t(b.min)&&t(b.max)){c=b.max-b.min||1;if(!t(d.min)&&!t(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=
+c*k;if(!t(d.max)&&!t(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.tickInterval=b.min===b.max||b.min===void 0||b.max===void 0?1:h&&!l&&p===b.linkedParent.options.tickPixelInterval?b.linkedParent.tickInterval:o(l,u?1:(b.max-b.min)*p/(b.len||1));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(a);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);
+if(!l&&b.tickInterval<m)b.tickInterval=m;if(!f&&!e&&(a=J.pow(10,T(J.log(b.tickInterval)/J.LN10)),!l))b.tickInterval=hb(b.tickInterval,null,a,d);b.minorTickInterval=d.minorTickInterval==="auto"&&b.tickInterval?b.tickInterval/5:d.minorTickInterval;b.tickPositions=i=d.tickPositions||i&&i.apply(b,[b.min,b.max]);if(!i)i=f?(b.getNonLinearTimeTicks||Ob)(Nb(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,b.min,b.max):b.getLinearTickPositions(b.tickInterval,
+b.min,b.max),b.tickPositions=i;if(!h)e=i[0],f=i[i.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&i.shift(),d.endOnTick?b.max=f:b.max+h<f&&i.pop()},setMaxTicks:function(){var a=this.chart,b=a.maxTicks,c=this.tickPositions,d=this.xOrY;b||(b={x:0,y:0});if(!this.isLinked&&!this.isDatetimeAxis&&c.length>b[d]&&this.options.alignTicks!==!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this.xOrY,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&
+!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e<a){for(;b.length<a;)b.push(ea(b[b.length-1]+this.tickInterval));this.transA*=(e-1)/(a-1);this.max=b[b.length-1]}if(t(d)&&a!==d)this.isDirty=!0}},setScale:function(){var a=this.stacks,b,c,d,e;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();e=this.len!==this.oldAxisLength;n(this.series,function(a){if(a.isDirtyData||a.isDirty||a.xAxis.isDirty)d=
+!0});if(e||d||this.isLinked||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax)if(this.getSeriesExtremes(),this.setTickPositions(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,!this.isDirty)this.isDirty=e||this.min!==this.oldMin||this.max!==this.oldMax;if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total;this.setMaxTicks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=o(c,!0),e=r(e,{min:a,max:b});E(f,"setExtremes",e,function(){f.userMin=a;f.userMax=
+b;f.isDirtyExtremes=!0;c&&g.redraw(d)})},zoom:function(a,b){this.setExtremes(a,b,!1,x,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0;this.left=o(b.left,a.plotLeft+c);this.top=o(b.top,a.plotTop);this.width=o(b.width,a.plotWidth-c+d);this.height=o(b.height,a.plotHeight);this.bottom=a.chartHeight-this.height-this.top;this.right=a.chartWidth-this.width-this.left;this.len=y(this.horiz?this.width:this.height,0)},getExtremes:function(){var a=
+this.isLog;return{min:a?ea(ba(this.min)):this.min,max:a?ea(ba(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ba(this.min):this.min,b=b?ba(this.max):this.max;c>a||a===null?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},addPlotBandOrLine:function(a){a=(new nb(this,a)).render();this.plotLinesAndBands.push(a);return a},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,
+f=a.ticks,g=a.horiz,h=a.side,i,j=0,k,l=0,m=d.title,p=d.labels,u=0,da=b.axisOffset,q=[-1,1,1,-1][h],D;a.hasData=b=a.hasVisibleSeries||t(a.min)&&t(a.max)&&!!e;a.showAxis=i=b||o(d.showEmpty,!0);if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:p.zIndex||7}).add();if(b||a.isLinked)n(e,function(b){f[b]?f[b].addLabel():f[b]=new Pa(a,b)}),n(e,function(a){if(h===0||h===2||{1:"left",
+3:"right"}[h]===p.align)u=y(f[a].getLabelSize(),u)}),a.staggerLines&&(u+=(a.staggerLines-1)*16);else for(D in f)f[D].destroy(),delete f[D];if(m&&m.text){if(!a.axisTitle)a.axisTitle=c.text(m.text,0,0,m.useHTML).attr({zIndex:7,rotation:m.rotation||0,align:m.textAlign||{low:"left",middle:"center",high:"right"}[m.align]}).css(m.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(i)j=a.axisTitle.getBBox()[g?"height":"width"],l=o(m.margin,g?5:10),k=m.offset;a.axisTitle[i?"show":"hide"]()}a.offset=q*o(d.offset,
+da[h]);a.axisTitleMargin=o(k,u+l+(h!==2&&u&&q*d.labels[g?"y":"x"]));da[h]=y(da[h],a.axisTitleMargin+j+q*a.offset)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d;this.lineTop=c=b.chartHeight-this.bottom-(c?this.height:0)+d;return b.renderer.crispLine(["M",e?this.left:f,e?c:this.top,"L",e?b.chartWidth-this.right:f,e?c:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,
+f=a?b:c,g=this.opposite,h=this.offset,i=w(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.stacks,j=a.ticks,k=a.minorTicks,l=a.alternateBands,m=d.stackLabels,p=d.alternateGridColor,u=a.tickmarkOffset,
+o=d.lineWidth,q,D=b.hasRendered&&t(a.oldMin)&&!isNaN(a.oldMin),r=a.showAxis,s,v;if(a.hasData||f)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Pa(a,b,"minor"));D&&k[b].isNew&&k[b].render(null,!0);k[b].isActive=!0;k[b].render()}),n(g.slice(1).concat([g[0]]),function(b,c){c=c===g.length-1?0:c+1;if(!f||b>=a.min&&b<=a.max)j[b]||(j[b]=new Pa(a,b)),D&&j[b].isNew&&j[b].render(c,!0),j[b].isActive=!0,j[b].render(c)}),p&&n(g,function(b,c){if(c%2===0&&b<a.max)l[b]||
+(l[b]=new nb(a)),s=b+u,v=g[c+1]!==x?g[c+1]+u:a.max,l[b].options={from:e?ba(s):s,to:e?ba(v):v,color:p},l[b].render(),l[b].isActive=!0}),!a._addedPlotLB)n((d.plotLines||[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0;n([j,k,l],function(a){for(var b in a)a[b].isActive?a[b].isActive=!1:(a[b].destroy(),delete a[b])});if(o)q=a.getLinePath(o),a.axisLine?a.axisLine.animate({d:q}):a.axisLine=c.path(q).attr({stroke:d.lineColor,"stroke-width":o,zIndex:7}).add(a.axisGroup),
+a.axisLine[r?"show":"hide"]();if(h&&r)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;if(m&&m.enabled){var F,w,d=a.stackTotalGroup;if(!d)a.stackTotalGroup=d=c.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();d.translate(b.plotLeft,b.plotTop);for(F in i)for(w in b=i[F],b)b[w].render(d)}a.isDirty=!1},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=b.length;c--;)b[c].id===a&&b[c].destroy()},setTitle:function(a,b){var c=this.chart,d=this.options,e=this.axisTitle;
+d.title=A(d.title,a);this.axisTitle=e&&e.destroy();this.isDirty=!0;o(b,!0)&&c.redraw()},redraw:function(){var a=this.chart;a.tracker.resetTracker&&a.tracker.resetTracker(!0);this.render();n(this.plotLinesAndBands,function(a){a.render()});n(this.series,function(a){a.isDirty=!0})},setCategories:function(a,b){var c=this.chart;this.categories=this.userOptions.categories=a;n(this.series,function(a){a.translate();a.setTooltipPoints(!0)});this.isDirty=!0;o(b,!0)&&c.redraw()},destroy:function(){var a=this,
+b=a.stacks,c;S(a);for(c in b)Ea(b[c]),b[c]=null;n([a.ticks,a.minorTicks,a.alternateBands,a.plotLinesAndBands],function(a){Ea(a)});n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","),function(b){a[b]&&(a[b]=a[b].destroy())})}};pb.prototype={destroy:function(){n(this.crosshairs,function(a){a&&a.destroy()});if(this.label)this.label=this.label.destroy()},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden;r(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:
+b,anchorX:g?(2*f.anchorX+c)/3:c,anchorY:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g&&(L(a-f.x)>1||L(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){if(!this.isHidden){var a=this.chart.hoverPoints;this.label.hide();a&&n(a,function(a){a.setState()});this.chart.hoverPoints=null;this.isHidden=!0}},hideCrosshairs:function(){n(this.crosshairs,function(a){a&&a.hide()})},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=
+0,g=0,h,a=na(a);c=a[0].tooltipPos;c||(n(a,function(a){h=a.series.yAxis;f+=a.plotX;g+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&h?h.top-d.plotTop:0)}),f/=a.length,g/=a.length,c=[e?d.plotWidth-g:f,this.shared&&!e&&a.length>1&&b?b.chartY-d.plotTop:e?d.plotHeight-f:g]);return Sa(c,s)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+y(j,0)+i);d+a>
+e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k<f+5&&(k=f+5,l&&c>=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=y(f,f+h-b-i));return{x:d,y:k}},refresh:function(a,b){function c(){var a=this.points||na(this),b=a[0].series,c;c=[b.tooltipHeaderFormatter(a[0].key)];n(a,function(a){b=a.series;c.push(b.tooltipFormatter&&b.tooltipFormatter(a)||a.point.tooltipFormatter(b.tooltipOptions.pointFormat))});c.push(f.footerFormat||"");return c.join("")}var d=this.chart,e=this.label,f=this.options,g,h,i,j={},k,l=[];k=f.formatter||c;var j=
+d.hoverPoints,m,p=f.crosshairs;i=this.shared;h=this.getAnchor(a,b);g=h[0];h=h[1];i&&(!a.series||!a.series.noSharedTooltip)?(d.hoverPoints=a,j&&n(j,function(a){a.setState()}),n(a,function(a){a.setState("hover");l.push(a.getLabelConfig())}),j={x:a[0].category,y:a[0].y},j.points=l,a=a[0]):j=a.getLabelConfig();k=k.call(j);j=a.series;i=i||!j.isCartesian||j.tooltipOutsidePlot||d.isInsidePlot(g,h);k===!1||!i?this.hide():(this.isHidden&&e.show(),e.attr({text:k}),m=f.borderColor||a.color||j.color||"#606060",
+e.attr({stroke:m}),e=(f.positioner||this.getPosition).call(this,e.width,e.height,{plotX:g,plotY:h}),this.move(s(e.x),s(e.y),g+d.plotLeft,h+d.plotTop),this.isHidden=!1);if(p){p=na(p);for(e=p.length;e--;)if(i=a.series[e?"yAxis":"xAxis"],p[e]&&i)if(i=i.getPlotLinePath(e?o(a.stackY,a.y):a.x,1),this.crosshairs[e])this.crosshairs[e].attr({d:i,visibility:"visible"});else{j={"stroke-width":p[e].width||1,stroke:p[e].color||"#C0C0C0",zIndex:p[e].zIndex||2};if(p[e].dashStyle)j.dashstyle=p[e].dashStyle;this.crosshairs[e]=
+d.renderer.path(i).attr(j).add()}}E(d,"tooltipRefresh",{text:k,x:g+d.plotLeft,y:h+d.plotTop,borderColor:m})}};qb.prototype={normalizeMouseEvent:function(a){var b,c,d,a=a||K.event;if(!a.target)a.target=a.srcElement;a=Lb(a);d=a.touches?a.touches.item(0):a;this.chartPosition=b=Sb(this.chart.container);d.pageX===x?(c=a.x,b=a.y):(c=d.pageX-b.left,b=d.pageY-b.top);return r(a,{chartX:s(c),chartY:s(b)})},getMouseCoordinates:function(a){var b={xAxis:[],yAxis:[]},c=this.chart;n(c.axes,function(d){var e=d.isXAxis;
+b[e?"xAxis":"yAxis"].push({axis:d,value:d.translate(((c.inverted?!e:e)?a.chartX-c.plotLeft:d.top+d.len-a.chartY)-d.minPixelPadding,!0)})});return b},getIndex:function(a){var b=this.chart;return b.inverted?b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},onmousemove:function(a){var b=this.chart,c=b.series,d=b.tooltip,e,f=b.hoverPoint,g=b.hoverSeries,h,i,j=b.chartWidth,k=this.getIndex(a);if(d&&this.options.tooltip.shared&&(!g||!g.noSharedTooltip)){e=[];h=c.length;for(i=0;i<h;i++)if(c[i].visible&&
+c[i].options.enableMouseTracking!==!1&&!c[i].noSharedTooltip&&c[i].tooltipPoints.length)b=c[i].tooltipPoints[k],b._dist=L(k-b[c[i].xAxis.tooltipPosName||"plotX"]),j=O(j,b._dist),e.push(b);for(h=e.length;h--;)e[h]._dist>j&&e.splice(h,1);if(e.length&&e[0].plotX!==this.hoverX)d.refresh(e,a),this.hoverX=e[0].plotX}if(g&&g.tracker&&(b=g.tooltipPoints[k])&&b!==f)b.onMouseOver()},resetTracker:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,b=e&&e.shared?b.hoverPoints:d;(a=a&&e&&b)&&
+na(b)[0].plotX===x&&(a=!1);if(a)e.refresh(b);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&(e.hide(),e.hideCrosshairs());this.hoverX=null}},setDOMEvents:function(){function a(){if(b.selectionMarker){var f={xAxis:[],yAxis:[]},g=b.selectionMarker.getBBox(),h=g.x-c.plotLeft,l=g.y-c.plotTop,m;e&&(n(c.axes,function(a){if(a.options.zoomEnabled!==!1){var b=a.isXAxis,d=c.inverted?!b:b,e=a.translate(d?h:c.plotHeight-l-g.height,!0,0,0,1),d=a.translate((d?h+g.width:c.plotHeight-l)-2*a.minPixelPadding,!0,0,
+0,1);!isNaN(e)&&!isNaN(d)&&(f[b?"xAxis":"yAxis"].push({axis:a,min:O(e,d),max:y(e,d)}),m=!0)}}),m&&E(c,"selection",f,function(a){c.zoom(a)}));b.selectionMarker=b.selectionMarker.destroy()}if(c)H(d,{cursor:"auto"}),c.cancelClick=e,c.mouseIsDown=e=!1;S(C,fa?"touchend":"mouseup",a)}var b=this,c=b.chart,d=c.container,e,f=b.zoomX&&!c.inverted||b.zoomY&&c.inverted,g=b.zoomY&&!c.inverted||b.zoomX&&c.inverted;b.hideTooltipOnMouseMove=function(a){a=Lb(a);b.chartPosition&&c.hoverSeries&&c.hoverSeries.isCartesian&&
+!c.isInsidePlot(a.pageX-b.chartPosition.left-c.plotLeft,a.pageY-b.chartPosition.top-c.plotTop)&&b.resetTracker()};b.hideTooltipOnMouseLeave=function(){b.resetTracker();b.chartPosition=null};d.onmousedown=function(d){d=b.normalizeMouseEvent(d);!fa&&d.preventDefault&&d.preventDefault();c.mouseIsDown=!0;c.cancelClick=!1;c.mouseDownX=b.mouseDownX=d.chartX;b.mouseDownY=d.chartY;I(C,fa?"touchend":"mouseup",a)};var h=function(a){if(!a||!(a.touches&&a.touches.length>1)){a=b.normalizeMouseEvent(a);if(!fa)a.returnValue=
+!1;var d=a.chartX,h=a.chartY,l=!c.isInsidePlot(d-c.plotLeft,h-c.plotTop);fa&&a.type==="touchstart"&&(z(a.target,"isTracker")?c.runTrackerClick||a.preventDefault():!c.runChartClick&&!l&&a.preventDefault());if(l)d<c.plotLeft?d=c.plotLeft:d>c.plotLeft+c.plotWidth&&(d=c.plotLeft+c.plotWidth),h<c.plotTop?h=c.plotTop:h>c.plotTop+c.plotHeight&&(h=c.plotTop+c.plotHeight);if(c.mouseIsDown&&a.type!=="touchstart"&&(e=Math.sqrt(Math.pow(b.mouseDownX-d,2)+Math.pow(b.mouseDownY-h,2)),e>10)){var m=c.isInsidePlot(b.mouseDownX-
+c.plotLeft,b.mouseDownY-c.plotTop);if(c.hasCartesianSeries&&(b.zoomX||b.zoomY)&&m&&!b.selectionMarker)b.selectionMarker=c.renderer.rect(c.plotLeft,c.plotTop,f?1:c.plotWidth,g?1:c.plotHeight,0).attr({fill:b.options.chart.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();if(b.selectionMarker&&f){var p=d-b.mouseDownX;b.selectionMarker.attr({width:L(p),x:(p>0?0:p)+b.mouseDownX})}b.selectionMarker&&g&&(h-=b.mouseDownY,b.selectionMarker.attr({height:L(h),y:(h>0?0:h)+b.mouseDownY}));m&&!b.selectionMarker&&
+b.options.chart.panning&&c.pan(d)}if(!l)b.onmousemove(a);return l||!c.hasCartesianSeries}};d.onmousemove=h;I(d,"mouseleave",b.hideTooltipOnMouseLeave);I(C,"mousemove",b.hideTooltipOnMouseMove);d.ontouchstart=function(a){if(b.zoomX||b.zoomY)d.onmousedown(a);h(a)};d.ontouchmove=h;d.ontouchend=function(){e&&b.resetTracker()};d.onclick=function(a){var d=c.hoverPoint,e,f,a=b.normalizeMouseEvent(a);a.cancelBubble=!0;if(!c.cancelClick)d&&(z(a.target,"isTracker")||z(a.target.parentNode,"isTracker"))?(e=d.plotX,
+f=d.plotY,r(d,{pageX:b.chartPosition.left+c.plotLeft+(c.inverted?c.plotWidth-f:e),pageY:b.chartPosition.top+c.plotTop+(c.inverted?c.plotHeight-e:f)}),E(d.series,"click",r(a,{point:d})),d.firePointEvent("click",a)):(r(a,b.getMouseCoordinates(a)),c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop)&&E(c,"click",a))}},destroy:function(){var a=this.chart,b=a.container;if(a.trackerGroup)a.trackerGroup=a.trackerGroup.destroy();S(b,"mouseleave",this.hideTooltipOnMouseLeave);S(C,"mousemove",this.hideTooltipOnMouseMove);
+b.onclick=b.onmousedown=b.onmousemove=b.ontouchstart=b.ontouchend=b.ontouchmove=null;clearInterval(this.tooltipTimeout)},init:function(a,b){if(!a.trackerGroup)a.trackerGroup=a.renderer.g("tracker").attr({zIndex:9}).add();if(b.enabled)a.tooltip=new pb(a,b);this.setDOMEvents()}};rb.prototype={init:function(a){var b=this,c=b.options=a.options.legend;if(c.enabled){var d=c.itemStyle,e=o(c.padding,8),f=c.itemMarginTop||0;b.baseline=w(d.fontSize)+3+f;b.itemStyle=d;b.itemHiddenStyle=A(d,c.itemHiddenStyle);
+b.itemMarginTop=f;b.padding=e;b.initialItemX=e;b.initialItemY=e-5;b.maxItemWidth=0;b.chart=a;b.itemHeight=0;b.lastLineHeight=0;b.render();I(b.chart,"endResize",function(){b.positionCheckboxes()})}},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.color:g,g=a.options&&a.options.marker,i={stroke:h,fill:h},j;d&&d.css({fill:c});e&&e.attr({stroke:h});if(f){if(g)for(j in g=a.convertAttribs(g),g)d=g[j],
+d!==x&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&a[b].destroy()});b&&Na(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(){var a=
+this;n(a.allItems,function(b){var c=b.checkbox,d=a.group.alignAttr;c&&H(c,{left:d.translateX+b.legendItemWidth+c.x-20+"px",top:d.translateY+c.y+3+"px"})})},renderItem:function(a){var u;var b=this,c=b.chart,d=c.renderer,e=b.options,f=e.layout==="horizontal",g=e.symbolWidth,h=e.symbolPadding,i=b.itemStyle,j=b.itemHiddenStyle,k=b.padding,l=!e.rtl,m=e.width,p=e.itemMarginBottom||0,o=b.itemMarginTop,n=b.initialItemX,q=a.legendItem,t=a.series||a,r=t.options,s=r.showCheckbox;if(!q&&(a.legendGroup=d.g("legend-item").attr({zIndex:1}).add(b.scrollGroup),
+t.drawLegendSymbol(b,a),a.legendItem=q=d.text(e.labelFormatter.call(a),l?g+h:-h,b.baseline,e.useHTML).css(A(a.visible?i:j)).attr({align:l?"left":"right",zIndex:2}).add(a.legendGroup),a.legendGroup.on("mouseover",function(){a.setState("hover");q.css(b.options.itemHoverStyle)}).on("mouseout",function(){q.css(a.visible?i:j);a.setState()}).on("click",function(b){var c=function(){a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):E(a,"legendItemClick",b,c)}),b.colorizeItem(a,
+a.visible),r&&s))a.checkbox=Q("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},e.itemCheckboxStyle,c.container),I(a.checkbox,"click",function(b){E(a,"checkboxClick",{checked:b.target.checked},function(){a.select()})});d=q.getBBox();u=a.legendItemWidth=e.itemWidth||g+h+d.width+k+(s?20:0),e=u;b.itemHeight=g=d.height;if(f&&b.itemX-n+e>(m||c.chartWidth-2*k-n))b.itemX=n,b.itemY+=o+b.lastLineHeight+p,b.lastLineHeight=0;b.maxItemWidth=y(b.maxItemWidth,e);b.lastItemY=o+b.itemY+p;b.lastLineHeight=
+y(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=o+g+p,b.lastLineHeight=g);b.offsetWidth=m||y(f?b.itemX-n:e,b.offsetWidth)},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup),
+a.clipRect=c.clipRect(0,0,9999,b.chartHeight),a.contentGroup.clip(a.clipRect);e=[];n(b.series,function(a){var b=a.options;b.showInLegend&&(e=e.concat(a.legendItems||(b.legendType==="point"?a.data:a)))});Fb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>
+0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||0,fill:m||R}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,b.spacingBox);b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+
+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h=this.clipRect,i=e.navigation,j=o(i.animation,!0),k=i.arrowSize||12,l=this.nav;e.layout==="horizontal"&&(f/=2);g&&(f=O(f,g));if(a>f){this.clipHeight=c=f-20;this.pageCount=wa(a/c);this.currentPage=o(this.currentPage,1);this.fullHeight=a;h.attr({height:c});if(!l)this.nav=l=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,k,k).on("click",function(){b.scroll(-1,j)}).add(l),this.pager=d.text("",15,10).css(i.style).add(l),
+this.down=d.symbol("triangle-down",0,0,k,k).on("click",function(){b.scroll(1,j)}).add(l);b.scroll(0);a=f}else l&&(h.attr({height:c.chartHeight}),l.hide(),this.scrollGroup.attr({translateY:1}));return a},scroll:function(a,b){var c=this.pageCount,d=this.currentPage+a,e=this.clipHeight,f=this.options.navigation,g=f.activeColor,f=f.inactiveColor,h=this.pager,i=this.padding;d>c&&(d=c);if(d>0)b!==x&&ua(b,this.chart),this.nav.attr({translateX:i,translateY:e+7,visibility:"visible"}),this.up.attr({fill:d===
+1?f:g}).css({cursor:d===1?"default":"pointer"}),h.attr({text:d+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:d===c?f:g}).css({cursor:d===c?"default":"pointer"}),this.scrollGroup.animate({translateY:-O(e*(d-1),this.fullHeight-e+i)+1}),h.attr({text:d+"/"+c}),this.currentPage=d}};sb.prototype={initSeries:function(a){var b=this.options.chart,b=new $[a.type||b.type||b.defaultSeriesType];b.init(this,a);return b},addSeries:function(a,b,c){var d,e=this;a&&(ua(c,e),b=o(b,!0),E(e,
+"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;b&&e.redraw()}));return d},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.tracker,e=this.legend,f=this.isDirtyLegend,g,h=this.isDirtyBox,i=c.length,j=i,k=this.renderer,l=k.isHidden(),
+m=[];ua(a,this);for(l&&this.cloneRenderTo();j--;)if(a=c[j],a.isDirty&&a.options.stacking){g=!0;break}if(g)for(j=i;j--;)if(a=c[j],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.adjustTickAmounts();this.getMargins();n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,m.push(function(){E(a,
+"afterSetExtremes",a.getExtremes())});if(a.isDirty||h||g)a.redraw(),h=!0})}h&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.resetTracker&&d.resetTracker(!0);k.draw();E(this,"redraw");l&&this.cloneRenderTo(!0);n(m,function(a){a.call()})},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=Q(ia,{className:"highcharts-loading"},r(d.style,{left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+
+"px",height:this.plotHeight+"px",zIndex:10,display:R}),this.container),this.loadingSpan=Q("span",null,d.labelStyle,c);this.loadingSpan.innerHTML=a||b.lang.loading;if(!this.loadingShown)H(c,{opacity:0,display:""}),xb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&xb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){H(b,{display:R})}});this.loadingShown=!1},get:function(a){var b=this.axes,
+c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis||{},b=b.yAxis||{},c=na(c);n(c,function(a,b){a.index=b;a.isX=!0});b=na(b);n(b,function(a,b){a.index=b});c=c.concat(b);n(c,function(b){new ob(a,b)});a.adjustTickAmounts()},getSelectedPoints:function(){var a=[];
+n(this.series,function(b){a=a.concat(Kb(b.points,function(a){return a.selected}))});return a},getSelectedSeries:function(){return Kb(this.series,function(a){return a.selected})},showResetZoom:function(){var a=this,b=M.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,a[f]);
+this.resetZoomButton.alignTo=f},zoomOut:function(){var a=this,b=a.resetZoomButton;E(a,"selection",{resetSelection:!0},function(){a.zoom()});if(b)a.resetZoomButton=b.destroy()},zoom:function(a){var b=this,c;!a||a.resetSelection?n(b.axes,function(a){c=a.zoom()}):n(a.xAxis.concat(a.yAxis),function(a){var e=a.axis;if(b.tracker[e.isXAxis?"zoomX":"zoomY"])c=e.zoom(a.min,a.max)});b.resetZoomButton||b.showResetZoom();c&&b.redraw(o(b.options.chart.animation,b.pointCount<100))},pan:function(a){var b=this.xAxis[0],
+c=this.mouseDownX,d=b.pointRange/2,e=b.getExtremes(),f=b.translate(c-a,!0)+d,c=b.translate(c+this.plotWidth-a,!0)-d;(d=this.hoverPoints)&&n(d,function(a){a.setState()});b.series.length&&f>O(e.dataMin,e.min)&&c<y(e.dataMax,e.max)&&b.setExtremes(f,c,!0,!1,{trigger:"pan"});this.mouseDownX=a;H(this.container,{cursor:"move"})},setTitle:function(a,b){var c=this,d=c.options,e;c.chartTitleOptions=e=A(d.title,a);c.chartSubtitleOptions=d=A(d.subtitle,b);n([["title",a,e],["subtitle",b,d]],function(a){var b=
+a[0],d=c[b],e=a[1],a=a[2];d&&e&&(c[b]=d=d.destroy());a&&a.text&&!d&&(c[b]=c.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add().align(a,!1,c.spacingBox))})},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=db(b,"width");this.containerHeight=db(b,"height");this.chartWidth=a.width||this.containerWidth||600;this.chartHeight=a.height||(this.containerHeight>19?this.containerHeight:
+400)},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Na(b),delete this.renderToClone):(c&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),H(b,{position:"absolute",top:"-9999px",display:"block"}),C.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+ub++;if(la(a))this.renderTo=a=C.getElementById(a);a||$a(13,!0);a.innerHTML="";
+a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;this.container=a=Q(ia,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0},b.style),this.renderToClone||a);this.renderer=b.forExport?new ra(a,c,d,!0):new Ra(a,c,d);U&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.options.chart,b=a.spacingTop,c=a.spacingRight,
+d=a.spacingBottom,a=a.spacingLeft,e,f=this.legend,g=this.optionsMarginTop,h=this.optionsMarginLeft,i=this.optionsMarginRight,j=this.optionsMarginBottom,k=this.chartTitleOptions,l=this.chartSubtitleOptions,m=this.options.legend,p=o(m.margin,10),u=m.x,r=m.y,q=m.align,s=m.verticalAlign;this.resetMargins();e=this.axisOffset;if((this.title||this.subtitle)&&!t(this.optionsMarginTop))if(l=y(this.title&&!k.floating&&!k.verticalAlign&&k.y||0,this.subtitle&&!l.floating&&!l.verticalAlign&&l.y||0))this.plotTop=
+y(this.plotTop,l+o(k.margin,15)+b);if(f.display&&!m.floating)if(q==="right"){if(!t(i))this.marginRight=y(this.marginRight,f.legendWidth-u+p+c)}else if(q==="left"){if(!t(h))this.plotLeft=y(this.plotLeft,f.legendWidth+u+p+a)}else if(s==="top"){if(!t(g))this.plotTop=y(this.plotTop,f.legendHeight+r+p+b)}else if(s==="bottom"&&!t(j))this.marginBottom=y(this.marginBottom,f.legendHeight-r+p+d);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);
+this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});t(h)||(this.plotLeft+=e[3]);t(g)||(this.plotTop+=e[0]);t(j)||(this.marginBottom+=e[2]);t(i)||(this.marginRight+=e[1]);this.setChartSize()},initReflow:function(){function a(a){var g=c.width||db(d,"width"),h=c.height||db(d,"height"),a=a?a.target:K;if(g&&h&&(a===K||a===C)){if(g!==b.containerWidth||h!==b.containerHeight)clearTimeout(e),b.reflowTimeout=e=setTimeout(function(){b.container&&b.resize(g,h,!1)},100);b.containerWidth=g;b.containerHeight=
+h}}var b=this,c=b.options.chart,d=b.renderTo,e;I(K,"resize",a);I(b,"destroy",function(){S(K,"resize",a)})},resize:function(a,b,c){var d=this,e,f,g=d.resetZoomButton,h=d.title,i=d.subtitle,j;d.isResizing+=1;j=function(){d&&E(d,"endResize",null,function(){d.isResizing-=1})};ua(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(t(a))d.chartWidth=e=s(a);if(t(b))d.chartHeight=f=s(b);H(d.container,{width:e+"px",height:f+"px"});d.renderer.setSize(e,f,c);d.plotWidth=e-d.plotLeft-d.marginRight;
+d.plotHeight=f-d.plotTop-d.marginBottom;d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();a=d.spacingBox;h&&h.align(null,null,a);i&&i.align(null,null,a);g&&g.align&&g.align(null,null,d[g.alignTo]);d.redraw(c);d.oldChartHeight=null;E(d,"resize");Oa===!1?j():setTimeout(j,Oa&&Oa.duration||500)},setChartSize:function(){var a=this.inverted,b=this.chartWidth,c=this.chartHeight,d=this.options.chart,e=d.spacingTop,
+f=d.spacingRight,g=d.spacingBottom,h=d.spacingLeft,i,j,k,l;this.plotLeft=i=s(this.plotLeft);this.plotTop=j=s(this.plotTop);this.plotWidth=k=s(b-i-this.marginRight);this.plotHeight=l=s(c-j-this.marginBottom);this.plotSizeX=a?l:k;this.plotSizeY=a?k:l;this.plotBorderWidth=a=d.plotBorderWidth||0;this.spacingBox={x:h,y:e,width:b-h-f,height:c-e-g};this.plotBox={x:i,y:j,width:k,height:l};this.clipBox={x:a/2,y:a/2,width:this.plotSizeX-a,height:this.plotSizeY-a};n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},
+resetMargins:function(){var a=this.options.chart,b=a.spacingRight,c=a.spacingBottom,d=a.spacingLeft;this.plotTop=o(this.optionsMarginTop,a.spacingTop);this.marginRight=o(this.optionsMarginRight,b);this.marginBottom=o(this.optionsMarginBottom,c);this.plotLeft=o(this.optionsMarginLeft,d);this.axisOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||
+0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,o=this.plotLeft,n=this.plotTop,q=this.plotWidth,r=this.plotHeight,t=this.plotBox,s=this.clipRect,v=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-p,d-p));else{e={fill:j||R};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(t):this.plotBackground=b.rect(o,n,q,r,0).attr({fill:k}).add().shadow(a.plotShadow);
+if(l)h?h.animate(t):this.plotBGImage=b.image(l,o,n,q,r).add();s?s.animate({width:v.width,height:v.height}):this.clipRect=b.clipRect(v);if(m)g?g.animate(g.crisp(null,o,n,q,r)):this.plotBorder=b.rect(o,n,q,r,0,m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=$[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&
+e--;)(c=$[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,e=d.labels,d=d.credits,f;a.setTitle();a.legend=new rb(a);n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();
+a.setTooltipPoints();a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style),f=w(d.left)+a.plotLeft,j=w(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,j).attr({zIndex:2}).css(d).add()});if(d.enabled&&!a.credits)f=d.href,a.credits=c.text(d.text,0,0).on("click",function(){if(f)location.href=f}).attr({align:d.position.align,zIndex:8}).css(d.style).add().align(d.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;
+E(a,"destroy");S(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,tracker,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",S(d),f&&Na(d);for(e in a)delete a[e]},firstRender:function(){var a=this,b=a.options,c=a.callback;if(!Z&&K==K.top&&C.readyState!=="complete"||
+U&&!K.canvg)U?Mb.push(function(){a.firstRender()},b.global.canvasToolsURL):C.attachEvent("onreadystatechange",function(){C.detachEvent("onreadystatechange",a.firstRender);C.readyState==="complete"&&a.firstRender()});else{a.getContainer();E(a,"init");if(Highcharts.RangeSelector&&b.rangeSelector.enabled)a.rangeSelector=new Highcharts.RangeSelector(a);a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();n(b.series||[],function(b){a.initSeries(b)});if(Highcharts.Scroller&&(b.navigator.enabled||
+b.scrollbar.enabled))a.scroller=new Highcharts.Scroller(a);a.tracker=new qb(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);n(a.callbacks,function(b){b.apply(a,[a])});a.cloneRenderTo(!0);E(a,"load")}},init:function(a){var b=this.options.chart,c;b.reflow!==!1&&I(this,"load",this.initReflow);if(a)for(c in a)I(this,c,a[c]);this.xAxis=[];this.yAxis=[];this.animation=U?!1:o(b.animation,!0);this.setSize=this.resize;this.pointCount=0;this.counters=new Eb;this.firstRender()}};sb.prototype.callbacks=[];
+var Ta=function(){};Ta.prototype={init:function(a,b,c){var d=a.chart.counters;this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint)b=a.chart.options.colors,this.color=this.color||b[d.color++],d.wrapColor(b.length);a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=typeof a;this.config=a;if(d==="number"||a===null)this.y=a;else if(typeof a[0]==="number")this.x=a[0],this.y=a[1];else if(d==="object"&&typeof a.length!=="number"){r(this,a);this.options=
+a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}else if(typeof a[0]==="string")this.name=a[0],this.y=a[1];if(this.x===x)this.x=b===x?c.autoIncrement():b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),Ba(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)S(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=
+"graphic,tracker,dataLabel,group,connector,shadowGroup".split(","),b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(a,b){var c=this,d=c.series.chart,a=o(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=a;c.setState(a&&"select");b||n(d.getSelectedPoints(),function(a){if(a.selected&&
+a!==c)a.selected=!1,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(){var a=this.series,b=a.chart,c=b.tooltip,d=b.hoverPoint;if(d&&d!==this)d.onMouseOut();this.firePointEvent("mouseOver");c&&(!c.shared||a.noSharedTooltip)&&c.refresh(this);this.setState("hover");b.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;if(!b||Rb(this,b)===-1)this.firePointEvent("mouseOut"),this.setState(),a.hoverPoint=null},tooltipFormatter:function(a){var b=this.series,
+c=b.tooltipOptions,d=a.match(/\{(series|point)\.[a-zA-Z]+\}/g),e=/[{\.}]/,f,g,h,i,j={y:0,open:0,high:0,low:0,close:0,percentage:1,total:1};c.valuePrefix=c.valuePrefix||c.yPrefix;c.valueDecimals=c.valueDecimals||c.yDecimals;c.valueSuffix=c.valueSuffix||c.ySuffix;for(i in d)g=d[i],la(g)&&g!==a&&(h=(" "+g).split(e),f={point:this,series:b}[h[1]],h=h[2],f===this&&j.hasOwnProperty(h)?(f=j[h]?h:"value",f=(c[f+"Prefix"]||"")+Ia(this[h],o(c[f+"Decimals"],-1))+(c[f+"Suffix"]||"")):f=f[h],a=a.replace(g,f));
+return a},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=h.length,j=e.chart,b=o(b,!0);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);X(a)&&(e.getAttribs(),f&&f.attr(d.pointAttr[e.state]));for(g=0;g<i;g++)if(h[g]===d){e.xData[g]=d.x;e.yData[g]=d.y;e.options.data[g]=a;break}e.isDirty=!0;e.isDirtyData=!0;b&&j.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.chart,f,g=d.data,h=g.length;ua(b,e);a=o(a,!0);c.firePointEvent("remove",null,function(){for(f=
+0;f<h;f++)if(g[f]===c){g.splice(f,1);d.options.data.splice(f,1);d.xData.splice(f,1);d.yData.splice(f,1);break}c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&e.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});E(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=A(this.series.options.point,
+this.options).events,b;this.events=a;for(b in a)I(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a){var b=this.plotX,c=this.plotY,d=this.series,e=d.options.states,f=W[d.type].marker&&d.options.marker,g=f&&!f.enabled,h=f&&f.states[a],i=h&&h.enabled===!1,j=d.stateMarkerGraphic,k=d.chart,l=this.pointAttr,a=a||"";if(!(a===this.state||this.selected&&a!=="select"||e[a]&&e[a].enabled===!1||a&&(i||g&&!h.enabled))){if(this.graphic)e=f&&this.graphic.symbolName&&l[a].r,this.graphic.attr(A(l[a],e?
+{x:b-e,y:c-e,width:2*e,height:2*e}:{}));else{if(a&&h)e=h.radius,j?j.attr({x:b-e,y:c-e}):d.stateMarkerGraphic=j=k.renderer.symbol(d.symbol,b-e,c-e,2*e,2*e).attr(l[a]).add(d.markerGroup);if(j)j[a&&k.isInsidePlot(b,c)?"show":"hide"]()}this.state=a}}};var N=function(){};N.prototype={isCartesian:!0,type:"line",pointClass:Ta,sorted:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},init:function(a,b){var c,d;this.chart=a;this.options=b=this.setOptions(b);this.bindAxes();
+r(this,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(U)b.animation=!1;d=b.events;for(c in d)I(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(b.data,!1);if(this.isCartesian)a.hasCartesianSeries=!0;a.series.push(this);Fb(a.series,function(a,b){return(a.options.index||0)-(b.options.index||0)});n(a.series,function(a,b){a.index=b;a.name=a.name||"Series "+
+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;a.isCartesian&&n(["xAxis","yAxis"],function(e){n(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]===x&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0})})},autoIncrement:function(){var a=this.options,b=this.xIncrement,b=o(b,a.pointStart,0);this.pointInterval=o(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=
+e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else n(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart.options,c=b.plotOptions,d=c[this.type],e=a.data;a.data=null;c=A(d,c.series,a);c.data=a.data=e;this.tooltipOptions=A(b.tooltip,c.tooltip);d.marker===null&&delete c.marker;return c},getColor:function(){var a=this.options,b=this.chart.options.colors,c=this.chart.counters;this.color=a.color||
+!a.colorByPoint&&b[c.color++]||"gray";c.wrapColor(b.length)},getSymbol:function(){var a=this.options.marker,b=this.chart,c=b.options.symbols,b=b.counters;this.symbol=a.symbol||c[b.symbol++];if(/^url/.test(this.symbol))a.radius=0;b.wrapSymbol(c.length)},drawLegendSymbol:function(a){var b=this.options,c=b.marker,d=a.options.symbolWidth,e=this.chart.renderer,f=this.legendGroup,a=a.baseline,g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",
+0,a-4,"L",d,a-4]).attr(g).add(f)}if(c&&c.enabled)b=c.radius,this.legendSymbol=e.symbol(this.symbol,d/2-b,a-4-b,2*b,2*b).add(f)},addPoint:function(a,b,c,d){var e=this.data,f=this.graph,g=this.area,h=this.chart,i=this.xData,j=this.yData,k=f&&f.shift||0,l=this.options.data,m=this.pointClass.prototype;ua(d,h);if(f&&c)f.shift=k+1;if(g){if(c)g.shift=k+1;g.isArea=!0}b=o(b,!0);d={series:this};m.applyOptions.apply(d,[a]);i.push(d.x);j.push(m.toYData?m.toYData.call(d):d.y);l.push(a);c&&(e[0]&&e[0].remove?e[0].remove(!1):
+(e.shift(),i.shift(),j.shift(),l.shift()));this.getAttribs();this.isDirtyData=this.isDirty=!0;b&&h.redraw()},setData:function(a,b){var c=this.points,d=this.options,e=this.initialColor,f=this.chart,g=null,h=this.xAxis,i,j=this.pointClass.prototype;this.xIncrement=null;this.pointRange=h&&h.categories?1:d.pointRange;if(t(e))f.counters.color=e;var e=[],k=[],l=a?a.length:[],m=(i=this.pointArrayMap)&&i.length;if(l>(d.turboThreshold||1E3)){for(i=0;g===null&&i<l;)g=a[i],i++;if(Aa(g)){j=o(d.pointStart,0);
+d=o(d.pointInterval,1);for(i=0;i<l;i++)e[i]=j,k[i]=a[i],j+=d;this.xIncrement=j}else if(Ha(g))if(m)for(i=0;i<l;i++)d=a[i],e[i]=d[0],k[i]=d.slice(1,m+1);else for(i=0;i<l;i++)d=a[i],e[i]=d[0],k[i]=d[1]}else for(i=0;i<l;i++)d={series:this},j.applyOptions.apply(d,[a[i]]),e[i]=d.x,k[i]=j.toYData?j.toYData.call(d):d.y;la(k[0])&&$a(14,!0);this.data=[];this.options.data=a;this.xData=e;this.yData=k;for(i=c&&c.length||0;i--;)c[i]&&c[i].destroy&&c[i].destroy();if(h)h.minRange=h.userMinRange;this.isDirty=this.isDirtyData=
+f.isDirtyBox=!0;o(b,!0)&&f.redraw(!1)},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,E(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;a&&d.redraw(b)});c.isRemoving=!1},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e=0,f=d,g,h,i=this.xAxis,j=this.options,k=j.cropThreshold,l=this.isCartesian;if(l&&!this.isDirty&&!i.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(l&&this.sorted&&(!k||d>k||this.forceCrop))if(a=i.getExtremes(),
+i=a.min,k=a.max,b[d-1]<i||b[0]>k)b=[],c=[];else if(b[0]<i||b[d-1]>k){for(a=0;a<d;a++)if(b[a]>=i){e=y(0,a-1);break}for(;a<d;a++)if(b[a]>k){f=a+1;break}b=b.slice(e,f);c=c.slice(e,f);g=!0}for(a=b.length-1;a>0;a--)if(d=b[a]-b[a-1],d>0&&(h===x||d<h))h=d;this.cropped=g;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(j.pointRange===null)this.pointRange=h||1;this.closestPointRange=h},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,
+f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,j?l[m]=(new f).init(this,[d[m]].concat(na(e[m]))):(b[i]?k=b[i]:a[i]!==x&&(b[i]=k=(new f).init(this,a[i],d[m])),l[m]=k);if(b&&(g!==(c=b.length)||j))for(m=0;m<c;m++)if(m===h&&!j&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=x;this.data=b;this.points=l},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.chart,
+b=this.options,c=b.stacking,d=this.xAxis,e=d.categories,f=this.yAxis,g=this.points,h=g.length,i=!!this.modifyValue,j,k=f.series,l=k.length,m=b.pointPlacement==="between";l--;)if(k[l].visible){k[l]===this&&(j=!0);break}for(l=0;l<h;l++){var k=g[l],p=k.x,n=k.y,r=k.low,q=f.stacks[(n<b.threshold?"-":"")+this.stackKey];k.plotX=d.translate(p,0,0,0,1,m);if(c&&this.visible&&q&&q[p])r=q[p],p=r.total,r.cum=r=r.cum-n,n=r+n,j&&(r=o(b.threshold,f.min)),f.isLog&&r<=0&&(r=null),c==="percent"&&(r=p?r*100/p:0,n=p?
+n*100/p:0),k.percentage=p?k.y*100/p:0,k.total=k.stackTotal=p,k.stackY=n;k.yBottom=t(r)?f.translate(r,0,1,0,1):null;i&&(n=this.modifyValue(n,k));k.plotY=typeof n==="number"?s(f.translate(n,0,1,0,1)*10)/10:x;k.clientX=a.inverted?a.plotHeight-k.plotX:k.plotX;k.category=e&&e[k.x]!==x?e[k.x]:k.x}this.getSegments()},setTooltipPoints:function(a){var b=[],c,d,e=(c=this.xAxis)?c.tooltipLen||c.len:this.chart.plotSizeX,f=c&&c.tooltipPosName||"plotX",g,h,i=[];if(this.options.enableMouseTracking!==!1){if(a)this.tooltipPoints=
+null;n(this.segments||this.points,function(a){b=b.concat(a)});c&&c.reversed&&(b=b.reverse());a=b.length;for(h=0;h<a;h++){g=b[h];c=b[h-1]?d+1:0;for(d=b[h+1]?y(0,T((g[f]+(b[h+1]?b[h+1][f]:e))/2)):e;c>=0&&c<=d;)i[c++]=g}this.tooltipPoints=i}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.xDateFormat,d=this.xAxis,e=d&&d.options.type==="datetime",f;if(e&&!c)for(f in B)if(B[f]>=d.closestPointRange){c=b.dateTimeLabelFormats[f];break}return b.headerFormat.replace("{point.key}",e&&Aa(a)?
+cb(c,a):a).replace("{series.name}",this.name).replace("{series.color}",this.color)},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&E(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&E(this,"mouseOut");c&&!a.stickyTracking&&!c.shared&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=
+this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!X(e))e=W[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},
+e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,p=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=g.plotX,e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===
+x||i.enabled,m=c.isInsidePlot(d,e,c.inverted),a&&e!==x&&!isNaN(e))if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?Z?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(p)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};
+for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=W[a.type].marker?a.options.marker:a.options,c=b.states,d=c.hover,e,f=a.color,g={stroke:f,fill:f},h=a.points||[],i=[],j,k=a.pointAttrToOptions,l;a.options.marker?(d.radius=d.radius||b.radius+2,d.lineWidth=d.lineWidth||b.lineWidth+1):d.color=d.color||qa(d.color||f).brighten(d.brightness).get();i[""]=a.convertAttribs(b,g);n(["hover","select"],function(b){i[b]=a.convertAttribs(c[b],i[""])});a.pointAttr=i;for(f=
+h.length;f--;){g=h[f];if((b=g.options&&g.options.marker||g.options)&&b.enabled===!1)b.radius=0;e=a.options.colorByPoint;if(g.options)for(l in k)t(b[k[l]])&&(e=!0);if(e){b=b||{};j=[];c=b.states||{};e=c.hover=c.hover||{};if(!a.options.marker)e.color=qa(e.color||g.color).brighten(e.brightness||d.brightness).get();j[""]=a.convertAttribs(r({color:g.color},b),i[""]);j.hover=a.convertAttribs(c.hover,i.hover,j[""]);j.select=a.convertAttribs(c.select,i.select,j[""])}else j=i;g.pointAttr=j}},destroy:function(){var a=
+this,b=a.chart,c=/AppleWebKit\/533/.test(Fa),d,e,f=a.data||[],g,h,i;E(a,"destroy");S(a);n(["xAxis","yAxis"],function(b){if(i=a[b])Ba(i.series,a),i.isDirty=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,trackerGroup".split(","),function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;Ba(b.series,
+a);for(h in a)delete a[h]},drawDataLabels:function(){var a=this,b=a.options.dataLabels,c=a.points,d,e,f,g;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),g=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",6),e=b,n(c,function(c){var i,j=c.dataLabel,k,l=!0;d=c.options&&c.options.dataLabels;i=e.enabled||d&&d.enabled;if(j&&!i)c.dataLabel=j.destroy();else if(i){i=b.rotation;b=A(e,d);f=b.formatter.call(c.getLabelConfig(),b);b.style.color=o(b.color,b.style.color,
+a.color,"black");if(j)j.attr({text:f}),l=!1;else if(t(f)){j={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:i,padding:b.padding,zIndex:1};for(k in j)j[k]===x&&delete j[k];j=c.dataLabel=a.chart.renderer[i?"text":"label"](f,0,-999,null,null,null,b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)}j&&a.alignDataLabel(c,j,b,null,l)}})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),a=o(a.plotY,-999),i=b.getBBox(),
+d=r({x:g?f.plotWidth-a:h,y:s(g?f.plotHeight-h:a),width:0,height:0},d);r(c,{width:i.width,height:i.height});c.rotation?(d={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](d)):(b.align(c,null,d),d=b.alignAttr);b.attr({visibility:c.crop===!1||f.isInsidePlot(d.x,d.y)||f.isInsidePlot(h,a,g)?Z?"inherit":"visible":"hidden"})},getSegmentPath:function(a){var b=this,c=[];n(a,function(d,e){b.getPointSpline?c.push.apply(c,b.getPointSpline(a,d,e)):(c.push(e?"L":"M"),e&&b.options.step&&
+c.push(d.plotX,a[e-1].plotY),c.push(d.plotX,d.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this.options,b=this.graph,c=this.group,d=a.lineColor||this.color,e=a.lineWidth,f=a.dashStyle,g=this.getGraphPath();if(b)eb(b),b.animate({d:g});else if(e){b={stroke:d,"stroke-width":e,zIndex:1};if(f)b.dashstyle=f;this.graph=this.chart.renderer.path(g).attr(b).add(c).shadow(a.shadow)}},
+invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","trackerGroup","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;I(c,"resize",a);I(b,"destroy",function(){S(c,"resize",a)});a();b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=this.chart,h=this.xAxis,i=this.yAxis;f||(this[a]=f=g.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f.translate(h?h.left:g.plotLeft,i?i.top:g.plotTop);return f},render:function(){var a=
+this.chart,b,c=this.options,d=c.animation&&!!this.animate,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group","series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=a.inverted;this.drawGraph&&this.drawGraph();this.drawPoints();this.drawDataLabels();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&
+(b.clip(a.clipRect),this.trackerGroup&&this.trackerGroup.clip(a.clipRect));d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:this.xAxis.left,translateY:this.yAxis.top}));this.translate();this.setTooltipPoints(!0);this.render();b&&E(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,
+d=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,d[a]&&d[a].enabled===!1||(a&&(b=d[a].lineWidth||b+1),c&&!c.dashstyle&&c.attr({"stroke-width":b},a?0:500))},setVisible:function(a,b){var c=this.chart,d=this.legendItem,e=this.group,f=this.tracker,g=this.dataLabelsGroup,h=this.markerGroup,i,j=this.points,k=c.options.chart.ignoreHiddenSeries;i=this.visible;i=(this.visible=a=a===x?!i:a)?"show":"hide";if(e)e[i]();if(h)h[i]();if(f)f[i]();else if(j)for(e=j.length;e--;)if(f=j[e],f.tracker)f.tracker[i]();
+if(g)g[i]();d&&c.legend.colorizeItem(this,a);this.isDirty=!0;this.options.stacking&&n(c.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});if(k)c.isDirtyBox=!0;b!==!1&&c.redraw();E(this,i)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===x?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;E(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),
+e=d.length,f=a.chart,g=f.renderer,h=f.options.tooltip.snap,i=a.tracker,j=b.cursor,j=j&&{cursor:j},k=a.singlePoints,l=this.isCartesian&&this.plotGroup("trackerGroup",null,"visible",b.zIndex||1,f.trackerGroup),m;if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-h,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+h,d[m-1]);for(m=0;m<k.length;m++)e=k[m],d.push("M",e.plotX-h,e.plotY,"L",e.plotX+h,e.plotY);i?i.attr({d:d}):a.tracker=g.path(d).attr({isTracker:!0,"stroke-linejoin":"bevel",
+visibility:a.visible?"visible":"hidden",stroke:wb,fill:c?wb:R,"stroke-width":b.lineWidth+(c?0:2*h)}).on(fa?"touchstart":"mouseover",function(){if(f.hoverSeries!==a)a.onMouseOver()}).on("mouseout",function(){if(!b.stickyTracking)a.onMouseOut()}).css(j).add(l)}};G=ca(N);$.line=G;W.area=A(ga,{threshold:0});G=ca(N,{type:"area",getSegmentPath:function(a){var b=N.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;b.length===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=
+a.length-1;d>=0;d--)d<a.length-1&&e.step&&c.push(a[d+1].plotX,a[d].yBottom),c.push(a[d].plotX,a[d].yBottom);else this.closeSegment(c,a);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b){var c=this.yAxis.getThreshold(this.options.threshold);a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];N.prototype.drawGraph.apply(this);var a=this.areaPath,b=this.options,c=this.area;c?c.animate({d:a}):this.area=this.chart.renderer.path(a).attr({fill:o(b.fillColor,
+qa(this.color).setOpacity(b.fillOpacity||0.75).get()),zIndex:0}).add(this.group)},drawLegendSymbol:function(a,b){b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,a.options.symbolWidth,12,2).attr({zIndex:3}).add(b.legendGroup)}});$.area=G;W.spline=A(ga);ha=ca(N,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,l;h=(1.5*d+f.plotX)/2.5;i=(1.5*e+a)/2.5;j=(1.5*d+j)/2.5;k=(1.5*e+g)/2.5;l=(k-i)*(j-d)/(j-h)+e-
+k;i+=l;k+=l;i>a&&i>e?(i=y(a,e),k=2*e-i):i<a&&i<e&&(i=O(a,e),k=2*e-i);k>g&&k>e?(k=y(g,e),i=2*e-k):k<g&&k<e&&(k=O(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});$.spline=ha;W.areaspline=A(W.area);var za=G.prototype,ha=ca(ha,{type:"areaspline",closedStacks:!0,getSegmentPath:za.getSegmentPath,closeSegment:za.closeSegment,drawGraph:za.drawGraph});$.areaspline=ha;W.column=A(ga,{borderColor:"#FFFFFF",
+borderWidth:1,borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},threshold:0});ha=ca(N,{type:"column",tooltipOutsidePlot:!0,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",r:"borderRadius"},init:function(){N.prototype.init.apply(this,arguments);var a=this,b=
+a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},translate:function(){var a=this,b=a.chart,c=a.options,d=c.stacking,e=c.borderWidth,f=0,g=a.xAxis,h=g.reversed,i={},j,k;N.prototype.translate.apply(a);c.grouping===!1?f=1:n(b.series,function(b){var c=b.options;if(b.type===a.type&&b.visible&&a.options.group===c.group)c.stacking?(j=b.stackKey,i[j]===x&&(i[j]=f++),k=i[j]):c.grouping!==!1&&(k=f++),b.columnIndex=k});var l=a.points,g=L(g.transA)*(g.ordinalSlope||c.pointRange||
+g.closestPointRange||1),m=g*c.groupPadding,p=(g-2*m)/f,u=c.pointWidth,r=t(u)?(p-u)/2:p*c.pointPadding,q=o(u,p-2*r),s=wa(y(q,1+2*e)),w=r+(m+((h?f-a.columnIndex:a.columnIndex)||0)*p-g/2)*(h?-1:1),z=a.translatedThreshold=a.yAxis.getThreshold(c.threshold),v=o(c.minPointLength,5);n(l,function(c){var f=c.plotY,g=o(c.yBottom,z),h=c.plotX+w,i=wa(O(f,g)),j=wa(y(f,g)-i),k=a.yAxis.stacks[(c.y<0?"-":"")+a.stackKey];d&&a.visible&&k&&k[c.x]&&k[c.x].setOffset(w,s);L(j)<v&&v&&(j=v,i=L(i-z)>v?g-v:z-(f<=z?v:0));c.barX=
+h;c.pointWidth=q;c.shapeType="rect";c.shapeArgs=f=b.renderer.Element.prototype.crisp.call(0,e,h,i,s,j);e%2&&(f.y-=1,f.height+=1);c.trackerArgs=L(j)<3&&A(c.shapeArgs,{height:6,y:i-3})})},getSymbol:ya,drawLegendSymbol:G.prototype.drawLegendSymbol,drawGraph:ya,drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d;n(a.points,function(e){var f=e.plotY,g=e.graphic;if(f!==x&&!isNaN(f)&&e.y!==null)d=e.shapeArgs,g?(eb(g),g.animate(A(d))):e.graphic=c[e.shapeType](d).attr(e.pointAttr[e.selected?
+"select":""]).add(a.group).shadow(b.shadow,null,b.stacking&&!b.borderRadius);else if(g)e.graphic=g.destroy()})},drawTracker:function(){var a=this,b=a.chart,c=b.renderer,d,e,f=+new Date,g=a.options,h=g.cursor,i=h&&{cursor:h},j=a.isCartesian&&a.plotGroup("trackerGroup",null,"visible",g.zIndex||1,b.trackerGroup),k,l,m;n(a.points,function(h){e=h.tracker;d=h.trackerArgs||h.shapeArgs;l=h.plotY;m=!a.isCartesian||l!==x&&!isNaN(l);delete d.strokeWidth;if(h.y!==null&&m)e?e.attr(d):h.tracker=c[h.shapeType](d).attr({isTracker:f,
+fill:wb,visibility:a.visible?"visible":"hidden"}).on(fa?"touchstart":"mouseover",function(c){k=c.relatedTarget||c.fromElement;if(b.hoverSeries!==a&&z(k,"isTracker")!==f)a.onMouseOver();h.onMouseOver()}).on("mouseout",function(b){if(!g.stickyTracking&&(k=b.relatedTarget||b.toElement,z(k,"isTracker")!==f))a.onMouseOut()}).css(i).add(h.group||j)})},alignDataLabel:function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=a.below||a.plotY>(this.translatedThreshold||f.plotSizeY),i=this.options.stacking||c.inside;
+if(a.shapeArgs&&(d=A(a.shapeArgs),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!i))g?(d.x+=h?0:d.width,d.width=0):(d.y+=h?d.height:0,d.height=0);c.align=o(c.align,!g||i?"center":h?"right":"left");c.verticalAlign=o(c.verticalAlign,g||i?"middle":h?"top":"bottom");N.prototype.alignDataLabel.call(this,a,b,c,d,e)},animate:function(a){var b=this,c=b.points,d=b.options;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs,g=b.yAxis,h=d.threshold;c&&(c.attr({height:0,
+y:t(h)?g.getThreshold(h):g.translate(g.getExtremes().min,0,1,0,1)}),c.animate({height:a.height,y:a.y},d.animation))}),b.animate=null},remove:function(){var a=this,b=a.chart;b.hasRendered&&n(b.series,function(b){if(b.type===a.type)b.isDirty=!0});N.prototype.remove.apply(a,arguments)}});$.column=ha;W.bar=A(W.column);za=ca(ha,{type:"bar",inverted:!0});$.bar=za;W.scatter=A(ga,{lineWidth:0,states:{hover:{lineWidth:0}},tooltip:{headerFormat:'<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',
+pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});za=ca(N,{type:"scatter",sorted:!1,translate:function(){var a=this;N.prototype.translate.apply(a);n(a.points,function(b){b.shapeType="circle";b.shapeArgs={x:b.plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},drawTracker:function(){for(var a=this,b=a.options.cursor,b=b&&{cursor:b},c=a.points,d=c.length,e;d--;)if(e=c[d].graphic)e.element._i=d;a._hasTracking?a._hasTracking=!0:a.markerGroup.attr({isTracker:!0}).on(fa?"touchstart":"mouseover",
+function(b){a.onMouseOver();if(b.target._i!==x)c[b.target._i].onMouseOver()}).on("mouseout",function(){if(!a.options.stickyTracking)a.onMouseOut()}).css(b)}});$.scatter=za;W.pie=A(ga,{borderColor:"#FFFFFF",borderWidth:1,center:["50%","50%"],colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},legendType:"point",marker:null,size:"75%",showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}}});ya={type:"pie",isCartesian:!1,pointClass:ca(Ta,
+{init:function(){Ta.prototype.init.apply(this,arguments);var a=this,b;r(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(){a.slice()};I(a,"select",b);I(a,"unselect",b);return a},setVisible:function(a){var b=this.series,c=b.chart,d=this.tracker,e=this.dataLabel,f=this.connector,g=this.shadowGroup,h;h=(this.visible=a=a===x?!this.visible:a)?"show":"hide";this.group[h]();if(d)d[h]();if(e)e[h]();if(f)f[h]();if(g)g[h]();this.legendItem&&c.legend.colorizeItem(this,a);if(!b.isDirty&&b.options.ignoreHiddenPoint)b.isDirty=
+!0,c.redraw()},slice:function(a,b,c){var d=this.series.chart,e=this.slicedTranslation;ua(c,d);o(b,!0);a=this.sliced=t(a)?a:!this.sliced;a={translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop};this.group.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:function(){this.initialColor=this.chart.counters.color},animate:function(){var a=this;n(a.points,function(b){var c=b.graphic,b=b.shapeArgs,d=
+-xa/2;c&&(c.attr({r:0,start:d,end:d}),c.animate({r:b.r,start:b.start,end:b.end},a.options.animation))});a.animate=null},setData:function(a,b){N.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},getCenter:function(){var a=this.options,b=this.chart,c=b.plotWidth,d=b.plotHeight,a=a.center.concat([a.size,a.innerSize||0]),e=O(c,d),f;return Sa(a,function(a,b){return(f=/%$/.test(a))?[c,d,e,e][b]*w(a)/100:a})},translate:function(){this.generatePoints();
+var a=0,b=-0.25,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g=this.chart,h,i,j,k=this.points,l=2*xa,m=c.dataLabels.distance,o=c.ignoreHiddenPoint,n,r=k.length,q;this.center=f=this.getCenter();this.getX=function(a,b){j=J.asin((a-f[1])/(f[2]/2+m));return f[0]+(b?-1:1)*V(j)*(f[2]/2+m)};for(n=0;n<r;n++)q=k[n],a+=o&&!q.visible?0:q.y;for(n=0;n<r;n++){q=k[n];c=a?q.y/a:0;h=s(b*l*1E3)/1E3;if(!o||q.visible)b+=c;i=s(b*l*1E3)/1E3;q.shapeType="arc";q.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:h,
+end:i};j=(i+h)/2;q.slicedTranslation=Sa([V(j)*d+g.plotLeft,Y(j)*d+g.plotTop],s);h=V(j)*f[2]/2;i=Y(j)*f[2]/2;q.tooltipPos=[f[0]+h*0.7,f[1]+i*0.7];q.labelPos=[f[0]+h+V(j)*m,f[1]+i+Y(j)*m,f[0]+h+V(j)*e,f[1]+i+Y(j)*e,f[0]+h,f[1]+i,m<0?"center":j<l/4?"left":"right",j];q.percentage=c*100;q.total=a}this.setTooltipPoints()},render:function(){this.getAttribs();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();this.drawDataLabels();this.options.animation&&this.animate&&this.animate();
+this.isDirty=!1},drawPoints:function(){var a=this,b=a.chart,c=b.renderer,d,e,f,g=a.options.shadow,h,i;n(a.points,function(j){e=j.graphic;i=j.shapeArgs;f=j.group;h=j.shadowGroup;if(g&&!h)h=j.shadowGroup=c.g("shadow").attr({zIndex:4}).add();if(!f)f=j.group=c.g("point").attr({zIndex:5}).add();d=j.sliced?j.slicedTranslation:[b.plotLeft,b.plotTop];f.translate(d[0],d[1]);h&&h.translate(d[0],d[1]);e?e.animate(i):j.graphic=e=c.arc(i).setRadialReference(a.center).attr(r(j.pointAttr[""],{"stroke-linejoin":"round"})).add(j.group).shadow(g,
+h);j.visible===!1&&j.setVisible(!1)})},drawDataLabels:function(){var a=this.data,b,c=this.chart,d=this.options.dataLabels,e=o(d.connectorPadding,10),f=o(d.connectorWidth,1),g,h,i=o(d.softConnector,!0),j=d.distance,k=this.center,l=k[2]/2,m=k[1],p=j>0,r=[[],[]],s,q,t,w,y=2,v;if(d.enabled||this._hasPointLabels){N.prototype.drawDataLabels.apply(this);n(a,function(a){a.dataLabel&&r[a.labelPos[7]<xa/2?0:1].push(a)});r[1].reverse();w=function(a,b){return b.y-a.y};for(a=r[0][0]&&r[0][0].dataLabel&&(r[0][0].dataLabel.getBBox().height||
+21);y--;){var x=[],A=[],z=r[y],C=z.length,B;if(j>0){for(v=m-l-j;v<=m+l+j;v+=a)x.push(v);t=x.length;if(C>t){h=[].concat(z);h.sort(w);for(v=C;v--;)h[v].rank=v;for(v=C;v--;)z[v].rank>=t&&z.splice(v,1);C=z.length}for(v=0;v<C;v++){b=z[v];h=b.labelPos;b=9999;for(q=0;q<t;q++)g=L(x[q]-h[1]),g<b&&(b=g,B=q);if(B<v&&x[v]!==null)B=v;else for(t<C-v+B&&x[v]!==null&&(B=t-C+v);x[B]===null;)B++;A.push({i:B,y:x[B]});x[B]=null}A.sort(w)}for(v=0;v<C;v++){b=z[v];h=b.labelPos;g=b.dataLabel;t=b.visible===!1?"hidden":"visible";
+s=h[1];if(j>0){if(q=A.pop(),B=q.i,q=q.y,s>q&&x[B+1]!==null||s<q&&x[B-1]!==null)q=s}else q=s;s=d.justify?k[0]+(y?-1:1)*(l+j):this.getX(B===0||B===x.length-1?s:q,y);g.attr({visibility:t,align:h[6]})[g.moved?"animate":"attr"]({x:s+d.x+({left:e,right:-e}[h[6]]||0),y:q+d.y-10});g.moved=!0;if(p&&f)g=b.connector,h=i?["M",s+(h[6]==="left"?5:-5),q,"C",s,q,2*h[2]-h[4],2*h[3]-h[5],h[2],h[3],"L",h[4],h[5]]:["M",s+(h[6]==="left"?5:-5),q,"L",h[2],h[3],"L",h[4],h[5]],g?(g.animate({d:h}),g.attr("visibility",t)):
+b.connector=g=this.chart.renderer.path(h).attr({"stroke-width":f,stroke:d.connectorColor||b.color||"#606060",visibility:t,zIndex:3}).translate(c.plotLeft,c.plotTop).add()}}}},alignDataLabel:ya,drawTracker:ha.prototype.drawTracker,drawLegendSymbol:G.prototype.drawLegendSymbol,getSymbol:function(){}};ya=ca(N,ya);$.pie=ya;r(Highcharts,{Axis:ob,CanVGRenderer:gb,Chart:sb,Color:qa,Legend:rb,MouseTracker:qb,Point:Ta,Tick:Pa,Tooltip:pb,Renderer:Ra,Series:N,SVGRenderer:ra,VMLRenderer:ja,dateFormat:cb,pathAnim:vb,
+getOptions:function(){return M},hasBidiBug:Pb,numberFormat:Ia,seriesTypes:$,setOptions:function(a){M=A(M,a);Gb();return M},addEvent:I,removeEvent:S,createElement:Q,discardElement:Na,css:H,each:n,extend:r,map:Sa,merge:A,pick:o,splat:na,extendClass:ca,pInt:w,wrap:function(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}},svg:Z,canvas:U,vml:!Z&&!U,product:"Highcharts",version:"2.3.3"})})();
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.js b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.js
new file mode 100644
index 0000000..784f221
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/html5shiv.js
@@ -0,0 +1,8 @@
+/*
+ HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
+a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}</style>";
+c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
+"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
+for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js
new file mode 100644
index 0000000..3883779
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/js/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v1.8.3 jquery.com | jquery.org/license */
+(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u<a;u++)r=o[u],s=/^\+/.test(r),s&&(r=r.substr(1)||"*"),i=e[r]=e[r]||[],i[s?"unshift":"push"](n)}}function kn(e,n,r,i,s,o){s=s||n.dataTypes[0],o=o||{},o[s]=!0;var u,a=e[s],f=0,l=a?a.length:0,c=e===Sn;for(;f<l&&(c||!u);f++)u=a[f](n,r,i),typeof u=="string"&&(!c||o[u]?u=t:(n.dataTypes.unshift(u),u=kn(e,n,r,i,u,o)));return(c||!u)&&!o["*"]&&(u=kn(e,n,r,i,"*",o)),u}function Ln(e,n){var r,i,s=v.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((s[r]?e:i||(i={}))[r]=n[r]);i&&v.extend(!0,e,i)}function An(e,n,r){var i,s,o,u,a=e.contents,f=e.dataTypes,l=e.responseFields;for(s in l)s in r&&(n[l[s]]=r[s]);while(f[0]==="*")f.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("content-type"));if(i)for(s in a)if(a[s]&&a[s].test(i)){f.unshift(s);break}if(f[0]in r)o=f[0];else{for(s in r){if(!f[0]||e.converters[s+" "+f[0]]){o=s;break}u||(u=s)}o=o||u}if(o)return o!==f[0]&&f.unshift(o),r[o]}function On(e,t){var n,r,i,s,o=e.dataTypes.slice(),u=o[0],a={},f=0;e.dataFilter&&(t=e.dataFilter(t,e.dataType));if(o[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=o[++f];)if(i!=="*"){if(u!=="*"&&u!==i){n=a[u+" "+i]||a["* "+i];if(!n)for(r in a){s=r.split(" ");if(s[1]===i){n=a[u+" "+s[0]]||a["* "+s[0]];if(n){n===!0?n=a[r]:a[r]!==!0&&(i=s[0],o.splice(f--,0,i));break}}}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(l){return{state:"parsererror",error:n?l:"No conversion from "+u+" to "+i}}}u=i}return{state:"success",data:t}}function Fn(){try{return new e.XMLHttpRequest}catch(t){}}function In(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function $n(){return setTimeout(function(){qn=t},0),qn=v.now()}function Jn(e,t){v.each(t,function(t,n){var r=(Vn[t]||[]).concat(Vn["*"]),i=0,s=r.length;for(;i<s;i++)if(r[i].call(e,t,n))return})}function Kn(e,t,n){var r,i=0,s=0,o=Xn.length,u=v.Deferred().always(function(){delete a.elem}),a=function(){var t=qn||$n(),n=Math.max(0,f.startTime+f.duration-t),r=n/f.duration||0,i=1-r,s=0,o=f.tweens.length;for(;s<o;s++)f.tweens[s].run(i);return u.notifyWith(e,[f,i,n]),i<1&&o?n:(u.resolveWith(e,[f]),!1)},f=u.promise({elem:e,props:v.extend({},t),opts:v.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:qn||$n(),duration:n.duration,tweens:[],createTween:function(t,n,r){var i=v.Tween(e,f.opts,t,n,f.opts.specialEasing[t]||f.opts.easing);return f.tweens.push(i),i},stop:function(t){var n=0,r=t?f.tweens.length:0;for(;n<r;n++)f.tweens[n].run(1);return t?u.resolveWith(e,[f,t]):u.rejectWith(e,[f,t]),this}}),l=f.props;Qn(l,f.opts.specialEasing);for(;i<o;i++){r=Xn[i].call(f,e,l,f.opts);if(r)return r}return Jn(f,l),v.isFunction(f.opts.start)&&f.opts.start.call(e,f),v.fx.timer(v.extend(a,{anim:f,queue:f.opts.queue,elem:e})),f.progress(f.opts.progress).done(f.opts.done,f.opts.complete).fail(f.opts.fail).always(f.opts.always)}function Qn(e,t){var n,r,i,s,o;for(n in e){r=v.camelCase(n),i=t[r],s=e[n],v.isArray(s)&&(i=s[1],s=e[n]=s[0]),n!==r&&(e[r]=s,delete e[n]),o=v.cssHooks[r];if(o&&"expand"in o){s=o.expand(s),delete e[r];for(n in s)n in e||(e[n]=s[n],t[n]=i)}else t[r]=i}}function Gn(e,t,n){var r,i,s,o,u,a,f,l,c,h=this,p=e.style,d={},m=[],g=e.nodeType&&Gt(e);n.queue||(l=v._queueHooks(e,"fx"),l.unqueued==null&&(l.unqueued=0,c=l.empty.fire,l.empty.fire=function(){l.unqueued||c()}),l.unqueued++,h.always(function(){h.always(function(){l.unqueued--,v.queue(e,"fx").length||l.empty.fire()})})),e.nodeType===1&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],v.css(e,"display")==="inline"&&v.css(e,"float")==="none"&&(!v.support.inlineBlockNeedsLayout||nn(e.nodeName)==="inline"?p.display="inline-block":p.zoom=1)),n.overflow&&(p.overflow="hidden",v.support.shrinkWrapBlocks||h.done(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t){s=t[r];if(Un.exec(s)){delete t[r],a=a||s==="toggle";if(s===(g?"hide":"show"))continue;m.push(r)}}o=m.length;if(o){u=v._data(e,"fxshow")||v._data(e,"fxshow",{}),"hidden"in u&&(g=u.hidden),a&&(u.hidden=!g),g?v(e).show():h.done(function(){v(e).hide()}),h.done(function(){var t;v.removeData(e,"fxshow",!0);for(t in d)v.style(e,t,d[t])});for(r=0;r<o;r++)i=m[r],f=h.createTween(i,g?u[i]:0),d[i]=u[i]||v.style(e,i),i in u||(u[i]=f.start,g&&(f.end=f.start,f.start=i==="width"||i==="height"?1:0))}}function Yn(e,t,n,r,i){return new Yn.prototype.init(e,t,n,r,i)}function Zn(e,t){var n,r={height:e},i=0;t=t?1:0;for(;i<4;i+=2-t)n=$t[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function tr(e){return v.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:!1}var n,r,i=e.document,s=e.location,o=e.navigator,u=e.jQuery,a=e.$,f=Array.prototype.push,l=Array.prototype.slice,c=Array.prototype.indexOf,h=Object.prototype.toString,p=Object.prototype.hasOwnProperty,d=String.prototype.trim,v=function(e,t){return new v.fn.init(e,t,n)},m=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,g=/\S/,y=/\s+/,b=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,w=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a<f;a++)if((e=arguments[a])!=null)for(n in e){r=u[n],i=e[n];if(u===i)continue;l&&i&&(v.isPlainObject(i)||(s=v.isArray(i)))?(s?(s=!1,o=r&&v.isArray(r)?r:[]):o=r&&v.isPlainObject(r)?r:{},u[n]=v.extend(l,o,i)):i!==t&&(u[n]=i)}return u},v.extend({noConflict:function(t){return e.$===v&&(e.$=a),t&&e.jQuery===v&&(e.jQuery=u),v},isReady:!1,readyWait:1,holdReady:function(e){e?v.readyWait++:v.ready(!0)},ready:function(e){if(e===!0?--v.readyWait:v.isReady)return;if(!i.body)return setTimeout(v.ready,1);v.isReady=!0;if(e!==!0&&--v.readyWait>0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s<o;)if(n.apply(e[s++],r)===!1)break}else if(u){for(i in e)if(n.call(e[i],i,e[i])===!1)break}else for(;s<o;)if(n.call(e[s],s,e[s++])===!1)break;return e},trim:d&&!d.call("\ufeff\u00a0")?function(e){return e==null?"":d.call(e)}:function(e){return e==null?"":(e+"").replace(b,"")},makeArray:function(e,t){var n,r=t||[];return e!=null&&(n=v.type(e),e.length==null||n==="string"||n==="function"||n==="regexp"||v.isWindow(e)?f.call(r,e):v.merge(r,e)),r},inArray:function(e,t,n){var r;if(t){if(c)return c.call(t,e,n);r=t.length,n=n?n<0?Math.max(0,r+n):n:0;for(;n<r;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,s=0;if(typeof r=="number")for(;s<r;s++)e[i++]=n[s];else while(n[s]!==t)e[i++]=n[s++];return e.length=i,e},grep:function(e,t,n){var r,i=[],s=0,o=e.length;n=!!n;for(;s<o;s++)r=!!t(e[s],s),n!==r&&i.push(e[s]);return i},map:function(e,n,r){var i,s,o=[],u=0,a=e.length,f=e instanceof v||a!==t&&typeof a=="number"&&(a>0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u<a;u++)i=n(e[u],u,r),i!=null&&(o[o.length]=i);else for(s in e)i=n(e[s],s,r),i!=null&&(o[o.length]=i);return o.concat.apply([],o)},guid:1,proxy:function(e,n){var r,i,s;return typeof n=="string"&&(r=e[n],n=e,e=r),v.isFunction(e)?(i=l.call(arguments,2),s=function(){return e.apply(n,i.concat(l.call(arguments)))},s.guid=e.guid=e.guid||v.guid++,s):t},access:function(e,n,r,i,s,o,u){var a,f=r==null,l=0,c=e.length;if(r&&typeof r=="object"){for(l in r)v.access(e,n,l,r[l],1,o,i);s=1}else if(i!==t){a=u===t&&v.isFunction(i),f&&(a?(a=n,n=function(e,t,n){return a.call(v(e),n)}):(n.call(e,i),n=null));if(n)for(;l<c;l++)n(e[l],r,a?i.call(e[l],l,n(e[l],r)):i,u);s=1}return s?e:f?n.call(e):c?n(e[0],r):o},now:function(){return(new Date).getTime()}}),v.ready.promise=function(t){if(!r){r=v.Deferred();if(i.readyState==="complete")setTimeout(v.ready,1);else if(i.addEventListener)i.addEventListener("DOMContentLoaded",A,!1),e.addEventListener("load",v.ready,!1);else{i.attachEvent("onreadystatechange",A),e.attachEvent("onload",v.ready);var n=!1;try{n=e.frameElement==null&&i.documentElement}catch(s){}n&&n.doScroll&&function o(){if(!v.isReady){try{n.doScroll("left")}catch(e){return setTimeout(o,50)}v.ready()}}()}}return r.promise(t)},v.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(e,t){O["[object "+t+"]"]=t.toLowerCase()}),n=v(i);var M={};v.Callbacks=function(e){e=typeof e=="string"?M[e]||_(e):v.extend({},e);var n,r,i,s,o,u,a=[],f=!e.once&&[],l=function(t){n=e.memory&&t,r=!0,u=s||0,s=0,o=a.length,i=!0;for(;a&&u<o;u++)if(a[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}i=!1,a&&(f?f.length&&l(f.shift()):n?a=[]:c.disable())},c={add:function(){if(a){var t=a.length;(function r(t){v.each(t,function(t,n){var i=v.type(n);i==="function"?(!e.unique||!c.has(n))&&a.push(n):n&&n.length&&i!=="string"&&r(n)})})(arguments),i?o=a.length:n&&(s=t,l(n))}return this},remove:function(){return a&&v.each(arguments,function(e,t){var n;while((n=v.inArray(t,a,n))>-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t<r;t++)n[t]&&v.isFunction(n[t].promise)?n[t].promise().done(o(t,f,n)).fail(s.reject).progress(o(t,a,u)):--i}return i||s.resolveWith(f,n),s.promise()}}),v.support=function(){var t,n,r,s,o,u,a,f,l,c,h,p=i.createElement("div");p.setAttribute("className","t"),p.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="<table><tr><td></td><td>t</td></tr></table>",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="<div></div>",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i<s;i++)delete r[t[i]];if(!(n?B:v.isEmptyObject)(r))return}}if(!n){delete u[a].data;if(!B(u[a]))return}o?v.cleanData([e],!0):v.support.deleteExpando||u!=u.window?delete u[a]:u[a]=null},_data:function(e,t,n){return v.data(e,t,n,!0)},acceptData:function(e){var t=e.nodeName&&v.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),v.fn.extend({data:function(e,n){var r,i,s,o,u,a=this[0],f=0,l=null;if(e===t){if(this.length){l=v.data(a);if(a.nodeType===1&&!v._data(a,"parsedAttrs")){s=a.attributes;for(u=s.length;f<u;f++)o=s[f].name,o.indexOf("data-")||(o=v.camelCase(o.substring(5)),H(a,o,l[o]));v._data(a,"parsedAttrs",!0)}}return l}return typeof e=="object"?this.each(function(){v.data(this,e)}):(r=e.split(".",2),r[1]=r[1]?"."+r[1]:"",i=r[1]+"!",v.access(this,function(n){if(n===t)return l=this.triggerHandler("getData"+i,[r[0]]),l===t&&a&&(l=v.data(a,e),l=H(a,e,l)),l===t&&r[1]?this.data(r[0]):l;r[1]=n,this.each(function(){var t=v(this);t.triggerHandler("setData"+i,r),v.data(this,e,n),t.triggerHandler("changeData"+i,r)})},null,n,arguments.length>1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length<r?v.queue(this[0],e):n===t?this:this.each(function(){var t=v.queue(this,e,n);v._queueHooks(this,e),e==="fx"&&t[0]!=="inprogress"&&v.dequeue(this,e)})},dequeue:function(e){return this.each(function(){v.dequeue(this,e)})},delay:function(e,t){return e=v.fx?v.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,s=v.Deferred(),o=this,u=this.length,a=function(){--i||s.resolveWith(o,[o])};typeof e!="string"&&(n=e,e=t),e=e||"fx";while(u--)r=v._data(o[u],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(a));return a(),s.promise(n)}});var j,F,I,q=/[\t\r\n]/g,R=/\r/g,U=/^(?:button|input)$/i,z=/^(?:button|input|object|select|textarea)$/i,W=/^a(?:rea|)$/i,X=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,V=v.support.getSetAttribute;v.fn.extend({attr:function(e,t){return v.access(this,v.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n<r;n++){i=this[n];if(i.nodeType===1)if(!i.className&&t.length===1)i.className=e;else{s=" "+i.className+" ";for(o=0,u=t.length;o<u;o++)s.indexOf(" "+t[o]+" ")<0&&(s+=t[o]+" ");i.className=v.trim(s)}}}return this},removeClass:function(e){var n,r,i,s,o,u,a;if(v.isFunction(e))return this.each(function(t){v(this).removeClass(e.call(this,t,this.className))});if(e&&typeof e=="string"||e===t){n=(e||"").split(y);for(u=0,a=this.length;u<a;u++){i=this[u];if(i.nodeType===1&&i.className){r=(" "+i.className+" ").replace(q," ");for(s=0,o=n.length;s<o;s++)while(r.indexOf(" "+n[s]+" ")>=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n<r;n++)if(this[n].nodeType===1&&(" "+this[n].className+" ").replace(q," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a<u;a++){n=r[a];if((n.selected||a===i)&&(v.support.optDisabled?!n.disabled:n.getAttribute("disabled")===null)&&(!n.parentNode.disabled||!v.nodeName(n.parentNode,"optgroup"))){t=v(n).val();if(s)return t;o.push(t)}}return o},set:function(e,t){var n=v.makeArray(t);return v(e).find("option").each(function(){this.selected=v.inArray(v(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o<r.length;o++)i=r[o],i&&(n=v.propFix[i]||i,s=X.test(i),s||v.attr(e,i,""),e.removeAttribute(V?i:n),s&&n in e&&(e[n]=!1))}},attrHooks:{type:{set:function(e,t){if(U.test(e.nodeName)&&e.parentNode)v.error("type property can't be changed");else if(!v.support.radioValue&&t==="radio"&&v.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}},value:{get:function(e,t){return j&&v.nodeName(e,"button")?j.get(e,t):t in e?e.value:null},set:function(e,t,n){if(j&&v.nodeName(e,"button"))return j.set(e,t,n);e.value=t}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,s,o,u=e.nodeType;if(!e||u===3||u===8||u===2)return;return o=u!==1||!v.isXMLDoc(e),o&&(n=v.propFix[n]||n,s=v.propHooks[n]),r!==t?s&&"set"in s&&(i=s.set(e,r,n))!==t?i:e[n]=r:s&&"get"in s&&(i=s.get(e,n))!==null?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):z.test(e.nodeName)||W.test(e.nodeName)&&e.href?0:t}}}}),F={get:function(e,n){var r,i=v.prop(e,n);return i===!0||typeof i!="boolean"&&(r=e.getAttributeNode(n))&&r.nodeValue!==!1?n.toLowerCase():t},set:function(e,t,n){var r;return t===!1?v.removeAttr(e,n):(r=v.propFix[n]||n,r in e&&(e[r]=!0),e.setAttribute(n,n.toLowerCase())),n}},V||(I={name:!0,id:!0,coords:!0},j=v.valHooks.button={get:function(e,n){var r;return r=e.getAttributeNode(n),r&&(I[n]?r.value!=="":r.specified)?r.value:t},set:function(e,t,n){var r=e.getAttributeNode(n);return r||(r=i.createAttribute(n),e.setAttributeNode(r)),r.value=t+""}},v.each(["width","height"],function(e,t){v.attrHooks[t]=v.extend(v.attrHooks[t],{set:function(e,n){if(n==="")return e.setAttribute(t,"auto"),n}})}),v.attrHooks.contenteditable={get:j.get,set:function(e,t,n){t===""&&(t="false"),j.set(e,t,n)}}),v.support.hrefNormalized||v.each(["href","src","width","height"],function(e,n){v.attrHooks[n]=v.extend(v.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return r===null?t:r}})}),v.support.style||(v.attrHooks.style={get:function(e){return e.style.cssText.toLowerCase()||t},set:function(e,t){return e.style.cssText=t+""}}),v.support.optSelected||(v.propHooks.selected=v.extend(v.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),v.support.enctype||(v.propFix.enctype="encoding"),v.support.checkOn||v.each(["radio","checkbox"],function(){v.valHooks[this]={get:function(e){return e.getAttribute("value")===null?"on":e.value}}}),v.each(["radio","checkbox"],function(){v.valHooks[this]=v.extend(v.valHooks[this],{set:function(e,t){if(v.isArray(t))return e.checked=v.inArray(v(e).val(),t)>=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f<n.length;f++){l=J.exec(n[f])||[],c=l[1],h=(l[2]||"").split(".").sort(),g=v.event.special[c]||{},c=(s?g.delegateType:g.bindType)||c,g=v.event.special[c]||{},p=v.extend({type:c,origType:l[1],data:i,handler:r,guid:r.guid,selector:s,needsContext:s&&v.expr.match.needsContext.test(s),namespace:h.join(".")},d),m=a[c];if(!m){m=a[c]=[],m.delegateCount=0;if(!g.setup||g.setup.call(e,i,h,u)===!1)e.addEventListener?e.addEventListener(c,u,!1):e.attachEvent&&e.attachEvent("on"+c,u)}g.add&&(g.add.call(e,p),p.handler.guid||(p.handler.guid=r.guid)),s?m.splice(m.delegateCount++,0,p):m.push(p),v.event.global[c]=!0}e=null},global:{},remove:function(e,t,n,r,i){var s,o,u,a,f,l,c,h,p,d,m,g=v.hasData(e)&&v._data(e);if(!g||!(h=g.events))return;t=v.trim(Z(t||"")).split(" ");for(s=0;s<t.length;s++){o=J.exec(t[s])||[],u=a=o[1],f=o[2];if(!u){for(u in h)v.event.remove(e,u+t[s],n,r,!0);continue}p=v.event.special[u]||{},u=(r?p.delegateType:p.bindType)||u,d=h[u]||[],l=d.length,f=f?new RegExp("(^|\\.)"+f.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(c=0;c<d.length;c++)m=d[c],(i||a===m.origType)&&(!n||n.guid===m.guid)&&(!f||f.test(m.namespace))&&(!r||r===m.selector||r==="**"&&m.selector)&&(d.splice(c--,1),m.selector&&d.delegateCount--,p.remove&&p.remove.call(e,m));d.length===0&&l!==d.length&&((!p.teardown||p.teardown.call(e,f,g.handle)===!1)&&v.removeEvent(e,u,g.handle),delete h[u])}v.isEmptyObject(h)&&(delete g.handle,v.removeData(e,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(n,r,s,o){if(!s||s.nodeType!==3&&s.nodeType!==8){var u,a,f,l,c,h,p,d,m,g,y=n.type||n,b=[];if(Y.test(y+v.event.triggered))return;y.indexOf("!")>=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f<m.length&&!n.isPropagationStopped();f++)l=m[f][0],n.type=m[f][1],d=(v._data(l,"events")||{})[n.type]&&v._data(l,"handle"),d&&d.apply(l,r),d=h&&l[h],d&&v.acceptData(l)&&d.apply&&d.apply(l,r)===!1&&n.preventDefault();return n.type=y,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(s.ownerDocument,r)===!1)&&(y!=="click"||!v.nodeName(s,"a"))&&v.acceptData(s)&&h&&s[y]&&(y!=="focus"&&y!=="blur"||n.target.offsetWidth!==0)&&!v.isWindow(s)&&(c=s[h],c&&(s[h]=null),v.event.triggered=y,s[y](),v.event.triggered=t,c&&(s[h]=c)),n.result}return},dispatch:function(n){n=v.event.fix(n||e.event);var r,i,s,o,u,a,f,c,h,p,d=(v._data(this,"events")||{})[n.type]||[],m=d.delegateCount,g=l.call(arguments),y=!n.exclusive&&!n.namespace,b=v.event.special[n.type]||{},w=[];g[0]=n,n.delegateTarget=this;if(b.preDispatch&&b.preDispatch.call(this,n)===!1)return;if(m&&(!n.button||n.type!=="click"))for(s=n.target;s!=this;s=s.parentNode||this)if(s.disabled!==!0||n.type!=="click"){u={},f=[];for(r=0;r<m;r++)c=d[r],h=c.selector,u[h]===t&&(u[h]=c.needsContext?v(h,this).index(s)>=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r<w.length&&!n.isPropagationStopped();r++){a=w[r],n.currentTarget=a.elem;for(i=0;i<a.matches.length&&!n.isImmediatePropagationStopped();i++){c=a.matches[i];if(y||!n.namespace&&!c.namespace||n.namespace_re&&n.namespace_re.test(c.namespace))n.data=c.data,n.handleObj=c,o=((v.event.special[c.origType]||{}).handle||c.handler).apply(a.elem,g),o!==t&&(n.result=o,o===!1&&(n.preventDefault(),n.stopPropagation()))}}return b.postDispatch&&b.postDispatch.call(this,n),n.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return e.which==null&&(e.which=t.charCode!=null?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,s,o,u=n.button,a=n.fromElement;return e.pageX==null&&n.clientX!=null&&(r=e.target.ownerDocument||i,s=r.documentElement,o=r.body,e.pageX=n.clientX+(s&&s.scrollLeft||o&&o.scrollLeft||0)-(s&&s.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(s&&s.scrollTop||o&&o.scrollTop||0)-(s&&s.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&a&&(e.relatedTarget=a===e.target?n.toElement:a),!e.which&&u!==t&&(e.which=u&1?1:u&2?3:u&4?2:0),e}},fix:function(e){if(e[v.expando])return e;var t,n,r=e,s=v.event.fixHooks[e.type]||{},o=s.props?this.props.concat(s.props):this.props;e=v.Event(r);for(t=o.length;t;)n=o[--t],e[n]=r[n];return e.target||(e.target=r.srcElement||i),e.target.nodeType===3&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,r):e},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(e,t,n){v.isWindow(this)&&(this.onbeforeunload=n)},teardown:function(e,t){this.onbeforeunload===t&&(this.onbeforeunload=null)}}},simulate:function(e,t,n,r){var i=v.extend(new v.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?v.event.trigger(i,null,t):v.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},v.event.handle=v.event.dispatch,v.removeEvent=i.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]=="undefined"&&(e[r]=null),e.detachEvent(r,n))},v.Event=function(e,t){if(!(this instanceof v.Event))return new v.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?tt:et):this.type=e,t&&v.extend(this,t),this.timeStamp=e&&e.timeStamp||v.now(),this[v.expando]=!0},v.Event.prototype={preventDefault:function(){this.isDefaultPrevented=tt;var e=this.originalEvent;if(!e)return;e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=tt;var e=this.originalEvent;if(!e)return;e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=tt,this.stopPropagation()},isDefaultPrevented:et,isPropagationStopped:et,isImmediatePropagationStopped:et},v.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){v.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,s=e.handleObj,o=s.selector;if(!i||i!==r&&!v.contains(r,i))e.type=s.origType,n=s.handler.apply(this,arguments),e.type=t;return n}}}),v.support.submitBubbles||(v.event.special.submit={setup:function(){if(v.nodeName(this,"form"))return!1;v.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=v.nodeName(n,"input")||v.nodeName(n,"button")?n.form:t;r&&!v._data(r,"_submit_attached")&&(v.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),v._data(r,"_submit_attached",!0))})},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&v.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){if(v.nodeName(this,"form"))return!1;v.event.remove(this,"._submit")}}),v.support.changeBubbles||(v.event.special.change={setup:function(){if($.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")v.event.add(this,"propertychange._change",function(e){e.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),v.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),v.event.simulate("change",this,e,!0)});return!1}v.event.add(this,"beforeactivate._change",function(e){var t=e.target;$.test(t.nodeName)&&!v._data(t,"_change_attached")&&(v.event.add(t,"change._change",function(e){this.parentNode&&!e.isSimulated&&!e.isTrigger&&v.event.simulate("change",this.parentNode,e,!0)}),v._data(t,"_change_attached",!0))})},handle:function(e){var t=e.target;if(this!==t||e.isSimulated||e.isTrigger||t.type!=="radio"&&t.type!=="checkbox")return e.handleObj.handler.apply(this,arguments)},teardown:function(){return v.event.remove(this,"._change"),!$.test(this.nodeName)}}),v.support.focusinBubbles||v.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){v.event.simulate(t,e.target,v.event.fix(e),!0)};v.event.special[t]={setup:function(){n++===0&&i.addEventListener(e,r,!0)},teardown:function(){--n===0&&i.removeEventListener(e,r,!0)}}}),v.fn.extend({on:function(e,n,r,i,s){var o,u;if(typeof e=="object"){typeof n!="string"&&(r=r||n,n=t);for(u in e)this.on(u,n,r,e[u],s);return this}r==null&&i==null?(i=n,r=n=t):i==null&&(typeof n=="string"?(i=r,r=t):(i=r,r=n,n=t));if(i===!1)i=et;else if(!i)return this;return s===1&&(o=i,i=function(e){return v().off(e),o.apply(this,arguments)},i.guid=o.guid||(o.guid=v.guid++)),this.each(function(){v.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,s;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,v(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if(typeof e=="object"){for(s in e)this.off(s,n,e[s]);return this}if(n===!1||typeof n=="function")r=n,n=t;return r===!1&&(r=et),this.each(function(){v.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},live:function(e,t,n){return v(this.context).on(e,this.selector,t,n),this},die:function(e,t){return v(this.context).off(e,this.selector||"**",t),this},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return arguments.length===1?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){v.event.trigger(e,t,this)})},triggerHandler:function(e,t){if(this[0])return v.event.trigger(e,t,this[0],!0)},toggle:function(e){var t=arguments,n=e.guid||v.guid++,r=0,i=function(n){var i=(v._data(this,"lastToggle"+e.guid)||0)%r;return v._data(this,"lastToggle"+e.guid,i+1),n.preventDefault(),t[i].apply(this,arguments)||!1};i.guid=n;while(r<t.length)t[r++].guid=n;return this.click(i)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){v.fn[t]=function(e,n){return n==null&&(n=e,e=null),arguments.length>0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u<a;u++)if(s=e[u])if(!n||n(s,r,i))o.push(s),f&&t.push(u);return o}function ct(e,t,n,r,i,s){return r&&!r[d]&&(r=ct(r)),i&&!i[d]&&(i=ct(i,s)),N(function(s,o,u,a){var f,l,c,h=[],p=[],d=o.length,v=s||dt(t||"*",u.nodeType?[u]:u,[]),m=e&&(s||!t)?lt(v,h,e,u,a):v,g=n?i||(s?e:d||r)?[]:o:m;n&&n(m,g,u,a);if(r){f=lt(g,p),r(f,[],u,a),l=f.length;while(l--)if(c=f[l])g[p[l]]=!(m[p[l]]=c)}if(s){if(i||e){if(i){f=[],l=g.length;while(l--)(c=g[l])&&f.push(m[l]=c);i(null,g=[],f,a)}l=g.length;while(l--)(c=g[l])&&(f=i?T.call(s,c):h[l])>-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a<s;a++)if(n=i.relative[e[a].type])h=[at(ft(h),n)];else{n=i.filter[e[a].type].apply(null,e[a].matches);if(n[d]){r=++a;for(;r<s;r++)if(i.relative[e[r].type])break;return ct(a>1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a<r&&ht(e.slice(a,r)),r<s&&ht(e=e.slice(r)),r<s&&e.join(""))}h.push(n)}return ft(h)}function pt(e,t){var r=t.length>0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r<i;r++)nt(e,t[r],n);return n}function vt(e,t,n,r,s){var o,u,f,l,c,h=ut(e),p=h.length;if(!r&&h.length===1){u=h[0]=h[0].slice(0);if(u.length>2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;t<n;t++)if(this[t]===e)return t;return-1},N=function(e,t){return e[d]=t==null||t,e},C=function(){var e={},t=[];return N(function(n,r){return t.push(n)>i.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="<a name='"+d+"'></a><div name='"+d+"'></div>",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:st(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:st(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},f=y.compareDocumentPosition?function(e,t){return e===t?(l=!0,0):(!e.compareDocumentPosition||!t.compareDocumentPosition?e.compareDocumentPosition:e.compareDocumentPosition(t)&4)?-1:1}:function(e,t){if(e===t)return l=!0,0;if(e.sourceIndex&&t.sourceIndex)return e.sourceIndex-t.sourceIndex;var n,r,i=[],s=[],o=e.parentNode,u=t.parentNode,a=o;if(o===u)return ot(e,t);if(!o)return-1;if(!u)return 1;while(a)i.unshift(a),a=a.parentNode;a=u;while(a)s.unshift(a),a=a.parentNode;n=i.length,r=s.length;for(var f=0;f<n&&f<r;f++)if(i[f]!==s[f])return ot(i[f],s[f]);return f===n?ot(e,s[f],-1):ot(i[f],t,1)},[0,0].sort(f),h=!l,nt.uniqueSort=function(e){var t,n=[],r=1,i=0;l=h,e.sort(f);if(l){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e},nt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},a=nt.compile=function(e,t){var n,r=[],i=[],s=A[d][e+" "];if(!s){t||(t=ut(e)),n=t.length;while(n--)s=ht(t[n]),s[d]?r.push(s):i.push(s);s=A(e,pt(i,r))}return s},g.querySelectorAll&&function(){var e,t=vt,n=/'|\\/g,r=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,i=[":focus"],s=[":active"],u=y.matchesSelector||y.mozMatchesSelector||y.webkitMatchesSelector||y.oMatchesSelector||y.msMatchesSelector;K(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="<p test=''></p>",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="<input type='hidden'/>",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t<n;t++)if(v.contains(u[t],this))return!0});o=this.pushStack("","find",e);for(t=0,n=this.length;t<n;t++){r=o.length,v.find(e,this[t],o);if(t>0)for(i=r;i<o.length;i++)for(s=0;s<r;s++)if(o[s]===o[i]){o.splice(i--,1);break}}return o},has:function(e){var t,n=v(e,this),r=n.length;return this.filter(function(){for(t=0;t<r;t++)if(v.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1),"not",e)},filter:function(e){return this.pushStack(ft(this,e,!0),"filter",e)},is:function(e){return!!e&&(typeof e=="string"?st.test(e)?v(e,this.context).index(this[0])>=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r<i;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&n.nodeType!==11){if(o?o.index(n)>-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/<tbody/i,gt=/<|&#?\w+;/,yt=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,wt=new RegExp("<(?:"+ct+")[\\s/>]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,Nt={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X<div>","</div>"]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1></$2>");try{for(;r<i;r++)n=this[r]||{},n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),n.innerHTML=e);n=0}catch(s){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){return ut(this[0])?this.length?this.pushStack(v(v.isFunction(e)?e():e),"replaceWith",e):this:v.isFunction(e)?this.each(function(t){var n=v(this),r=n.html();n.replaceWith(e.call(this,t,r))}):(typeof e!="string"&&(e=v(e).detach()),this.each(function(){var t=this.nextSibling,n=this.parentNode;v(this).remove(),t?v(t).before(e):v(n).append(e)}))},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=[].concat.apply([],e);var i,s,o,u,a=0,f=e[0],l=[],c=this.length;if(!v.support.checkClone&&c>1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a<c;a++)r.call(n&&v.nodeName(this[a],"table")?Lt(this[a],"tbody"):this[a],a===u?o:v.clone(o,!0,!0))}o=s=null,l.length&&v.each(l,function(e,t){t.src?v.ajax?v.ajax({url:t.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):v.error("no ajax"):v.globalEval((t.text||t.textContent||t.innerHTML||"").replace(Tt,"")),t.parentNode&&t.parentNode.removeChild(t)})}return this}}),v.buildFragment=function(e,n,r){var s,o,u,a=e[0];return n=n||i,n=!n.nodeType&&n[0]||n,n=n.ownerDocument||n,e.length===1&&typeof a=="string"&&a.length<512&&n===i&&a.charAt(0)==="<"&&!bt.test(a)&&(v.support.checkClone||!St.test(a))&&(v.support.html5Clone||!wt.test(a))&&(o=!0,s=v.fragments[a],u=s!==t),s||(s=n.createDocumentFragment(),v.clean(e,n,s,r),o&&(v.fragments[a]=u&&s)),{fragment:s,cacheable:o}},v.fragments={},v.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){v.fn[e]=function(n){var r,i=0,s=[],o=v(n),u=o.length,a=this.length===1&&this[0].parentNode;if((a==null||a&&a.nodeType===11&&a.childNodes.length===1)&&u===1)return o[t](this[0]),this;for(;i<u;i++)r=(i>0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1></$2>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]==="<table>"&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("<div>").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r<i;r++)n=e[r],Vn[n]=Vn[n]||[],Vn[n].unshift(t)},prefilter:function(e,t){t?Xn.unshift(e):Xn.push(e)}}),v.Tween=Yn,Yn.prototype={constructor:Yn,init:function(e,t,n,r,i,s){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=s||(v.cssNumber[n]?"":"px")},cur:function(){var e=Yn.propHooks[this.prop];return e&&e.get?e.get(this):Yn.propHooks._default.get(this)},run:function(e){var t,n=Yn.propHooks[this.prop];return this.options.duration?this.pos=t=v.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Yn.propHooks._default.set(this),this}},Yn.prototype.init.prototype=Yn.prototype,Yn.propHooks={_default:{get:function(e){var t;return e.elem[e.prop]==null||!!e.elem.style&&e.elem.style[e.prop]!=null?(t=v.css(e.elem,e.prop,!1,""),!t||t==="auto"?0:t):e.elem[e.prop]},set:function(e){v.fx.step[e.prop]?v.fx.step[e.prop](e):e.elem.style&&(e.elem.style[v.cssProps[e.prop]]!=null||v.cssHooks[e.prop])?v.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},Yn.propHooks.scrollTop=Yn.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},v.each(["toggle","show","hide"],function(e,t){var n=v.fn[t];v.fn[t]=function(r,i,s){return r==null||typeof r=="boolean"||!e&&v.isFunction(r)&&v.isFunction(i)?n.apply(this,arguments):this.animate(Zn(t,!0),r,i,s)}}),v.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Gt).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=v.isEmptyObject(e),s=v.speed(t,n,r),o=function(){var t=Kn(this,v.extend({},e),s);i&&t.stop(!0)};return i||s.queue===!1?this.each(o):this.queue(s.queue,o)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return typeof e!="string"&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=e!=null&&e+"queueHooks",s=v.timers,o=v._data(this);if(n)o[n]&&o[n].stop&&i(o[n]);else for(n in o)o[n]&&o[n].stop&&Wn.test(n)&&i(o[n]);for(n=s.length;n--;)s[n].elem===this&&(e==null||s[n].queue===e)&&(s[n].anim.stop(r),t=!1,s.splice(n,1));(t||!r)&&v.dequeue(this,e)})}}),v.each({slideDown:Zn("show"),slideUp:Zn("hide"),slideToggle:Zn("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){v.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),v.speed=function(e,t,n){var r=e&&typeof e=="object"?v.extend({},e):{complete:n||!n&&t||v.isFunction(e)&&e,duration:e,easing:n&&t||t&&!v.isFunction(t)&&t};r.duration=v.fx.off?0:typeof r.duration=="number"?r.duration:r.duration in v.fx.speeds?v.fx.speeds[r.duration]:v.fx.speeds._default;if(r.queue==null||r.queue===!0)r.queue="fx";return r.old=r.complete,r.complete=function(){v.isFunction(r.old)&&r.old.call(this),r.queue&&v.dequeue(this,r.queue)},r},v.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},v.timers=[],v.fx=Yn.prototype.init,v.fx.tick=function(){var e,n=v.timers,r=0;qn=v.now();for(;r<n.length;r++)e=n[r],!e()&&n[r]===e&&n.splice(r--,1);n.length||v.fx.stop(),qn=t},v.fx.timer=function(e){e()&&v.timers.push(e)&&!Rn&&(Rn=setInterval(v.fx.tick,v.fx.interval))},v.fx.interval=13,v.fx.stop=function(){clearInterval(Rn),Rn=null},v.fx.speeds={slow:600,fast:200,_default:400},v.fx.step={},v.expr&&v.expr.filters&&(v.expr.filters.animated=function(e){return v.grep(v.timers,function(t){return e===t.elem}).length});var er=/^(?:body|html)$/i;v.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){v.offset.setOffset(this,e,t)});var n,r,i,s,o,u,a,f={top:0,left:0},l=this[0],c=l&&l.ownerDocument;if(!c)return;return(r=c.body)===l?v.offset.bodyOffset(l):(n=c.documentElement,v.contains(n,l)?(typeof l.getBoundingClientRect!="undefined"&&(f=l.getBoundingClientRect()),i=tr(c),s=n.clientTop||r.clientTop||0,o=n.clientLeft||r.clientLeft||0,u=i.pageYOffset||n.scrollTop,a=i.pageXOffset||n.scrollLeft,{top:f.top+u-s,left:f.left+a-o}):f)},v.offset={bodyOffset:function(e){var t=e.offsetTop,n=e.offsetLeft;return v.support.doesNotIncludeMarginInBodyOffset&&(t+=parseFloat(v.css(e,"marginTop"))||0,n+=parseFloat(v.css(e,"marginLeft"))||0),{top:t,left:n}},setOffset:function(e,t,n){var r=v.css(e,"position");r==="static"&&(e.style.position="relative");var i=v(e),s=i.offset(),o=v.css(e,"top"),u=v.css(e,"left"),a=(r==="absolute"||r==="fixed")&&v.inArray("auto",[o,u])>-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);
\ No newline at end of file
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.dist b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.dist
new file mode 100644
index 0000000..95ac783
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML/Renderer/Template/method_item.html.dist
@@ -0,0 +1,11 @@
+     <tr>
+      <td class="{methods_level}" colspan="4">{name}</td>
+      <td class="{methods_level} big">{methods_bar}</td>
+      <td class="{methods_level} small"><div align="right">{methods_tested_percent}</div></td>
+      <td class="{methods_level} small"><div align="right">{methods_number}</div></td>
+      <td class="{methods_level} small">{crap}</td>
+      <td class="{lines_level} big">{lines_bar}</td>
+      <td class="{lines_level} small"><div align="right">{lines_executed_percent}</div></td>
+      <td class="{lines_level} small"><div align="right">{lines_number}</div></td>
+     </tr>
+
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node.php
new file mode 100644
index 0000000..4a0fcd9
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node.php
@@ -0,0 +1,380 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Base class for nodes in the code coverage information tree.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+abstract class PHP_CodeCoverage_Report_Node implements Countable
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $path;
+
+    /**
+     * @var array
+     */
+    protected $pathArray;
+
+    /**
+     * @var PHP_CodeCoverage_Report_Node
+     */
+    protected $parent;
+
+    /**
+     * @var string
+     */
+    protected $id;
+
+    /**
+     * Constructor.
+     *
+     * @param string                       $name
+     * @param PHP_CodeCoverage_Report_Node $parent
+     */
+    public function __construct($name, PHP_CodeCoverage_Report_Node $parent = NULL)
+    {
+        if (substr($name, -1) == '/') {
+            $name = substr($name, 0, -1);
+        }
+
+        $this->name   = $name;
+        $this->parent = $parent;
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * @return string
+     */
+    public function getId()
+    {
+        if ($this->id === NULL) {
+            $parent = $this->getParent();
+
+            if ($parent === NULL) {
+                $this->id = 'index';
+            } else {
+                $parentId = $parent->getId();
+
+                if ($parentId == 'index') {
+                    $this->id = str_replace(':', '_', $this->name);
+                } else {
+                    $this->id = $parentId . '_' . $this->name;
+                }
+            }
+        }
+
+        return $this->id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPath()
+    {
+        if ($this->path === NULL) {
+            if ($this->parent === NULL) {
+                $this->path = $this->name;
+            } else {
+                $this->path = $this->parent->getPath() . '/' . $this->name;
+            }
+        }
+
+        return $this->path;
+    }
+
+    /**
+     * @return array
+     */
+    public function getPathAsArray()
+    {
+        if ($this->pathArray === NULL) {
+            if ($this->parent === NULL) {
+                $this->pathArray = array();
+            } else {
+                $this->pathArray = $this->parent->getPathAsArray();
+            }
+
+            $this->pathArray[] = $this;
+        }
+
+        return $this->pathArray;
+    }
+
+    /**
+     * @return PHP_CodeCoverage_Report_Node
+     */
+    public function getParent()
+    {
+        return $this->parent;
+    }
+
+    /**
+     * Returns the percentage of classes that has been tested.
+     *
+     * @param  boolean $asString
+     * @return integer
+     */
+    public function getTestedClassesPercent($asString = TRUE)
+    {
+        return PHP_CodeCoverage_Util::percent(
+          $this->getNumTestedClasses(),
+          $this->getNumClasses(),
+          $asString
+        );
+    }
+
+    /**
+     * Returns the percentage of traits that has been tested.
+     *
+     * @param  boolean $asString
+     * @return integer
+     */
+    public function getTestedTraitsPercent($asString = TRUE)
+    {
+        return PHP_CodeCoverage_Util::percent(
+          $this->getNumTestedTraits(),
+          $this->getNumTraits(),
+          $asString
+        );
+    }
+
+    /**
+     * Returns the percentage of traits that has been tested.
+     *
+     * @param  boolean $asString
+     * @return integer
+     * @since  Method available since Release 1.2.0
+     */
+    public function getTestedClassesAndTraitsPercent($asString = TRUE)
+    {
+        return PHP_CodeCoverage_Util::percent(
+          $this->getNumTestedClassesAndTraits(),
+          $this->getNumClassesAndTraits(),
+          $asString
+        );
+    }
+
+    /**
+     * Returns the percentage of methods that has been tested.
+     *
+     * @param  boolean $asString
+     * @return integer
+     */
+    public function getTestedMethodsPercent($asString = TRUE)
+    {
+        return PHP_CodeCoverage_Util::percent(
+          $this->getNumTestedMethods(),
+          $this->getNumMethods(),
+          $asString
+        );
+    }
+
+    /**
+     * Returns the percentage of executed lines.
+     *
+     * @param  boolean $asString
+     * @return integer
+     */
+    public function getLineExecutedPercent($asString = TRUE)
+    {
+        return PHP_CodeCoverage_Util::percent(
+          $this->getNumExecutedLines(),
+          $this->getNumExecutableLines(),
+          $asString
+        );
+    }
+
+    /**
+     * Returns the number of classes and traits.
+     *
+     * @return integer
+     * @since  Method available since Release 1.2.0
+     */
+    public function getNumClassesAndTraits()
+    {
+        return $this->getNumClasses() + $this->getNumTraits();
+    }
+
+    /**
+     * Returns the number of tested classes and traits.
+     *
+     * @return integer
+     * @since  Method available since Release 1.2.0
+     */
+    public function getNumTestedClassesAndTraits()
+    {
+        return $this->getNumTestedClasses() + $this->getNumTestedTraits();
+    }
+
+    /**
+     * Returns the classes and traits of this node.
+     *
+     * @return array
+     * @since  Method available since Release 1.2.0
+     */
+    public function getClassesAndTraits()
+    {
+        return array_merge($this->getClasses(), $this->getTraits());
+    }
+
+    /**
+     * Returns the classes of this node.
+     *
+     * @return array
+     */
+    abstract public function getClasses();
+
+    /**
+     * Returns the traits of this node.
+     *
+     * @return array
+     */
+    abstract public function getTraits();
+
+    /**
+     * Returns the functions of this node.
+     *
+     * @return array
+     */
+    abstract public function getFunctions();
+
+    /**
+     * Returns the LOC/CLOC/NCLOC of this node.
+     *
+     * @return array
+     */
+    abstract public function getLinesOfCode();
+
+    /**
+     * Returns the number of executable lines.
+     *
+     * @return integer
+     */
+    abstract public function getNumExecutableLines();
+
+    /**
+     * Returns the number of executed lines.
+     *
+     * @return integer
+     */
+    abstract public function getNumExecutedLines();
+
+    /**
+     * Returns the number of classes.
+     *
+     * @return integer
+     */
+    abstract public function getNumClasses();
+
+    /**
+     * Returns the number of tested classes.
+     *
+     * @return integer
+     */
+    abstract public function getNumTestedClasses();
+
+    /**
+     * Returns the number of traits.
+     *
+     * @return integer
+     */
+    abstract public function getNumTraits();
+
+    /**
+     * Returns the number of tested traits.
+     *
+     * @return integer
+     */
+    abstract public function getNumTestedTraits();
+
+    /**
+     * Returns the number of methods.
+     *
+     * @return integer
+     */
+    abstract public function getNumMethods();
+
+    /**
+     * Returns the number of tested methods.
+     *
+     * @return integer
+     */
+    abstract public function getNumTestedMethods();
+
+    /**
+     * Returns the number of functions.
+     *
+     * @return integer
+     */
+    abstract public function getNumFunctions();
+
+    /**
+     * Returns the number of tested functions.
+     *
+     * @return integer
+     */
+    abstract public function getNumTestedFunctions();
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Directory.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Directory.php
new file mode 100644
index 0000000..44e151e
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Directory.php
@@ -0,0 +1,512 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Represents a directory in the code coverage information tree.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_Node_Directory extends PHP_CodeCoverage_Report_Node implements IteratorAggregate
+{
+    /**
+     * @var PHP_CodeCoverage_Report_Node[]
+     */
+    protected $children = array();
+
+    /**
+     * @var PHP_CodeCoverage_Report_Node_Directory[]
+     */
+    protected $directories = array();
+
+    /**
+     * @var PHP_CodeCoverage_Report_Node_File[]
+     */
+    protected $files = array();
+
+    /**
+     * @var array
+     */
+    protected $classes;
+
+    /**
+     * @var array
+     */
+    protected $traits;
+
+    /**
+     * @var array
+     */
+    protected $functions;
+
+    /**
+     * @var array
+     */
+    protected $linesOfCode = NULL;
+
+    /**
+     * @var integer
+     */
+    protected $numFiles = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numExecutableLines = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numExecutedLines = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numClasses = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedClasses = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numTraits = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedTraits = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numMethods = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedMethods = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numFunctions = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedFunctions = -1;
+
+    /**
+     * Returns the number of files in/under this node.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        if ($this->numFiles == -1) {
+            $this->numFiles = 0;
+
+            foreach ($this->children as $child) {
+                $this->numFiles += count($child);
+            }
+        }
+
+        return $this->numFiles;
+    }
+
+    /**
+     * Returns an iterator for this node.
+     *
+     * @return RecursiveIteratorIterator
+     */
+    public function getIterator()
+    {
+        return new RecursiveIteratorIterator(
+          new PHP_CodeCoverage_Report_Node_Iterator($this),
+          RecursiveIteratorIterator::SELF_FIRST
+        );
+    }
+
+    /**
+     * Adds a new directory.
+     *
+     * @param  string $name
+     * @return PHP_CodeCoverage_Report_Node_Directory
+     */
+    public function addDirectory($name)
+    {
+        $directory = new PHP_CodeCoverage_Report_Node_Directory($name, $this);
+
+        $this->children[]    = $directory;
+        $this->directories[] = &$this->children[count($this->children) - 1];
+
+        return $directory;
+    }
+
+    /**
+     * Adds a new file.
+     *
+     * @param  string  $name
+     * @param  array   $coverageData
+     * @param  array   $testData
+     * @param  boolean $cacheTokens
+     * @return PHP_CodeCoverage_Report_Node_File
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function addFile($name, array $coverageData, array $testData, $cacheTokens)
+    {
+        $file = new PHP_CodeCoverage_Report_Node_File(
+          $name, $this, $coverageData, $testData, $cacheTokens
+        );
+
+        $this->children[] = $file;
+        $this->files[]    = &$this->children[count($this->children) - 1];
+
+        $this->numExecutableLines = -1;
+        $this->numExecutedLines   = -1;
+
+        return $file;
+    }
+
+    /**
+     * Returns the directories in this directory.
+     *
+     * @return array
+     */
+    public function getDirectories()
+    {
+        return $this->directories;
+    }
+
+    /**
+     * Returns the files in this directory.
+     *
+     * @return array
+     */
+    public function getFiles()
+    {
+        return $this->files;
+    }
+
+    /**
+     * Returns the child nodes of this node.
+     *
+     * @return array
+     */
+    public function getChildNodes()
+    {
+        return $this->children;
+    }
+
+    /**
+     * Returns the classes of this node.
+     *
+     * @return array
+     */
+    public function getClasses()
+    {
+        if ($this->classes === NULL) {
+            $this->classes = array();
+
+            foreach ($this->children as $child) {
+                $this->classes = array_merge(
+                  $this->classes, $child->getClasses()
+                );
+            }
+        }
+
+        return $this->classes;
+    }
+
+    /**
+     * Returns the traits of this node.
+     *
+     * @return array
+     */
+    public function getTraits()
+    {
+        if ($this->traits === NULL) {
+            $this->traits = array();
+
+            foreach ($this->children as $child) {
+                $this->traits = array_merge(
+                  $this->traits, $child->getTraits()
+                );
+            }
+        }
+
+        return $this->traits;
+    }
+
+    /**
+     * Returns the functions of this node.
+     *
+     * @return array
+     */
+    public function getFunctions()
+    {
+        if ($this->functions === NULL) {
+            $this->functions = array();
+
+            foreach ($this->children as $child) {
+                $this->functions = array_merge(
+                  $this->functions, $child->getFunctions()
+                );
+            }
+        }
+
+        return $this->functions;
+    }
+
+    /**
+     * Returns the LOC/CLOC/NCLOC of this node.
+     *
+     * @return array
+     */
+    public function getLinesOfCode()
+    {
+        if ($this->linesOfCode === NULL) {
+            $this->linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
+
+            foreach ($this->children as $child) {
+                $linesOfCode = $child->getLinesOfCode();
+
+                $this->linesOfCode['loc']   += $linesOfCode['loc'];
+                $this->linesOfCode['cloc']  += $linesOfCode['cloc'];
+                $this->linesOfCode['ncloc'] += $linesOfCode['ncloc'];
+            }
+        }
+
+        return $this->linesOfCode;
+    }
+
+    /**
+     * Returns the number of executable lines.
+     *
+     * @return integer
+     */
+    public function getNumExecutableLines()
+    {
+        if ($this->numExecutableLines == -1) {
+            $this->numExecutableLines = 0;
+
+            foreach ($this->children as $child) {
+                $this->numExecutableLines += $child->getNumExecutableLines();
+            }
+        }
+
+        return $this->numExecutableLines;
+    }
+
+    /**
+     * Returns the number of executed lines.
+     *
+     * @return integer
+     */
+    public function getNumExecutedLines()
+    {
+        if ($this->numExecutedLines == -1) {
+            $this->numExecutedLines = 0;
+
+            foreach ($this->children as $child) {
+                $this->numExecutedLines += $child->getNumExecutedLines();
+            }
+        }
+
+        return $this->numExecutedLines;
+    }
+
+    /**
+     * Returns the number of classes.
+     *
+     * @return integer
+     */
+    public function getNumClasses()
+    {
+        if ($this->numClasses == -1) {
+            $this->numClasses = 0;
+
+            foreach ($this->children as $child) {
+                $this->numClasses += $child->getNumClasses();
+            }
+        }
+
+        return $this->numClasses;
+    }
+
+    /**
+     * Returns the number of tested classes.
+     *
+     * @return integer
+     */
+    public function getNumTestedClasses()
+    {
+        if ($this->numTestedClasses == -1) {
+            $this->numTestedClasses = 0;
+
+            foreach ($this->children as $child) {
+                $this->numTestedClasses += $child->getNumTestedClasses();
+            }
+        }
+
+        return $this->numTestedClasses;
+    }
+
+    /**
+     * Returns the number of traits.
+     *
+     * @return integer
+     */
+    public function getNumTraits()
+    {
+        if ($this->numTraits == -1) {
+            $this->numTraits = 0;
+
+            foreach ($this->children as $child) {
+                $this->numTraits += $child->getNumTraits();
+            }
+        }
+
+        return $this->numTraits;
+    }
+
+    /**
+     * Returns the number of tested traits.
+     *
+     * @return integer
+     */
+    public function getNumTestedTraits()
+    {
+        if ($this->numTestedTraits == -1) {
+            $this->numTestedTraits = 0;
+
+            foreach ($this->children as $child) {
+                $this->numTestedTraits += $child->getNumTestedTraits();
+            }
+        }
+
+        return $this->numTestedTraits;
+    }
+
+    /**
+     * Returns the number of methods.
+     *
+     * @return integer
+     */
+    public function getNumMethods()
+    {
+        if ($this->numMethods == -1) {
+            $this->numMethods = 0;
+
+            foreach ($this->children as $child) {
+                $this->numMethods += $child->getNumMethods();
+            }
+        }
+
+        return $this->numMethods;
+    }
+
+    /**
+     * Returns the number of tested methods.
+     *
+     * @return integer
+     */
+    public function getNumTestedMethods()
+    {
+        if ($this->numTestedMethods == -1) {
+            $this->numTestedMethods = 0;
+
+            foreach ($this->children as $child) {
+                $this->numTestedMethods += $child->getNumTestedMethods();
+            }
+        }
+
+        return $this->numTestedMethods;
+    }
+
+    /**
+     * Returns the number of functions.
+     *
+     * @return integer
+     */
+    public function getNumFunctions()
+    {
+        if ($this->numFunctions == -1) {
+            $this->numFunctions = 0;
+
+            foreach ($this->children as $child) {
+                $this->numFunctions += $child->getNumFunctions();
+            }
+        }
+
+        return $this->numFunctions;
+    }
+
+    /**
+     * Returns the number of tested functions.
+     *
+     * @return integer
+     */
+    public function getNumTestedFunctions()
+    {
+        if ($this->numTestedFunctions == -1) {
+            $this->numTestedFunctions = 0;
+
+            foreach ($this->children as $child) {
+                $this->numTestedFunctions += $child->getNumTestedFunctions();
+            }
+        }
+
+        return $this->numTestedFunctions;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/File.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/File.php
new file mode 100644
index 0000000..44e4783
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/File.php
@@ -0,0 +1,721 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Represents a file in the code coverage information tree.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node
+{
+    /**
+     * @var array
+     */
+    protected $coverageData;
+
+    /**
+     * @var array
+     */
+    protected $testData;
+
+    /**
+     * @var array
+     */
+    protected $ignoredLines;
+
+    /**
+     * @var integer
+     */
+    protected $numExecutableLines = 0;
+
+    /**
+     * @var integer
+     */
+    protected $numExecutedLines = 0;
+
+    /**
+     * @var array
+     */
+    protected $classes = array();
+
+    /**
+     * @var array
+     */
+    protected $traits = array();
+
+    /**
+     * @var array
+     */
+    protected $functions = array();
+
+    /**
+     * @var array
+     */
+    protected $linesOfCode = array();
+
+    /**
+     * @var integer
+     */
+    protected $numTestedTraits = 0;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedClasses = 0;
+
+    /**
+     * @var integer
+     */
+    protected $numMethods = NULL;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedMethods = NULL;
+
+    /**
+     * @var integer
+     */
+    protected $numTestedFunctions = NULL;
+
+    /**
+     * @var array
+     */
+    protected $startLines = array();
+
+    /**
+     * @var array
+     */
+    protected $endLines = array();
+
+    /**
+     * @var boolean
+     */
+    protected $cacheTokens;
+
+    /**
+     * Constructor.
+     *
+     * @param  string                       $name
+     * @param  PHP_CodeCoverage_Report_Node $parent
+     * @param  array                        $coverageData
+     * @param  array                        $testData
+     * @param  boolean                      $cacheTokens
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens)
+    {
+        if (!is_bool($cacheTokens)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'boolean'
+            );
+        }
+
+        parent::__construct($name, $parent);
+
+        $this->coverageData = $coverageData;
+        $this->testData     = $testData;
+        $this->ignoredLines = PHP_CodeCoverage_Util::getLinesToBeIgnored(
+                                $this->getPath(), $cacheTokens
+                              );
+        $this->cacheTokens  = $cacheTokens;
+
+        $this->calculateStatistics();
+    }
+
+    /**
+     * Returns the number of files in/under this node.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return 1;
+    }
+
+    /**
+     * Returns the code coverage data of this node.
+     *
+     * @return array
+     */
+    public function getCoverageData()
+    {
+        return $this->coverageData;
+    }
+
+    /**
+     * Returns the test data of this node.
+     *
+     * @return array
+     */
+    public function getTestData()
+    {
+        return $this->testData;
+    }
+
+    /**
+     * @return array
+     */
+    public function getIgnoredLines()
+    {
+        return $this->ignoredLines;
+    }
+
+    /**
+     * Returns the classes of this node.
+     *
+     * @return array
+     */
+    public function getClasses()
+    {
+        return $this->classes;
+    }
+
+    /**
+     * Returns the traits of this node.
+     *
+     * @return array
+     */
+    public function getTraits()
+    {
+        return $this->traits;
+    }
+
+    /**
+     * Returns the functions of this node.
+     *
+     * @return array
+     */
+    public function getFunctions()
+    {
+        return $this->functions;
+    }
+
+    /**
+     * Returns the LOC/CLOC/NCLOC of this node.
+     *
+     * @return array
+     */
+    public function getLinesOfCode()
+    {
+        return $this->linesOfCode;
+    }
+
+    /**
+     * Returns the number of executable lines.
+     *
+     * @return integer
+     */
+    public function getNumExecutableLines()
+    {
+        return $this->numExecutableLines;
+    }
+
+    /**
+     * Returns the number of executed lines.
+     *
+     * @return integer
+     */
+    public function getNumExecutedLines()
+    {
+        return $this->numExecutedLines;
+    }
+
+    /**
+     * Returns the number of classes.
+     *
+     * @return integer
+     */
+    public function getNumClasses()
+    {
+        return count($this->classes);
+    }
+
+    /**
+     * Returns the number of tested classes.
+     *
+     * @return integer
+     */
+    public function getNumTestedClasses()
+    {
+        return $this->numTestedClasses;
+    }
+
+    /**
+     * Returns the number of traits.
+     *
+     * @return integer
+     */
+    public function getNumTraits()
+    {
+        return count($this->traits);
+    }
+
+    /**
+     * Returns the number of tested traits.
+     *
+     * @return integer
+     */
+    public function getNumTestedTraits()
+    {
+        return $this->numTestedTraits;
+    }
+
+    /**
+     * Returns the number of methods.
+     *
+     * @return integer
+     */
+    public function getNumMethods()
+    {
+        if ($this->numMethods === NULL) {
+            $this->numMethods = 0;
+
+            foreach ($this->classes as $class) {
+                foreach ($class['methods'] as $method) {
+                    if ($method['executableLines'] > 0) {
+                        $this->numMethods++;
+                    }
+                }
+            }
+
+            foreach ($this->traits as $trait) {
+                foreach ($trait['methods'] as $method) {
+                    if ($method['executableLines'] > 0) {
+                        $this->numMethods++;
+                    }
+                }
+            }
+        }
+
+        return $this->numMethods;
+    }
+
+    /**
+     * Returns the number of tested methods.
+     *
+     * @return integer
+     */
+    public function getNumTestedMethods()
+    {
+        if ($this->numTestedMethods === NULL) {
+            $this->numTestedMethods = 0;
+
+            foreach ($this->classes as $class) {
+                foreach ($class['methods'] as $method) {
+                    if ($method['executableLines'] > 0 &&
+                        $method['coverage'] == 100) {
+                        $this->numTestedMethods++;
+                    }
+                }
+            }
+
+            foreach ($this->traits as $trait) {
+                foreach ($trait['methods'] as $method) {
+                    if ($method['executableLines'] > 0 &&
+                        $method['coverage'] == 100) {
+                        $this->numTestedMethods++;
+                    }
+                }
+            }
+        }
+
+        return $this->numTestedMethods;
+    }
+
+    /**
+     * Returns the number of functions.
+     *
+     * @return integer
+     */
+    public function getNumFunctions()
+    {
+        return count($this->functions);
+    }
+
+    /**
+     * Returns the number of tested functions.
+     *
+     * @return integer
+     */
+    public function getNumTestedFunctions()
+    {
+        if ($this->numTestedFunctions === NULL) {
+            $this->numTestedFunctions = 0;
+
+            foreach ($this->functions as $function) {
+                if ($function['executableLines'] > 0 &&
+                    $function['coverage'] == 100) {
+                    $this->numTestedFunctions++;
+                }
+            }
+        }
+
+        return $this->numTestedFunctions;
+    }
+
+    /**
+     * Calculates coverage statistics for the file.
+     */
+    protected function calculateStatistics()
+    {
+        if ($this->cacheTokens) {
+            $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath());
+        } else {
+            $tokens = new PHP_Token_Stream($this->getPath());
+        }
+
+        $this->processClasses($tokens);
+        $this->processTraits($tokens);
+        $this->processFunctions($tokens);
+        $this->linesOfCode = $tokens->getLinesOfCode();
+        unset($tokens);
+
+        for ($lineNumber = 1; $lineNumber <= $this->linesOfCode['loc']; $lineNumber++) {
+            if (isset($this->startLines[$lineNumber])) {
+                // Start line of a class.
+                if (isset($this->startLines[$lineNumber]['className'])) {
+                    $currentClass = &$this->startLines[$lineNumber];
+                }
+
+                // Start line of a trait.
+                else if (isset($this->startLines[$lineNumber]['traitName'])) {
+                    $currentTrait = &$this->startLines[$lineNumber];
+                }
+
+                // Start line of a method.
+                else if (isset($this->startLines[$lineNumber]['methodName'])) {
+                    $currentMethod = &$this->startLines[$lineNumber];
+                }
+
+                // Start line of a function.
+                else if (isset($this->startLines[$lineNumber]['functionName'])) {
+                    $currentFunction = &$this->startLines[$lineNumber];
+                }
+            }
+
+            if (!isset($this->ignoredLines[$lineNumber]) &&
+                isset($this->coverageData[$lineNumber]) &&
+                $this->coverageData[$lineNumber] !== NULL) {
+                if (isset($currentClass)) {
+                    $currentClass['executableLines']++;
+                }
+
+                if (isset($currentTrait)) {
+                    $currentTrait['executableLines']++;
+                }
+
+                if (isset($currentMethod)) {
+                    $currentMethod['executableLines']++;
+                }
+
+                if (isset($currentFunction)) {
+                    $currentFunction['executableLines']++;
+                }
+
+                $this->numExecutableLines++;
+
+                if (count($this->coverageData[$lineNumber]) > 0 ||
+                    isset($this->ignoredLines[$lineNumber])) {
+                    if (isset($currentClass)) {
+                        $currentClass['executedLines']++;
+                    }
+
+                    if (isset($currentTrait)) {
+                        $currentTrait['executedLines']++;
+                    }
+
+                    if (isset($currentMethod)) {
+                        $currentMethod['executedLines']++;
+                    }
+
+                    if (isset($currentFunction)) {
+                        $currentFunction['executedLines']++;
+                    }
+
+                    $this->numExecutedLines++;
+                }
+            }
+
+            if (isset($this->endLines[$lineNumber])) {
+                // End line of a class.
+                if (isset($this->endLines[$lineNumber]['className'])) {
+                    unset($currentClass);
+                }
+
+                // End line of a trait.
+                else if (isset($this->endLines[$lineNumber]['traitName'])) {
+                    unset($currentTrait);
+                }
+
+                // End line of a method.
+                else if (isset($this->endLines[$lineNumber]['methodName'])) {
+                    unset($currentMethod);
+                }
+
+                // End line of a function.
+                else if (isset($this->endLines[$lineNumber]['functionName'])) {
+                    unset($currentFunction);
+                }
+            }
+        }
+
+        foreach ($this->traits as &$trait) {
+            foreach ($trait['methods'] as &$method) {
+                if ($method['executableLines'] > 0) {
+                    $method['coverage'] = ($method['executedLines'] /
+                                           $method['executableLines']) * 100;
+                } else {
+                    $method['coverage'] = 100;
+                }
+
+                $method['crap'] = $this->crap(
+                  $method['ccn'], $method['coverage']
+                );
+
+                $trait['ccn'] += $method['ccn'];
+            }
+
+            if ($trait['executableLines'] > 0) {
+                $trait['coverage'] = ($trait['executedLines'] /
+                                      $trait['executableLines']) * 100;
+            } else {
+                $trait['coverage'] = 100;
+            }
+
+            if ($trait['coverage'] == 100) {
+                $this->numTestedClasses++;
+            }
+
+            $trait['crap'] = $this->crap(
+              $trait['ccn'], $trait['coverage']
+            );
+        }
+
+        foreach ($this->classes as &$class) {
+            foreach ($class['methods'] as &$method) {
+                if ($method['executableLines'] > 0) {
+                    $method['coverage'] = ($method['executedLines'] /
+                                           $method['executableLines']) * 100;
+                } else {
+                    $method['coverage'] = 100;
+                }
+
+                $method['crap'] = $this->crap(
+                  $method['ccn'], $method['coverage']
+                );
+
+                $class['ccn'] += $method['ccn'];
+            }
+
+            if ($class['executableLines'] > 0) {
+                $class['coverage'] = ($class['executedLines'] /
+                                      $class['executableLines']) * 100;
+            } else {
+                $class['coverage'] = 100;
+            }
+
+            if ($class['coverage'] == 100) {
+                $this->numTestedClasses++;
+            }
+
+            $class['crap'] = $this->crap(
+              $class['ccn'], $class['coverage']
+            );
+        }
+    }
+
+    /**
+     * @param PHP_Token_Stream $tokens
+     */
+    protected function processClasses(PHP_Token_Stream $tokens)
+    {
+        $classes = $tokens->getClasses();
+        unset($tokens);
+
+        $link = $this->getId() . '.html#';
+
+        foreach ($classes as $className => $class) {
+            $this->classes[$className] = array(
+              'className'       => $className,
+              'methods'         => array(),
+              'startLine'       => $class['startLine'],
+              'executableLines' => 0,
+              'executedLines'   => 0,
+              'ccn'             => 0,
+              'coverage'        => 0,
+              'crap'            => 0,
+              'package'         => $class['package'],
+              'link'            => $link . $class['startLine']
+            );
+
+            $this->startLines[$class['startLine']] = &$this->classes[$className];
+            $this->endLines[$class['endLine']]     = &$this->classes[$className];
+
+            foreach ($class['methods'] as $methodName => $method) {
+                $this->classes[$className]['methods'][$methodName] = array(
+                  'methodName'      => $methodName,
+                  'signature'       => $method['signature'],
+                  'startLine'       => $method['startLine'],
+                  'endLine'         => $method['endLine'],
+                  'executableLines' => 0,
+                  'executedLines'   => 0,
+                  'ccn'             => $method['ccn'],
+                  'coverage'        => 0,
+                  'crap'            => 0,
+                  'link'            => $link . $method['startLine']
+                );
+
+                $this->startLines[$method['startLine']] = &$this->classes[$className]['methods'][$methodName];
+                $this->endLines[$method['endLine']]     = &$this->classes[$className]['methods'][$methodName];
+            }
+        }
+    }
+
+    /**
+     * @param PHP_Token_Stream $tokens
+     */
+    protected function processTraits(PHP_Token_Stream $tokens)
+    {
+        $traits = $tokens->getTraits();
+        unset($tokens);
+
+        $link = $this->getId() . '.html#';
+
+        foreach ($traits as $traitName => $trait) {
+            $this->traits[$traitName] = array(
+              'traitName'       => $traitName,
+              'methods'         => array(),
+              'startLine'       => $trait['startLine'],
+              'executableLines' => 0,
+              'executedLines'   => 0,
+              'ccn'             => 0,
+              'coverage'        => 0,
+              'crap'            => 0,
+              'package'         => $trait['package'],
+              'link'            => $link . $trait['startLine']
+            );
+
+            $this->startLines[$trait['startLine']] = &$this->traits[$traitName];
+            $this->endLines[$trait['endLine']]     = &$this->traits[$traitName];
+
+            foreach ($trait['methods'] as $methodName => $method) {
+                $this->traits[$traitName]['methods'][$methodName] = array(
+                  'methodName'      => $methodName,
+                  'signature'       => $method['signature'],
+                  'startLine'       => $method['startLine'],
+                  'endLine'         => $method['endLine'],
+                  'executableLines' => 0,
+                  'executedLines'   => 0,
+                  'ccn'             => $method['ccn'],
+                  'coverage'        => 0,
+                  'crap'            => 0,
+                  'link'            => $link . $method['startLine']
+                );
+
+                $this->startLines[$method['startLine']] = &$this->traits[$traitName]['methods'][$methodName];
+                $this->endLines[$method['endLine']]     = &$this->traits[$traitName]['methods'][$methodName];
+            }
+        }
+    }
+
+    /**
+     * @param PHP_Token_Stream $tokens
+     */
+    protected function processFunctions(PHP_Token_Stream $tokens)
+    {
+        $functions = $tokens->getFunctions();
+        unset($tokens);
+
+        $link = $this->getId() . '.html#';
+
+        foreach ($functions as $functionName => $function) {
+            $this->functions[$functionName] = array(
+              'functionName'    => $functionName,
+              'signature'       => $function['signature'],
+              'startLine'       => $function['startLine'],
+              'executableLines' => 0,
+              'executedLines'   => 0,
+              'ccn'             => $function['ccn'],
+              'coverage'        => 0,
+              'crap'            => 0,
+              'link'            => $link . $function['startLine']
+            );
+
+            $this->startLines[$function['startLine']] = &$this->functions[$functionName];
+            $this->endLines[$function['endLine']]     = &$this->functions[$functionName];
+        }
+    }
+
+    /**
+     * Calculates the Change Risk Anti-Patterns (CRAP) index for a unit of code
+     * based on its cyclomatic complexity and percentage of code coverage.
+     *
+     * @param  integer $ccn
+     * @param  float   $coverage
+     * @return string
+     * @since  Method available since Release 1.2.0
+     */
+    protected function crap($ccn, $coverage)
+    {
+        if ($coverage == 0) {
+            return (string)pow($ccn, 2) + $ccn;
+        }
+
+        if ($coverage >= 95) {
+            return (string)$ccn;
+        }
+
+        return sprintf(
+          '%01.2F', pow($ccn, 2) * pow(1 - $coverage/100, 3) + $ccn
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Iterator.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Iterator.php
new file mode 100644
index 0000000..e8e9740
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Node/Iterator.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Recursive iterator for PHP_CodeCoverage_Report_Node object graphs.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_Node_Iterator implements RecursiveIterator
+{
+    /**
+     * @var integer
+     */
+    protected $position;
+
+    /**
+     * @var PHP_CodeCoverage_Report_Node[]
+     */
+    protected $nodes;
+
+    /**
+     * Constructor.
+     *
+     * @param PHP_CodeCoverage_Report_Node_Directory $node
+     */
+    public function __construct(PHP_CodeCoverage_Report_Node_Directory $node)
+    {
+        $this->nodes = $node->getChildNodes();
+    }
+
+    /**
+     * Rewinds the Iterator to the first element.
+     *
+     */
+    public function rewind()
+    {
+        $this->position = 0;
+    }
+
+    /**
+     * Checks if there is a current element after calls to rewind() or next().
+     *
+     * @return boolean
+     */
+    public function valid()
+    {
+        return $this->position < count($this->nodes);
+    }
+
+    /**
+     * Returns the key of the current element.
+     *
+     * @return integer
+     */
+    public function key()
+    {
+        return $this->position;
+    }
+
+    /**
+     * Returns the current element.
+     *
+     * @return PHPUnit_Framework_Test
+     */
+    public function current()
+    {
+        return $this->valid() ? $this->nodes[$this->position] : NULL;
+    }
+
+    /**
+     * Moves forward to next element.
+     *
+     */
+    public function next()
+    {
+        $this->position++;
+    }
+
+    /**
+     * Returns the sub iterator for the current element.
+     *
+     * @return PHP_CodeCoverage_Report_Node_Iterator
+     */
+    public function getChildren()
+    {
+        return new PHP_CodeCoverage_Report_Node_Iterator(
+          $this->nodes[$this->position]
+        );
+    }
+
+    /**
+     * Checks whether the current element has children.
+     *
+     * @return boolean
+     */
+    public function hasChildren()
+    {
+        return $this->nodes[$this->position] instanceof PHP_CodeCoverage_Report_Node_Directory;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/PHP.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/PHP.php
new file mode 100644
index 0000000..c3482b5
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/PHP.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Uses serialize() to write a PHP_CodeCoverage object to a file.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_PHP
+{
+    /**
+     * @param  PHP_CodeCoverage $coverage
+     * @param  string           $target
+     * @return string
+     */
+    public function process(PHP_CodeCoverage $coverage, $target = NULL)
+    {
+        $coverage = serialize($coverage);
+
+        if ($target !== NULL) {
+            return file_put_contents($target, $coverage);
+        } else {
+            return $coverage;
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Text.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Text.php
new file mode 100644
index 0000000..719991c
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Text.php
@@ -0,0 +1,278 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Generates human readable output from an PHP_CodeCoverage object.
+ *
+ * The output gets put into a text file our written to the CLI.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_Text
+{
+    protected $outputStream;
+    protected $lowUpperBound;
+    protected $highLowerBound;
+    protected $showUncoveredFiles;
+
+    protected $colors = array(
+      'green'  => "\x1b[30;42m",
+      'yellow' => "\x1b[30;43m",
+      'red'    => "\x1b[37;41m",
+      'header' => "\x1b[47;40m",
+      'reset'  => "\x1b[0m",
+      'eol'    => "\x1b[2K",
+    );
+
+    public function __construct(PHPUnit_Util_Printer $outputStream, $lowUpperBound, $highLowerBound, $showUncoveredFiles)
+    {
+        $this->outputStream       = $outputStream;
+        $this->lowUpperBound      = $lowUpperBound;
+        $this->highLowerBound     = $highLowerBound;
+        $this->showUncoveredFiles = $showUncoveredFiles;
+    }
+
+    /**
+     * @param  PHP_CodeCoverage $coverage
+     * @param  string           $target
+     * @param  string           $name
+     * @return string
+     */
+    public function process(PHP_CodeCoverage $coverage, $showColors = FALSE)
+    {
+        $output = '';
+        $report = $coverage->getReport();
+        unset($coverage);
+
+        $colors = array(
+          'header'  => '',
+          'classes' => '',
+          'methods' => '',
+          'lines'   => '',
+          'reset'   => '',
+          'eol'     => ''
+        );
+
+        if ($showColors) {
+            $colors['classes'] = $this->getCoverageColor(
+                                   $report->getNumTestedClassesAndTraits(),
+                                   $report->getNumClassesAndTraits()
+                                 );
+            $colors['methods'] = $this->getCoverageColor(
+                                   $report->getNumTestedMethods(),
+                                   $report->getNumMethods()
+                                 );
+            $colors['lines']   = $this->getCoverageColor(
+                                   $report->getNumExecutedLines(),
+                                   $report->getNumExecutableLines()
+                                 );
+            $colors['reset']   = $this->colors['reset'];
+            $colors['header']  = $this->colors['header'];
+            $colors['eol']     = $this->colors['eol'];
+        }
+
+        $output .= PHP_EOL . PHP_EOL .
+                   $colors['header'] . 'Code Coverage Report ';
+
+        $output .= PHP_EOL .
+                   date('  Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) .
+                   PHP_EOL;
+
+        $output .= PHP_EOL . ' Summary: ' . PHP_EOL . $colors['reset']
+          . $colors['classes'] . $colors['eol'] . '  Classes: ' . PHP_CodeCoverage_Util::percent($report->getNumTestedClassesAndTraits(), $report->getNumClassesAndTraits(), TRUE)
+          . ' (' . $report->getNumTestedClassesAndTraits() . '/' . $report->getNumClassesAndTraits() . ')' . PHP_EOL . $colors ['eol']
+          . $colors['methods'] . $colors['eol'] . '  Methods: ' . PHP_CodeCoverage_Util::percent($report->getNumTestedMethods(), $report->getNumMethods(), TRUE)
+          . ' (' . $report->getNumTestedMethods() . '/' . $report->getNumMethods() . ')' . PHP_EOL . $colors ['eol']
+          . $colors['lines'] . $colors['eol'] . '  Lines:   ' . PHP_CodeCoverage_Util::percent($report->getNumExecutedLines(), $report->getNumExecutableLines(), TRUE)
+          . ' (' . $report->getNumExecutedLines() . '/' . $report->getNumExecutableLines() . ')' . PHP_EOL . $colors['reset'] . $colors ['eol'];
+
+        $classCoverage = array();
+
+        foreach ($report as $item) {
+            if (!$item instanceof PHP_CodeCoverage_Report_Node_File) {
+                continue;
+            }
+
+            $classes      = $item->getClassesAndTraits();
+            $coverage     = $item->getCoverageData();
+            $lines        = array();
+            $ignoredLines = $item->getIgnoredLines();
+
+            foreach ($classes as $className => $class) {
+                $classStatements        = 0;
+                $coveredClassStatements = 0;
+                $coveredMethods         = 0;
+
+                foreach ($class['methods'] as $method) {
+                    $methodCount        = 0;
+                    $methodLines        = 0;
+                    $methodLinesCovered = 0;
+
+                    for ($i  = $method['startLine'];
+                         $i <= $method['endLine'];
+                         $i++) {
+                        if (isset($ignoredLines[$i])) {
+                            continue;
+                        }
+
+                        $add   = TRUE;
+                        $count = 0;
+
+                        if (isset($coverage[$i])) {
+                            if ($coverage[$i] !== NULL) {
+                                $classStatements++;
+                                $methodLines++;
+                            } else {
+                                $add = FALSE;
+                            }
+
+                            $count = count($coverage[$i]);
+
+                            if ($count > 0) {
+                                $coveredClassStatements++;
+                                $methodLinesCovered++;
+                            }
+                        } else {
+                            $add = FALSE;
+                        }
+
+                        $methodCount = max($methodCount, $count);
+
+                        if ($add) {
+                            $lines[$i] = array(
+                              'count' => $count, 'type'  => 'stmt'
+                            );
+                        }
+                    }
+
+                    if ($methodCount > 0) {
+                        $coveredMethods++;
+                    }
+
+                }
+
+                if (!empty($class['package']['namespace'])) {
+                    $namespace = '\\' . $class['package']['namespace'] . '::';
+                }
+
+                else if (!empty($class['package']['fullPackage'])) {
+                    $namespace = '@' . $class['package']['fullPackage'] . '::';
+                }
+
+                else {
+                    $namespace = '';
+                }
+
+                $classCoverage[$namespace . $className] = array(
+                    'namespace'         => $namespace,
+                    'className '        => $className,
+                    'methodsCovered'    => $coveredMethods,
+                    'methodCount'       => count($class['methods']),
+                    'statementsCovered' => $coveredClassStatements,
+                    'statementCount'    => $classStatements,
+                );
+            }
+        }
+
+        ksort($classCoverage);
+
+        $methodColor = '';
+        $linesColor  = '';
+        $resetColor  = '';
+
+        foreach ($classCoverage as $fullQualifiedPath => $classInfo) {
+            if ($classInfo['statementsCovered'] != 0 ||
+                $this->showUncoveredFiles) {
+
+                if ($showColors) {
+                    $methodColor = $this->getCoverageColor($classInfo['methodsCovered'], $classInfo['methodCount']);
+                    $linesColor  = $this->getCoverageColor($classInfo['statementsCovered'], $classInfo['statementCount']);
+                    $resetColor  = $colors['reset'];
+                }
+
+                $output .= PHP_EOL . $fullQualifiedPath . PHP_EOL
+                  . '  ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' '
+                  . '  ' . $linesColor  . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor
+                ;
+            }
+        }
+
+        $this->outputStream->write($output . PHP_EOL);
+    }
+
+    protected function getCoverageColor($numberOfCoveredElements, $totalNumberOfElements)
+    {
+        $coverage = PHP_CodeCoverage_Util::percent(
+          $numberOfCoveredElements, $totalNumberOfElements
+        );
+
+        if ($coverage > $this->highLowerBound) {
+            return $this->colors['green'];
+        }
+
+        else if ($coverage > $this->lowUpperBound) {
+            return $this->colors['yellow'];
+        }
+
+        return $this->colors['red'];
+    }
+
+    protected function printCoverageCounts($numberOfCoveredElements, $totalNumberOfElements, $presicion)
+    {
+        $format = '%' . $presicion . 's';
+
+        return PHP_CodeCoverage_Util::percent(
+          $numberOfCoveredElements, $totalNumberOfElements, TRUE, TRUE
+        ) .
+        ' (' . sprintf($format, $numberOfCoveredElements) . '/' .
+        sprintf($format, $totalNumberOfElements) . ')';
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util.php
new file mode 100644
index 0000000..26a2841
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util.php
@@ -0,0 +1,268 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Utility methods.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_Util
+{
+    /**
+     * @var array
+     */
+    protected static $ignoredLines = array();
+
+    /**
+     * @var array
+     */
+    protected static $ids = array();
+
+
+    /**
+     * Returns the lines of a source file that should be ignored.
+     *
+     * @param  string  $filename
+     * @param  boolean $cacheTokens
+     * @return array
+     * @throws PHP_CodeCoverage_Exception
+     */
+    public static function getLinesToBeIgnored($filename, $cacheTokens = TRUE)
+    {
+        if (!is_string($filename)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              1, 'string'
+            );
+        }
+
+        if (!is_bool($cacheTokens)) {
+            throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
+              2, 'boolean'
+            );
+        }
+
+        if (!isset(self::$ignoredLines[$filename])) {
+            self::$ignoredLines[$filename] = array();
+            $ignore                        = FALSE;
+            $stop                          = FALSE;
+            $lines                         = file($filename);
+
+            foreach ($lines as $index => $line) {
+                if (!trim($line)) {
+                    self::$ignoredLines[$filename][$index+1] = TRUE;
+                }
+            }
+
+            if ($cacheTokens) {
+                $tokens = PHP_Token_Stream_CachingFactory::get($filename);
+            } else {
+                $tokens = new PHP_Token_Stream($filename);
+            }
+
+            $classes = array_merge($tokens->getClasses(), $tokens->getTraits());
+            $tokens  = $tokens->tokens();
+
+            foreach ($tokens as $token) {
+                switch (get_class($token)) {
+                    case 'PHP_Token_COMMENT':
+                    case 'PHP_Token_DOC_COMMENT': {
+                        $count = substr_count($token, "\n");
+                        $line  = $token->getLine();
+
+                        for ($i = $line; $i < $line + $count; $i++) {
+                            self::$ignoredLines[$filename][$i] = TRUE;
+                        }
+
+                        if ($token instanceof PHP_Token_DOC_COMMENT) {
+                            // Workaround for the fact the DOC_COMMENT token
+                            // does not include the final \n character in its
+                            // text.
+                            if (substr(trim($lines[$i-1]), -2) == '*/') {
+                                self::$ignoredLines[$filename][$i] = TRUE;
+                            }
+
+                            break;
+                        }
+
+                        $_token = trim($token);
+
+                        if ($_token == '// @codeCoverageIgnore' ||
+                            $_token == '//@codeCoverageIgnore') {
+                            $ignore = TRUE;
+                            $stop   = TRUE;
+                        }
+
+                        else if ($_token == '// @codeCoverageIgnoreStart' ||
+                                 $_token == '//@codeCoverageIgnoreStart') {
+                            $ignore = TRUE;
+                        }
+
+                        else if ($_token == '// @codeCoverageIgnoreEnd' ||
+                                 $_token == '//@codeCoverageIgnoreEnd') {
+                            $stop = TRUE;
+                        }
+                    }
+                    break;
+
+                    case 'PHP_Token_INTERFACE':
+                    case 'PHP_Token_TRAIT':
+                    case 'PHP_Token_CLASS':
+                    case 'PHP_Token_FUNCTION': {
+                        $docblock = $token->getDocblock();
+
+                        if (strpos($docblock, '@codeCoverageIgnore')) {
+                            $endLine = $token->getEndLine();
+
+                            for ($i = $token->getLine(); $i <= $endLine; $i++) {
+                                self::$ignoredLines[$filename][$i] = TRUE;
+                            }
+                        }
+
+                        else if ($token instanceof PHP_Token_INTERFACE ||
+                                 $token instanceof PHP_Token_TRAIT ||
+                                 $token instanceof PHP_Token_CLASS) {
+                            if (empty($classes[$token->getName()]['methods'])) {
+                                for ($i = $token->getLine();
+                                     $i <= $token->getEndLine();
+                                     $i++) {
+                                    self::$ignoredLines[$filename][$i] = TRUE;
+                                }
+                            } else {
+                                $firstMethod = array_shift(
+                                  $classes[$token->getName()]['methods']
+                                );
+
+                                $lastMethod = array_pop(
+                                  $classes[$token->getName()]['methods']
+                                );
+
+                                if ($lastMethod === NULL) {
+                                    $lastMethod = $firstMethod;
+                                }
+
+                                for ($i = $token->getLine();
+                                     $i < $firstMethod['startLine'];
+                                     $i++) {
+                                    self::$ignoredLines[$filename][$i] = TRUE;
+                                }
+
+                                for ($i = $token->getEndLine();
+                                     $i > $lastMethod['endLine'];
+                                     $i--) {
+                                    self::$ignoredLines[$filename][$i] = TRUE;
+                                }
+                            }
+                        }
+                    }
+                    break;
+
+                    case 'PHP_Token_INTERFACE': {
+                        $endLine = $token->getEndLine();
+
+                        for ($i = $token->getLine(); $i <= $endLine; $i++) {
+                            self::$ignoredLines[$filename][$i] = TRUE;
+                        }
+                    }
+                    break;
+
+                    case 'PHP_Token_NAMESPACE': {
+                        self::$ignoredLines[$filename][$token->getEndLine()] = TRUE;
+                    } // Intentional fallthrough
+                    case 'PHP_Token_OPEN_TAG':
+                    case 'PHP_Token_CLOSE_TAG':
+                    case 'PHP_Token_USE': {
+                        self::$ignoredLines[$filename][$token->getLine()] = TRUE;
+                    }
+                    break;
+                }
+
+                if ($ignore) {
+                    self::$ignoredLines[$filename][$token->getLine()] = TRUE;
+
+                    if ($stop) {
+                        $ignore = FALSE;
+                        $stop   = FALSE;
+                    }
+                }
+            }
+        }
+
+        return self::$ignoredLines[$filename];
+    }
+
+    /**
+     * @param  float $a
+     * @param  float $b
+     * @return float ($a / $b) * 100
+     */
+    public static function percent($a, $b, $asString = FALSE, $fixedWidth = FALSE)
+    {
+        if ($asString && $b == 0) {
+            return '';
+        }
+
+        if ($b > 0) {
+            $percent = ($a / $b) * 100;
+        } else {
+            $percent = 100;
+        }
+
+        if ($asString) {
+            if ($fixedWidth) {
+                return sprintf('%6.2F%%', $percent);
+            }
+
+            return sprintf('%01.2F%%', $percent);
+        } else {
+            return $percent;
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util/InvalidArgumentHelper.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util/InvalidArgumentHelper.php
new file mode 100644
index 0000000..94938ef
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Util/InvalidArgumentHelper.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.2.0
+ */
+
+/**
+ * Factory for PHP_CodeCoverage_Exception objects that are used to describe
+ * invalid arguments passed to a function or method.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.2.0
+ */
+class PHP_CodeCoverage_Util_InvalidArgumentHelper
+{
+    /**
+     * @param integer $argument
+     * @param string  $type
+     * @param mixed   $value
+     */
+    public static function factory($argument, $type, $value = NULL)
+    {
+        $stack = debug_backtrace(FALSE);
+
+        return new PHP_CodeCoverage_Exception(
+          sprintf(
+            'Argument #%d%sof %s::%s() must be a %s',
+            $argument,
+            $value !== NULL ? ' (' . $value . ')' : ' ',
+            $stack[1]['class'],
+            $stack[1]['function'],
+            $type
+          )
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Version.php b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Version.php
new file mode 100644
index 0000000..5eb1480
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Version.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.2.1
+ */
+
+/**
+ * 
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.2.1
+ */
+class PHP_CodeCoverage_Version
+{
+    const VERSION = '1.2.7';
+    protected static $version;
+
+    /**
+     * Returns the version of PHP_CodeCoverage.
+     *
+     * @return string
+     */
+    public static function id()
+    {
+        if (self::$version === NULL) {
+            self::$version = self::VERSION;
+
+            if (is_dir(dirname(dirname(__DIR__)) . '/.git')) {
+                $dir = getcwd();
+                chdir(__DIR__);
+                $version = exec('git describe --tags');
+                chdir($dir);
+
+                if ($version) {
+                    if (count(explode('.', self::VERSION)) == 3) {
+                        self::$version = $version;
+                    } else {
+                        $version = explode('-', $version);
+
+                        self::$version = self::VERSION . '-' . $version[2];
+                    }
+                }
+            }
+        }
+
+        return self::$version;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/README.markdown b/core/vendor/phpunit/php-code-coverage/README.markdown
new file mode 100644
index 0000000..559afa7
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/README.markdown
@@ -0,0 +1,43 @@
+PHP_CodeCoverage
+================
+
+**PHP_CodeCoverage** is a library that provides collection, processing, and rendering functionality for PHP code coverage information.
+
+Requirements
+------------
+
+* PHP_CodeCoverage 1.2 requires PHP 5.3.3 (or later) but PHP 5.4.7 (or later) is highly recommended.
+* [Xdebug](http://xdebug.org/) 2.0.5 (or later) is required but Xdebug 2.2.1 (or later) is highly recommended.
+
+Installation
+------------
+
+PHP_CodeCoverage should be installed using the PEAR Installer, the backbone of the [PHP Extension and Application Repository](http://pear.php.net/) that provides a distribution system for PHP packages.
+
+Depending on your OS distribution and/or your PHP environment, you may need to install PEAR or update your existing PEAR installation before you can proceed with the following instructions. `sudo pear upgrade PEAR` usually suffices to upgrade an existing PEAR installation. The [PEAR Manual ](http://pear.php.net/manual/en/installation.getting.php) explains how to perform a fresh installation of PEAR.
+
+The following two commands (which you may have to run as `root`) are all that is required to install PHP_CodeCoverage using the PEAR Installer:
+
+    pear config-set auto_discover 1
+    pear install pear.phpunit.de/PHP_CodeCoverage
+
+After the installation you can find the PHP_CodeCoverage source files inside your local PEAR directory; the path is usually `/usr/lib/php/PHP/CodeCoverage`.
+
+Using the PHP_CodeCoverage API
+------------------------------
+
+    <?php
+    require 'PHP/CodeCoverage/Autoload.php';
+
+    $coverage = new PHP_CodeCoverage;
+    $coverage->start('<name of test>');
+
+    // ...
+
+    $coverage->stop();
+
+    $writer = new PHP_CodeCoverage_Report_Clover;
+    $writer->process($coverage, '/tmp/clover.xml');
+
+    $writer = new PHP_CodeCoverage_Report_HTML;
+    $writer->process($coverage, '/tmp/code-coverage-report');
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/FilterTest.php b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/FilterTest.php
new file mode 100644
index 0000000..f90e518
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/FilterTest.php
@@ -0,0 +1,298 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+/**
+ * Tests for the PHP_CodeCoverage_Filter class.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_FilterTest extends PHPUnit_Framework_TestCase
+{
+    protected $filter;
+    protected $files;
+
+    protected function setUp()
+    {
+        $this->filter = unserialize('O:23:"PHP_CodeCoverage_Filter":0:{}');
+
+        $this->files = array(
+          TEST_FILES_PATH . 'BankAccount.php',
+          TEST_FILES_PATH . 'BankAccountTest.php',
+          TEST_FILES_PATH . 'CoverageClassExtendedTest.php',
+          TEST_FILES_PATH . 'CoverageClassTest.php',
+          TEST_FILES_PATH . 'CoverageFunctionTest.php',
+          TEST_FILES_PATH . 'CoverageMethodOneLineAnnotationTest.php',
+          TEST_FILES_PATH . 'CoverageMethodTest.php',
+          TEST_FILES_PATH . 'CoverageNoneTest.php',
+          TEST_FILES_PATH . 'CoverageNotPrivateTest.php',
+          TEST_FILES_PATH . 'CoverageNotProtectedTest.php',
+          TEST_FILES_PATH . 'CoverageNotPublicTest.php',
+          TEST_FILES_PATH . 'CoverageNothingTest.php',
+          TEST_FILES_PATH . 'CoveragePrivateTest.php',
+          TEST_FILES_PATH . 'CoverageProtectedTest.php',
+          TEST_FILES_PATH . 'CoveragePublicTest.php',
+          TEST_FILES_PATH . 'CoverageTwoDefaultClassAnnotations.php',
+          TEST_FILES_PATH . 'CoveredClass.php',
+          TEST_FILES_PATH . 'CoveredFunction.php',
+          TEST_FILES_PATH . 'NamespaceCoverageClassExtendedTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageClassTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageCoversClassPublicTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageCoversClassTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageMethodTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageNotPrivateTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageNotProtectedTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageNotPublicTest.php',
+          TEST_FILES_PATH . 'NamespaceCoveragePrivateTest.php',
+          TEST_FILES_PATH . 'NamespaceCoverageProtectedTest.php',
+          TEST_FILES_PATH . 'NamespaceCoveragePublicTest.php',
+          TEST_FILES_PATH . 'NamespaceCoveredClass.php',
+          TEST_FILES_PATH . 'NotExistingCoveredElementTest.php',
+          TEST_FILES_PATH . 'source_with_ignore.php',
+          TEST_FILES_PATH . 'source_with_namespace.php',
+          TEST_FILES_PATH . 'source_with_oneline_annotations.php',
+          TEST_FILES_PATH . 'source_without_ignore.php',
+          TEST_FILES_PATH . 'source_without_namespace.php'
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::addFileToBlacklist
+     * @covers PHP_CodeCoverage_Filter::getBlacklist
+     */
+    public function testAddingAFileToTheBlacklistWorks()
+    {
+        $this->filter->addFileToBlacklist($this->files[0]);
+
+        $this->assertEquals(
+          array($this->files[0]), $this->filter->getBlacklist()
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::removeFileFromBlacklist
+     * @covers PHP_CodeCoverage_Filter::getBlacklist
+     */
+    public function testRemovingAFileFromTheBlacklistWorks()
+    {
+        $this->filter->addFileToBlacklist($this->files[0]);
+        $this->filter->removeFileFromBlacklist($this->files[0]);
+
+        $this->assertEquals(array(), $this->filter->getBlacklist());
+    }
+
+    /**
+     * @covers  PHP_CodeCoverage_Filter::addDirectoryToBlacklist
+     * @covers  PHP_CodeCoverage_Filter::getBlacklist
+     * @depends testAddingAFileToTheBlacklistWorks
+     */
+    public function testAddingADirectoryToTheBlacklistWorks()
+    {
+        $this->filter->addDirectoryToBlacklist(TEST_FILES_PATH);
+
+        $blacklist = $this->filter->getBlacklist();
+        sort($blacklist);
+
+        $this->assertEquals($this->files, $blacklist);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::addFilesToBlacklist
+     * @covers PHP_CodeCoverage_Filter::getBlacklist
+     */
+    public function testAddingFilesToTheBlacklistWorks()
+    {
+        $facade = new File_Iterator_Facade;
+        $files  = $facade->getFilesAsArray(
+          TEST_FILES_PATH, $suffixes = '.php'
+        );
+
+        $this->filter->addFilesToBlacklist($files);
+
+        $blacklist = $this->filter->getBlacklist();
+        sort($blacklist);
+
+        $this->assertEquals($this->files, $blacklist);
+    }
+
+    /**
+     * @covers  PHP_CodeCoverage_Filter::removeDirectoryFromBlacklist
+     * @covers  PHP_CodeCoverage_Filter::getBlacklist
+     * @depends testAddingADirectoryToTheBlacklistWorks
+     */
+    public function testRemovingADirectoryFromTheBlacklistWorks()
+    {
+        $this->filter->addDirectoryToBlacklist(TEST_FILES_PATH);
+        $this->filter->removeDirectoryFromBlacklist(TEST_FILES_PATH);
+
+        $this->assertEquals(array(), $this->filter->getBlacklist());
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::addFileToWhitelist
+     * @covers PHP_CodeCoverage_Filter::getWhitelist
+     */
+    public function testAddingAFileToTheWhitelistWorks()
+    {
+        $this->filter->addFileToWhitelist($this->files[0]);
+
+        $this->assertEquals(
+          array($this->files[0]), $this->filter->getWhitelist()
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::removeFileFromWhitelist
+     * @covers PHP_CodeCoverage_Filter::getWhitelist
+     */
+    public function testRemovingAFileFromTheWhitelistWorks()
+    {
+        $this->filter->addFileToWhitelist($this->files[0]);
+        $this->filter->removeFileFromWhitelist($this->files[0]);
+
+        $this->assertEquals(array(), $this->filter->getWhitelist());
+    }
+
+    /**
+     * @covers  PHP_CodeCoverage_Filter::addDirectoryToWhitelist
+     * @covers  PHP_CodeCoverage_Filter::getWhitelist
+     * @depends testAddingAFileToTheWhitelistWorks
+     */
+    public function testAddingADirectoryToTheWhitelistWorks()
+    {
+        $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH);
+
+        $whitelist = $this->filter->getWhitelist();
+        sort($whitelist);
+
+        $this->assertEquals($this->files, $whitelist);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::addFilesToWhitelist
+     * @covers PHP_CodeCoverage_Filter::getBlacklist
+     */
+    public function testAddingFilesToTheWhitelistWorks()
+    {
+        $facade = new File_Iterator_Facade;
+        $files  = $facade->getFilesAsArray(
+          TEST_FILES_PATH, $suffixes = '.php'
+        );
+
+        $this->filter->addFilesToWhitelist($files);
+
+        $whitelist = $this->filter->getWhitelist();
+        sort($whitelist);
+
+        $this->assertEquals($this->files, $whitelist);
+    }
+
+    /**
+     * @covers  PHP_CodeCoverage_Filter::removeDirectoryFromWhitelist
+     * @covers  PHP_CodeCoverage_Filter::getWhitelist
+     * @depends testAddingADirectoryToTheWhitelistWorks
+     */
+    public function testRemovingADirectoryFromTheWhitelistWorks()
+    {
+        $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH);
+        $this->filter->removeDirectoryFromWhitelist(TEST_FILES_PATH);
+
+        $this->assertEquals(array(), $this->filter->getWhitelist());
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::isFile
+     */
+    public function testIsFile()
+    {
+        $this->assertFalse($this->filter->isFile('eval()\'d code'));
+        $this->assertFalse($this->filter->isFile('runtime-created function'));
+        $this->assertFalse($this->filter->isFile('assert code'));
+        $this->assertFalse($this->filter->isFile('regexp code'));
+        $this->assertTrue($this->filter->isFile('filename'));
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::isFiltered
+     */
+    public function testBlacklistedFileIsFiltered()
+    {
+        $this->filter->addFileToBlacklist($this->files[0]);
+        $this->assertTrue($this->filter->isFiltered($this->files[0]));
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::isFiltered
+     */
+    public function testWhitelistedFileIsNotFiltered()
+    {
+        $this->filter->addFileToWhitelist($this->files[0]);
+        $this->assertFalse($this->filter->isFiltered($this->files[0]));
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Filter::isFiltered
+     */
+    public function testNotWhitelistedFileIsFiltered()
+    {
+        $this->filter->addFileToWhitelist($this->files[0]);
+        $this->assertTrue($this->filter->isFiltered($this->files[1]));
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/Report/CloverTest.php b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/Report/CloverTest.php
new file mode 100644
index 0000000..1008ebc
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/Report/CloverTest.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once TEST_FILES_PATH . '../TestCase.php';
+
+/**
+ * Tests for the PHP_CodeCoverage_Report_Clover class.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_Report_CloverTest extends PHP_CodeCoverage_TestCase
+{
+    /**
+     * @covers PHP_CodeCoverage_Report_Clover
+     */
+    public function testCloverForBankAccountTest()
+    {
+        $clover = new PHP_CodeCoverage_Report_Clover;
+
+        $this->assertStringMatchesFormatFile(
+          TEST_FILES_PATH . 'BankAccount-clover.xml',
+          $clover->process($this->getCoverageForBankAccount(), NULL, 'BankAccount')
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Report_Clover
+     */
+    public function testCloverForFileWithIgnoredLines()
+    {
+        $clover = new PHP_CodeCoverage_Report_Clover;
+
+        $this->assertStringMatchesFormatFile(
+          TEST_FILES_PATH . 'ignored-lines-clover.xml',
+          $clover->process($this->getCoverageForFileWithIgnoredLines())
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/Report/FactoryTest.php b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/Report/FactoryTest.php
new file mode 100644
index 0000000..4ff2c09
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/Report/FactoryTest.php
@@ -0,0 +1,263 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.1.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(dirname(dirname(__FILE__)))) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once TEST_FILES_PATH . '../TestCase.php';
+
+/**
+ * Tests for the PHP_CodeCoverage_Report_Factory class.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.1.0
+ */
+class PHP_CodeCoverage_Report_FactoryTest extends PHP_CodeCoverage_TestCase
+{
+    protected $factory;
+
+    protected function setUp()
+    {
+        $this->factory = new PHP_CodeCoverage_Report_Factory;
+    }
+
+    public function testSomething()
+    {
+        $root = $this->getCoverageForBankAccount()->getReport();
+
+        $expectedPath = rtrim(TEST_FILES_PATH, DIRECTORY_SEPARATOR);
+        $this->assertEquals($expectedPath, $root->getName());
+        $this->assertEquals($expectedPath, $root->getPath());
+        $this->assertEquals(10, $root->getNumExecutableLines());
+        $this->assertEquals(5, $root->getNumExecutedLines());
+        $this->assertEquals(1, $root->getNumClasses());
+        $this->assertEquals(0, $root->getNumTestedClasses());
+        $this->assertEquals(4, $root->getNumMethods());
+        $this->assertEquals(3, $root->getNumTestedMethods());
+        $this->assertEquals('0.00%', $root->getTestedClassesPercent());
+        $this->assertEquals('75.00%', $root->getTestedMethodsPercent());
+        $this->assertEquals('50.00%', $root->getLineExecutedPercent());
+        $this->assertEquals(0, $root->getNumFunctions());
+        $this->assertEquals(0, $root->getNumTestedFunctions());
+        $this->assertNull($root->getParent());
+        $this->assertEquals(array(), $root->getDirectories());
+        #$this->assertEquals(array(), $root->getFiles());
+        #$this->assertEquals(array(), $root->getChildNodes());
+
+        $this->assertEquals(
+          array(
+            'BankAccount' => array(
+              'methods' => array(
+                'getBalance' => array(
+                  'signature' => 'getBalance()',
+                  'startLine' => 6,
+                  'endLine' => 9,
+                  'executableLines' => 1,
+                  'executedLines' => 1,
+                  'ccn' => 1,
+                  'coverage' => 100,
+                  'crap' => '1',
+                  'link' => 'BankAccount.php.html#6',
+                  'methodName' => 'getBalance'
+                ),
+                'setBalance' => array(
+                  'signature' => 'setBalance($balance)',
+                  'startLine' => 11,
+                  'endLine' => 18,
+                  'executableLines' => 5,
+                  'executedLines' => 0,
+                  'ccn' => 2,
+                  'coverage' => 0,
+                  'crap' => 6,
+                  'link' => 'BankAccount.php.html#11',
+                  'methodName' => 'setBalance'
+                ),
+                'depositMoney' => array(
+                  'signature' => 'depositMoney($balance)',
+                  'startLine' => 20,
+                  'endLine' => 25,
+                  'executableLines' => 2,
+                  'executedLines' => 2,
+                  'ccn' => 1,
+                  'coverage' => 100,
+                  'crap' => '1',
+                  'link' => 'BankAccount.php.html#20',
+                  'methodName' => 'depositMoney'
+                ),
+                'withdrawMoney' => array(
+                  'signature' => 'withdrawMoney($balance)',
+                  'startLine' => 27,
+                  'endLine' => 32,
+                  'executableLines' => 2,
+                  'executedLines' => 2,
+                  'ccn' => 1,
+                  'coverage' => 100,
+                  'crap' => '1',
+                  'link' => 'BankAccount.php.html#27',
+                  'methodName' => 'withdrawMoney'
+                ),
+              ),
+              'startLine' => 2,
+              'executableLines' => 10,
+              'executedLines' => 5,
+              'ccn' => 5,
+              'coverage' => 50,
+              'crap' => '8.12',
+              'package' => array(
+                'namespace' => '',
+                'fullPackage' => '',
+                'category' => '',
+                'package' => '',
+                'subpackage' => ''
+              ),
+              'link' => 'BankAccount.php.html#2',
+              'className' => 'BankAccount'
+            )
+          ),
+          $root->getClasses()
+        );
+
+        $this->assertEquals(array(), $root->getFunctions());
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Report_Factory::buildDirectoryStructure
+     */
+    public function testBuildDirectoryStructure()
+    {
+        $method = new ReflectionMethod(
+          'PHP_CodeCoverage_Report_Factory', 'buildDirectoryStructure'
+        );
+
+        $method->setAccessible(TRUE);
+
+        $this->assertEquals(
+          array(
+            'src' => array(
+              'Money.php/f' => array(),
+              'MoneyBag.php/f' => array()
+            )
+          ),
+          $method->invoke(
+            $this->factory,
+            array('src/Money.php' => array(), 'src/MoneyBag.php' => array())
+          )
+        );
+    }
+
+    /**
+     * @covers       PHP_CodeCoverage_Report_Factory::reducePaths
+     * @dataProvider reducePathsProvider
+     */
+    public function testReducePaths($reducedPaths, $commonPath, $paths)
+    {
+        $method = new ReflectionMethod(
+          'PHP_CodeCoverage_Report_Factory', 'reducePaths'
+        );
+
+        $method->setAccessible(TRUE);
+
+        $_commonPath = $method->invokeArgs($this->factory, array(&$paths));
+
+        $this->assertEquals($reducedPaths, $paths);
+        $this->assertEquals($commonPath, $_commonPath);
+    }
+
+    public function reducePathsProvider()
+    {
+        return array(
+          array(
+            array(
+              'Money.php' => array(),
+              'MoneyBag.php' => array()
+            ),
+            '/home/sb/Money',
+            array(
+              '/home/sb/Money/Money.php' => array(),
+              '/home/sb/Money/MoneyBag.php' => array()
+            )
+          ),
+          array(
+            array(
+              'Money.php' => array()
+            ),
+            '/home/sb/Money/',
+            array(
+              '/home/sb/Money/Money.php' => array()
+            )
+          ),
+          array(
+            array(),
+            '.',
+            array()
+          ),
+          array(
+            array(
+              'Money.php' => array(),
+              'MoneyBag.php' => array(),
+              'Cash.phar/Cash.php' => array(),
+            ),
+            '/home/sb/Money',
+            array(
+              '/home/sb/Money/Money.php' => array(),
+              '/home/sb/Money/MoneyBag.php' => array(),
+              'phar:///home/sb/Money/Cash.phar/Cash.php' => array(),
+            ),
+          ),
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/UtilTest.php b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/UtilTest.php
new file mode 100644
index 0000000..1a0e7f5
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverage/UtilTest.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once TEST_FILES_PATH . 'CoverageClassExtendedTest.php';
+require_once TEST_FILES_PATH . 'CoverageClassTest.php';
+require_once TEST_FILES_PATH . 'CoverageFunctionTest.php';
+require_once TEST_FILES_PATH . 'CoverageMethodTest.php';
+require_once TEST_FILES_PATH . 'CoverageMethodOneLineAnnotationTest.php';
+require_once TEST_FILES_PATH . 'CoverageNoneTest.php';
+require_once TEST_FILES_PATH . 'CoverageNotPrivateTest.php';
+require_once TEST_FILES_PATH . 'CoverageNotProtectedTest.php';
+require_once TEST_FILES_PATH . 'CoverageNotPublicTest.php';
+require_once TEST_FILES_PATH . 'CoveragePrivateTest.php';
+require_once TEST_FILES_PATH . 'CoverageProtectedTest.php';
+require_once TEST_FILES_PATH . 'CoveragePublicTest.php';
+require_once TEST_FILES_PATH . 'CoverageTwoDefaultClassAnnotations.php';
+require_once TEST_FILES_PATH . 'CoveredClass.php';
+require_once TEST_FILES_PATH . 'CoveredFunction.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageClassExtendedTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageClassTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageCoversClassTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageCoversClassPublicTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageMethodTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageNotPrivateTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageNotProtectedTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageNotPublicTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoveragePrivateTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoverageProtectedTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoveragePublicTest.php';
+require_once TEST_FILES_PATH . 'NamespaceCoveredClass.php';
+require_once TEST_FILES_PATH . 'NotExistingCoveredElementTest.php';
+require_once TEST_FILES_PATH . 'CoverageNothingTest.php';
+/**
+ * Tests for the PHP_CodeCoverage_Util class.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverage_UtilTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers PHP_CodeCoverage_Util::getLinesToBeIgnored
+     */
+    public function testGetLinesToBeIgnored()
+    {
+        $this->assertEquals(
+          array(
+             1 => TRUE,
+             3 => TRUE,
+             4 => TRUE,
+             5 => TRUE,
+             7 => TRUE,
+             8 => TRUE,
+             9 => TRUE,
+            10 => TRUE,
+            11 => TRUE,
+            12 => TRUE,
+            13 => TRUE,
+            14 => TRUE,
+            15 => TRUE,
+            16 => TRUE,
+            17 => TRUE,
+            18 => TRUE,
+            19 => TRUE,
+            20 => TRUE,
+            21 => TRUE,
+            22 => TRUE,
+            23 => TRUE,
+            24 => TRUE,
+            25 => TRUE,
+            26 => TRUE,
+            27 => TRUE,
+            30 => TRUE,
+            32 => TRUE,
+            33 => TRUE,
+            34 => TRUE,
+            35 => TRUE,
+            36 => TRUE,
+            37 => TRUE,
+            38 => TRUE,
+          ),
+          PHP_CodeCoverage_Util::getLinesToBeIgnored(
+            TEST_FILES_PATH . 'source_with_ignore.php'
+          )
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Util::getLinesToBeIgnored
+     */
+    public function testGetLinesToBeIgnored2()
+    {
+        $this->assertEquals(
+          array(1 => TRUE),
+          PHP_CodeCoverage_Util::getLinesToBeIgnored(
+            TEST_FILES_PATH . 'source_without_ignore.php'
+          )
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage_Util::getLinesToBeIgnored
+     */
+    public function testGetLinesToBeIgnoredOneLineAnnotations()
+    {
+        $this->assertEquals(
+          array(
+            1 => TRUE,
+            2 => TRUE,
+            7 => TRUE,
+            3 => TRUE,
+            4 => TRUE,
+            5 => TRUE,
+            6 => TRUE,
+            8 => TRUE,
+            9 => TRUE,
+            13 => TRUE,
+          ),
+          PHP_CodeCoverage_Util::getLinesToBeIgnored(
+            TEST_FILES_PATH . 'source_with_oneline_annotations.php'
+          )
+        );
+    }
+
+
+    /**
+     * @covers PHP_CodeCoverage_Util::percent
+     */
+    public function testPercent()
+    {
+        $this->assertEquals(100, PHP_CodeCoverage_Util::percent(100, 0));
+        $this->assertEquals(100, PHP_CodeCoverage_Util::percent(100, 100));
+        $this->assertEquals(
+          '100.00%', PHP_CodeCoverage_Util::percent(100, 100, TRUE)
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverageTest.php b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverageTest.php
new file mode 100644
index 0000000..582b0a8
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/PHP/CodeCoverageTest.php
@@ -0,0 +1,503 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once TEST_FILES_PATH . '../TestCase.php';
+
+require_once TEST_FILES_PATH . 'BankAccount.php';
+require_once TEST_FILES_PATH . 'BankAccountTest.php';
+
+/**
+ * Tests for the PHP_CodeCoverage class.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_CodeCoverageTest extends PHP_CodeCoverage_TestCase
+{
+    protected $coverage;
+    protected $getLinesToBeCovered;
+
+    protected function setUp()
+    {
+        $this->coverage = new PHP_CodeCoverage;
+
+        $this->getLinesToBeCovered = new ReflectionMethod(
+          'PHP_CodeCoverage', 'getLinesToBeCovered'
+        );
+
+        $this->getLinesToBeCovered->setAccessible(TRUE);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::__construct
+     * @covers PHP_CodeCoverage::filter
+     */
+    public function testConstructor()
+    {
+        $this->assertAttributeInstanceOf(
+          'PHP_CodeCoverage_Driver_Xdebug', 'driver', $this->coverage
+        );
+
+        $this->assertAttributeInstanceOf(
+          'PHP_CodeCoverage_Filter', 'filter', $this->coverage
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::__construct
+     * @covers PHP_CodeCoverage::filter
+     */
+    public function testConstructor2()
+    {
+        $filter   = new PHP_CodeCoverage_Filter;
+        $coverage = new PHP_CodeCoverage(NULL, $filter);
+
+        $this->assertAttributeInstanceOf(
+          'PHP_CodeCoverage_Driver_Xdebug', 'driver', $coverage
+        );
+
+        $this->assertSame($filter, $coverage->filter());
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::start
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testStartThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->start(NULL, array(), NULL);
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::stop
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testStopThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->stop(NULL);
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::append
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testAppendThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->append(array(), NULL);
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::setCacheTokens
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testSetCacheTokensThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->setCacheTokens(NULL);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::setCacheTokens
+     */
+    public function testSetCacheTokens()
+    {
+        $this->coverage->setCacheTokens(TRUE);
+        $this->assertAttributeEquals(TRUE, 'cacheTokens', $this->coverage);
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::setForceCoversAnnotation
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testSetForceCoversAnnotationThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->setForceCoversAnnotation(NULL);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::setForceCoversAnnotation
+     */
+    public function testSetForceCoversAnnotation()
+    {
+        $this->coverage->setForceCoversAnnotation(TRUE);
+        $this->assertAttributeEquals(
+          TRUE, 'forceCoversAnnotation', $this->coverage
+        );
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::setProcessUncoveredFilesFromWhitelist
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testSetProcessUncoveredFilesFromWhitelistThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->setProcessUncoveredFilesFromWhitelist(NULL);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::setProcessUncoveredFilesFromWhitelist
+     */
+    public function testSetProcessUncoveredFilesFromWhitelist()
+    {
+        $this->coverage->setProcessUncoveredFilesFromWhitelist(TRUE);
+        $this->assertAttributeEquals(
+          TRUE, 'processUncoveredFilesFromWhitelist', $this->coverage
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::setMapTestClassNameToCoveredClassName
+     */
+    public function testSetMapTestClassNameToCoveredClassName()
+    {
+        $this->coverage->setMapTestClassNameToCoveredClassName(TRUE);
+        $this->assertAttributeEquals(
+          TRUE, 'mapTestClassNameToCoveredClassName', $this->coverage
+        );
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::setMapTestClassNameToCoveredClassName
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testSetMapTestClassNameToCoveredClassNameThrowsExceptionForInvalidArgument()
+    {
+        $this->coverage->setMapTestClassNameToCoveredClassName(NULL);
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::clear
+     */
+    public function testClear()
+    {
+        $this->coverage->clear();
+
+        $this->assertAttributeEquals(NULL, 'currentId', $this->coverage);
+        $this->assertAttributeEquals(array(), 'data', $this->coverage);
+        $this->assertAttributeEquals(array(), 'tests', $this->coverage);
+    }
+
+    /**
+     * Add parenthesis to the covers annotation below in a couple of different ways to make sure it
+     * works as expected
+     *
+     * @covers PHP_CodeCoverage::start()
+     * @covers PHP_CodeCoverage::stop( )
+     * @covers PHP_CodeCoverage::append ()
+     * @covers PHP_CodeCoverage::applyListsFilter ( )
+     * @covers PHP_CodeCoverage::initializeFilesThatAreSeenTheFirstTime
+     * @covers PHP_CodeCoverage::applyCoversAnnotationFilter
+     * @covers PHP_CodeCoverage::getTests
+     */
+    public function testCollect()
+    {
+        $coverage = $this->getCoverageForBankAccount();
+
+        $this->assertEquals(
+          $this->getExpectedDataArrayForBankAccount(), $coverage->getData()
+        );
+
+        $this->assertEquals(
+          array(
+            'BankAccountTest::testBalanceIsInitiallyZero' => NULL,
+            'BankAccountTest::testBalanceCannotBecomeNegative' => NULL,
+            'BankAccountTest::testBalanceCannotBecomeNegative2' => NULL,
+            'BankAccountTest::testDepositWithdrawMoney' => NULL
+          ),
+          $coverage->getTests()
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::getData
+     * @covers PHP_CodeCoverage::merge
+     */
+    public function testMerge()
+    {
+        $coverage = $this->getCoverageForBankAccountForFirstTwoTests();
+        $coverage->merge($this->getCoverageForBankAccountForLastTwoTests());
+
+        $this->assertEquals(
+          $this->getExpectedDataArrayForBankAccount(), $coverage->getData()
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::getData
+     * @covers PHP_CodeCoverage::merge
+     */
+    public function testMerge2()
+    {
+        $coverage = new PHP_CodeCoverage(
+          $this->getMock('PHP_CodeCoverage_Driver_Xdebug'),
+          new PHP_CodeCoverage_Filter
+        );
+
+        $coverage->merge($this->getCoverageForBankAccount());
+
+        $this->assertEquals(
+          $this->getExpectedDataArrayForBankAccount(), $coverage->getData()
+        );
+    }
+
+    /**
+     * @covers       PHP_CodeCoverage::getLinesToBeCovered
+     * @covers       PHP_CodeCoverage::resolveCoversToReflectionObjects
+     * @dataProvider getLinesToBeCoveredProvider
+     */
+    public function testGetLinesToBeCovered($test, $lines)
+    {
+        if (strpos($test, 'Namespace') === 0) {
+            $expected = array(
+              TEST_FILES_PATH . 'NamespaceCoveredClass.php' => $lines
+            );
+        }
+
+        else if ($test === 'CoverageNoneTest') {
+            $expected = array();
+        }
+
+        else if ($test === 'CoverageNothingTest') {
+            $expected = false;
+        }
+
+        else if ($test === 'CoverageFunctionTest') {
+            $expected = array(
+              TEST_FILES_PATH . 'CoveredFunction.php' => $lines
+            );
+        }
+
+        else {
+            $expected = array(TEST_FILES_PATH . 'CoveredClass.php' => $lines);
+        }
+
+        $this->assertEquals(
+          $expected,
+          $this->getLinesToBeCovered->invoke(
+            $this->coverage, $test, 'testSomething'
+          )
+        );
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::getLinesToBeCovered
+     * @covers            PHP_CodeCoverage::resolveCoversToReflectionObjects
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testGetLinesToBeCovered2()
+    {
+        $this->getLinesToBeCovered->invoke(
+          $this->coverage, 'NotExistingCoveredElementTest', 'testOne'
+        );
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::getLinesToBeCovered
+     * @covers            PHP_CodeCoverage::resolveCoversToReflectionObjects
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testGetLinesToBeCovered3()
+    {
+        $this->getLinesToBeCovered->invoke(
+          $this->coverage, 'NotExistingCoveredElementTest', 'testTwo'
+        );
+    }
+
+    /**
+     * @covers            PHP_CodeCoverage::getLinesToBeCovered
+     * @covers            PHP_CodeCoverage::resolveCoversToReflectionObjects
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testGetLinesToBeCovered4()
+    {
+        $this->getLinesToBeCovered->invoke(
+          $this->coverage, 'NotExistingCoveredElementTest', 'testThree'
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::getLinesToBeCovered
+     */
+    public function testGetLinesToBeCoveredSkipsNonExistantMethods()
+    {
+        $this->assertSame(
+          array(),
+          $this->getLinesToBeCovered->invoke(
+            $this->coverage,
+            'NotExistingCoveredElementTest',
+            'methodDoesNotExist'
+          )
+        );
+    }
+
+    /**
+     * @covers PHP_CodeCoverage::getLinesToBeCovered
+     * @expectedException PHP_CodeCoverage_Exception
+     */
+    public function testTwoCoversDefaultClassAnnoationsAreNotAllowed()
+    {
+        $this->getLinesToBeCovered->invoke(
+          $this->coverage,
+          'CoverageTwoDefaultClassAnnotations',
+          'testSomething'
+        );
+    }
+
+    public function getLinesToBeCoveredProvider()
+    {
+        return array(
+          array(
+            'CoverageNoneTest',
+            array()
+          ),
+          array(
+            'CoverageClassExtendedTest',
+            array_merge(range(19, 36), range(2, 17))
+          ),
+          array(
+            'CoverageClassTest',
+            range(19, 36)
+          ),
+          array(
+            'CoverageMethodTest',
+            range(31, 35)
+          ),
+          array(
+            'CoverageMethodOneLineAnnotationTest',
+            range(31, 35)
+          ),
+          array(
+            'CoverageNotPrivateTest',
+            array_merge(range(25, 29), range(31, 35))
+          ),
+          array(
+            'CoverageNotProtectedTest',
+            array_merge(range(21, 23), range(31, 35))
+          ),
+          array(
+            'CoverageNotPublicTest',
+            array_merge(range(21, 23), range(25, 29))
+          ),
+          array(
+            'CoveragePrivateTest',
+            range(21, 23)
+          ),
+          array(
+            'CoverageProtectedTest',
+            range(25, 29)
+          ),
+          array(
+            'CoveragePublicTest',
+            range(31, 35)
+          ),
+          array(
+            'CoverageFunctionTest',
+            range(2, 4)
+          ),
+          array(
+            'NamespaceCoverageClassExtendedTest',
+            array_merge(range(21, 38), range(4, 19))
+          ),
+          array(
+            'NamespaceCoverageClassTest',
+            range(21, 38)
+          ),
+          array(
+            'NamespaceCoverageMethodTest',
+            range(33, 37)
+          ),
+          array(
+            'NamespaceCoverageNotPrivateTest',
+            array_merge(range(27, 31), range(33, 37))
+          ),
+          array(
+            'NamespaceCoverageNotProtectedTest',
+            array_merge(range(23, 25), range(33, 37))
+          ),
+          array(
+            'NamespaceCoverageNotPublicTest',
+            array_merge(range(23, 25), range(27, 31))
+          ),
+          array(
+            'NamespaceCoveragePrivateTest',
+            range(23, 25)
+          ),
+          array(
+            'NamespaceCoverageProtectedTest',
+            range(27, 31)
+          ),
+          array(
+            'NamespaceCoveragePublicTest',
+            range(33, 37)
+          ),
+          array(
+            'NamespaceCoverageCoversClassTest',
+            array_merge(range(23, 25), range(27, 31), range(33, 37), range(6, 8), range(10, 13), range(15, 18))
+          ),
+          array(
+            'NamespaceCoverageCoversClassPublicTest',
+            range(33, 37)
+          ),
+          array(
+            'CoverageNothingTest',
+            false
+          )
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/TestCase.php b/core/vendor/phpunit/php-code-coverage/Tests/TestCase.php
new file mode 100644
index 0000000..6a04513
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/TestCase.php
@@ -0,0 +1,266 @@
+<?php
+/**
+ * PHP_CodeCoverage
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Abstract base class for test case classes.
+ *
+ * @category   PHP
+ * @package    CodeCoverage
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-code-coverage
+ * @since      Class available since Release 1.0.0
+ */
+abstract class PHP_CodeCoverage_TestCase extends PHPUnit_Framework_TestCase
+{
+    protected function getXdebugDataForBankAccount()
+    {
+        return array(
+          array(
+            TEST_FILES_PATH . 'BankAccount.php' => array(
+               8 =>  1,
+               9 => -2,
+              13 => -1,
+              14 => -1,
+              15 => -1,
+              16 => -1,
+              18 => -1,
+              22 => -1,
+              24 => -1,
+              25 => -2,
+              29 => -1,
+              31 => -1,
+              32 => -2
+            )
+          ),
+          array(
+            TEST_FILES_PATH . 'BankAccount.php' => array(
+               8 => 1,
+              13 => 1,
+              16 => 1,
+              29 => 1,
+            )
+          ),
+          array(
+            TEST_FILES_PATH . 'BankAccount.php' => array(
+               8 => 1,
+              13 => 1,
+              16 => 1,
+              22 => 1,
+            )
+          ),
+          array(
+            TEST_FILES_PATH . 'BankAccount.php' => array(
+               8 => 1,
+              13 => 1,
+              14 => 1,
+              15 => 1,
+              18 => 1,
+              22 => 1,
+              24 => 1,
+              29 => 1,
+              31 => 1,
+            )
+          )
+        );
+    }
+
+    protected function getCoverageForBankAccount()
+    {
+        $data = $this->getXdebugDataForBankAccount();
+
+        $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug');
+        $stub->expects($this->any())
+             ->method('stop')
+             ->will($this->onConsecutiveCalls(
+               $data[0], $data[1], $data[2], $data[3]
+             ));
+
+        $coverage = new PHP_CodeCoverage($stub, new PHP_CodeCoverage_Filter);
+
+        $coverage->start(
+          new BankAccountTest('testBalanceIsInitiallyZero'), TRUE
+        );
+        $coverage->stop();
+
+        $coverage->start(
+          new BankAccountTest('testBalanceCannotBecomeNegative')
+        );
+        $coverage->stop();
+
+        $coverage->start(
+          new BankAccountTest('testBalanceCannotBecomeNegative2')
+        );
+        $coverage->stop();
+
+        $coverage->start(
+          new BankAccountTest('testDepositWithdrawMoney')
+        );
+        $coverage->stop();
+
+        return $coverage;
+    }
+
+    protected function getCoverageForBankAccountForFirstTwoTests()
+    {
+        $data = $this->getXdebugDataForBankAccount();
+
+        $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug');
+        $stub->expects($this->any())
+             ->method('stop')
+             ->will($this->onConsecutiveCalls(
+               $data[0], $data[1]
+             ));
+
+        $coverage = new PHP_CodeCoverage($stub, new PHP_CodeCoverage_Filter);
+
+        $coverage->start(
+          new BankAccountTest('testBalanceIsInitiallyZero'), TRUE
+        );
+        $coverage->stop();
+
+        $coverage->start(
+          new BankAccountTest('testBalanceCannotBecomeNegative')
+        );
+        $coverage->stop();
+
+        return $coverage;
+    }
+
+    protected function getCoverageForBankAccountForLastTwoTests()
+    {
+        $data = $this->getXdebugDataForBankAccount();
+
+        $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug');
+        $stub->expects($this->any())
+             ->method('stop')
+             ->will($this->onConsecutiveCalls(
+               $data[2], $data[3]
+             ));
+
+        $coverage = new PHP_CodeCoverage($stub, new PHP_CodeCoverage_Filter);
+
+        $coverage->start(
+          new BankAccountTest('testBalanceCannotBecomeNegative2'), TRUE
+        );
+        $coverage->stop();
+
+        $coverage->start(
+          new BankAccountTest('testDepositWithdrawMoney')
+        );
+        $coverage->stop();
+
+        return $coverage;
+    }
+
+    protected function getExpectedDataArrayForBankAccount()
+    {
+        return array(
+          TEST_FILES_PATH . 'BankAccount.php' => array(
+            8 => array(
+              0 => 'BankAccountTest::testBalanceIsInitiallyZero',
+              1 => 'BankAccountTest::testDepositWithdrawMoney'
+            ),
+            9 => NULL,
+            13 => array(),
+            14 => array(),
+            15 => array(),
+            16 => array(),
+            18 => array(),
+            22 => array(
+              0 => 'BankAccountTest::testBalanceCannotBecomeNegative2',
+              1 => 'BankAccountTest::testDepositWithdrawMoney'
+            ),
+            24 => array(
+              0 => 'BankAccountTest::testDepositWithdrawMoney',
+            ),
+            25 => NULL,
+            29 => array(
+              0 => 'BankAccountTest::testBalanceCannotBecomeNegative',
+              1 => 'BankAccountTest::testDepositWithdrawMoney'
+            ),
+            31 => array(
+              0 => 'BankAccountTest::testDepositWithdrawMoney'
+            ),
+            32 => NULL
+          )
+        );
+    }
+
+    protected function getCoverageForFileWithIgnoredLines()
+    {
+        $coverage = new PHP_CodeCoverage(
+          $this->setUpXdebugStubForFileWithIgnoredLines(),
+          new PHP_CodeCoverage_Filter
+        );
+
+        $coverage->start('FileWithIgnoredLines', TRUE);
+        $coverage->stop();
+
+        return $coverage;
+    }
+
+    protected function setUpXdebugStubForFileWithIgnoredLines()
+    {
+        $stub = $this->getMock('PHP_CodeCoverage_Driver_Xdebug');
+        $stub->expects($this->any())
+             ->method('stop')
+             ->will($this->returnValue(
+               array(
+                 TEST_FILES_PATH . 'source_with_ignore.php' => array(
+                   2 => 1,
+                   4 => -1,
+                   6 => -1,
+                   7 => 1
+                 )
+               )
+            ));
+
+        return $stub;
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccount-clover.xml b/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccount-clover.xml
new file mode 100644
index 0000000..578a7cc
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccount-clover.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<coverage generated="%i">
+  <project timestamp="%i" name="BankAccount">
+    <file name="%s/BankAccount.php">
+      <class name="BankAccount" namespace="global">
+        <metrics methods="4" coveredmethods="3" conditionals="0" coveredconditionals="0" statements="10" coveredstatements="5" elements="14" coveredelements="8"/>
+      </class>
+      <line num="6" type="method" name="getBalance" crap="1" count="2"/>
+      <line num="8" type="stmt" count="2"/>
+      <line num="11" type="method" name="setBalance" crap="6" count="0"/>
+      <line num="13" type="stmt" count="0"/>
+      <line num="14" type="stmt" count="0"/>
+      <line num="15" type="stmt" count="0"/>
+      <line num="16" type="stmt" count="0"/>
+      <line num="18" type="stmt" count="0"/>
+      <line num="20" type="method" name="depositMoney" crap="1" count="2"/>
+      <line num="22" type="stmt" count="2"/>
+      <line num="24" type="stmt" count="1"/>
+      <line num="27" type="method" name="withdrawMoney" crap="1" count="2"/>
+      <line num="29" type="stmt" count="2"/>
+      <line num="31" type="stmt" count="1"/>
+      <metrics loc="33" ncloc="33" classes="1" methods="4" coveredmethods="3" conditionals="0" coveredconditionals="0" statements="10" coveredstatements="5" elements="14" coveredelements="8"/>
+    </file>
+    <metrics files="1" loc="33" ncloc="33" classes="1" methods="4" coveredmethods="3" conditionals="0" coveredconditionals="0" statements="10" coveredstatements="5" elements="14" coveredelements="8"/>
+  </project>
+</coverage>
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccount.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccount.php
new file mode 100644
index 0000000..4238c15
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccount.php
@@ -0,0 +1,33 @@
+<?php
+class BankAccount
+{
+    protected $balance = 0;
+
+    public function getBalance()
+    {
+        return $this->balance;
+    }
+
+    protected function setBalance($balance)
+    {
+        if ($balance >= 0) {
+            $this->balance = $balance;
+        } else {
+            throw new RuntimeException;
+        }
+    }
+
+    public function depositMoney($balance)
+    {
+        $this->setBalance($this->getBalance() + $balance);
+
+        return $this->getBalance();
+    }
+
+    public function withdrawMoney($balance)
+    {
+        $this->setBalance($this->getBalance() - $balance);
+
+        return $this->getBalance();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccountTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccountTest.php
new file mode 100644
index 0000000..827cd24
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/BankAccountTest.php
@@ -0,0 +1,70 @@
+<?php
+require_once 'BankAccount.php';
+
+class BankAccountTest extends PHPUnit_Framework_TestCase
+{
+    protected $ba;
+
+    protected function setUp()
+    {
+        $this->ba = new BankAccount;
+    }
+
+    /**
+     * @covers BankAccount::getBalance
+     */
+    public function testBalanceIsInitiallyZero()
+    {
+        $this->assertEquals(0, $this->ba->getBalance());
+    }
+
+    /**
+     * @covers BankAccount::withdrawMoney
+     */
+    public function testBalanceCannotBecomeNegative()
+    {
+        try {
+            $this->ba->withdrawMoney(1);
+        }
+
+        catch (RuntimeException $e) {
+            $this->assertEquals(0, $this->ba->getBalance());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers BankAccount::depositMoney
+     */
+    public function testBalanceCannotBecomeNegative2()
+    {
+        try {
+            $this->ba->depositMoney(-1);
+        }
+
+        catch (RuntimeException $e) {
+            $this->assertEquals(0, $this->ba->getBalance());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers BankAccount::getBalance
+     * @covers BankAccount::depositMoney
+     * @covers BankAccount::withdrawMoney
+     */
+    public function testDepositWithdrawMoney()
+    {
+        $this->assertEquals(0, $this->ba->getBalance());
+        $this->ba->depositMoney(1);
+        $this->assertEquals(1, $this->ba->getBalance());
+        $this->ba->withdrawMoney(1);
+        $this->assertEquals(0, $this->ba->getBalance());
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageClassExtendedTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageClassExtendedTest.php
new file mode 100644
index 0000000..df12d34
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageClassExtendedTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageClassExtendedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass<extended>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageClassTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageClassTest.php
new file mode 100644
index 0000000..7f569ae
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageClassTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageClassTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageFunctionTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageFunctionTest.php
new file mode 100644
index 0000000..c621fd2
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageFunctionTest.php
@@ -0,0 +1,11 @@
+<?php
+class CoverageFunctionTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers ::globalFunction
+     */
+    public function testSomething()
+    {
+        globalFunction();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageMethodOneLineAnnotationTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageMethodOneLineAnnotationTest.php
new file mode 100644
index 0000000..185cddf
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageMethodOneLineAnnotationTest.php
@@ -0,0 +1,12 @@
+<?php
+
+class CoverageMethodOneLineAnnotationTest extends PHPUnit_Framework_TestCase
+{
+    /** @covers CoveredClass::publicMethod */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
+
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageMethodTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageMethodTest.php
new file mode 100644
index 0000000..167b3db
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageMethodTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageMethodTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::publicMethod
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNoneTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNoneTest.php
new file mode 100644
index 0000000..0b414c2
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNoneTest.php
@@ -0,0 +1,9 @@
+<?php
+class CoverageNoneTest extends PHPUnit_Framework_TestCase
+{
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotPrivateTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotPrivateTest.php
new file mode 100644
index 0000000..12b56e8
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotPrivateTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageNotPrivateTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::<!private>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotProtectedTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotProtectedTest.php
new file mode 100644
index 0000000..c69d261
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotProtectedTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageNotProtectedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::<!protected>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotPublicTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotPublicTest.php
new file mode 100644
index 0000000..aebfe4b
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNotPublicTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageNotPublicTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::<!public>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNothingTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNothingTest.php
new file mode 100644
index 0000000..5d5680d
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageNothingTest.php
@@ -0,0 +1,13 @@
+<?php
+class CoverageNothingTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::publicMethod
+     * @coversNothing
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveragePrivateTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveragePrivateTest.php
new file mode 100644
index 0000000..f09560d
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveragePrivateTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoveragePrivateTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::<private>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageProtectedTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageProtectedTest.php
new file mode 100644
index 0000000..9b3acbf
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageProtectedTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoverageProtectedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::<protected>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveragePublicTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveragePublicTest.php
new file mode 100644
index 0000000..480a522
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveragePublicTest.php
@@ -0,0 +1,12 @@
+<?php
+class CoveragePublicTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers CoveredClass::<public>
+     */
+    public function testSomething()
+    {
+        $o = new CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageTwoDefaultClassAnnotations.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageTwoDefaultClassAnnotations.php
new file mode 100644
index 0000000..7c743db
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoverageTwoDefaultClassAnnotations.php
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @coversDefaultClass \NamespaceOne
+ * @coversDefaultClass \AnotherDefault\Name\Space\Does\Not\Work
+ */
+class CoverageTwoDefaultClassAnnotations
+{
+
+    /**
+     * @covers Foo\CoveredClass::<public>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveredClass.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveredClass.php
new file mode 100644
index 0000000..f382ce9
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveredClass.php
@@ -0,0 +1,36 @@
+<?php
+class CoveredParentClass
+{
+    private function privateMethod()
+    {
+    }
+
+    protected function protectedMethod()
+    {
+        $this->privateMethod();
+    }
+
+    public function publicMethod()
+    {
+        $this->protectedMethod();
+    }
+}
+
+class CoveredClass extends CoveredParentClass
+{
+    private function privateMethod()
+    {
+    }
+
+    protected function protectedMethod()
+    {
+        parent::protectedMethod();
+        $this->privateMethod();
+    }
+
+    public function publicMethod()
+    {
+        parent::publicMethod();
+        $this->protectedMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveredFunction.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveredFunction.php
new file mode 100644
index 0000000..9989eb0
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/CoveredFunction.php
@@ -0,0 +1,4 @@
+<?php
+function globalFunction()
+{
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageClassExtendedTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageClassExtendedTest.php
new file mode 100644
index 0000000..d0954cb
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageClassExtendedTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageClassExtendedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass<extended>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageClassTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageClassTest.php
new file mode 100644
index 0000000..63912c0
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageClassTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageClassTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageCoversClassPublicTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageCoversClassPublicTest.php
new file mode 100644
index 0000000..d3d48ef
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageCoversClassPublicTest.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * @coversDefaultClass \Foo\CoveredClass
+ */
+class NamespaceCoverageCoversClassPublicTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers ::publicMethod
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
+
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageCoversClassTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageCoversClassTest.php
new file mode 100644
index 0000000..79d1010
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageCoversClassTest.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * @coversDefaultClass \Foo\CoveredClass
+ */
+class NamespaceCoverageCoversClassTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers ::privateMethod
+     * @covers ::protectedMethod
+     * @covers ::publicMethod
+     * @covers \Foo\CoveredParentClass::privateMethod
+     * @covers \Foo\CoveredParentClass::protectedMethod
+     * @covers \Foo\CoveredParentClass::publicMethod
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
+
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageMethodTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageMethodTest.php
new file mode 100644
index 0000000..35dfb8b
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageMethodTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageMethodTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::publicMethod
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotPrivateTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotPrivateTest.php
new file mode 100644
index 0000000..552c9ec
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotPrivateTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageNotPrivateTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::<!private>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotProtectedTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotProtectedTest.php
new file mode 100644
index 0000000..33fc8c7
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotProtectedTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageNotProtectedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::<!protected>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotPublicTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotPublicTest.php
new file mode 100644
index 0000000..ccbc500
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageNotPublicTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageNotPublicTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::<!public>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveragePrivateTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveragePrivateTest.php
new file mode 100644
index 0000000..cce7ba9
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveragePrivateTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoveragePrivateTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::<private>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageProtectedTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageProtectedTest.php
new file mode 100644
index 0000000..dbbcc1c
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoverageProtectedTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoverageProtectedTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::<protected>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveragePublicTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveragePublicTest.php
new file mode 100644
index 0000000..bf1bff8
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveragePublicTest.php
@@ -0,0 +1,12 @@
+<?php
+class NamespaceCoveragePublicTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers Foo\CoveredClass::<public>
+     */
+    public function testSomething()
+    {
+        $o = new Foo\CoveredClass;
+        $o->publicMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveredClass.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveredClass.php
new file mode 100644
index 0000000..5bd0ddf
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NamespaceCoveredClass.php
@@ -0,0 +1,38 @@
+<?php
+namespace Foo;
+
+class CoveredParentClass
+{
+    private function privateMethod()
+    {
+    }
+
+    protected function protectedMethod()
+    {
+        $this->privateMethod();
+    }
+
+    public function publicMethod()
+    {
+        $this->protectedMethod();
+    }
+}
+
+class CoveredClass extends CoveredParentClass
+{
+    private function privateMethod()
+    {
+    }
+
+    protected function protectedMethod()
+    {
+        parent::protectedMethod();
+        $this->privateMethod();
+    }
+
+    public function publicMethod()
+    {
+        parent::publicMethod();
+        $this->protectedMethod();
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/NotExistingCoveredElementTest.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/NotExistingCoveredElementTest.php
new file mode 100644
index 0000000..be07ef4
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/NotExistingCoveredElementTest.php
@@ -0,0 +1,24 @@
+<?php
+class NotExistingCoveredElementTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers NotExistingClass
+     */
+    public function testOne()
+    {
+    }
+
+    /**
+     * @covers NotExistingClass::notExistingMethod
+     */
+    public function testTwo()
+    {
+    }
+
+    /**
+     * @covers NotExistingClass::<public>
+     */
+    public function testThree()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/ignored-lines-clover.xml b/core/vendor/phpunit/php-code-coverage/Tests/_files/ignored-lines-clover.xml
new file mode 100644
index 0000000..aeb4172
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/ignored-lines-clover.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<coverage generated="%i">
+  <project timestamp="%i">
+    <file name="%s/source_with_ignore.php">
+      <class name="Foo" namespace="global">
+        <metrics methods="1" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="0" coveredstatements="0" elements="1" coveredelements="0"/>
+      </class>
+      <class name="Bar" namespace="global">
+        <metrics methods="1" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="0" coveredstatements="0" elements="1" coveredelements="0"/>
+      </class>
+      <line num="2" type="stmt" count="1"/>
+      <line num="6" type="stmt" count="0"/>
+      <metrics loc="38" ncloc="26" classes="2" methods="0" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="2" coveredstatements="1" elements="2" coveredelements="1"/>
+    </file>
+    <metrics files="1" loc="38" ncloc="26" classes="2" methods="0" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="2" coveredstatements="1" elements="2" coveredelements="1"/>
+  </project>
+</coverage>
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_ignore.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_ignore.php
new file mode 100644
index 0000000..51a9268
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_ignore.php
@@ -0,0 +1,38 @@
+<?php
+if ($neverHappens) {
+    // @codeCoverageIgnoreStart
+    print '*';
+    // @codeCoverageIgnoreEnd
+}
+
+/**
+ * @codeCoverageIgnore
+ */
+class Foo
+{
+    public function bar()
+    {
+    }
+}
+
+class Bar
+{
+    /**
+     * @codeCoverageIgnore
+     */
+    public function foo()
+    {
+    }
+}
+
+function baz()
+{
+    print '*'; // @codeCoverageIgnore
+}
+
+interface Bor {
+
+    public function foo();
+
+}
+
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_namespace.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_namespace.php
new file mode 100644
index 0000000..4aba25a
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_namespace.php
@@ -0,0 +1,20 @@
+<?php
+namespace bar\baz;
+
+/**
+ * Represents foo.
+ */
+class Foo
+{
+}
+
+/**
+ * @param mixed $bar
+ */
+function &foo($bar)
+{
+    $baz = function() {};
+    $a   = TRUE ? TRUE : FALSE;
+    $b = "{$a}";
+    $c = "${b}";
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_oneline_annotations.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_oneline_annotations.php
new file mode 100644
index 0000000..24b653c
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_with_oneline_annotations.php
@@ -0,0 +1,13 @@
+<?php
+
+/** Docblock */
+interface {
+    public function bar();
+}
+
+class Foo
+{
+    public function bar()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/source_without_ignore.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_without_ignore.php
new file mode 100644
index 0000000..be4e836
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_without_ignore.php
@@ -0,0 +1,4 @@
+<?php
+if ($neverHappens) {
+    print '*';
+}
diff --git a/core/vendor/phpunit/php-code-coverage/Tests/_files/source_without_namespace.php b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_without_namespace.php
new file mode 100644
index 0000000..4a52ade
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/Tests/_files/source_without_namespace.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Represents foo.
+ */
+class Foo
+{
+}
+
+/**
+ * @param mixed $bar
+ */
+function &foo($bar)
+{
+    $baz = function() {};
+    $a   = TRUE ? TRUE : FALSE;
+    $b = "{$a}";
+    $c = "${b}";
+}
diff --git a/core/vendor/phpunit/php-code-coverage/build.xml b/core/vendor/phpunit/php-code-coverage/build.xml
new file mode 100644
index 0000000..bace8af
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/build.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="PHP_CodeCoverage" default="build">
+ <property name="php" value="php"/>
+ <property name="phpunit" value="phpunit"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpunit,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpunit,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="PHP/CodeCoverage/Autoload.php" />
+   <arg value="--template" />
+   <arg path="PHP/CodeCoverage/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="            " />
+   <arg path="PHP" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/PHP">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHP" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHP" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHP" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHP" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <condition property="phpunit_cmd" value="${php} ${phpunit}" else="${phpunit}">
+   <not>
+    <equals arg1="${phpunit}" arg2="phpunit" />
+   </not>
+  </condition>
+
+  <exec executable="${phpunit_cmd}" failonerror="true"/>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/PHP" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/php-code-coverage/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/php-code-coverage/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..bf9d520
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          '}EOLelse if (...) {EOL',
+          '}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/php-code-coverage/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-code-coverage/build/PHPCS/ruleset.xml b/core/vendor/phpunit/php-code-coverage/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/php-code-coverage/build/phpmd.xml b/core/vendor/phpunit/php-code-coverage/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/php-code-coverage/build/travis-ci.xml b/core/vendor/phpunit/php-code-coverage/build/travis-ci.xml
new file mode 100644
index 0000000..51d3446
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/build/travis-ci.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true">
+  <testsuites>
+    <testsuite name="PHP_CodeCoverage">
+      <directory suffix="Test.php">../Tests/PHP</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-text" target="php://stdout"/>
+  </logging>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">../PHP</directory>
+      <exclude>
+        <file>../PHP/CodeCoverage/Autoload.php</file>
+      </exclude>
+    </whitelist>
+  </filter>
+</phpunit>
diff --git a/core/vendor/phpunit/php-code-coverage/composer.json b/core/vendor/phpunit/php-code-coverage/composer.json
new file mode 100644
index 0000000..1a4ebe1
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/composer.json
@@ -0,0 +1,41 @@
+{
+    "name": "phpunit/php-code-coverage",
+    "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+    "type": "library",
+    "keywords": [
+        "coverage",
+        "testing",
+        "xunit"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sb@sebastian-bergmann.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3",
+        "phpunit/php-file-iterator": ">=1.3.0@stable",
+        "phpunit/php-token-stream": ">=1.1.3@stable",
+        "phpunit/php-text-template": ">=1.1.1@stable"
+    },
+    "suggest": {
+        "ext-dom": "*",
+        "ext-xdebug": ">=2.0.5"
+    },
+    "autoload": {
+        "classmap": [
+            "PHP/"
+        ]
+    },
+    "include-path": [
+        ""
+    ]
+}
diff --git a/core/vendor/phpunit/php-code-coverage/package.xml b/core/vendor/phpunit/php-code-coverage/package.xml
new file mode 100644
index 0000000..600ece9
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/package.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>PHP_CodeCoverage</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>Library that provides collection, processing, and rendering functionality for PHP code coverage information.</summary>
+ <description>Library that provides collection, processing, and rendering functionality for PHP code coverage information.</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sb@sebastian-bergmann.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2012-12-02</date>
+ <version>
+  <release>1.2.7</release>
+  <api>1.2.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/php-code-coverage/</notes>
+ <contents>
+  <dir name="/">
+   <dir name="PHP">
+    <dir name="CodeCoverage">
+     <dir name="Driver">
+      <file baseinstalldir="/" name="Xdebug.php" role="php" />
+     </dir>
+     <dir name="Report">
+      <dir name="HTML">
+       <dir name="Renderer">
+        <dir name="Template">
+         <dir name="css">
+          <file baseinstalldir="/" name="bootstrap-responsive.min.css" role="php" />
+          <file baseinstalldir="/" name="bootstrap.min.css" role="php" />
+          <file baseinstalldir="/" name="style.css" role="php" />
+         </dir>
+         <dir name="img">
+          <file baseinstalldir="/" name="glyphicons-halflings-white.png" role="php" />
+          <file baseinstalldir="/" name="glyphicons-halflings.png" role="php" />
+         </dir>
+         <dir name="js">
+          <file baseinstalldir="/" name="bootstrap.min.js" role="php" />
+          <file baseinstalldir="/" name="highcharts.js" role="php" />
+          <file baseinstalldir="/" name="html5shiv.js" role="php" />
+          <file baseinstalldir="/" name="jquery.min.js" role="php" />
+         </dir>
+         <file baseinstalldir="/" name="coverage_bar.html.dist" role="php" />
+         <file baseinstalldir="/" name="dashboard.html.dist" role="php" />
+         <file baseinstalldir="/" name="directory.html.dist" role="php" />
+         <file baseinstalldir="/" name="directory_item.html.dist" role="php" />
+         <file baseinstalldir="/" name="file.html.dist" role="php" />
+         <file baseinstalldir="/" name="file_item.html.dist" role="php" />
+         <file baseinstalldir="/" name="method_item.html.dist" role="php" />
+        </dir>
+        <file baseinstalldir="/" name="Dashboard.php" role="php" />
+        <file baseinstalldir="/" name="Directory.php" role="php" />
+        <file baseinstalldir="/" name="File.php" role="php" />
+       </dir>
+       <file baseinstalldir="/" name="Renderer.php" role="php" />
+      </dir>
+      <dir name="Node">
+       <file baseinstalldir="/" name="Directory.php" role="php" />
+       <file baseinstalldir="/" name="File.php" role="php" />
+       <file baseinstalldir="/" name="Iterator.php" role="php" />
+      </dir>
+      <file baseinstalldir="/" name="Clover.php" role="php" />
+      <file baseinstalldir="/" name="Factory.php" role="php" />
+      <file baseinstalldir="/" name="HTML.php" role="php" />
+      <file baseinstalldir="/" name="Node.php" role="php" />
+      <file baseinstalldir="/" name="PHP.php" role="php" />
+      <file baseinstalldir="/" name="Text.php" role="php" />
+     </dir>
+     <dir name="Util">
+      <file baseinstalldir="/" name="InvalidArgumentHelper.php" role="php" />
+     </dir>
+     <file baseinstalldir="/" name="Autoload.php" role="php" />
+     <file baseinstalldir="/" name="Driver.php" role="php" />
+     <file baseinstalldir="/" name="Exception.php" role="php" />
+     <file baseinstalldir="/" name="Filter.php" role="php" />
+     <file baseinstalldir="/" name="Util.php" role="php" />
+     <file baseinstalldir="/" name="Version.php" role="php" />
+    </dir>
+    <file baseinstalldir="/" name="CodeCoverage.php" role="php" />
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.markdown" role="doc" />
+   <file baseinstalldir="/" name="LICENSE" role="doc" />
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.4</min>
+   </pearinstaller>
+   <package>
+    <name>File_Iterator</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.3.0</min>
+   </package>
+   <package>
+    <name>PHP_TokenStream</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.1.3</min>
+   </package>
+   <package>
+    <name>Text_Template</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.1.1</min>
+   </package>
+  </required>
+  <optional>
+   <extension>
+    <name>dom</name>
+   </extension>
+   <extension>
+    <name>xdebug</name>
+    <min>2.0.5</min>
+   </extension>
+  </optional>
+ </dependencies>
+ <phprelease />
+</package>
diff --git a/core/vendor/phpunit/php-code-coverage/phpunit.xml.dist b/core/vendor/phpunit/php-code-coverage/phpunit.xml.dist
new file mode 100644
index 0000000..31c6172
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/phpunit.xml.dist
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         syntaxCheck="false"
+         bootstrap="PHP/CodeCoverage/Autoload.php">
+  <testsuites>
+    <testsuite name="php-code-coverage">
+      <directory suffix="Test.php">Tests/PHP</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-html" target="build/coverage" title="PHP_CodeCoverage"
+         charset="UTF-8" yui="true" highlight="true"
+         lowUpperBound="35" highLowerBound="70"/>
+    <log type="coverage-clover" target="build/logs/clover.xml"/>
+    <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
+  </logging>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">PHP</directory>
+      <exclude>
+        <file>PHP/CodeCoverage/Autoload.php</file>
+      </exclude>
+    </whitelist>
+  </filter>
+</phpunit>
diff --git a/core/vendor/phpunit/php-code-coverage/scripts/auto_append.php b/core/vendor/phpunit/php-code-coverage/scripts/auto_append.php
new file mode 100644
index 0000000..6cd768d
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/scripts/auto_append.php
@@ -0,0 +1,5 @@
+<?php
+$coverage->stop();
+
+$writer = new PHP_CodeCoverage_Report_HTML;
+$writer->process($coverage, '/tmp/coverage');
diff --git a/core/vendor/phpunit/php-code-coverage/scripts/auto_prepend.php b/core/vendor/phpunit/php-code-coverage/scripts/auto_prepend.php
new file mode 100644
index 0000000..7a8887a
--- /dev/null
+++ b/core/vendor/phpunit/php-code-coverage/scripts/auto_prepend.php
@@ -0,0 +1,10 @@
+<?php
+require_once 'PHP/CodeCoverage/Autoload.php';
+
+$coverage = new PHP_CodeCoverage;
+$filter   = $coverage->filter();
+
+$filter->addFileToBlacklist(__FILE__);
+$filter->addFileToBlacklist(dirname(__FILE__) . '/auto_append.php');
+
+$coverage->start($_SERVER['SCRIPT_FILENAME']);
diff --git a/core/vendor/phpunit/php-file-iterator/.gitattributes b/core/vendor/phpunit/php-file-iterator/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/php-file-iterator/ChangeLog.markdown b/core/vendor/phpunit/php-file-iterator/ChangeLog.markdown
new file mode 100644
index 0000000..06593b0
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/ChangeLog.markdown
@@ -0,0 +1,26 @@
+File_Iterator 1.3
+=================
+
+This is the list of changes for the File_Iterator 1.3 release series.
+
+File_Iterator 1.3.3
+-------------------
+
+* No changes.
+
+File_Iterator 1.3.2
+-------------------
+
+* No changes.
+
+File_Iterator 1.3.1
+-------------------
+
+* Fixed infinite loop in `File_Iterator_Facade::getCommonPath()` for empty directories.
+
+File_Iterator 1.3.0
+-------------------
+
+* Added `File_Iterator_Facade` for the most common use case.
+* Moved `File_Iterator_Factory::getFilesAsArray()` to `File_Iterator_Facade::getFilesAsArray()`.
+* `File_Iterator_Factory` is no longer static.
diff --git a/core/vendor/phpunit/php-file-iterator/File/Iterator.php b/core/vendor/phpunit/php-file-iterator/File/Iterator.php
new file mode 100644
index 0000000..f898ef5
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/File/Iterator.php
@@ -0,0 +1,196 @@
+<?php
+/**
+ * php-file-iterator
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   File
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.0.0
+ */
+
+/**
+ * FilterIterator implementation that filters files based on prefix(es) and/or
+ * suffix(es). Hidden files and files from hidden directories are also filtered.
+ *
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version   Release: @package_version@
+ * @link      http://github.com/sebastianbergmann/php-file-iterator/tree
+ * @since     Class available since Release 1.0.0
+ */
+class File_Iterator extends FilterIterator
+{
+    const PREFIX = 0;
+    const SUFFIX = 1;
+
+    /**
+     * @var array
+     */
+    protected $suffixes = array();
+
+    /**
+     * @var array
+     */
+    protected $prefixes = array();
+
+    /**
+     * @var array
+     */
+    protected $exclude = array();
+
+    /**
+     * @var string
+     */
+    protected $basepath;
+
+    /**
+     * @param  Iterator $iterator
+     * @param  array    $suffixes
+     * @param  array    $prefixes
+     * @param  array    $exclude
+     * @param  string   $basepath
+     */
+    public function __construct(Iterator $iterator, array $suffixes = array(), array $prefixes = array(), array $exclude = array(), $basepath = NULL)
+    {
+        $exclude = array_filter(array_map('realpath', $exclude));
+
+        if ($basepath !== NULL) {
+            $basepath = realpath($basepath);
+        }
+
+        if ($basepath === FALSE) {
+            $basepath = NULL;
+        } else {
+            foreach ($exclude as &$_exclude) {
+                $_exclude = str_replace($basepath, '', $_exclude);
+            }
+        }
+
+        $this->prefixes = $prefixes;
+        $this->suffixes = $suffixes;
+        $this->exclude  = $exclude;
+        $this->basepath = $basepath;
+
+        parent::__construct($iterator);
+    }
+
+    /**
+     * @return boolean
+     */
+    public function accept()
+    {
+        $current  = $this->getInnerIterator()->current();
+        $filename = $current->getFilename();
+        $realpath = $current->getRealPath();
+
+        if ($this->basepath !== NULL) {
+            $realpath = str_replace($this->basepath, '', $realpath);
+        }
+
+        // Filter files in hidden directories.
+        if (preg_match('=/\.[^/]*/=', $realpath)) {
+            return FALSE;
+        }
+
+        return $this->acceptPath($realpath) &&
+               $this->acceptPrefix($filename) &&
+               $this->acceptSuffix($filename);
+    }
+
+    /**
+     * @param  string $path
+     * @return boolean
+     * @since  Method available since Release 1.1.0
+     */
+    protected function acceptPath($path)
+    {
+        foreach ($this->exclude as $exclude) {
+            if (strpos($path, $exclude) === 0) {
+                return FALSE;
+            }
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * @param  string $filename
+     * @return boolean
+     * @since  Method available since Release 1.1.0
+     */
+    protected function acceptPrefix($filename)
+    {
+        return $this->acceptSubString($filename, $this->prefixes, self::PREFIX);
+    }
+
+    /**
+     * @param  string $filename
+     * @return boolean
+     * @since  Method available since Release 1.1.0
+     */
+    protected function acceptSuffix($filename)
+    {
+        return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX);
+    }
+
+    /**
+     * @param  string  $filename
+     * @param  array   $subString
+     * @param  integer $type
+     * @return boolean
+     * @since  Method available since Release 1.1.0
+     */
+    protected function acceptSubString($filename, array $subStrings, $type)
+    {
+        if (empty($subStrings)) {
+            return TRUE;
+        }
+
+        $matched = FALSE;
+
+        foreach ($subStrings as $string) {
+            if (($type == self::PREFIX && strpos($filename, $string) === 0) ||
+                ($type == self::SUFFIX &&
+                 substr($filename, -1 * strlen($string)) == $string)) {
+                $matched = TRUE;
+                break;
+            }
+        }
+
+        return $matched;
+    }
+}
diff --git a/core/vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php b/core/vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php
new file mode 100644
index 0000000..5a8c01a
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * php-file-iterator
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   File
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.3.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'file_iterator' => '/Iterator.php',
+            'file_iterator_facade' => '/Iterator/Facade.php',
+            'file_iterator_factory' => '/Iterator/Factory.php'
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php.in b/core/vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php.in
new file mode 100644
index 0000000..56da6c1
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/File/Iterator/Autoload.php.in
@@ -0,0 +1,64 @@
+<?php
+/**
+ * php-file-iterator
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   File
+ * @author    Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.3.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            ___CLASSLIST___
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-file-iterator/File/Iterator/Facade.php b/core/vendor/phpunit/php-file-iterator/File/Iterator/Facade.php
new file mode 100644
index 0000000..2b846d0
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/File/Iterator/Facade.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * php-file-iterator
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   File
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.3.0
+ */
+
+/**
+ * FaÃ§ade implementation that uses File_Iterator_Factory to create a
+ * File_Iterator that operates on an AppendIterator that contains an
+ * RecursiveDirectoryIterator for each given path. The list of unique
+ * files is returned as an array.
+ *
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version   Release: @package_version@
+ * @link      http://github.com/sebastianbergmann/php-file-iterator/tree
+ * @since     Class available since Release 1.3.0
+ */
+class File_Iterator_Facade
+{
+    /**
+     * @param  array|string $paths
+     * @param  array|string $suffixes
+     * @param  array|string $prefixes
+     * @param  array        $exclude
+     * @param  boolean      $commonPath
+     * @return array
+     */
+    public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = array(), $commonPath = FALSE)
+    {
+        if (is_string($paths)) {
+            $paths = array($paths);
+        }
+
+        $factory  = new File_Iterator_Factory;
+        $iterator = $factory->getFileIterator(
+          $paths, $suffixes, $prefixes, $exclude
+        );
+
+        $files = array();
+
+        foreach ($iterator as $file) {
+            $file = $file->getRealPath();
+
+            if ($file) {
+                $files[] = $file;
+            }
+        }
+
+        foreach ($paths as $path) {
+            if (is_file($path)) {
+                $files[] = realpath($path);
+            }
+        }
+
+        $files = array_unique($files);
+        sort($files);
+
+        if ($commonPath) {
+            return array(
+              'commonPath' => $this->getCommonPath($files),
+              'files'      => $files
+            );
+        } else {
+            return $files;
+        }
+    }
+
+    /**
+     * Returns the common path of a set of files.
+     *
+     * @param  array $files
+     * @return string
+     */
+    protected function getCommonPath(array $files)
+    {
+        $count = count($files);
+
+        if ($count == 0) {
+            return '';
+        }
+
+        if ($count == 1) {
+            return dirname($files[0]) . DIRECTORY_SEPARATOR;
+        }
+
+        $_files = array();
+
+        foreach ($files as $file) {
+            $_files[] = $_fileParts = explode(DIRECTORY_SEPARATOR, $file);
+
+            if (empty($_fileParts[0])) {
+                $_fileParts[0] = DIRECTORY_SEPARATOR;
+            }
+        }
+
+        $common = '';
+        $done   = FALSE;
+        $j      = 0;
+        $count--;
+
+        while (!$done) {
+            for ($i = 0; $i < $count; $i++) {
+                if ($_files[$i][$j] != $_files[$i+1][$j]) {
+                    $done = TRUE;
+                    break;
+                }
+            }
+
+            if (!$done) {
+                $common .= $_files[0][$j];
+
+                if ($j > 0) {
+                    $common .= DIRECTORY_SEPARATOR;
+                }
+            }
+
+            $j++;
+        }
+
+        return DIRECTORY_SEPARATOR . $common;
+    }
+}
diff --git a/core/vendor/phpunit/php-file-iterator/File/Iterator/Factory.php b/core/vendor/phpunit/php-file-iterator/File/Iterator/Factory.php
new file mode 100644
index 0000000..28b1410
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/File/Iterator/Factory.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * php-file-iterator
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   File
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.1.0
+ */
+
+/**
+ * Factory Method implementation that creates a File_Iterator that operates on
+ * an AppendIterator that contains an RecursiveDirectoryIterator for each given
+ * path.
+ *
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version   Release: @package_version@
+ * @link      http://github.com/sebastianbergmann/php-file-iterator/tree
+ * @since     Class available since Release 1.1.0
+ */
+class File_Iterator_Factory
+{
+    /**
+     * @param  array|string $paths
+     * @param  array|string $suffixes
+     * @param  array|string $prefixes
+     * @param  array        $exclude
+     * @return AppendIterator
+     */
+    public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = array())
+    {
+        if (is_string($paths)) {
+            $paths = array($paths);
+        }
+
+        $_paths = array();
+
+        foreach ($paths as $path) {
+            if ($locals = glob($path, GLOB_ONLYDIR)) {
+                $_paths = array_merge($_paths, $locals);
+            } else {
+                $_paths[] = $path;
+            }
+        }
+
+        $paths = $_paths;
+        unset($_paths);
+
+        if (is_string($prefixes)) {
+            if ($prefixes != '') {
+                $prefixes = array($prefixes);
+            } else {
+                $prefixes = array();
+            }
+        }
+
+        if (is_string($suffixes)) {
+            if ($suffixes != '') {
+                $suffixes = array($suffixes);
+            } else {
+                $suffixes = array();
+            }
+        }
+
+        $iterator = new AppendIterator;
+
+        foreach ($paths as $path) {
+            if (is_dir($path)) {
+                $iterator->append(
+                  new File_Iterator(
+                    new RecursiveIteratorIterator(
+                      new RecursiveDirectoryIterator($path)
+                    ),
+                    $suffixes,
+                    $prefixes,
+                    $exclude,
+                    $path
+                  )
+                );
+            }
+        }
+
+        return $iterator;
+    }
+}
diff --git a/core/vendor/phpunit/php-file-iterator/LICENSE b/core/vendor/phpunit/php-file-iterator/LICENSE
new file mode 100644
index 0000000..c392d41
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/LICENSE
@@ -0,0 +1,33 @@
+File_Iterator
+
+Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/php-file-iterator/README.markdown b/core/vendor/phpunit/php-file-iterator/README.markdown
new file mode 100644
index 0000000..c8971c2
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/README.markdown
@@ -0,0 +1,23 @@
+File_Iterator
+=============
+
+Installation
+------------
+
+File_Iterator should be installed using the [PEAR Installer](http://pear.php.net/). This installer is the backbone of PEAR, which provides a distribution system for PHP packages, and is shipped with every release of PHP since version 4.3.0.
+
+The PEAR channel (`pear.phpunit.de`) that is used to distribute File_Iterator needs to be registered with the local PEAR environment:
+
+    sb@ubuntu ~ % pear channel-discover pear.phpunit.de
+    Adding Channel "pear.phpunit.de" succeeded
+    Discovery of channel "pear.phpunit.de" succeeded
+
+This has to be done only once. Now the PEAR Installer can be used to install packages from the PHPUnit channel:
+
+    sb@vmware ~ % pear install phpunit/File_Iterator
+    downloading File_Iterator-1.1.1.tgz ...
+    Starting to download File_Iterator-1.1.1.tgz (3,173 bytes)
+    ....done: 3,173 bytes
+    install ok: channel://pear.phpunit.de/File_Iterator-1.1.1
+
+After the installation you can find the File_Iterator source files inside your local PEAR directory; the path is usually `/usr/lib/php/File`.
diff --git a/core/vendor/phpunit/php-file-iterator/build.xml b/core/vendor/phpunit/php-file-iterator/build.xml
new file mode 100644
index 0000000..29d362f
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/build.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="File_Iterator" default="build">
+ <property name="php" value="php"/>
+ <property name="phpunit" value="phpunit"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="File/Iterator/Autoload.php" />
+   <arg value="--template" />
+   <arg path="File/Iterator/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="            " />
+   <arg path="File" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/File">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+<!--
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+-->
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/File" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/File" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/File" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/File" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/File" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/File" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/File" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <condition property="phpunit_cmd" value="${php} ${phpunit}" else="${phpunit}">
+   <not>
+    <equals arg1="${phpunit}" arg2="phpunit" />
+   </not>
+  </condition>
+
+  <exec executable="${phpunit_cmd}" failonerror="true"/>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/File" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/php-file-iterator/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/php-file-iterator/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..bf9d520
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          '}EOLelse if (...) {EOL',
+          '}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-file-iterator/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/php-file-iterator/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-file-iterator/build/PHPCS/ruleset.xml b/core/vendor/phpunit/php-file-iterator/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/php-file-iterator/build/phpmd.xml b/core/vendor/phpunit/php-file-iterator/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/php-file-iterator/composer.json b/core/vendor/phpunit/php-file-iterator/composer.json
new file mode 100644
index 0000000..1ddd5b8
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "phpunit/php-file-iterator",
+    "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+    "type": "library",
+    "keywords": [
+        "iterator",
+        "filesystem"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sb@sebastian-bergmann.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "classmap": [
+            "File/"
+        ]
+    },
+    "include-path": [
+        ""
+    ]
+}
diff --git a/core/vendor/phpunit/php-file-iterator/package.xml b/core/vendor/phpunit/php-file-iterator/package.xml
new file mode 100644
index 0000000..e08bfd5
--- /dev/null
+++ b/core/vendor/phpunit/php-file-iterator/package.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>File_Iterator</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>FilterIterator implementation that filters files based on a list of suffixes.</summary>
+ <description>FilterIterator implementation that filters files based on a list of suffixes.</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sb@sebastian-bergmann.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2012-10-05</date>
+ <version>
+  <release>1.3.3</release>
+  <api>1.3.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/php-file-iterator/tree</notes>
+ <contents>
+  <dir name="/">
+   <dir name="File">
+    <dir name="Iterator">
+     <file baseinstalldir="/" name="Autoload.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Facade.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Factory.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <file baseinstalldir="/" name="Iterator.php" role="php">
+     <tasks:replace from="@package_version@" to="version" type="package-info" />
+    </file>
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.markdown" role="doc"/>
+   <file baseinstalldir="/" name="LICENSE" role="doc"/>
+   <file baseinstalldir="/" name="README.markdown" role="doc"/>
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.4</min>
+   </pearinstaller>
+  </required>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/core/vendor/phpunit/php-text-template/.gitattributes b/core/vendor/phpunit/php-text-template/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/php-text-template/ChangeLog.markdown b/core/vendor/phpunit/php-text-template/ChangeLog.markdown
new file mode 100644
index 0000000..63abd62
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/ChangeLog.markdown
@@ -0,0 +1,24 @@
+Text_Template 1.1
+=================
+
+This is the list of changes for the Text_Template 1.1 release series.
+
+Text_Template 1.1.4
+-------------------
+
+* Improved error message in case `renderTo()` cannot write to the target file.
+
+Text_Template 1.1.3
+-------------------
+
+* No changes.
+
+Text_Template 1.1.2
+-------------------
+
+* No changes.
+
+Text_Template 1.1.1
+-------------------
+
+* No changes.
diff --git a/core/vendor/phpunit/php-text-template/LICENSE b/core/vendor/phpunit/php-text-template/LICENSE
new file mode 100644
index 0000000..7cc8941
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/LICENSE
@@ -0,0 +1,33 @@
+Text_Template
+
+Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/php-text-template/README.markdown b/core/vendor/phpunit/php-text-template/README.markdown
new file mode 100644
index 0000000..0d60da9
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/README.markdown
@@ -0,0 +1,23 @@
+Text_Template
+=============
+
+Installation
+------------
+
+Text_Template should be installed using the [PEAR Installer](http://pear.php.net/). This installer is the backbone of PEAR, which provides a distribution system for PHP packages, and is shipped with every release of PHP since version 4.3.0.
+
+The PEAR channel (`pear.phpunit.de`) that is used to distribute Text_Template needs to be registered with the local PEAR environment:
+
+    sb@ubuntu ~ % pear channel-discover pear.phpunit.de
+    Adding Channel "pear.phpunit.de" succeeded
+    Discovery of channel "pear.phpunit.de" succeeded
+
+This has to be done only once. Now the PEAR Installer can be used to install packages from the PHPUnit channel:
+
+    sb@vmware ~ % pear install phpunit/Text_Template
+    downloading Text_Template-1.0.0.tgz ...
+    Starting to download Text_Template-1.0.0.tgz (2,493 bytes)
+    ....done: 2,493 bytes
+    install ok: channel://pear.phpunit.de/Text_Template-1.0.0
+
+After the installation you can find the Text_Template source files inside your local PEAR directory; the path is usually `/usr/lib/php/Text`.
diff --git a/core/vendor/phpunit/php-text-template/Text/Template.php b/core/vendor/phpunit/php-text-template/Text/Template.php
new file mode 100644
index 0000000..472570a
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/Text/Template.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * Text_Template
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   Text
+ * @package    Template
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-text-template
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * A simple template engine.
+ *
+ * @category   Text
+ * @package    Template
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-text-template
+ * @since      Class available since Release 1.0.0
+ */
+class Text_Template
+{
+    /**
+     * @var string
+     */
+    protected $template = '';
+
+    /**
+     * @var array
+     */
+    protected $values = array();
+
+    /**
+     * Constructor.
+     *
+     * @param  string $file
+     * @throws InvalidArgumentException
+     */
+    public function __construct($file = '')
+    {
+        $this->setFile($file);
+    }
+
+    /**
+     * Sets the template file.
+     *
+     * @param  string $file
+     * @throws InvalidArgumentException
+     */
+    public function setFile($file)
+    {
+        $distFile = $file . '.dist';
+
+        if (file_exists($file)) {
+            $this->template = file_get_contents($file);
+        }
+
+        else if (file_exists($distFile)) {
+            $this->template = file_get_contents($distFile);
+        }
+
+        else {
+            throw new InvalidArgumentException(
+              'Template file could not be loaded.'
+            );
+        }
+    }
+
+    /**
+     * Sets one or more template variables.
+     *
+     * @param  array   $values
+     * @param  boolean $merge
+     */
+    public function setVar(array $values, $merge = TRUE)
+    {
+        if (!$merge || empty($this->values)) {
+            $this->values = $values;
+        } else {
+            $this->values = array_merge($this->values, $values);
+        }
+    }
+
+    /**
+     * Renders the template and returns the result.
+     *
+     * @return string
+     */
+    public function render()
+    {
+        $keys = array();
+
+        foreach ($this->values as $key => $value) {
+            $keys[] = '{' . $key . '}';
+        }
+
+        return str_replace($keys, $this->values, $this->template);
+    }
+
+    /**
+     * Renders the template and writes the result to a file.
+     *
+     * @param string $target
+     */
+    public function renderTo($target)
+    {
+        $fp = @fopen($target, 'wt');
+
+        if ($fp) {
+            fwrite($fp, $this->render());
+            fclose($fp);
+        } else {
+            $error = error_get_last();
+
+            throw new RuntimeException(
+              sprintf(
+                'Could not write to %s: %s',
+                $target,
+                substr(
+                  $error['message'],
+                  strpos($error['message'], ':') + 2
+                )
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-text-template/Text/Template/Autoload.php b/core/vendor/phpunit/php-text-template/Text/Template/Autoload.php
new file mode 100644
index 0000000..67005b5
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/Text/Template/Autoload.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Text_Template
+ *
+ * Copyright (c) 2009-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   Text
+ * @package    Template
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-text-template
+ * @since      File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class) {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'text_template' => '/Template.php'
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-text-template/Text/Template/Autoload.php.in b/core/vendor/phpunit/php-text-template/Text/Template/Autoload.php.in
new file mode 100644
index 0000000..0294eab
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/Text/Template/Autoload.php.in
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Text_Template
+ *
+ * Copyright (c) 2009-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @category   Text
+ * @package    Template
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-text-template
+ * @since      File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class) {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            ___CLASSLIST___
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-text-template/build.xml b/core/vendor/phpunit/php-text-template/build.xml
new file mode 100644
index 0000000..3be9137
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/build.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="Text_Template" default="build">
+ <property name="php" value="php"/>
+ <property name="phpunit" value="phpunit"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="Text/Template/Autoload.php" />
+   <arg value="--template" />
+   <arg path="Text/Template/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="            " />
+   <arg path="Text" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/Text">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+<!--
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+-->
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/Text" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/Text" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/Text" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/Text" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/Text" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/Text" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/Text" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <condition property="phpunit_cmd" value="${php} ${phpunit}" else="${phpunit}">
+   <not>
+    <equals arg1="${phpunit}" arg2="phpunit" />
+   </not>
+  </condition>
+
+  <exec executable="${phpunit_cmd}" failonerror="true"/>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/Text" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/php-text-template/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/php-text-template/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..bf9d520
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          '}EOLelse if (...) {EOL',
+          '}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-text-template/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/php-text-template/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-text-template/build/PHPCS/ruleset.xml b/core/vendor/phpunit/php-text-template/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/php-text-template/build/phpmd.xml b/core/vendor/phpunit/php-text-template/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/php-text-template/composer.json b/core/vendor/phpunit/php-text-template/composer.json
new file mode 100644
index 0000000..3bb3fe9
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/composer.json
@@ -0,0 +1,32 @@
+{
+    "name": "phpunit/php-text-template",
+    "description": "Simple template engine.",
+    "type": "library",
+    "keywords": [
+        "template"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sb@sebastian-bergmann.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "classmap": [
+            "Text/"
+        ]
+    },
+    "include-path": [
+        ""
+    ]
+}
diff --git a/core/vendor/phpunit/php-text-template/package.xml b/core/vendor/phpunit/php-text-template/package.xml
new file mode 100644
index 0000000..d928730
--- /dev/null
+++ b/core/vendor/phpunit/php-text-template/package.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Text_Template</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>Simple template engine.</summary>
+ <description>Simple template engine.</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sb@sebastian-bergmann.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2012-10-31</date>
+ <version>
+  <release>1.1.4</release>
+  <api>1.1.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/php-text-template</notes>
+ <contents>
+  <dir name="/">
+   <dir name="Text">
+    <dir name="Template">
+     <file baseinstalldir="/" name="Autoload.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <file baseinstalldir="/" name="Template.php" role="php">
+     <tasks:replace from="@package_version@" to="version" type="package-info" />
+    </file>
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.markdown" role="doc"/>
+   <file baseinstalldir="/" name="LICENSE" role="doc"/>
+   <file baseinstalldir="/" name="README.markdown" role="doc"/>
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.4</min>
+   </pearinstaller>
+  </required>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/core/vendor/phpunit/php-timer/.gitattributes b/core/vendor/phpunit/php-timer/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/php-timer/ChangeLog.markdown b/core/vendor/phpunit/php-timer/ChangeLog.markdown
new file mode 100644
index 0000000..8d6a052
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/ChangeLog.markdown
@@ -0,0 +1,29 @@
+PHP_Timer 1.0
+=============
+
+This is the list of changes for the PHP_Timer 1.0 release series.
+
+PHP_Timer 1.0.4
+---------------
+
+* No changes.
+
+PHP_Timer 1.0.3
+---------------
+
+* No changes.
+
+PHP_Timer 1.0.2
+---------------
+
+* `$_SERVER['REQUEST_TIME_FLOAT']` is used when available.
+
+PHP_Timer 1.0.1
+---------------
+
+* No changes.
+
+PHP_Timer 1.0.0
+---------------
+
+* Initial release.
diff --git a/core/vendor/phpunit/php-timer/LICENSE b/core/vendor/phpunit/php-timer/LICENSE
new file mode 100644
index 0000000..581812a
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/LICENSE
@@ -0,0 +1,33 @@
+PHP_Timer
+
+Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/php-timer/PHP/Timer.php b/core/vendor/phpunit/php-timer/PHP/Timer.php
new file mode 100644
index 0000000..5be7f15
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/PHP/Timer.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * PHP_Timer
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP
+ * @subpackage Timer
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-timer
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Utility class for timing.
+ *
+ * @package    PHP
+ * @subpackage Timer
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-timer
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_Timer
+{
+    /**
+     * @var array
+     */
+    protected static $startTimes = array();
+
+    /**
+     * @var float
+     */
+    public static $requestTime;
+
+    /**
+     * Starts the timer.
+     */
+    public static function start()
+    {
+        array_push(self::$startTimes, microtime(TRUE));
+    }
+
+    /**
+     * Stops the timer and returns the elapsed time.
+     *
+     * @return float
+     */
+    public static function stop()
+    {
+        return microtime(TRUE) - array_pop(self::$startTimes);
+    }
+
+    /**
+     * Formats the elapsed time as a string.
+     *
+     * @param  float $time
+     * @return string
+     */
+    public static function secondsToTimeString($time)
+    {
+        $buffer = '';
+
+        $hours   = sprintf('%02d', ($time >= 3600) ? floor($time / 3600) : 0);
+        $minutes = sprintf(
+                     '%02d',
+                     ($time >= 60)   ? floor($time /   60) - 60 * $hours : 0
+                   );
+        $seconds = sprintf('%02d', $time - 60 * 60 * $hours - 60 * $minutes);
+
+        if ($hours == 0 && $minutes == 0) {
+            $seconds = sprintf('%1d', $seconds);
+
+            $buffer .= $seconds . ' second';
+
+            if ($seconds != '1') {
+                $buffer .= 's';
+            }
+        } else {
+            if ($hours > 0) {
+                $buffer = $hours . ':';
+            }
+
+            $buffer .= $minutes . ':' . $seconds;
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Formats the elapsed time since the start of the request as a string.
+     *
+     * @return string
+     */
+    public static function timeSinceStartOfRequest()
+    {
+        return self::secondsToTimeString(microtime(TRUE) - self::$requestTime);
+    }
+
+    /**
+     * Returns the resources (time, memory) of the request as a string.
+     *
+     * @return string
+     */
+    public static function resourceUsage()
+    {
+        return sprintf(
+          'Time: %s, Memory: %4.2fMb',
+          self::timeSinceStartOfRequest(),
+          memory_get_peak_usage(TRUE) / 1048576
+        );
+    }
+}
+
+if (isset($_SERVER['REQUEST_TIME_FLOAT'])) {
+    PHP_Timer::$requestTime = $_SERVER['REQUEST_TIME_FLOAT'];
+}
+
+else if (isset($_SERVER['REQUEST_TIME'])) {
+    PHP_Timer::$requestTime = $_SERVER['REQUEST_TIME'];
+}
+
+else {
+    PHP_Timer::$requestTime = microtime(TRUE);
+}
diff --git a/core/vendor/phpunit/php-timer/PHP/Timer/Autoload.php b/core/vendor/phpunit/php-timer/PHP/Timer/Autoload.php
new file mode 100644
index 0000000..17b781d
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/PHP/Timer/Autoload.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHP_Timer
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP
+ * @subpackage Timer
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-timer
+ * @since      File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'php_timer' => '/Timer.php'
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-timer/PHP/Timer/Autoload.php.in b/core/vendor/phpunit/php-timer/PHP/Timer/Autoload.php.in
new file mode 100644
index 0000000..c2681c2
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/PHP/Timer/Autoload.php.in
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHP_Timer
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP
+ * @subpackage Timer
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-timer
+ * @since      File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            ___CLASSLIST___
+          );
+
+          $path = dirname(dirname(__FILE__));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-timer/README.markdown b/core/vendor/phpunit/php-timer/README.markdown
new file mode 100644
index 0000000..9ff8f78
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/README.markdown
@@ -0,0 +1,23 @@
+PHP_Timer
+=========
+
+Installation
+------------
+
+PHP_Timer should be installed using the [PEAR Installer](http://pear.php.net/). This installer is the backbone of PEAR, which provides a distribution system for PHP packages, and is shipped with every release of PHP since version 4.3.0.
+
+The PEAR channel (`pear.phpunit.de`) that is used to distribute PHP_Timer needs to be registered with the local PEAR environment:
+
+    sb@ubuntu ~ % pear channel-discover pear.phpunit.de
+    Adding Channel "pear.phpunit.de" succeeded
+    Discovery of channel "pear.phpunit.de" succeeded
+
+This has to be done only once. Now the PEAR Installer can be used to install packages from the PHPUnit channel:
+
+    sb@vmware ~ % pear install phpunit/PHP_Timer
+    downloading PHP_Timer-1.0.0.tgz ...
+    Starting to download PHP_Timer-1.0.0.tgz (2,536 bytes)
+    ....done: 2,536 bytes
+    install ok: channel://pear.phpunit.de/PHP_Timer-1.0.0
+
+After the installation you can find the PHP_Timer source files inside your local PEAR directory; the path is usually `/usr/lib/php/PHP`.
diff --git a/core/vendor/phpunit/php-timer/Tests/TimerTest.php b/core/vendor/phpunit/php-timer/Tests/TimerTest.php
new file mode 100644
index 0000000..4dab176
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/Tests/TimerTest.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * PHP_Timer
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP
+ * @subpackage Timer
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/php-timer
+ * @since      File available since Release 1.0.0
+ */
+
+require_once dirname(dirname(__FILE__)) . '/PHP/Timer.php';
+
+/**
+ * Tests for PHP_Timer.
+ *
+ * @package    PHP
+ * @subpackage Timer
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-timer
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_TimerTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers PHP_Timer::start
+     * @covers PHP_Timer::stop
+     */
+    public function testStartStop()
+    {
+        PHP_Timer::start();
+        $this->assertInternalType('float', PHP_Timer::stop());
+    }
+
+    /**
+     * @covers PHP_Timer::secondsToTimeString
+     */
+    public function testSecondsToTimeString()
+    {
+        $this->assertEquals('0 seconds', PHP_Timer::secondsToTimeString(0));
+        $this->assertEquals('1 second', PHP_Timer::secondsToTimeString(1));
+        $this->assertEquals('2 seconds', PHP_Timer::secondsToTimeString(2));
+        $this->assertEquals('01:00', PHP_Timer::secondsToTimeString(60));
+        $this->assertEquals('01:01', PHP_Timer::secondsToTimeString(61));
+        $this->assertEquals('02:00', PHP_Timer::secondsToTimeString(120));
+        $this->assertEquals('02:01', PHP_Timer::secondsToTimeString(121));
+        $this->assertEquals('01:00:00', PHP_Timer::secondsToTimeString(3600));
+        $this->assertEquals('01:00:01', PHP_Timer::secondsToTimeString(3601));
+    }
+
+    /**
+     * @covers PHP_Timer::timeSinceStartOfRequest
+     */
+    public function testTimeSinceStartOfRequest()
+    {
+        $this->assertStringMatchesFormat(
+          '%i %s', PHP_Timer::timeSinceStartOfRequest()
+        );
+    }
+
+
+    /**
+     * @covers PHP_Timer::resourceUsage
+     */
+    public function testResourceUsage()
+    {
+        $this->assertStringMatchesFormat(
+          'Time: %s, Memory: %s', PHP_Timer::resourceUsage()
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-timer/build.xml b/core/vendor/phpunit/php-timer/build.xml
new file mode 100644
index 0000000..32469d0
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/build.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="PHP_Timer" default="build">
+ <property name="php" value="php"/>
+ <property name="phpunit" value="phpunit"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpunit,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpunit,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="PHP/Timer/Autoload.php" />
+   <arg value="--template" />
+   <arg path="PHP/Timer/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="            " />
+   <arg path="PHP" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/PHP">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHP" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHP" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <condition property="phpunit_cmd" value="${php} ${phpunit}" else="${phpunit}">
+   <not>
+    <equals arg1="${phpunit}" arg2="phpunit" />
+   </not>
+  </condition>
+
+  <exec executable="${phpunit_cmd}" failonerror="true"/>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/PHP" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/php-timer/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/php-timer/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..bf9d520
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          '}EOLelse if (...) {EOL',
+          '}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-timer/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/php-timer/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-timer/build/PHPCS/ruleset.xml b/core/vendor/phpunit/php-timer/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/php-timer/build/phpmd.xml b/core/vendor/phpunit/php-timer/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/php-timer/composer.json b/core/vendor/phpunit/php-timer/composer.json
new file mode 100644
index 0000000..211c001
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/composer.json
@@ -0,0 +1,32 @@
+{
+    "name": "phpunit/php-timer",
+    "description": "Utility class for timing",
+    "type": "library",
+    "keywords": [
+        "timer"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/php-timer/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sb@sebastian-bergmann.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "classmap": [
+            "PHP/"
+        ]
+    },
+    "include-path": [
+        ""
+    ]
+}
diff --git a/core/vendor/phpunit/php-timer/package.xml b/core/vendor/phpunit/php-timer/package.xml
new file mode 100644
index 0000000..c90fbf2
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/package.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>PHP_Timer</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>Utility class for timing</summary>
+ <description>Utility class for timing</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sb@sebastian-bergmann.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2012-10-05</date>
+ <version>
+  <release>1.0.4</release>
+  <api>1.0.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/php-timer/blob/master/README.markdown</notes>
+ <contents>
+  <dir name="/">
+   <dir name="PHP">
+    <dir name="Timer">
+     <file baseinstalldir="/" name="Autoload.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <file baseinstalldir="/" name="Timer.php" role="php">
+     <tasks:replace from="@package_version@" to="version" type="package-info" />
+    </file>
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.markdown" role="doc"/>
+   <file baseinstalldir="/" name="LICENSE" role="doc"/>
+   <file baseinstalldir="/" name="README.markdown" role="doc"/>
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.2</min>
+   </pearinstaller>
+  </required>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/core/vendor/phpunit/php-timer/phpunit.xml.dist b/core/vendor/phpunit/php-timer/phpunit.xml.dist
new file mode 100644
index 0000000..ee82ac8
--- /dev/null
+++ b/core/vendor/phpunit/php-timer/phpunit.xml.dist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false">
+  <testsuites>
+    <testsuite name="PHP_Timer">
+      <directory suffix=".php">Tests</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-html" target="build/coverage" title="PHP_Timer"
+         charset="UTF-8" yui="true" highlight="true"
+         lowUpperBound="35" highLowerBound="70"/>
+    <log type="coverage-clover" target="build/logs/clover.xml"/>
+    <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
+  </logging>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">PHP</directory>
+      <exclude>
+        <file>PHP/Timer/Autoload.php</file>
+      </exclude>
+    </whitelist>
+  </filter>
+</phpunit>
diff --git a/core/vendor/phpunit/php-token-stream/.gitattributes b/core/vendor/phpunit/php-token-stream/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/php-token-stream/ChangeLog.markdown b/core/vendor/phpunit/php-token-stream/ChangeLog.markdown
new file mode 100644
index 0000000..0fb8fff
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/ChangeLog.markdown
@@ -0,0 +1,35 @@
+PHP_TokenStream 1.1
+===================
+
+This is the list of changes for the PHP_TokenStream 1.1 release series.
+
+PHP_TokenStream 1.1.5
+---------------------
+
+* No changes.
+
+PHP_TokenStream 1.1.4
+---------------------
+
+* No changes.
+
+PHP_TokenStream 1.1.3
+---------------------
+
+* Added class for the `T_TRAIT_C` token that was added in PHP 5.4.
+
+PHP_TokenStream 1.1.2
+---------------------
+
+* Added classes for the `T_CALLABLE` and `T_INSTEADOF` tokens that were added in PHP 5.4.
+* Added support for namespaced functions.
+
+PHP_TokenStream 1.1.1
+---------------------
+
+* Fixed issue #19: Notice in `PHP_Token_INTERFACE::hasInterfaces()`.
+
+PHP_TokenStream 1.1.0
+---------------------
+
+* Moved `phptok` tool to separate package.
diff --git a/core/vendor/phpunit/php-token-stream/LICENSE b/core/vendor/phpunit/php-token-stream/LICENSE
new file mode 100644
index 0000000..e5ae55e
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/LICENSE
@@ -0,0 +1,33 @@
+PHP_TokenStream
+
+Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/php-token-stream/PHP/Token.php b/core/vendor/phpunit/php-token-stream/PHP/Token.php
new file mode 100644
index 0000000..450aefa
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/PHP/Token.php
@@ -0,0 +1,717 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   PHP_TokenStream
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.0.0
+ */
+
+/**
+ * A PHP token.
+ *
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version   Release: @package_version@
+ * @link      http://github.com/sebastianbergmann/php-token-stream/tree
+ * @since     Class available since Release 1.0.0
+ */
+abstract class PHP_Token
+{
+    /**
+     * @var string
+     */
+    protected $text;
+
+    /**
+     * @var integer
+     */
+    protected $line;
+
+    /**
+     * @var PHP_Token_Stream
+     */
+    protected $tokenStream;
+
+    /**
+     * @var integer
+     */
+    protected $id;
+
+    /**
+     * Constructor.
+     *
+     * @param string           $text
+     * @param integer          $line
+     * @param PHP_Token_Stream $tokenStream
+     * @param integer          $id
+     */
+    public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id)
+    {
+        $this->text        = $text;
+        $this->line        = $line;
+        $this->tokenStream = $tokenStream;
+        $this->id          = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->text;
+    }
+
+    /**
+     * @return integer
+     */
+    public function getLine()
+    {
+        return $this->line;
+    }
+}
+
+abstract class PHP_TokenWithScope extends PHP_Token
+{
+    protected $endTokenId;
+
+    /**
+     * Get the docblock for this token
+     *
+     * This method will fetch the docblock belonging to the current token. The
+     * docblock must be placed on the line directly above the token to be
+     * recognized.
+     *
+     * @return string|null Returns the docblock as a string if found
+     */
+    public function getDocblock()
+    {
+        $tokens            = $this->tokenStream->tokens();
+        $currentLineNumber = $tokens[$this->id]->getLine();
+        $prevLineNumber    = $currentLineNumber - 1;
+
+        for ($i = $this->id - 1; $i; $i--) {
+            if (!isset($tokens[$i])) {
+                return;
+            }
+
+            if ($tokens[$i] instanceof PHP_Token_FUNCTION ||
+                $tokens[$i] instanceof PHP_Token_CLASS ||
+                $tokens[$i] instanceof PHP_Token_TRAIT) {
+                // Some other trait, class or function, no docblock can be
+                // used for the current token
+                break;
+            }
+
+            $line = $tokens[$i]->getLine();
+
+            if ($line == $currentLineNumber ||
+                ($line == $prevLineNumber &&
+                 $tokens[$i] instanceof PHP_Token_WHITESPACE)) {
+                continue;
+            }
+
+            if ($line < $currentLineNumber &&
+                !$tokens[$i] instanceof PHP_Token_DOC_COMMENT) {
+                break;
+            }
+
+            return (string)$tokens[$i];
+        }
+    }
+
+    public function getEndTokenId()
+    {
+        $block  = 0;
+        $i      = $this->id;
+        $tokens = $this->tokenStream->tokens();
+
+        while ($this->endTokenId === NULL && isset($tokens[$i])) {
+            if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY ||
+                $tokens[$i] instanceof PHP_Token_CURLY_OPEN) {
+                $block++;
+            }
+
+            else if ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) {
+                $block--;
+
+                if ($block === 0) {
+                    $this->endTokenId = $i;
+                }
+            }
+
+            else if (($this instanceof PHP_Token_FUNCTION ||
+                $this instanceof PHP_Token_NAMESPACE) &&
+                $tokens[$i] instanceof PHP_Token_SEMICOLON) {
+                if ($block === 0) {
+                    $this->endTokenId = $i;
+                }
+            }
+
+            $i++;
+        }
+
+        if ($this->endTokenId === NULL) {
+            $this->endTokenId = $this->id;
+        }
+
+        return $this->endTokenId;
+    }
+
+    public function getEndLine()
+    {
+        return $this->tokenStream[$this->getEndTokenId()]->getLine();
+    }
+
+}
+
+abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope {
+
+    public function getVisibility()
+    {
+        $tokens = $this->tokenStream->tokens();
+
+        for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
+            if (isset($tokens[$i]) &&
+               ($tokens[$i] instanceof PHP_Token_PRIVATE ||
+                $tokens[$i] instanceof PHP_Token_PROTECTED ||
+                $tokens[$i] instanceof PHP_Token_PUBLIC)) {
+                return strtolower(
+                  str_replace('PHP_Token_', '', get_class($tokens[$i]))
+                );
+            }
+            if (isset($tokens[$i]) &&
+              !($tokens[$i] instanceof PHP_Token_STATIC ||
+                $tokens[$i] instanceof PHP_Token_FINAL ||
+                $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
+                // no keywords; stop visibility search
+                break;
+            }
+        }
+    }
+
+    public function getKeywords()
+    {
+        $keywords = array();
+        $tokens = $this->tokenStream->tokens();
+
+        for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
+            if (isset($tokens[$i]) &&
+               ($tokens[$i] instanceof PHP_Token_PRIVATE ||
+                $tokens[$i] instanceof PHP_Token_PROTECTED ||
+                $tokens[$i] instanceof PHP_Token_PUBLIC)) {
+                continue;
+            }
+
+            if (isset($tokens[$i]) &&
+               ($tokens[$i] instanceof PHP_Token_STATIC ||
+                $tokens[$i] instanceof PHP_Token_FINAL ||
+                $tokens[$i] instanceof PHP_Token_ABSTRACT)) {
+                $keywords[] = strtolower(
+                  str_replace('PHP_Token_', '', get_class($tokens[$i]))
+                );
+            }
+        }
+
+        return implode(',', $keywords);
+    }
+
+}
+
+abstract class PHP_Token_Includes extends PHP_Token
+{
+    protected $name;
+    protected $type;
+
+    public function getName()
+    {
+        if ($this->name !== NULL) {
+            return $this->name;
+        }
+
+        $tokens = $this->tokenStream->tokens();
+
+        if ($tokens[$this->id+2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
+            $this->name = trim($tokens[$this->id+2], "'\"");
+            $this->type = strtolower(
+              str_replace('PHP_Token_', '', get_class($tokens[$this->id]))
+            );
+        }
+
+        return $this->name;
+    }
+
+    public function getType()
+    {
+        $this->getName();
+        return $this->type;
+    }
+}
+
+class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes {}
+class PHP_Token_REQUIRE extends PHP_Token_Includes {}
+class PHP_Token_EVAL extends PHP_Token {}
+class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes {}
+class PHP_Token_INCLUDE extends PHP_Token_Includes {}
+class PHP_Token_LOGICAL_OR extends PHP_Token {}
+class PHP_Token_LOGICAL_XOR extends PHP_Token {}
+class PHP_Token_LOGICAL_AND extends PHP_Token {}
+class PHP_Token_PRINT extends PHP_Token {}
+class PHP_Token_SR_EQUAL extends PHP_Token {}
+class PHP_Token_SL_EQUAL extends PHP_Token {}
+class PHP_Token_XOR_EQUAL extends PHP_Token {}
+class PHP_Token_OR_EQUAL extends PHP_Token {}
+class PHP_Token_AND_EQUAL extends PHP_Token {}
+class PHP_Token_MOD_EQUAL extends PHP_Token {}
+class PHP_Token_CONCAT_EQUAL extends PHP_Token {}
+class PHP_Token_DIV_EQUAL extends PHP_Token {}
+class PHP_Token_MUL_EQUAL extends PHP_Token {}
+class PHP_Token_MINUS_EQUAL extends PHP_Token {}
+class PHP_Token_PLUS_EQUAL extends PHP_Token {}
+class PHP_Token_BOOLEAN_OR extends PHP_Token {}
+class PHP_Token_BOOLEAN_AND extends PHP_Token {}
+class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token {}
+class PHP_Token_IS_IDENTICAL extends PHP_Token {}
+class PHP_Token_IS_NOT_EQUAL extends PHP_Token {}
+class PHP_Token_IS_EQUAL extends PHP_Token {}
+class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token {}
+class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token {}
+class PHP_Token_SR extends PHP_Token {}
+class PHP_Token_SL extends PHP_Token {}
+class PHP_Token_INSTANCEOF extends PHP_Token {}
+class PHP_Token_UNSET_CAST extends PHP_Token {}
+class PHP_Token_BOOL_CAST extends PHP_Token {}
+class PHP_Token_OBJECT_CAST extends PHP_Token {}
+class PHP_Token_ARRAY_CAST extends PHP_Token {}
+class PHP_Token_STRING_CAST extends PHP_Token {}
+class PHP_Token_DOUBLE_CAST extends PHP_Token {}
+class PHP_Token_INT_CAST extends PHP_Token {}
+class PHP_Token_DEC extends PHP_Token {}
+class PHP_Token_INC extends PHP_Token {}
+class PHP_Token_CLONE extends PHP_Token {}
+class PHP_Token_NEW extends PHP_Token {}
+class PHP_Token_EXIT extends PHP_Token {}
+class PHP_Token_IF extends PHP_Token {}
+class PHP_Token_ELSEIF extends PHP_Token {}
+class PHP_Token_ELSE extends PHP_Token {}
+class PHP_Token_ENDIF extends PHP_Token {}
+class PHP_Token_LNUMBER extends PHP_Token {}
+class PHP_Token_DNUMBER extends PHP_Token {}
+class PHP_Token_STRING extends PHP_Token {}
+class PHP_Token_STRING_VARNAME extends PHP_Token {}
+class PHP_Token_VARIABLE extends PHP_Token {}
+class PHP_Token_NUM_STRING extends PHP_Token {}
+class PHP_Token_INLINE_HTML extends PHP_Token {}
+class PHP_Token_CHARACTER extends PHP_Token {}
+class PHP_Token_BAD_CHARACTER extends PHP_Token {}
+class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token {}
+class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token {}
+class PHP_Token_ECHO extends PHP_Token {}
+class PHP_Token_DO extends PHP_Token {}
+class PHP_Token_WHILE extends PHP_Token {}
+class PHP_Token_ENDWHILE extends PHP_Token {}
+class PHP_Token_FOR extends PHP_Token {}
+class PHP_Token_ENDFOR extends PHP_Token {}
+class PHP_Token_FOREACH extends PHP_Token {}
+class PHP_Token_ENDFOREACH extends PHP_Token {}
+class PHP_Token_DECLARE extends PHP_Token {}
+class PHP_Token_ENDDECLARE extends PHP_Token {}
+class PHP_Token_AS extends PHP_Token {}
+class PHP_Token_SWITCH extends PHP_Token {}
+class PHP_Token_ENDSWITCH extends PHP_Token {}
+class PHP_Token_CASE extends PHP_Token {}
+class PHP_Token_DEFAULT extends PHP_Token {}
+class PHP_Token_BREAK extends PHP_Token {}
+class PHP_Token_CONTINUE extends PHP_Token {}
+class PHP_Token_GOTO extends PHP_Token {}
+class PHP_Token_CALLABLE extends PHP_Token {}
+class PHP_Token_INSTEADOF extends PHP_Token {}
+
+class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
+{
+    protected $arguments;
+    protected $ccn;
+    protected $name;
+    protected $signature;
+
+    public function getArguments()
+    {
+        if ($this->arguments !== NULL) {
+            return $this->arguments;
+        }
+
+        $this->arguments = array();
+        $i               = $this->id + 2;
+        $tokens          = $this->tokenStream->tokens();
+        $typeHint        = NULL;
+
+        while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
+            if ($tokens[$i] instanceof PHP_Token_STRING) {
+                $typeHint = (string)$tokens[$i];
+            }
+
+            else if ($tokens[$i] instanceof PHP_Token_VARIABLE) {
+                $this->arguments[(string)$tokens[$i]] = $typeHint;
+                $typeHint                             = NULL;
+            }
+
+            $i++;
+        }
+
+        return $this->arguments;
+    }
+
+    public function getName()
+    {
+        if ($this->name !== NULL) {
+            return $this->name;
+        }
+
+        $tokens = $this->tokenStream->tokens();
+
+        if ($tokens[$this->id+2] instanceof PHP_Token_STRING) {
+            $this->name = (string)$tokens[$this->id+2];
+        }
+
+        else if ($tokens[$this->id+2] instanceof PHP_Token_AMPERSAND &&
+                 $tokens[$this->id+3] instanceof PHP_Token_STRING) {
+            $this->name = (string)$tokens[$this->id+3];
+        }
+
+        else {
+            $this->name = 'anonymous function';
+        }
+
+        if ($this->name != 'anonymous function') {
+            for ($i = $this->id; $i; --$i) {
+                if ($tokens[$i] instanceof PHP_Token_NAMESPACE) {
+                    $this->name = $tokens[$i]->getName() . '\\' . $this->name;
+                    break;
+                }
+
+                if ($tokens[$i] instanceof PHP_Token_INTERFACE) {
+                    break;
+                }
+            }
+        }
+
+        return $this->name;
+    }
+
+    public function getCCN()
+    {
+        if ($this->ccn !== NULL) {
+            return $this->ccn;
+        }
+
+        $this->ccn = 1;
+        $end       = $this->getEndTokenId();
+        $tokens    = $this->tokenStream->tokens();
+
+        for ($i = $this->id; $i <= $end; $i++) {
+            switch (get_class($tokens[$i])) {
+                case 'PHP_Token_IF':
+                case 'PHP_Token_ELSEIF':
+                case 'PHP_Token_FOR':
+                case 'PHP_Token_FOREACH':
+                case 'PHP_Token_WHILE':
+                case 'PHP_Token_CASE':
+                case 'PHP_Token_CATCH':
+                case 'PHP_Token_BOOLEAN_AND':
+                case 'PHP_Token_LOGICAL_AND':
+                case 'PHP_Token_BOOLEAN_OR':
+                case 'PHP_Token_LOGICAL_OR':
+                case 'PHP_Token_QUESTION_MARK': {
+                    $this->ccn++;
+                }
+                break;
+            }
+        }
+
+        return $this->ccn;
+    }
+
+    public function getSignature()
+    {
+        if ($this->signature !== NULL) {
+            return $this->signature;
+        }
+
+        if ($this->getName() == 'anonymous function') {
+            $this->signature = 'anonymous function';
+            $i               = $this->id + 1;
+        } else {
+            $this->signature = '';
+            $i               = $this->id + 2;
+        }
+
+        $tokens = $this->tokenStream->tokens();
+
+        while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
+            $this->signature .= $tokens[$i++];
+        }
+
+        $this->signature .= ')';
+
+        return $this->signature;
+    }
+}
+
+class PHP_Token_CONST extends PHP_Token {}
+class PHP_Token_RETURN extends PHP_Token {}
+class PHP_Token_TRY extends PHP_Token {}
+class PHP_Token_CATCH extends PHP_Token {}
+class PHP_Token_THROW extends PHP_Token {}
+class PHP_Token_USE extends PHP_Token {}
+class PHP_Token_GLOBAL extends PHP_Token {}
+class PHP_Token_PUBLIC extends PHP_Token {}
+class PHP_Token_PROTECTED extends PHP_Token {}
+class PHP_Token_PRIVATE extends PHP_Token {}
+class PHP_Token_FINAL extends PHP_Token {}
+class PHP_Token_ABSTRACT extends PHP_Token {}
+class PHP_Token_STATIC extends PHP_Token {}
+class PHP_Token_VAR extends PHP_Token {}
+class PHP_Token_UNSET extends PHP_Token {}
+class PHP_Token_ISSET extends PHP_Token {}
+class PHP_Token_EMPTY extends PHP_Token {}
+class PHP_Token_HALT_COMPILER extends PHP_Token {}
+
+class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
+{
+    protected $interfaces;
+
+    public function getName()
+    {
+        return (string)$this->tokenStream[$this->id + 2];
+    }
+
+    public function hasParent()
+    {
+        return $this->tokenStream[$this->id + 4] instanceof PHP_Token_EXTENDS;
+    }
+
+    public function getPackage()
+    {
+        $className  = $this->getName();
+        $docComment = $this->getDocblock();
+
+        $result = array(
+          'namespace'   => '',
+          'fullPackage' => '',
+          'category'    => '',
+          'package'     => '',
+          'subpackage'  => ''
+        );
+
+        for ($i = $this->id; $i; --$i) {
+            if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) {
+                $result['namespace'] = $this->tokenStream[$i]->getName();
+                break;
+            }
+        }
+
+        if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) {
+            $result['category'] = $matches[1];
+        }
+
+        if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) {
+            $result['package']     = $matches[1];
+            $result['fullPackage'] = $matches[1];
+        }
+
+        if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) {
+            $result['subpackage']   = $matches[1];
+            $result['fullPackage'] .= '.' . $matches[1];
+        }
+
+        if (empty($result['fullPackage'])) {
+            $result['fullPackage'] = $this->arrayToName(
+              explode('_', str_replace('\\', '_', $className)), '.'
+            );
+        }
+
+        return $result;
+    }
+
+    protected function arrayToName(array $parts, $join = '\\')
+    {
+        $result = '';
+
+        if (count($parts) > 1) {
+            array_pop($parts);
+
+            $result = join($join, $parts);
+        }
+
+        return $result;
+    }
+
+    public function getParent()
+    {
+        if (!$this->hasParent()) {
+            return FALSE;
+        }
+
+        $i         = $this->id + 6;
+        $tokens    = $this->tokenStream->tokens();
+        $className = (string)$tokens[$i];
+
+        while (isset($tokens[$i+1]) &&
+               !$tokens[$i+1] instanceof PHP_Token_WHITESPACE) {
+            $className .= (string)$tokens[++$i];
+        }
+
+        return $className;
+    }
+
+    public function hasInterfaces()
+    {
+        return (isset($this->tokenStream[$this->id + 4]) &&
+                $this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) ||
+               (isset($this->tokenStream[$this->id + 8]) &&
+                $this->tokenStream[$this->id + 8] instanceof PHP_Token_IMPLEMENTS);
+    }
+
+    public function getInterfaces()
+    {
+        if ($this->interfaces !== NULL) {
+            return $this->interfaces;
+        }
+
+        if (!$this->hasInterfaces()) {
+            return ($this->interfaces = FALSE);
+        }
+
+        if ($this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) {
+            $i = $this->id + 3;
+        } else {
+            $i = $this->id + 7;
+        }
+
+        $tokens = $this->tokenStream->tokens();
+
+        while (!$tokens[$i+1] instanceof PHP_Token_OPEN_CURLY) {
+            $i++;
+
+            if ($tokens[$i] instanceof PHP_Token_STRING) {
+                $this->interfaces[] = (string)$tokens[$i];
+            }
+        }
+
+        return $this->interfaces;
+    }
+}
+
+class PHP_Token_CLASS extends PHP_Token_INTERFACE {}
+class PHP_Token_TRAIT extends PHP_Token_INTERFACE {}
+class PHP_Token_EXTENDS extends PHP_Token {}
+class PHP_Token_IMPLEMENTS extends PHP_Token {}
+class PHP_Token_OBJECT_OPERATOR extends PHP_Token {}
+class PHP_Token_DOUBLE_ARROW extends PHP_Token {}
+class PHP_Token_LIST extends PHP_Token {}
+class PHP_Token_ARRAY extends PHP_Token {}
+class PHP_Token_CLASS_C extends PHP_Token {}
+class PHP_Token_TRAIT_C extends PHP_Token {}
+class PHP_Token_METHOD_C extends PHP_Token {}
+class PHP_Token_FUNC_C extends PHP_Token {}
+class PHP_Token_LINE extends PHP_Token {}
+class PHP_Token_FILE extends PHP_Token {}
+class PHP_Token_COMMENT extends PHP_Token {}
+class PHP_Token_DOC_COMMENT extends PHP_Token {}
+class PHP_Token_OPEN_TAG extends PHP_Token {}
+class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token {}
+class PHP_Token_CLOSE_TAG extends PHP_Token {}
+class PHP_Token_WHITESPACE extends PHP_Token {}
+class PHP_Token_START_HEREDOC extends PHP_Token {}
+class PHP_Token_END_HEREDOC extends PHP_Token {}
+class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token {}
+class PHP_Token_CURLY_OPEN extends PHP_Token {}
+class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token {}
+
+class PHP_Token_NAMESPACE extends PHP_TokenWithScope
+{
+    public function getName()
+    {
+        $tokens    = $this->tokenStream->tokens();
+        $namespace = (string)$tokens[$this->id+2];
+
+        for ($i = $this->id + 3; ; $i += 2) {
+            if (isset($tokens[$i]) &&
+                $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
+                $namespace .= '\\' . $tokens[$i+1];
+            } else {
+                break;
+            }
+        }
+
+        return $namespace;
+    }
+}
+
+class PHP_Token_NS_C extends PHP_Token {}
+class PHP_Token_DIR extends PHP_Token {}
+class PHP_Token_NS_SEPARATOR extends PHP_Token {}
+class PHP_Token_DOUBLE_COLON extends PHP_Token {}
+class PHP_Token_OPEN_BRACKET extends PHP_Token {}
+class PHP_Token_CLOSE_BRACKET extends PHP_Token {}
+class PHP_Token_OPEN_SQUARE extends PHP_Token {}
+class PHP_Token_CLOSE_SQUARE extends PHP_Token {}
+class PHP_Token_OPEN_CURLY extends PHP_Token {}
+class PHP_Token_CLOSE_CURLY extends PHP_Token {}
+class PHP_Token_SEMICOLON extends PHP_Token {}
+class PHP_Token_DOT extends PHP_Token {}
+class PHP_Token_COMMA extends PHP_Token {}
+class PHP_Token_EQUAL extends PHP_Token {}
+class PHP_Token_LT extends PHP_Token {}
+class PHP_Token_GT extends PHP_Token {}
+class PHP_Token_PLUS extends PHP_Token {}
+class PHP_Token_MINUS extends PHP_Token {}
+class PHP_Token_MULT extends PHP_Token {}
+class PHP_Token_DIV extends PHP_Token {}
+class PHP_Token_QUESTION_MARK extends PHP_Token {}
+class PHP_Token_EXCLAMATION_MARK extends PHP_Token {}
+class PHP_Token_COLON extends PHP_Token {}
+class PHP_Token_DOUBLE_QUOTES extends PHP_Token {}
+class PHP_Token_AT extends PHP_Token {}
+class PHP_Token_AMPERSAND extends PHP_Token {}
+class PHP_Token_PERCENT extends PHP_Token {}
+class PHP_Token_PIPE extends PHP_Token {}
+class PHP_Token_DOLLAR extends PHP_Token {}
+class PHP_Token_CARET extends PHP_Token {}
+class PHP_Token_TILDE extends PHP_Token {}
+class PHP_Token_BACKTICK extends PHP_Token {}
diff --git a/core/vendor/phpunit/php-token-stream/PHP/Token/Stream.php b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream.php
new file mode 100644
index 0000000..a8be36f
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream.php
@@ -0,0 +1,568 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   PHP_TokenStream
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.0.0
+ */
+
+/**
+ * A stream of PHP tokens.
+ *
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version   Release: @package_version@
+ * @link      http://github.com/sebastianbergmann/php-token-stream/tree
+ * @since     Class available since Release 1.0.0
+ */
+class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
+{
+    /**
+     * @var array
+     */
+    protected static $customTokens = array(
+      '(' => 'PHP_Token_OPEN_BRACKET',
+      ')' => 'PHP_Token_CLOSE_BRACKET',
+      '[' => 'PHP_Token_OPEN_SQUARE',
+      ']' => 'PHP_Token_CLOSE_SQUARE',
+      '{' => 'PHP_Token_OPEN_CURLY',
+      '}' => 'PHP_Token_CLOSE_CURLY',
+      ';' => 'PHP_Token_SEMICOLON',
+      '.' => 'PHP_Token_DOT',
+      ',' => 'PHP_Token_COMMA',
+      '=' => 'PHP_Token_EQUAL',
+      '<' => 'PHP_Token_LT',
+      '>' => 'PHP_Token_GT',
+      '+' => 'PHP_Token_PLUS',
+      '-' => 'PHP_Token_MINUS',
+      '*' => 'PHP_Token_MULT',
+      '/' => 'PHP_Token_DIV',
+      '?' => 'PHP_Token_QUESTION_MARK',
+      '!' => 'PHP_Token_EXCLAMATION_MARK',
+      ':' => 'PHP_Token_COLON',
+      '"' => 'PHP_Token_DOUBLE_QUOTES',
+      '@' => 'PHP_Token_AT',
+      '&' => 'PHP_Token_AMPERSAND',
+      '%' => 'PHP_Token_PERCENT',
+      '|' => 'PHP_Token_PIPE',
+      '$' => 'PHP_Token_DOLLAR',
+      '^' => 'PHP_Token_CARET',
+      '~' => 'PHP_Token_TILDE',
+      '`' => 'PHP_Token_BACKTICK'
+    );
+
+    /**
+     * @var string
+     */
+    protected $filename;
+
+    /**
+     * @var array
+     */
+    protected $tokens = array();
+
+    /**
+     * @var integer
+     */
+    protected $position = 0;
+
+    /**
+     * @var array
+     */
+    protected $linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
+
+    /**
+     * @var array
+     */
+    protected $classes;
+
+    /**
+     * @var array
+     */
+    protected $functions;
+
+    /**
+     * @var array
+     */
+    protected $includes;
+
+    /**
+     * @var array
+     */
+    protected $interfaces;
+
+    /**
+     * @var array
+     */
+    protected $traits;
+
+    /**
+     * Constructor.
+     *
+     * @param string $sourceCode
+     */
+    public function __construct($sourceCode)
+    {
+        if (is_file($sourceCode)) {
+            $this->filename = $sourceCode;
+            $sourceCode     = file_get_contents($sourceCode);
+        }
+
+        $this->scan($sourceCode);
+    }
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        $this->tokens = array();
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        $buffer = '';
+
+        foreach ($this as $token) {
+            $buffer .= $token;
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * @return string
+     * @since  Method available since Release 1.1.0
+     */
+    public function getFilename()
+    {
+        return $this->filename;
+    }
+
+    /**
+     * Scans the source for sequences of characters and converts them into a
+     * stream of tokens.
+     *
+     * @param string $sourceCode
+     */
+    protected function scan($sourceCode)
+    {
+        $line      = 1;
+        $tokens    = token_get_all($sourceCode);
+        $numTokens = count($tokens);
+
+        for ($i = 0; $i < $numTokens; ++$i) {
+            $token = $tokens[$i];
+            unset($tokens[$i]);
+
+            if (is_array($token)) {
+                $text       = $token[1];
+                $tokenClass = 'PHP_Token_' . substr(token_name($token[0]), 2);
+            } else {
+                $text       = $token;
+                $tokenClass = self::$customTokens[$token];
+            }
+
+            $this->tokens[] = new $tokenClass($text, $line, $this, $i);
+            $lines          = substr_count($text, "\n");
+            $line          += $lines;
+
+            if ($tokenClass == 'PHP_Token_HALT_COMPILER') {
+                break;
+            }
+
+            else if ($tokenClass == 'PHP_Token_COMMENT' ||
+                $tokenClass == 'PHP_Token_DOC_COMMENT') {
+                $this->linesOfCode['cloc'] += $lines + 1;
+            }
+        }
+
+        $this->linesOfCode['loc']   = substr_count($sourceCode, "\n");
+        $this->linesOfCode['ncloc'] = $this->linesOfCode['loc'] -
+                                      $this->linesOfCode['cloc'];
+    }
+
+    /**
+     * @return integer
+     */
+    public function count()
+    {
+        return count($this->tokens);
+    }
+
+    /**
+     * @return PHP_Token[]
+     */
+    public function tokens()
+    {
+        return $this->tokens;
+    }
+
+    /**
+     * @return array
+     */
+    public function getClasses()
+    {
+        if ($this->classes !== NULL) {
+            return $this->classes;
+        }
+
+        $this->parse();
+
+        return $this->classes;
+    }
+
+    /**
+     * @return array
+     */
+    public function getFunctions()
+    {
+        if ($this->functions !== NULL) {
+            return $this->functions;
+        }
+
+        $this->parse();
+
+        return $this->functions;
+    }
+
+    /**
+     * @return array
+     */
+    public function getInterfaces()
+    {
+        if ($this->interfaces !== NULL) {
+            return $this->interfaces;
+        }
+
+        $this->parse();
+
+        return $this->interfaces;
+    }
+
+    /**
+     * @return array
+     * @since  Method available since Release 1.1.0
+     */
+    public function getTraits()
+    {
+        if ($this->traits !== NULL) {
+            return $this->traits;
+        }
+
+        $this->parse();
+
+        return $this->traits;
+    }
+
+    /**
+     * Gets the names of all files that have been included
+     * using include(), include_once(), require() or require_once().
+     *
+     * Parameter $categorize set to TRUE causing this function to return a
+     * multi-dimensional array with categories in the keys of the first dimension
+     * and constants and their values in the second dimension.
+     *
+     * Parameter $category allow to filter following specific inclusion type
+     *
+     * @param bool   $categorize OPTIONAL
+     * @param string $category   OPTIONAL Either 'require_once', 'require',
+     *                                           'include_once', 'include'.
+     * @return array
+     * @since  Method available since Release 1.1.0
+     */
+    public function getIncludes($categorize = FALSE, $category = NULL)
+    {
+        if ($this->includes === NULL) {
+            $this->includes = array(
+              'require_once' => array(),
+              'require'      => array(),
+              'include_once' => array(),
+              'include'      => array()
+            );
+
+            foreach ($this->tokens as $token) {
+                switch (get_class($token)) {
+                    case 'PHP_Token_REQUIRE_ONCE':
+                    case 'PHP_Token_REQUIRE':
+                    case 'PHP_Token_INCLUDE_ONCE':
+                    case 'PHP_Token_INCLUDE': {
+                        $this->includes[$token->getType()][] = $token->getName();
+                    }
+                    break;
+                }
+            }
+        }
+
+        if (isset($this->includes[$category])) {
+            $includes = $this->includes[$category];
+        }
+
+        else if ($categorize === FALSE) {
+            $includes = array_merge(
+              $this->includes['require_once'],
+              $this->includes['require'],
+              $this->includes['include_once'],
+              $this->includes['include']
+            );
+        } else {
+            $includes = $this->includes;
+        }
+
+        return $includes;
+    }
+
+    protected function parse()
+    {
+        $this->interfaces = array();
+        $this->classes    = array();
+        $this->traits     = array();
+        $this->functions  = array();
+        $class            = FALSE;
+        $classEndLine     = FALSE;
+        $trait            = FALSE;
+        $traitEndLine     = FALSE;
+        $interface        = FALSE;
+        $interfaceEndLine = FALSE;
+
+        foreach ($this->tokens as $token) {
+            switch (get_class($token)) {
+                case 'PHP_Token_HALT_COMPILER': {
+                    return;
+                }
+                break;
+
+                case 'PHP_Token_INTERFACE': {
+                    $interface        = $token->getName();
+                    $interfaceEndLine = $token->getEndLine();
+
+                    $this->interfaces[$interface] = array(
+                      'methods'   => array(),
+                      'parent'    => $token->getParent(),
+                      'keywords'  => $token->getKeywords(),
+                      'docblock'  => $token->getDocblock(),
+                      'startLine' => $token->getLine(),
+                      'endLine'   => $interfaceEndLine,
+                      'package'   => $token->getPackage(),
+                      'file'      => $this->filename
+                    );
+                }
+                break;
+
+                case 'PHP_Token_CLASS':
+                case 'PHP_Token_TRAIT': {
+                    $tmp = array(
+                      'methods'   => array(),
+                      'parent'    => $token->getParent(),
+                      'interfaces'=> $token->getInterfaces(),
+                      'keywords'  => $token->getKeywords(),
+                      'docblock'  => $token->getDocblock(),
+                      'startLine' => $token->getLine(),
+                      'endLine'   => $token->getEndLine(),
+                      'package'   => $token->getPackage(),
+                      'file'      => $this->filename
+                    );
+
+                    if ($token instanceof PHP_Token_CLASS) {
+                        $class                 = $token->getName();
+                        $classEndLine          = $token->getEndLine();
+                        $this->classes[$class] = $tmp;
+                    } else {
+                        $trait                = $token->getName();
+                        $traitEndLine         = $token->getEndLine();
+                        $this->traits[$trait] = $tmp;
+                    }
+                }
+                break;
+
+                case 'PHP_Token_FUNCTION': {
+                    $name = $token->getName();
+                    $tmp  = array(
+                      'docblock'  => $token->getDocblock(),
+                      'keywords'  => $token->getKeywords(),
+                      'visibility'=> $token->getVisibility(),
+                      'signature' => $token->getSignature(),
+                      'startLine' => $token->getLine(),
+                      'endLine'   => $token->getEndLine(),
+                      'ccn'       => $token->getCCN(),
+                      'file'      => $this->filename
+                    );
+
+                    if ($class === FALSE &&
+                        $trait === FALSE &&
+                        $interface === FALSE) {
+                        $this->functions[$name] = $tmp;
+                    }
+
+                    else if ($class !== FALSE) {
+                        $this->classes[$class]['methods'][$name] = $tmp;
+                    }
+
+                    else if ($trait !== FALSE) {
+                        $this->traits[$trait]['methods'][$name] = $tmp;
+                    }
+
+                    else {
+                        $this->interfaces[$interface]['methods'][$name] = $tmp;
+                    }
+                }
+                break;
+
+                case 'PHP_Token_CLOSE_CURLY': {
+                    if ($classEndLine !== FALSE &&
+                        $classEndLine == $token->getLine()) {
+                        $class        = FALSE;
+                        $classEndLine = FALSE;
+                    }
+
+                    else if ($traitEndLine !== FALSE &&
+                        $traitEndLine == $token->getLine()) {
+                        $trait        = FALSE;
+                        $traitEndLine = FALSE;
+                    }
+
+                    else if ($interfaceEndLine !== FALSE &&
+                        $interfaceEndLine == $token->getLine()) {
+                        $interface        = FALSE;
+                        $interfaceEndLine = FALSE;
+                    }
+                }
+                break;
+            }
+        }
+    }
+
+    /**
+     * @return array
+     */
+    public function getLinesOfCode()
+    {
+        return $this->linesOfCode;
+    }
+
+    /**
+     */
+    public function rewind()
+    {
+        $this->position = 0;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function valid()
+    {
+        return isset($this->tokens[$this->position]);
+    }
+
+    /**
+     * @return integer
+     */
+    public function key()
+    {
+        return $this->position;
+    }
+
+    /**
+     * @return PHP_Token
+     */
+    public function current()
+    {
+        return $this->tokens[$this->position];
+    }
+
+    /**
+     */
+    public function next()
+    {
+        $this->position++;
+    }
+
+    /**
+     * @param mixed $offset
+     */
+    public function offsetExists($offset)
+    {
+        return isset($this->tokens[$offset]);
+    }
+
+    /**
+     * @param  mixed $offset
+     * @return mixed
+     */
+    public function offsetGet($offset)
+    {
+        return $this->tokens[$offset];
+    }
+
+    /**
+     * @param mixed $offset
+     * @param mixed $value
+     */
+    public function offsetSet($offset, $value)
+    {
+        $this->tokens[$offset] = $value;
+    }
+
+    /**
+     * @param mixed $offset
+     */
+    public function offsetUnset($offset)
+    {
+        unset($this->tokens[$offset]);
+    }
+
+    /**
+     * Seek to an absolute position.
+     *
+     * @param  integer $position
+     * @throws OutOfBoundsException
+     */
+    public function seek($position)
+    {
+        $this->position = $position;
+
+        if (!$this->valid()) {
+            throw new OutOfBoundsException('Invalid seek position');
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php
new file mode 100644
index 0000000..5c8cc21
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   PHP_TokenStream
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link      http://github.com/sebastianbergmann/php-token-stream/tree
+ * @since     File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'php_token' => '/Token.php',
+            'php_token_abstract' => '/Token.php',
+            'php_token_ampersand' => '/Token.php',
+            'php_token_and_equal' => '/Token.php',
+            'php_token_array' => '/Token.php',
+            'php_token_array_cast' => '/Token.php',
+            'php_token_as' => '/Token.php',
+            'php_token_at' => '/Token.php',
+            'php_token_backtick' => '/Token.php',
+            'php_token_bad_character' => '/Token.php',
+            'php_token_bool_cast' => '/Token.php',
+            'php_token_boolean_and' => '/Token.php',
+            'php_token_boolean_or' => '/Token.php',
+            'php_token_break' => '/Token.php',
+            'php_token_callable' => '/Token.php',
+            'php_token_caret' => '/Token.php',
+            'php_token_case' => '/Token.php',
+            'php_token_catch' => '/Token.php',
+            'php_token_character' => '/Token.php',
+            'php_token_class' => '/Token.php',
+            'php_token_class_c' => '/Token.php',
+            'php_token_clone' => '/Token.php',
+            'php_token_close_bracket' => '/Token.php',
+            'php_token_close_curly' => '/Token.php',
+            'php_token_close_square' => '/Token.php',
+            'php_token_close_tag' => '/Token.php',
+            'php_token_colon' => '/Token.php',
+            'php_token_comma' => '/Token.php',
+            'php_token_comment' => '/Token.php',
+            'php_token_concat_equal' => '/Token.php',
+            'php_token_const' => '/Token.php',
+            'php_token_constant_encapsed_string' => '/Token.php',
+            'php_token_continue' => '/Token.php',
+            'php_token_curly_open' => '/Token.php',
+            'php_token_dec' => '/Token.php',
+            'php_token_declare' => '/Token.php',
+            'php_token_default' => '/Token.php',
+            'php_token_dir' => '/Token.php',
+            'php_token_div' => '/Token.php',
+            'php_token_div_equal' => '/Token.php',
+            'php_token_dnumber' => '/Token.php',
+            'php_token_do' => '/Token.php',
+            'php_token_doc_comment' => '/Token.php',
+            'php_token_dollar' => '/Token.php',
+            'php_token_dollar_open_curly_braces' => '/Token.php',
+            'php_token_dot' => '/Token.php',
+            'php_token_double_arrow' => '/Token.php',
+            'php_token_double_cast' => '/Token.php',
+            'php_token_double_colon' => '/Token.php',
+            'php_token_double_quotes' => '/Token.php',
+            'php_token_echo' => '/Token.php',
+            'php_token_else' => '/Token.php',
+            'php_token_elseif' => '/Token.php',
+            'php_token_empty' => '/Token.php',
+            'php_token_encapsed_and_whitespace' => '/Token.php',
+            'php_token_end_heredoc' => '/Token.php',
+            'php_token_enddeclare' => '/Token.php',
+            'php_token_endfor' => '/Token.php',
+            'php_token_endforeach' => '/Token.php',
+            'php_token_endif' => '/Token.php',
+            'php_token_endswitch' => '/Token.php',
+            'php_token_endwhile' => '/Token.php',
+            'php_token_equal' => '/Token.php',
+            'php_token_eval' => '/Token.php',
+            'php_token_exclamation_mark' => '/Token.php',
+            'php_token_exit' => '/Token.php',
+            'php_token_extends' => '/Token.php',
+            'php_token_file' => '/Token.php',
+            'php_token_final' => '/Token.php',
+            'php_token_for' => '/Token.php',
+            'php_token_foreach' => '/Token.php',
+            'php_token_func_c' => '/Token.php',
+            'php_token_function' => '/Token.php',
+            'php_token_global' => '/Token.php',
+            'php_token_goto' => '/Token.php',
+            'php_token_gt' => '/Token.php',
+            'php_token_halt_compiler' => '/Token.php',
+            'php_token_if' => '/Token.php',
+            'php_token_implements' => '/Token.php',
+            'php_token_inc' => '/Token.php',
+            'php_token_include' => '/Token.php',
+            'php_token_include_once' => '/Token.php',
+            'php_token_includes' => '/Token.php',
+            'php_token_inline_html' => '/Token.php',
+            'php_token_instanceof' => '/Token.php',
+            'php_token_insteadof' => '/Token.php',
+            'php_token_int_cast' => '/Token.php',
+            'php_token_interface' => '/Token.php',
+            'php_token_is_equal' => '/Token.php',
+            'php_token_is_greater_or_equal' => '/Token.php',
+            'php_token_is_identical' => '/Token.php',
+            'php_token_is_not_equal' => '/Token.php',
+            'php_token_is_not_identical' => '/Token.php',
+            'php_token_is_smaller_or_equal' => '/Token.php',
+            'php_token_isset' => '/Token.php',
+            'php_token_line' => '/Token.php',
+            'php_token_list' => '/Token.php',
+            'php_token_lnumber' => '/Token.php',
+            'php_token_logical_and' => '/Token.php',
+            'php_token_logical_or' => '/Token.php',
+            'php_token_logical_xor' => '/Token.php',
+            'php_token_lt' => '/Token.php',
+            'php_token_method_c' => '/Token.php',
+            'php_token_minus' => '/Token.php',
+            'php_token_minus_equal' => '/Token.php',
+            'php_token_mod_equal' => '/Token.php',
+            'php_token_mul_equal' => '/Token.php',
+            'php_token_mult' => '/Token.php',
+            'php_token_namespace' => '/Token.php',
+            'php_token_new' => '/Token.php',
+            'php_token_ns_c' => '/Token.php',
+            'php_token_ns_separator' => '/Token.php',
+            'php_token_num_string' => '/Token.php',
+            'php_token_object_cast' => '/Token.php',
+            'php_token_object_operator' => '/Token.php',
+            'php_token_open_bracket' => '/Token.php',
+            'php_token_open_curly' => '/Token.php',
+            'php_token_open_square' => '/Token.php',
+            'php_token_open_tag' => '/Token.php',
+            'php_token_open_tag_with_echo' => '/Token.php',
+            'php_token_or_equal' => '/Token.php',
+            'php_token_paamayim_nekudotayim' => '/Token.php',
+            'php_token_percent' => '/Token.php',
+            'php_token_pipe' => '/Token.php',
+            'php_token_plus' => '/Token.php',
+            'php_token_plus_equal' => '/Token.php',
+            'php_token_print' => '/Token.php',
+            'php_token_private' => '/Token.php',
+            'php_token_protected' => '/Token.php',
+            'php_token_public' => '/Token.php',
+            'php_token_question_mark' => '/Token.php',
+            'php_token_require' => '/Token.php',
+            'php_token_require_once' => '/Token.php',
+            'php_token_return' => '/Token.php',
+            'php_token_semicolon' => '/Token.php',
+            'php_token_sl' => '/Token.php',
+            'php_token_sl_equal' => '/Token.php',
+            'php_token_sr' => '/Token.php',
+            'php_token_sr_equal' => '/Token.php',
+            'php_token_start_heredoc' => '/Token.php',
+            'php_token_static' => '/Token.php',
+            'php_token_stream' => '/Token/Stream.php',
+            'php_token_stream_cachingfactory' => '/Token/Stream/CachingFactory.php',
+            'php_token_string' => '/Token.php',
+            'php_token_string_cast' => '/Token.php',
+            'php_token_string_varname' => '/Token.php',
+            'php_token_switch' => '/Token.php',
+            'php_token_throw' => '/Token.php',
+            'php_token_tilde' => '/Token.php',
+            'php_token_trait' => '/Token.php',
+            'php_token_trait_c' => '/Token.php',
+            'php_token_try' => '/Token.php',
+            'php_token_unset' => '/Token.php',
+            'php_token_unset_cast' => '/Token.php',
+            'php_token_use' => '/Token.php',
+            'php_token_var' => '/Token.php',
+            'php_token_variable' => '/Token.php',
+            'php_token_while' => '/Token.php',
+            'php_token_whitespace' => '/Token.php',
+            'php_token_xor_equal' => '/Token.php',
+            'php_tokenwithscope' => '/Token.php',
+            'php_tokenwithscopeandvisibility' => '/Token.php'
+          );
+
+          $path = dirname(dirname(dirname(__FILE__)));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php.in b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php.in
new file mode 100644
index 0000000..1cb3981
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/Autoload.php.in
@@ -0,0 +1,65 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   PHP_TokenStream
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link      http://github.com/sebastianbergmann/php-token-stream/tree
+ * @since     File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;;
+
+      if ($classes === NULL) {
+          $classes = array(
+            ___CLASSLIST___
+          );
+
+          $path = dirname(dirname(dirname(__FILE__)));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/CachingFactory.php b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/CachingFactory.php
new file mode 100644
index 0000000..dd49967
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/PHP/Token/Stream/CachingFactory.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package   PHP_TokenStream
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since     File available since Release 1.0.0
+ */
+
+/**
+ * A caching factory for token stream objects.
+ *
+ * @author    Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright 2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version   Release: @package_version@
+ * @link      http://github.com/sebastianbergmann/php-token-stream/tree
+ * @since     Class available since Release 1.0.0
+ */
+class PHP_Token_Stream_CachingFactory
+{
+    /**
+     * @var array
+     */
+    protected static $cache = array();
+
+    /**
+     * @param  string $filename
+     * @return PHP_Token_Stream
+     */
+    public static function get($filename)
+    {
+        if (!isset(self::$cache[$filename])) {
+            self::$cache[$filename] = new PHP_Token_Stream($filename);
+        }
+
+        return self::$cache[$filename];
+    }
+
+    /**
+     * @param string $filename
+     */
+    public static function clear($filename = NULL)
+    {
+        if (is_string($filename)) {
+            unset(self::$cache[$filename]);
+        } else {
+            self::$cache = array();
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/README.markdown b/core/vendor/phpunit/php-token-stream/README.markdown
new file mode 100644
index 0000000..e233f41
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/README.markdown
@@ -0,0 +1,23 @@
+PHP_TokenStream
+===============
+
+Installation
+------------
+
+PHP_TokenStream should be installed using the [PEAR Installer](http://pear.php.net/). This installer is the backbone of PEAR, which provides a distribution system for PHP packages, and is shipped with every release of PHP since version 4.3.0.
+
+The PEAR channel (`pear.phpunit.de`) that is used to distribute PHP_TokenStream needs to be registered with the local PEAR environment:
+
+    sb@ubuntu ~ % pear channel-discover pear.phpunit.de
+    Adding Channel "pear.phpunit.de" succeeded
+    Discovery of channel "pear.phpunit.de" succeeded
+
+This has to be done only once. Now the PEAR Installer can be used to install packages from the PHPUnit channel:
+
+    sb@ubuntu tokenstream % pear install phpunit/PHP_TokenStream-beta
+    downloading PHP_TokenStream-0.9.1.tgz ...
+    Starting to download PHP_TokenStream-0.9.1.tgz (5,113 bytes)
+    ...done: 5,113 bytes
+    install ok: channel://pear.phpunit.de/PHP_TokenStream-0.9.1
+
+After the installation you can find the PHP_TokenStream source files inside your local PEAR directory; the path is usually `/usr/lib/php/PHP`.
diff --git a/core/vendor/phpunit/php-token-stream/Tests/Token/ClassTest.php b/core/vendor/phpunit/php-token-stream/Tests/Token/ClassTest.php
new file mode 100644
index 0000000..62f429b
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/Token/ClassTest.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Laurent Laville <pear@laurent-laville.org>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.2
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token_CLASS class.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Laurent Laville <pear@laurent-laville.org>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.2
+ */
+class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
+{
+    protected $class;
+    protected $function;
+
+    protected function setUp()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source2.php');
+
+        foreach ($ts as $token) {
+            if ($token instanceof PHP_Token_CLASS) {
+                $this->class = $token;
+            }
+
+            if ($token instanceof PHP_Token_FUNCTION) {
+                $this->function = $token;
+                break;
+            }
+        }
+    }
+
+    /**
+     * @covers PHP_Token_CLASS::getKeywords
+     */
+    public function testGetClassKeywords()
+    {
+        $this->assertEquals('abstract', $this->class->getKeywords());
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getKeywords
+     */
+    public function testGetFunctionKeywords()
+    {
+        $this->assertEquals('abstract,static', $this->function->getKeywords());
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getVisibility
+     */
+    public function testGetFunctionVisibility()
+    {
+        $this->assertEquals('public', $this->function->getVisibility());
+    }
+
+    public function testIssue19()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'issue19.php');
+
+        foreach ($ts as $token) {
+            if ($token instanceof PHP_Token_CLASS) {
+                $this->assertFalse($token->hasInterfaces());
+            }
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/Token/ClosureTest.php b/core/vendor/phpunit/php-token-stream/Tests/Token/ClosureTest.php
new file mode 100644
index 0000000..44b57a7
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/Token/ClosureTest.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token_FUNCTION class.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
+{
+    protected $functions;
+
+    protected function setUp()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'closure.php');
+
+        foreach ($ts as $token) {
+            if ($token instanceof PHP_Token_FUNCTION) {
+                $this->functions[] = $token;
+            }
+        }
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getArguments
+     */
+    public function testGetArguments()
+    {
+        $this->assertEquals(array('$foo' => null, '$bar' => null), $this->functions[0]->getArguments());
+        $this->assertEquals(array('$foo' => null, '$bar' => null, '$baz' => null), $this->functions[1]->getArguments());
+        $this->assertEquals(array(), $this->functions[2]->getArguments());
+        $this->assertEquals(array(), $this->functions[3]->getArguments());
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getName
+     */
+    public function testGetName()
+    {
+        $this->assertEquals('anonymous function', $this->functions[0]->getName());
+        $this->assertEquals('anonymous function', $this->functions[1]->getName());
+        $this->assertEquals('anonymous function', $this->functions[2]->getName());
+        $this->assertEquals('anonymous function', $this->functions[3]->getName());
+    }
+
+    /**
+     * @covers PHP_Token::getLine
+     */
+    public function testGetLine()
+    {
+        $this->assertEquals(2, $this->functions[0]->getLine());
+        $this->assertEquals(3, $this->functions[1]->getLine());
+        $this->assertEquals(4, $this->functions[2]->getLine());
+        $this->assertEquals(5, $this->functions[3]->getLine());
+    }
+
+    /**
+     * @covers PHP_TokenWithScope::getEndLine
+     */
+    public function testGetEndLine()
+    {
+        $this->assertEquals(2, $this->functions[0]->getLine());
+        $this->assertEquals(3, $this->functions[1]->getLine());
+        $this->assertEquals(4, $this->functions[2]->getLine());
+        $this->assertEquals(5, $this->functions[3]->getLine());
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/Token/FunctionTest.php b/core/vendor/phpunit/php-token-stream/Tests/Token/FunctionTest.php
new file mode 100644
index 0000000..779d62e
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/Token/FunctionTest.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token_FUNCTION class.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_Token_FunctionTest extends PHPUnit_Framework_TestCase
+{
+    protected $functions;
+
+    protected function setUp()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source.php');
+
+        foreach ($ts as $token) {
+            if ($token instanceof PHP_Token_FUNCTION) {
+                $this->functions[] = $token;
+            }
+        }
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getArguments
+     */
+    public function testGetArguments()
+    {
+        $this->assertEquals(array(), $this->functions[0]->getArguments());
+
+        $this->assertEquals(
+          array('$baz' => 'Baz'), $this->functions[1]->getArguments()
+        );
+
+        $this->assertEquals(
+          array('$foobar' => 'Foobar'), $this->functions[2]->getArguments()
+        );
+
+        $this->assertEquals(
+          array('$barfoo' => 'Barfoo'), $this->functions[3]->getArguments()
+        );
+
+        $this->assertEquals(array(), $this->functions[4]->getArguments());
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getName
+     */
+    public function testGetName()
+    {
+        $this->assertEquals('foo', $this->functions[0]->getName());
+        $this->assertEquals('bar', $this->functions[1]->getName());
+        $this->assertEquals('foobar', $this->functions[2]->getName());
+        $this->assertEquals('barfoo', $this->functions[3]->getName());
+        $this->assertEquals('baz', $this->functions[4]->getName());
+    }
+
+    /**
+     * @covers PHP_Token::getLine
+     */
+    public function testGetLine()
+    {
+        $this->assertEquals(5, $this->functions[0]->getLine());
+        $this->assertEquals(10, $this->functions[1]->getLine());
+        $this->assertEquals(17, $this->functions[2]->getLine());
+        $this->assertEquals(21, $this->functions[3]->getLine());
+        $this->assertEquals(29, $this->functions[4]->getLine());
+    }
+
+    /**
+     * @covers PHP_TokenWithScope::getEndLine
+     */
+    public function testGetEndLine()
+    {
+        $this->assertEquals(5, $this->functions[0]->getEndLine());
+        $this->assertEquals(12, $this->functions[1]->getEndLine());
+        $this->assertEquals(19, $this->functions[2]->getEndLine());
+        $this->assertEquals(23, $this->functions[3]->getEndLine());
+        $this->assertEquals(31, $this->functions[4]->getEndLine());
+    }
+
+    /**
+     * @covers PHP_Token_FUNCTION::getDocblock
+     */
+    public function testGetDocblock()
+    {
+        $this->assertNull($this->functions[0]->getDocblock());
+
+        $this->assertEquals(
+          "/**\n     * @param Baz \$baz\n     */",
+          $this->functions[1]->getDocblock()
+        );
+
+        $this->assertEquals(
+          "/**\n     * @param Foobar \$foobar\n     */",
+          $this->functions[2]->getDocblock()
+        );
+
+        $this->assertNull($this->functions[3]->getDocblock());
+        $this->assertNull($this->functions[4]->getDocblock());
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/Token/IncludeTest.php b/core/vendor/phpunit/php-token-stream/Tests/Token/IncludeTest.php
new file mode 100644
index 0000000..02e574e
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/Token/IncludeTest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Laurent Laville <pear@laurent-laville.org>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.2
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token_REQUIRE_ONCE, PHP_Token_REQUIRE
+ * PHP_Token_INCLUDE_ONCE and PHP_Token_INCLUDE_ONCE classes.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Laurent Laville <pear@laurent-laville.org>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.2
+ */
+class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
+{
+    protected $ts;
+
+    protected function setUp()
+    {
+        $this->ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source3.php');
+    }
+
+    /**
+     * @covers PHP_Token_Includes::getName
+     * @covers PHP_Token_Includes::getType
+     */
+    public function testGetIncludes()
+    {
+        $this->assertSame(
+          array('test4.php', 'test3.php', 'test2.php', 'test1.php'),
+          $this->ts->getIncludes()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_Includes::getName
+     * @covers PHP_Token_Includes::getType
+     */
+    public function testGetIncludesCategorized()
+    {
+        $this->assertSame(
+          array(
+            'require_once' => array('test4.php'),
+            'require'      => array('test3.php'),
+            'include_once' => array('test2.php'),
+            'include'      => array('test1.php')
+          ),
+          $this->ts->getIncludes(TRUE)
+        );
+    }
+
+    /**
+     * @covers PHP_Token_Includes::getName
+     * @covers PHP_Token_Includes::getType
+     */
+    public function testGetIncludesCategory()
+    {
+        $this->assertSame(
+          array('test4.php'),
+          $this->ts->getIncludes(TRUE, 'require_once')
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/Token/InterfaceTest.php b/core/vendor/phpunit/php-token-stream/Tests/Token/InterfaceTest.php
new file mode 100644
index 0000000..8ad7bc2
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/Token/InterfaceTest.php
@@ -0,0 +1,236 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Laurent Laville <pear@laurent-laville.org>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token_INTERFACE class.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Laurent Laville <pear@laurent-laville.org>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
+{
+    protected $class;
+    protected $interfaces;
+
+    protected function setUp()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source4.php');
+        $i  = 0;
+        foreach ($ts as $token) {
+            if ($token instanceof PHP_Token_CLASS) {
+                $this->class = $token;
+            }
+            elseif ($token instanceof PHP_Token_INTERFACE) {
+                $this->interfaces[$i] = $token;
+                $i++;
+            }
+        }
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::getName
+     */
+    public function testGetName()
+    {
+        $this->assertEquals(
+            'iTemplate', $this->interfaces[0]->getName()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::getParent
+     */
+    public function testGetParentNotExists()
+    {
+        $this->assertFalse(
+            $this->interfaces[0]->getParent()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::hasParent
+     */
+    public function testHasParentNotExists()
+    {
+        $this->assertFalse(
+            $this->interfaces[0]->hasParent()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::getParent
+     */
+    public function testGetParentExists()
+    {
+        $this->assertEquals(
+            'a', $this->interfaces[2]->getParent()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::hasParent
+     */
+    public function testHasParentExists()
+    {
+        $this->assertTrue(
+            $this->interfaces[2]->hasParent()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::getInterfaces
+     */
+    public function testGetInterfacesExists()
+    {
+        $this->assertEquals(
+            array('b'),
+            $this->class->getInterfaces()
+        );
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::hasInterfaces
+     */
+    public function testHasInterfacesExists()
+    {
+        $this->assertTrue(
+            $this->class->hasInterfaces()
+        );
+    }
+    /**
+     * @covers PHP_Token_INTERFACE::getPackage
+     */
+    public function testGetPackageNamespace() {
+        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
+        foreach($tokenStream as $token) {
+            if($token instanceOf PHP_Token_INTERFACE) {
+                $package = $token->getPackage();
+                $this->assertSame('Foo\\Bar', $package['namespace']);
+            }
+        }
+    }
+
+
+    public function provideFilesWithClassesWithinMultipleNamespaces() {
+        return array(
+            array(TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingBraces.php'),
+            array(TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingNonBraceSyntax.php'),
+        );
+    }
+
+    /**
+     * @dataProvider provideFilesWithClassesWithinMultipleNamespaces
+     * @covers PHP_Token_INTERFACE::getPackage
+     */
+    public function testGetPackageNamespaceForFileWithMultipleNamespaces($filepath) {
+        $tokenStream = new PHP_Token_Stream($filepath);
+        $firstClassFound = false;
+        foreach($tokenStream as $token) {
+            if($firstClassFound === false && $token instanceOf PHP_Token_INTERFACE) {
+                $package = $token->getPackage();
+                $this->assertSame('TestClassInBar', $token->getName());
+                $this->assertSame('Foo\\Bar', $package['namespace']);
+                $firstClassFound = true;
+                continue;
+            }
+            // Secound class
+            if($token instanceOf PHP_Token_INTERFACE) {
+                $package = $token->getPackage();
+                $this->assertSame('TestClassInBaz', $token->getName());
+                $this->assertSame('Foo\\Baz', $package['namespace']);
+                return;
+            }
+        }
+        $this->fail("Seachring for 2 classes failed");
+    }
+
+    public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces() {
+        foreach($this->interfaces as $token) {
+            $package = $token->getPackage();
+            $this->assertSame("", $package['namespace']);
+        }
+    }
+
+    /**
+     * @covers PHP_Token_INTERFACE::getPackage
+     */
+    public function testGetPackageNamespaceWhenExtentingFromNamespaceClass() {
+        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classExtendsNamespacedClass.php');
+        $firstClassFound = false;
+        foreach($tokenStream as $token) {
+            if($firstClassFound === false && $token instanceOf PHP_Token_INTERFACE) {
+                $package = $token->getPackage();
+                $this->assertSame('Baz', $token->getName());
+                $this->assertSame('Foo\\Bar', $package['namespace']);
+                $firstClassFound = true;
+                continue;
+            }
+            if($token instanceOf PHP_Token_INTERFACE) {
+                $package = $token->getPackage();
+                $this->assertSame('Extender', $token->getName());
+                $this->assertSame('Other\\Space', $package['namespace']);
+                return;
+            }
+        }
+        $this->fail("Searching for 2 classes failed");
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/Token/NamespaceTest.php b/core/vendor/phpunit/php-token-stream/Tests/Token/NamespaceTest.php
new file mode 100644
index 0000000..0f3ef82
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/Token/NamespaceTest.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
+      '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token_NAMESPACE class.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers PHP_Token_NAMESPACE::getName
+     */
+    public function testGetName()
+    {
+        $tokenStream = new PHP_Token_Stream(
+          TEST_FILES_PATH . 'classInNamespace.php'
+        );
+
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
+                $this->assertSame('Foo\\Bar', $token->getName());
+            }
+        }
+    }
+
+    public function testGetStartLineWithUnscopedNamespace()
+    {
+        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
+        foreach($tokenStream as $token) {
+            if($token instanceOf PHP_Token_NAMESPACE) {
+                $this->assertSame(2, $token->getLine());
+            }
+        }
+    }
+
+    public function testGetEndLineWithUnscopedNamespace()
+    {
+        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
+        foreach($tokenStream as $token) {
+            if($token instanceOf PHP_Token_NAMESPACE) {
+                $this->assertSame(2, $token->getEndLine());
+            }
+        }
+    }
+    public function testGetStartLineWithScopedNamespace()
+    {
+        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php');
+        foreach($tokenStream as $token) {
+            if($token instanceOf PHP_Token_NAMESPACE) {
+                $this->assertSame(2, $token->getLine());
+            }
+        }
+    }
+
+    public function testGetEndLineWithScopedNamespace()
+    {
+        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php');
+        foreach($tokenStream as $token) {
+            if($token instanceOf PHP_Token_NAMESPACE) {
+                $this->assertSame(8, $token->getEndLine());
+            }
+        }
+    }
+
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/TokenTest.php b/core/vendor/phpunit/php-token-stream/Tests/TokenTest.php
new file mode 100644
index 0000000..57fd57c
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/TokenTest.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * php-token-stream
+ *
+ * Copyright (c) 2009-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @since      File available since Release 1.0.0
+ */
+
+if (!defined('TEST_FILES_PATH')) {
+    define(
+      'TEST_FILES_PATH',
+      dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR
+    );
+}
+
+require_once 'PHP/Token/Stream.php';
+
+/**
+ * Tests for the PHP_Token class.
+ *
+ * @package    PHP_TokenStream
+ * @subpackage Tests
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2009-2013 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/php-token-stream/
+ * @since      Class available since Release 1.0.0
+ */
+class PHP_TokenTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers PHP_Token::__construct
+     * @covers PHP_Token::__toString
+     */
+    public function testToString()
+    {
+        $this->markTestIncomplete();
+    }
+
+    /**
+     * @covers PHP_Token::__construct
+     * @covers PHP_Token::getLine
+     */
+    public function testGetLine()
+    {
+        $this->markTestIncomplete();
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/classExtendsNamespacedClass.php b/core/vendor/phpunit/php-token-stream/Tests/_files/classExtendsNamespacedClass.php
new file mode 100644
index 0000000..560eec9
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/classExtendsNamespacedClass.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Foo\Bar;
+
+class Baz {}
+
+namespace Other\Space;
+
+class Extender extends \Foo\Bar\Baz {}
+
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/classInNamespace.php b/core/vendor/phpunit/php-token-stream/Tests/_files/classInNamespace.php
new file mode 100644
index 0000000..8ade7cd
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/classInNamespace.php
@@ -0,0 +1,6 @@
+<?php
+namespace Foo\Bar;
+
+class TestClass
+{
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/classInScopedNamespace.php b/core/vendor/phpunit/php-token-stream/Tests/_files/classInScopedNamespace.php
new file mode 100644
index 0000000..1ba475c
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/classInScopedNamespace.php
@@ -0,0 +1,9 @@
+<?php
+namespace Foo\BarScoped {
+
+    class TestClass {
+
+    }
+
+}
+
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/closure.php b/core/vendor/phpunit/php-token-stream/Tests/_files/closure.php
new file mode 100644
index 0000000..8b36940
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/closure.php
@@ -0,0 +1,5 @@
+<?php
+$function1 = function($foo, $bar) use ($var) {};
+$function2 = function ($foo, $bar, $baz) {};
+$function3 = function () {};
+$function4 = function() {};
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/issue19.php b/core/vendor/phpunit/php-token-stream/Tests/_files/issue19.php
new file mode 100644
index 0000000..91eeb47
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/issue19.php
@@ -0,0 +1,3 @@
+<?php
+class TestClass {
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/multipleNamespacesWithOneClassUsingBraces.php b/core/vendor/phpunit/php-token-stream/Tests/_files/multipleNamespacesWithOneClassUsingBraces.php
new file mode 100644
index 0000000..d3a12e3
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/multipleNamespacesWithOneClassUsingBraces.php
@@ -0,0 +1,12 @@
+<?php
+namespace Foo\Bar;
+
+class TestClassInBar
+{
+}
+
+namespace Foo\Baz;
+
+class TestClassInBaz
+{
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/multipleNamespacesWithOneClassUsingNonBraceSyntax.php b/core/vendor/phpunit/php-token-stream/Tests/_files/multipleNamespacesWithOneClassUsingNonBraceSyntax.php
new file mode 100644
index 0000000..4ee4f24
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/multipleNamespacesWithOneClassUsingNonBraceSyntax.php
@@ -0,0 +1,14 @@
+<?php
+namespace Foo\Bar
+{
+    class TestClassInBar
+    {
+    }
+}
+
+namespace Foo\Baz
+{
+    class TestClassInBaz
+    {
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/source.php b/core/vendor/phpunit/php-token-stream/Tests/_files/source.php
new file mode 100644
index 0000000..3c8c1a2
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/source.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Some comment
+ */
+class Foo{function foo(){}
+
+    /**
+     * @param Baz $baz
+     */
+    public function bar(Baz $baz)
+    {
+    }
+
+    /**
+     * @param Foobar $foobar
+     */
+    static public function foobar(Foobar $foobar)
+    {
+    }
+
+    public function barfoo(Barfoo $barfoo)
+    {
+    }
+
+    /**
+     * This docblock does not belong to the baz function
+     */
+
+    public function baz()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/source2.php b/core/vendor/phpunit/php-token-stream/Tests/_files/source2.php
new file mode 100644
index 0000000..b33dce1
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/source2.php
@@ -0,0 +1,6 @@
+<?php
+// short desc
+abstract class A {
+    /* abst meth: */
+    public static  abstract function method();
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/source3.php b/core/vendor/phpunit/php-token-stream/Tests/_files/source3.php
new file mode 100644
index 0000000..7e42b60
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/source3.php
@@ -0,0 +1,14 @@
+<?php
+// This file is example#1
+// from http://www.php.net/manual/en/function.get-included-files.php
+
+include 'test1.php';
+include_once 'test2.php';
+require 'test3.php';
+require_once 'test4.php';
+
+$included_files = get_included_files();
+
+foreach ($included_files as $filename) {
+    echo "$filename\n";
+}
diff --git a/core/vendor/phpunit/php-token-stream/Tests/_files/source4.php b/core/vendor/phpunit/php-token-stream/Tests/_files/source4.php
new file mode 100644
index 0000000..6b064fc
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/Tests/_files/source4.php
@@ -0,0 +1,30 @@
+<?php
+// Declare the interface 'iTemplate'
+interface iTemplate
+{
+    public function setVariable($name, $var);
+    public function
+        getHtml($template);
+}
+
+interface a
+{
+    public function foo();
+}
+
+interface b extends a
+{
+    public function baz(Baz $baz);
+}
+
+// short desc for class that implement a unique interface
+class c implements b
+{
+    public function foo()
+    {
+    }
+
+    public function baz(Baz $baz)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/build.xml b/core/vendor/phpunit/php-token-stream/build.xml
new file mode 100644
index 0000000..aca1cef
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/build.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="PHP_TokenStream" default="build">
+ <property name="php" value="php"/>
+ <property name="phpunit" value="phpunit"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpunit,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpunit,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="PHP/Token/Stream/Autoload.php" />
+   <arg value="--template" />
+   <arg path="PHP/Token/Stream/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="            " />
+   <arg path="PHP" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/PHP">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHP" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHP" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHP" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHP" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/PHP" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <condition property="phpunit_cmd" value="${php} ${phpunit}" else="${phpunit}">
+   <not>
+    <equals arg1="${phpunit}" arg2="phpunit" />
+   </not>
+  </condition>
+
+  <exec executable="${phpunit_cmd}" failonerror="true"/>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/PHP" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/php-token-stream/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/php-token-stream/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..bf9d520
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          '}EOLelse if (...) {EOL',
+          '}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/php-token-stream/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/php-token-stream/build/PHPCS/ruleset.xml b/core/vendor/phpunit/php-token-stream/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/php-token-stream/build/phpmd.xml b/core/vendor/phpunit/php-token-stream/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/php-token-stream/composer.json b/core/vendor/phpunit/php-token-stream/composer.json
new file mode 100644
index 0000000..7a69f26
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/composer.json
@@ -0,0 +1,33 @@
+{
+    "name": "phpunit/php-token-stream",
+    "description": "Wrapper around PHP's tokenizer extension.",
+    "type": "library",
+    "keywords": [
+        "tokenizer"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sb@sebastian-bergmann.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3",
+        "ext-tokenizer": "*"
+    },
+    "autoload": {
+        "classmap": [
+            "PHP/"
+        ]
+    },
+    "include-path": [
+        ""
+    ]
+}
diff --git a/core/vendor/phpunit/php-token-stream/package.xml b/core/vendor/phpunit/php-token-stream/package.xml
new file mode 100644
index 0000000..d2f758d
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/package.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>PHP_TokenStream</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>Wrapper around PHP's tokenizer extension.</summary>
+ <description>Wrapper around PHP's tokenizer extension.</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sb@sebastian-bergmann.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2012-10-05</date>
+ <version>
+  <release>1.1.5</release>
+  <api>1.1.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/php-token-stream/tree</notes>
+ <contents>
+  <dir name="/">
+   <dir name="PHP">
+    <dir name="Token">
+     <dir name="Stream">
+      <file baseinstalldir="/" name="Autoload.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="CachingFactory.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <file baseinstalldir="/" name="Stream.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <file baseinstalldir="/" name="Token.php" role="php">
+     <tasks:replace from="@package_version@" to="version" type="package-info" />
+    </file>
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.markdown" role="doc"/>
+   <file baseinstalldir="/" name="LICENSE" role="doc"/>
+   <file baseinstalldir="/" name="README.markdown" role="doc"/>
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.4</min>
+   </pearinstaller>
+   <extension>
+    <name>tokenizer</name>
+   </extension>
+  </required>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/core/vendor/phpunit/php-token-stream/phpunit.xml.dist b/core/vendor/phpunit/php-token-stream/phpunit.xml.dist
new file mode 100644
index 0000000..6d307c4
--- /dev/null
+++ b/core/vendor/phpunit/php-token-stream/phpunit.xml.dist
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         syntaxCheck="false"
+         bootstrap="PHP/Token/Stream/Autoload.php"
+         strict="true">
+  <testsuites>
+    <testsuite name="php-token-stream">
+      <directory suffix="Test.php">Tests</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-html" target="build/coverage" title="PHP_TokenStream"
+         charset="UTF-8" yui="true" highlight="true"
+         lowUpperBound="35" highLowerBound="70"/>
+    <log type="coverage-clover" target="build/logs/clover.xml"/>
+    <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
+  </logging>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">PHP</directory>
+    </whitelist>
+  </filter>
+</phpunit>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/.gitattributes b/core/vendor/phpunit/phpunit-mock-objects/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/phpunit-mock-objects/.travis.yml b/core/vendor/phpunit/phpunit-mock-objects/.travis.yml
new file mode 100644
index 0000000..a419159
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/.travis.yml
@@ -0,0 +1,22 @@
+language: php
+
+php:
+    - 5.3
+    - 5.4
+
+before_script:
+    - mkdir -p vendor
+    - git clone --branch=3.7 --depth=100 --quiet git://github.com/sebastianbergmann/phpunit.git vendor/phpunit
+    - git clone --branch=1.2 --depth=100 --quiet git://github.com/sebastianbergmann/php-code-coverage.git vendor/php-code-coverage
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-text-template.git vendor/php-text-template
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-token-stream.git vendor/php-token-stream
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-file-iterator.git vendor/php-file-iterator
+    - git clone --branch=master --depth=100 --quiet git://github.com/sebastianbergmann/php-timer.git vendor/php-timer
+    - git clone --branch=master --depth=100 --quiet git://github.com/pear/pear-core.git vendor/pear-core
+    - git clone --branch=trunk --depth=100 --quiet git://github.com/pear/Console_Getopt.git vendor/console-getopt
+
+script: php -d include_path=vendor/php-text-template:vendor/php-token-stream:vendor/php-file-iterator:vendor/phpunit:vendor/php-code-coverage:vendor/php-timer:vendor/php-invoker:vendor/pear-core:vendor/console-getopt:vendor:. ./vendor/phpunit/phpunit.php --configuration ./build/travis-ci.xml
+
+notifications:
+  email: false
+  irc: "irc.freenode.org#phpunit"
diff --git a/core/vendor/phpunit/phpunit-mock-objects/ChangeLog.markdown b/core/vendor/phpunit/phpunit-mock-objects/ChangeLog.markdown
new file mode 100644
index 0000000..fc576e5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/ChangeLog.markdown
@@ -0,0 +1,27 @@
+PHPUnit_MockObject 1.2
+======================
+
+This is the list of changes for the PHPUnit_MockObject 1.2 release series.
+
+PHPUnit_MockObject 1.2.3
+------------------------
+
+* Fixed a bug where getting two mocks with different argument cloning options returned the same mock.
+
+PHPUnit_MockObject 1.2.2
+------------------------
+
+* Fixed #100: Removed the unique mock object ID introduced in version 1.2.
+
+PHPUnit_MockObject 1.2.1
+------------------------
+
+* No changes.
+
+PHPUnit_MockObject 1.2.0
+------------------------
+
+* Implemented #47: Make cloning of arguments passed to mocked methods optional.
+* Implemented #84: `getMockFromWsdl()` now works with namespaces.
+* Fixed #90: Mocks with a fixed class name could only be created once.
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/LICENSE b/core/vendor/phpunit/phpunit-mock-objects/LICENSE
new file mode 100644
index 0000000..830850c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/LICENSE
@@ -0,0 +1,33 @@
+PHPUnit_MockObject
+
+Copyright (c) 2002-2013, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php
new file mode 100644
index 0000000..296a1ac
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'phpunit_framework_mockobject_builder_identity' => '/Framework/MockObject/Builder/Identity.php',
+            'phpunit_framework_mockobject_builder_invocationmocker' => '/Framework/MockObject/Builder/InvocationMocker.php',
+            'phpunit_framework_mockobject_builder_match' => '/Framework/MockObject/Builder/Match.php',
+            'phpunit_framework_mockobject_builder_methodnamematch' => '/Framework/MockObject/Builder/MethodNameMatch.php',
+            'phpunit_framework_mockobject_builder_namespace' => '/Framework/MockObject/Builder/Namespace.php',
+            'phpunit_framework_mockobject_builder_parametersmatch' => '/Framework/MockObject/Builder/ParametersMatch.php',
+            'phpunit_framework_mockobject_builder_stub' => '/Framework/MockObject/Builder/Stub.php',
+            'phpunit_framework_mockobject_generator' => '/Framework/MockObject/Generator.php',
+            'phpunit_framework_mockobject_invocation' => '/Framework/MockObject/Invocation.php',
+            'phpunit_framework_mockobject_invocation_object' => '/Framework/MockObject/Invocation/Object.php',
+            'phpunit_framework_mockobject_invocation_static' => '/Framework/MockObject/Invocation/Static.php',
+            'phpunit_framework_mockobject_invocationmocker' => '/Framework/MockObject/InvocationMocker.php',
+            'phpunit_framework_mockobject_invokable' => '/Framework/MockObject/Invokable.php',
+            'phpunit_framework_mockobject_matcher' => '/Framework/MockObject/Matcher.php',
+            'phpunit_framework_mockobject_matcher_anyinvokedcount' => '/Framework/MockObject/Matcher/AnyInvokedCount.php',
+            'phpunit_framework_mockobject_matcher_anyparameters' => '/Framework/MockObject/Matcher/AnyParameters.php',
+            'phpunit_framework_mockobject_matcher_invocation' => '/Framework/MockObject/Matcher/Invocation.php',
+            'phpunit_framework_mockobject_matcher_invokedatindex' => '/Framework/MockObject/Matcher/InvokedAtIndex.php',
+            'phpunit_framework_mockobject_matcher_invokedatleastonce' => '/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+            'phpunit_framework_mockobject_matcher_invokedcount' => '/Framework/MockObject/Matcher/InvokedCount.php',
+            'phpunit_framework_mockobject_matcher_invokedrecorder' => '/Framework/MockObject/Matcher/InvokedRecorder.php',
+            'phpunit_framework_mockobject_matcher_methodname' => '/Framework/MockObject/Matcher/MethodName.php',
+            'phpunit_framework_mockobject_matcher_parameters' => '/Framework/MockObject/Matcher/Parameters.php',
+            'phpunit_framework_mockobject_matcher_statelessinvocation' => '/Framework/MockObject/Matcher/StatelessInvocation.php',
+            'phpunit_framework_mockobject_mockbuilder' => '/Framework/MockObject/MockBuilder.php',
+            'phpunit_framework_mockobject_mockobject' => '/Framework/MockObject/MockObject.php',
+            'phpunit_framework_mockobject_stub' => '/Framework/MockObject/Stub.php',
+            'phpunit_framework_mockobject_stub_consecutivecalls' => '/Framework/MockObject/Stub/ConsecutiveCalls.php',
+            'phpunit_framework_mockobject_stub_exception' => '/Framework/MockObject/Stub/Exception.php',
+            'phpunit_framework_mockobject_stub_matchercollection' => '/Framework/MockObject/Stub/MatcherCollection.php',
+            'phpunit_framework_mockobject_stub_return' => '/Framework/MockObject/Stub/Return.php',
+            'phpunit_framework_mockobject_stub_returnargument' => '/Framework/MockObject/Stub/ReturnArgument.php',
+            'phpunit_framework_mockobject_stub_returncallback' => '/Framework/MockObject/Stub/ReturnCallback.php',
+            'phpunit_framework_mockobject_stub_returnself' => '/Framework/MockObject/Stub/ReturnSelf.php',
+            'phpunit_framework_mockobject_stub_returnvaluemap' => '/Framework/MockObject/Stub/ReturnValueMap.php',
+            'phpunit_framework_mockobject_verifiable' => '/Framework/MockObject/Verifiable.php'
+          );
+
+          $path = dirname(dirname(dirname(__FILE__)));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php.in b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php.in
new file mode 100644
index 0000000..fe019c0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Autoload.php.in
@@ -0,0 +1,65 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.1.0
+ */
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+      static $path = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            ___CLASSLIST___
+          );
+
+          $path = dirname(dirname(dirname(__FILE__)));
+      }
+
+      $cn = strtolower($class);
+
+      if (isset($classes[$cn])) {
+          require $path . $classes[$cn];
+      }
+  }
+);
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Identity.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Identity.php
new file mode 100644
index 0000000..0c66818
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Identity.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Builder interface for unique identifiers.
+ *
+ * Defines the interface for recording unique identifiers. The identifiers
+ * can be used to define the invocation order of expectations. The expectation
+ * is recorded using id() and then defined in order using
+ * PHPUnit_Framework_MockObject_Builder_Match::after().
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Builder_Identity
+{
+    /**
+     * Sets the identification of the expectation to $id.
+     *
+     * @note The identifier is unique per mock object.
+     * @param string $id Unique identifiation of expectation.
+     */
+    public function id($id);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/InvocationMocker.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/InvocationMocker.php
new file mode 100644
index 0000000..ba4e5b3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/InvocationMocker.php
@@ -0,0 +1,193 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Builder for mocked or stubbed invocations.
+ *
+ * Provides methods for building expectations without having to resort to
+ * instantiating the various matchers manually. These methods also form a
+ * more natural way of reading the expectation. This class should be together
+ * with the test case PHPUnit_Framework_MockObject_TestCase.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Builder_InvocationMocker implements PHPUnit_Framework_MockObject_Builder_MethodNameMatch
+{
+    /**
+     * @var PHPUnit_Framework_MockObject_Stub_MatcherCollection
+     */
+    protected $collection;
+
+    /**
+     * @var PHPUnit_Framework_MockObject_Matcher
+     */
+    protected $matcher;
+
+    /**
+     * @param PHPUnit_Framework_MockObject_Stub_MatcherCollection $collection
+     * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
+     */
+    public function __construct(PHPUnit_Framework_MockObject_Stub_MatcherCollection $collection, PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher)
+    {
+        $this->collection = $collection;
+        $this->matcher    = new PHPUnit_Framework_MockObject_Matcher(
+          $invocationMatcher
+        );
+
+        $this->collection->addMatcher($this->matcher);
+    }
+
+    /**
+     * @return PHPUnit_Framework_MockObject_Matcher
+     */
+    public function getMatcher()
+    {
+        return $this->matcher;
+    }
+
+    /**
+     * @param  mixed $id
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function id($id)
+    {
+        $this->collection->registerId($id, $this);
+
+        return $this;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Stub $stub
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function will(PHPUnit_Framework_MockObject_Stub $stub)
+    {
+        $this->matcher->stub = $stub;
+
+        return $this;
+    }
+
+    /**
+     * @param  mixed $id
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function after($id)
+    {
+        $this->matcher->afterMatchBuilderId = $id;
+
+        return $this;
+    }
+
+    /**
+     * @param  mixed $argument, ...
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function with()
+    {
+        $args = func_get_args();
+
+        if ($this->matcher->methodNameMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'Method name matcher is not defined, cannot define parameter ' .
+              ' matcher without one'
+            );
+        }
+
+        if ($this->matcher->parametersMatcher !== NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'Parameter matcher is already defined, cannot redefine'
+            );
+        }
+
+        $this->matcher->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_Parameters($args);
+
+        return $this;
+    }
+
+    /**
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function withAnyParameters()
+    {
+        if ($this->matcher->methodNameMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'Method name matcher is not defined, cannot define parameter ' .
+              'matcher without one'
+            );
+        }
+
+        if ($this->matcher->parametersMatcher !== NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'Parameter matcher is already defined, cannot redefine'
+            );
+        }
+
+        $this->matcher->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters;
+
+        return $this;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_Constraint|string $constraint
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function method($constraint)
+    {
+        if ($this->matcher->methodNameMatcher !== NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'Method name matcher is already defined, cannot redefine'
+            );
+        }
+
+        $this->matcher->methodNameMatcher = new PHPUnit_Framework_MockObject_Matcher_MethodName($constraint);
+
+        return $this;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Match.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Match.php
new file mode 100644
index 0000000..ce2ee18
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Match.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Builder interface for invocation order matches.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Builder_Match extends PHPUnit_Framework_MockObject_Builder_Stub
+{
+    /**
+     * Defines the expectation which must occur before the current is valid.
+     *
+     * @param string $id The identification of the expectation that should
+     *                   occur before this one.
+     * @return PHPUnit_Framework_MockObject_Builder_Stub
+     */
+    public function after($id);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/MethodNameMatch.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/MethodNameMatch.php
new file mode 100644
index 0000000..9569d38
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/MethodNameMatch.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Builder interface for matcher of method names.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Builder_MethodNameMatch extends PHPUnit_Framework_MockObject_Builder_ParametersMatch
+{
+    /**
+     * Adds a new method name match and returns the parameter match object for
+     * further matching possibilities.
+     *
+     * @param  PHPUnit_Framework_Constraint $name
+     *         Constraint for matching method, if a string is passed it will use
+     *         the PHPUnit_Framework_Constraint_IsEqual.
+     * @return PHPUnit_Framework_MockObject_Builder_ParametersMatch
+     */
+    public function method($name);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Namespace.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Namespace.php
new file mode 100644
index 0000000..dfa0bd7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Namespace.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for builders which can register builders with a given identification.
+ *
+ * This interface relates to PHPUnit_Framework_MockObject_Builder_Identity.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Builder_Namespace
+{
+    /**
+     * Looks up the match builder with identification $id and returns it.
+     *
+     * @param string $id The identifiction of the match builder.
+     * @return PHPUnit_Framework_MockObject_Builder_Match
+     */
+    public function lookupId($id);
+
+    /**
+     * Registers the match builder $builder with the identification $id. The
+     * builder can later be looked up using lookupId() to figure out if it
+     * has been invoked.
+     *
+     * @param string                                     $id
+     *        The identification of the match builder.
+     * @param PHPUnit_Framework_MockObject_Builder_Match $builder
+     *        The builder which is being registered.
+     */
+    public function registerId($id, PHPUnit_Framework_MockObject_Builder_Match $builder);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/ParametersMatch.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/ParametersMatch.php
new file mode 100644
index 0000000..61c53bf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/ParametersMatch.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Builder interface for parameter matchers.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Builder_ParametersMatch extends PHPUnit_Framework_MockObject_Builder_Match
+{
+    /**
+     * Sets the parameters to match for, each parameter to this funtion will
+     * be part of match. To perform specific matches or constraints create a
+     * new PHPUnit_Framework_Constraint and use it for the parameter.
+     * If the parameter value is not a constraint it will use the
+     * PHPUnit_Framework_Constraint_IsEqual for the value.
+     *
+     * Some examples:
+     * <code>
+     * // match first parameter with value 2
+     * $b->with(2);
+     * // match first parameter with value 'smock' and second identical to 42
+     * $b->with('smock', new PHPUnit_Framework_Constraint_IsEqual(42));
+     * </code>
+     *
+     * @return PHPUnit_Framework_MockObject_Builder_ParametersMatch
+     */
+    public function with();
+
+    /**
+     * Sets a matcher which allows any kind of parameters.
+     *
+     * Some examples:
+     * <code>
+     * // match any number of parameters
+     * $b->withAnyParamers();
+     * </code>
+     *
+     * @return PHPUnit_Framework_MockObject_Matcher_AnyParameters
+     */
+    public function withAnyParameters();
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Stub.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Stub.php
new file mode 100644
index 0000000..86a091e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Builder/Stub.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Builder interface for stubs which are actions replacing an invocation.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Builder_Stub extends PHPUnit_Framework_MockObject_Builder_Identity
+{
+    /**
+     * Stubs the matching method with the stub object $stub. Any invocations of
+     * the matched method will now be handled by the stub instead.
+     *
+     * @param PHPUnit_Framework_MockObject_Stub $stub The stub object.
+     * @return PHPUnit_Framework_MockObject_Builder_Identity
+     */
+    public function will(PHPUnit_Framework_MockObject_Stub $stub);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator.php
new file mode 100644
index 0000000..b5af44d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator.php
@@ -0,0 +1,808 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Mock Object Code Generator
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Generator
+{
+    /**
+     * @var array
+     */
+    protected static $cache = array();
+
+    /**
+     * @var array
+     */
+    protected static $blacklistedMethodNames = array(
+      '__clone' => TRUE,
+      'abstract' => TRUE,
+      'and' => TRUE,
+      'array' => TRUE,
+      'as' => TRUE,
+      'break' => TRUE,
+      'case' => TRUE,
+      'catch' => TRUE,
+      'class' => TRUE,
+      'clone' => TRUE,
+      'const' => TRUE,
+      'continue' => TRUE,
+      'declare' => TRUE,
+      'default' => TRUE,
+      'die' => TRUE,
+      'do' => TRUE,
+      'echo' => TRUE,
+      'else' => TRUE,
+      'elseif' => TRUE,
+      'empty' => TRUE,
+      'enddeclare' => TRUE,
+      'endfor' => TRUE,
+      'endforeach' => TRUE,
+      'endif' => TRUE,
+      'endswitch' => TRUE,
+      'endwhile' => TRUE,
+      'eval' => TRUE,
+      'exit' => TRUE,
+      'expects' => TRUE,
+      'extends' => TRUE,
+      'final' => TRUE,
+      'for' => TRUE,
+      'foreach' => TRUE,
+      'function' => TRUE,
+      'global' => TRUE,
+      'goto' => TRUE,
+      'if' => TRUE,
+      'implements' => TRUE,
+      'include' => TRUE,
+      'include_once' => TRUE,
+      'instanceof' => TRUE,
+      'interface' => TRUE,
+      'isset' => TRUE,
+      'list' => TRUE,
+      'namespace' => TRUE,
+      'new' => TRUE,
+      'or' => TRUE,
+      'print' => TRUE,
+      'private' => TRUE,
+      'protected' => TRUE,
+      'public' => TRUE,
+      'require' => TRUE,
+      'require_once' => TRUE,
+      'return' => TRUE,
+      'static' => TRUE,
+      'staticExpects' => TRUE,
+      'switch' => TRUE,
+      'throw' => TRUE,
+      'try' => TRUE,
+      'unset' => TRUE,
+      'use' => TRUE,
+      'var' => TRUE,
+      'while' => TRUE,
+      'xor' => TRUE
+    );
+
+    /**
+     * @var boolean
+     */
+    protected static $soapLoaded = NULL;
+
+    /**
+     * Returns a mock object for the specified class.
+     *
+     * @param  string  $originalClassName
+     * @param  array   $methods
+     * @param  array   $arguments
+     * @param  string  $mockClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  boolean $cloneArguments
+     * @return object
+     * @throws InvalidArgumentException
+     * @since  Method available since Release 1.0.0
+     */
+    public static function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = TRUE)
+    {
+        if (!is_string($originalClassName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($mockClassName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'string');
+        }
+
+        if (!is_array($methods) && !is_null($methods)) {
+            throw new InvalidArgumentException;
+        }
+
+        if (NULL !== $methods) {
+            foreach ($methods as $method) {
+                if (!preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', $method)) {
+                    throw new PHPUnit_Framework_Exception(
+                      sprintf(
+                        'Cannot stub or mock method with invalid name "%s"',
+                        $method
+                      )
+                    );
+                }
+            }
+            if ($methods != array_unique($methods)) {
+                throw new PHPUnit_Framework_Exception(
+                  sprintf(
+                    'Cannot stub or mock using a method list that contains duplicates: "%s"',
+                    implode(', ', $methods)
+                  )
+                );
+            }
+        }
+
+        if ($mockClassName != '' && class_exists($mockClassName, FALSE)) {
+            $reflect = new ReflectionClass($mockClassName);
+            if (!$reflect->implementsInterface("PHPUnit_Framework_MockObject_MockObject")) {
+                throw new PHPUnit_Framework_Exception(
+                  sprintf(
+                    'Class "%s" already exists.',
+                    $mockClassName
+                  )
+                );
+            }
+        }
+
+        $mock = self::generate(
+          $originalClassName,
+          $methods,
+          $mockClassName,
+          $callOriginalClone,
+          $callAutoload,
+          $cloneArguments
+        );
+
+        return self::getObject(
+          $mock['code'],
+          $mock['mockClassName'],
+          $originalClassName,
+          $callOriginalConstructor,
+          $callAutoload,
+          $arguments
+        );
+    }
+
+    /**
+     * @param  string $code
+     * @param  string $className
+     * @param  string $originalClassName
+     * @param  string $callOriginalConstructor
+     * @param  string $callAutoload
+     * @param  array  $arguments
+     * @return object
+     */
+    protected static function getObject($code, $className, $originalClassName = '', $callOriginalConstructor = FALSE, $callAutoload = FALSE, array $arguments = array())
+    {
+        if (!class_exists($className, FALSE)) {
+            eval($code);
+        }
+
+        if ($callOriginalConstructor &&
+            !interface_exists($originalClassName, $callAutoload)) {
+            if (count($arguments) == 0) {
+                $object = new $className;
+            } else {
+                $class = new ReflectionClass($className);
+                $object = $class->newInstanceArgs($arguments);
+            }
+        } else {
+            // Use a trick to create a new object of a class
+            // without invoking its constructor.
+            $object = unserialize(
+              sprintf('O:%d:"%s":0:{}', strlen($className), $className)
+            );
+        }
+
+        return $object;
+    }
+
+    /**
+     * Returns a mock object for the specified abstract class with all abstract
+     * methods of the class mocked. Concrete methods to mock can be specified with
+     * the last parameter
+     *
+     * @param  string  $originalClassName
+     * @param  array   $arguments
+     * @param  string  $mockClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  array   $mockedMethods
+     * @param  boolean $cloneArguments
+     * @return object
+     * @since  Method available since Release 1.0.0
+     * @throws InvalidArgumentException
+     */
+    public static function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $mockedMethods = array(), $cloneArguments = TRUE)
+    {
+        if (!is_string($originalClassName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($mockClassName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
+        }
+
+        if (class_exists($originalClassName, $callAutoload) ||
+            interface_exists($originalClassName, $callAutoload)) {
+            $methods   = array();
+            $reflector = new ReflectionClass($originalClassName);
+
+            foreach ($reflector->getMethods() as $method) {
+                if ($method->isAbstract() || in_array($method->getName(), $mockedMethods)) {
+                    $methods[] = $method->getName();
+                }
+            }
+
+            if (empty($methods)) {
+                $methods = NULL;
+            }
+
+            return self::getMock(
+              $originalClassName,
+              $methods,
+              $arguments,
+              $mockClassName,
+              $callOriginalConstructor,
+              $callOriginalClone,
+              $callAutoload,
+              $cloneArguments
+            );
+        } else {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'Class "%s" does not exist.',
+                $originalClassName
+              )
+            );
+        }
+    }
+
+    /**
+     * Returns an object for the specified trait.
+     *
+     * @param  string  $traitName
+     * @param  array   $arguments
+     * @param  string  $traitClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @return object
+     * @since  Method available since Release 1.1.0
+     * @throws InvalidArgumentException
+     */
+    public static function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE)
+    {
+        if (!is_string($traitName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($traitClassName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'string');
+        }
+
+        if (!trait_exists($traitName, $callAutoload)) {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'Trait "%s" does not exist.',
+                $traitName
+              )
+            );
+        }
+
+        $className = self::generateClassName(
+          $traitName, $traitClassName, 'Trait_'
+        );
+
+        $templateDir   = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
+                         DIRECTORY_SEPARATOR;
+        $classTemplate = new Text_Template(
+                           $templateDir . 'trait_class.tpl'
+                         );
+
+        $classTemplate->setVar(
+          array(
+            'class_name' => $className['className'],
+            'trait_name' => $traitName
+          )
+        );
+
+        return self::getObject(
+          $classTemplate->render(),
+          $className['className']
+        );
+    }
+
+    /**
+     * @param  string  $originalClassName
+     * @param  array   $methods
+     * @param  string  $mockClassName
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  boolean $cloneArguments
+     * @return array
+     */
+    public static function generate($originalClassName, array $methods = NULL, $mockClassName = '', $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = TRUE)
+    {
+        if ($mockClassName == '') {
+            $key = md5(
+              $originalClassName .
+              serialize($methods) .
+              serialize($callOriginalClone) .
+              serialize($cloneArguments)
+            );
+
+            if (isset(self::$cache[$key])) {
+                return self::$cache[$key];
+            }
+        }
+
+        $mock = self::generateMock(
+          $originalClassName,
+          $methods,
+          $mockClassName,
+          $callOriginalClone,
+          $callAutoload,
+          $cloneArguments
+        );
+
+        if (isset($key)) {
+            self::$cache[$key] = $mock;
+        }
+
+        return $mock;
+    }
+
+    /**
+     * @param  string $wsdlFile
+     * @param  string $originalClassName
+     * @param  array  $methods
+     * @param  array  $options
+     * @return array
+     */
+    public static function generateClassFromWsdl($wsdlFile, $originalClassName, array $methods = array(), array $options = array())
+    {
+        if (self::$soapLoaded === NULL) {
+            self::$soapLoaded = extension_loaded('soap');
+        }
+
+        if (self::$soapLoaded) {
+            $client   = new SOAPClient($wsdlFile, $options);
+            $_methods = array_unique($client->__getFunctions());
+            unset($client);
+
+            $templateDir    = dirname(__FILE__) . DIRECTORY_SEPARATOR .
+                              'Generator' . DIRECTORY_SEPARATOR;
+            $methodTemplate = new Text_Template(
+                                $templateDir . 'wsdl_method.tpl'
+                              );
+            $methodsBuffer  = '';
+
+            foreach ($_methods as $method) {
+                $nameStart = strpos($method, ' ') + 1;
+                $nameEnd   = strpos($method, '(');
+                $name      = substr($method, $nameStart, $nameEnd - $nameStart);
+
+                if (empty($methods) || in_array($name, $methods)) {
+                    $args    = explode(
+                                 ',',
+                                 substr(
+                                   $method,
+                                   $nameEnd + 1,
+                                   strpos($method, ')') - $nameEnd - 1
+                                 )
+                               );
+                    $numArgs = count($args);
+
+                    for ($i = 0; $i < $numArgs; $i++) {
+                        $args[$i] = substr($args[$i], strpos($args[$i], '$'));
+                    }
+
+                    $methodTemplate->setVar(
+                      array(
+                        'method_name' => $name,
+                        'arguments'   => join(', ', $args)
+                      )
+                    );
+
+                    $methodsBuffer .= $methodTemplate->render();
+                }
+            }
+
+            $optionsBuffer = 'array(';
+            foreach ($options as $key => $value) {
+                $optionsBuffer .= $key . ' => ' . $value;
+            }
+
+            $optionsBuffer .= ')';
+
+            $classTemplate = new Text_Template(
+              $templateDir . 'wsdl_class.tpl'
+            );
+
+            $namespace = '';
+            if(strpos($originalClassName, '\\') !== FALSE) {
+                $parts = explode('\\', $originalClassName);
+                $originalClassName = array_pop($parts);
+                $namespace = 'namespace ' . join('\\', $parts) . ';';
+            }
+
+            $classTemplate->setVar(
+              array(
+                'namespace'  => $namespace,
+                'class_name' => $originalClassName,
+                'wsdl'       => $wsdlFile,
+                'options'    => $optionsBuffer,
+                'methods'    => $methodsBuffer
+              )
+            );
+
+            return $classTemplate->render();
+        } else {
+            throw new PHPUnit_Framework_Exception(
+              'The SOAP extension is required to generate a mock object ' .
+              'from WSDL.'
+            );
+        }
+    }
+
+    /**
+     * @param  string     $originalClassName
+     * @param  array|null $methods
+     * @param  string     $mockClassName
+     * @param  boolean    $callOriginalClone
+     * @param  boolean    $callAutoload
+     * @param  boolean    $cloneArguments
+     * @return array
+     */
+    protected static function generateMock($originalClassName, $methods, $mockClassName, $callOriginalClone, $callAutoload, $cloneArguments = TRUE)
+    {
+        $templateDir   = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Generator' .
+                         DIRECTORY_SEPARATOR;
+        $classTemplate = new Text_Template(
+                           $templateDir . 'mocked_class.tpl'
+                         );
+        $cloneTemplate = '';
+        $isClass       = FALSE;
+        $isInterface   = FALSE;
+
+        $mockClassName = self::generateClassName(
+          $originalClassName, $mockClassName, 'Mock_'
+        );
+
+        if (class_exists($mockClassName['fullClassName'], $callAutoload)) {
+            $isClass = TRUE;
+        } else {
+            if (interface_exists($mockClassName['fullClassName'], $callAutoload)) {
+                $isInterface = TRUE;
+            }
+        }
+
+        if (!class_exists($mockClassName['fullClassName'], $callAutoload) &&
+            !interface_exists($mockClassName['fullClassName'], $callAutoload)) {
+            $prologue = 'class ' . $mockClassName['originalClassName'] . "\n{\n}\n\n";
+
+            if (!empty($mockClassName['namespaceName'])) {
+                $prologue = 'namespace ' . $mockClassName['namespaceName'] .
+                            " {\n\n" . $prologue . "}\n\n" .
+                            "namespace {\n\n";
+
+                $epilogue = "\n\n}";
+            }
+
+            $cloneTemplate = new Text_Template(
+              $templateDir . 'mocked_clone.tpl'
+            );
+        } else {
+            $class = new ReflectionClass($mockClassName['fullClassName']);
+
+            if ($class->isFinal()) {
+                throw new PHPUnit_Framework_Exception(
+                  sprintf(
+                    'Class "%s" is declared "final" and cannot be mocked.',
+                    $mockClassName['fullClassName']
+                  )
+                );
+            }
+
+            if ($class->hasMethod('__clone')) {
+                $cloneMethod = $class->getMethod('__clone');
+
+                if (!$cloneMethod->isFinal()) {
+                    if ($callOriginalClone && !$isInterface) {
+                        $cloneTemplate = new Text_Template(
+                          $templateDir . 'unmocked_clone.tpl'
+                        );
+                    } else {
+                        $cloneTemplate = new Text_Template(
+                          $templateDir . 'mocked_clone.tpl'
+                        );
+                    }
+                }
+            } else {
+                $cloneTemplate = new Text_Template(
+                  $templateDir . 'mocked_clone.tpl'
+                );
+            }
+        }
+
+        if (is_object($cloneTemplate)) {
+            $cloneTemplate = $cloneTemplate->render();
+        }
+
+        if (is_array($methods) && empty($methods) &&
+            ($isClass || $isInterface)) {
+            $methods = get_class_methods($mockClassName['fullClassName']);
+        }
+
+        if (!is_array($methods)) {
+            $methods = array();
+        }
+
+        $mockedMethods = '';
+
+        if (isset($class)) {
+            foreach ($methods as $methodName) {
+                try {
+                    $method = $class->getMethod($methodName);
+
+                    if (self::canMockMethod($method)) {
+                        $mockedMethods .= self::generateMockedMethodDefinitionFromExisting(
+                          $templateDir, $method, $cloneArguments
+                        );
+                    }
+                }
+
+                catch (ReflectionException $e) {
+                    $mockedMethods .= self::generateMockedMethodDefinition(
+                      $templateDir, $mockClassName['fullClassName'], $methodName, $cloneArguments
+                    );
+                }
+            }
+        } else {
+            foreach ($methods as $methodName) {
+                $mockedMethods .= self::generateMockedMethodDefinition(
+                  $templateDir, $mockClassName['fullClassName'], $methodName, $cloneArguments
+                );
+            }
+        }
+
+        $classTemplate->setVar(
+          array(
+            'prologue'          => isset($prologue) ? $prologue : '',
+            'epilogue'          => isset($epilogue) ? $epilogue : '',
+            'class_declaration' => self::generateMockClassDeclaration(
+                                     $mockClassName, $isInterface
+                                   ),
+            'clone'             => $cloneTemplate,
+            'mock_class_name'   => $mockClassName['className'],
+            'mocked_methods'    => $mockedMethods
+          )
+        );
+
+        return array(
+          'code'          => $classTemplate->render(),
+          'mockClassName' => $mockClassName['className']
+        );
+    }
+
+    /**
+     * @param  string $originalClassName
+     * @param  string $className
+     * @param  string $prefix
+     * @return array
+     */
+    protected static function generateClassName($originalClassName, $className, $prefix)
+    {
+        if ($originalClassName[0] == '\\') {
+            $originalClassName = substr($originalClassName, 1);
+        }
+
+        $classNameParts = explode('\\', $originalClassName);
+
+        if (count($classNameParts) > 1) {
+            $originalClassName = array_pop($classNameParts);
+            $namespaceName     = join('\\', $classNameParts);
+            $fullClassName     = $namespaceName . '\\' . $originalClassName;
+        } else {
+            $namespaceName = '';
+            $fullClassName = $originalClassName;
+        }
+
+        if ($className == '') {
+            do {
+                $className = $prefix . $originalClassName . '_' .
+                             substr(md5(microtime()), 0, 8);
+            }
+            while (class_exists($className, FALSE));
+        }
+
+        return array(
+          'className'         => $className,
+          'originalClassName' => $originalClassName,
+          'fullClassName'     => $fullClassName,
+          'namespaceName'     => $namespaceName
+        );
+    }
+
+    /**
+     * @param  array   $mockClassName
+     * @param  boolean $isInterface
+     * @return array
+     */
+    protected static function generateMockClassDeclaration(array $mockClassName, $isInterface)
+    {
+        $buffer = 'class ';
+
+        if ($isInterface) {
+            $buffer .= sprintf(
+              "%s implements PHPUnit_Framework_MockObject_MockObject, %s%s",
+              $mockClassName['className'],
+              !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '',
+              $mockClassName['originalClassName']
+            );
+        } else {
+            $buffer .= sprintf(
+              "%s extends %s%s implements PHPUnit_Framework_MockObject_MockObject",
+              $mockClassName['className'],
+              !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '',
+              $mockClassName['originalClassName']
+            );
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * @param  string           $templateDir
+     * @param  ReflectionMethod $method
+     * @param  boolean          $cloneArguments
+     * @return string
+     */
+    protected static function generateMockedMethodDefinitionFromExisting($templateDir, ReflectionMethod $method, $cloneArguments = TRUE)
+    {
+        if ($method->isPrivate()) {
+            $modifier = 'private';
+        }
+
+        else if ($method->isProtected()) {
+            $modifier = 'protected';
+        }
+
+        else {
+            $modifier = 'public';
+        }
+
+        if ($method->isStatic()) {
+            $static = TRUE;
+        } else {
+            $static = FALSE;
+        }
+
+        if ($method->returnsReference()) {
+            $reference = '&';
+        } else {
+            $reference = '';
+        }
+
+        return self::generateMockedMethodDefinition(
+          $templateDir,
+          $method->getDeclaringClass()->getName(),
+          $method->getName(),
+          $cloneArguments,
+          $modifier,
+          PHPUnit_Util_Class::getMethodParameters($method),
+          PHPUnit_Util_Class::getMethodParameters($method, TRUE),
+          $reference,
+          $static
+        );
+    }
+
+    /**
+     * @param  string  $templateDir
+     * @param  string  $className
+     * @param  string  $methodName
+     * @param  boolean $cloneArguments
+     * @param  string  $modifier
+     * @param  string  $arguments_decl
+     * @param  string  $arguments_call
+     * @param  string  $reference
+     * @param  boolean $static
+     * @return string
+     */
+    protected static function generateMockedMethodDefinition($templateDir, $className, $methodName, $cloneArguments = TRUE, $modifier = 'public', $arguments_decl = '', $arguments_call = '', $reference = '', $static = FALSE)
+    {
+        if ($static) {
+            $template = new Text_Template(
+              $templateDir . 'mocked_static_method.tpl'
+            );
+        } else {
+            $template = new Text_Template(
+              $templateDir . 'mocked_object_method.tpl'
+            );
+        }
+
+        $template->setVar(
+          array(
+            'arguments_decl'  => $arguments_decl,
+            'arguments_call'  => $arguments_call,
+            'arguments_count' => !empty($arguments_call) ? count(explode(',', $arguments_call)) : 0,
+            'class_name'      => $className,
+            'method_name'     => $methodName,
+            'modifier'        => $modifier,
+            'reference'       => $reference,
+            'clone_arguments' => $cloneArguments ? 'TRUE' : 'FALSE'
+          )
+        );
+
+        return $template->render();
+    }
+
+    /**
+     * @param  ReflectionMethod $method
+     * @return boolean
+     */
+    protected static function canMockMethod(ReflectionMethod $method)
+    {
+        if ($method->isConstructor() || $method->isFinal() ||
+            isset(self::$blacklistedMethodNames[$method->getName()])) {
+            return FALSE;
+        }
+
+        return TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_class.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_class.tpl.dist
new file mode 100644
index 0000000..0b41d1a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_class.tpl.dist
@@ -0,0 +1,52 @@
+{prologue}{class_declaration}
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+{clone}{mocked_methods}
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}{epilogue}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_clone.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_clone.tpl.dist
new file mode 100644
index 0000000..bd846de
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_clone.tpl.dist
@@ -0,0 +1,4 @@
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_object_method.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_object_method.tpl.dist
new file mode 100644
index 0000000..e2f55d9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_object_method.tpl.dist
@@ -0,0 +1,22 @@
+
+    {modifier} function {reference}{method_name}({arguments_decl})
+    {
+        $arguments = array({arguments_call});
+        $count     = func_num_args();
+
+        if ($count > {arguments_count}) {
+            $_arguments = func_get_args();
+
+            for ($i = {arguments_count}; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            '{class_name}', '{method_name}', $arguments, $this, {clone_arguments}
+          )
+        );
+
+        return $result;
+    }
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_static_method.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_static_method.tpl.dist
new file mode 100644
index 0000000..06df070
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/mocked_static_method.tpl.dist
@@ -0,0 +1,22 @@
+
+    {modifier} static function {reference}{method_name}({arguments_decl})
+    {
+        $arguments = array({arguments_call});
+        $count     = func_num_args();
+
+        if ($count > {arguments_count}) {
+            $_arguments = func_get_args();
+
+            for ($i = {arguments_count}; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = self::__phpunit_getStaticInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Static(
+            '{class_name}', '{method_name}', $arguments, {clone_arguments}
+          )
+        );
+
+        return $result;
+    }
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/trait_class.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/trait_class.tpl.dist
new file mode 100644
index 0000000..48b4bbf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/trait_class.tpl.dist
@@ -0,0 +1,4 @@
+class {class_name}
+{
+    use {trait_name};
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/unmocked_clone.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/unmocked_clone.tpl.dist
new file mode 100644
index 0000000..fa0e70a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/unmocked_clone.tpl.dist
@@ -0,0 +1,5 @@
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+        parent::__clone();
+    }
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/wsdl_class.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/wsdl_class.tpl.dist
new file mode 100644
index 0000000..05ad1d7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/wsdl_class.tpl.dist
@@ -0,0 +1,9 @@
+{namespace}
+
+class {class_name} extends \SOAPClient
+{
+    public function __construct($wsdl, array $options)
+    {
+        parent::__construct('{wsdl}', $options);
+    }
+{methods}}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/wsdl_method.tpl.dist b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/wsdl_method.tpl.dist
new file mode 100644
index 0000000..bb16e76
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Generator/wsdl_method.tpl.dist
@@ -0,0 +1,4 @@
+
+    public function {method_name}({arguments})
+    {
+    }
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation.php
new file mode 100644
index 0000000..d044b24
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for invocations.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Invocation
+{
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Object.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Object.php
new file mode 100644
index 0000000..1a60808
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Object.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Represents a non-static invocation.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Invocation_Object extends PHPUnit_Framework_MockObject_Invocation_Static
+{
+    /**
+     * @var object
+     */
+    public $object;
+
+    /**
+     * @param string $className
+     * @param string $methodname
+     * @param array  $parameters
+     * @param object $object
+     * @param object $cloneObjects
+     */
+    public function __construct($className, $methodName, array $parameters, $object, $cloneObjects = FALSE)
+    {
+        parent::__construct($className, $methodName, $parameters, $cloneObjects);
+        $this->object = $object;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Static.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Static.php
new file mode 100644
index 0000000..58bc643
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invocation/Static.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Represents a static invocation.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Invocation_Static implements PHPUnit_Framework_MockObject_Invocation, PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * @var array
+     */
+    protected static $uncloneableExtensions = array(
+      'mysqli' => TRUE,
+      'SQLite' => TRUE,
+      'sqlite3' => TRUE,
+      'tidy' => TRUE,
+      'xmlwriter' => TRUE,
+      'xsl' => TRUE
+    );
+
+    /**
+     * @var array
+     */
+    protected static $uncloneableClasses = array(
+      'Closure',
+      'COMPersistHelper',
+      'IteratorIterator',
+      'RecursiveIteratorIterator',
+      'SplFileObject',
+      'PDORow',
+      'ZipArchive'
+    );
+
+    /**
+     * @var string
+     */
+    public $className;
+
+    /**
+     * @var string
+     */
+    public $methodName;
+
+    /**
+     * @var array
+     */
+    public $parameters;
+
+    /**
+     * @param string  $className
+     * @param string  $methodname
+     * @param array   $parameters
+     * @param boolean $cloneObjects
+     */
+    public function __construct($className, $methodName, array $parameters, $cloneObjects = FALSE)
+    {
+        $this->className  = $className;
+        $this->methodName = $methodName;
+        $this->parameters = $parameters;
+
+        if (!$cloneObjects) {
+            return;
+        }
+
+        foreach ($this->parameters as $key => $value) {
+            if (is_object($value)) {
+                $this->parameters[$key] = $this->cloneObject($value);
+            }
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          "%s::%s(%s)",
+
+          $this->className,
+          $this->methodName,
+          join(
+            ', ',
+            array_map(
+              array('PHPUnit_Util_Type', 'shortenedExport'),
+              $this->parameters
+            )
+          )
+        );
+    }
+
+    /**
+     * @param  object $original
+     * @return object
+     */
+    protected function cloneObject($original)
+    {
+        $cloneable = NULL;
+        $object    = new ReflectionObject($original);
+
+        // Check the blacklist before asking PHP reflection to work around
+        // https://bugs.php.net/bug.php?id=53967
+        if ($object->isInternal() &&
+            isset(self::$uncloneableExtensions[$object->getExtensionName()])) {
+            $cloneable = FALSE;
+        }
+
+        if ($cloneable === NULL) {
+            foreach (self::$uncloneableClasses as $class) {
+                if ($original instanceof $class) {
+                    $cloneable = FALSE;
+                    break;
+                }
+            }
+        }
+
+        if ($cloneable === NULL && method_exists($object, 'isCloneable')) {
+            $cloneable = $object->isCloneable();
+        }
+
+        if ($cloneable === NULL && $object->hasMethod('__clone')) {
+            $method    = $object->getMethod('__clone');
+            $cloneable = $method->isPublic();
+        }
+
+        if ($cloneable === NULL) {
+            $cloneable = TRUE;
+        }
+
+        if ($cloneable) {
+            try {
+                return clone $original;
+            }
+
+            catch (Exception $e) {
+                return $original;
+            }
+        } else {
+            return $original;
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/InvocationMocker.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/InvocationMocker.php
new file mode 100644
index 0000000..d2803ab
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/InvocationMocker.php
@@ -0,0 +1,201 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Mocker for invocations which are sent from
+ * PHPUnit_Framework_MockObject_MockObject objects.
+ *
+ * Keeps track of all expectations and stubs as well as registering
+ * identifications for builders.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_InvocationMocker implements PHPUnit_Framework_MockObject_Stub_MatcherCollection, PHPUnit_Framework_MockObject_Invokable, PHPUnit_Framework_MockObject_Builder_Namespace
+{
+    /**
+     * @var PHPUnit_Framework_MockObject_Matcher_Invocation[]
+     */
+    protected $matchers = array();
+
+    /**
+     * @var PHPUnit_Framework_MockObject_Builder_Match[]
+     */
+    protected $builderMap = array();
+
+    /**
+     * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
+     */
+    public function addMatcher(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        $this->matchers[] = $matcher;
+    }
+
+    /**
+     * @since Method available since Release 1.1.0
+     */
+    public function hasMatchers()
+    {
+        if (empty($this->matchers)) {
+            return FALSE;
+        }
+
+        foreach ($this->matchers as $matcher) {
+            if (!$matcher instanceof PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount) {
+                return TRUE;
+            }
+        }
+
+        return FALSE;
+    }
+
+    /**
+     * @param  mixed $id
+     * @return boolean|null
+     */
+    public function lookupId($id)
+    {
+        if (isset($this->builderMap[$id])) {
+            return $this->builderMap[$id];
+        }
+
+        return NULL;
+    }
+
+    /**
+     * @param  mixed                                      $id
+     * @param  PHPUnit_Framework_MockObject_Builder_Match $builder
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function registerId($id, PHPUnit_Framework_MockObject_Builder_Match $builder)
+    {
+        if (isset($this->builderMap[$id])) {
+            throw new PHPUnit_Framework_Exception(
+              'Match builder with id <' . $id . '> is already registered.'
+            );
+        }
+
+        $this->builderMap[$id] = $builder;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return new PHPUnit_Framework_MockObject_Builder_InvocationMocker(
+          $this, $matcher
+        );
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return mixed
+     */
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $exception      = NULL;
+        $hasReturnValue = FALSE;
+
+        if (strtolower($invocation->methodName) == '__tostring') {
+            $returnValue = '';
+        } else {
+            $returnValue = NULL;
+        }
+
+        foreach ($this->matchers as $match) {
+            try {
+                if ($match->matches($invocation)) {
+                    $value = $match->invoked($invocation);
+
+                    if (!$hasReturnValue) {
+                        $returnValue    = $value;
+                        $hasReturnValue = TRUE;
+                    }
+                }
+            }
+
+            catch (Exception $e) {
+                $exception = $e;
+            }
+        }
+
+        if ($exception !== NULL) {
+            throw $exception;
+        }
+
+        return $returnValue;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        foreach ($this->matchers as $matcher) {
+            if (!$matcher->matches($invocation)) {
+                return FALSE;
+            }
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function verify()
+    {
+        foreach ($this->matchers as $matcher) {
+            $matcher->verify();
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invokable.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invokable.php
new file mode 100644
index 0000000..5286a2e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Invokable.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for classes which can be invoked.
+ *
+ * The invocation will be taken from a mock object and passed to an object
+ * of this class.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Invokable extends PHPUnit_Framework_MockObject_Verifiable
+{
+    /**
+     * Invokes the invocation object $invocation so that it can be checked for
+     * expectations or matched against stubs.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         The invocation object passed from mock object.
+     * @return object
+     */
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation);
+
+    /**
+     * Checks if the invocation matches.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         The invocation object passed from mock object.
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher.php
new file mode 100644
index 0000000..01c569a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher.php
@@ -0,0 +1,308 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Main matcher which defines a full expectation using method, parameter and
+ * invocation matchers.
+ * This matcher encapsulates all the other matchers and allows the builder to
+ * set the specific matchers when the appropriate methods are called (once(),
+ * where() etc.).
+ *
+ * All properties are public so that they can easily be accessed by the builder.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher implements PHPUnit_Framework_MockObject_Matcher_Invocation
+{
+    /**
+     * @var PHPUnit_Framework_MockObject_Matcher_Invocation
+     */
+    public $invocationMatcher;
+
+    /**
+     * @var mixed
+     */
+    public $afterMatchBuilderId = NULL;
+
+    /**
+     * @var boolean
+     */
+    public $afterMatchBuilderIsInvoked = FALSE;
+
+    /**
+     * @var PHPUnit_Framework_MockObject_Matcher_MethodName
+     */
+    public $methodNameMatcher = NULL;
+
+    /**
+     * @var PHPUnit_Framework_MockObject_Matcher_Parameters
+     */
+    public $parametersMatcher = NULL;
+
+    /**
+     * @var PHPUnit_Framework_MockObject_Stub
+     */
+    public $stub = NULL;
+
+    /**
+     * @param PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher
+     */
+    public function __construct(PHPUnit_Framework_MockObject_Matcher_Invocation $invocationMatcher)
+    {
+        $this->invocationMatcher = $invocationMatcher;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        $list = array();
+
+        if ($this->invocationMatcher !== NULL) {
+            $list[] = $this->invocationMatcher->toString();
+        }
+
+        if ($this->methodNameMatcher !== NULL) {
+            $list[] = 'where ' . $this->methodNameMatcher->toString();
+        }
+
+        if ($this->parametersMatcher !== NULL) {
+            $list[] = 'and ' . $this->parametersMatcher->toString();
+        }
+
+        if ($this->afterMatchBuilderId !== NULL) {
+            $list[] = 'after ' . $this->afterMatchBuilderId;
+        }
+
+        if ($this->stub !== NULL) {
+            $list[] = 'will ' . $this->stub->toString();
+        }
+
+        return join(' ', $list);
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return mixed
+     */
+    public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        if ($this->invocationMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'No invocation matcher is set'
+            );
+        }
+
+        if ($this->methodNameMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception('No method matcher is set');
+        }
+
+        if ($this->afterMatchBuilderId !== NULL) {
+            $builder = $invocation->object
+                                  ->__phpunit_getInvocationMocker()
+                                  ->lookupId($this->afterMatchBuilderId);
+
+            if (!$builder) {
+                throw new PHPUnit_Framework_Exception(
+                  sprintf(
+                    'No builder found for match builder identification <%s>',
+
+                    $this->afterMatchBuilderId
+                  )
+                );
+            }
+
+            $matcher = $builder->getMatcher();
+
+            if ($matcher && $matcher->invocationMatcher->hasBeenInvoked()) {
+                $this->afterMatchBuilderIsInvoked = TRUE;
+            }
+        }
+
+        $this->invocationMatcher->invoked($invocation);
+
+        try {
+            if ( $this->parametersMatcher !== NULL &&
+                !$this->parametersMatcher->matches($invocation)) {
+                $this->parametersMatcher->verify();
+            }
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              sprintf(
+                "Expectation failed for %s when %s\n%s",
+
+                $this->methodNameMatcher->toString(),
+                $this->invocationMatcher->toString(),
+                $e->getMessage()
+              ),
+              $e->getComparisonFailure()
+            );
+        }
+
+        if ($this->stub) {
+            return $this->stub->invoke($invocation);
+        }
+
+        return NULL;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        if ($this->afterMatchBuilderId !== NULL) {
+            $builder = $invocation->object
+                                  ->__phpunit_getInvocationMocker()
+                                  ->lookupId($this->afterMatchBuilderId);
+
+            if (!$builder) {
+                throw new PHPUnit_Framework_Exception(
+                  sprintf(
+                    'No builder found for match builder identification <%s>',
+
+                    $this->afterMatchBuilderId
+                  )
+                );
+            }
+
+            $matcher = $builder->getMatcher();
+
+            if (!$matcher) {
+                return FALSE;
+            }
+
+            if (!$matcher->invocationMatcher->hasBeenInvoked()) {
+                return FALSE;
+            }
+        }
+
+        if ($this->invocationMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'No invocation matcher is set'
+            );
+        }
+
+        if ($this->methodNameMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception('No method matcher is set');
+        }
+
+        if (!$this->invocationMatcher->matches($invocation)) {
+            return FALSE;
+        }
+
+        try {
+            if (!$this->methodNameMatcher->matches($invocation)) {
+                return FALSE;
+            }
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              sprintf(
+                "Expectation failed for %s when %s\n%s",
+
+                $this->methodNameMatcher->toString(),
+                $this->invocationMatcher->toString(),
+                $e->getMessage()
+              ),
+              $e->getComparisonFailure()
+            );
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * @throws PHPUnit_Framework_Exception
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function verify()
+    {
+        if ($this->invocationMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'No invocation matcher is set'
+            );
+        }
+
+        if ($this->methodNameMatcher === NULL) {
+            throw new PHPUnit_Framework_Exception('No method matcher is set');
+        }
+
+        try {
+            $this->invocationMatcher->verify();
+
+            if ($this->parametersMatcher === NULL) {
+                $this->parametersMatcher = new PHPUnit_Framework_MockObject_Matcher_AnyParameters;
+            }
+
+            $invocationIsAny = get_class($this->invocationMatcher) === 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount';
+            if (!$invocationIsAny) {
+                $this->parametersMatcher->verify();
+            }
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              sprintf(
+                "Expectation failed for %s when %s.\n%s",
+
+                $this->methodNameMatcher->toString(),
+                $this->invocationMatcher->toString(),
+                $e->getMessage()
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyInvokedCount.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyInvokedCount.php
new file mode 100644
index 0000000..8c1ce60
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyInvokedCount.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which checks if a method has been invoked zero or more
+ * times. This matcher will always match.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
+{
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'invoked zero or more times';
+    }
+
+    /**
+     */
+    public function verify()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyParameters.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyParameters.php
new file mode 100644
index 0000000..a06d420
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/AnyParameters.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which allos any parameters to a method.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_AnyParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
+{
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'with any parameters';
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        return TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Invocation.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Invocation.php
new file mode 100644
index 0000000..59b30be
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Invocation.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for classes which matches an invocation based on its
+ * method name, argument, order or call count.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Matcher_Invocation extends PHPUnit_Framework_SelfDescribing, PHPUnit_Framework_MockObject_Verifiable
+{
+    /**
+     * Registers the invocation $invocation in the object as being invoked.
+     * This will only occur after matches() returns true which means the
+     * current invocation is the correct one.
+     *
+     * The matcher can store information from the invocation which can later
+     * be checked in verify(), or it can check the values directly and throw
+     * and exception if an expectation is not met.
+     *
+     * If the matcher is a stub it will also have a return value.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         Object containing information on a mocked or stubbed method which
+     *         was invoked.
+     * @return mixed
+     */
+    public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation);
+
+    /**
+     * Checks if the invocation $invocation matches the current rules. If it does
+     * the matcher will get the invoked() method called which should check if an
+     * expectation is met.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         Object containing information on a mocked or stubbed method which
+     *         was invoked.
+     * @return bool
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtIndex.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtIndex.php
new file mode 100644
index 0000000..cf969b7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtIndex.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which checks if a method was invoked at a certain index.
+ *
+ * If the expected index number does not match the current invocation index it
+ * will not match which means it skips all method and parameter matching. Only
+ * once the index is reached will the method and parameter start matching and
+ * verifying.
+ *
+ * If the index is never reached it will throw an exception in index.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex implements PHPUnit_Framework_MockObject_Matcher_Invocation
+{
+    /**
+     * @var integer
+     */
+    protected $sequenceIndex;
+
+    /**
+     * @var integer
+     */
+    protected $currentIndex = -1;
+
+    /**
+     * @param integer $sequenceIndex
+     */
+    public function __construct($sequenceIndex)
+    {
+        $this->sequenceIndex = $sequenceIndex;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'invoked at sequence index ' . $this->sequenceIndex;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $this->currentIndex++;
+
+        return $this->currentIndex == $this->sequenceIndex;
+    }
+
+    /**
+     * @param PHPUnit_Framework_MockObject_Invocation $invocation
+     */
+    public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+    }
+
+    /**
+     * Verifies that the current expectation is valid. If everything is OK the
+     * code should just return, if not it must throw an exception.
+     *
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function verify()
+    {
+        if ($this->currentIndex < $this->sequenceIndex) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              sprintf(
+                'The expected invocation at index %s was never reached.',
+
+                $this->sequenceIndex
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtLeastOnce.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtLeastOnce.php
new file mode 100644
index 0000000..1fb89ad
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedAtLeastOnce.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which checks if a method has been invoked at least one
+ * time.
+ *
+ * If the number of invocations is 0 it will throw an exception in verify.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
+{
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'invoked at least once';
+    }
+
+    /**
+     * Verifies that the current expectation is valid. If everything is OK the
+     * code should just return, if not it must throw an exception.
+     *
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function verify()
+    {
+        $count = $this->getInvocationCount();
+
+        if ($count < 1) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              'Expected invocation at least once but it never occured.'
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedCount.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedCount.php
new file mode 100644
index 0000000..e5948cc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedCount.php
@@ -0,0 +1,143 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which checks if a method has been invoked a certain amount
+ * of times.
+ * If the number of invocations exceeds the value it will immediately throw an
+ * exception,
+ * If the number is less it will later be checked in verify() and also throw an
+ * exception.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_InvokedCount extends PHPUnit_Framework_MockObject_Matcher_InvokedRecorder
+{
+    /**
+     * @var integer
+     */
+    protected $expectedCount;
+
+    /**
+     * @param interger $expectedCount
+     */
+    public function __construct($expectedCount)
+    {
+        $this->expectedCount = $expectedCount;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'invoked ' . $this->expectedCount . ' time(s)';
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        parent::invoked($invocation);
+
+        $count = $this->getInvocationCount();
+
+        if ($count > $this->expectedCount) {
+            $message = $invocation->toString() . ' ';
+
+            switch ($this->expectedCount) {
+                case 0: {
+                    $message .= 'was not expected to be called.';
+                }
+                break;
+
+                case 1: {
+                    $message .= 'was not expected to be called more than once.';
+                }
+                break;
+
+                default: {
+                    $message .= sprintf(
+                      'was not expected to be called more than %d times.',
+
+                      $this->expectedCount
+                    );
+                }
+            }
+
+            throw new PHPUnit_Framework_ExpectationFailedException($message);
+        }
+    }
+
+    /**
+     * Verifies that the current expectation is valid. If everything is OK the
+     * code should just return, if not it must throw an exception.
+     *
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function verify()
+    {
+        $count = $this->getInvocationCount();
+
+        if ($count !== $this->expectedCount) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              sprintf(
+                'Method was expected to be called %d times, ' .
+                'actually called %d times.',
+
+                $this->expectedCount,
+                $count
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedRecorder.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedRecorder.php
new file mode 100644
index 0000000..146a277
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/InvokedRecorder.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Records invocations and provides convenience methods for checking them later
+ * on.
+ * This abstract class can be implemented by matchers which needs to check the
+ * number of times an invocation has occured.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ * @abstract
+ */
+abstract class PHPUnit_Framework_MockObject_Matcher_InvokedRecorder implements PHPUnit_Framework_MockObject_Matcher_Invocation
+{
+    /**
+     * @var PHPUnit_Framework_MockObject_Invocation[]
+     */
+    protected $invocations = array();
+
+    /**
+     * @return integer
+     */
+    public function getInvocationCount()
+    {
+        return count($this->invocations);
+    }
+
+    /**
+     * @return PHPUnit_Framework_MockObject_Invocation[]
+     */
+    public function getInvocations()
+    {
+        return $this->invocations;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function hasBeenInvoked()
+    {
+        return count($this->invocations) > 0;
+    }
+
+    /**
+     * @param PHPUnit_Framework_MockObject_Invocation $invocation
+     */
+    public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $this->invocations[] = $invocation;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        return TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/MethodName.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/MethodName.php
new file mode 100644
index 0000000..b889e3e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/MethodName.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which looks for a specific method name in the invocations.
+ *
+ * Checks the method name all incoming invocations, the name is checked against
+ * the defined constraint $constraint. If the constraint is met it will return
+ * true in matches().
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_MethodName extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
+{
+    /**
+     * @var PHPUnit_Framework_Constraint
+     */
+    protected $constraint;
+
+    /**
+     * @param  PHPUnit_Framework_Constraint|string
+     * @throws PHPUnit_Framework_Constraint
+     */
+    public function __construct($constraint)
+    {
+        if (!$constraint instanceof PHPUnit_Framework_Constraint) {
+            if (!is_string($constraint)) {
+                throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+            }
+
+            $constraint = new PHPUnit_Framework_Constraint_IsEqual(
+              $constraint, 0, 10, FALSE, TRUE
+            );
+        }
+
+        $this->constraint = $constraint;
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'method name ' . $this->constraint->toString();
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        return $this->constraint->evaluate($invocation->methodName, '', TRUE);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Parameters.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Parameters.php
new file mode 100644
index 0000000..e3284a4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/Parameters.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which looks for specific parameters in the invocations.
+ *
+ * Checks the parameters of all incoming invocations, the parameter list is
+ * checked against the defined constraints in $parameters. If the constraint
+ * is met it will return true in matches().
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Matcher_Parameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
+{
+    /**
+     * @var array
+     */
+    protected $parameters = array();
+
+    /**
+     * @var PHPUnit_Framework_MockObject_Invocation
+     */
+    protected $invocation;
+
+    /**
+     * @param array $parameters
+     */
+    public function __construct(array $parameters)
+    {
+        foreach ($parameters as $parameter) {
+            if (!($parameter instanceof PHPUnit_Framework_Constraint)) {
+                $parameter = new PHPUnit_Framework_Constraint_IsEqual(
+                  $parameter
+                );
+            }
+
+            $this->parameters[] = $parameter;
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        $text = 'with parameter';
+
+        foreach ($this->parameters as $index => $parameter) {
+            if ($index > 0) {
+                $text .= ' and';
+            }
+
+            $text .= ' ' . $index . ' ' . $parameter->toString();
+        }
+
+        return $text;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     * @return boolean
+     */
+    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $this->invocation = $invocation;
+        $this->verify();
+
+        return count($invocation->parameters) < count($this->parameters);
+    }
+
+    /**
+     * Checks if the invocation $invocation matches the current rules. If it
+     * does the matcher will get the invoked() method called which should check
+     * if an expectation is met.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         Object containing information on a mocked or stubbed method which
+     *         was invoked.
+     * @return bool
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function verify()
+    {
+        if ($this->invocation === NULL) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              'Mocked method does not exist.'
+            );
+        }
+
+        if (count($this->invocation->parameters) < count($this->parameters)) {
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              sprintf(
+                'Parameter count for invocation %s is too low.',
+
+                $this->invocation->toString()
+              )
+            );
+        }
+
+        foreach ($this->parameters as $i => $parameter) {
+            $parameter->evaluate(
+              $this->invocation->parameters[$i],
+              sprintf(
+                'Parameter %s for invocation %s does not match expected ' .
+                'value.',
+
+                $i,
+                $this->invocation->toString()
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/StatelessInvocation.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/StatelessInvocation.php
new file mode 100644
index 0000000..2f91447
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Matcher/StatelessInvocation.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Invocation matcher which does not care about previous state from earlier
+ * invocations.
+ *
+ * This abstract class can be implemented by matchers which does not care about
+ * state but only the current run-time value of the invocation itself.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ * @abstract
+ */
+abstract class PHPUnit_Framework_MockObject_Matcher_StatelessInvocation implements PHPUnit_Framework_MockObject_Matcher_Invocation
+{
+    /**
+     * Registers the invocation $invocation in the object as being invoked.
+     * This will only occur after matches() returns true which means the
+     * current invocation is the correct one.
+     *
+     * The matcher can store information from the invocation which can later
+     * be checked in verify(), or it can check the values directly and throw
+     * and exception if an expectation is not met.
+     *
+     * If the matcher is a stub it will also have a return value.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         Object containing information on a mocked or stubbed method which
+     *         was invoked.
+     * @return mixed
+     */
+    public function invoked(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+    }
+
+    /**
+     * Checks if the invocation $invocation matches the current rules. If it does
+     * the matcher will get the invoked() method called which should check if an
+     * expectation is met.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         Object containing information on a mocked or stubbed method which
+     *         was invoked.
+     * @return bool
+     */
+    public function verify()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockBuilder.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockBuilder.php
new file mode 100644
index 0000000..0aa569d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockBuilder.php
@@ -0,0 +1,291 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Implementation of the Builder pattern for Mock objects.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_MockBuilder
+{
+    /**
+     * @var PHPUnit_Framework_TestCase
+     */
+    protected $testCase;
+
+    /**
+     * @var string
+     */
+    protected $className;
+
+    /**
+     * @var array
+     */
+    protected $methods = array();
+
+    /**
+     * @var string
+     */
+    protected $mockClassName = '';
+
+    /**
+     * @var array
+     */
+    protected $constructorArgs = array();
+
+    /**
+     * @var boolean
+     */
+    protected $originalConstructor = TRUE;
+
+    /**
+     * @var boolean
+     */
+    protected $originalClone = TRUE;
+
+    /**
+     * @var boolean
+     */
+    protected $autoload = TRUE;
+
+    /**
+     * @var boolean
+     */
+    protected $cloneArguments = FALSE;
+
+    /**
+     * @param PHPUnit_Framework_TestCase
+     * @param string
+     */
+    public function __construct(PHPUnit_Framework_TestCase $testCase, $className)
+    {
+        $this->testCase  = $testCase;
+        $this->className = $className;
+    }
+
+    /**
+     * Creates a mock object using a fluent interface.
+     *
+     * @return PHPUnit_Framework_MockObject_MockObject
+     */
+    public function getMock()
+    {
+        return $this->testCase->getMock(
+          $this->className,
+          $this->methods,
+          $this->constructorArgs,
+          $this->mockClassName,
+          $this->originalConstructor,
+          $this->originalClone,
+          $this->autoload,
+          $this->cloneArguments
+        );
+    }
+
+    /**
+     * Creates a mock object for an abstract class using a fluent interface.
+     *
+     * @return PHPUnit_Framework_MockObject_MockObject
+     */
+    public function getMockForAbstractClass()
+    {
+        return $this->testCase->getMockForAbstractClass(
+          $this->className,
+          $this->constructorArgs,
+          $this->mockClassName,
+          $this->originalConstructor,
+          $this->originalClone,
+          $this->autoload,
+          $this->methods,
+          $this->cloneArguments
+        );
+    }
+
+    /**
+     * Specifies the subset of methods to mock. Default is to mock all of them.
+     *
+     * @param  array|null $methods
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     */
+    public function setMethods($methods)
+    {
+        $this->methods = $methods;
+
+        return $this;
+    }
+
+    /**
+     * Specifies the arguments for the constructor.
+     *
+     * @param  array $args
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     */
+    public function setConstructorArgs(array $args)
+    {
+        $this->constructorArgs = $args;
+
+        return $this;
+    }
+
+    /**
+     * Specifies the name for the mock class.
+     *
+     * @param string $name
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     */
+    public function setMockClassName($name)
+    {
+        $this->mockClassName = $name;
+
+        return $this;
+    }
+
+    /**
+     * Disables the invocation of the original constructor.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     */
+    public function disableOriginalConstructor()
+    {
+        $this->originalConstructor = FALSE;
+
+        return $this;
+    }
+
+    /**
+     * Enables the invocation of the original constructor.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     * @since  Method available since Release 1.2.0
+     */
+    public function enableOriginalConstructor()
+    {
+        $this->originalConstructor = TRUE;
+
+        return $this;
+    }
+
+    /**
+     * Disables the invocation of the original clone constructor.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     */
+    public function disableOriginalClone()
+    {
+        $this->originalClone = FALSE;
+
+        return $this;
+    }
+
+    /**
+     * Enables the invocation of the original clone constructor.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     * @since  Method available since Release 1.2.0
+     */
+    public function enableOriginalClone()
+    {
+        $this->originalClone = TRUE;
+
+        return $this;
+    }
+
+    /**
+     * Disables the use of class autoloading while creating the mock object.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     */
+    public function disableAutoload()
+    {
+        $this->autoload = FALSE;
+
+        return $this;
+    }
+
+    /**
+     * Enables the use of class autoloading while creating the mock object.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     * @since  Method available since Release 1.2.0
+     */
+    public function enableAutoload()
+    {
+        $this->autoload = TRUE;
+
+        return $this;
+    }
+
+    /**
+     * Disables the cloning of arguments passed to mocked methods.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     * @since  Method available since Release 1.2.0
+     */
+    public function disableArgumentCloning()
+    {
+        $this->cloneArguments = FALSE;
+
+        return $this;
+    }
+
+    /**
+     * Enables the cloning of arguments passed to mocked methods.
+     *
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     * @since  Method available since Release 1.2.0
+     */
+    public function enableArgumentCloning()
+    {
+        $this->cloneArguments = TRUE;
+
+        return $this;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockObject.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockObject.php
new file mode 100644
index 0000000..f60fa70
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/MockObject.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for all mock objects which are generated by
+ * PHPUnit_Framework_MockObject_Mock.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_MockObject /*extends PHPUnit_Framework_MockObject_Verifiable*/
+{
+    /**
+     * Registers a new expectation in the mock object and returns the match
+     * object which can be infused with further details.
+     *
+     * @param  PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
+
+    /**
+     * Registers a new static expectation in the mock object and returns the
+     * match object which can be infused with further details.
+     *
+     * @param  PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
+     * @return PHPUnit_Framework_MockObject_Builder_InvocationMocker
+     */
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
+
+    /**
+     * @return PHPUnit_Framework_MockObject_InvocationMocker
+     */
+    public function __phpunit_getInvocationMocker();
+
+    /**
+     * @return PHPUnit_Framework_MockObject_InvocationMocker
+     */
+    public static function __phpunit_getStaticInvocationMocker();
+
+    /**
+     * Verifies that the current expectation is valid. If everything is OK the
+     * code should just return, if not it must throw an exception.
+     *
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function __phpunit_verify();
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub.php
new file mode 100644
index 0000000..56555bf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * An object that stubs the process of a normal method for a mock object.
+ *
+ * The stub object will replace the code for the stubbed method and return a
+ * specific value instead of the original value.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Stub extends PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * Fakes the processing of the invocation $invocation by returning a
+     * specific value.
+     *
+     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
+     *         The invocation which was mocked and matched by the current method
+     *         and argument matchers.
+     * @return mixed
+     */
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ConsecutiveCalls.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ConsecutiveCalls.php
new file mode 100644
index 0000000..9f54bdd
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ConsecutiveCalls.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Patrick MÃ¼ller <elias0@gmx.net>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Stubs a method by returning a user-defined stack of values.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Patrick MÃ¼ller <elias0@gmx.net>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls implements PHPUnit_Framework_MockObject_Stub
+{
+    protected $stack;
+    protected $value;
+
+    public function __construct($stack)
+    {
+        $this->stack = $stack;
+    }
+
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $this->value = array_shift($this->stack);
+
+        if ($this->value instanceof PHPUnit_Framework_MockObject_Stub) {
+            $this->value = $this->value->invoke($invocation);
+        }
+
+        return $this->value;
+    }
+
+    public function toString()
+    {
+        return sprintf(
+          'return user-specified value %s',
+
+          PHPUnit_Util_Type::toString($this->value)
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Exception.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Exception.php
new file mode 100644
index 0000000..dc8152c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Exception.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Oliver Schlicht <o.schlicht@bitExpert.de>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Stubs a method by raising a user-defined exception.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Oliver Schlicht <o.schlicht@bitExpert.de>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Stub_Exception implements PHPUnit_Framework_MockObject_Stub
+{
+    protected $exception;
+
+    public function __construct(Exception $exception)
+    {
+        $this->exception = $exception;
+    }
+
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        throw $this->exception;
+    }
+
+    public function toString()
+    {
+        return sprintf(
+          'raise user-specified exception %s',
+
+          PHPUnit_Util_Type::toString($this->exception)
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/MatcherCollection.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/MatcherCollection.php
new file mode 100644
index 0000000..2040fd5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/MatcherCollection.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Stubs a method by returning a user-defined value.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Stub_MatcherCollection
+{
+    /**
+     * Adds a new matcher to the collection which can be used as an expectation
+     * or a stub.
+     *
+     * @param PHPUnit_Framework_MockObject_Matcher_Invocation $matcher
+     *        Matcher for invocations to mock objects.
+     */
+    public function addMatcher(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher);
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Return.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Return.php
new file mode 100644
index 0000000..c673536
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/Return.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Stubs a method by returning a user-defined value.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Stub_Return implements PHPUnit_Framework_MockObject_Stub
+{
+    protected $value;
+
+    public function __construct($value)
+    {
+        $this->value = $value;
+    }
+
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        return $this->value;
+    }
+
+    public function toString()
+    {
+        return sprintf(
+          'return user-specified value %s',
+
+          PHPUnit_Util_Type::toString($this->value)
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnArgument.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnArgument.php
new file mode 100644
index 0000000..d5b668c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnArgument.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Stubs a method by returning an argument that was passed to the mocked method.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Stub_ReturnArgument extends PHPUnit_Framework_MockObject_Stub_Return
+{
+    protected $argumentIndex;
+
+    public function __construct($argumentIndex)
+    {
+        $this->argumentIndex = $argumentIndex;
+    }
+
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        if (isset($invocation->parameters[$this->argumentIndex])) {
+            return $invocation->parameters[$this->argumentIndex];
+        } else {
+            return NULL;
+        }
+    }
+
+    public function toString()
+    {
+        return sprintf('return argument #%d', $this->argumentIndex);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnCallback.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnCallback.php
new file mode 100644
index 0000000..282fd35
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnCallback.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.0.0
+ */
+class PHPUnit_Framework_MockObject_Stub_ReturnCallback implements PHPUnit_Framework_MockObject_Stub
+{
+    protected $callback;
+
+    public function __construct($callback)
+    {
+        $this->callback = $callback;
+    }
+
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        return call_user_func_array($this->callback, $invocation->parameters);
+    }
+
+    public function toString()
+    {
+        if (is_array($this->callback)) {
+            if (is_object($this->callback[0])) {
+                $class = get_class($this->callback[0]);
+                $type  = '->';
+            } else {
+                $class = $this->callback[0];
+                $type  = '::';
+            }
+
+            return sprintf(
+              'return result of user defined callback %s%s%s() with the ' .
+              'passed arguments',
+
+              $class,
+              $type,
+              $this->callback[1]
+            );
+        } else {
+            return 'return result of user defined callback ' . $this->callback .
+                   ' with the passed arguments';
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnSelf.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnSelf.php
new file mode 100644
index 0000000..6695944
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnSelf.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @author     Kris Wallsmith <kris.wallsmith@gmail.com>
+ * @copyright  2010 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Stubs a method by returning the current object.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @author     Kris Wallsmith <kris.wallsmith@gmail.com>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.1.0
+ */
+class PHPUnit_Framework_MockObject_Stub_ReturnSelf implements PHPUnit_Framework_MockObject_Stub
+{
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        if (!$invocation instanceof PHPUnit_Framework_MockObject_Invocation_Object) {
+            throw new PHPUnit_Framework_Exception(
+                'The current object can only be returned when mocking an ' .
+                'object, not a static class.'
+            );
+        }
+
+        return $invocation->object;
+    }
+
+    public function toString()
+    {
+        return 'return the current object';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnValueMap.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnValueMap.php
new file mode 100644
index 0000000..f743fde
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Stub/ReturnValueMap.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.1.0
+ */
+
+/**
+ * Stubs a method by returning a value from a map.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Class available since Release 1.1.0
+ */
+class PHPUnit_Framework_MockObject_Stub_ReturnValueMap implements PHPUnit_Framework_MockObject_Stub
+{
+    protected $valueMap;
+
+    public function __construct(array $valueMap)
+    {
+        $this->valueMap = $valueMap;
+    }
+
+    public function invoke(PHPUnit_Framework_MockObject_Invocation $invocation)
+    {
+        $parameterCount = count($invocation->parameters);
+
+        foreach ($this->valueMap as $map) {
+            if (!is_array($map) || $parameterCount != count($map) - 1) {
+                continue;
+            }
+
+            $return = array_pop($map);
+            if ($invocation->parameters === $map) {
+                return $return;
+            }
+        }
+
+        return NULL;
+    }
+
+    public function toString()
+    {
+        return 'return value from a map';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Verifiable.php b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Verifiable.php
new file mode 100644
index 0000000..9c70ba7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/PHPUnit/Framework/MockObject/Verifiable.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+/**
+ * Interface for classes which must verify a given expectation.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      Interface available since Release 1.0.0
+ */
+interface PHPUnit_Framework_MockObject_Verifiable
+{
+    /**
+     * Verifies that the current expectation is valid. If everything is OK the
+     * code should just return, if not it must throw an exception.
+     *
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function verify();
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/GeneratorTest.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/GeneratorTest.php
new file mode 100644
index 0000000..2ffbbc3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/GeneratorTest.php
@@ -0,0 +1,79 @@
+<?php
+class Framework_MockObject_GeneratorTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMock
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testGetMockFailsWhenInvalidFunctionNameIsPassedInAsAFunctionToMock()
+    {
+        PHPUnit_Framework_MockObject_Generator::getMock('StdClass', array(0));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMock
+     */
+    public function testGetMockCanCreateNonExistingFunctions()
+    {
+        $mock = PHPUnit_Framework_MockObject_Generator::getMock('StdClass', array('testFunction'));
+        $this->assertTrue(method_exists($mock, 'testFunction'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMock
+     * @expectedException PHPUnit_Framework_Exception
+     * @expectedExceptionMessage duplicates: "foo, foo"
+     */
+    public function testGetMockGeneratorFails()
+    {
+        $mock = PHPUnit_Framework_MockObject_Generator::getMock('StdClass', array('foo', 'foo'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass
+     */
+    public function testGetMockForAbstractClassDoesNotFailWhenFakingInterfaces()
+    {
+        $mock = PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass('Countable');
+        $this->assertTrue(method_exists($mock, 'count'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass
+     */
+    public function testGetMockForAbstractClassStubbingAbstractClass()
+    {
+        $mock = PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass('AbstractMockTestClass');
+        $this->assertTrue(method_exists($mock, 'doSomething'));
+    }
+
+    /**
+     * @dataProvider getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider
+     * @covers PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testGetMockForAbstractClassExpectingInvalidArgumentException($className, $mockClassName)
+    {
+        $mock = PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass($className, array(), $mockClassName);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testGetMockForAbstractClassAnstractClassDoesNotExist()
+    {
+        $mock = PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass('Tux');
+    }
+
+    /**
+     * Dataprovider for test "testGetMockForAbstractClassExpectingInvalidArgumentException"
+     */
+    public static function getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider()
+    {
+        return array(
+            'className not a string' => array(array(), ''),
+            'mockClassName not a string' => array('Countable', new StdClass),
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockBuilderTest.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockBuilderTest.php
new file mode 100644
index 0000000..4acc2f4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockBuilderTest.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+
+require_once 'PHPUnit/Framework/TestCase.php';
+
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Mockable.php';
+
+/**
+ * @package    PHPUnit_MockObject
+ * @author     Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
+ * @since      File available since Release 1.0.0
+ */
+class Framework_MockBuilderTest extends PHPUnit_Framework_TestCase
+{
+    public function testMockBuilderRequiresClassName()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $mock = $spec->getMock();
+        $this->assertTrue($mock instanceof Mockable);
+    }
+
+    public function testByDefaultMocksAllMethods()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $mock = $spec->getMock();
+        $this->assertNull($mock->mockableMethod());
+        $this->assertNull($mock->anotherMockableMethod());
+    }
+
+    public function testMethodsToMockCanBeSpecified()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $spec->setMethods(array('mockableMethod'));
+        $mock = $spec->getMock();
+        $this->assertNull($mock->mockableMethod());
+        $this->assertTrue($mock->anotherMockableMethod());
+    }
+
+    public function testByDefaultDoesNotPassArgumentsToTheConstructor()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $mock = $spec->getMock();
+        $this->assertEquals(array(NULL, NULL), $mock->constructorArgs);
+    }
+
+    public function testMockClassNameCanBeSpecified()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $spec->setMockClassName('ACustomClassName');
+        $mock = $spec->getMock();
+        $this->assertTrue($mock instanceof ACustomClassName);
+    }
+
+    public function testConstructorArgumentsCanBeSpecified()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $spec->setConstructorArgs($expected = array(23, 42));
+        $mock = $spec->getMock();
+        $this->assertEquals($expected, $mock->constructorArgs);
+    }
+
+    public function testOriginalConstructorCanBeDisabled()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $spec->disableOriginalConstructor();
+        $mock = $spec->getMock();
+        $this->assertNull($mock->constructorArgs);
+    }
+
+    public function testByDefaultOriginalCloneIsPreserved()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $mock = $spec->getMock();
+        $cloned = clone $mock;
+        $this->assertTrue($cloned->cloned);
+    }
+
+    public function testOriginalCloneCanBeDisabled()
+    {
+        $spec = $this->getMockBuilder('Mockable');
+        $spec->disableOriginalClone();
+        $mock = $spec->getMock();
+        $mock->cloned = FALSE;
+        $cloned = clone $mock;
+        $this->assertFalse($cloned->cloned);
+    }
+
+    public function testCallingAutoloadCanBeDisabled()
+    {
+        // it is not clear to me how to test this nor the difference
+        // between calling it or not
+        $this->markTestIncomplete();
+    }
+
+    public function testProvidesAFluentInterface()
+    {
+        $spec = $this->getMockBuilder('Mockable')
+                     ->setMethods(array('mockableMethod'))
+                     ->setConstructorArgs(array())
+                     ->setMockClassName('DummyClassName')
+                     ->disableOriginalConstructor()
+                     ->disableOriginalClone()
+                     ->disableAutoload();
+        $this->assertTrue($spec instanceof PHPUnit_Framework_MockObject_MockBuilder);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/Invocation/ObjectTest.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/Invocation/ObjectTest.php
new file mode 100644
index 0000000..b28b124
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/Invocation/ObjectTest.php
@@ -0,0 +1,82 @@
+<?php
+
+class Framework_MockObject_Invocation_ObjectTest extends PHPUnit_Framework_TestCase
+{
+    public function testConstructorRequiresClassAndMethodAndParametersAndObject()
+    {
+        new PHPUnit_Framework_MockObject_Invocation_Object(
+            'FooClass',
+            'FooMethod',
+            array('an_argument'),
+            new StdClass);
+    }
+
+    public function testAllowToGetClassNameSetInConstructor()
+    {
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Object(
+            'FooClass',
+            'FooMethod',
+            array('an_argument'),
+            new StdClass);
+
+        $this->assertSame('FooClass', $invocation->className);
+    }
+
+    public function testAllowToGetMethodNameSetInConstructor()
+    {
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Object(
+            'FooClass',
+            'FooMethod',
+            array('an_argument'),
+            new StdClass);
+
+        $this->assertSame('FooMethod', $invocation->methodName);
+    }
+
+    public function testAllowToGetObjectSetInConstructor()
+    {
+        $expectedObject = new StdClass;
+
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Object(
+            'FooClass',
+            'FooMethod',
+            array('an_argument'),
+            $expectedObject);
+
+        $this->assertSame($expectedObject, $invocation->object);
+    }
+
+    public function testAllowToGetMethodParametersSetInConstructor()
+    {
+        $expectedParameters = array(
+          'foo', 5, array('a', 'b'), new StdClass, NULL, FALSE
+        );
+
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Object(
+          'FooClass',
+          'FooMethod',
+          $expectedParameters,
+          new StdClass
+        );
+
+        $this->assertSame($expectedParameters, $invocation->parameters);
+    }
+
+    public function testConstructorAllowToSetFlagCloneObjectsInParameters()
+    {
+        $parameters   = array(new StdClass);
+        $cloneObjects = TRUE;
+
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Object(
+          'FooClass',
+          'FooMethod',
+          $parameters,
+          new StdClass,
+          $cloneObjects
+        );
+
+        $this->assertEquals($parameters, $invocation->parameters);
+        $this->assertNotSame($parameters, $invocation->parameters);
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/Invocation/StaticTest.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/Invocation/StaticTest.php
new file mode 100644
index 0000000..09e6e3c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/Invocation/StaticTest.php
@@ -0,0 +1,52 @@
+<?php
+
+class Framework_MockObject_Invocation_StaticTest extends PHPUnit_Framework_TestCase
+{
+    public function testConstructorRequiresClassAndMethodAndParameters()
+    {
+        new PHPUnit_Framework_MockObject_Invocation_Static('FooClass', 'FooMethod', array('an_argument'));
+    }
+
+    public function testAllowToGetClassNameSetInConstructor()
+    {
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Static('FooClass', 'FooMethod', array('an_argument'));
+
+        $this->assertSame('FooClass', $invocation->className);
+    }
+
+    public function testAllowToGetMethodNameSetInConstructor()
+    {
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Static('FooClass', 'FooMethod', array('an_argument'));
+
+        $this->assertSame('FooMethod', $invocation->methodName);
+    }
+
+    public function testAllowToGetMethodParametersSetInConstructor()
+    {
+        $expectedParameters = array(
+          'foo', 5, array('a', 'b'), new StdClass, NULL, FALSE
+        );
+
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Static(
+          'FooClass', 'FooMethod', $expectedParameters
+        );
+
+        $this->assertSame($expectedParameters, $invocation->parameters);
+    }
+
+    public function testConstructorAllowToSetFlagCloneObjectsInParameters()
+    {
+        $parameters = array(new StdClass);
+        $cloneObjects = TRUE;
+
+        $invocation = new PHPUnit_Framework_MockObject_Invocation_Static(
+          'FooClass',
+          'FooMethod',
+          $parameters,
+          $cloneObjects
+        );
+
+        $this->assertEquals($parameters, $invocation->parameters);
+        $this->assertNotSame($parameters, $invocation->parameters);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class.phpt
new file mode 100644
index 0000000..bdeecb8
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class.phpt
@@ -0,0 +1,128 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public function bar(Foo $foo)
+    {
+    }
+
+    public function baz(Foo $foo)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function baz(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'Foo', 'baz', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_call_parent_clone.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_call_parent_clone.phpt
new file mode 100644
index 0000000..784031f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_call_parent_clone.phpt
@@ -0,0 +1,82 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public function __clone()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+        parent::__clone();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_call_parent_constructor.phpt
new file mode 100644
index 0000000..f9c1040
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_call_parent_constructor.phpt
@@ -0,0 +1,81 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public function __construct()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_dont_call_parent_clone.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_dont_call_parent_clone.phpt
new file mode 100644
index 0000000..5d337bc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_dont_call_parent_clone.phpt
@@ -0,0 +1,81 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', FALSE)
+--FILE--
+<?php
+class Foo
+{
+    public function __clone()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  FALSE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_dont_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_dont_call_parent_constructor.phpt
new file mode 100644
index 0000000..f9c1040
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_dont_call_parent_constructor.phpt
@@ -0,0 +1,81 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public function __construct()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_implementing_interface_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_implementing_interface_call_parent_constructor.phpt
new file mode 100644
index 0000000..66a2af8
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_implementing_interface_call_parent_constructor.phpt
@@ -0,0 +1,86 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+interface IFoo
+{
+    public function __construct($bar);
+}
+
+class Foo implements IFoo
+{
+    public function __construct($bar)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_implementing_interface_dont_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_implementing_interface_dont_call_parent_constructor.phpt
new file mode 100644
index 0000000..66a2af8
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_implementing_interface_dont_call_parent_constructor.phpt
@@ -0,0 +1,86 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+interface IFoo
+{
+    public function __construct($bar);
+}
+
+class Foo implements IFoo
+{
+    public function __construct($bar)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_partial.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_partial.phpt
new file mode 100644
index 0000000..0720b13
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/class_partial.phpt
@@ -0,0 +1,107 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array('bar'), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public function bar(Foo $foo)
+    {
+    }
+
+    public function baz(Foo $foo)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array('bar'),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/interface.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/interface.phpt
new file mode 100644
index 0000000..6a4c843
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/interface.phpt
@@ -0,0 +1,101 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+interface Foo
+{
+    public function bar(Foo $foo);
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo implements PHPUnit_Framework_MockObject_MockObject, Foo
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/invocation_object_clone_object.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/invocation_object_clone_object.phpt
new file mode 100644
index 0000000..685bf2e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/invocation_object_clone_object.phpt
@@ -0,0 +1,130 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE, TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public function bar(Foo $foo)
+    {
+    }
+
+    public function baz(Foo $foo)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function baz(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'Foo', 'baz', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/invocation_static_clone_object.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/invocation_static_clone_object.phpt
new file mode 100644
index 0000000..469b0b3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/invocation_static_clone_object.phpt
@@ -0,0 +1,130 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE, TRUE)
+--FILE--
+<?php
+class Foo
+{
+    public static function bar(Foo $foo)
+    {
+    }
+
+    public static function baz(Foo $foo)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public static function bar(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = self::__phpunit_getStaticInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Static(
+            'Foo', 'bar', $arguments, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public static function baz(Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = self::__phpunit_getStaticInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Static(
+            'Foo', 'baz', $arguments, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class.phpt
new file mode 100644
index 0000000..d63c4ce
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class.phpt
@@ -0,0 +1,131 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+namespace NS;
+
+class Foo
+{
+    public function bar(Foo $foo)
+    {
+    }
+
+    public function baz(Foo $foo)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(NS\Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'NS\Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function baz(NS\Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'NS\Foo', 'baz', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_call_parent_clone.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_call_parent_clone.phpt
new file mode 100644
index 0000000..1531f1d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_call_parent_clone.phpt
@@ -0,0 +1,84 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+namespace NS;
+
+class Foo
+{
+    public function __clone()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+        parent::__clone();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_call_parent_constructor.phpt
new file mode 100644
index 0000000..20b3bb9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_call_parent_constructor.phpt
@@ -0,0 +1,83 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+namespace NS;
+
+class Foo
+{
+    public function __construct()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_dont_call_parent_clone.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_dont_call_parent_clone.phpt
new file mode 100644
index 0000000..1c80079
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_dont_call_parent_clone.phpt
@@ -0,0 +1,83 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', FALSE)
+--FILE--
+<?php
+namespace NS;
+
+class Foo
+{
+    public function __clone()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  FALSE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_dont_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_dont_call_parent_constructor.phpt
new file mode 100644
index 0000000..20b3bb9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_dont_call_parent_constructor.phpt
@@ -0,0 +1,83 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+namespace NS;
+
+class Foo
+{
+    public function __construct()
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_implementing_interface_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_implementing_interface_call_parent_constructor.phpt
new file mode 100644
index 0000000..ffee897
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_implementing_interface_call_parent_constructor.phpt
@@ -0,0 +1,88 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+namespace NS;
+
+interface IFoo
+{
+    public function __construct($bar);
+}
+
+class Foo implements IFoo
+{
+    public function __construct($bar)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_implementing_interface_dont_call_parent_constructor.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_implementing_interface_dont_call_parent_constructor.phpt
new file mode 100644
index 0000000..ffee897
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_implementing_interface_dont_call_parent_constructor.phpt
@@ -0,0 +1,88 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE)
+--FILE--
+<?php
+namespace NS;
+
+interface IFoo
+{
+    public function __construct($bar);
+}
+
+class Foo implements IFoo
+{
+    public function __construct($bar)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_partial.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_partial.phpt
new file mode 100644
index 0000000..3bea847
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_class_partial.phpt
@@ -0,0 +1,109 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array('bar'), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+namespace NS;
+
+class Foo
+{
+    public function bar(Foo $foo)
+    {
+    }
+
+    public function baz(Foo $foo)
+    {
+    }
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array('bar'),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(NS\Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'NS\Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_interface.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_interface.phpt
new file mode 100644
index 0000000..077ac08
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/namespaced_interface.phpt
@@ -0,0 +1,103 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('NS\Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+namespace NS;
+
+interface Foo
+{
+    public function bar(Foo $foo);
+}
+
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = \PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class MockFoo implements PHPUnit_Framework_MockObject_MockObject, NS\Foo
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function bar(NS\Foo $foo)
+    {
+        $arguments = array($foo);
+        $count     = func_num_args();
+
+        if ($count > 1) {
+            $_arguments = func_get_args();
+
+            for ($i = 1; $i < $count; $i++) {
+                $arguments[] = $_arguments[$i];
+            }
+        }
+
+        $result = $this->__phpunit_getInvocationMocker()->invoke(
+          new PHPUnit_Framework_MockObject_Invocation_Object(
+            'NS\Foo', 'bar', $arguments, $this, TRUE
+          )
+        );
+
+        return $result;
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class.phpt
new file mode 100644
index 0000000..f5be8d2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class.phpt
@@ -0,0 +1,78 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+class Foo
+{
+}
+
+class MockFoo extends Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class_with_namespace.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class_with_namespace.phpt
new file mode 100644
index 0000000..b6c8f54
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class_with_namespace.phpt
@@ -0,0 +1,86 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  'NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+namespace NS {
+
+class Foo
+{
+}
+
+}
+
+namespace {
+
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class_with_namespace_starting_with_separator.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class_with_namespace_starting_with_separator.phpt
new file mode 100644
index 0000000..2e0bfb2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/nonexistent_class_with_namespace_starting_with_separator.phpt
@@ -0,0 +1,86 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generate('Foo', array(), 'MockFoo', TRUE, TRUE)
+--FILE--
+<?php
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+$mock = PHPUnit_Framework_MockObject_Generator::generate(
+  '\NS\Foo',
+  array(),
+  'MockFoo',
+  TRUE,
+  TRUE
+);
+
+print $mock['code'];
+?>
+--EXPECTF--
+namespace NS {
+
+class Foo
+{
+}
+
+}
+
+namespace {
+
+class MockFoo extends NS\Foo implements PHPUnit_Framework_MockObject_MockObject
+{
+    private static $__phpunit_staticInvocationMocker;
+    private $__phpunit_invocationMocker;
+
+    public function __clone()
+    {
+        $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationMocker();
+    }
+
+    public function expects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return $this->__phpunit_getInvocationMocker()->expects($matcher);
+    }
+
+    public static function staticExpects(PHPUnit_Framework_MockObject_Matcher_Invocation $matcher)
+    {
+        return self::__phpunit_getStaticInvocationMocker()->expects($matcher);
+    }
+
+    public function __phpunit_getInvocationMocker()
+    {
+        if ($this->__phpunit_invocationMocker === NULL) {
+            $this->__phpunit_invocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return $this->__phpunit_invocationMocker;
+    }
+
+    public static function __phpunit_getStaticInvocationMocker()
+    {
+        if (self::$__phpunit_staticInvocationMocker === NULL) {
+            self::$__phpunit_staticInvocationMocker = new PHPUnit_Framework_MockObject_InvocationMocker;
+        }
+
+        return self::$__phpunit_staticInvocationMocker;
+    }
+
+    public function __phpunit_hasMatchers()
+    {
+        return self::__phpunit_getStaticInvocationMocker()->hasMatchers() ||
+               $this->__phpunit_getInvocationMocker()->hasMatchers();
+    }
+
+    public function __phpunit_verify()
+    {
+        self::__phpunit_getStaticInvocationMocker()->verify();
+        $this->__phpunit_getInvocationMocker()->verify();
+    }
+
+    public function __phpunit_cleanup()
+    {
+        self::$__phpunit_staticInvocationMocker = NULL;
+        $this->__phpunit_invocationMocker       = NULL;
+    }
+}
+
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class.phpt
new file mode 100644
index 0000000..52c9839
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class.phpt
@@ -0,0 +1,36 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl('GoogleSearch.wsdl', 'GoogleSearch')
+--SKIPIF--
+<?php
+if (!extension_loaded('soap')) echo 'skip: SOAP extension is required';
+?>
+--FILE--
+<?php
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+print PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl(
+  dirname(dirname(__FILE__)) . '/_files/GoogleSearch.wsdl',
+  'GoogleSearch'
+);
+?>
+--EXPECTF--
+class GoogleSearch extends \SOAPClient
+{
+    public function __construct($wsdl, array $options)
+    {
+        parent::__construct('%s/GoogleSearch.wsdl', $options);
+    }
+
+    public function doGetCachedPage($key, $url)
+    {
+    }
+
+    public function doSpellingSuggestion($key, $phrase)
+    {
+    }
+
+    public function doGoogleSearch($key, $q, $start, $maxResults, $filter, $restrict, $safeSearch, $lr, $ie, $oe)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class_namespace.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class_namespace.phpt
new file mode 100644
index 0000000..b3075c5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class_namespace.phpt
@@ -0,0 +1,38 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl('GoogleSearch.wsdl', 'GoogleSearch')
+--SKIPIF--
+<?php
+if (!extension_loaded('soap')) echo 'skip: SOAP extension is required';
+?>
+--FILE--
+<?php
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+print PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl(
+  dirname(dirname(__FILE__)) . '/_files/GoogleSearch.wsdl',
+  'My\\Space\\GoogleSearch'
+);
+?>
+--EXPECTF--
+namespace My\Space;
+
+class GoogleSearch extends \SOAPClient
+{
+    public function __construct($wsdl, array $options)
+    {
+        parent::__construct('%s/GoogleSearch.wsdl', $options);
+    }
+
+    public function doGetCachedPage($key, $url)
+    {
+    }
+
+    public function doSpellingSuggestion($key, $phrase)
+    {
+    }
+
+    public function doGoogleSearch($key, $q, $start, $maxResults, $filter, $restrict, $safeSearch, $lr, $ie, $oe)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class_partial.phpt b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class_partial.phpt
new file mode 100644
index 0000000..4a69f26
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObject/wsdl_class_partial.phpt
@@ -0,0 +1,29 @@
+--TEST--
+PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl('GoogleSearch.wsdl', 'GoogleSearch', array('doGoogleSearch'))
+--SKIPIF--
+<?php
+if (!extension_loaded('soap')) echo 'skip: SOAP extension is required';
+?>
+--FILE--
+<?php
+require_once 'PHPUnit/Autoload.php';
+require_once 'Text/Template.php';
+
+print PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl(
+  dirname(dirname(__FILE__)) . '/_files/GoogleSearch.wsdl',
+  'GoogleSearch',
+  array('doGoogleSearch')
+);
+?>
+--EXPECTF--
+class GoogleSearch extends \SOAPClient
+{
+    public function __construct($wsdl, array $options)
+    {
+        parent::__construct('%s/GoogleSearch.wsdl', $options);
+    }
+
+    public function doGoogleSearch($key, $q, $start, $maxResults, $filter, $restrict, $safeSearch, $lr, $ie, $oe)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObjectTest.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObjectTest.php
new file mode 100644
index 0000000..af5cf5a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/MockObjectTest.php
@@ -0,0 +1,696 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2010-2013, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+require_once 'PHPUnit/Framework/TestCase.php';
+
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'AbstractMockTestClass.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'AnInterface.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'FunctionCallback.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MethodCallback.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MethodCallbackByReference.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'PartialMockTestClass.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'SomeClass.php';
+require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'StaticMockTestClass.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit_MockObject
+ * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @author     Patrick Mueller <elias0@gmx.net>
+ * @author     Frank Kleine <mikey@stubbles.net>
+ * @copyright  2010-2013 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class Framework_MockObjectTest extends PHPUnit_Framework_TestCase
+{
+    public function testMockedMethodIsNeverCalled()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->never())
+             ->method('doSomething');
+    }
+
+    public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter()
+    {
+        $mock = $this->getMock('SomeClass');
+        $mock->expects($this->any())
+             ->method('doSomethingElse')
+             ->with('someArg');
+    }
+
+    public function testMockedMethodIsCalledAtLeastOnce()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atLeastOnce())
+             ->method('doSomething');
+
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledAtLeastOnce2()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->atLeastOnce())
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledOnce()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->once())
+             ->method('doSomething');
+
+        $mock->doSomething();
+    }
+
+    public function testMockedMethodIsCalledOnceWithParameter()
+    {
+        $mock = $this->getMock('SomeClass');
+        $mock->expects($this->once())
+             ->method('doSomethingElse')
+             ->with($this->equalTo('something'));
+
+        $mock->doSomethingElse('something');
+    }
+
+    public function testMockedMethodIsCalledExactly()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->exactly(2))
+             ->method('doSomething');
+
+        $mock->doSomething();
+        $mock->doSomething();
+    }
+
+    public function testStubbedException()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->throwException(new Exception));
+
+        try {
+            $mock->doSomething();
+        }
+
+        catch (Exception $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    public function testStubbedReturnValue()
+    {
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->returnValue('something'));
+
+        $this->assertEquals('something', $mock->doSomething());
+    }
+
+    public function testStubbedReturnValueMap()
+    {
+        $map = array(
+            array('a', 'b', 'c', 'd'),
+            array('e', 'f', 'g', 'h')
+        );
+
+        $mock = $this->getMock('AnInterface');
+        $mock->expects($this->any())
+             ->method('doSomething')
+             ->will($this->returnValueMap($map));
+
+        $this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
+        $this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
+        $this->assertEquals(NULL, $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testFunctionCallback()
+    {
+        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', FALSE);
+        $mock->expects($this->once())
+             ->method('doSomething')
+             ->will($this->returnCallback('functionCallback'));
+
+        $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testStaticMethodCallback()
+    {
+        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', FALSE);
+        $mock->expects($this->once())
+             ->method('doSomething')
+             ->will($this->returnCallback(array('MethodCallback', 'staticCallback')));
+
+        $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testPublicMethodCallback()
+    {
+        $mock = $this->getMock('SomeClass', array('doSomething'), array(), '', FALSE);
+        $mock->expects($this->once())
+             ->method('doSomething')
+             ->will($this->returnCallback(array(new MethodCallback, 'nonStaticCallback')));
+
+        $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
+    }
+
+    public function testMockClassOnlyGeneratedOnce()
+    {
+        $mock1 = $this->getMock('AnInterface');
+        $mock2 = $this->getMock('AnInterface');
+
+        $this->assertEquals(get_class($mock1), get_class($mock2));
+    }
+
+    public function testMockClassDifferentForPartialMocks()
+    {
+        $mock1 = $this->getMock('PartialMockTestClass');
+        $mock2 = $this->getMock('PartialMockTestClass', array('doSomething'));
+        $mock3 = $this->getMock('PartialMockTestClass', array('doSomething'));
+        $mock4 = $this->getMock('PartialMockTestClass', array('doAnotherThing'));
+        $mock5 = $this->getMock('PartialMockTestClass', array('doAnotherThing'));
+
+        $this->assertNotEquals(get_class($mock1), get_class($mock2));
+        $this->assertNotEquals(get_class($mock1), get_class($mock3));
+        $this->assertNotEquals(get_class($mock1), get_class($mock4));
+        $this->assertNotEquals(get_class($mock1), get_class($mock5));
+        $this->assertEquals(get_class($mock2), get_class($mock3));
+        $this->assertNotEquals(get_class($mock2), get_class($mock4));
+        $this->assertNotEquals(get_class($mock2), get_class($mock5));
+        $this->assertEquals(get_class($mock4), get_class($mock5));
+    }
+
+    public function testMockClassStoreOverrulable()
+    {
+        $mock1 = $this->getMock('PartialMockTestClass');
+        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), 'MyMockClassNameForPartialMockTestClass1');
+        $mock3 = $this->getMock('PartialMockTestClass');
+        $mock4 = $this->getMock('PartialMockTestClass', array('doSomething'), array(), 'AnotherMockClassNameForPartialMockTestClass');
+        $mock5 = $this->getMock('PartialMockTestClass', array(), array(), 'MyMockClassNameForPartialMockTestClass2');
+
+        $this->assertNotEquals(get_class($mock1), get_class($mock2));
+        $this->assertEquals(get_class($mock1), get_class($mock3));
+        $this->assertNotEquals(get_class($mock1), get_class($mock4));
+        $this->assertNotEquals(get_class($mock2), get_class($mock3));
+        $this->assertNotEquals(get_class($mock2), get_class($mock4));
+        $this->assertNotEquals(get_class($mock2), get_class($mock5));
+        $this->assertNotEquals(get_class($mock3), get_class($mock4));
+        $this->assertNotEquals(get_class($mock3), get_class($mock5));
+        $this->assertNotEquals(get_class($mock4), get_class($mock5));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_MockObject_Generator::getMock
+     */
+    public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice()
+    {
+        $mock = $this->getMockBuilder('StdClass')->setMockClassName('FixedName')->getMock();
+        $mock = $this->getMockBuilder('StdClass')->setMockClassName('FixedName')->getMock();
+        $this->assertInstanceOf('StdClass', $mock);
+    }
+
+    public function testOriginalConstructorSettingConsidered()
+    {
+        $mock1 = $this->getMock('PartialMockTestClass');
+        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', FALSE);
+
+        $this->assertTrue($mock1->constructorCalled);
+        $this->assertFalse($mock2->constructorCalled);
+    }
+
+    public function testOriginalCloneSettingConsidered()
+    {
+        $mock1 = $this->getMock('PartialMockTestClass');
+        $mock2 = $this->getMock('PartialMockTestClass', array(), array(), '', TRUE, FALSE);
+
+        $this->assertNotEquals(get_class($mock1), get_class($mock2));
+    }
+
+    public function testStubbedReturnValueForStaticMethod()
+    {
+        $this->getMockClass(
+          'StaticMockTestClass',
+          array('doSomething'),
+          array(),
+          'StaticMockTestClassMock'
+        );
+
+        StaticMockTestClassMock::staticExpects($this->any())
+          ->method('doSomething')
+          ->will($this->returnValue('something'));
+
+        $this->assertEquals(
+          'something', StaticMockTestClassMock::doSomething()
+        );
+    }
+
+    public function testStubbedReturnValueForStaticMethod2()
+    {
+        $this->getMockClass(
+          'StaticMockTestClass',
+          array('doSomething'),
+          array(),
+          'StaticMockTestClassMock2'
+        );
+
+        StaticMockTestClassMock2::staticExpects($this->any())
+          ->method('doSomething')
+          ->will($this->returnValue('something'));
+
+        $this->assertEquals(
+          'something', StaticMockTestClassMock2::doSomethingElse()
+        );
+    }
+
+    public function testGetMockForAbstractClass()
+    {
+        $mock = $this->getMock('AbstractMockTestClass');
+        $mock->expects($this->never())
+             ->method('doSomething');
+    }
+
+    public function testClonedMockObjectShouldStillEqualTheOriginal()
+    {
+        $a = $this->getMock('stdClass');
+        $b = clone $a;
+        $this->assertEquals($a, $b);
+    }
+
+    public function testMockObjectsConstructedIndepentantlyShouldBeEqual()
+    {
+        $a = $this->getMock('stdClass');
+        $b = $this->getMock('stdClass');
+        $this->assertEquals($a, $b);
+    }
+
+    public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
+    {
+        $a = $this->getMock('stdClass');
+        $b = $this->getMock('stdClass');
+        $this->assertNotSame($a, $b);
+    }
+
+    public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
+    {
+        $x = $this->getMock('stdClass');
+        $y = clone $x;
+
+        $mock = $this->getMock('stdClass', array('foo'));
+        $mock->expects($this->once())->method('foo')->with($this->equalTo($x));
+        $mock->foo($y);
+    }
+
+    public function testClonedMockObjectIsNotIdenticalToOriginalOne()
+    {
+        $x = $this->getMock('stdClass');
+        $y = clone $x;
+
+        $mock = $this->getMock('stdClass', array('foo'));
+        $mock->expects($this->once())->method('foo')->with($this->logicalNot($this->identicalTo($x)));
+        $mock->foo($y);
+    }
+
+    public function testStaticMethodCallWithArgumentCloningEnabled()
+    {
+        $expectedObject = new StdClass;
+
+        $this->getMockClass(
+          'StaticMockTestClass',
+          array('doSomething'),
+          array(),
+          'StaticMockTestClassMock3',
+          FALSE,
+          TRUE,
+          TRUE,
+          TRUE
+        );
+
+        $actualArguments = array();
+
+        StaticMockTestClassMock3::staticExpects($this->any())
+        ->method('doSomething')
+        ->will($this->returnCallback(function() use (&$actualArguments) {
+            $actualArguments = func_get_args();
+        }));
+
+        StaticMockTestClassMock3::doSomething($expectedObject);
+
+        $this->assertEquals(1, count($actualArguments));
+        $this->assertNotSame($expectedObject, $actualArguments[0]);
+    }
+
+    public function testStaticMethodCallWithArgumentCloningDisabled()
+    {
+        $expectedObject = new StdClass;
+
+        $this->getMockClass(
+          'StaticMockTestClass',
+          array('doSomething'),
+          array(),
+          'StaticMockTestClassMock4',
+          FALSE,
+          TRUE,
+          TRUE,
+          FALSE
+        );
+
+        $actualArguments = array();
+
+        StaticMockTestClassMock4::staticExpects($this->any())
+        ->method('doSomething')
+        ->will($this->returnCallback(function() use (&$actualArguments) {
+            $actualArguments = func_get_args();
+        }));
+
+        StaticMockTestClassMock4::doSomething($expectedObject);
+
+        $this->assertEquals(1, count($actualArguments));
+        $this->assertEquals($expectedObject, $actualArguments[0]);
+        $this->assertSame($expectedObject, $actualArguments[0]);
+    }
+
+    public function testObjectMethodCallWithArgumentCloningEnabled()
+    {
+        $expectedObject = new StdClass;
+
+        $mock = $this->getMockBuilder('SomeClass')
+                     ->setMethods(array('doSomethingElse'))
+                     ->enableArgumentCloning()
+                     ->getMock();
+
+        $actualArguments = array();
+
+        $mock->expects($this->any())
+        ->method('doSomethingElse')
+        ->will($this->returnCallback(function() use (&$actualArguments) {
+            $actualArguments = func_get_args();
+        }));
+
+        $mock->doSomethingElse($expectedObject);
+
+        $this->assertEquals(1, count($actualArguments));
+        $this->assertEquals($expectedObject, $actualArguments[0]);
+        $this->assertNotSame($expectedObject, $actualArguments[0]);
+    }
+
+    public function testObjectMethodCallWithArgumentCloningDisabled()
+    {
+        $expectedObject = new StdClass;
+
+        $mock = $this->getMockBuilder('SomeClass')
+                     ->setMethods(array('doSomethingElse'))
+                     ->disableArgumentCloning()
+                     ->getMock();
+
+        $actualArguments = array();
+
+        $mock->expects($this->any())
+        ->method('doSomethingElse')
+        ->will($this->returnCallback(function() use (&$actualArguments) {
+            $actualArguments = func_get_args();
+        }));
+
+        $mock->doSomethingElse($expectedObject);
+
+        $this->assertEquals(1, count($actualArguments));
+        $this->assertSame($expectedObject, $actualArguments[0]);
+    }
+
+    public function testArgumentCloningOptionGeneratesUniqueMock()
+    {
+        $mockWithCloning = $this->getMockBuilder('SomeClass')
+                                ->setMethods(array('doSomethingElse'))
+                                ->enableArgumentCloning()
+                                ->getMock();
+
+        $mockWithoutCloning = $this->getMockBuilder('SomeClass')
+                                   ->setMethods(array('doSomethingElse'))
+                                   ->disableArgumentCloning()
+                                   ->getMock();
+
+        $this->assertNotEquals($mockWithCloning, $mockWithoutCloning);
+    }
+
+    public function testVerificationOfMethodNameFailsWithoutParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', TRUE, TRUE, TRUE);
+        $mock->expects($this->once())
+             ->method('right');
+
+        $mock->wrong();
+        try {
+            $mock->__phpunit_verify();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertSame(
+                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
+                . 'Method was expected to be called 1 times, actually called 0 times.',
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfMethodNameFailsWithParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', TRUE, TRUE, TRUE);
+        $mock->expects($this->once())
+             ->method('right');
+
+        $mock->wrong();
+        try {
+            $mock->__phpunit_verify();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertSame(
+                "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
+                . 'Method was expected to be called 1 times, actually called 0 times.',
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfNeverFailsWithEmptyParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', TRUE, TRUE, TRUE);
+        $mock->expects($this->never())
+             ->method('right')
+             ->with();
+
+        try {
+            $mock->right();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertSame(
+                'SomeClass::right() was not expected to be called.',
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    public function testVerificationOfNeverFailsWithAnyParameters()
+    {
+        $mock = $this->getMock('SomeClass', array('right', 'wrong'), array(), '', TRUE, TRUE, TRUE);
+        $mock->expects($this->never())
+             ->method('right')
+             ->withAnyParameters();
+
+        try {
+            $mock->right();
+            $this->fail('Expected exception');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertSame(
+                'SomeClass::right() was not expected to be called.',
+                $e->getMessage()
+            );
+        }
+
+        $this->resetMockObjects();
+    }
+
+    /**
+     * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
+     */
+    public function testMockArgumentsPassedByReference() {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->setMethods(array('bar'))
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->will($this->returnCallback(array($foo, 'callback')));
+
+        $a = $b = $c = 0;
+
+        $foo->bar($a, $b, $c);
+
+        $this->assertEquals(1, $b);
+    }
+
+    /**
+     * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
+     */
+    public function testMockArgumentsPassedByReference2() {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->will($this->returnCallback(
+            function (&$a, &$b, $c) {
+                $b = 1;
+            }
+            ));
+
+        $a = $b = $c = 0;
+
+        $foo->bar($a, $b, $c);
+
+        $this->assertEquals(1, $b);
+    }
+
+    /**
+     * https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
+     */
+    public function testMockArgumentsPassedByReference3() {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->setMethods(array('bar'))
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $a = new stdClass();
+        $b = $c = 0;
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->with($a, $b, $c)
+            ->will($this->returnCallback(array($foo, 'callback')));
+
+        $foo->bar($a, $b, $c);
+    }
+
+    /**
+     * https://github.com/sebastianbergmann/phpunit/issues/796
+     */
+    public function testMockArgumentsPassedByReference4() {
+        $foo = $this->getMockBuilder('MethodCallbackByReference')
+                    ->setMethods(array('bar'))
+                    ->disableOriginalConstructor()
+                    ->disableArgumentCloning()
+                    ->getMock();
+
+        $a = new stdClass();
+        $b = $c = 0;
+
+        $foo->expects($this->any())
+            ->method('bar')
+            ->with($this->isInstanceOf("stdClass"), $b, $c)
+            ->will($this->returnCallback(array($foo, 'callback')));
+
+        $foo->bar($a, $b, $c);
+    }
+
+    /**
+     * @requires extension soap
+     */
+    public function testCreateMockFromWsdl()
+    {
+        $mock = $this->getMockFromWsdl(__DIR__ . '/_files/GoogleSearch.wsdl', 'WsdlMock');
+        $this->assertStringStartsWith(
+            'Mock_WsdlMock_',
+            get_class($mock)
+        );
+    }
+
+    /**
+     * @requires extension soap
+     */
+    public function testCreateNamespacedMockFromWsdl()
+    {
+        $mock = $this->getMockFromWsdl(__DIR__ . '/_files/GoogleSearch.wsdl', 'My\\Space\\WsdlMock');
+        $this->assertStringStartsWith(
+            'Mock_WsdlMock_',
+            get_class($mock)
+        );
+    }
+
+    /**
+     * @requires extension soap
+     */
+    public function testCreateTwoMocksOfOneWsdlFile()
+    {
+        $mock = $this->getMockFromWsdl(__DIR__ . '/_files/GoogleSearch.wsdl');
+        $mock = $this->getMockFromWsdl(__DIR__ . '/_files/GoogleSearch.wsdl');
+    }
+
+    private function resetMockObjects()
+    {
+        $refl = new ReflectionObject($this);
+        $refl = $refl->getParentClass();
+        $prop = $refl->getProperty('mockObjects');
+        $prop->setAccessible(true);
+        $prop->setValue($this, array());
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/AbstractMockTestClass.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/AbstractMockTestClass.php
new file mode 100644
index 0000000..1f2641f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/AbstractMockTestClass.php
@@ -0,0 +1,5 @@
+<?php
+abstract class AbstractMockTestClass
+{
+    abstract public function doSomething();
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/AnInterface.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/AnInterface.php
new file mode 100644
index 0000000..5b7d4cc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/AnInterface.php
@@ -0,0 +1,5 @@
+<?php
+interface AnInterface
+{
+    public function doSomething();
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/FunctionCallback.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/FunctionCallback.php
new file mode 100644
index 0000000..c12ac6c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/FunctionCallback.php
@@ -0,0 +1,9 @@
+<?php
+function functionCallback()
+{
+    $args = func_get_args();
+
+    if ($args == array('foo', 'bar')) {
+        return 'pass';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/GoogleSearch.wsdl b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/GoogleSearch.wsdl
new file mode 100644
index 0000000..e448501
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/GoogleSearch.wsdl
@@ -0,0 +1,198 @@
+<?xml version="1.0"?>
+
+<!-- WSDL description of the Google Web APIs.
+     The Google Web APIs are in beta release. All interfaces are subject to
+     change as we refine and extend our APIs. Please see the terms of use
+     for more information. -->
+
+<!-- Revision 2002-08-16 -->
+
+<definitions name="GoogleSearch"
+             targetNamespace="urn:GoogleSearch"
+             xmlns:typens="urn:GoogleSearch"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+             xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
+             xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+             xmlns="http://schemas.xmlsoap.org/wsdl/">
+
+  <!-- Types for search - result elements, directory categories -->
+
+  <types>
+    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
+                targetNamespace="urn:GoogleSearch">
+
+      <xsd:complexType name="GoogleSearchResult">
+        <xsd:all>
+          <xsd:element name="documentFiltering"           type="xsd:boolean"/>
+          <xsd:element name="searchComments"              type="xsd:string"/>
+          <xsd:element name="estimatedTotalResultsCount"  type="xsd:int"/>
+          <xsd:element name="estimateIsExact"             type="xsd:boolean"/>
+          <xsd:element name="resultElements"              type="typens:ResultElementArray"/>
+          <xsd:element name="searchQuery"                 type="xsd:string"/>
+          <xsd:element name="startIndex"                  type="xsd:int"/>
+          <xsd:element name="endIndex"                    type="xsd:int"/>
+          <xsd:element name="searchTips"                  type="xsd:string"/>
+          <xsd:element name="directoryCategories"         type="typens:DirectoryCategoryArray"/>
+          <xsd:element name="searchTime"                  type="xsd:double"/>
+        </xsd:all>
+      </xsd:complexType>
+
+      <xsd:complexType name="ResultElement">
+        <xsd:all>
+          <xsd:element name="summary" type="xsd:string"/>
+          <xsd:element name="URL" type="xsd:string"/>
+          <xsd:element name="snippet" type="xsd:string"/>
+          <xsd:element name="title" type="xsd:string"/>
+          <xsd:element name="cachedSize" type="xsd:string"/>
+          <xsd:element name="relatedInformationPresent" type="xsd:boolean"/>
+          <xsd:element name="hostName" type="xsd:string"/>
+          <xsd:element name="directoryCategory" type="typens:DirectoryCategory"/>
+          <xsd:element name="directoryTitle" type="xsd:string"/>
+        </xsd:all>
+      </xsd:complexType>
+
+      <xsd:complexType name="ResultElementArray">
+        <xsd:complexContent>
+          <xsd:restriction base="soapenc:Array">
+             <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:ResultElement[]"/>
+          </xsd:restriction>
+        </xsd:complexContent>
+      </xsd:complexType>
+
+      <xsd:complexType name="DirectoryCategoryArray">
+        <xsd:complexContent>
+          <xsd:restriction base="soapenc:Array">
+             <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:DirectoryCategory[]"/>
+          </xsd:restriction>
+        </xsd:complexContent>
+      </xsd:complexType>
+
+      <xsd:complexType name="DirectoryCategory">
+        <xsd:all>
+          <xsd:element name="fullViewableName" type="xsd:string"/>
+          <xsd:element name="specialEncoding" type="xsd:string"/>
+        </xsd:all>
+      </xsd:complexType>
+
+    </xsd:schema>
+  </types>
+
+  <!-- Messages for Google Web APIs - cached page, search, spelling. -->
+
+  <message name="doGetCachedPage">
+    <part name="key"            type="xsd:string"/>
+    <part name="url"            type="xsd:string"/>
+  </message>
+
+  <message name="doGetCachedPageResponse">
+    <part name="return"         type="xsd:base64Binary"/>
+  </message>
+
+  <message name="doSpellingSuggestion">
+    <part name="key"            type="xsd:string"/>
+    <part name="phrase"         type="xsd:string"/>
+  </message>
+
+  <message name="doSpellingSuggestionResponse">
+    <part name="return"         type="xsd:string"/>
+  </message>
+
+  <!-- note, ie and oe are ignored by server; all traffic is UTF-8. -->
+
+  <message name="doGoogleSearch">
+    <part name="key"            type="xsd:string"/>
+    <part name="q"              type="xsd:string"/>
+    <part name="start"          type="xsd:int"/>
+    <part name="maxResults"     type="xsd:int"/>
+    <part name="filter"         type="xsd:boolean"/>
+    <part name="restrict"       type="xsd:string"/>
+    <part name="safeSearch"     type="xsd:boolean"/>
+    <part name="lr"             type="xsd:string"/>
+    <part name="ie"             type="xsd:string"/>
+    <part name="oe"             type="xsd:string"/>
+  </message>
+
+  <message name="doGoogleSearchResponse">
+    <part name="return"         type="typens:GoogleSearchResult"/>
+  </message>
+
+  <!-- Port for Google Web APIs, "GoogleSearch" -->
+
+  <portType name="GoogleSearchPort">
+
+    <operation name="doGetCachedPage">
+      <input message="typens:doGetCachedPage"/>
+      <output message="typens:doGetCachedPageResponse"/>
+    </operation>
+
+    <operation name="doSpellingSuggestion">
+      <input message="typens:doSpellingSuggestion"/>
+      <output message="typens:doSpellingSuggestionResponse"/>
+    </operation>
+
+    <operation name="doGoogleSearch">
+      <input message="typens:doGoogleSearch"/>
+      <output message="typens:doGoogleSearchResponse"/>
+    </operation>
+
+  </portType>
+
+
+  <!-- Binding for Google Web APIs - RPC, SOAP over HTTP -->
+
+  <binding name="GoogleSearchBinding" type="typens:GoogleSearchPort">
+    <soap:binding style="rpc"
+                  transport="http://schemas.xmlsoap.org/soap/http"/>
+
+    <operation name="doGetCachedPage">
+      <soap:operation soapAction="urn:GoogleSearchAction"/>
+      <input>
+        <soap:body use="encoded"
+                   namespace="urn:GoogleSearch"
+                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+      </input>
+      <output>
+        <soap:body use="encoded"
+                   namespace="urn:GoogleSearch"
+                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+      </output>
+    </operation>
+
+    <operation name="doSpellingSuggestion">
+      <soap:operation soapAction="urn:GoogleSearchAction"/>
+      <input>
+        <soap:body use="encoded"
+                   namespace="urn:GoogleSearch"
+                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+      </input>
+      <output>
+        <soap:body use="encoded"
+                   namespace="urn:GoogleSearch"
+                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+      </output>
+    </operation>
+
+    <operation name="doGoogleSearch">
+      <soap:operation soapAction="urn:GoogleSearchAction"/>
+      <input>
+        <soap:body use="encoded"
+                   namespace="urn:GoogleSearch"
+                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+      </input>
+      <output>
+        <soap:body use="encoded"
+                   namespace="urn:GoogleSearch"
+                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+      </output>
+    </operation>
+  </binding>
+
+  <!-- Endpoint for Google Web APIs -->
+  <service name="GoogleSearchService">
+    <port name="GoogleSearchPort" binding="typens:GoogleSearchBinding">
+      <soap:address location="http://api.google.com/search/beta2"/>
+    </port>
+  </service>
+
+</definitions>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/MethodCallback.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/MethodCallback.php
new file mode 100644
index 0000000..f8db62e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/MethodCallback.php
@@ -0,0 +1,21 @@
+<?php
+class MethodCallback
+{
+    public static function staticCallback()
+    {
+        $args = func_get_args();
+
+        if ($args == array('foo', 'bar')) {
+            return 'pass';
+        }
+    }
+
+    public function nonStaticCallback()
+    {
+        $args = func_get_args();
+
+        if ($args == array('foo', 'bar')) {
+            return 'pass';
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/MethodCallbackByReference.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/MethodCallbackByReference.php
new file mode 100644
index 0000000..d9d2447
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/MethodCallbackByReference.php
@@ -0,0 +1,11 @@
+<?php
+class MethodCallbackByReference
+{
+    public function bar(&$a, &$b, $c) {
+        Legacy::bar($a, $b, $c);
+    }
+
+    public function callback(&$a, &$b, $c) {
+        $b = 1;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/Mockable.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/Mockable.php
new file mode 100644
index 0000000..a4ccb24
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/Mockable.php
@@ -0,0 +1,28 @@
+<?php
+class Mockable
+{
+    public $constructorArgs;
+    public $cloned;
+
+    public function __construct($arg1 = NULL, $arg2 = NULL)
+    {
+        $this->constructorArgs = array($arg1, $arg2);
+    }
+
+    public function mockableMethod()
+    {
+        // something different from NULL
+        return TRUE;
+    }
+
+    public function anotherMockableMethod()
+    {
+        // something different from NULL
+        return TRUE;
+    }
+
+    public function __clone()
+    {
+        $this->cloned = TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/PartialMockTestClass.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/PartialMockTestClass.php
new file mode 100644
index 0000000..1b119f1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/PartialMockTestClass.php
@@ -0,0 +1,18 @@
+<?php
+class PartialMockTestClass
+{
+    public $constructorCalled = FALSE;
+
+    public function __construct()
+    {
+        $this->constructorCalled = TRUE;
+    }
+
+    public function doSomething()
+    {
+    }
+
+    public function doAnotherThing()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/SomeClass.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/SomeClass.php
new file mode 100644
index 0000000..2cd53b2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/SomeClass.php
@@ -0,0 +1,13 @@
+<?php
+class SomeClass
+{
+    public function doSomething($a, $b)
+    {
+        return NULL;
+    }
+
+    public function doSomethingElse($c)
+    {
+        return NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/StaticMockTestClass.php b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/StaticMockTestClass.php
new file mode 100644
index 0000000..ac467c9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/Tests/_files/StaticMockTestClass.php
@@ -0,0 +1,12 @@
+<?php
+class StaticMockTestClass
+{
+    public static function doSomething()
+    {
+    }
+
+    public static function doSomethingElse()
+    {
+        return static::doSomething();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/build.xml b/core/vendor/phpunit/phpunit-mock-objects/build.xml
new file mode 100644
index 0000000..6eefc40
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/build.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="PHPUnit_MockObject" default="build">
+ <property name="php" value="php"/>
+ <property name="phpunit" value="phpunit"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpunit,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpunit,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="PHPUnit/Framework/MockObject/Autoload.php" />
+   <arg value="--template" />
+   <arg path="PHPUnit/Framework/MockObject/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="            " />
+   <arg path="PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/PHPUnit">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHPUnit" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHPUnit" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHPUnit" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHPUnit" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <condition property="phpunit_cmd" value="${php} ${phpunit}" else="${phpunit}">
+   <not>
+    <equals arg1="${phpunit}" arg2="phpunit" />
+   </not>
+  </condition>
+
+  <exec executable="${phpunit_cmd}" failonerror="true"/>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/PHPUnit" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..bf9d520
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          '}EOLelse if (...) {EOL',
+          '}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/ruleset.xml b/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/build/phpmd.xml b/core/vendor/phpunit/phpunit-mock-objects/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/build/travis-ci.xml b/core/vendor/phpunit/phpunit-mock-objects/build/travis-ci.xml
new file mode 100644
index 0000000..66dad14
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/build/travis-ci.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         colors="true">
+  <php>
+    <const name="PHPUNIT_TESTSUITE" value="true"/>
+  </php>
+
+  <testsuites>
+    <testsuite name="PHPUnit Mock Objects">
+      <directory suffix="Test.php">../Tests</directory>
+      <directory suffix=".phpt">../Tests</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-text" target="php://stdout"/>
+  </logging>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">../PHPUnit</directory>
+      <exclude>
+       <file>../PHPUnit/Framework/MockObject/Autoload.php</file>
+      </exclude>
+    </whitelist>
+  </filter>
+</phpunit>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/composer.json b/core/vendor/phpunit/phpunit-mock-objects/composer.json
new file mode 100644
index 0000000..6789c29
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/composer.json
@@ -0,0 +1,37 @@
+{
+    "name": "phpunit/phpunit-mock-objects",
+    "description": "Mock Object library for PHPUnit",
+    "type": "library",
+    "keywords": [
+        "xunit",
+        "mock"
+    ],
+    "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sb@sebastian-bergmann.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3",
+        "phpunit/php-text-template": ">=1.1.1@stable"
+    },
+    "suggest": {
+        "ext-soap": "*"
+    },
+    "autoload": {
+        "classmap": [
+            "PHPUnit/"
+        ]
+    },
+    "include-path": [
+        ""
+    ]
+}
diff --git a/core/vendor/phpunit/phpunit-mock-objects/package.xml b/core/vendor/phpunit/phpunit-mock-objects/package.xml
new file mode 100644
index 0000000..dfa8129
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/package.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>PHPUnit_MockObject</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>Mock Object library for PHPUnit</summary>
+ <description>Mock Object library for PHPUnit</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sb@sebastian-bergmann.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2013-01-13</date>
+ <version>
+  <release>1.2.3</release>
+  <api>1.2.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/phpunit-mock-objects/blob/master/README.markdown</notes>
+ <contents>
+  <dir name="/">
+   <dir name="PHPUnit">
+    <dir name="Framework">
+     <dir name="MockObject">
+      <dir name="Builder">
+       <file baseinstalldir="/" name="Identity.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="InvocationMocker.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Match.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="MethodNameMatch.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Namespace.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="ParametersMatch.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Stub.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+      </dir>
+      <dir name="Generator">
+       <file baseinstalldir="/" name="mocked_class.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="mocked_clone.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="mocked_object_method.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="mocked_static_method.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="trait_class.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="unmocked_clone.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="wsdl_class.tpl.dist" role="php" />
+       <file baseinstalldir="/" name="wsdl_method.tpl.dist" role="php" />
+      </dir>
+      <dir name="Invocation">
+       <file baseinstalldir="/" name="Object.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Static.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+      </dir>
+      <dir name="Matcher">
+       <file baseinstalldir="/" name="AnyInvokedCount.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="AnyParameters.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Invocation.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="InvokedAtIndex.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="InvokedAtLeastOnce.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="InvokedCount.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="InvokedRecorder.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="MethodName.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Parameters.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="StatelessInvocation.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+      </dir>
+      <dir name="Stub">
+       <file baseinstalldir="/" name="ConsecutiveCalls.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Exception.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="MatcherCollection.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Return.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="ReturnArgument.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="ReturnCallback.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="ReturnSelf.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="ReturnValueMap.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+      </dir>
+      <file baseinstalldir="/" name="Autoload.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Generator.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="InvocationMocker.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Invocation.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Invokable.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Matcher.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="MockBuilder.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="MockObject.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Stub.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Verifiable.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+    </dir>
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.markdown" role="doc"/>
+   <file baseinstalldir="/" name="LICENSE" role="doc"/>
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.4</min>
+   </pearinstaller>
+   <package>
+    <name>Text_Template</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.1.1</min>
+   </package>
+  </required>
+  <optional>
+   <extension>
+    <name>soap</name>
+   </extension>
+  </optional>
+ </dependencies>
+ <phprelease/>
+</package>
diff --git a/core/vendor/phpunit/phpunit-mock-objects/phpunit.xml.dist b/core/vendor/phpunit/phpunit-mock-objects/phpunit.xml.dist
new file mode 100644
index 0000000..0ce22df
--- /dev/null
+++ b/core/vendor/phpunit/phpunit-mock-objects/phpunit.xml.dist
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false">
+  <php>
+    <const name="PHPUNIT_TESTSUITE" value="true"/>
+  </php>
+
+  <testsuites>
+    <testsuite name="PHPUnit Mock Objects">
+      <directory suffix="Test.php">Tests</directory>
+      <directory suffix=".phpt">Tests</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-html" target="build/coverage" title="PHPUnit Mock Objects"
+         charset="UTF-8" yui="true" highlight="true"
+         lowUpperBound="35" highLowerBound="70"/>
+    <log type="coverage-clover" target="build/logs/clover.xml"/>
+    <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
+  </logging>
+
+  <filter>
+    <whitelist addUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">PHPUnit</directory>
+      <exclude>
+       <file>PHPUnit/Framework/MockObject/Autoload.php</file>
+      </exclude>
+    </whitelist>
+  </filter>
+</phpunit>
diff --git a/core/vendor/phpunit/phpunit/.gitattributes b/core/vendor/phpunit/phpunit/.gitattributes
new file mode 100644
index 0000000..461090b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/.gitattributes
@@ -0,0 +1 @@
+*.php diff=php
diff --git a/core/vendor/phpunit/phpunit/LICENSE b/core/vendor/phpunit/phpunit/LICENSE
new file mode 100644
index 0000000..a701552
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/LICENSE
@@ -0,0 +1,33 @@
+PHPUnit
+
+Copyright (c) 2002-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+All rights reserved.
+
+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 Sebastian Bergmann 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
+COPYRIGHT OWNER 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.
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Autoload.php b/core/vendor/phpunit/phpunit/PHPUnit/Autoload.php
new file mode 100644
index 0000000..85eabe7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Autoload.php
@@ -0,0 +1,225 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */
+
+require_once 'File/Iterator/Autoload.php';
+require_once 'PHP/CodeCoverage/Autoload.php';
+require_once 'PHP/Timer/Autoload.php';
+require_once 'PHPUnit/Framework/MockObject/Autoload.php';
+require_once 'Text/Template/Autoload.php';
+
+function phpunit_autoload($class = NULL)
+{
+    static $classes = NULL;
+    static $path    = NULL;
+
+    if ($classes === NULL) {
+        $classes = array(
+          'phpunit_extensions_grouptestsuite' => '/Extensions/GroupTestSuite.php',
+          'phpunit_extensions_phpttestcase' => '/Extensions/PhptTestCase.php',
+          'phpunit_extensions_phpttestcase_logger' => '/Extensions/PhptTestCase/Logger.php',
+          'phpunit_extensions_phpttestsuite' => '/Extensions/PhptTestSuite.php',
+          'phpunit_extensions_repeatedtest' => '/Extensions/RepeatedTest.php',
+          'phpunit_extensions_testdecorator' => '/Extensions/TestDecorator.php',
+          'phpunit_extensions_ticketlistener' => '/Extensions/TicketListener.php',
+          'phpunit_framework_assert' => '/Framework/Assert.php',
+          'phpunit_framework_assertionfailederror' => '/Framework/AssertionFailedError.php',
+          'phpunit_framework_comparator' => '/Framework/Comparator.php',
+          'phpunit_framework_comparator_array' => '/Framework/Comparator/Array.php',
+          'phpunit_framework_comparator_domdocument' => '/Framework/Comparator/DOMDocument.php',
+          'phpunit_framework_comparator_double' => '/Framework/Comparator/Double.php',
+          'phpunit_framework_comparator_exception' => '/Framework/Comparator/Exception.php',
+          'phpunit_framework_comparator_mockobject' => '/Framework/Comparator/MockObject.php',
+          'phpunit_framework_comparator_numeric' => '/Framework/Comparator/Numeric.php',
+          'phpunit_framework_comparator_object' => '/Framework/Comparator/Object.php',
+          'phpunit_framework_comparator_resource' => '/Framework/Comparator/Resource.php',
+          'phpunit_framework_comparator_scalar' => '/Framework/Comparator/Scalar.php',
+          'phpunit_framework_comparator_splobjectstorage' => '/Framework/Comparator/SplObjectStorage.php',
+          'phpunit_framework_comparator_type' => '/Framework/Comparator/Type.php',
+          'phpunit_framework_comparatorfactory' => '/Framework/ComparatorFactory.php',
+          'phpunit_framework_comparisonfailure' => '/Framework/ComparisonFailure.php',
+          'phpunit_framework_constraint' => '/Framework/Constraint.php',
+          'phpunit_framework_constraint_and' => '/Framework/Constraint/And.php',
+          'phpunit_framework_constraint_arrayhaskey' => '/Framework/Constraint/ArrayHasKey.php',
+          'phpunit_framework_constraint_attribute' => '/Framework/Constraint/Attribute.php',
+          'phpunit_framework_constraint_callback' => '/Framework/Constraint/Callback.php',
+          'phpunit_framework_constraint_classhasattribute' => '/Framework/Constraint/ClassHasAttribute.php',
+          'phpunit_framework_constraint_classhasstaticattribute' => '/Framework/Constraint/ClassHasStaticAttribute.php',
+          'phpunit_framework_constraint_composite' => '/Framework/Constraint/Composite.php',
+          'phpunit_framework_constraint_count' => '/Framework/Constraint/Count.php',
+          'phpunit_framework_constraint_exception' => '/Framework/Constraint/Exception.php',
+          'phpunit_framework_constraint_exceptioncode' => '/Framework/Constraint/ExceptionCode.php',
+          'phpunit_framework_constraint_exceptionmessage' => '/Framework/Constraint/ExceptionMessage.php',
+          'phpunit_framework_constraint_fileexists' => '/Framework/Constraint/FileExists.php',
+          'phpunit_framework_constraint_greaterthan' => '/Framework/Constraint/GreaterThan.php',
+          'phpunit_framework_constraint_isanything' => '/Framework/Constraint/IsAnything.php',
+          'phpunit_framework_constraint_isempty' => '/Framework/Constraint/IsEmpty.php',
+          'phpunit_framework_constraint_isequal' => '/Framework/Constraint/IsEqual.php',
+          'phpunit_framework_constraint_isfalse' => '/Framework/Constraint/IsFalse.php',
+          'phpunit_framework_constraint_isidentical' => '/Framework/Constraint/IsIdentical.php',
+          'phpunit_framework_constraint_isinstanceof' => '/Framework/Constraint/IsInstanceOf.php',
+          'phpunit_framework_constraint_isnull' => '/Framework/Constraint/IsNull.php',
+          'phpunit_framework_constraint_istrue' => '/Framework/Constraint/IsTrue.php',
+          'phpunit_framework_constraint_istype' => '/Framework/Constraint/IsType.php',
+          'phpunit_framework_constraint_jsonmatches' => '/Framework/Constraint/JsonMatches.php',
+          'phpunit_framework_constraint_jsonmatches_errormessageprovider' => '/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+          'phpunit_framework_constraint_lessthan' => '/Framework/Constraint/LessThan.php',
+          'phpunit_framework_constraint_not' => '/Framework/Constraint/Not.php',
+          'phpunit_framework_constraint_objecthasattribute' => '/Framework/Constraint/ObjectHasAttribute.php',
+          'phpunit_framework_constraint_or' => '/Framework/Constraint/Or.php',
+          'phpunit_framework_constraint_pcrematch' => '/Framework/Constraint/PCREMatch.php',
+          'phpunit_framework_constraint_samesize' => '/Framework/Constraint/SameSize.php',
+          'phpunit_framework_constraint_stringcontains' => '/Framework/Constraint/StringContains.php',
+          'phpunit_framework_constraint_stringendswith' => '/Framework/Constraint/StringEndsWith.php',
+          'phpunit_framework_constraint_stringmatches' => '/Framework/Constraint/StringMatches.php',
+          'phpunit_framework_constraint_stringstartswith' => '/Framework/Constraint/StringStartsWith.php',
+          'phpunit_framework_constraint_traversablecontains' => '/Framework/Constraint/TraversableContains.php',
+          'phpunit_framework_constraint_traversablecontainsonly' => '/Framework/Constraint/TraversableContainsOnly.php',
+          'phpunit_framework_constraint_xor' => '/Framework/Constraint/Xor.php',
+          'phpunit_framework_error' => '/Framework/Error.php',
+          'phpunit_framework_error_deprecated' => '/Framework/Error/Deprecated.php',
+          'phpunit_framework_error_notice' => '/Framework/Error/Notice.php',
+          'phpunit_framework_error_warning' => '/Framework/Error/Warning.php',
+          'phpunit_framework_exception' => '/Framework/Exception.php',
+          'phpunit_framework_expectationfailedexception' => '/Framework/ExpectationFailedException.php',
+          'phpunit_framework_incompletetest' => '/Framework/IncompleteTest.php',
+          'phpunit_framework_incompletetesterror' => '/Framework/IncompleteTestError.php',
+          'phpunit_framework_outputerror' => '/Framework/OutputError.php',
+          'phpunit_framework_selfdescribing' => '/Framework/SelfDescribing.php',
+          'phpunit_framework_skippedtest' => '/Framework/SkippedTest.php',
+          'phpunit_framework_skippedtesterror' => '/Framework/SkippedTestError.php',
+          'phpunit_framework_skippedtestsuiteerror' => '/Framework/SkippedTestSuiteError.php',
+          'phpunit_framework_syntheticerror' => '/Framework/SyntheticError.php',
+          'phpunit_framework_test' => '/Framework/Test.php',
+          'phpunit_framework_testcase' => '/Framework/TestCase.php',
+          'phpunit_framework_testfailure' => '/Framework/TestFailure.php',
+          'phpunit_framework_testlistener' => '/Framework/TestListener.php',
+          'phpunit_framework_testresult' => '/Framework/TestResult.php',
+          'phpunit_framework_testsuite' => '/Framework/TestSuite.php',
+          'phpunit_framework_testsuite_dataprovider' => '/Framework/TestSuite/DataProvider.php',
+          'phpunit_framework_warning' => '/Framework/Warning.php',
+          'phpunit_runner_basetestrunner' => '/Runner/BaseTestRunner.php',
+          'phpunit_runner_standardtestsuiteloader' => '/Runner/StandardTestSuiteLoader.php',
+          'phpunit_runner_testsuiteloader' => '/Runner/TestSuiteLoader.php',
+          'phpunit_runner_version' => '/Runner/Version.php',
+          'phpunit_textui_command' => '/TextUI/Command.php',
+          'phpunit_textui_resultprinter' => '/TextUI/ResultPrinter.php',
+          'phpunit_textui_testrunner' => '/TextUI/TestRunner.php',
+          'phpunit_util_class' => '/Util/Class.php',
+          'phpunit_util_configuration' => '/Util/Configuration.php',
+          'phpunit_util_deprecatedfeature' => '/Util/DeprecatedFeature.php',
+          'phpunit_util_deprecatedfeature_logger' => '/Util/DeprecatedFeature/Logger.php',
+          'phpunit_util_diff' => '/Util/Diff.php',
+          'phpunit_util_errorhandler' => '/Util/ErrorHandler.php',
+          'phpunit_util_fileloader' => '/Util/Fileloader.php',
+          'phpunit_util_filesystem' => '/Util/Filesystem.php',
+          'phpunit_util_filter' => '/Util/Filter.php',
+          'phpunit_util_getopt' => '/Util/Getopt.php',
+          'phpunit_util_globalstate' => '/Util/GlobalState.php',
+          'phpunit_util_invalidargumenthelper' => '/Util/InvalidArgumentHelper.php',
+          'phpunit_util_log_json' => '/Util/Log/JSON.php',
+          'phpunit_util_log_junit' => '/Util/Log/JUnit.php',
+          'phpunit_util_log_tap' => '/Util/Log/TAP.php',
+          'phpunit_util_php' => '/Util/PHP.php',
+          'phpunit_util_php_default' => '/Util/PHP/Default.php',
+          'phpunit_util_php_windows' => '/Util/PHP/Windows.php',
+          'phpunit_util_printer' => '/Util/Printer.php',
+          'phpunit_util_string' => '/Util/String.php',
+          'phpunit_util_test' => '/Util/Test.php',
+          'phpunit_util_testdox_nameprettifier' => '/Util/TestDox/NamePrettifier.php',
+          'phpunit_util_testdox_resultprinter' => '/Util/TestDox/ResultPrinter.php',
+          'phpunit_util_testdox_resultprinter_html' => '/Util/TestDox/ResultPrinter/HTML.php',
+          'phpunit_util_testdox_resultprinter_text' => '/Util/TestDox/ResultPrinter/Text.php',
+          'phpunit_util_testsuiteiterator' => '/Util/TestSuiteIterator.php',
+          'phpunit_util_type' => '/Util/Type.php',
+          'phpunit_util_xml' => '/Util/XML.php'
+        );
+
+        $path = dirname(__FILE__);
+    }
+
+    if ($class === NULL) {
+        $result = array(__FILE__);
+
+        if (isset($_SERVER['_']) &&
+            strpos($_SERVER['_'], 'phpunit') !== FALSE) {
+            $result[] = $_SERVER['_'];
+        }
+
+        foreach ($classes as $file) {
+            $result[] = $path . $file;
+        }
+
+        return $result;
+    }
+
+    $cn = strtolower($class);
+
+    if (isset($classes[$cn])) {
+        $file = $path . $classes[$cn];
+
+        require $file;
+    }
+}
+
+spl_autoload_register('phpunit_autoload');
+
+if (stream_resolve_include_path('PHP/Invoker/Autoload.php')) {
+    require_once 'PHP/Invoker/Autoload.php';
+}
+
+if (stream_resolve_include_path('PHPUnit/Extensions/Database/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/Database/Autoload.php';
+}
+
+if (stream_resolve_include_path('PHPUnit/Extensions/SeleniumCommon/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/SeleniumCommon/Autoload.php';
+}
+
+else if (stream_resolve_include_path('PHPUnit/Extensions/SeleniumTestCase/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/SeleniumTestCase/Autoload.php';
+}
+
+if (stream_resolve_include_path('PHPUnit/Extensions/Story/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/Story/Autoload.php';
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Autoload.php.in b/core/vendor/phpunit/phpunit/PHPUnit/Autoload.php.in
new file mode 100644
index 0000000..1d89dac
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Autoload.php.in
@@ -0,0 +1,108 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */
+
+require_once 'File/Iterator/Autoload.php';
+require_once 'PHP/CodeCoverage/Autoload.php';
+require_once 'PHP/Timer/Autoload.php';
+require_once 'PHPUnit/Framework/MockObject/Autoload.php';
+require_once 'Text/Template/Autoload.php';
+
+function phpunit_autoload($class = NULL)
+{
+    static $classes = NULL;
+    static $path    = NULL;
+
+    if ($classes === NULL) {
+        $classes = array(
+          ___CLASSLIST___
+        );
+
+        $path = dirname(__FILE__);
+    }
+
+    if ($class === NULL) {
+        $result = array(__FILE__);
+
+        if (isset($_SERVER['_']) &&
+            strpos($_SERVER['_'], 'phpunit') !== FALSE) {
+            $result[] = $_SERVER['_'];
+        }
+
+        foreach ($classes as $file) {
+            $result[] = $path . $file;
+        }
+
+        return $result;
+    }
+
+    $cn = strtolower($class);
+
+    if (isset($classes[$cn])) {
+        $file = $path . $classes[$cn];
+
+        require $file;
+    }
+}
+
+spl_autoload_register('phpunit_autoload');
+
+if (stream_resolve_include_path('PHP/Invoker/Autoload.php')) {
+    require_once 'PHP/Invoker/Autoload.php';
+}
+
+if (stream_resolve_include_path('PHPUnit/Extensions/Database/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/Database/Autoload.php';
+}
+
+if (stream_resolve_include_path('PHPUnit/Extensions/SeleniumCommon/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/SeleniumCommon/Autoload.php';
+}
+
+else if (stream_resolve_include_path('PHPUnit/Extensions/SeleniumTestCase/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/SeleniumTestCase/Autoload.php';
+}
+
+if (stream_resolve_include_path('PHPUnit/Extensions/Story/Autoload.php')) {
+    require_once 'PHPUnit/Extensions/Story/Autoload.php';
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/GroupTestSuite.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/GroupTestSuite.php
new file mode 100644
index 0000000..4fe2f47
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/GroupTestSuite.php
@@ -0,0 +1,100 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * We have a TestSuite object A.
+ * In TestSuite object A we have Tests tagged with @group.
+ * We want a TestSuite object B that contains TestSuite objects C, D, ...
+ * for the Tests tagged with @group C, @group D, ...
+ * Running the Tests from TestSuite object B results in Tests tagged with both
+ * @group C and @group D in TestSuite object A to be run twice .
+ *
+ * <code>
+ * $suite = new PHPUnit_Extensions_GroupTestSuite($A, array('C', 'D'));
+ * </code>
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Extensions_GroupTestSuite extends PHPUnit_Framework_TestSuite
+{
+    public function __construct(PHPUnit_Framework_TestSuite $suite, array $groups)
+    {
+        $groupSuites = array();
+        $name        = $suite->getName();
+
+        foreach ($groups as $group) {
+            $groupSuites[$group] = new PHPUnit_Framework_TestSuite($name . ' - ' . $group);
+            $this->addTest($groupSuites[$group]);
+        }
+
+        $tests = new RecursiveIteratorIterator(
+          new PHPUnit_Util_TestSuiteIterator($suite),
+          RecursiveIteratorIterator::LEAVES_ONLY
+        );
+
+        foreach ($tests as $test) {
+            if ($test instanceof PHPUnit_Framework_TestCase) {
+                $testGroups = PHPUnit_Util_Test::getGroups(
+                  get_class($test), $test->getName(FALSE)
+                );
+
+                foreach ($groups as $group) {
+                    foreach ($testGroups as $testGroup) {
+                        if ($group == $testGroup) {
+                            $groupSuites[$group]->addTest($test);
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestCase.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestCase.php
new file mode 100644
index 0000000..5b07e72
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestCase.php
@@ -0,0 +1,270 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_PhptTestCase
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.4
+ */
+
+if (stream_resolve_include_path('PEAR/RunTest.php')) {
+    $currentErrorReporting = error_reporting(E_ERROR | E_WARNING | E_PARSE);
+    require_once 'PEAR/RunTest.php';
+    error_reporting($currentErrorReporting);
+}
+
+/**
+ * Wrapper to run .phpt test cases.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_PhptTestCase
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.4
+ */
+class PHPUnit_Extensions_PhptTestCase implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * The filename of the .phpt file.
+     *
+     * @var    string
+     */
+    protected $filename;
+
+    /**
+     * Options for PEAR_RunTest.
+     *
+     * @var    array
+     */
+    protected $options = array();
+
+    /**
+     * Constructs a test case with the given filename.
+     *
+     * @param  string $filename
+     * @param  array  $options
+     */
+    public function __construct($filename, array $options = array())
+    {
+        if (!is_string($filename)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_file($filename)) {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'File "%s" does not exist.',
+                $filename
+              )
+            );
+        }
+
+        $this->filename = $filename;
+        $this->options  = $options;
+    }
+
+    /**
+     * Counts the number of test cases executed by run(TestResult result).
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return 1;
+    }
+
+    /**
+     * Runs a test and collects its result in a TestResult instance.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     * @param  array                        $options
+     * @return PHPUnit_Framework_TestResult
+     */
+    public function run(PHPUnit_Framework_TestResult $result = NULL, array $options = array())
+    {
+        if (!class_exists('PEAR_RunTest', FALSE)) {
+            throw new PHPUnit_Framework_Exception('Class PEAR_RunTest not found.');
+        }
+
+        if (isset($GLOBALS['_PEAR_destructor_object_list']) &&
+            is_array($GLOBALS['_PEAR_destructor_object_list']) &&
+            !empty($GLOBALS['_PEAR_destructor_object_list'])) {
+            $pearDestructorObjectListCount = count($GLOBALS['_PEAR_destructor_object_list']);
+        } else {
+            $pearDestructorObjectListCount = 0;
+        }
+
+        if ($result === NULL) {
+            $result = new PHPUnit_Framework_TestResult;
+        }
+
+        $coverage = $result->getCollectCodeCoverageInformation();
+        $options  = array_merge($options, $this->options);
+
+        if (!isset($options['include_path'])) {
+            $options['include_path'] = get_include_path();
+        }
+
+        if ($coverage) {
+            $options['coverage'] = TRUE;
+        } else {
+            $options['coverage'] = FALSE;
+        }
+
+        $currentErrorReporting = error_reporting(E_ERROR | E_WARNING | E_PARSE);
+        $runner                = new PEAR_RunTest(new PHPUnit_Extensions_PhptTestCase_Logger, $options);
+
+        if ($coverage) {
+            $runner->xdebug_loaded = TRUE;
+        } else {
+            $runner->xdebug_loaded = FALSE;
+        }
+
+        $result->startTest($this);
+
+        PHP_Timer::start();
+
+        $buffer = $runner->run($this->filename, $options);
+        $time   = PHP_Timer::stop();
+
+        error_reporting($currentErrorReporting);
+
+        $base         = basename($this->filename);
+        $path         = dirname($this->filename);
+        $coverageFile = $path . DIRECTORY_SEPARATOR . str_replace(
+                          '.phpt', '.xdebug', $base
+                        );
+        $diffFile     = $path . DIRECTORY_SEPARATOR . str_replace(
+                          '.phpt', '.diff', $base
+                        );
+        $expFile      = $path . DIRECTORY_SEPARATOR . str_replace(
+                          '.phpt', '.exp', $base
+                        );
+        $logFile      = $path . DIRECTORY_SEPARATOR . str_replace(
+                          '.phpt', '.log', $base
+                        );
+        $outFile      = $path . DIRECTORY_SEPARATOR . str_replace(
+                          '.phpt', '.out', $base
+                        );
+        $phpFile      = $path . DIRECTORY_SEPARATOR . str_replace(
+                          '.phpt', '.php', $base
+                        );
+
+        if (is_object($buffer) && $buffer instanceof PEAR_Error) {
+            $result->addError(
+              $this,
+              new PHPUnit_Framework_Exception($buffer->getMessage()),
+              $time
+            );
+        }
+
+        else if ($buffer == 'SKIPPED') {
+            $result->addFailure($this, new PHPUnit_Framework_SkippedTestError, 0);
+        }
+
+        else if ($buffer != 'PASSED') {
+            $expContent = file_get_contents($expFile);
+            $outContent = file_get_contents($outFile);
+
+            $result->addFailure(
+              $this,
+              new PHPUnit_Framework_ComparisonFailure(
+                $expContent,
+                $outContent,
+                $expContent,
+                $outContent
+              ),
+              $time
+            );
+        }
+
+        foreach (array($diffFile, $expFile, $logFile, $phpFile, $outFile) as $file) {
+            if (file_exists($file)) {
+                unlink($file);
+            }
+        }
+
+        if ($coverage && file_exists($coverageFile)) {
+            eval('$coverageData = ' . file_get_contents($coverageFile) . ';');
+            unset($coverageData[$phpFile]);
+
+            $result->getCodeCoverage()->append($coverageData, $this);
+            unlink($coverageFile);
+        }
+
+        $result->endTest($this, $time);
+
+        // Do not invoke PEAR's destructor mechanism for PHP 4
+        // as it raises an E_STRICT.
+        if ($pearDestructorObjectListCount == 0) {
+            unset($GLOBALS['_PEAR_destructor_object_list']);
+        } else {
+            $count = count($GLOBALS['_PEAR_destructor_object_list']) - $pearDestructorObjectListCount;
+
+            for ($i = 0; $i < $count; $i++) {
+                array_pop($GLOBALS['_PEAR_destructor_object_list']);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the name of the test case.
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->toString();
+    }
+
+    /**
+     * Returns a string representation of the test case.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->filename;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestCase/Logger.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestCase/Logger.php
new file mode 100644
index 0000000..1f19221
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestCase/Logger.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_PhptTestCase
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.4
+ */
+
+/**
+ * Dummy logger for PEAR_RunTest.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_PhptTestCase
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.4
+ */
+class PHPUnit_Extensions_PhptTestCase_Logger
+{
+    public function log($level, $msg, $append_crlf = TRUE)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestSuite.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestSuite.php
new file mode 100644
index 0000000..ab8eb49
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/PhptTestSuite.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_PhptTestCase
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.4
+ */
+
+/**
+ * Suite for .phpt test cases.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_PhptTestCase
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.4
+ */
+class PHPUnit_Extensions_PhptTestSuite extends PHPUnit_Framework_TestSuite
+{
+    /**
+     * Constructs a new TestSuite for .phpt test cases.
+     *
+     * @param  string $directory
+     * @param  array  $options Array with ini settings for the php instance run,
+     *                         key being the name if the setting, value the ini value.
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function __construct($directory, array $options = array())
+    {
+        if (is_string($directory) && is_dir($directory)) {
+            $this->setName($directory);
+
+            $facade = new File_Iterator_Facade;
+            $files  = $facade->getFilesAsArray($directory, '.phpt');
+
+            foreach ($files as $file) {
+                $this->addTestFile($file, $options);
+            }
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'directory name');
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/RepeatedTest.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/RepeatedTest.php
new file mode 100644
index 0000000..be8cf83
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/RepeatedTest.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A Decorator that runs a test repeatedly.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Extensions_RepeatedTest extends PHPUnit_Extensions_TestDecorator
+{
+    /**
+     * @var mixed
+     */
+    protected $filter = FALSE;
+
+    /**
+     * @var array
+     */
+    protected $groups = array();
+
+    /**
+     * @var array
+     */
+    protected $excludeGroups = array();
+
+    /**
+     * @var boolean
+     */
+    protected $processIsolation = FALSE;
+
+    /**
+     * @var integer
+     */
+    protected $timesRepeat = 1;
+
+    /**
+     * Constructor.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  integer                $timesRepeat
+     * @param  mixed                  $filter
+     * @param  array                  $groups
+     * @param  array                  $excludeGroups
+     * @param  boolean                $processIsolation
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function __construct(PHPUnit_Framework_Test $test, $timesRepeat = 1, $filter = FALSE, array $groups = array(), array $excludeGroups = array(), $processIsolation = FALSE)
+    {
+        parent::__construct($test);
+
+        if (is_integer($timesRepeat) &&
+            $timesRepeat >= 0) {
+            $this->timesRepeat = $timesRepeat;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              2, 'positive integer'
+            );
+        }
+
+        $this->filter           = $filter;
+        $this->groups           = $groups;
+        $this->excludeGroups    = $excludeGroups;
+        $this->processIsolation = $processIsolation;
+    }
+
+    /**
+     * Counts the number of test cases that
+     * will be run by this test.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return $this->timesRepeat * count($this->test);
+    }
+
+    /**
+     * Runs the decorated test and collects the
+     * result in a TestResult.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     * @return PHPUnit_Framework_TestResult
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function run(PHPUnit_Framework_TestResult $result = NULL)
+    {
+        if ($result === NULL) {
+            $result = $this->createResult();
+        }
+
+        //@codingStandardsIgnoreStart
+        for ($i = 0; $i < $this->timesRepeat && !$result->shouldStop(); $i++) {
+            //@codingStandardsIgnoreEnd
+            if ($this->test instanceof PHPUnit_Framework_TestSuite) {
+                $this->test->run(
+                  $result,
+                  $this->filter,
+                  $this->groups,
+                  $this->excludeGroups,
+                  $this->processIsolation
+                );
+            } else {
+                $this->test->run($result);
+            }
+        }
+
+        return $result;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/TestDecorator.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/TestDecorator.php
new file mode 100644
index 0000000..ea7ba41
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/TestDecorator.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A Decorator for Tests.
+ *
+ * Use TestDecorator as the base class for defining new
+ * test decorators. Test decorator subclasses can be introduced
+ * to add behaviour before or after a test is run.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Extensions_TestDecorator extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * The Test to be decorated.
+     *
+     * @var    object
+     */
+    protected $test = NULL;
+
+    /**
+     * Constructor.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function __construct(PHPUnit_Framework_Test $test)
+    {
+        $this->test = $test;
+    }
+
+    /**
+     * Returns a string representation of the test.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->test->toString();
+    }
+
+    /**
+     * Runs the test and collects the
+     * result in a TestResult.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     */
+    public function basicRun(PHPUnit_Framework_TestResult $result)
+    {
+        $this->test->run($result);
+    }
+
+    /**
+     * Counts the number of test cases that
+     * will be run by this test.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return count($this->test);
+    }
+
+    /**
+     * Creates a default TestResult object.
+     *
+     * @return PHPUnit_Framework_TestResult
+     */
+    protected function createResult()
+    {
+        return new PHPUnit_Framework_TestResult;
+    }
+
+    /**
+     * Returns the test to be run.
+     *
+     * @return PHPUnit_Framework_Test
+     */
+    public function getTest()
+    {
+        return $this->test;
+    }
+
+    /**
+     * Runs the decorated test and collects the
+     * result in a TestResult.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     * @return PHPUnit_Framework_TestResult
+     */
+    public function run(PHPUnit_Framework_TestResult $result = NULL)
+    {
+        if ($result === NULL) {
+            $result = $this->createResult();
+        }
+
+        $this->basicRun($result);
+
+        return $result;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Extensions/TicketListener.php b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/TicketListener.php
new file mode 100644
index 0000000..1c6d15b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Extensions/TicketListener.php
@@ -0,0 +1,225 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_TicketListener
+ * @author     Sean Coates <sean@caedmon.net>
+ * @author     Raphael Stolt <raphael.stolt@gmail.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Base class for test listeners that interact with an issue tracker.
+ *
+ * @package    PHPUnit
+ * @subpackage Extensions_TicketListener
+ * @author     Sean Coates <sean@caedmon.net>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+abstract class PHPUnit_Extensions_TicketListener implements PHPUnit_Framework_TestListener
+{
+    /**
+     * @var array
+     */
+    protected $ticketCounts = array();
+
+    /**
+     * @var boolean
+     */
+    protected $ran = FALSE;
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+    }
+
+    /**
+     * A test suite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A test suite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        if (!$test instanceof PHPUnit_Framework_Warning) {
+            if ($this->ran) {
+                return;
+            }
+
+            $name    = $test->getName(FALSE);
+            $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name);
+
+            foreach ($tickets as $ticket) {
+                $this->ticketCounts[$ticket][$name] = 1;
+            }
+
+            $this->ran = TRUE;
+        }
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if (!$test instanceof PHPUnit_Framework_Warning) {
+            if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
+                $ifStatus   = array('assigned', 'new', 'reopened');
+                $newStatus  = 'closed';
+                $message    = 'Automatically closed by PHPUnit (test passed).';
+                $resolution = 'fixed';
+                $cumulative = TRUE;
+            }
+
+            else if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
+                $ifStatus   = array('closed');
+                $newStatus  = 'reopened';
+                $message    = 'Automatically reopened by PHPUnit (test failed).';
+                $resolution = '';
+                $cumulative = FALSE;
+            }
+
+            else {
+                return;
+            }
+
+            $name    = $test->getName(FALSE);
+            $tickets = PHPUnit_Util_Test::getTickets(get_class($test), $name);
+
+            foreach ($tickets as $ticket) {
+                // Remove this test from the totals (if it passed).
+                if ($test->getStatus() == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
+                    unset($this->ticketCounts[$ticket][$name]);
+                }
+
+                // Only close tickets if ALL referenced cases pass
+                // but reopen tickets if a single test fails.
+                if ($cumulative) {
+                    // Determine number of to-pass tests:
+                    if (count($this->ticketCounts[$ticket]) > 0) {
+                        // There exist remaining test cases with this reference.
+                        $adjustTicket = FALSE;
+                    } else {
+                        // No remaining tickets, go ahead and adjust.
+                        $adjustTicket = TRUE;
+                    }
+                } else {
+                    $adjustTicket = TRUE;
+                }
+
+                $ticketInfo = $this->getTicketInfo($ticket);
+
+                if ($adjustTicket && in_array($ticketInfo['status'], $ifStatus)) {
+                    $this->updateTicket($ticket, $newStatus, $message, $resolution);
+                }
+            }
+        }
+    }
+
+    abstract protected function getTicketInfo($ticketId = NULL);
+    abstract protected function updateTicket($ticketId, $newStatus, $message, $resolution);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert.php
new file mode 100644
index 0000000..d558505
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert.php
@@ -0,0 +1,2833 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A set of assert methods.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+abstract class PHPUnit_Framework_Assert
+{
+    /**
+     * @var integer
+     */
+    private static $count = 0;
+
+    /**
+     * Asserts that an array has a specified key.
+     *
+     * @param  mixed  $key
+     * @param  array|ArrayAccess  $array
+     * @param  string $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertArrayHasKey($key, $array, $message = '')
+    {
+        if (!(is_integer($key) || is_string($key))) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'integer or string'
+            );
+        }
+        if (!(is_array($array) || $array instanceof ArrayAccess)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'array or ArrayAccess'
+            );
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_ArrayHasKey($key);
+
+        self::assertThat($array, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an array does not have a specified key.
+     *
+     * @param  mixed  $key
+     * @param  array|ArrayAccess  $array
+     * @param  string $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertArrayNotHasKey($key, $array, $message = '')
+    {
+        if (!(is_integer($key) || is_string($key))) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'integer or string'
+            );
+        }
+        if (!(is_array($array) || $array instanceof ArrayAccess)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'array or ArrayAccess'
+            );
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_ArrayHasKey($key)
+        );
+
+        self::assertThat($array, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a haystack contains a needle.
+     *
+     * @param  mixed   $needle
+     * @param  mixed   $haystack
+     * @param  string  $message
+     * @param  boolean $ignoreCase
+     * @param  boolean $checkForObjectIdentity
+     * @since  Method available since Release 2.1.0
+     */
+    public static function assertContains($needle, $haystack, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+    {
+        if (is_array($haystack) ||
+            is_object($haystack) && $haystack instanceof Traversable) {
+            $constraint = new PHPUnit_Framework_Constraint_TraversableContains(
+              $needle, $checkForObjectIdentity
+            );
+        }
+
+        else if (is_string($haystack)) {
+            $constraint = new PHPUnit_Framework_Constraint_StringContains(
+              $needle, $ignoreCase
+            );
+        }
+
+        else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              2, 'array, iterator or string'
+            );
+        }
+
+        self::assertThat($haystack, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a haystack that is stored in a static attribute of a class
+     * or an attribute of an object contains a needle.
+     *
+     * @param  mixed   $needle
+     * @param  string  $haystackAttributeName
+     * @param  mixed   $haystackClassOrObject
+     * @param  string  $message
+     * @param  boolean $ignoreCase
+     * @param  boolean $checkForObjectIdentity
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+    {
+        self::assertContains(
+          $needle,
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $message,
+          $ignoreCase,
+          $checkForObjectIdentity
+        );
+    }
+
+    /**
+     * Asserts that a haystack does not contain a needle.
+     *
+     * @param  mixed   $needle
+     * @param  mixed   $haystack
+     * @param  string  $message
+     * @param  boolean $ignoreCase
+     * @param  boolean $checkForObjectIdentity
+     * @since  Method available since Release 2.1.0
+     */
+    public static function assertNotContains($needle, $haystack, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+    {
+        if (is_array($haystack) ||
+            is_object($haystack) && $haystack instanceof Traversable) {
+            $constraint = new PHPUnit_Framework_Constraint_Not(
+              new PHPUnit_Framework_Constraint_TraversableContains(
+                $needle, $checkForObjectIdentity
+              )
+            );
+        }
+
+        else if (is_string($haystack)) {
+            $constraint = new PHPUnit_Framework_Constraint_Not(
+              new PHPUnit_Framework_Constraint_StringContains(
+                $needle, $ignoreCase
+              )
+            );
+        }
+
+        else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              2, 'array, iterator or string'
+            );
+        }
+
+        self::assertThat($haystack, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a haystack that is stored in a static attribute of a class
+     * or an attribute of an object does not contain a needle.
+     *
+     * @param  mixed   $needle
+     * @param  string  $haystackAttributeName
+     * @param  mixed   $haystackClassOrObject
+     * @param  string  $message
+     * @param  boolean $ignoreCase
+     * @param  boolean $checkForObjectIdentity
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+    {
+        self::assertNotContains(
+          $needle,
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $message,
+          $ignoreCase,
+          $checkForObjectIdentity
+        );
+    }
+
+    /**
+     * Asserts that a haystack contains only values of a given type.
+     *
+     * @param  string  $type
+     * @param  mixed   $haystack
+     * @param  boolean $isNativeType
+     * @param  string  $message
+     * @since  Method available since Release 3.1.4
+     */
+    public static function assertContainsOnly($type, $haystack, $isNativeType = NULL, $message = '')
+    {
+        if (!(is_array($haystack) ||
+            is_object($haystack) && $haystack instanceof Traversable)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              2, 'array or iterator'
+            );
+        }
+
+        if ($isNativeType == NULL) {
+            $isNativeType = PHPUnit_Util_Type::isType($type);
+        }
+
+        self::assertThat(
+          $haystack,
+          new PHPUnit_Framework_Constraint_TraversableContainsOnly(
+            $type, $isNativeType
+          ),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a haystack contains only instances of a given classname
+     *
+     * @param string $classname
+     * @param array|Traversable $haystack
+     * @param string $message
+     */
+    public static function assertContainsOnlyInstancesOf($classname, $haystack, $message = '')
+    {
+        if (!(is_array($haystack) ||
+            is_object($haystack) && $haystack instanceof Traversable)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              2, 'array or iterator'
+            );
+        }
+
+        self::assertThat(
+            $haystack,
+            new PHPUnit_Framework_Constraint_TraversableContainsOnly(
+                $classname, FALSE
+            ),
+            $message
+        );
+    }
+
+    /**
+     * Asserts that a haystack that is stored in a static attribute of a class
+     * or an attribute of an object contains only values of a given type.
+     *
+     * @param  string  $type
+     * @param  string  $haystackAttributeName
+     * @param  mixed   $haystackClassOrObject
+     * @param  boolean $isNativeType
+     * @param  string  $message
+     * @since  Method available since Release 3.1.4
+     */
+    public static function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = NULL, $message = '')
+    {
+        self::assertContainsOnly(
+          $type,
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $isNativeType,
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a haystack does not contain only values of a given type.
+     *
+     * @param  string  $type
+     * @param  mixed   $haystack
+     * @param  boolean $isNativeType
+     * @param  string  $message
+     * @since  Method available since Release 3.1.4
+     */
+    public static function assertNotContainsOnly($type, $haystack, $isNativeType = NULL, $message = '')
+    {
+        if (!(is_array($haystack) ||
+            is_object($haystack) && $haystack instanceof Traversable)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              2, 'array or iterator'
+            );
+        }
+
+        if ($isNativeType == NULL) {
+            $isNativeType = PHPUnit_Util_Type::isType($type);
+        }
+
+        self::assertThat(
+          $haystack,
+          new PHPUnit_Framework_Constraint_Not(
+            new PHPUnit_Framework_Constraint_TraversableContainsOnly(
+              $type, $isNativeType
+            )
+          ),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a haystack that is stored in a static attribute of a class
+     * or an attribute of an object does not contain only values of a given
+     * type.
+     *
+     * @param  string  $type
+     * @param  string  $haystackAttributeName
+     * @param  mixed   $haystackClassOrObject
+     * @param  boolean $isNativeType
+     * @param  string  $message
+     * @since  Method available since Release 3.1.4
+     */
+    public static function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = NULL, $message = '')
+    {
+        self::assertNotContainsOnly(
+          $type,
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $isNativeType,
+          $message
+        );
+    }
+
+    /**
+     * Asserts the number of elements of an array, Countable or Iterator.
+     *
+     * @param integer $expectedCount
+     * @param mixed   $haystack
+     * @param string  $message
+     */
+    public static function assertCount($expectedCount, $haystack, $message = '')
+    {
+        if (!is_int($expectedCount)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+        }
+
+        if (!$haystack instanceof Countable &&
+            !$haystack instanceof Iterator &&
+            !is_array($haystack)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable');
+        }
+
+        self::assertThat(
+          $haystack,
+          new PHPUnit_Framework_Constraint_Count($expectedCount),
+          $message
+        );
+    }
+
+    /**
+     * Asserts the number of elements of an array, Countable or Iterator
+     * that is stored in an attribute.
+     *
+     * @param integer $expectedCount
+     * @param string  $haystackAttributeName
+     * @param mixed   $haystackClassOrObject
+     * @param string  $message
+     * @since Method available since Release 3.6.0
+     */
+    public static function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
+    {
+        self::assertCount(
+          $expectedCount,
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts the number of elements of an array, Countable or Iterator.
+     *
+     * @param integer $expectedCount
+     * @param mixed   $haystack
+     * @param string  $message
+     */
+    public static function assertNotCount($expectedCount, $haystack, $message = '')
+    {
+        if (!is_int($expectedCount)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+        }
+
+        if (!$haystack instanceof Countable &&
+            !$haystack instanceof Iterator &&
+            !is_array($haystack)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_Count($expectedCount)
+        );
+
+        self::assertThat($haystack, $constraint, $message);
+    }
+
+    /**
+     * Asserts the number of elements of an array, Countable or Iterator
+     * that is stored in an attribute.
+     *
+     * @param integer $expectedCount
+     * @param string  $haystackAttributeName
+     * @param mixed   $haystackClassOrObject
+     * @param string  $message
+     * @since Method available since Release 3.6.0
+     */
+    public static function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
+    {
+        self::assertNotCount(
+          $expectedCount,
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that two variables are equal.
+     *
+     * @param  mixed   $expected
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @param  float   $delta
+     * @param  integer $maxDepth
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     */
+    public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        $constraint = new PHPUnit_Framework_Constraint_IsEqual(
+          $expected, $delta, $maxDepth, $canonicalize, $ignoreCase
+        );
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a variable is equal to an attribute of an object.
+     *
+     * @param  mixed   $expected
+     * @param  string  $actualAttributeName
+     * @param  string  $actualClassOrObject
+     * @param  string  $message
+     * @param  float   $delta
+     * @param  integer $maxDepth
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     */
+    public static function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        self::assertEquals(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message,
+          $delta,
+          $maxDepth,
+          $canonicalize,
+          $ignoreCase
+        );
+    }
+
+    /**
+     * Asserts that two variables are not equal.
+     *
+     * @param  mixed   $expected
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @param  float   $delta
+     * @param  integer $maxDepth
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @since  Method available since Release 2.3.0
+     */
+    public static function assertNotEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_IsEqual(
+            $expected, $delta, $maxDepth, $canonicalize, $ignoreCase
+          )
+        );
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a variable is not equal to an attribute of an object.
+     *
+     * @param  mixed   $expected
+     * @param  string  $actualAttributeName
+     * @param  string  $actualClassOrObject
+     * @param  string  $message
+     * @param  float   $delta
+     * @param  integer $maxDepth
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     */
+    public static function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        self::assertNotEquals(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message,
+          $delta,
+          $maxDepth,
+          $canonicalize,
+          $ignoreCase
+        );
+    }
+
+    /**
+     * Asserts that a variable is empty.
+     *
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @throws PHPUnit_Framework_AssertionFailedError
+     */
+    public static function assertEmpty($actual, $message = '')
+    {
+        self::assertThat($actual, self::isEmpty(), $message);
+    }
+
+    /**
+     * Asserts that a static attribute of a class or an attribute of an object
+     * is empty.
+     *
+     * @param string $haystackAttributeName
+     * @param mixed  $haystackClassOrObject
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
+    {
+        self::assertEmpty(
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a variable is not empty.
+     *
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @throws PHPUnit_Framework_AssertionFailedError
+     */
+    public static function assertNotEmpty($actual, $message = '')
+    {
+        self::assertThat($actual, self::logicalNot(self::isEmpty()), $message);
+    }
+
+    /**
+     * Asserts that a static attribute of a class or an attribute of an object
+     * is not empty.
+     *
+     * @param string $haystackAttributeName
+     * @param mixed  $haystackClassOrObject
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
+    {
+        self::assertNotEmpty(
+          self::readAttribute($haystackClassOrObject, $haystackAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a value is greater than another value.
+     *
+     * @param  mixed   $expected
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertGreaterThan($expected, $actual, $message = '')
+    {
+        self::assertThat($actual, self::greaterThan($expected), $message);
+    }
+
+    /**
+     * Asserts that an attribute is greater than another value.
+     *
+     * @param  mixed   $expected
+     * @param  string  $actualAttributeName
+     * @param  string  $actualClassOrObject
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+    {
+        self::assertGreaterThan(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a value is greater than or equal to another value.
+     *
+     * @param  mixed   $expected
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertGreaterThanOrEqual($expected, $actual, $message = '')
+    {
+        self::assertThat(
+          $actual, self::greaterThanOrEqual($expected), $message
+        );
+    }
+
+    /**
+     * Asserts that an attribute is greater than or equal to another value.
+     *
+     * @param  mixed   $expected
+     * @param  string  $actualAttributeName
+     * @param  string  $actualClassOrObject
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+    {
+        self::assertGreaterThanOrEqual(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a value is smaller than another value.
+     *
+     * @param  mixed   $expected
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertLessThan($expected, $actual, $message = '')
+    {
+        self::assertThat($actual, self::lessThan($expected), $message);
+    }
+
+    /**
+     * Asserts that an attribute is smaller than another value.
+     *
+     * @param  mixed   $expected
+     * @param  string  $actualAttributeName
+     * @param  string  $actualClassOrObject
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+    {
+        self::assertLessThan(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a value is smaller than or equal to another value.
+     *
+     * @param  mixed   $expected
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertLessThanOrEqual($expected, $actual, $message = '')
+    {
+        self::assertThat($actual, self::lessThanOrEqual($expected), $message);
+    }
+
+    /**
+     * Asserts that an attribute is smaller than or equal to another value.
+     *
+     * @param  mixed   $expected
+     * @param  string  $actualAttributeName
+     * @param  string  $actualClassOrObject
+     * @param  string  $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+    {
+        self::assertLessThanOrEqual(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that the contents of one file is equal to the contents of another
+     * file.
+     *
+     * @param  string  $expected
+     * @param  string  $actual
+     * @param  string  $message
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @since  Method available since Release 3.2.14
+     */
+    public static function assertFileEquals($expected, $actual, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        self::assertFileExists($expected, $message);
+        self::assertFileExists($actual, $message);
+
+        self::assertEquals(
+          file_get_contents($expected),
+          file_get_contents($actual),
+          $message,
+          0,
+          10,
+          $canonicalize,
+          $ignoreCase
+        );
+    }
+
+    /**
+     * Asserts that the contents of one file is not equal to the contents of
+     * another file.
+     *
+     * @param  string  $expected
+     * @param  string  $actual
+     * @param  string  $message
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @since  Method available since Release 3.2.14
+     */
+    public static function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        self::assertFileExists($expected, $message);
+        self::assertFileExists($actual, $message);
+
+        self::assertNotEquals(
+          file_get_contents($expected),
+          file_get_contents($actual),
+          $message,
+          0,
+          10,
+          $canonicalize,
+          $ignoreCase
+        );
+    }
+
+    /**
+     * Asserts that the contents of a string is equal
+     * to the contents of a file.
+     *
+     * @param  string  $expectedFile
+     * @param  string  $actualString
+     * @param  string  $message
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @since  Method available since Release 3.3.0
+     */
+    public static function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        self::assertFileExists($expectedFile, $message);
+
+        self::assertEquals(
+          file_get_contents($expectedFile),
+          $actualString,
+          $message,
+          0,
+          10,
+          $canonicalize,
+          $ignoreCase
+        );
+    }
+
+    /**
+     * Asserts that the contents of a string is not equal
+     * to the contents of a file.
+     *
+     * @param  string  $expectedFile
+     * @param  string  $actualString
+     * @param  string  $message
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @since  Method available since Release 3.3.0
+     */
+    public static function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        self::assertFileExists($expectedFile, $message);
+
+        self::assertNotEquals(
+          file_get_contents($expectedFile),
+          $actualString,
+          $message,
+          0,
+          10,
+          $canonicalize,
+          $ignoreCase
+        );
+    }
+
+    /**
+     * Asserts that a file exists.
+     *
+     * @param  string $filename
+     * @param  string $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertFileExists($filename, $message = '')
+    {
+        if (!is_string($filename)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_FileExists;
+
+        self::assertThat($filename, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a file does not exist.
+     *
+     * @param  string $filename
+     * @param  string $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertFileNotExists($filename, $message = '')
+    {
+        if (!is_string($filename)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_FileExists
+        );
+
+        self::assertThat($filename, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a condition is true.
+     *
+     * @param  boolean $condition
+     * @param  string  $message
+     * @throws PHPUnit_Framework_AssertionFailedError
+     */
+    public static function assertTrue($condition, $message = '')
+    {
+        self::assertThat($condition, self::isTrue(), $message);
+    }
+
+    /**
+     * Asserts that a condition is false.
+     *
+     * @param  boolean  $condition
+     * @param  string   $message
+     * @throws PHPUnit_Framework_AssertionFailedError
+     */
+    public static function assertFalse($condition, $message = '')
+    {
+        self::assertThat($condition, self::isFalse(), $message);
+    }
+
+    /**
+     * Asserts that a variable is not NULL.
+     *
+     * @param  mixed  $actual
+     * @param  string $message
+     */
+    public static function assertNotNull($actual, $message = '')
+    {
+        self::assertThat($actual, self::logicalNot(self::isNull()), $message);
+    }
+
+    /**
+     * Asserts that a variable is NULL.
+     *
+     * @param  mixed  $actual
+     * @param  string $message
+     */
+    public static function assertNull($actual, $message = '')
+    {
+        self::assertThat($actual, self::isNull(), $message);
+    }
+
+    /**
+     * Asserts that a class has a specified attribute.
+     *
+     * @param  string $attributeName
+     * @param  string $className
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertClassHasAttribute($attributeName, $className, $message = '')
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($className) || !class_exists($className, FALSE)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_ClassHasAttribute(
+          $attributeName
+        );
+
+        self::assertThat($className, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a class does not have a specified attribute.
+     *
+     * @param  string $attributeName
+     * @param  string $className
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertClassNotHasAttribute($attributeName, $className, $message = '')
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($className) || !class_exists($className, FALSE)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_ClassHasAttribute($attributeName)
+        );
+
+        self::assertThat($className, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a class has a specified static attribute.
+     *
+     * @param  string $attributeName
+     * @param  string $className
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertClassHasStaticAttribute($attributeName, $className, $message = '')
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($className) || !class_exists($className, FALSE)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
+          $attributeName
+        );
+
+        self::assertThat($className, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a class does not have a specified static attribute.
+     *
+     * @param  string $attributeName
+     * @param  string $className
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertClassNotHasStaticAttribute($attributeName, $className, $message = '')
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($className) || !class_exists($className, FALSE)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'class name');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
+            $attributeName
+          )
+        );
+
+        self::assertThat($className, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an object has a specified attribute.
+     *
+     * @param  string $attributeName
+     * @param  object $object
+     * @param  string $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertObjectHasAttribute($attributeName, $object, $message = '')
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_object($object)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_ObjectHasAttribute(
+          $attributeName
+        );
+
+        self::assertThat($object, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an object does not have a specified attribute.
+     *
+     * @param  string $attributeName
+     * @param  object $object
+     * @param  string $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertObjectNotHasAttribute($attributeName, $object, $message = '')
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_object($object)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'object');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_ObjectHasAttribute($attributeName)
+        );
+
+        self::assertThat($object, $constraint, $message);
+    }
+
+    /**
+     * Asserts that two variables have the same type and value.
+     * Used on objects, it asserts that two variables reference
+     * the same object.
+     *
+     * @param  mixed  $expected
+     * @param  mixed  $actual
+     * @param  string $message
+     */
+    public static function assertSame($expected, $actual, $message = '')
+    {
+        if (is_bool($expected) && is_bool($actual)) {
+            self::assertEquals($expected, $actual, $message);
+        } else {
+            $constraint = new PHPUnit_Framework_Constraint_IsIdentical(
+              $expected
+            );
+
+            self::assertThat($actual, $constraint, $message);
+        }
+    }
+
+    /**
+     * Asserts that a variable and an attribute of an object have the same type
+     * and value.
+     *
+     * @param  mixed  $expected
+     * @param  string $actualAttributeName
+     * @param  object $actualClassOrObject
+     * @param  string $message
+     */
+    public static function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+    {
+        self::assertSame(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that two variables do not have the same type and value.
+     * Used on objects, it asserts that two variables do not reference
+     * the same object.
+     *
+     * @param  mixed  $expected
+     * @param  mixed  $actual
+     * @param  string $message
+     */
+    public static function assertNotSame($expected, $actual, $message = '')
+    {
+        if (is_bool($expected) && is_bool($actual)) {
+            self::assertNotEquals($expected, $actual, $message);
+        } else {
+            $constraint = new PHPUnit_Framework_Constraint_Not(
+              new PHPUnit_Framework_Constraint_IsIdentical($expected)
+            );
+
+            self::assertThat($actual, $constraint, $message);
+        }
+    }
+
+    /**
+     * Asserts that a variable and an attribute of an object do not have the
+     * same type and value.
+     *
+     * @param  mixed  $expected
+     * @param  string $actualAttributeName
+     * @param  object $actualClassOrObject
+     * @param  string $message
+     */
+    public static function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+    {
+        self::assertNotSame(
+          $expected,
+          self::readAttribute($actualClassOrObject, $actualAttributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a variable is of a given type.
+     *
+     * @param string $expected
+     * @param mixed  $actual
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertInstanceOf($expected, $actual, $message = '')
+    {
+        if (is_string($expected)) {
+            if (class_exists($expected) || interface_exists($expected)) {
+                $constraint = new PHPUnit_Framework_Constraint_IsInstanceOf(
+                  $expected
+                );
+            }
+
+            else {
+                throw PHPUnit_Util_InvalidArgumentHelper::factory(
+                  1, 'class or interface name'
+                );
+            }
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an attribute is of a given type.
+     *
+     * @param string $expected
+     * @param string $attributeName
+     * @param mixed  $classOrObject
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '')
+    {
+        self::assertInstanceOf(
+          $expected,
+          self::readAttribute($classOrObject, $attributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a variable is not of a given type.
+     *
+     * @param string $expected
+     * @param mixed  $actual
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertNotInstanceOf($expected, $actual, $message = '')
+    {
+        if (is_string($expected)) {
+            if (class_exists($expected) || interface_exists($expected)) {
+                $constraint = new PHPUnit_Framework_Constraint_Not(
+                  new PHPUnit_Framework_Constraint_IsInstanceOf($expected)
+                );
+            }
+
+            else {
+                throw PHPUnit_Util_InvalidArgumentHelper::factory(
+                  1, 'class or interface name'
+                );
+            }
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an attribute is of a given type.
+     *
+     * @param string $expected
+     * @param string $attributeName
+     * @param mixed  $classOrObject
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '')
+    {
+        self::assertNotInstanceOf(
+          $expected,
+          self::readAttribute($classOrObject, $attributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a variable is of a given type.
+     *
+     * @param string $expected
+     * @param mixed  $actual
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertInternalType($expected, $actual, $message = '')
+    {
+        if (is_string($expected)) {
+            $constraint = new PHPUnit_Framework_Constraint_IsType(
+              $expected
+            );
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an attribute is of a given type.
+     *
+     * @param string $expected
+     * @param string $attributeName
+     * @param mixed  $classOrObject
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '')
+    {
+        self::assertInternalType(
+          $expected,
+          self::readAttribute($classOrObject, $attributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a variable is not of a given type.
+     *
+     * @param string $expected
+     * @param mixed  $actual
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertNotInternalType($expected, $actual, $message = '')
+    {
+        if (is_string($expected)) {
+            $constraint = new PHPUnit_Framework_Constraint_Not(
+              new PHPUnit_Framework_Constraint_IsType($expected)
+            );
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that an attribute is of a given type.
+     *
+     * @param string $expected
+     * @param string $attributeName
+     * @param mixed  $classOrObject
+     * @param string $message
+     * @since Method available since Release 3.5.0
+     */
+    public static function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '')
+    {
+        self::assertNotInternalType(
+          $expected,
+          self::readAttribute($classOrObject, $attributeName),
+          $message
+        );
+    }
+
+    /**
+     * Asserts that a string matches a given regular expression.
+     *
+     * @param  string $pattern
+     * @param  string $string
+     * @param  string $message
+     */
+    public static function assertRegExp($pattern, $string, $message = '')
+    {
+        if (!is_string($pattern)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_PCREMatch($pattern);
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string does not match a given regular expression.
+     *
+     * @param  string $pattern
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 2.1.0
+     */
+    public static function assertNotRegExp($pattern, $string, $message = '')
+    {
+        if (!is_string($pattern)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_PCREMatch($pattern)
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Assert that the size of two arrays (or `Countable` or `Iterator` objects)
+     * is the same.
+     *
+     * @param array|Countable|Iterator $expected
+     * @param array|Countable|Iterator $actual
+     * @param string $message
+     */
+    public static function assertSameSize($expected, $actual, $message = '')
+    {
+        if (!$expected instanceof Countable &&
+            !$expected instanceof Iterator &&
+            !is_array($expected)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable');
+        }
+
+        if (!$actual instanceof Countable &&
+            !$actual instanceof Iterator &&
+            !is_array($actual)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable');
+        }
+
+        self::assertThat(
+          $actual,
+          new PHPUnit_Framework_Constraint_SameSize($expected),
+          $message
+        );
+    }
+
+    /**
+     * Assert that the size of two arrays (or `Countable` or `Iterator` objects)
+     * is not the same.
+     *
+     * @param array|Countable|Iterator $expected
+     * @param array|Countable|Iterator $actual
+     * @param string $message
+     */
+    public static function assertNotSameSize($expected, $actual, $message = '')
+    {
+        if (!$expected instanceof Countable &&
+            !$expected instanceof Iterator &&
+            !is_array($expected)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'countable');
+        }
+
+        if (!$actual instanceof Countable &&
+            !$actual instanceof Iterator &&
+            !is_array($actual)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'countable');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_SameSize($expected)
+        );
+
+        self::assertThat($actual, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string matches a given format string.
+     *
+     * @param  string $format
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.5.0
+     */
+    public static function assertStringMatchesFormat($format, $string, $message = '')
+    {
+        if (!is_string($format)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_StringMatches($format);
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string does not match a given format string.
+     *
+     * @param  string $format
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.5.0
+     */
+    public static function assertStringNotMatchesFormat($format, $string, $message = '')
+    {
+        if (!is_string($format)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_StringMatches($format)
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string matches a given format file.
+     *
+     * @param  string $formatFile
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.5.0
+     */
+    public static function assertStringMatchesFormatFile($formatFile, $string, $message = '')
+    {
+        self::assertFileExists($formatFile, $message);
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_StringMatches(
+          file_get_contents($formatFile)
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string does not match a given format string.
+     *
+     * @param  string $formatFile
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.5.0
+     */
+    public static function assertStringNotMatchesFormatFile($formatFile, $string, $message = '')
+    {
+        self::assertFileExists($formatFile, $message);
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_StringMatches(
+            file_get_contents($formatFile)
+          )
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string starts with a given prefix.
+     *
+     * @param  string $prefix
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.4.0
+     */
+    public static function assertStringStartsWith($prefix, $string, $message = '')
+    {
+        if (!is_string($prefix)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_StringStartsWith(
+          $prefix
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string starts not with a given prefix.
+     *
+     * @param  string $prefix
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.4.0
+     */
+    public static function assertStringStartsNotWith($prefix, $string, $message = '')
+    {
+        if (!is_string($prefix)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_StringStartsWith($prefix)
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string ends with a given prefix.
+     *
+     * @param  string $suffix
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.4.0
+     */
+    public static function assertStringEndsWith($suffix, $string, $message = '')
+    {
+        if (!is_string($suffix)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_StringEndsWith($suffix);
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that a string ends not with a given prefix.
+     *
+     * @param  string $suffix
+     * @param  string $string
+     * @param  string $message
+     * @since  Method available since Release 3.4.0
+     */
+    public static function assertStringEndsNotWith($suffix, $string, $message = '')
+    {
+        if (!is_string($suffix)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!is_string($string)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $constraint = new PHPUnit_Framework_Constraint_Not(
+          new PHPUnit_Framework_Constraint_StringEndsWith($suffix)
+        );
+
+        self::assertThat($string, $constraint, $message);
+    }
+
+    /**
+     * Asserts that two XML files are equal.
+     *
+     * @param  string $expectedFile
+     * @param  string $actualFile
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '')
+    {
+        self::assertFileExists($expectedFile);
+        self::assertFileExists($actualFile);
+
+        $expected = new DOMDocument;
+        $expected->preserveWhiteSpace = FALSE;
+        $expected->load($expectedFile);
+
+        $actual = new DOMDocument;
+        $actual->preserveWhiteSpace = FALSE;
+        $actual->load($actualFile);
+
+        self::assertEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that two XML files are not equal.
+     *
+     * @param  string $expectedFile
+     * @param  string $actualFile
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '')
+    {
+        self::assertFileExists($expectedFile);
+        self::assertFileExists($actualFile);
+
+        $expected = new DOMDocument;
+        $expected->preserveWhiteSpace = FALSE;
+        $expected->load($expectedFile);
+
+        $actual = new DOMDocument;
+        $actual->preserveWhiteSpace = FALSE;
+        $actual->load($actualFile);
+
+        self::assertNotEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that two XML documents are equal.
+     *
+     * @param  string $expectedFile
+     * @param  string $actualXml
+     * @param  string $message
+     * @since  Method available since Release 3.3.0
+     */
+    public static function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '')
+    {
+        self::assertFileExists($expectedFile);
+
+        $expected = new DOMDocument;
+        $expected->preserveWhiteSpace = FALSE;
+        $expected->load($expectedFile);
+
+        $actual = new DOMDocument;
+        $actual->preserveWhiteSpace = FALSE;
+        $actual->loadXML($actualXml);
+
+        self::assertEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that two XML documents are not equal.
+     *
+     * @param  string $expectedFile
+     * @param  string $actualXml
+     * @param  string $message
+     * @since  Method available since Release 3.3.0
+     */
+    public static function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '')
+    {
+        self::assertFileExists($expectedFile);
+
+        $expected = new DOMDocument;
+        $expected->preserveWhiteSpace = FALSE;
+        $expected->load($expectedFile);
+
+        $actual = new DOMDocument;
+        $actual->preserveWhiteSpace = FALSE;
+        $actual->loadXML($actualXml);
+
+        self::assertNotEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that two XML documents are equal.
+     *
+     * @param  string $expectedXml
+     * @param  string $actualXml
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '')
+    {
+        $expected = new DOMDocument;
+        $expected->preserveWhiteSpace = FALSE;
+        $expected->loadXML($expectedXml);
+
+        $actual = new DOMDocument;
+        $actual->preserveWhiteSpace = FALSE;
+        $actual->loadXML($actualXml);
+
+        self::assertEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that two XML documents are not equal.
+     *
+     * @param  string $expectedXml
+     * @param  string $actualXml
+     * @param  string $message
+     * @since  Method available since Release 3.1.0
+     */
+    public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '')
+    {
+        $expected = new DOMDocument;
+        $expected->preserveWhiteSpace = FALSE;
+        $expected->loadXML($expectedXml);
+
+        $actual = new DOMDocument;
+        $actual->preserveWhiteSpace = FALSE;
+        $actual->loadXML($actualXml);
+
+        self::assertNotEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that a hierarchy of DOMElements matches.
+     *
+     * @param DOMElement $expectedElement
+     * @param DOMElement $actualElement
+     * @param boolean $checkAttributes
+     * @param string  $message
+     * @author Mattis Stordalen Flister <mattis@xait.no>
+     * @since  Method available since Release 3.3.0
+     */
+    public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = FALSE, $message = '')
+    {
+        self::assertEquals(
+          $expectedElement->tagName,
+          $actualElement->tagName,
+          $message
+        );
+
+        if ($checkAttributes) {
+            self::assertEquals(
+              $expectedElement->attributes->length,
+              $actualElement->attributes->length,
+              sprintf(
+                '%s%sNumber of attributes on node "%s" does not match',
+                $message,
+                !empty($message) ? "\n" : '',
+                $expectedElement->tagName
+              )
+            );
+
+            for ($i = 0 ; $i < $expectedElement->attributes->length; $i++) {
+                $expectedAttribute = $expectedElement->attributes->item($i);
+                $actualAttribute   = $actualElement->attributes->getNamedItem(
+                  $expectedAttribute->name
+                );
+
+                if (!$actualAttribute) {
+                    self::fail(
+                      sprintf(
+                        '%s%sCould not find attribute "%s" on node "%s"',
+                        $message,
+                        !empty($message) ? "\n" : '',
+                        $expectedAttribute->name,
+                        $expectedElement->tagName
+                      )
+                    );
+                }
+            }
+        }
+
+        PHPUnit_Util_XML::removeCharacterDataNodes($expectedElement);
+        PHPUnit_Util_XML::removeCharacterDataNodes($actualElement);
+
+        self::assertEquals(
+          $expectedElement->childNodes->length,
+          $actualElement->childNodes->length,
+          sprintf(
+            '%s%sNumber of child nodes of "%s" differs',
+            $message,
+            !empty($message) ? "\n" : '',
+            $expectedElement->tagName
+          )
+        );
+
+        for ($i = 0; $i < $expectedElement->childNodes->length; $i++) {
+            self::assertEqualXMLStructure(
+              $expectedElement->childNodes->item($i),
+              $actualElement->childNodes->item($i),
+              $checkAttributes,
+              $message
+            );
+        }
+    }
+
+    /**
+     * Assert the presence, absence, or count of elements in a document matching
+     * the CSS $selector, regardless of the contents of those elements.
+     *
+     * The first argument, $selector, is the CSS selector used to match
+     * the elements in the $actual document.
+     *
+     * The second argument, $count, can be either boolean or numeric.
+     * When boolean, it asserts for presence of elements matching the selector
+     * (TRUE) or absence of elements (FALSE).
+     * When numeric, it asserts the count of elements.
+     *
+     * assertSelectCount("#binder", true, $xml);  // any?
+     * assertSelectCount(".binder", 3, $xml);     // exactly 3?
+     *
+     * @param  array   $selector
+     * @param  integer $count
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @param  boolean $isHtml
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = TRUE)
+    {
+        self::assertSelectEquals(
+          $selector, TRUE, $count, $actual, $message, $isHtml
+        );
+    }
+
+    /**
+     * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any?
+     * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml);    // 3?
+     *
+     * @param  array   $selector
+     * @param  string  $pattern
+     * @param  integer $count
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @param  boolean $isHtml
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = TRUE)
+    {
+        self::assertSelectEquals(
+          $selector, "regexp:$pattern", $count, $actual, $message, $isHtml
+        );
+    }
+
+    /**
+     * assertSelectEquals("#binder .name", "Chuck", true,  $xml);  // any?
+     * assertSelectEquals("#binder .name", "Chuck", false, $xml);  // none?
+     *
+     * @param  array   $selector
+     * @param  string  $content
+     * @param  integer $count
+     * @param  mixed   $actual
+     * @param  string  $message
+     * @param  boolean $isHtml
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = TRUE)
+    {
+        $tags = PHPUnit_Util_XML::cssSelect(
+          $selector, $content, $actual, $isHtml
+        );
+
+        // assert specific number of elements
+        if (is_numeric($count)) {
+            $counted = $tags ? count($tags) : 0;
+            self::assertEquals($count, $counted, $message);
+        }
+
+        // assert any elements exist if true, assert no elements exist if false
+        else if (is_bool($count)) {
+            $any = count($tags) > 0 && $tags[0] instanceof DOMNode;
+
+            if ($count) {
+                self::assertTrue($any, $message);
+            } else {
+                self::assertFalse($any, $message);
+            }
+        }
+
+        // check for range number of elements
+        else if (is_array($count) &&
+                (isset($count['>']) || isset($count['<']) ||
+                isset($count['>=']) || isset($count['<=']))) {
+            $counted = $tags ? count($tags) : 0;
+
+            if (isset($count['>'])) {
+                self::assertTrue($counted > $count['>'], $message);
+            }
+
+            if (isset($count['>='])) {
+                self::assertTrue($counted >= $count['>='], $message);
+            }
+
+            if (isset($count['<'])) {
+                self::assertTrue($counted < $count['<'], $message);
+            }
+
+            if (isset($count['<='])) {
+                self::assertTrue($counted <= $count['<='], $message);
+            }
+        } else {
+            throw new PHPUnit_Framework_Exception;
+        }
+    }
+
+    /**
+     * Evaluate an HTML or XML string and assert its structure and/or contents.
+     *
+     * The first argument ($matcher) is an associative array that specifies the
+     * match criteria for the assertion:
+     *
+     *  - `id`           : the node with the given id attribute must match the
+     *                     corresponsing value.
+     *  - `tag`          : the node type must match the corresponding value.
+     *  - `attributes`   : a hash. The node's attributres must match the
+     *                     corresponsing values in the hash.
+     *  - `content`      : The text content must match the given value.
+     *  - `parent`       : a hash. The node's parent must match the
+     *                     corresponsing hash.
+     *  - `child`        : a hash. At least one of the node's immediate children
+     *                     must meet the criteria described by the hash.
+     *  - `ancestor`     : a hash. At least one of the node's ancestors must
+     *                     meet the criteria described by the hash.
+     *  - `descendant`   : a hash. At least one of the node's descendants must
+     *                     meet the criteria described by the hash.
+     *  - `children`     : a hash, for counting children of a node.
+     *                     Accepts the keys:
+     *    - `count`        : a number which must equal the number of children
+     *                       that match
+     *    - `less_than`    : the number of matching children must be greater
+     *                       than this number
+     *    - `greater_than` : the number of matching children must be less than
+     *                       this number
+     *    - `only`         : another hash consisting of the keys to use to match
+     *                       on the children, and only matching children will be
+     *                       counted
+     *
+     * <code>
+     * // Matcher that asserts that there is an element with an id="my_id".
+     * $matcher = array('id' => 'my_id');
+     *
+     * // Matcher that asserts that there is a "span" tag.
+     * $matcher = array('tag' => 'span');
+     *
+     * // Matcher that asserts that there is a "span" tag with the content
+     * // "Hello World".
+     * $matcher = array('tag' => 'span', 'content' => 'Hello World');
+     *
+     * // Matcher that asserts that there is a "span" tag with content matching
+     * // the regular expression pattern.
+     * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/');
+     *
+     * // Matcher that asserts that there is a "span" with an "list" class
+     * // attribute.
+     * $matcher = array(
+     *   'tag'        => 'span',
+     *   'attributes' => array('class' => 'list')
+     * );
+     *
+     * // Matcher that asserts that there is a "span" inside of a "div".
+     * $matcher = array(
+     *   'tag'    => 'span',
+     *   'parent' => array('tag' => 'div')
+     * );
+     *
+     * // Matcher that asserts that there is a "span" somewhere inside a
+     * // "table".
+     * $matcher = array(
+     *   'tag'      => 'span',
+     *   'ancestor' => array('tag' => 'table')
+     * );
+     *
+     * // Matcher that asserts that there is a "span" with at least one "em"
+     * // child.
+     * $matcher = array(
+     *   'tag'   => 'span',
+     *   'child' => array('tag' => 'em')
+     * );
+     *
+     * // Matcher that asserts that there is a "span" containing a (possibly
+     * // nested) "strong" tag.
+     * $matcher = array(
+     *   'tag'        => 'span',
+     *   'descendant' => array('tag' => 'strong')
+     * );
+     *
+     * // Matcher that asserts that there is a "span" containing 5-10 "em" tags
+     * // as immediate children.
+     * $matcher = array(
+     *   'tag'      => 'span',
+     *   'children' => array(
+     *     'less_than'    => 11,
+     *     'greater_than' => 4,
+     *     'only'         => array('tag' => 'em')
+     *   )
+     * );
+     *
+     * // Matcher that asserts that there is a "div", with an "ul" ancestor and
+     * // a "li" parent (with class="enum"), and containing a "span" descendant
+     * // that contains an element with id="my_test" and the text "Hello World".
+     * $matcher = array(
+     *   'tag'        => 'div',
+     *   'ancestor'   => array('tag' => 'ul'),
+     *   'parent'     => array(
+     *     'tag'        => 'li',
+     *     'attributes' => array('class' => 'enum')
+     *   ),
+     *   'descendant' => array(
+     *     'tag'   => 'span',
+     *     'child' => array(
+     *       'id'      => 'my_test',
+     *       'content' => 'Hello World'
+     *     )
+     *   )
+     * );
+     *
+     * // Use assertTag() to apply a $matcher to a piece of $html.
+     * $this->assertTag($matcher, $html);
+     *
+     * // Use assertTag() to apply a $matcher to a piece of $xml.
+     * $this->assertTag($matcher, $xml, '', FALSE);
+     * </code>
+     *
+     * The second argument ($actual) is a string containing either HTML or
+     * XML text to be tested.
+     *
+     * The third argument ($message) is an optional message that will be
+     * used if the assertion fails.
+     *
+     * The fourth argument ($html) is an optional flag specifying whether
+     * to load the $actual string into a DOMDocument using the HTML or
+     * XML load strategy.  It is TRUE by default, which assumes the HTML
+     * load strategy.  In many cases, this will be acceptable for XML as well.
+     *
+     * @param  array   $matcher
+     * @param  string  $actual
+     * @param  string  $message
+     * @param  boolean $isHtml
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function assertTag($matcher, $actual, $message = '', $isHtml = TRUE)
+    {
+        $dom     = PHPUnit_Util_XML::load($actual, $isHtml);
+        $tags    = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
+        $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
+
+        self::assertTrue($matched, $message);
+    }
+
+    /**
+     * This assertion is the exact opposite of assertTag().
+     *
+     * Rather than asserting that $matcher results in a match, it asserts that
+     * $matcher does not match.
+     *
+     * @param  array   $matcher
+     * @param  string  $actual
+     * @param  string  $message
+     * @param  boolean $isHtml
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function assertNotTag($matcher, $actual, $message = '', $isHtml = TRUE)
+    {
+        $dom     = PHPUnit_Util_XML::load($actual, $isHtml);
+        $tags    = PHPUnit_Util_XML::findNodes($dom, $matcher, $isHtml);
+        $matched = count($tags) > 0 && $tags[0] instanceof DOMNode;
+
+        self::assertFalse($matched, $message);
+    }
+
+    /**
+     * Evaluates a PHPUnit_Framework_Constraint matcher object.
+     *
+     * @param  mixed                        $value
+     * @param  PHPUnit_Framework_Constraint $constraint
+     * @param  string                       $message
+     * @since  Method available since Release 3.0.0
+     */
+    public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
+    {
+        self::$count += count($constraint);
+
+        $constraint->evaluate($value, $message);
+    }
+
+    /**
+     * Asserts that two given JSON encoded objects or arrays are equal.
+     *
+     * @param string $expectedJson
+     * @param string $actualJson
+     * @param string $message
+     */
+    public static function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '')
+    {
+        $expected = json_decode($expectedJson);
+        if ($jsonError = json_last_error()) {
+            $message .=
+                PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
+                    $jsonError,
+                    PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix('expected')
+                );
+        }
+
+        $actual   = json_decode($actualJson);
+        if ($jsonError = json_last_error()) {
+            $message .=
+                PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
+                    $jsonError,
+                    PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix('actual')
+                );
+        }
+        return self::assertEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that two given JSON encoded objects or arrays are not equal.
+     *
+     * @param string $expectedJson
+     * @param string $actualJson
+     * @param string $message
+     */
+    public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '')
+    {
+        $expected = json_decode($expectedJson);
+        if ($jsonError = json_last_error()) {
+            $message .=
+                PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
+                    $jsonError,
+                    PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix('expected')
+                );
+        }
+
+        $actual   = json_decode($actualJson);
+        if ($jsonError = json_last_error()) {
+            $message .=
+                PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
+                    $jsonError,
+                    PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix('actual')
+                );
+        }
+
+        self::assertNotEquals($expected, $actual, $message);
+    }
+
+    /**
+     * Asserts that the generated JSON encoded object and the content of the given file are equal.
+     *
+     * @param string $expectedFile
+     * @param string $actualJson
+     * @param string $message
+     */
+    public static function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '')
+    {
+        self::assertFileExists($expectedFile, $message);
+
+        if (!is_string($actualJson)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        // call constraint
+        $constraint = new PHPUnit_Framework_Constraint_JsonMatches(
+            file_get_contents($expectedFile)
+        );
+
+        self::assertThat($actualJson, $constraint, $message);
+    }
+
+    /**
+     * Asserts that the generated JSON encoded object and the content of the given file are not equal.
+     *
+     * @param string $expectedFile
+     * @param string $actualJson
+     * @param string $message
+     */
+    public static function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '')
+    {
+        self::assertFileExists($expectedFile, $message);
+
+        if (!is_string($actualJson)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        // call constraint
+        $constraint = new PHPUnit_Framework_Constraint_JsonMatches(
+            file_get_contents($expectedFile)
+        );
+
+        self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraint), $message);
+    }
+
+    /**
+     * Asserts that two JSON files are not equal.
+     *
+     * @param  string $expectedFile
+     * @param  string $actualFile
+     * @param  string $message
+     */
+    public static function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '')
+    {
+        self::assertFileExists($expectedFile, $message);
+        self::assertFileExists($actualFile, $message);
+
+        $actualJson = file_get_contents($actualFile);
+        $expectedJson = file_get_contents($expectedFile);
+
+        // call constraint
+        $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches(
+            file_get_contents($expectedFile)
+        );
+
+        $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson);
+
+        self::assertThat($expectedJson, new PHPUnit_Framework_Constraint_Not($constraintActual), $message);
+        self::assertThat($actualJson, new PHPUnit_Framework_Constraint_Not($constraintExpected), $message);
+    }
+
+    /**
+     * Asserts that two JSON files are equal.
+     *
+     * @param  string $expectedFile
+     * @param  string $actualFile
+     * @param  string $message
+     */
+    public static function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '')
+    {
+        self::assertFileExists($expectedFile, $message);
+        self::assertFileExists($actualFile, $message);
+
+        $actualJson = file_get_contents($actualFile);
+        $expectedJson = file_get_contents($expectedFile);
+
+        // call constraint
+        $constraintExpected = new PHPUnit_Framework_Constraint_JsonMatches(
+            file_get_contents($expectedFile)
+        );
+
+        $constraintActual = new PHPUnit_Framework_Constraint_JsonMatches($actualJson);
+
+        self::assertThat($expectedJson, $constraintActual, $message);
+        self::assertThat($actualJson, $constraintExpected, $message);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_And matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_And
+     * @since  Method available since Release 3.0.0
+     */
+    public static function logicalAnd()
+    {
+        $constraints = func_get_args();
+
+        $constraint = new PHPUnit_Framework_Constraint_And;
+        $constraint->setConstraints($constraints);
+
+        return $constraint;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Or matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_Or
+     * @since  Method available since Release 3.0.0
+     */
+    public static function logicalOr()
+    {
+        $constraints = func_get_args();
+
+        $constraint = new PHPUnit_Framework_Constraint_Or;
+        $constraint->setConstraints($constraints);
+
+        return $constraint;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Not matcher object.
+     *
+     * @param  PHPUnit_Framework_Constraint $constraint
+     * @return PHPUnit_Framework_Constraint_Not
+     * @since  Method available since Release 3.0.0
+     */
+    public static function logicalNot(PHPUnit_Framework_Constraint $constraint)
+    {
+        return new PHPUnit_Framework_Constraint_Not($constraint);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Xor matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_Xor
+     * @since  Method available since Release 3.0.0
+     */
+    public static function logicalXor()
+    {
+        $constraints = func_get_args();
+
+        $constraint = new PHPUnit_Framework_Constraint_Xor;
+        $constraint->setConstraints($constraints);
+
+        return $constraint;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_IsAnything
+     * @since  Method available since Release 3.0.0
+     */
+    public static function anything()
+    {
+        return new PHPUnit_Framework_Constraint_IsAnything;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_IsTrue
+     * @since  Method available since Release 3.3.0
+     */
+    public static function isTrue()
+    {
+        return new PHPUnit_Framework_Constraint_IsTrue;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Callback matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_Callback
+     */
+    public static function callback($callback)
+    {
+        return new PHPUnit_Framework_Constraint_Callback($callback);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_IsFalse
+     * @since  Method available since Release 3.3.0
+     */
+    public static function isFalse()
+    {
+        return new PHPUnit_Framework_Constraint_IsFalse;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsNull matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_IsNull
+     * @since  Method available since Release 3.3.0
+     */
+    public static function isNull()
+    {
+        return new PHPUnit_Framework_Constraint_IsNull;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Attribute matcher object.
+     *
+     * @param  PHPUnit_Framework_Constraint $constraint
+     * @param  string                       $attributeName
+     * @return PHPUnit_Framework_Constraint_Attribute
+     * @since  Method available since Release 3.1.0
+     */
+    public static function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)
+    {
+        return new PHPUnit_Framework_Constraint_Attribute(
+          $constraint, $attributeName
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher
+     * object.
+     *
+     * @param  mixed   $value
+     * @param  boolean $checkForObjectIdentity
+     * @return PHPUnit_Framework_Constraint_TraversableContains
+     * @since  Method available since Release 3.0.0
+     */
+    public static function contains($value, $checkForObjectIdentity = TRUE)
+    {
+        return new PHPUnit_Framework_Constraint_TraversableContains($value, $checkForObjectIdentity);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
+     * object.
+     *
+     * @param  string $type
+     * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
+     * @since  Method available since Release 3.1.4
+     */
+    public static function containsOnly($type)
+    {
+        return new PHPUnit_Framework_Constraint_TraversableContainsOnly($type);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
+     * object.
+     *
+     * @param string $classname
+     * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
+     */
+    public static function containsOnlyInstancesOf($classname)
+    {
+        return new PHPUnit_Framework_Constraint_TraversableContainsOnly($classname, FALSE);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object.
+     *
+     * @param  mixed $key
+     * @return PHPUnit_Framework_Constraint_ArrayHasKey
+     * @since  Method available since Release 3.0.0
+     */
+    public static function arrayHasKey($key)
+    {
+        return new PHPUnit_Framework_Constraint_ArrayHasKey($key);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object.
+     *
+     * @param  mixed   $value
+     * @param  float   $delta
+     * @param  integer $maxDepth
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @return PHPUnit_Framework_Constraint_IsEqual
+     * @since  Method available since Release 3.0.0
+     */
+    public static function equalTo($value, $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        return new PHPUnit_Framework_Constraint_IsEqual(
+          $value, $delta, $maxDepth, $canonicalize, $ignoreCase
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object
+     * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher
+     * object.
+     *
+     * @param  string  $attributeName
+     * @param  mixed   $value
+     * @param  float   $delta
+     * @param  integer $maxDepth
+     * @param  boolean $canonicalize
+     * @param  boolean $ignoreCase
+     * @return PHPUnit_Framework_Constraint_Attribute
+     * @since  Method available since Release 3.1.0
+     */
+    public static function attributeEqualTo($attributeName, $value, $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        return self::attribute(
+          self::equalTo(
+            $value, $delta, $maxDepth, $canonicalize, $ignoreCase
+          ),
+          $attributeName
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_IsEmpty
+     * @since  Method available since Release 3.5.0
+     */
+    public static function isEmpty()
+    {
+        return new PHPUnit_Framework_Constraint_IsEmpty;
+    }
+    /**
+     * Returns a PHPUnit_Framework_Constraint_FileExists matcher object.
+     *
+     * @return PHPUnit_Framework_Constraint_FileExists
+     * @since  Method available since Release 3.0.0
+     */
+    public static function fileExists()
+    {
+        return new PHPUnit_Framework_Constraint_FileExists;
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object.
+     *
+     * @param  mixed $value
+     * @return PHPUnit_Framework_Constraint_GreaterThan
+     * @since  Method available since Release 3.0.0
+     */
+    public static function greaterThan($value)
+    {
+        return new PHPUnit_Framework_Constraint_GreaterThan($value);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
+     * a PHPUnit_Framework_Constraint_IsEqual and a
+     * PHPUnit_Framework_Constraint_GreaterThan matcher object.
+     *
+     * @param  mixed $value
+     * @return PHPUnit_Framework_Constraint_Or
+     * @since  Method available since Release 3.1.0
+     */
+    public static function greaterThanOrEqual($value)
+    {
+        return self::logicalOr(
+          new PHPUnit_Framework_Constraint_IsEqual($value),
+          new PHPUnit_Framework_Constraint_GreaterThan($value)
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object.
+     *
+     * @param  string $attributeName
+     * @return PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @since  Method available since Release 3.1.0
+     */
+    public static function classHasAttribute($attributeName)
+    {
+        return new PHPUnit_Framework_Constraint_ClassHasAttribute(
+          $attributeName
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher
+     * object.
+     *
+     * @param  string $attributeName
+     * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @since  Method available since Release 3.1.0
+     */
+    public static function classHasStaticAttribute($attributeName)
+    {
+        return new PHPUnit_Framework_Constraint_ClassHasStaticAttribute(
+          $attributeName
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object.
+     *
+     * @param  string $attributeName
+     * @return PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @since  Method available since Release 3.0.0
+     */
+    public static function objectHasAttribute($attributeName)
+    {
+        return new PHPUnit_Framework_Constraint_ObjectHasAttribute(
+          $attributeName
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object.
+     *
+     * @param  mixed $value
+     * @return PHPUnit_Framework_Constraint_IsIdentical
+     * @since  Method available since Release 3.0.0
+     */
+    public static function identicalTo($value)
+    {
+        return new PHPUnit_Framework_Constraint_IsIdentical($value);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object.
+     *
+     * @param  string $className
+     * @return PHPUnit_Framework_Constraint_IsInstanceOf
+     * @since  Method available since Release 3.0.0
+     */
+    public static function isInstanceOf($className)
+    {
+        return new PHPUnit_Framework_Constraint_IsInstanceOf($className);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_IsType matcher object.
+     *
+     * @param  string $type
+     * @return PHPUnit_Framework_Constraint_IsType
+     * @since  Method available since Release 3.0.0
+     */
+    public static function isType($type)
+    {
+        return new PHPUnit_Framework_Constraint_IsType($type);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_LessThan matcher object.
+     *
+     * @param  mixed $value
+     * @return PHPUnit_Framework_Constraint_LessThan
+     * @since  Method available since Release 3.0.0
+     */
+    public static function lessThan($value)
+    {
+        return new PHPUnit_Framework_Constraint_LessThan($value);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
+     * a PHPUnit_Framework_Constraint_IsEqual and a
+     * PHPUnit_Framework_Constraint_LessThan matcher object.
+     *
+     * @param  mixed $value
+     * @return PHPUnit_Framework_Constraint_Or
+     * @since  Method available since Release 3.1.0
+     */
+    public static function lessThanOrEqual($value)
+    {
+        return self::logicalOr(
+          new PHPUnit_Framework_Constraint_IsEqual($value),
+          new PHPUnit_Framework_Constraint_LessThan($value)
+        );
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object.
+     *
+     * @param  string $pattern
+     * @return PHPUnit_Framework_Constraint_PCREMatch
+     * @since  Method available since Release 3.0.0
+     */
+    public static function matchesRegularExpression($pattern)
+    {
+        return new PHPUnit_Framework_Constraint_PCREMatch($pattern);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object.
+     *
+     * @param  string $string
+     * @return PHPUnit_Framework_Constraint_StringMatches
+     * @since  Method available since Release 3.5.0
+     */
+    public static function matches($string)
+    {
+        return new PHPUnit_Framework_Constraint_StringMatches($string);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object.
+     *
+     * @param  mixed $prefix
+     * @return PHPUnit_Framework_Constraint_StringStartsWith
+     * @since  Method available since Release 3.4.0
+     */
+    public static function stringStartsWith($prefix)
+    {
+        return new PHPUnit_Framework_Constraint_StringStartsWith($prefix);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_StringContains matcher object.
+     *
+     * @param  string  $string
+     * @param  boolean $case
+     * @return PHPUnit_Framework_Constraint_StringContains
+     * @since  Method available since Release 3.0.0
+     */
+    public static function stringContains($string, $case = TRUE)
+    {
+        return new PHPUnit_Framework_Constraint_StringContains($string, $case);
+    }
+
+    /**
+     * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object.
+     *
+     * @param  mixed $suffix
+     * @return PHPUnit_Framework_Constraint_StringEndsWith
+     * @since  Method available since Release 3.4.0
+     */
+    public static function stringEndsWith($suffix)
+    {
+        return new PHPUnit_Framework_Constraint_StringEndsWith($suffix);
+    }
+
+    /**
+     * Fails a test with the given message.
+     *
+     * @param  string $message
+     * @throws PHPUnit_Framework_AssertionFailedError
+     */
+    public static function fail($message = '')
+    {
+        throw new PHPUnit_Framework_AssertionFailedError($message);
+    }
+
+    /**
+     * Returns the value of an attribute of a class or an object.
+     * This also works for attributes that are declared protected or private.
+     *
+     * @param  mixed   $classOrObject
+     * @param  string  $attributeName
+     * @return mixed
+     * @throws PHPUnit_Framework_Exception
+     */
+    public static function readAttribute($classOrObject, $attributeName)
+    {
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        if (is_string($classOrObject)) {
+            if (!class_exists($classOrObject)) {
+                throw PHPUnit_Util_InvalidArgumentHelper::factory(
+                  1, 'class name'
+                );
+            }
+
+            return PHPUnit_Util_Class::getStaticAttribute(
+              $classOrObject,
+              $attributeName
+            );
+        }
+
+        else if (is_object($classOrObject)) {
+            return PHPUnit_Util_Class::getObjectAttribute(
+              $classOrObject,
+              $attributeName
+            );
+        }
+
+        else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'class name or object'
+            );
+        }
+    }
+
+    /**
+     * Mark the test as incomplete.
+     *
+     * @param  string  $message
+     * @throws PHPUnit_Framework_IncompleteTestError
+     * @since  Method available since Release 3.0.0
+     */
+    public static function markTestIncomplete($message = '')
+    {
+        throw new PHPUnit_Framework_IncompleteTestError($message);
+    }
+
+    /**
+     * Mark the test as skipped.
+     *
+     * @param  string  $message
+     * @throws PHPUnit_Framework_SkippedTestError
+     * @since  Method available since Release 3.0.0
+     */
+    public static function markTestSkipped($message = '')
+    {
+        throw new PHPUnit_Framework_SkippedTestError($message);
+    }
+
+    /**
+     * Return the current assertion count.
+     *
+     * @return integer
+     * @since  Method available since Release 3.3.3
+     */
+    public static function getCount()
+    {
+        return self::$count;
+    }
+
+    /**
+     * Reset the assertion counter.
+     *
+     * @since  Method available since Release 3.3.3
+     */
+    public static function resetCount()
+    {
+        self::$count = 0;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php
new file mode 100644
index 0000000..057a950
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php
@@ -0,0 +1,1972 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */
+
+/**
+ * Returns a matcher that matches when the method it is evaluated for
+ * is executed zero or more times.
+ *
+ * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount
+ * @since  Method available since Release 3.0.0
+ */
+function any()
+{
+    return PHPUnit_Framework_TestCase::any();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsAnything matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_IsAnything
+ * @since  Method available since Release 3.0.0
+ */
+function anything()
+{
+    return PHPUnit_Framework_Assert::anything();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_ArrayHasKey matcher object.
+ *
+ * @param  mixed $key
+ * @return PHPUnit_Framework_Constraint_ArrayHasKey
+ * @since  Method available since Release 3.0.0
+ */
+function arrayHasKey($key)
+{
+    return PHPUnit_Framework_Assert::arrayHasKey($key);
+}
+
+/**
+ * Asserts that an array has a specified key.
+ *
+ * @param  mixed  $key
+ * @param  array  $array
+ * @param  string $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertArrayHasKey($key, array $array, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertArrayHasKey($key, $array, $message);
+}
+
+/**
+ * Asserts that an array does not have a specified key.
+ *
+ * @param  mixed  $key
+ * @param  array  $array
+ * @param  string $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertArrayNotHasKey($key, array $array, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertArrayNotHasKey($key, $array, $message);
+}
+
+/**
+ * Asserts that a haystack that is stored in a static attribute of a class
+ * or an attribute of an object contains a needle.
+ *
+ * @param  mixed   $needle
+ * @param  string  $haystackAttributeName
+ * @param  mixed   $haystackClassOrObject
+ * @param  string  $message
+ * @param  boolean $ignoreCase
+ * @param  boolean $checkForObjectIdentity
+ * @since  Method available since Release 3.0.0
+ */
+function assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertAttributeContains($needle, $haystackAttributeName, $haystackClassOrObject, $message, $ignoreCase, $checkForObjectIdentity);
+}
+
+/**
+ * Asserts that a haystack that is stored in a static attribute of a class
+ * or an attribute of an object contains only values of a given type.
+ *
+ * @param  string  $type
+ * @param  string  $haystackAttributeName
+ * @param  mixed   $haystackClassOrObject
+ * @param  boolean $isNativeType
+ * @param  string  $message
+ * @since  Method available since Release 3.1.4
+ */
+function assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = NULL, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType, $message);
+}
+
+/**
+ * Asserts the number of elements of an array, Countable or Iterator
+ * that is stored in an attribute.
+ *
+ * @param integer $expectedCount
+ * @param string  $haystackAttributeName
+ * @param mixed   $haystackClassOrObject
+ * @param string  $message
+ * @since Method available since Release 3.6.0
+ */
+function assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message);
+}
+
+/**
+ * Asserts that a static attribute of a class or an attribute of an object
+ * is empty.
+ *
+ * @param string $haystackAttributeName
+ * @param mixed  $haystackClassOrObject
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeEmpty($haystackAttributeName, $haystackClassOrObject, $message);
+}
+
+/**
+ * Asserts that a variable is equal to an attribute of an object.
+ *
+ * @param  mixed   $expected
+ * @param  string  $actualAttributeName
+ * @param  string  $actualClassOrObject
+ * @param  string  $message
+ * @param  float   $delta
+ * @param  integer $maxDepth
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ */
+function assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertAttributeEquals($expected, $actualAttributeName, $actualClassOrObject, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that an attribute is greater than another value.
+ *
+ * @param  mixed   $expected
+ * @param  string  $actualAttributeName
+ * @param  string  $actualClassOrObject
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeGreaterThan($expected, $actualAttributeName, $actualClassOrObject, $message);
+}
+
+/**
+ * Asserts that an attribute is greater than or equal to another value.
+ *
+ * @param  mixed   $expected
+ * @param  string  $actualAttributeName
+ * @param  string  $actualClassOrObject
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message);
+}
+
+/**
+ * Asserts that an attribute is of a given type.
+ *
+ * @param string $expected
+ * @param string $attributeName
+ * @param mixed  $classOrObject
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeInstanceOf($expected, $attributeName, $classOrObject, $message);
+}
+
+/**
+ * Asserts that an attribute is of a given type.
+ *
+ * @param string $expected
+ * @param string $attributeName
+ * @param mixed  $classOrObject
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertAttributeInternalType($expected, $attributeName, $classOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeInternalType($expected, $attributeName, $classOrObject, $message);
+}
+
+/**
+ * Asserts that an attribute is smaller than another value.
+ *
+ * @param  mixed   $expected
+ * @param  string  $actualAttributeName
+ * @param  string  $actualClassOrObject
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeLessThan($expected, $actualAttributeName, $actualClassOrObject, $message);
+}
+
+/**
+ * Asserts that an attribute is smaller than or equal to another value.
+ *
+ * @param  mixed   $expected
+ * @param  string  $actualAttributeName
+ * @param  string  $actualClassOrObject
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual($expected, $actualAttributeName, $actualClassOrObject, $message);
+}
+
+/**
+ * Asserts that a haystack that is stored in a static attribute of a class
+ * or an attribute of an object does not contain a needle.
+ *
+ * @param  mixed   $needle
+ * @param  string  $haystackAttributeName
+ * @param  mixed   $haystackClassOrObject
+ * @param  string  $message
+ * @param  boolean $ignoreCase
+ * @param  boolean $checkForObjectIdentity
+ * @since  Method available since Release 3.0.0
+ */
+function assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotContains($needle, $haystackAttributeName, $haystackClassOrObject, $message, $ignoreCase, $checkForObjectIdentity);
+}
+
+/**
+ * Asserts that a haystack that is stored in a static attribute of a class
+ * or an attribute of an object does not contain only values of a given
+ * type.
+ *
+ * @param  string  $type
+ * @param  string  $haystackAttributeName
+ * @param  mixed   $haystackClassOrObject
+ * @param  boolean $isNativeType
+ * @param  string  $message
+ * @since  Method available since Release 3.1.4
+ */
+function assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType = NULL, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotContainsOnly($type, $haystackAttributeName, $haystackClassOrObject, $isNativeType, $message);
+}
+
+/**
+ * Asserts the number of elements of an array, Countable or Iterator
+ * that is stored in an attribute.
+ *
+ * @param integer $expectedCount
+ * @param string  $haystackAttributeName
+ * @param mixed   $haystackClassOrObject
+ * @param string  $message
+ * @since Method available since Release 3.6.0
+ */
+function assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotCount($expectedCount, $haystackAttributeName, $haystackClassOrObject, $message);
+}
+
+/**
+ * Asserts that a static attribute of a class or an attribute of an object
+ * is not empty.
+ *
+ * @param string $haystackAttributeName
+ * @param mixed  $haystackClassOrObject
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotEmpty($haystackAttributeName, $haystackClassOrObject, $message);
+}
+
+/**
+ * Asserts that a variable is not equal to an attribute of an object.
+ *
+ * @param  mixed   $expected
+ * @param  string  $actualAttributeName
+ * @param  string  $actualClassOrObject
+ * @param  string  $message
+ * @param  float   $delta
+ * @param  integer $maxDepth
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ */
+function assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotEquals($expected, $actualAttributeName, $actualClassOrObject, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that an attribute is of a given type.
+ *
+ * @param string $expected
+ * @param string $attributeName
+ * @param mixed  $classOrObject
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotInstanceOf($expected, $attributeName, $classOrObject, $message);
+}
+
+/**
+ * Asserts that an attribute is of a given type.
+ *
+ * @param string $expected
+ * @param string $attributeName
+ * @param mixed  $classOrObject
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotInternalType($expected, $attributeName, $classOrObject, $message);
+}
+
+/**
+ * Asserts that a variable and an attribute of an object do not have the
+ * same type and value.
+ *
+ * @param  mixed  $expected
+ * @param  string $actualAttributeName
+ * @param  object $actualClassOrObject
+ * @param  string $message
+ */
+function assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeNotSame($expected, $actualAttributeName, $actualClassOrObject, $message);
+}
+
+/**
+ * Asserts that a variable and an attribute of an object have the same type
+ * and value.
+ *
+ * @param  mixed  $expected
+ * @param  string $actualAttributeName
+ * @param  object $actualClassOrObject
+ * @param  string $message
+ */
+function assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertAttributeSame($expected, $actualAttributeName, $actualClassOrObject, $message);
+}
+
+/**
+ * Asserts that a class has a specified attribute.
+ *
+ * @param  string $attributeName
+ * @param  string $className
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertClassHasAttribute($attributeName, $className, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertClassHasAttribute($attributeName, $className, $message);
+}
+
+/**
+ * Asserts that a class has a specified static attribute.
+ *
+ * @param  string $attributeName
+ * @param  string $className
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertClassHasStaticAttribute($attributeName, $className, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertClassHasStaticAttribute($attributeName, $className, $message);
+}
+
+/**
+ * Asserts that a class does not have a specified attribute.
+ *
+ * @param  string $attributeName
+ * @param  string $className
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertClassNotHasAttribute($attributeName, $className, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertClassNotHasAttribute($attributeName, $className, $message);
+}
+
+/**
+ * Asserts that a class does not have a specified static attribute.
+ *
+ * @param  string $attributeName
+ * @param  string $className
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertClassNotHasStaticAttribute($attributeName, $className, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute($attributeName, $className, $message);
+}
+
+/**
+ * Asserts that a haystack contains a needle.
+ *
+ * @param  mixed   $needle
+ * @param  mixed   $haystack
+ * @param  string  $message
+ * @param  boolean $ignoreCase
+ * @param  boolean $checkForObjectIdentity
+ * @since  Method available since Release 2.1.0
+ */
+function assertContains($needle, $haystack, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertContains($needle, $haystack, $message, $ignoreCase, $checkForObjectIdentity);
+}
+
+/**
+ * Asserts that a haystack contains only values of a given type.
+ *
+ * @param  string  $type
+ * @param  mixed   $haystack
+ * @param  boolean $isNativeType
+ * @param  string  $message
+ * @since  Method available since Release 3.1.4
+ */
+function assertContainsOnly($type, $haystack, $isNativeType = NULL, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertContainsOnly($type, $haystack, $isNativeType, $message);
+}
+
+/**
+ * Asserts the number of elements of an array, Countable or Iterator.
+ *
+ * @param integer $expectedCount
+ * @param mixed   $haystack
+ * @param string  $message
+ */
+function assertCount($expectedCount, $haystack, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertCount($expectedCount, $haystack, $message);
+}
+
+/**
+ * Asserts that a variable is empty.
+ *
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @throws PHPUnit_Framework_AssertionFailedError
+ */
+function assertEmpty($actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertEmpty($actual, $message);
+}
+
+/**
+ * Asserts that a hierarchy of DOMElements matches.
+ *
+ * @param DOMElement $expectedElement
+ * @param DOMElement $actualElement
+ * @param boolean $checkAttributes
+ * @param string  $message
+ * @author Mattis Stordalen Flister <mattis@xait.no>
+ * @since  Method available since Release 3.3.0
+ */
+function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, $checkAttributes = FALSE, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertEqualXMLStructure($expectedElement, $actualElement, $checkAttributes, $message);
+}
+
+/**
+ * Asserts that two variables are equal.
+ *
+ * @param  mixed   $expected
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @param  float   $delta
+ * @param  integer $maxDepth
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ */
+function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertEquals($expected, $actual, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that a condition is false.
+ *
+ * @param  boolean  $condition
+ * @param  string   $message
+ * @throws PHPUnit_Framework_AssertionFailedError
+ */
+function assertFalse($condition, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertFalse($condition, $message);
+}
+
+/**
+ * Asserts that the contents of one file is equal to the contents of another
+ * file.
+ *
+ * @param  string  $expected
+ * @param  string  $actual
+ * @param  string  $message
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @since  Method available since Release 3.2.14
+ */
+function assertFileEquals($expected, $actual, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertFileEquals($expected, $actual, $message, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that a file exists.
+ *
+ * @param  string $filename
+ * @param  string $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertFileExists($filename, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertFileExists($filename, $message);
+}
+
+/**
+ * Asserts that the contents of one file is not equal to the contents of
+ * another file.
+ *
+ * @param  string  $expected
+ * @param  string  $actual
+ * @param  string  $message
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @since  Method available since Release 3.2.14
+ */
+function assertFileNotEquals($expected, $actual, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertFileNotEquals($expected, $actual, $message, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that a file does not exist.
+ *
+ * @param  string $filename
+ * @param  string $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertFileNotExists($filename, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertFileNotExists($filename, $message);
+}
+
+/**
+ * Asserts that a value is greater than another value.
+ *
+ * @param  mixed   $expected
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertGreaterThan($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertGreaterThan($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a value is greater than or equal to another value.
+ *
+ * @param  mixed   $expected
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertGreaterThanOrEqual($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertGreaterThanOrEqual($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a variable is of a given type.
+ *
+ * @param string $expected
+ * @param mixed  $actual
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertInstanceOf($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertInstanceOf($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a variable is of a given type.
+ *
+ * @param string $expected
+ * @param mixed  $actual
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertInternalType($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertInternalType($expected, $actual, $message);
+}
+
+/**
+ * Asserts that two given JSON encoded objects or arrays are equal.
+ *
+ * @param string $expectedJson
+ * @param string $actualJson
+ * @param string $message
+ * @since Method available since Release 3.7.0
+ */
+function assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString($expectedJson, $actualJson, $message = '');
+}
+
+/**
+ * Asserts that two given JSON encoded objects or arrays are not equal.
+ *
+ * @param string $expectedJson
+ * @param string $actualJson
+ * @param string $message
+ * @since Method available since Release 3.7.0
+ */
+function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, $message = '');
+}
+
+/**
+ * Asserts that the generated JSON encoded object and the content of the given file are equal.
+ *
+ * @param string $expectedFile
+ * @param string $actualJson
+ * @param string $message
+ * @since Method available since Release 3.7.0
+ */
+function assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile($expectedFile, $actualJson, $message = '');
+}
+
+/**
+ * Asserts that the generated JSON encoded object and the content of the given file are not equal.
+ *
+ * @param string $expectedFile
+ * @param string $actualJson
+ * @param string $message
+ * @since Method available since Release 3.7.0
+ */
+function assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile($expectedFile, $actualJson, $message = '');
+}
+
+/**
+ * Asserts that two JSON files are not equal.
+ *
+ * @param  string $expectedFile
+ * @param  string $actualFile
+ * @param  string $message
+ * @since Method available since Release 3.7.0
+ */
+function assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile($expectedFile, $actualFile, $message = '');
+}
+
+/**
+ * Asserts that two JSON files are equal.
+ *
+ * @param  string $expectedFile
+ * @param  string $actualFile
+ * @param  string $message
+ * @since Method available since Release 3.7.0
+ */
+function assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile($expectedFile, $actualFile, $message = '');
+}
+
+/**
+ * Asserts that a value is smaller than another value.
+ *
+ * @param  mixed   $expected
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertLessThan($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertLessThan($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a value is smaller than or equal to another value.
+ *
+ * @param  mixed   $expected
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertLessThanOrEqual($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertLessThanOrEqual($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a haystack does not contain a needle.
+ *
+ * @param  mixed   $needle
+ * @param  mixed   $haystack
+ * @param  string  $message
+ * @param  boolean $ignoreCase
+ * @param  boolean $checkForObjectIdentity
+ * @since  Method available since Release 2.1.0
+ */
+function assertNotContains($needle, $haystack, $message = '', $ignoreCase = FALSE, $checkForObjectIdentity = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertNotContains($needle, $haystack, $message, $ignoreCase, $checkForObjectIdentity);
+}
+
+/**
+ * Asserts that a haystack does not contain only values of a given type.
+ *
+ * @param  string  $type
+ * @param  mixed   $haystack
+ * @param  boolean $isNativeType
+ * @param  string  $message
+ * @since  Method available since Release 3.1.4
+ */
+function assertNotContainsOnly($type, $haystack, $isNativeType = NULL, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotContainsOnly($type, $haystack, $isNativeType, $message);
+}
+
+/**
+ * Asserts the number of elements of an array, Countable or Iterator.
+ *
+ * @param integer $expectedCount
+ * @param mixed   $haystack
+ * @param string  $message
+ */
+function assertNotCount($expectedCount, $haystack, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotCount($expectedCount, $haystack, $message);
+}
+
+/**
+ * Asserts that a variable is not empty.
+ *
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @throws PHPUnit_Framework_AssertionFailedError
+ */
+function assertNotEmpty($actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotEmpty($actual, $message);
+}
+
+/**
+ * Asserts that two variables are not equal.
+ *
+ * @param  mixed   $expected
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @param  float   $delta
+ * @param  integer $maxDepth
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @since  Method available since Release 2.3.0
+ */
+function assertNotEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertNotEquals($expected, $actual, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that a variable is not of a given type.
+ *
+ * @param string $expected
+ * @param mixed  $actual
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertNotInstanceOf($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotInstanceOf($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a variable is not of a given type.
+ *
+ * @param string $expected
+ * @param mixed  $actual
+ * @param string $message
+ * @since Method available since Release 3.5.0
+ */
+function assertNotInternalType($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotInternalType($expected, $actual, $message);
+}
+
+/**
+ * Asserts that a variable is not NULL.
+ *
+ * @param  mixed  $actual
+ * @param  string $message
+ */
+function assertNotNull($actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotNull($actual, $message);
+}
+
+/**
+ * Asserts that a string does not match a given regular expression.
+ *
+ * @param  string $pattern
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 2.1.0
+ */
+function assertNotRegExp($pattern, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotRegExp($pattern, $string, $message);
+}
+
+/**
+ * Asserts that two variables do not have the same type and value.
+ * Used on objects, it asserts that two variables do not reference
+ * the same object.
+ *
+ * @param  mixed  $expected
+ * @param  mixed  $actual
+ * @param  string $message
+ */
+function assertNotSame($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotSame($expected, $actual, $message);
+}
+
+/**
+ * Assert that the size of two arrays (or `Countable` or `Iterator` objects)
+ * is not the same.
+ *
+ * @param integer $expected
+ * @param mixed   $actual
+ * @param string  $message
+ */
+function assertNotSameSize($expectedCount, $haystack, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNotSameSize($expectedCount, $haystack, $message);
+}
+
+/**
+ * This assertion is the exact opposite of assertTag().
+ *
+ * Rather than asserting that $matcher results in a match, it asserts that
+ * $matcher does not match.
+ *
+ * @param  array   $matcher
+ * @param  string  $actual
+ * @param  string  $message
+ * @param  boolean $isHtml
+ * @since  Method available since Release 3.3.0
+ * @author Mike Naberezny <mike@maintainable.com>
+ * @author Derek DeVries <derek@maintainable.com>
+ */
+function assertNotTag($matcher, $actual, $message = '', $isHtml = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertNotTag($matcher, $actual, $message, $isHtml);
+}
+
+/**
+ * Asserts that a variable is NULL.
+ *
+ * @param  mixed  $actual
+ * @param  string $message
+ */
+function assertNull($actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertNull($actual, $message);
+}
+
+/**
+ * Asserts that an object has a specified attribute.
+ *
+ * @param  string $attributeName
+ * @param  object $object
+ * @param  string $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertObjectHasAttribute($attributeName, $object, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertObjectHasAttribute($attributeName, $object, $message);
+}
+
+/**
+ * Asserts that an object does not have a specified attribute.
+ *
+ * @param  string $attributeName
+ * @param  object $object
+ * @param  string $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertObjectNotHasAttribute($attributeName, $object, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertObjectNotHasAttribute($attributeName, $object, $message);
+}
+
+/**
+ * Asserts that a string matches a given regular expression.
+ *
+ * @param  string $pattern
+ * @param  string $string
+ * @param  string $message
+ */
+function assertRegExp($pattern, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertRegExp($pattern, $string, $message);
+}
+
+/**
+ * Asserts that two variables have the same type and value.
+ * Used on objects, it asserts that two variables reference
+ * the same object.
+ *
+ * @param  mixed  $expected
+ * @param  mixed  $actual
+ * @param  string $message
+ */
+function assertSame($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertSame($expected, $actual, $message);
+}
+
+/**
+ * Assert that the size of two arrays (or `Countable` or `Iterator` objects)
+ * is the same.
+ *
+ * @param integer $expected
+ * @param mixed   $actual
+ * @param string  $message
+ */
+function assertSameSize($expected, $actual, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertSameSize($expected, $actual, $message);
+}
+
+/**
+ * Assert the presence, absence, or count of elements in a document matching
+ * the CSS $selector, regardless of the contents of those elements.
+ *
+ * The first argument, $selector, is the CSS selector used to match
+ * the elements in the $actual document.
+ *
+ * The second argument, $count, can be either boolean or numeric.
+ * When boolean, it asserts for presence of elements matching the selector
+ * (TRUE) or absence of elements (FALSE).
+ * When numeric, it asserts the count of elements.
+ *
+ * assertSelectCount("#binder", true, $xml);  // any?
+ * assertSelectCount(".binder", 3, $xml); // exactly 3?
+ *
+ * @param  array   $selector
+ * @param  integer $count
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @param  boolean $isHtml
+ * @since  Method available since Release 3.3.0
+ * @author Mike Naberezny <mike@maintainable.com>
+ * @author Derek DeVries <derek@maintainable.com>
+ */
+function assertSelectCount($selector, $count, $actual, $message = '', $isHtml = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertSelectCount($selector, $count, $actual, $message, $isHtml);
+}
+
+/**
+ * assertSelectEquals("#binder .name", "Chuck", true,  $xml);  // any?
+ * assertSelectEquals("#binder .name", "Chuck", false, $xml);  // none?
+ *
+ * @param  array   $selector
+ * @param  string  $content
+ * @param  integer $count
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @param  boolean $isHtml
+ * @since  Method available since Release 3.3.0
+ * @author Mike Naberezny <mike@maintainable.com>
+ * @author Derek DeVries <derek@maintainable.com>
+ */
+function assertSelectEquals($selector, $content, $count, $actual, $message = '', $isHtml = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertSelectEquals($selector, $content, $count, $actual, $message, $isHtml);
+}
+
+/**
+ * assertSelectRegExp("#binder .name", "/Mike|Derek/", true, $xml); // any?
+ * assertSelectRegExp("#binder .name", "/Mike|Derek/", 3, $xml);// 3?
+ *
+ * @param  array   $selector
+ * @param  string  $pattern
+ * @param  integer $count
+ * @param  mixed   $actual
+ * @param  string  $message
+ * @param  boolean $isHtml
+ * @since  Method available since Release 3.3.0
+ * @author Mike Naberezny <mike@maintainable.com>
+ * @author Derek DeVries <derek@maintainable.com>
+ */
+function assertSelectRegExp($selector, $pattern, $count, $actual, $message = '', $isHtml = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertSelectRegExp($selector, $pattern, $count, $actual, $message, $isHtml);
+}
+
+/**
+ * Asserts that a string ends not with a given prefix.
+ *
+ * @param  string $suffix
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.4.0
+ */
+function assertStringEndsNotWith($suffix, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringEndsNotWith($suffix, $string, $message);
+}
+
+/**
+ * Asserts that a string ends with a given prefix.
+ *
+ * @param  string $suffix
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.4.0
+ */
+function assertStringEndsWith($suffix, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringEndsWith($suffix, $string, $message);
+}
+
+/**
+ * Asserts that the contents of a string is equal
+ * to the contents of a file.
+ *
+ * @param  string  $expectedFile
+ * @param  string  $actualString
+ * @param  string  $message
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @since  Method available since Release 3.3.0
+ */
+function assertStringEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertStringEqualsFile($expectedFile, $actualString, $message, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that a string matches a given format string.
+ *
+ * @param  string $format
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.5.0
+ */
+function assertStringMatchesFormat($format, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringMatchesFormat($format, $string, $message);
+}
+
+/**
+ * Asserts that a string matches a given format file.
+ *
+ * @param  string $formatFile
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.5.0
+ */
+function assertStringMatchesFormatFile($formatFile, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringMatchesFormatFile($formatFile, $string, $message);
+}
+
+/**
+ * Asserts that the contents of a string is not equal
+ * to the contents of a file.
+ *
+ * @param  string  $expectedFile
+ * @param  string  $actualString
+ * @param  string  $message
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @since  Method available since Release 3.3.0
+ */
+function assertStringNotEqualsFile($expectedFile, $actualString, $message = '', $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::assertStringNotEqualsFile($expectedFile, $actualString, $message, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Asserts that a string does not match a given format string.
+ *
+ * @param  string $format
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.5.0
+ */
+function assertStringNotMatchesFormat($format, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringNotMatchesFormat($format, $string, $message);
+}
+
+/**
+ * Asserts that a string does not match a given format string.
+ *
+ * @param  string $formatFile
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.5.0
+ */
+function assertStringNotMatchesFormatFile($formatFile, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringNotMatchesFormatFile($formatFile, $string, $message);
+}
+
+/**
+ * Asserts that a string starts not with a given prefix.
+ *
+ * @param  string $prefix
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.4.0
+ */
+function assertStringStartsNotWith($prefix, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringStartsNotWith($prefix, $string, $message);
+}
+
+/**
+ * Asserts that a string starts with a given prefix.
+ *
+ * @param  string $prefix
+ * @param  string $string
+ * @param  string $message
+ * @since  Method available since Release 3.4.0
+ */
+function assertStringStartsWith($prefix, $string, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertStringStartsWith($prefix, $string, $message);
+}
+
+/**
+ * Evaluate an HTML or XML string and assert its structure and/or contents.
+ *
+ * The first argument ($matcher) is an associative array that specifies the
+ * match criteria for the assertion:
+ *
+ *  - `id`   : the node with the given id attribute must match the
+ * corresponsing value.
+ *  - `tag`  : the node type must match the corresponding value.
+ *  - `attributes`   : a hash. The node's attributres must match the
+ * corresponsing values in the hash.
+ *  - `content`  : The text content must match the given value.
+ *  - `parent`   : a hash. The node's parent must match the
+ * corresponsing hash.
+ *  - `child`: a hash. At least one of the node's immediate children
+ * must meet the criteria described by the hash.
+ *  - `ancestor` : a hash. At least one of the node's ancestors must
+ * meet the criteria described by the hash.
+ *  - `descendant`   : a hash. At least one of the node's descendants must
+ * meet the criteria described by the hash.
+ *  - `children` : a hash, for counting children of a node.
+ * Accepts the keys:
+ *- `count`: a number which must equal the number of children
+ *   that match
+ *- `less_than`: the number of matching children must be greater
+ *   than this number
+ *- `greater_than` : the number of matching children must be less than
+ *   this number
+ *- `only` : another hash consisting of the keys to use to match
+ *   on the children, and only matching children will be
+ *   counted
+ *
+ * <code>
+ * // Matcher that asserts that there is an element with an id="my_id".
+ * $matcher = array('id' => 'my_id');
+ *
+ * // Matcher that asserts that there is a "span" tag.
+ * $matcher = array('tag' => 'span');
+ *
+ * // Matcher that asserts that there is a "span" tag with the content
+ * // "Hello World".
+ * $matcher = array('tag' => 'span', 'content' => 'Hello World');
+ *
+ * // Matcher that asserts that there is a "span" tag with content matching
+ * // the regular expression pattern.
+ * $matcher = array('tag' => 'span', 'content' => 'regexp:/Try P(HP|ython)/');
+ *
+ * // Matcher that asserts that there is a "span" with an "list" class
+ * // attribute.
+ * $matcher = array(
+ *   'tag'=> 'span',
+ *   'attributes' => array('class' => 'list')
+ * );
+ *
+ * // Matcher that asserts that there is a "span" inside of a "div".
+ * $matcher = array(
+ *   'tag'=> 'span',
+ *   'parent' => array('tag' => 'div')
+ * );
+ *
+ * // Matcher that asserts that there is a "span" somewhere inside a
+ * // "table".
+ * $matcher = array(
+ *   'tag'  => 'span',
+ *   'ancestor' => array('tag' => 'table')
+ * );
+ *
+ * // Matcher that asserts that there is a "span" with at least one "em"
+ * // child.
+ * $matcher = array(
+ *   'tag'   => 'span',
+ *   'child' => array('tag' => 'em')
+ * );
+ *
+ * // Matcher that asserts that there is a "span" containing a (possibly
+ * // nested) "strong" tag.
+ * $matcher = array(
+ *   'tag'=> 'span',
+ *   'descendant' => array('tag' => 'strong')
+ * );
+ *
+ * // Matcher that asserts that there is a "span" containing 5-10 "em" tags
+ * // as immediate children.
+ * $matcher = array(
+ *   'tag'  => 'span',
+ *   'children' => array(
+ * 'less_than'=> 11,
+ * 'greater_than' => 4,
+ * 'only' => array('tag' => 'em')
+ *   )
+ * );
+ *
+ * // Matcher that asserts that there is a "div", with an "ul" ancestor and
+ * // a "li" parent (with class="enum"), and containing a "span" descendant
+ * // that contains an element with id="my_test" and the text "Hello World".
+ * $matcher = array(
+ *   'tag'=> 'div',
+ *   'ancestor'   => array('tag' => 'ul'),
+ *   'parent' => array(
+ * 'tag'=> 'li',
+ * 'attributes' => array('class' => 'enum')
+ *   ),
+ *   'descendant' => array(
+ * 'tag'   => 'span',
+ * 'child' => array(
+ *   'id'  => 'my_test',
+ *   'content' => 'Hello World'
+ * )
+ *   )
+ * );
+ *
+ * // Use assertTag() to apply a $matcher to a piece of $html.
+ * $this->assertTag($matcher, $html);
+ *
+ * // Use assertTag() to apply a $matcher to a piece of $xml.
+ * $this->assertTag($matcher, $xml, '', FALSE);
+ * </code>
+ *
+ * The second argument ($actual) is a string containing either HTML or
+ * XML text to be tested.
+ *
+ * The third argument ($message) is an optional message that will be
+ * used if the assertion fails.
+ *
+ * The fourth argument ($html) is an optional flag specifying whether
+ * to load the $actual string into a DOMDocument using the HTML or
+ * XML load strategy.  It is TRUE by default, which assumes the HTML
+ * load strategy.  In many cases, this will be acceptable for XML as well.
+ *
+ * @param  array   $matcher
+ * @param  string  $actual
+ * @param  string  $message
+ * @param  boolean $isHtml
+ * @since  Method available since Release 3.3.0
+ * @author Mike Naberezny <mike@maintainable.com>
+ * @author Derek DeVries <derek@maintainable.com>
+ */
+function assertTag($matcher, $actual, $message = '', $isHtml = TRUE)
+{
+    return PHPUnit_Framework_Assert::assertTag($matcher, $actual, $message, $isHtml);
+}
+
+/**
+ * Evaluates a PHPUnit_Framework_Constraint matcher object.
+ *
+ * @param  mixed$value
+ * @param  PHPUnit_Framework_Constraint $constraint
+ * @param  string   $message
+ * @since  Method available since Release 3.0.0
+ */
+function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertThat($value, $constraint, $message);
+}
+
+/**
+ * Asserts that a condition is true.
+ *
+ * @param  boolean $condition
+ * @param  string  $message
+ * @throws PHPUnit_Framework_AssertionFailedError
+ */
+function assertTrue($condition, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertTrue($condition, $message);
+}
+
+/**
+ * Asserts that two XML files are equal.
+ *
+ * @param  string $expectedFile
+ * @param  string $actualFile
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile($expectedFile, $actualFile, $message);
+}
+
+/**
+ * Asserts that two XML files are not equal.
+ *
+ * @param  string $expectedFile
+ * @param  string $actualFile
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile($expectedFile, $actualFile, $message);
+}
+
+/**
+ * Asserts that two XML documents are equal.
+ *
+ * @param  string $expectedFile
+ * @param  string $actualXml
+ * @param  string $message
+ * @since  Method available since Release 3.3.0
+ */
+function assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile($expectedFile, $actualXml, $message);
+}
+
+/**
+ * Asserts that two XML documents are equal.
+ *
+ * @param  string $expectedXml
+ * @param  string $actualXml
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString($expectedXml, $actualXml, $message);
+}
+
+/**
+ * Asserts that two XML documents are not equal.
+ *
+ * @param  string $expectedFile
+ * @param  string $actualXml
+ * @param  string $message
+ * @since  Method available since Release 3.3.0
+ */
+function assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile($expectedFile, $actualXml, $message);
+}
+
+/**
+ * Asserts that two XML documents are not equal.
+ *
+ * @param  string $expectedXml
+ * @param  string $actualXml
+ * @param  string $message
+ * @since  Method available since Release 3.1.0
+ */
+function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message = '')
+{
+    return PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, $message);
+}
+
+/**
+ * Returns a matcher that matches when the method it is evaluated for
+ * is invoked at the given $index.
+ *
+ * @param  integer $index
+ * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex
+ * @since  Method available since Release 3.0.0
+ */
+function at($index)
+{
+    return PHPUnit_Framework_TestCase::at($index);
+}
+
+/**
+ * Returns a matcher that matches when the method it is evaluated for
+ * is executed at least once.
+ *
+ * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce
+ * @since  Method available since Release 3.0.0
+ */
+function atLeastOnce()
+{
+    return PHPUnit_Framework_TestCase::atLeastOnce();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Attribute matcher object.
+ *
+ * @param  PHPUnit_Framework_Constraint $constraint
+ * @param  string   $attributeName
+ * @return PHPUnit_Framework_Constraint_Attribute
+ * @since  Method available since Release 3.1.0
+ */
+function attribute(PHPUnit_Framework_Constraint $constraint, $attributeName)
+{
+    return PHPUnit_Framework_Assert::attribute($constraint, $attributeName);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object
+ * that is wrapped in a PHPUnit_Framework_Constraint_Attribute matcher
+ * object.
+ *
+ * @param  string  $attributeName
+ * @param  mixed   $value
+ * @param  float   $delta
+ * @param  integer $maxDepth
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @return PHPUnit_Framework_Constraint_Attribute
+ * @since  Method available since Release 3.1.0
+ */
+function attributeEqualTo($attributeName, $value, $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::attributeEqualTo($attributeName, $value, $delta, $maxDepth, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_ClassHasAttribute matcher object.
+ *
+ * @param  string $attributeName
+ * @return PHPUnit_Framework_Constraint_ClassHasAttribute
+ * @since  Method available since Release 3.1.0
+ */
+function classHasAttribute($attributeName)
+{
+    return PHPUnit_Framework_Assert::classHasAttribute($attributeName);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_ClassHasStaticAttribute matcher
+ * object.
+ *
+ * @param  string $attributeName
+ * @return PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+ * @since  Method available since Release 3.1.0
+ */
+function classHasStaticAttribute($attributeName)
+{
+    return PHPUnit_Framework_Assert::classHasStaticAttribute($attributeName);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_TraversableContains matcher
+ * object.
+ *
+ * @param  mixed   $value
+ * @param  boolean $checkForObjectIdentity
+ * @return PHPUnit_Framework_Constraint_TraversableContains
+ * @since  Method available since Release 3.0.0
+ */
+function contains($value, $checkForObjectIdentity = TRUE)
+{
+    return PHPUnit_Framework_Assert::contains($value, $checkForObjectIdentity);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_TraversableContainsOnly matcher
+ * object.
+ *
+ * @param  string $type
+ * @return PHPUnit_Framework_Constraint_TraversableContainsOnly
+ * @since  Method available since Release 3.1.4
+ */
+function containsOnly($type)
+{
+    return PHPUnit_Framework_Assert::containsOnly($type);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsEqual matcher object.
+ *
+ * @param  mixed   $value
+ * @param  float   $delta
+ * @param  integer $maxDepth
+ * @param  boolean $canonicalize
+ * @param  boolean $ignoreCase
+ * @return PHPUnit_Framework_Constraint_IsEqual
+ * @since  Method available since Release 3.0.0
+ */
+function equalTo($value, $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+{
+    return PHPUnit_Framework_Assert::equalTo($value, $delta, $maxDepth, $canonicalize, $ignoreCase);
+}
+
+/**
+ * Returns a matcher that matches when the method it is evaluated for
+ * is executed exactly $count times.
+ *
+ * @param  integer $count
+ * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
+ * @since  Method available since Release 3.0.0
+ */
+function exactly($count)
+{
+    return PHPUnit_Framework_TestCase::exactly($count);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_FileExists matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_FileExists
+ * @since  Method available since Release 3.0.0
+ */
+function fileExists()
+{
+    return PHPUnit_Framework_Assert::fileExists();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_GreaterThan matcher object.
+ *
+ * @param  mixed $value
+ * @return PHPUnit_Framework_Constraint_GreaterThan
+ * @since  Method available since Release 3.0.0
+ */
+function greaterThan($value)
+{
+    return PHPUnit_Framework_Assert::greaterThan($value);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
+ * a PHPUnit_Framework_Constraint_IsEqual and a
+ * PHPUnit_Framework_Constraint_GreaterThan matcher object.
+ *
+ * @param  mixed $value
+ * @return PHPUnit_Framework_Constraint_Or
+ * @since  Method available since Release 3.1.0
+ */
+function greaterThanOrEqual($value)
+{
+    return PHPUnit_Framework_Assert::greaterThanOrEqual($value);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsIdentical matcher object.
+ *
+ * @param  mixed $value
+ * @return PHPUnit_Framework_Constraint_IsIdentical
+ * @since  Method available since Release 3.0.0
+ */
+function identicalTo($value)
+{
+    return PHPUnit_Framework_Assert::identicalTo($value);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsEmpty matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_IsEmpty
+ * @since  Method available since Release 3.5.0
+ */
+function isEmpty()
+{
+    return PHPUnit_Framework_Assert::isEmpty();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsFalse matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_IsFalse
+ * @since  Method available since Release 3.3.0
+ */
+function isFalse()
+{
+    return PHPUnit_Framework_Assert::isFalse();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsInstanceOf matcher object.
+ *
+ * @param  string $className
+ * @return PHPUnit_Framework_Constraint_IsInstanceOf
+ * @since  Method available since Release 3.0.0
+ */
+function isInstanceOf($className)
+{
+    return PHPUnit_Framework_Assert::isInstanceOf($className);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsNull matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_IsNull
+ * @since  Method available since Release 3.3.0
+ */
+function isNull()
+{
+    return PHPUnit_Framework_Assert::isNull();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsTrue matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_IsTrue
+ * @since  Method available since Release 3.3.0
+ */
+function isTrue()
+{
+    return PHPUnit_Framework_Assert::isTrue();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Callback matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_Callback
+ */
+function callback()
+{
+    return PHPUnit_Framework_Assert::callback();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_IsType matcher object.
+ *
+ * @param  string $type
+ * @return PHPUnit_Framework_Constraint_IsType
+ * @since  Method available since Release 3.0.0
+ */
+function isType($type)
+{
+    return PHPUnit_Framework_Assert::isType($type);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_LessThan matcher object.
+ *
+ * @param  mixed $value
+ * @return PHPUnit_Framework_Constraint_LessThan
+ * @since  Method available since Release 3.0.0
+ */
+function lessThan($value)
+{
+    return PHPUnit_Framework_Assert::lessThan($value);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Or matcher object that wraps
+ * a PHPUnit_Framework_Constraint_IsEqual and a
+ * PHPUnit_Framework_Constraint_LessThan matcher object.
+ *
+ * @param  mixed $value
+ * @return PHPUnit_Framework_Constraint_Or
+ * @since  Method available since Release 3.1.0
+ */
+function lessThanOrEqual($value)
+{
+    return PHPUnit_Framework_Assert::lessThanOrEqual($value);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_And matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_And
+ * @since  Method available since Release 3.0.0
+ */
+function logicalAnd()
+{
+    return PHPUnit_Framework_Assert::logicalAnd();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Not matcher object.
+ *
+ * @param  PHPUnit_Framework_Constraint $constraint
+ * @return PHPUnit_Framework_Constraint_Not
+ * @since  Method available since Release 3.0.0
+ */
+function logicalNot(PHPUnit_Framework_Constraint $constraint)
+{
+    return PHPUnit_Framework_Assert::logicalNot($constraint);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Or matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_Or
+ * @since  Method available since Release 3.0.0
+ */
+function logicalOr()
+{
+    return PHPUnit_Framework_Assert::logicalOr();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_Xor matcher object.
+ *
+ * @return PHPUnit_Framework_Constraint_Xor
+ * @since  Method available since Release 3.0.0
+ */
+function logicalXor()
+{
+    return PHPUnit_Framework_Assert::logicalXor();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_StringMatches matcher object.
+ *
+ * @param  string $string
+ * @return PHPUnit_Framework_Constraint_StringMatches
+ * @since  Method available since Release 3.5.0
+ */
+function matches($string)
+{
+    return PHPUnit_Framework_Assert::matches($string);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_PCREMatch matcher object.
+ *
+ * @param  string $pattern
+ * @return PHPUnit_Framework_Constraint_PCREMatch
+ * @since  Method available since Release 3.0.0
+ */
+function matchesRegularExpression($pattern)
+{
+    return PHPUnit_Framework_Assert::matchesRegularExpression($pattern);
+}
+
+/**
+ * Returns a matcher that matches when the method it is evaluated for
+ * is never executed.
+ *
+ * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
+ * @since  Method available since Release 3.0.0
+ */
+function never()
+{
+    return PHPUnit_Framework_TestCase::never();
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_ObjectHasAttribute matcher object.
+ *
+ * @param  string $attributeName
+ * @return PHPUnit_Framework_Constraint_ObjectHasAttribute
+ * @since  Method available since Release 3.0.0
+ */
+function objectHasAttribute($attributeName)
+{
+    return PHPUnit_Framework_Assert::objectHasAttribute($attributeName);
+}
+
+/**
+ *
+ *
+ * @param  mixed $value, ...
+ * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls
+ * @since  Method available since Release 3.0.0
+ */
+function onConsecutiveCalls()
+{
+    return PHPUnit_Framework_TestCase::onConsecutiveCalls();
+}
+
+/**
+ * Returns a matcher that matches when the method it is evaluated for
+ * is executed exactly once.
+ *
+ * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
+ * @since  Method available since Release 3.0.0
+ */
+function once()
+{
+    return PHPUnit_Framework_TestCase::once();
+}
+
+/**
+ *
+ *
+ * @param  integer $argumentIndex
+ * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument
+ * @since  Method available since Release 3.3.0
+ */
+function returnArgument($argumentIndex)
+{
+    return PHPUnit_Framework_TestCase::returnArgument($argumentIndex);
+}
+
+/**
+ *
+ *
+ * @param  mixed $callback
+ * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback
+ * @since  Method available since Release 3.3.0
+ */
+function returnCallback($callback)
+{
+    return PHPUnit_Framework_TestCase::returnCallback($callback);
+}
+
+/**
+ * Returns the current object.
+ *
+ * This method is useful when mocking a fluent interface.
+ *
+ * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf
+ * @since  Method available since Release 3.6.0
+ */
+function returnSelf()
+{
+    return PHPUnit_Framework_TestCase::returnSelf();
+}
+
+/**
+ *
+ *
+ * @param  mixed $value
+ * @return PHPUnit_Framework_MockObject_Stub_Return
+ * @since  Method available since Release 3.0.0
+ */
+function returnValue($value)
+{
+    return PHPUnit_Framework_TestCase::returnValue($value);
+}
+
+/**
+ *
+ *
+ * @param  array $valueMap
+ * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap
+ * @since  Method available since Release 3.6.0
+ */
+function returnValueMap(array $valueMap)
+{
+    return PHPUnit_Framework_TestCase::returnValueMap($valueMap);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_StringContains matcher object.
+ *
+ * @param  string  $string
+ * @param  boolean $case
+ * @return PHPUnit_Framework_Constraint_StringContains
+ * @since  Method available since Release 3.0.0
+ */
+function stringContains($string, $case = TRUE)
+{
+    return PHPUnit_Framework_Assert::stringContains($string, $case);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_StringEndsWith matcher object.
+ *
+ * @param  mixed $suffix
+ * @return PHPUnit_Framework_Constraint_StringEndsWith
+ * @since  Method available since Release 3.4.0
+ */
+function stringEndsWith($suffix)
+{
+    return PHPUnit_Framework_Assert::stringEndsWith($suffix);
+}
+
+/**
+ * Returns a PHPUnit_Framework_Constraint_StringStartsWith matcher object.
+ *
+ * @param  mixed $prefix
+ * @return PHPUnit_Framework_Constraint_StringStartsWith
+ * @since  Method available since Release 3.4.0
+ */
+function stringStartsWith($prefix)
+{
+    return PHPUnit_Framework_Assert::stringStartsWith($prefix);
+}
+
+/**
+ *
+ *
+ * @param  Exception $exception
+ * @return PHPUnit_Framework_MockObject_Stub_Exception
+ * @since  Method available since Release 3.1.0
+ */
+function throwException(Exception $exception)
+{
+    return PHPUnit_Framework_TestCase::throwException($exception);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php.in b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php.in
new file mode 100644
index 0000000..ada7bfc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Assert/Functions.php.in
@@ -0,0 +1,44 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */{functions}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/AssertionFailedError.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/AssertionFailedError.php
new file mode 100644
index 0000000..9fc29e6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/AssertionFailedError.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Thrown when an assertion failed.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_AssertionFailedError extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * Wrapper for getMessage() which is declared as final.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->getMessage();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator.php
new file mode 100644
index 0000000..6d7d66b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Abstract base class for comparators which compare values for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+abstract class PHPUnit_Framework_Comparator
+{
+    /**
+     * @var PHPUnit_Framework_ComparatorFactory
+     */
+    protected $factory;
+
+    /**
+     * @param PHPUnit_Framework_ComparatorFactory $factory
+     */
+    public function setFactory(PHPUnit_Framework_ComparatorFactory $factory)
+    {
+        $this->factory = $factory;
+    }
+
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    abstract public function accepts($expected, $actual);
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    abstract public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Array.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Array.php
new file mode 100644
index 0000000..3890d28
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Array.php
@@ -0,0 +1,178 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares arrays for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Array extends PHPUnit_Framework_Comparator
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return is_array($expected) && is_array($actual);
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE, array &$processed = array())
+    {
+        if ($canonicalize) {
+            sort($expected);
+            sort($actual);
+        }
+
+        $remaining = $actual;
+        $expString = $actString = "Array (\n";
+        $equal = TRUE;
+
+        foreach ($expected as $key => $value) {
+            unset($remaining[$key]);
+
+            if (!array_key_exists($key, $actual)) {
+                $expString .= sprintf(
+                  "    %s => %s\n",
+
+                  PHPUnit_Util_Type::export($key),
+                  PHPUnit_Util_Type::shortenedExport($value)
+                );
+                $equal = FALSE;
+                continue;
+            }
+
+            try {
+                $this->factory->getComparatorFor($value, $actual[$key])->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed);
+                $expString .= sprintf(
+                  "    %s => %s\n",
+
+                  PHPUnit_Util_Type::export($key),
+                  PHPUnit_Util_Type::shortenedExport($value)
+                );
+                $actString .= sprintf(
+                  "    %s => %s\n",
+
+                  PHPUnit_Util_Type::export($key),
+                  PHPUnit_Util_Type::shortenedExport($actual[$key])
+                );
+            }
+
+            catch (PHPUnit_Framework_ComparisonFailure $e) {
+                $expString .= sprintf(
+                  "    %s => %s\n",
+
+                  PHPUnit_Util_Type::export($key),
+                  $e->getExpectedAsString()
+                    ? $this->indent($e->getExpectedAsString())
+                    : PHPUnit_Util_Type::shortenedExport($e->getExpected())
+                );
+                $actString .= sprintf(
+                  "    %s => %s\n",
+
+                  PHPUnit_Util_Type::export($key),
+                  $e->getActualAsString()
+                    ? $this->indent($e->getActualAsString())
+                    : PHPUnit_Util_Type::shortenedExport($e->getActual())
+                );
+                $equal = FALSE;
+            }
+        }
+
+        foreach ($remaining as $key => $value) {
+            $actString .= sprintf(
+              "    %s => %s\n",
+
+              PHPUnit_Util_Type::export($key),
+              PHPUnit_Util_Type::shortenedExport($value)
+            );
+            $equal = FALSE;
+        }
+
+        $expString .= ')';
+        $actString .= ')';
+
+        if (!$equal) {
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              $expString,
+              $actString,
+              FALSE,
+             'Failed asserting that two arrays are equal.'
+            );
+        }
+    }
+
+    protected function indent($lines)
+    {
+        return trim(str_replace("\n", "\n    ", $lines));
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/DOMDocument.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/DOMDocument.php
new file mode 100644
index 0000000..a532263
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/DOMDocument.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares DOMDocument instances for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_DOMDocument extends PHPUnit_Framework_Comparator_Object
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return $expected instanceof DOMDocument && $actual instanceof DOMDocument;
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        if ($expected->C14N() !== $actual->C14N()) {
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              $this->domToText($expected),
+              $this->domToText($actual),
+              FALSE,
+              'Failed asserting that two DOM documents are equal.'
+            );
+        }
+    }
+
+    /**
+     * Returns the normalized, whitespace-cleaned, and indented textual
+     * representation of a DOMDocument.
+     *
+     * @param DOMDocument $document
+     * @return string
+     */
+    protected function domToText(DOMDocument $document)
+    {
+        $document->formatOutput = TRUE;
+        $document->normalizeDocument();
+
+        return $document->saveXML();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Double.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Double.php
new file mode 100644
index 0000000..a2964e6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Double.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares doubles for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Double extends PHPUnit_Framework_Comparator_Numeric
+{
+    /**
+     * Smallest value available in PHP.
+     *
+     * @var float
+     */
+    const EPSILON = 0.0000000001;
+
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return (is_double($expected) || is_double($actual)) && is_numeric($expected) && is_numeric($actual);
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        if ($delta == 0) {
+            $delta = self::EPSILON;
+        }
+
+        parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Exception.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Exception.php
new file mode 100644
index 0000000..0f545ce
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Exception.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares Exception instances for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Exception extends PHPUnit_Framework_Comparator_Object
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return $expected instanceof Exception && $actual instanceof Exception;
+    }
+
+    /**
+     * Converts an object to an array containing all of its private, protected
+     * and public properties.
+     *
+     * @param  object $object
+     * @return array
+     */
+    protected function toArray($object)
+    {
+        $array = parent::toArray($object);
+
+        unset(
+            $array['file'],
+            $array['line'],
+            $array['trace'],
+            $array['string'], // some internal property of Exception
+            $array['xdebug_message'] // some internal property added by XDebug
+        );
+
+        return $array;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/MockObject.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/MockObject.php
new file mode 100644
index 0000000..8345b56
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/MockObject.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares PHPUnit_Framework_MockObject_MockObject instances for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_MockObject extends PHPUnit_Framework_Comparator_Object
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return $expected instanceof PHPUnit_Framework_MockObject_MockObject && $actual instanceof PHPUnit_Framework_MockObject_MockObject;
+    }
+
+    /**
+     * Converts an object to an array containing all of its private, protected
+     * and public properties.
+     *
+     * @param  object $object
+     * @return array
+     */
+    protected function toArray($object)
+    {
+        $array = parent::toArray($object);
+
+        unset($array['invocationMocker']);
+
+        return $array;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Numeric.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Numeric.php
new file mode 100644
index 0000000..3a22e2c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Numeric.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares numerical values for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @author     Alexander <iam.asm89@gmail.com>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Numeric extends PHPUnit_Framework_Comparator_Scalar
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        // all numerical values, but not if one of them is a double
+        return is_numeric($expected) && is_numeric($actual) && !(is_double($expected) || is_double($actual));
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        if (is_infinite($actual) && is_infinite($expected)) {
+            return;
+        }
+
+        if (is_nan($actual) && is_nan($expected)) {
+            return;
+        }
+
+        if ((is_infinite($actual) XOR is_infinite($expected)) ||
+            (is_nan($actual) XOR is_nan($expected)) ||
+            abs($actual - $expected) > $delta) {
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              '',
+              '',
+              FALSE,
+              sprintf(
+                'Failed asserting that %s matches expected %s.',
+
+                PHPUnit_Util_Type::export($actual),
+                PHPUnit_Util_Type::export($expected)
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Object.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Object.php
new file mode 100644
index 0000000..5836e17
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Object.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares objects for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Object extends PHPUnit_Framework_Comparator_Array
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return is_object($expected) && is_object($actual);
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE, array &$processed = array())
+    {
+        if (get_class($actual) !== get_class($expected)) {
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              PHPUnit_Util_Type::export($expected),
+              PHPUnit_Util_Type::export($actual),
+              FALSE,
+              sprintf(
+                '%s is not instance of expected class "%s".',
+
+                PHPUnit_Util_Type::export($actual),
+                get_class($expected)
+              )
+            );
+        }
+
+        // don't compare twice to allow for cyclic dependencies
+        if (in_array(array($actual, $expected), $processed, TRUE) ||
+            in_array(array($expected, $actual), $processed, TRUE)) {
+            return;
+        }
+
+        $processed[] = array($actual, $expected);
+
+        // don't compare objects if they are identical
+        // this helps to avoid the error "maximum function nesting level reached"
+        // CAUTION: this conditional clause is not tested
+        if ($actual !== $expected) {
+            try {
+                parent::assertEquals($this->toArray($expected), $this->toArray($actual), $delta, $canonicalize, $ignoreCase, $processed);
+            }
+
+            catch (PHPUnit_Framework_ComparisonFailure $e) {
+                throw new PHPUnit_Framework_ComparisonFailure(
+                  $expected,
+                  $actual,
+                  // replace "Array" with "MyClass object"
+                  substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5),
+                  substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5),
+                  FALSE,
+                  'Failed asserting that two objects are equal.'
+                );
+            }
+        }
+    }
+
+    /**
+     * Converts an object to an array containing all of its private, protected
+     * and public properties.
+     *
+     * @param  object $object
+     * @return array
+     */
+    protected function toArray($object)
+    {
+        return PHPUnit_Util_Type::toArray($object);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Resource.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Resource.php
new file mode 100644
index 0000000..cecc4f7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Resource.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares resources for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Resource extends PHPUnit_Framework_Comparator
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return is_resource($expected) && is_resource($actual);
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        if ($actual != $expected) {
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              PHPUnit_Util_Type::export($expected),
+              PHPUnit_Util_Type::export($actual)
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Scalar.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Scalar.php
new file mode 100644
index 0000000..157dadb
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Scalar.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares scalar or NULL values for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Scalar extends PHPUnit_Framework_Comparator
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     * @since  Method available since Release 3.6.0
+     */
+    public function accepts($expected, $actual)
+    {
+        return ((is_scalar($expected) XOR NULL === $expected) &&
+                 (is_scalar($actual) XOR NULL === $actual))
+          // allow comparison between strings and objects featuring __toString()
+          || (is_string($expected) && is_object($actual) && method_exists($actual, '__toString'))
+          || (is_object($expected) && method_exists($expected, '__toString') && is_string($actual));
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        $expectedToCompare = $expected;
+        $actualToCompare = $actual;
+
+        // always compare as strings to avoid strange behaviour
+        // otherwise 0 == 'Foobar'
+        if (is_string($expected) || is_string($actual)) {
+            $expectedToCompare = (string)$expectedToCompare;
+            $actualToCompare = (string)$actualToCompare;
+
+            if ($ignoreCase) {
+                $expectedToCompare = strtolower($expectedToCompare);
+                $actualToCompare = strtolower($actualToCompare);
+            }
+        }
+
+        if ($expectedToCompare != $actualToCompare) {
+            if (is_string($expected) && is_string($actual)) {
+                throw new PHPUnit_Framework_ComparisonFailure(
+                  $expected,
+                  $actual,
+                  PHPUnit_Util_Type::export($expected),
+                  PHPUnit_Util_Type::export($actual),
+                  FALSE,
+                  'Failed asserting that two strings are equal.'
+                );
+            }
+
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              // no diff is required
+              '',
+              '',
+              FALSE,
+              sprintf(
+                'Failed asserting that %s matches expected %s.',
+
+                PHPUnit_Util_Type::export($actual),
+                PHPUnit_Util_Type::export($expected)
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/SplObjectStorage.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/SplObjectStorage.php
new file mode 100644
index 0000000..3d9b071
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/SplObjectStorage.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares SplObjectStorage instances for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_SplObjectStorage extends PHPUnit_Framework_Comparator
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return $expected instanceof SplObjectStorage && $actual instanceof SplObjectStorage;
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        foreach ($actual as $object) {
+            if (!$expected->contains($object)) {
+                throw new PHPUnit_Framework_ComparisonFailure(
+                  $expected,
+                  $actual,
+                  PHPUnit_Util_Type::export($expected),
+                  PHPUnit_Util_Type::export($actual),
+                  FALSE,
+                  'Failed asserting that two objects are equal.'
+                );
+            }
+        }
+
+        foreach ($expected as $object) {
+            if (!$actual->contains($object)) {
+                throw new PHPUnit_Framework_ComparisonFailure(
+                  $expected,
+                  $actual,
+                  PHPUnit_Util_Type::export($expected),
+                  PHPUnit_Util_Type::export($actual),
+                  FALSE,
+                  'Failed asserting that two objects are equal.'
+                );
+            }
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Type.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Type.php
new file mode 100644
index 0000000..e867db2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Comparator/Type.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Compares values for type equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Comparator
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Comparator_Type extends PHPUnit_Framework_Comparator
+{
+    /**
+     * Returns whether the comparator can compare two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return boolean
+     */
+    public function accepts($expected, $actual)
+    {
+        return TRUE;
+    }
+
+    /**
+     * Asserts that two values are equal.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @param  float $delta The allowed numerical distance between two values to
+     *                      consider them equal
+     * @param  bool  $canonicalize If set to TRUE, arrays are sorted before
+     *                             comparison
+     * @param  bool  $ignoreCase If set to TRUE, upper- and lowercasing is
+     *                           ignored when comparing string values
+     * @throws PHPUnit_Framework_ComparisonFailure Thrown when the comparison
+     *                           fails. Contains information about the
+     *                           specific errors that lead to the failure.
+     */
+    public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        if (gettype($expected) != gettype($actual)) {
+            throw new PHPUnit_Framework_ComparisonFailure(
+              $expected,
+              $actual,
+              // we don't need a diff
+              '',
+              '',
+              FALSE,
+              sprintf(
+                '%s does not match expected type "%s".',
+
+                PHPUnit_Util_Type::shortenedExport($actual),
+                gettype($expected)
+              )
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/ComparatorFactory.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/ComparatorFactory.php
new file mode 100644
index 0000000..d579d47
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/ComparatorFactory.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Factory for comparators which compare values for equality.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_ComparatorFactory
+{
+    /**
+     * @var array
+     */
+    protected $comparators = array();
+
+    /**
+     * @var PHPUnit_Framework_ComparatorFactory
+     */
+    private static $defaultInstance = NULL;
+
+    /**
+     * Constructs a new factory.
+     */
+    public function __construct()
+    {
+        $this->register(new PHPUnit_Framework_Comparator_Type);
+        $this->register(new PHPUnit_Framework_Comparator_Scalar);
+        $this->register(new PHPUnit_Framework_Comparator_Numeric);
+        $this->register(new PHPUnit_Framework_Comparator_Double);
+        $this->register(new PHPUnit_Framework_Comparator_Array);
+        $this->register(new PHPUnit_Framework_Comparator_Resource);
+        $this->register(new PHPUnit_Framework_Comparator_Object);
+        $this->register(new PHPUnit_Framework_Comparator_Exception);
+        $this->register(new PHPUnit_Framework_Comparator_SplObjectStorage);
+        $this->register(new PHPUnit_Framework_Comparator_DOMDocument);
+        $this->register(new PHPUnit_Framework_Comparator_MockObject);
+    }
+
+    /**
+     * Returns the default instance.
+     *
+     * @return PHPUnit_Framework_ComparatorFactory
+     */
+    public static function getDefaultInstance()
+    {
+        if (self::$defaultInstance === NULL) {
+            self::$defaultInstance = new PHPUnit_Framework_ComparatorFactory;
+        }
+
+        return self::$defaultInstance;
+    }
+
+    /**
+     * Returns the correct comparator for comparing two values.
+     *
+     * @param  mixed $expected The first value to compare
+     * @param  mixed $actual The second value to compare
+     * @return PHPUnit_Framework_Comparator
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function getComparatorFor($expected, $actual)
+    {
+        foreach ($this->comparators as $comparator) {
+            if ($comparator->accepts($expected, $actual)) {
+                return $comparator;
+            }
+        }
+
+        throw new PHPUnit_Framework_Exception(
+          sprintf(
+            'No comparator is registered for comparing the types "%s" and "%s"',
+            gettype($expected), gettype($actual)
+          )
+        );
+    }
+
+    /**
+     * Registers a new comparator.
+     *
+     * This comparator will be returned by getInstance() if its accept() method
+     * returns TRUE for the compared values. It has higher priority than the
+     * existing comparators, meaning that its accept() method will be tested
+     * before those of the other comparators.
+     *
+     * @param  PHPUnit_Framework_Comparator $comparator The registered comparator
+     */
+    public function register(PHPUnit_Framework_Comparator $comparator)
+    {
+        array_unshift($this->comparators, $comparator);
+        $comparator->setFactory($this);
+    }
+
+    /**
+     * Unregisters a comparator.
+     *
+     * This comparator will no longer be returned by getInstance().
+     *
+     * @param  PHPUnit_Framework_Comparator $comparator The unregistered comparator
+     */
+    public function unregister(PHPUnit_Framework_Comparator $comparator)
+    {
+        foreach ($this->comparators as $key => $_comparator) {
+            if ($comparator === $_comparator) {
+                unset($this->comparators[$key]);
+            }
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/ComparisonFailure.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/ComparisonFailure.php
new file mode 100644
index 0000000..343dd2c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/ComparisonFailure.php
@@ -0,0 +1,167 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Thrown when an assertion for string equality failed.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_ComparisonFailure extends PHPUnit_Framework_AssertionFailedError
+{
+    /**
+     * Expected value of the retrieval which does not match $actual.
+     * @var mixed
+     */
+    protected $expected;
+
+    /**
+     * Actually retrieved value which does not match $expected.
+     * @var mixed
+     */
+    protected $actual;
+
+    /**
+     * The string representation of the expected value
+     * @var string
+     */
+    protected $expectedAsString;
+
+    /**
+     * The string representation of the actual value
+     * @var string
+     */
+    protected $actualAsString;
+
+    /**
+     * @var boolean
+     */
+    protected $identical;
+
+    /**
+     * Optional message which is placed in front of the first line
+     * returned by toString().
+     * @var string
+     */
+    protected $message;
+
+    /**
+     * Initialises with the expected value and the actual value.
+     *
+     * @param mixed $expected Expected value retrieved.
+     * @param mixed $actual Actual value retrieved.
+     * @param string $expectedAsString
+     * @param string $actualAsString
+     * @param boolean $identical
+     * @param string $message A string which is prefixed on all returned lines
+     *                        in the difference output.
+     */
+    public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = FALSE, $message = '')
+    {
+        $this->expected         = $expected;
+        $this->actual           = $actual;
+        $this->expectedAsString = $expectedAsString;
+        $this->actualAsString   = $actualAsString;
+        $this->message          = $message;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getActual()
+    {
+        return $this->actual;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getExpected()
+    {
+        return $this->expected;
+    }
+
+    /**
+     * @return string
+     */
+    public function getActualAsString()
+    {
+        return $this->actualAsString;
+    }
+
+    /**
+     * @return string
+     */
+    public function getExpectedAsString()
+    {
+        return $this->expectedAsString;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDiff()
+    {
+        return $this->actualAsString || $this->expectedAsString
+          ? PHPUnit_Util_Diff::diff($this->expectedAsString, $this->actualAsString)
+          : '';
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->message . $this->getDiff();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint.php
new file mode 100644
index 0000000..f52548d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Abstract base class for constraints. which are placed upon any value.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 3.0.0
+ */
+abstract class PHPUnit_Framework_Constraint implements Countable, PHPUnit_Framework_SelfDescribing
+{
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $success = FALSE;
+
+        if ($this->matches($other)) {
+            $success = TRUE;
+        }
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * This method can be overridden to implement the evaluation algorithm.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return FALSE;
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     * @since  Method available since Release 3.4.0
+     */
+    public function count()
+    {
+        return 1;
+    }
+
+    /**
+     * Throws an exception for the given compared value and test description
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @param  string $description Additional information about the test
+     * @param  PHPUnit_Framework_ComparisonFailure $comparisonFailure
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    protected function fail($other, $description, PHPUnit_Framework_ComparisonFailure $comparisonFailure = NULL)
+    {
+        $failureDescription = sprintf(
+          'Failed asserting that %s.',
+          $this->failureDescription($other)
+        );
+
+        $additionalFailureDescription = $this->additionalFailureDescription($other);
+        if ($additionalFailureDescription) {
+            $failureDescription .= "\n" . $additionalFailureDescription;
+        }
+
+        if (!empty($description)) {
+            $failureDescription = $description . "\n" . $failureDescription;
+        }
+
+        throw new PHPUnit_Framework_ExpectationFailedException(
+          $failureDescription,
+          $comparisonFailure
+        );
+    }
+
+    /**
+     * Return additional failure description where needed
+     *
+     * The function can be overridden to provide additional failure
+     * information like a diff
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function additionalFailureDescription($other)
+    {
+        return "";
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * To provide additional failure information additionalFailureDescription
+     * can be used.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return PHPUnit_Util_Type::export($other) . ' ' . $this->toString();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/And.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/And.php
new file mode 100644
index 0000000..a27665d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/And.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Logical AND.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_And extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var PHPUnit_Framework_Constraint[]
+     */
+    protected $constraints = array();
+
+    /**
+     * @var PHPUnit_Framework_Constraint
+     */
+    protected $lastConstraint = NULL;
+
+    /**
+     * @param  PHPUnit_Framework_Constraint[] $constraints
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function setConstraints(array $constraints)
+    {
+        $this->constraints = array();
+
+        foreach ($constraints as $key => $constraint) {
+            if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
+                throw new PHPUnit_Framework_Exception(
+                  'All parameters to ' . __CLASS__ .
+                  ' must be a constraint object.'
+                );
+            }
+
+            $this->constraints[] = $constraint;
+        }
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $success = TRUE;
+        $constraint = NULL;
+
+        foreach ($this->constraints as $constraint) {
+            if (!$constraint->evaluate($other, $description, TRUE)) {
+                $success = FALSE;
+                break;
+            }
+        }
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        $text = '';
+
+        foreach ($this->constraints as $key => $constraint) {
+            if ($key > 0) {
+                $text .= ' and ';
+            }
+
+            $text .= $constraint->toString();
+        }
+
+        return $text;
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     * @since  Method available since Release 3.4.0
+     */
+    public function count()
+    {
+        $count = 0;
+
+        foreach ($this->constraints as $constraint) {
+            $count += count($constraint);
+        }
+
+        return $count;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ArrayHasKey.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ArrayHasKey.php
new file mode 100644
index 0000000..94ef272
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ArrayHasKey.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the array it is evaluated for has a given key.
+ *
+ * Uses array_key_exists() to check if the key is found in the input array, if
+ * not found the evaluaton fails.
+ *
+ * The array key is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_ArrayHasKey extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var integer|string
+     */
+    protected $key;
+
+    /**
+     * @param integer|string $key
+     */
+    public function __construct($key)
+    {
+        $this->key = $key;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return array_key_exists($this->key, $other);
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'has the key ' . PHPUnit_Util_Type::export($this->key);
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return 'an array ' . $this->toString();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Attribute.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Attribute.php
new file mode 100644
index 0000000..ce11d28
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Attribute.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.0
+ */
+
+class PHPUnit_Framework_Constraint_Attribute extends PHPUnit_Framework_Constraint_Composite
+{
+    /**
+     * @var string
+     */
+    protected $attributeName;
+
+    /**
+     * @param PHPUnit_Framework_Constraint $constraint
+     * @param string                       $attributeName
+     */
+    public function __construct(PHPUnit_Framework_Constraint $constraint, $attributeName)
+    {
+        parent::__construct($constraint);
+
+        $this->attributeName = $attributeName;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        return parent::evaluate(
+          PHPUnit_Framework_Assert::readAttribute(
+            $other, $this->attributeName
+          ),
+          $description,
+          $returnResult
+        );
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'attribute "' . $this->attributeName . '" ' .
+               $this->innerConstraint->toString();
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return $this->toString();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Callback.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Callback.php
new file mode 100644
index 0000000..c2277f1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Callback.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ */
+
+/**
+ * Constraint that evaluates against a specified closure.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Timon Rapp <timon@zaeda.net>
+ * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ */
+class PHPUnit_Framework_Constraint_Callback extends PHPUnit_Framework_Constraint
+{
+    private $callback;
+
+    /**
+     * @param callable $value
+     * @throws InvalidArgumentException
+     */
+    public function __construct($callback)
+    {
+        if (!is_callable($callback)) {
+            throw new InvalidArgumentException(
+              sprintf(
+                'Specified callback <%s> is not callable.',
+                $this->callbackToString($callback)
+              )
+            );
+        }
+        $this->callback = $callback;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $value. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $value Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return call_user_func($this->callback, $other);
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is accepted by specified callback';
+    }
+
+    private function callbackToString($callback)
+    {
+        if (!is_array($callback)) {
+            return $callback;
+        }
+        if (empty($callback)) {
+            return "empty array";
+        }
+        if (!isset($callback[0]) || !isset($callback[1])) {
+            return "array without indexes 0 and 1 set";
+        }
+        if (is_object($callback[0])) {
+            $callback[0] = get_class($callback[0]);
+        }
+        return $callback[0] . '::' . $callback[1];
+    }
+
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ClassHasAttribute.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ClassHasAttribute.php
new file mode 100644
index 0000000..7bb037a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ClassHasAttribute.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.0
+ */
+
+/**
+ * Constraint that asserts that the class it is evaluated for has a given
+ * attribute.
+ *
+ * The attribute name is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.0
+ */
+class PHPUnit_Framework_Constraint_ClassHasAttribute extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $attributeName;
+
+    /**
+     * @param string $attributeName
+     */
+    public function __construct($attributeName)
+    {
+        $this->attributeName = $attributeName;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        $class = new ReflectionClass($other);
+
+        return $class->hasProperty($this->attributeName);
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          'has attribute "%s"',
+
+          $this->attributeName
+        );
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          '%sclass "%s" %s',
+
+          is_object($other) ? 'object of ' : '',
+          is_object($other) ? get_class($other) : $other,
+          $this->toString()
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ClassHasStaticAttribute.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ClassHasStaticAttribute.php
new file mode 100644
index 0000000..878c4cc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ClassHasStaticAttribute.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.0
+ */
+
+/**
+ * Constraint that asserts that the class it is evaluated for has a given
+ * static attribute.
+ *
+ * The attribute name is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.0
+ */
+class PHPUnit_Framework_Constraint_ClassHasStaticAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        $class = new ReflectionClass($other);
+
+        if ($class->hasProperty($this->attributeName)) {
+            $attribute = $class->getProperty($this->attributeName);
+
+            return $attribute->isStatic();
+        } else {
+            return FALSE;
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     * @since  Method available since Release 3.3.0
+     */
+    public function toString()
+    {
+        return sprintf(
+          'has static attribute "%s"',
+
+          $this->attributeName
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Composite.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Composite.php
new file mode 100644
index 0000000..2be7526
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Composite.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+
+abstract class PHPUnit_Framework_Constraint_Composite extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var PHPUnit_Framework_Constraint
+     */
+    protected $innerConstraint;
+
+    /**
+     * @param PHPUnit_Framework_Constraint $innerConstraint
+     * @param string                       $attributeName
+     */
+    public function __construct(PHPUnit_Framework_Constraint $innerConstraint)
+    {
+        $this->innerConstraint = $innerConstraint;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        try {
+            return $this->innerConstraint->evaluate(
+              $other,
+              $description,
+              $returnResult
+            );
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return count($this->innerConstraint);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Count.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Count.php
new file mode 100644
index 0000000..9f0df16
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Count.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Constraint_Count extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var integer
+     */
+    protected $expectedCount = 0;
+
+    /**
+     * @param integer $expected
+     */
+    public function __construct($expected)
+    {
+        $this->expectedCount = $expected;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other
+     * @return boolean
+     */
+    protected function matches($other)
+    {
+        return $this->expectedCount === $this->getCountOf($other);
+    }
+
+    /**
+     * @param mixed $other
+     * @return boolean
+     */
+    protected function getCountOf($other)
+    {
+        if ($other instanceof Countable || is_array($other)) {
+            return count($other);
+        }
+
+        else if ($other instanceof Iterator) {
+            return iterator_count($other);
+        }
+    }
+
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          'actual size %d matches expected size %d',
+
+          $this->getCountOf($other),
+          $this->expectedCount
+        );
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'count matches ';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Exception.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Exception.php
new file mode 100644
index 0000000..86eadf0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Exception.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.6
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.6
+ */
+class PHPUnit_Framework_Constraint_Exception extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $className;
+
+    /**
+     * @param string $className
+     */
+    public function __construct($className)
+    {
+        $this->className = $className;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return $other instanceof $this->className;
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        if ($other !== NULL) {
+            $message = '';
+            if ($other instanceof Exception && $other->getMessage()) {
+                $message = '. Message was: "' . $other->getMessage() . '"';
+            }
+            return sprintf(
+              'exception of type "%s" matches expected exception "%s"%s',
+
+              get_class($other),
+              $this->className,
+              $message
+            );
+        }
+
+        return sprintf(
+          'exception of type "%s" is thrown',
+
+          $this->className
+        );
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          'exception of type "%s"',
+
+          $this->className
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ExceptionCode.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ExceptionCode.php
new file mode 100644
index 0000000..d7e74fe
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ExceptionCode.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.6
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.6
+ */
+class PHPUnit_Framework_Constraint_ExceptionCode extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var integer
+     */
+    protected $expectedCode;
+
+    /**
+     * @param integer $expected
+     */
+    public function __construct($expected)
+    {
+        $this->expectedCode = $expected;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param  Exception $other
+     * @return boolean
+     */
+    protected function matches($other)
+    {
+        return (string)$other->getCode() == (string)$this->expectedCode;
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          '%s is equal to expected exception code %s',
+          PHPUnit_Util_Type::export($other->getCode()),
+          PHPUnit_Util_Type::export($this->expectedCode)
+        );
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'exception code is ';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ExceptionMessage.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ExceptionMessage.php
new file mode 100644
index 0000000..4804403
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ExceptionMessage.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.6
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.6
+ */
+class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var integer
+     */
+    protected $expectedMessage;
+
+    /**
+     * @param string $expected
+     */
+    public function __construct($expected)
+    {
+        $this->expectedMessage = $expected;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param  Exception $other
+     * @return boolean
+     */
+    protected function matches($other)
+    {
+        return strpos($other->getMessage(), $this->expectedMessage) !== FALSE;
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          "exception message '%s' contains '%s'",
+          $other->getMessage(),
+          $this->expectedMessage
+        );
+    }
+
+    /**
+     * @return string
+     */
+    public function toString()
+    {
+        return 'exception message contains ';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/FileExists.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/FileExists.php
new file mode 100644
index 0000000..18622b4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/FileExists.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that checks if the file(name) that it is evaluated for exists.
+ *
+ * The file path to check is passed as $other in evaluate().
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_FileExists extends PHPUnit_Framework_Constraint
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return file_exists($other);
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          'file "%s" exists',
+
+          $other
+        );
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'file exists';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/GreaterThan.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/GreaterThan.php
new file mode 100644
index 0000000..53886d1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/GreaterThan.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the value it is evaluated for is greater
+ * than a given value.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_GreaterThan extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var numeric
+     */
+    protected $value;
+
+    /**
+     * @param numeric $value
+     */
+    public function __construct($value)
+    {
+        $this->value = $value;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return $this->value < $other;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is greater than ' . PHPUnit_Util_Type::export($this->value);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsAnything.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsAnything.php
new file mode 100644
index 0000000..74cecd7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsAnything.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that accepts any input value.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_IsAnything extends PHPUnit_Framework_Constraint
+{
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        return $returnResult ? TRUE : NULL;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is anything';
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     * @since  Method available since Release 3.5.0
+     */
+    public function count()
+    {
+        return 0;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsEmpty.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsEmpty.php
new file mode 100644
index 0000000..0ecce4e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsEmpty.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */
+
+/**
+ * Constraint that checks whether a variable is empty().
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.0
+ */
+class PHPUnit_Framework_Constraint_IsEmpty extends PHPUnit_Framework_Constraint
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return empty($other);
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is empty';
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        $type = gettype($other);
+
+        return sprintf(
+          '%s %s %s',
+
+          $type[0] == 'a' || $type[0] == 'o' ? 'an' : 'a',
+          $type,
+          $this->toString()
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsEqual.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsEqual.php
new file mode 100644
index 0000000..0879e6c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsEqual.php
@@ -0,0 +1,216 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Kore Nordmann <kn@ez.no>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that checks if one value is equal to another.
+ *
+ * Equality is checked with PHP's == operator, the operator is explained in
+ * detail at {@url http://www.php.net/manual/en/types.comparisons.php}.
+ * Two values are equal if they have the same value disregarding type.
+ *
+ * The expected value is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Kore Nordmann <kn@ez.no>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_IsEqual extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var mixed
+     */
+    protected $value;
+
+    /**
+     * @var float
+     */
+    protected $delta = 0;
+
+    /**
+     * @var integer
+     */
+    protected $maxDepth = 10;
+
+    /**
+     * @var boolean
+     */
+    protected $canonicalize = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $ignoreCase = FALSE;
+
+    /**
+     * @var PHPUnit_Framework_ComparisonFailure
+     */
+    protected $lastFailure;
+
+    /**
+     * @param mixed   $value
+     * @param float   $delta
+     * @param integer $maxDepth
+     * @param boolean $canonicalize
+     * @param boolean $ignoreCase
+     */
+    public function __construct($value, $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        if (!is_numeric($delta)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'numeric');
+        }
+
+        if (!is_int($maxDepth)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'integer');
+        }
+
+        if (!is_bool($canonicalize)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean');
+        }
+
+        if (!is_bool($ignoreCase)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(5, 'boolean');
+        }
+
+        $this->value        = $value;
+        $this->delta        = $delta;
+        $this->maxDepth     = $maxDepth;
+        $this->canonicalize = $canonicalize;
+        $this->ignoreCase   = $ignoreCase;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $comparatorFactory = PHPUnit_Framework_ComparatorFactory::getDefaultInstance();
+
+        try {
+            $comparator = $comparatorFactory->getComparatorFor(
+              $other, $this->value
+            );
+
+            $comparator->assertEquals(
+              $this->value,
+              $other,
+              $this->delta,
+              $this->canonicalize,
+              $this->ignoreCase
+            );
+        }
+
+        catch (PHPUnit_Framework_ComparisonFailure $f) {
+            if ($returnResult) {
+                return FALSE;
+            }
+
+            throw new PHPUnit_Framework_ExpectationFailedException(
+              trim($description . "\n" . $f->getMessage()),
+              $f
+            );
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        $delta = '';
+
+        if (is_string($this->value)) {
+            if (strpos($this->value, "\n") !== FALSE) {
+                return 'is equal to <text>';
+            } else {
+                return sprintf(
+                  'is equal to <string:%s>',
+
+                  $this->value
+                );
+            }
+        } else {
+            if ($this->delta != 0) {
+                $delta = sprintf(
+                  ' with delta <%F>',
+
+                  $this->delta
+                );
+            }
+
+            return sprintf(
+              'is equal to %s%s',
+
+              PHPUnit_Util_Type::export($this->value),
+              $delta
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsFalse.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsFalse.php
new file mode 100644
index 0000000..038d748
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsFalse.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * Constraint that accepts FALSE.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Framework_Constraint_IsFalse extends PHPUnit_Framework_Constraint
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return $other === FALSE;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is false';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsIdentical.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsIdentical.php
new file mode 100644
index 0000000..ba3d919
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsIdentical.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that one value is identical to another.
+ *
+ * Identical check is performed with PHP's === operator, the operator is
+ * explained in detail at
+ * {@url http://www.php.net/manual/en/types.comparisons.php}.
+ * Two values are identical if they have the same value and are of the same
+ * type.
+ *
+ * The expected value is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_IsIdentical extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var double
+     */
+    const EPSILON = 0.0000000001;
+
+    /**
+     * @var mixed
+     */
+    protected $value;
+
+    /**
+     * @param mixed $value
+     */
+    public function __construct($value)
+    {
+        $this->value = $value;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        if (is_double($this->value) && is_double($other) &&
+            !is_infinite($this->value) && !is_infinite($other)) {
+            $success = abs($this->value - $other) < self::EPSILON;
+        }
+
+        else {
+            $success = $this->value === $other;
+        }
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $f = NULL;
+
+            // if both values are strings, make sure a diff is generated
+            if (is_string($this->value) && is_string($other)) {
+                $f = new PHPUnit_Framework_ComparisonFailure(
+                  $this->value,
+                  $other,
+                  $this->value,
+                  $other
+                );
+            }
+
+            $this->fail($other, $description, $f);
+        }
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        if (is_object($this->value) && is_object($other)) {
+            return 'two variables reference the same object';
+        }
+
+        if (is_string($this->value) && is_string($other)) {
+            return 'two strings are identical';
+        }
+
+        return parent::failureDescription($other);
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        if (is_object($this->value)) {
+            return 'is identical to an object of class "' .
+                   get_class($this->value) . '"';
+        } else {
+            return 'is identical to ' .
+                   PHPUnit_Util_Type::export($this->value);
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsInstanceOf.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsInstanceOf.php
new file mode 100644
index 0000000..83c0472
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsInstanceOf.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the object it is evaluated for is an instance
+ * of a given class.
+ *
+ * The expected class name is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_IsInstanceOf extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $className;
+
+    /**
+     * @param string $className
+     */
+    public function __construct($className)
+    {
+        $this->className = $className;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return ($other instanceof $this->className);
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          '%s is an instance of class "%s"',
+
+          PHPUnit_Util_Type::shortenedExport($other),
+          $this->className
+        );
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          'is instance of class "%s"',
+
+          $this->className
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsNull.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsNull.php
new file mode 100644
index 0000000..90bf078
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsNull.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * Constraint that accepts NULL.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Framework_Constraint_IsNull extends PHPUnit_Framework_Constraint
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return $other === NULL;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is null';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsTrue.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsTrue.php
new file mode 100644
index 0000000..e1e50e5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsTrue.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * Constraint that accepts TRUE.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Framework_Constraint_IsTrue extends PHPUnit_Framework_Constraint
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return $other === TRUE;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is true';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsType.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsType.php
new file mode 100644
index 0000000..92d9ebf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/IsType.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the value it is evaluated for is of a
+ * specified type.
+ *
+ * The expected value is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_IsType extends PHPUnit_Framework_Constraint
+{
+    const TYPE_ARRAY    = 'array';
+    const TYPE_BOOL     = 'bool';
+    const TYPE_FLOAT    = 'float';
+    const TYPE_INT      = 'int';
+    const TYPE_NULL     = 'null';
+    const TYPE_NUMERIC  = 'numeric';
+    const TYPE_OBJECT   = 'object';
+    const TYPE_RESOURCE = 'resource';
+    const TYPE_STRING   = 'string';
+    const TYPE_SCALAR   = 'scalar';
+    const TYPE_CALLABLE = 'callable';
+
+    /**
+     * @var array
+     */
+    protected $types = array(
+      'array' => TRUE,
+      'boolean' => TRUE,
+      'bool' => TRUE,
+      'float' => TRUE,
+      'integer' => TRUE,
+      'int' => TRUE,
+      'null' => TRUE,
+      'numeric' => TRUE,
+      'object' => TRUE,
+      'resource' => TRUE,
+      'string' => TRUE,
+      'scalar' => TRUE,
+      'callable' => TRUE
+    );
+
+    /**
+     * @var string
+     */
+    protected $type;
+
+    /**
+     * @param  string $type
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function __construct($type)
+    {
+        if (!isset($this->types[$type])) {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'Type specified for PHPUnit_Framework_Constraint_IsType <%s> ' .
+                'is not a valid type.',
+                $type
+              )
+            );
+        }
+
+        $this->type = $type;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        switch ($this->type) {
+            case 'numeric': {
+                return is_numeric($other);
+            }
+
+            case 'integer':
+            case 'int': {
+                return is_integer($other);
+            }
+
+            case 'float': {
+                return is_float($other);
+            }
+
+            case 'string': {
+                return is_string($other);
+            }
+
+            case 'boolean':
+            case 'bool': {
+                return is_bool($other);
+            }
+
+            case 'null': {
+                return is_null($other);
+            }
+
+            case 'array': {
+                return is_array($other);
+            }
+
+            case 'object': {
+                return is_object($other);
+            }
+
+            case 'resource': {
+                return is_resource($other);
+            }
+
+            case 'scalar': {
+                return is_scalar($other);
+            }
+
+            case 'callable': {
+                return is_callable($other);
+            }
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          'is of type "%s"',
+
+          $this->type
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/JsonMatches.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/JsonMatches.php
new file mode 100644
index 0000000..03c44b9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/JsonMatches.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.7.0
+ */
+
+/**
+ * Asserts whether or not two JSON objects are equal.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2011 Bastian Feder <php@bastian-feder.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.7.0
+ */
+class PHPUnit_Framework_Constraint_JsonMatches extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $value;
+
+    /**
+     * Creates a new constraint.
+     *
+     * @param string $value
+     */
+    public function __construct($value)
+    {
+        $this->value = $value;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * This method can be overridden to implement the evaluation algorithm.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        $decodedOther = json_decode($other);
+        if (!is_object($decodedOther)) {
+            $this->failure_reason = $this->getJsonError();
+            return FALSE;
+        }
+
+        $decodedValue = json_decode($this->value);
+        if (!is_object($decodedValue)) {
+            $this->failure_reason = $this->getJsonError();
+            return FALSE;
+        }
+
+        return $decodedOther == $decodedValue;
+    }
+
+    /**
+     * Finds the last occurd JSON error.
+     *
+     * @param string $messagePrefix
+     * @return string The last JSON error prefixed with $messagePrefix.
+     */
+    protected function getJsonError($messagePrefix = 'Json error!')
+    {
+        return PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
+            json_last_error(),
+            $messagePrefix
+        );
+    }
+
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+            'matches JSON string "%s"',
+            $this->value
+        );
+    }
+}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php
new file mode 100644
index 0000000..d83b85e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/JsonMatches/ErrorMessageProvider.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.7.0
+ */
+
+/**
+ * Provides human readable messages for each JSON error.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2011 Bastian Feder <php@bastian-feder.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.7.0
+ */
+class PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider
+{
+    /**
+     * Translatets accourd JSON error to a human readable string.
+     *
+     * @param string $error
+     * @return string
+     */
+    public static function determineJsonError($error, $prefix = '')
+    {
+        switch (strtoupper($error)) {
+            case 'JSON_ERROR_NONE':
+                return;
+            case 'JSON_ERROR_DEPTH':
+                return $prefix . 'Maximum stack depth exceeded';
+            case 'JSON_ERROR_STATE_MISMATCH':
+                return $prefix . 'Underflow or the modes mismatch';
+            case 'JSON_ERROR_CTRL_CHAR':
+                return $prefix . 'Unexpected control character found';
+            case 'JSON_ERROR_SYNTAX':
+                return $prefix . 'Syntax error, malformed JSON';
+            case 'JSON_ERROR_UTF8':
+                return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded';
+            default:
+                return $prefix . 'Unknown error';
+        }
+    }
+
+    /**
+     * Translates a given type to a human readable message prefix.
+     *
+     * @param string $type
+     * @return string
+     */
+    public static function translateTypeToPrefix($type)
+    {
+        switch (strtolower($type)) {
+            case 'expected':
+                $prefix = 'Expected value JSON decode error - ';
+                break;
+            case 'actual':
+                $prefix = 'Actual value JSON decode error - ';
+                break;
+            default:
+                $prefix = '';
+                break;
+        }
+        return $prefix;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/LessThan.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/LessThan.php
new file mode 100644
index 0000000..7aae73f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/LessThan.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the value it is evaluated for is less than
+ * a given value.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_LessThan extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var numeric
+     */
+    protected $value;
+
+    /**
+     * @param numeric $value
+     */
+    public function __construct($value)
+    {
+        $this->value = $value;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return $this->value > $other;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'is less than ' . PHPUnit_Util_Type::export($this->value);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Not.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Not.php
new file mode 100644
index 0000000..a1c3200
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Not.php
@@ -0,0 +1,204 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Logical NOT.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+
+class PHPUnit_Framework_Constraint_Not extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var PHPUnit_Framework_Constraint
+     */
+    protected $constraint;
+
+    /**
+     * @param PHPUnit_Framework_Constraint $constraint
+     */
+    public function __construct($constraint)
+    {
+        if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
+            $constraint = new PHPUnit_Framework_Constraint_IsEqual($constraint);
+        }
+
+        $this->constraint = $constraint;
+    }
+
+    /**
+     * @param  string $string
+     * @return string
+     */
+    public static function negate($string)
+    {
+        return str_replace(
+          array(
+            'contains ',
+            'exists',
+            'has ',
+            'is ',
+            'are ',
+            'matches ',
+            'starts with ',
+            'ends with ',
+            'reference ',
+            'not not '
+          ),
+          array(
+            'does not contain ',
+            'does not exist',
+            'does not have ',
+            'is not ',
+            'are not ',
+            'does not match ',
+            'starts not with ',
+            'ends not with ',
+            'don\'t reference ',
+            'not '
+          ),
+          $string
+        );
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $success = !$this->constraint->evaluate($other, $description, TRUE);
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        switch (get_class($this->constraint)) {
+            case 'PHPUnit_Framework_Constraint_And':
+            case 'PHPUnit_Framework_Constraint_Not':
+            case 'PHPUnit_Framework_Constraint_Or': {
+                return 'not( ' . $this->constraint->failureDescription($other) . ' )';
+            }
+            break;
+
+            default: {
+                return self::negate(
+                  $this->constraint->failureDescription($other)
+                );
+            }
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        switch (get_class($this->constraint)) {
+            case 'PHPUnit_Framework_Constraint_And':
+            case 'PHPUnit_Framework_Constraint_Not':
+            case 'PHPUnit_Framework_Constraint_Or': {
+                return 'not( ' . $this->constraint->toString() . ' )';
+            }
+            break;
+
+            default: {
+                return self::negate(
+                  $this->constraint->toString()
+                );
+            }
+        }
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     * @since  Method available since Release 3.4.0
+     */
+    public function count()
+    {
+        return count($this->constraint);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ObjectHasAttribute.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ObjectHasAttribute.php
new file mode 100644
index 0000000..2b2760d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/ObjectHasAttribute.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the object it is evaluated for has a given
+ * attribute.
+ *
+ * The attribute name is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_ObjectHasAttribute extends PHPUnit_Framework_Constraint_ClassHasAttribute
+{
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        $object = new ReflectionObject($other);
+
+        return $object->hasProperty($this->attributeName);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Or.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Or.php
new file mode 100644
index 0000000..ac90742
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Or.php
@@ -0,0 +1,158 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Logical OR.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_Or extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var PHPUnit_Framework_Constraint[]
+     */
+    protected $constraints = array();
+
+    /**
+     * @param PHPUnit_Framework_Constraint[] $constraints
+     */
+    public function setConstraints(array $constraints)
+    {
+        $this->constraints = array();
+
+        foreach ($constraints as $key => $constraint) {
+            if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
+                $constraint = new PHPUnit_Framework_Constraint_IsEqual(
+                  $constraint
+                );
+            }
+
+            $this->constraints[] = $constraint;
+        }
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $success = FALSE;
+        $constraint = NULL;
+
+        foreach ($this->constraints as $constraint) {
+            if ($constraint->evaluate($other, $description, TRUE)) {
+                $success = TRUE;
+                break;
+            }
+        }
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        $text = '';
+
+        foreach ($this->constraints as $key => $constraint) {
+            if ($key > 0) {
+                $text .= ' or ';
+            }
+
+            $text .= $constraint->toString();
+        }
+
+        return $text;
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     * @since  Method available since Release 3.4.0
+     */
+    public function count()
+    {
+        $count = 0;
+
+        foreach ($this->constraints as $constraint) {
+            $count += count($constraint);
+        }
+
+        return $count;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/PCREMatch.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/PCREMatch.php
new file mode 100644
index 0000000..3763a0b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/PCREMatch.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the string it is evaluated for matches
+ * a regular expression.
+ *
+ * Checks a given value using the Perl Compatible Regular Expression extension
+ * in PHP. The pattern is matched by executing preg_match().
+ *
+ * The pattern string passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_PCREMatch extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $pattern;
+
+    /**
+     * @param string $pattern
+     */
+    public function __construct($pattern)
+    {
+        $this->pattern = $pattern;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return preg_match($this->pattern, $other) > 0;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          'matches PCRE pattern "%s"',
+
+          $this->pattern
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/SameSize.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/SameSize.php
new file mode 100644
index 0000000..cebdfd8
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/SameSize.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_Constraint_SameSize extends PHPUnit_Framework_Constraint_Count
+{
+    /**
+     * @var integer
+     */
+    protected $expectedCount;
+
+    /**
+     * @param integer $expected
+     */
+    public function __construct($expected)
+    {
+        $this->expectedCount = $this->getCountOf($expected);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringContains.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringContains.php
new file mode 100644
index 0000000..2dadb85
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringContains.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the string it is evaluated for contains
+ * a given string.
+ *
+ * Uses strpos() to find the position of the string in the input, if not found
+ * the evaluaton fails.
+ *
+ * The sub-string is passed in the constructor.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_StringContains extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $string;
+
+    /**
+     * @var boolean
+     */
+    protected $ignoreCase;
+
+    /**
+     * @param string  $string
+     * @param boolean $ignoreCase
+     */
+    public function __construct($string, $ignoreCase = FALSE)
+    {
+        $this->string     = $string;
+        $this->ignoreCase = $ignoreCase;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        if ($this->ignoreCase) {
+            return stripos($other, $this->string) !== FALSE;
+        } else {
+            return strpos($other, $this->string) !== FALSE;
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        if ($this->ignoreCase) {
+            $string = strtolower($this->string);
+        } else {
+            $string = $this->string;
+        }
+
+        return sprintf(
+          'contains "%s"',
+
+          $string
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringEndsWith.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringEndsWith.php
new file mode 100644
index 0000000..3bc7982
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringEndsWith.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Constraint that asserts that the string it is evaluated for ends with a given
+ * suffix.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Framework_Constraint_StringEndsWith extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $suffix;
+
+    /**
+     * @param string $suffix
+     */
+    public function __construct($suffix)
+    {
+        $this->suffix = $suffix;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return substr($other, 0 - strlen($this->suffix)) == $this->suffix;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'ends with "' . $this->suffix . '"';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringMatches.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringMatches.php
new file mode 100644
index 0000000..914ff76
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringMatches.php
@@ -0,0 +1,135 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */
+
+/**
+ * ...
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.0
+ */
+class PHPUnit_Framework_Constraint_StringMatches extends PHPUnit_Framework_Constraint_PCREMatch
+{
+    /**
+     * @var string
+     */
+    protected $string;
+
+    /**
+     * @param string $string
+     */
+    public function __construct($string)
+    {
+        $this->pattern = $this->createPatternFromFormat(
+            preg_replace('/\r\n/', "\n", $string)
+        );
+        $this->string  = $string;
+    }
+
+    protected function failureDescription($other)
+    {
+        return "format description matches text";
+    }
+
+    protected function additionalFailureDescription($other)
+    {
+        $from = preg_split('(\r\n|\r|\n)', $this->string);
+        $to = preg_split('(\r\n|\r|\n)', $other);
+        foreach ($from as $index => $line) {
+            if (isset($to[$index]) && $line !== $to[$index]) {
+                $line = $this->createPatternFromFormat($line);
+                if (preg_match($line, $to[$index]) > 0) {
+                    $from[$index] = $to[$index];
+                }
+            }
+        }
+        $this->string = join("\n", $from);
+        $other = join("\n", $to);
+        return PHPUnit_Util_Diff::diff($this->string, $other);
+    }
+
+    protected function createPatternFromFormat($string)
+    {
+        $string = str_replace(
+          array(
+            '%e',
+            '%s',
+            '%S',
+            '%a',
+            '%A',
+            '%w',
+            '%i',
+            '%d',
+            '%x',
+            '%f',
+            '%c'
+          ),
+          array(
+            '\\' . DIRECTORY_SEPARATOR,
+            '[^\r\n]+',
+            '[^\r\n]*',
+            '.+',
+            '.*',
+            '\s*',
+            '[+-]?\d+',
+            '\d+',
+            '[0-9a-fA-F]+',
+            '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?',
+            '.'
+          ),
+          preg_quote($string, '/')
+        );
+        return '/^' . $string . '$/s';
+    }
+
+}
+
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringStartsWith.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringStartsWith.php
new file mode 100644
index 0000000..ee348d3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/StringStartsWith.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Constraint that asserts that the string it is evaluated for begins with a
+ * given prefix.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Framework_Constraint_StringStartsWith extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var string
+     */
+    protected $prefix;
+
+    /**
+     * @param string $prefix
+     */
+    public function __construct($prefix)
+    {
+        $this->prefix = $prefix;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        return strpos($other, $this->prefix) === 0;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'starts with "' . $this->prefix . '"';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/TraversableContains.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/TraversableContains.php
new file mode 100644
index 0000000..7c3e567
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/TraversableContains.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Constraint that asserts that the Traversable it is applied to contains
+ * a given value.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_TraversableContains extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var boolean
+     */
+    protected $checkForObjectIdentity;
+
+    /**
+     * @var mixed
+     */
+    protected $value;
+
+    /**
+     * @param  boolean $value
+     * @param  mixed   $checkForObjectIdentity
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function __construct($value, $checkForObjectIdentity = TRUE)
+    {
+        if (!is_bool($checkForObjectIdentity)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean');
+        }
+
+        $this->checkForObjectIdentity = $checkForObjectIdentity;
+        $this->value                  = $value;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other. Returns TRUE if the
+     * constraint is met, FALSE otherwise.
+     *
+     * @param mixed $other Value or object to evaluate.
+     * @return bool
+     */
+    protected function matches($other)
+    {
+        if ($other instanceof SplObjectStorage) {
+            return $other->contains($this->value);
+        }
+
+        if (is_object($this->value)) {
+            foreach ($other as $element) {
+                if (($this->checkForObjectIdentity &&
+                     $element === $this->value) ||
+                    (!$this->checkForObjectIdentity &&
+                     $element == $this->value)) {
+                    return TRUE;
+                }
+            }
+        } else {
+            foreach ($other as $element) {
+                if ($element == $this->value) {
+                    return TRUE;
+                }
+            }
+        }
+
+        return FALSE;
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        if (is_string($this->value) && strpos($this->value, "\n") !== FALSE) {
+            return 'contains "' . $this->value . '"';
+        } else {
+            return 'contains ' . PHPUnit_Util_Type::export($this->value);
+        }
+    }
+
+    /**
+     * Returns the description of the failure
+     *
+     * The beginning of failure messages is "Failed asserting that" in most
+     * cases. This method should return the second part of that sentence.
+     *
+     * @param  mixed $other Evaluated value or object.
+     * @return string
+     */
+    protected function failureDescription($other)
+    {
+        return sprintf(
+          'an %s %s',
+
+           is_array($other) ? 'array' : 'iterator',
+           $this->toString()
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/TraversableContainsOnly.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/TraversableContainsOnly.php
new file mode 100644
index 0000000..1d38753
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/TraversableContainsOnly.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.4
+ */
+
+/**
+ * Constraint that asserts that the Traversable it is applied to contains
+ * only values of a given type.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.4
+ */
+class PHPUnit_Framework_Constraint_TraversableContainsOnly extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var PHPUnit_Framework_Constraint
+     */
+    protected $constraint;
+
+    /**
+     * @var string
+     */
+    protected $type;
+
+    /**
+     * @param string  $type
+     * @param boolean $isNativeType
+     */
+    public function __construct($type, $isNativeType = TRUE)
+    {
+        if ($isNativeType) {
+            $this->constraint = new PHPUnit_Framework_Constraint_IsType($type);
+        } else {
+            $this->constraint = new PHPUnit_Framework_Constraint_IsInstanceOf(
+              $type
+            );
+        }
+
+        $this->type = $type;
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $success = TRUE;
+        $constraint = NULL;
+
+        foreach ($other as $item) {
+            if (!$this->constraint->evaluate($item, '', TRUE)) {
+                $success = FALSE;
+                break;
+            }
+        }
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'contains only values of type "' . $this->type . '"';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Xor.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Xor.php
new file mode 100644
index 0000000..0fdae07
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Constraint/Xor.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Logical XOR.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Constraint
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_Constraint_Xor extends PHPUnit_Framework_Constraint
+{
+    /**
+     * @var PHPUnit_Framework_Constraint[]
+     */
+    protected $constraints = array();
+
+    /**
+     * @param PHPUnit_Framework_Constraint[] $constraints
+     */
+    public function setConstraints(array $constraints)
+    {
+        $this->constraints = array();
+
+        foreach ($constraints as $key => $constraint) {
+            if (!($constraint instanceof PHPUnit_Framework_Constraint)) {
+                $constraint = new PHPUnit_Framework_Constraint_IsEqual(
+                  $constraint
+                );
+            }
+
+            $this->constraints[] = $constraint;
+        }
+    }
+
+    /**
+     * Evaluates the constraint for parameter $other
+     *
+     * If $returnResult is set to FALSE (the default), an exception is thrown
+     * in case of a failure. NULL is returned otherwise.
+     *
+     * If $returnResult is TRUE, the result of the evaluation is returned as
+     * a boolean value instead: TRUE in case of success, FALSE in case of a
+     * failure.
+     *
+     * @param  mixed $other Value or object to evaluate.
+     * @param  string $description Additional information about the test
+     * @param  bool $returnResult Whether to return a result or throw an exception
+     * @return mixed
+     * @throws PHPUnit_Framework_ExpectationFailedException
+     */
+    public function evaluate($other, $description = '', $returnResult = FALSE)
+    {
+        $success = TRUE;
+        $lastResult = NULL;
+        $constraint = NULL;
+
+        foreach ($this->constraints as $constraint) {
+            $result = $constraint->evaluate($other, $description, TRUE);
+
+            if ($result === $lastResult) {
+                $success = FALSE;
+                break;
+            }
+
+            $lastResult = $result;
+        }
+
+        if ($returnResult) {
+            return $success;
+        }
+
+        if (!$success) {
+            $this->fail($other, $description);
+        }
+    }
+
+    /**
+     * Returns a string representation of the constraint.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        $text = '';
+
+        foreach ($this->constraints as $key => $constraint) {
+            if ($key > 0) {
+                $text .= ' xor ';
+            }
+
+            $text .= $constraint->toString();
+        }
+
+        return $text;
+    }
+
+    /**
+     * Counts the number of constraint elements.
+     *
+     * @return integer
+     * @since  Method available since Release 3.4.0
+     */
+    public function count()
+    {
+        $count = 0;
+
+        foreach ($this->constraints as $constraint) {
+            $count += count($constraint);
+        }
+
+        return $count;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error.php
new file mode 100644
index 0000000..5c3f84d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.2.0
+ */
+
+/**
+ * Wrapper for PHP errors.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.2.0
+ */
+class PHPUnit_Framework_Error extends Exception
+{
+    /**
+     * Constructor.
+     *
+     * @param  string     $message
+     * @param  integer    $code
+     * @param  string     $file
+     * @param  integer    $line
+     * @param  Exception  $previous
+     */
+    public function __construct($message, $code, $file, $line, Exception $previous = NULL)
+    {
+        parent::__construct($message, $code, $previous);
+
+        $this->file  = $file;
+        $this->line  = $line;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Deprecated.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Deprecated.php
new file mode 100644
index 0000000..b01f7b0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Deprecated.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Error
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * Wrapper for PHP deprecated errors.
+ * You can disable deprecated-to-exception conversion by setting
+ *
+ * <code>
+ * PHPUnit_Framework_Error_Deprecated::$enabled = FALSE;
+ * </code>
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Error
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Framework_Error_Deprecated extends PHPUnit_Framework_Error
+{
+    public static $enabled = TRUE;
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Notice.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Notice.php
new file mode 100644
index 0000000..a57ce6c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Notice.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Error
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * Wrapper for PHP notices.
+ * You can disable notice-to-exception conversion by setting
+ *
+ * <code>
+ * PHPUnit_Framework_Error_Notice::$enabled = FALSE;
+ * </code>
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Error
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Framework_Error_Notice extends PHPUnit_Framework_Error
+{
+    public static $enabled = TRUE;
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Warning.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Warning.php
new file mode 100644
index 0000000..11c7ac6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Error/Warning.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Error
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ * Wrapper for PHP warnings.
+ * You can disable notice-to-exception conversion by setting
+ *
+ * <code>
+ * PHPUnit_Framework_Error_Warning::$enabled = FALSE;
+ * </code>
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_Error
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Framework_Error_Warning extends PHPUnit_Framework_Error
+{
+    public static $enabled = TRUE;
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Exception.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Exception.php
new file mode 100644
index 0000000..a5baede
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Exception.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Exception for PHPUnit runtime errors.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Framework_Exception extends RuntimeException
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/ExpectationFailedException.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/ExpectationFailedException.php
new file mode 100644
index 0000000..a853e1e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/ExpectationFailedException.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Exception for expectations which failed their check.
+ *
+ * The exception contains the error message and optionally a
+ * PHPUnit_Framework_ComparisonFailure which is used to
+ * generate diff output of the failed expectations.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_ExpectationFailedException extends PHPUnit_Framework_AssertionFailedError
+{
+    /**
+     * @var PHPUnit_Framework_ComparisonFailure
+     */
+    protected $comparisonFailure;
+
+    public function __construct($message, PHPUnit_Framework_ComparisonFailure $comparisonFailure = NULL, Exception $previous = NULL)
+    {
+        $this->comparisonFailure = $comparisonFailure;
+
+        parent::__construct($message, 0, $previous);
+    }
+
+    /**
+     * @return PHPUnit_Framework_ComparisonFailure
+     */
+    public function getComparisonFailure()
+    {
+        return $this->comparisonFailure;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/IncompleteTest.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/IncompleteTest.php
new file mode 100644
index 0000000..86065d0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/IncompleteTest.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A marker interface for marking any exception/error as result of an unit
+ * test as incomplete implementation or currently not implemented.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 2.0.0
+ */
+interface PHPUnit_Framework_IncompleteTest
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/IncompleteTestError.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/IncompleteTestError.php
new file mode 100644
index 0000000..fc74627
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/IncompleteTestError.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
+ * case of an incomplete test.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_IncompleteTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_IncompleteTest
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/OutputError.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/OutputError.php
new file mode 100644
index 0000000..e874b7d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/OutputError.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
+ * case of a test that printed output.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Framework_OutputError extends PHPUnit_Framework_AssertionFailedError
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Process/TestCaseMethod.tpl.dist b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Process/TestCaseMethod.tpl.dist
new file mode 100644
index 0000000..369e3ed
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Process/TestCaseMethod.tpl.dist
@@ -0,0 +1,51 @@
+<?php
+set_include_path('{include_path}');
+require 'PHPUnit/Autoload.php';
+ob_start();
+
+function __phpunit_run_isolated_test()
+{
+    if (!class_exists('{className}')) {
+        require_once '{filename}';
+    }
+
+    $result = new PHPUnit_Framework_TestResult;
+
+    if ({collectCodeCoverageInformation}) {
+        $result->setCodeCoverage(new PHP_CodeCoverage);
+    }
+
+    $result->strictMode({strict});
+
+    $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}');
+    $test->setDependencyInput(unserialize('{dependencyInput}'));
+    $test->setInIsolation(TRUE);
+
+    ob_end_clean();
+    ob_start();
+    $test->run($result);
+    $output = ob_get_clean();
+
+    print serialize(
+      array(
+        'testResult'    => $test->getResult(),
+        'numAssertions' => $test->getNumAssertions(),
+        'result'        => $result,
+        'output'        => $output
+      )
+    );
+
+    ob_start();
+}
+
+{constants}
+{included_files}
+{globals}
+
+if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) {
+    require_once $GLOBALS['__PHPUNIT_BOOTSTRAP'];
+    unset($GLOBALS['__PHPUNIT_BOOTSTRAP']);
+}
+
+__phpunit_run_isolated_test();
+ob_end_clean();
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/SelfDescribing.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SelfDescribing.php
new file mode 100644
index 0000000..754327c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SelfDescribing.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Interface for classes that can return a description of itself.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 3.0.0
+ */
+interface PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * Returns a string representation of the object.
+     *
+     * @return string
+     */
+    public function toString();
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTest.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTest.php
new file mode 100644
index 0000000..f1844fd
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTest.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * A marker interface for marking a unit test as being skipped.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 3.0.0
+ */
+interface PHPUnit_Framework_SkippedTest
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTestError.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTestError.php
new file mode 100644
index 0000000..5d32c08
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTestError.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
+ * case of a skipped test.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Framework_SkippedTestError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTestSuiteError.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTestSuiteError.php
new file mode 100644
index 0000000..b90c239
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SkippedTestSuiteError.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.0
+ */
+
+/**
+ * Extension to PHPUnit_Framework_AssertionFailedError to mark the special
+ * case of a skipped test suite.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.0
+ */
+class PHPUnit_Framework_SkippedTestSuiteError extends PHPUnit_Framework_AssertionFailedError implements PHPUnit_Framework_SkippedTest
+{
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/SyntheticError.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SyntheticError.php
new file mode 100644
index 0000000..8bb2ca2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/SyntheticError.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.0
+ */
+
+/**
+ * Creates a synthetic failed assertion.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.0
+ */
+class PHPUnit_Framework_SyntheticError extends PHPUnit_Framework_AssertionFailedError
+{
+    /**
+     * The synthetic file.
+     *
+     * @var string
+     */
+    protected $syntheticFile = '';
+
+    /**
+     * The synthetic line number.
+     *
+     * @var integer
+     */
+    protected $syntheticLine = 0;
+
+    /**
+     * The synthetic trace.
+     *
+     * @var array
+     */
+    protected $syntheticTrace = array();
+
+    /**
+     * Constructor.
+     *
+     * @param string  $message
+     * @param integer $code
+     * @param string  $file
+     * @param integer $line
+     * @param array   $trace
+     */
+    public function __construct($message, $code, $file, $line, $trace)
+    {
+        parent::__construct($message, $code);
+
+        $this->syntheticFile  = $file;
+        $this->syntheticLine  = $line;
+        $this->syntheticTrace = $trace;
+    }
+
+    /**
+     * @return string
+     */
+    public function getSyntheticFile()
+    {
+        return $this->syntheticFile;
+    }
+
+    /**
+     * @return integer
+     */
+    public function getSyntheticLine()
+    {
+        return $this->syntheticLine;
+    }
+
+    /**
+     * @return array
+     */
+    public function getSyntheticTrace()
+    {
+        return $this->syntheticTrace;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Test.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Test.php
new file mode 100644
index 0000000..1b507c6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Test.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A Test can be run and collect its results.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 2.0.0
+ */
+interface PHPUnit_Framework_Test extends Countable
+{
+    /**
+     * Runs a test and collects its result in a TestResult instance.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     * @return PHPUnit_Framework_TestResult
+     */
+    public function run(PHPUnit_Framework_TestResult $result = NULL);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php
new file mode 100644
index 0000000..ee667df
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php
@@ -0,0 +1,1880 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A TestCase defines the fixture to run multiple tests.
+ *
+ * To define a TestCase
+ *
+ *   1) Implement a subclass of PHPUnit_Framework_TestCase.
+ *   2) Define instance variables that store the state of the fixture.
+ *   3) Initialize the fixture state by overriding setUp().
+ *   4) Clean-up after a test by overriding tearDown().
+ *
+ * Each test runs in its own fixture so there can be no side effects
+ * among test runs.
+ *
+ * Here is an example:
+ *
+ * <code>
+ * <?php
+ * class MathTest extends PHPUnit_Framework_TestCase
+ * {
+ *     public $value1;
+ *     public $value2;
+ *
+ *     protected function setUp()
+ *     {
+ *         $this->value1 = 2;
+ *         $this->value2 = 3;
+ *     }
+ * }
+ * ?>
+ * </code>
+ *
+ * For each test implement a method which interacts with the fixture.
+ * Verify the expected results with assertions specified by calling
+ * assert with a boolean.
+ *
+ * <code>
+ * <?php
+ * public function testPass()
+ * {
+ *     $this->assertTrue($this->value1 + $this->value2 == 5);
+ * }
+ * ?>
+ * </code>
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing
+{
+    /**
+     * Enable or disable the backup and restoration of the $GLOBALS array.
+     * Overwrite this attribute in a child class of TestCase.
+     * Setting this attribute in setUp() has no effect!
+     *
+     * @var boolean
+     */
+    protected $backupGlobals = NULL;
+
+    /**
+     * @var array
+     */
+    protected $backupGlobalsBlacklist = array();
+
+    /**
+     * Enable or disable the backup and restoration of static attributes.
+     * Overwrite this attribute in a child class of TestCase.
+     * Setting this attribute in setUp() has no effect!
+     *
+     * @var boolean
+     */
+    protected $backupStaticAttributes = NULL;
+
+    /**
+     * @var array
+     */
+    protected $backupStaticAttributesBlacklist = array();
+
+    /**
+     * Whether or not this test is to be run in a separate PHP process.
+     *
+     * @var boolean
+     */
+    protected $runTestInSeparateProcess = NULL;
+
+    /**
+     * Whether or not this test should preserve the global state when
+     * running in a separate PHP process.
+     *
+     * @var boolean
+     */
+    protected $preserveGlobalState = TRUE;
+
+    /**
+     * Whether or not this test is running in a separate PHP process.
+     *
+     * @var boolean
+     */
+    private $inIsolation = FALSE;
+
+    /**
+     * @var array
+     */
+    private $data = array();
+
+    /**
+     * @var string
+     */
+    private $dataName = '';
+
+    /**
+     * @var boolean
+     */
+    private $useErrorHandler = NULL;
+
+    /**
+     * @var boolean
+     */
+    private $useOutputBuffering = NULL;
+
+    /**
+     * The name of the expected Exception.
+     *
+     * @var mixed
+     */
+    private $expectedException = NULL;
+
+    /**
+     * The message of the expected Exception.
+     *
+     * @var string
+     */
+    private $expectedExceptionMessage = '';
+
+    /**
+     * The code of the expected Exception.
+     *
+     * @var integer
+     */
+    private $expectedExceptionCode;
+
+    /**
+     * The required preconditions for a test.
+     *
+     * @var array
+     */
+    private $required = array(
+        'PHP' => NULL,
+        'PHPUnit' => NULL,
+        'functions' => array(),
+        'extensions' => array()
+    );
+
+    /**
+     * The name of the test case.
+     *
+     * @var string
+     */
+    private $name = NULL;
+
+    /**
+     * @var array
+     */
+    private $dependencies = array();
+
+    /**
+     * @var array
+     */
+    private $dependencyInput = array();
+
+    /**
+     * @var array
+     */
+    private $iniSettings = array();
+
+    /**
+     * @var array
+     */
+    private $locale = array();
+
+    /**
+     * @var array
+     */
+    private $mockObjects = array();
+
+    /**
+     * @var integer
+     */
+    private $status;
+
+    /**
+     * @var string
+     */
+    private $statusMessage = '';
+
+    /**
+     * @var integer
+     */
+    private $numAssertions = 0;
+
+    /**
+     * @var PHPUnit_Framework_TestResult
+     */
+    private $result;
+
+    /**
+     * @var mixed
+     */
+    private $testResult;
+
+    /**
+     * @var string
+     */
+    private $output = '';
+
+    /**
+     * @var string
+     */
+    private $outputExpectedRegex = NULL;
+
+    /**
+     * @var string
+     */
+    private $outputExpectedString = NULL;
+
+    /**
+     * @var bool
+     */
+    private $hasPerformedExpectationsOnOutput = FALSE;
+
+    /**
+     * @var mixed
+     */
+    private $outputCallback = FALSE;
+
+    /**
+     * @var boolean
+     */
+    private $outputBufferingActive = FALSE;
+
+    /**
+     * Constructs a test case with the given name.
+     *
+     * @param  string $name
+     * @param  array  $data
+     * @param  string $dataName
+     */
+    public function __construct($name = NULL, array $data = array(), $dataName = '')
+    {
+        if ($name !== NULL) {
+            $this->setName($name);
+        }
+
+        $this->data     = $data;
+        $this->dataName = $dataName;
+    }
+
+    /**
+     * Returns a string representation of the test case.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        $class = new ReflectionClass($this);
+
+        $buffer = sprintf(
+          '%s::%s',
+
+          $class->name,
+          $this->getName(FALSE)
+        );
+
+        return $buffer . $this->getDataSetAsString();
+    }
+
+    /**
+     * Counts the number of test cases executed by run(TestResult result).
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return 1;
+    }
+
+    /**
+     * Returns the annotations for this test.
+     *
+     * @return array
+     * @since Method available since Release 3.4.0
+     */
+    public function getAnnotations()
+    {
+        return PHPUnit_Util_Test::parseTestMethodAnnotations(
+          get_class($this), $this->name
+        );
+    }
+
+    /**
+     * Gets the name of a TestCase.
+     *
+     * @param  boolean $withDataSet
+     * @return string
+     */
+    public function getName($withDataSet = TRUE)
+    {
+        if ($withDataSet) {
+            return $this->name . $this->getDataSetAsString(FALSE);
+        } else {
+            return $this->name;
+        }
+    }
+
+    /**
+     * Returns the size of the test.
+     *
+     * @return integer
+     * @since  Method available since Release 3.6.0
+     */
+    public function getSize()
+    {
+        return PHPUnit_Util_Test::getSize(
+          get_class($this), $this->getName(FALSE)
+        );
+    }
+
+    /**
+     * @return string
+     * @since  Method available since Release 3.6.0
+     */
+    public function getActualOutput()
+    {
+        if (!$this->outputBufferingActive) {
+            return $this->output;
+        } else {
+            return ob_get_contents();
+        }
+    }
+
+    /**
+     * @return string
+     * @since  Method available since Release 3.6.0
+     */
+    public function hasOutput()
+    {
+        if (empty($this->output)) {
+            return FALSE;
+        }
+
+        if ($this->outputExpectedString !== NULL ||
+            $this->outputExpectedRegex  !== NULL ||
+            $this->hasPerformedExpectationsOnOutput) {
+            return FALSE;
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * @param string $expectedRegex
+     * @since Method available since Release 3.6.0
+     */
+    public function expectOutputRegex($expectedRegex)
+    {
+        if ($this->outputExpectedString !== NULL) {
+            throw new PHPUnit_Framework_Exception;
+        }
+
+        if (is_string($expectedRegex) || is_null($expectedRegex)) {
+            $this->outputExpectedRegex = $expectedRegex;
+        }
+    }
+
+    /**
+     * @param string $expectedString
+     * @since Method available since Release 3.6.0
+     */
+    public function expectOutputString($expectedString)
+    {
+        if ($this->outputExpectedRegex !== NULL) {
+            throw new PHPUnit_Framework_Exception;
+        }
+
+        if (is_string($expectedString) || is_null($expectedString)) {
+            $this->outputExpectedString = $expectedString;
+        }
+    }
+
+    /**
+     * @return bool
+     * @since Method available since Release 3.6.5
+     */
+    public function hasPerformedExpectationsOnOutput()
+    {
+        return $this->hasPerformedExpectationsOnOutput;
+    }
+
+    /**
+     * @return string
+     * @since  Method available since Release 3.2.0
+     */
+    public function getExpectedException()
+    {
+        return $this->expectedException;
+    }
+
+    /**
+     * @param  mixed   $exceptionName
+     * @param  string  $exceptionMessage
+     * @param  integer $exceptionCode
+     * @since  Method available since Release 3.2.0
+     */
+    public function setExpectedException($exceptionName, $exceptionMessage = '', $exceptionCode = NULL)
+    {
+        $this->expectedException        = $exceptionName;
+        $this->expectedExceptionMessage = $exceptionMessage;
+        $this->expectedExceptionCode    = $exceptionCode;
+    }
+
+    /**
+     * @since  Method available since Release 3.4.0
+     */
+    protected function setExpectedExceptionFromAnnotation()
+    {
+        try {
+            $expectedException = PHPUnit_Util_Test::getExpectedException(
+              get_class($this), $this->name
+            );
+
+            if ($expectedException !== FALSE) {
+                $this->setExpectedException(
+                  $expectedException['class'],
+                  $expectedException['message'],
+                  $expectedException['code']
+                );
+            }
+        }
+
+        catch (ReflectionException $e) {
+        }
+    }
+
+    /**
+     * @param boolean $useErrorHandler
+     * @since Method available since Release 3.4.0
+     */
+    public function setUseErrorHandler($useErrorHandler)
+    {
+        $this->useErrorHandler = $useErrorHandler;
+    }
+
+    /**
+     * @since Method available since Release 3.4.0
+     */
+    protected function setUseErrorHandlerFromAnnotation()
+    {
+        try {
+            $useErrorHandler = PHPUnit_Util_Test::getErrorHandlerSettings(
+              get_class($this), $this->name
+            );
+
+            if ($useErrorHandler !== NULL) {
+                $this->setUseErrorHandler($useErrorHandler);
+            }
+        }
+
+        catch (ReflectionException $e) {
+        }
+    }
+
+    /**
+     * @param boolean $useOutputBuffering
+     * @since Method available since Release 3.4.0
+     */
+    public function setUseOutputBuffering($useOutputBuffering)
+    {
+        $this->useOutputBuffering = $useOutputBuffering;
+    }
+
+    /**
+     * @since Method available since Release 3.4.0
+     */
+    protected function setUseOutputBufferingFromAnnotation()
+    {
+        try {
+            $useOutputBuffering = PHPUnit_Util_Test::getOutputBufferingSettings(
+              get_class($this), $this->name
+            );
+
+            if ($useOutputBuffering !== NULL) {
+                $this->setUseOutputBuffering($useOutputBuffering);
+            }
+        }
+
+        catch (ReflectionException $e) {
+        }
+    }
+
+    /**
+     * @since Method available since Release 3.6.0
+     */
+    protected function setRequirementsFromAnnotation()
+    {
+        try {
+            $requirements = PHPUnit_Util_Test::getRequirements(
+              get_class($this), $this->name
+            );
+
+            if (isset($requirements['PHP'])) {
+                $this->required['PHP'] = $requirements['PHP'];
+            }
+
+            if (isset($requirements['PHPUnit'])) {
+                $this->required['PHPUnit'] = $requirements['PHPUnit'];
+            }
+
+            if (isset($requirements['extensions'])) {
+                $this->required['extensions'] = $requirements['extensions'];
+            }
+
+            if (isset($requirements['functions'])) {
+                $this->required['functions'] = $requirements['functions'];
+            }
+        }
+
+        catch (ReflectionException $e) {
+        }
+    }
+
+    /**
+     * @since Method available since Release 3.6.0
+     */
+    protected function checkRequirements()
+    {
+        $this->setRequirementsFromAnnotation();
+
+        $missingRequirements = array();
+
+        if ($this->required['PHP'] &&
+            version_compare(PHP_VERSION, $this->required['PHP'], '<')) {
+            $missingRequirements[] = sprintf(
+              'PHP %s (or later) is required.',
+              $this->required['PHP']
+            );
+        }
+
+        $phpunitVersion = PHPUnit_Runner_Version::id();
+        if ($this->required['PHPUnit'] &&
+            version_compare($phpunitVersion, $this->required['PHPUnit'], '<')) {
+            $missingRequirements[] = sprintf(
+              'PHPUnit %s (or later) is required.',
+              $this->required['PHPUnit']
+            );
+        }
+
+        foreach ($this->required['functions'] as $requiredFunction) {
+            if (!function_exists($requiredFunction)) {
+                $missingRequirements[] = sprintf(
+                  'Function %s is required.',
+                  $requiredFunction
+                );
+            }
+        }
+
+        foreach ($this->required['extensions'] as $requiredExtension) {
+            if (!extension_loaded($requiredExtension)) {
+                $missingRequirements[] = sprintf(
+                  'Extension %s is required.',
+                  $requiredExtension
+                );
+            }
+        }
+
+        if ($missingRequirements) {
+            $this->markTestSkipped(
+              implode(
+                PHP_EOL,
+                $missingRequirements
+              )
+            );
+        }
+    }
+
+    /**
+     * Returns the status of this test.
+     *
+     * @return integer
+     * @since  Method available since Release 3.1.0
+     */
+    public function getStatus()
+    {
+        return $this->status;
+    }
+
+    /**
+     * Returns the status message of this test.
+     *
+     * @return string
+     * @since  Method available since Release 3.3.0
+     */
+    public function getStatusMessage()
+    {
+        return $this->statusMessage;
+    }
+
+    /**
+     * Returns whether or not this test has failed.
+     *
+     * @return boolean
+     * @since  Method available since Release 3.0.0
+     */
+    public function hasFailed()
+    {
+        $status = $this->getStatus();
+
+        return $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE ||
+               $status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
+    }
+
+    /**
+     * Runs the test case and collects the results in a TestResult object.
+     * If no TestResult object is passed a new one will be created.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     * @return PHPUnit_Framework_TestResult
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function run(PHPUnit_Framework_TestResult $result = NULL)
+    {
+        if ($result === NULL) {
+            $result = $this->createResult();
+        }
+
+        if (!$this instanceof PHPUnit_Framework_Warning) {
+            $this->setTestResultObject($result);
+            $this->setUseErrorHandlerFromAnnotation();
+            $this->setUseOutputBufferingFromAnnotation();
+        }
+
+        if ($this->useErrorHandler !== NULL) {
+            $oldErrorHandlerSetting = $result->getConvertErrorsToExceptions();
+            $result->convertErrorsToExceptions($this->useErrorHandler);
+        }
+
+        if (!$this->handleDependencies()) {
+            return;
+        }
+
+        if ($this->runTestInSeparateProcess === TRUE &&
+            $this->inIsolation !== TRUE &&
+            !$this instanceof PHPUnit_Extensions_SeleniumTestCase &&
+            !$this instanceof PHPUnit_Extensions_PhptTestCase) {
+            $class = new ReflectionClass($this);
+
+            $template = new Text_Template(
+              sprintf(
+                '%s%sProcess%sTestCaseMethod.tpl',
+
+                __DIR__,
+                DIRECTORY_SEPARATOR,
+                DIRECTORY_SEPARATOR,
+                DIRECTORY_SEPARATOR
+              )
+            );
+
+            if ($this->preserveGlobalState) {
+                $constants     = PHPUnit_Util_GlobalState::getConstantsAsString();
+                $globals       = PHPUnit_Util_GlobalState::getGlobalsAsString();
+                $includedFiles = PHPUnit_Util_GlobalState::getIncludedFilesAsString();
+            } else {
+                $constants     = '';
+                $globals       = '';
+                $includedFiles = '';
+            }
+
+            if ($result->getCollectCodeCoverageInformation()) {
+                $coverage = 'TRUE';
+            } else {
+                $coverage = 'FALSE';
+            }
+
+            if ($result->isStrict()) {
+                $strict = 'TRUE';
+            } else {
+                $strict = 'FALSE';
+            }
+
+            $data            = var_export(serialize($this->data), TRUE);
+            $dependencyInput = var_export(serialize($this->dependencyInput), TRUE);
+            $includePath     = var_export(get_include_path(), TRUE);
+            // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC
+            // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences
+            $data            = "'." . $data . ".'";
+            $dependencyInput = "'." . $dependencyInput . ".'";
+            $includePath     = "'." . $includePath . ".'";
+
+            $template->setVar(
+              array(
+                'filename'                       => $class->getFileName(),
+                'className'                      => $class->getName(),
+                'methodName'                     => $this->name,
+                'collectCodeCoverageInformation' => $coverage,
+                'data'                           => $data,
+                'dataName'                       => $this->dataName,
+                'dependencyInput'                => $dependencyInput,
+                'constants'                      => $constants,
+                'globals'                        => $globals,
+                'include_path'                   => $includePath,
+                'included_files'                 => $includedFiles,
+                'strict'                         => $strict
+              )
+            );
+
+            $this->prepareTemplate($template);
+
+            $php = PHPUnit_Util_PHP::factory();
+            $php->runJob($template->render(), $this, $result);
+        } else {
+            $result->run($this);
+        }
+
+        if ($this->useErrorHandler !== NULL) {
+            $result->convertErrorsToExceptions($oldErrorHandlerSetting);
+        }
+
+        $this->result = NULL;
+
+        return $result;
+    }
+
+    /**
+     * Runs the bare test sequence.
+     */
+    public function runBare()
+    {
+        $this->numAssertions = 0;
+
+        // Backup the $GLOBALS array and static attributes.
+        if ($this->runTestInSeparateProcess !== TRUE &&
+            $this->inIsolation !== TRUE) {
+            if ($this->backupGlobals === NULL ||
+                $this->backupGlobals === TRUE) {
+                PHPUnit_Util_GlobalState::backupGlobals(
+                  $this->backupGlobalsBlacklist
+                );
+            }
+
+            if ($this->backupStaticAttributes === TRUE) {
+                PHPUnit_Util_GlobalState::backupStaticAttributes(
+                  $this->backupStaticAttributesBlacklist
+                );
+            }
+        }
+
+        // Start output buffering.
+        ob_start();
+        $this->outputBufferingActive = TRUE;
+
+        // Clean up stat cache.
+        clearstatcache();
+
+        // Backup the cwd
+        $currentWorkingDirectory = getcwd();
+
+        try {
+            if ($this->inIsolation) {
+                $this->setUpBeforeClass();
+            }
+
+            $this->setExpectedExceptionFromAnnotation();
+            $this->setUp();
+            $this->checkRequirements();
+            $this->assertPreConditions();
+            $this->testResult = $this->runTest();
+            $this->verifyMockObjects();
+            $this->assertPostConditions();
+            $this->status = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED;
+        }
+
+        catch (PHPUnit_Framework_IncompleteTest $e) {
+            $this->status        = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE;
+            $this->statusMessage = $e->getMessage();
+        }
+
+        catch (PHPUnit_Framework_SkippedTest $e) {
+            $this->status        = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED;
+            $this->statusMessage = $e->getMessage();
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            $this->status        = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
+            $this->statusMessage = $e->getMessage();
+        }
+
+        catch (Exception $e) {
+            $this->status        = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
+            $this->statusMessage = $e->getMessage();
+        }
+
+        // Tear down the fixture. An exception raised in tearDown() will be
+        // caught and passed on when no exception was raised before.
+        try {
+            $this->tearDown();
+
+            if ($this->inIsolation) {
+                $this->tearDownAfterClass();
+            }
+        }
+
+        catch (Exception $_e) {
+            if (!isset($e)) {
+                $e = $_e;
+            }
+        }
+
+        // Stop output buffering.
+        if ($this->outputCallback === FALSE) {
+            $this->output = ob_get_contents();
+        } else {
+            $this->output = call_user_func_array(
+              $this->outputCallback, array(ob_get_contents())
+            );
+        }
+
+        ob_end_clean();
+        $this->outputBufferingActive = FALSE;
+
+        // Clean up stat cache.
+        clearstatcache();
+
+        // Restore the cwd if it was changed by the test
+        if ($currentWorkingDirectory != getcwd()) {
+            chdir($currentWorkingDirectory);
+        }
+
+        // Restore the $GLOBALS array and static attributes.
+        if ($this->runTestInSeparateProcess !== TRUE &&
+            $this->inIsolation !== TRUE) {
+            if ($this->backupGlobals === NULL ||
+                $this->backupGlobals === TRUE) {
+                PHPUnit_Util_GlobalState::restoreGlobals(
+                   $this->backupGlobalsBlacklist
+                );
+            }
+
+            if ($this->backupStaticAttributes === TRUE) {
+                PHPUnit_Util_GlobalState::restoreStaticAttributes();
+            }
+        }
+
+        // Clean up INI settings.
+        foreach ($this->iniSettings as $varName => $oldValue) {
+            ini_set($varName, $oldValue);
+        }
+
+        $this->iniSettings = array();
+
+        // Clean up locale settings.
+        foreach ($this->locale as $category => $locale) {
+            setlocale($category, $locale);
+        }
+
+        // Perform assertion on output.
+        if (!isset($e)) {
+            try {
+                if ($this->outputExpectedRegex !== NULL) {
+                    $this->hasPerformedExpectationsOnOutput = TRUE;
+                    $this->assertRegExp($this->outputExpectedRegex, $this->output);
+                    $this->outputExpectedRegex = NULL;
+                }
+
+                else if ($this->outputExpectedString !== NULL) {
+                    $this->hasPerformedExpectationsOnOutput = TRUE;
+                    $this->assertEquals($this->outputExpectedString, $this->output);
+                    $this->outputExpectedString = NULL;
+                }
+            }
+
+            catch (Exception $_e) {
+                $e = $_e;
+            }
+        }
+
+        // Workaround for missing "finally".
+        if (isset($e)) {
+            $this->onNotSuccessfulTest($e);
+        }
+    }
+
+    /**
+     * Override to run the test and assert its state.
+     *
+     * @return mixed
+     * @throws PHPUnit_Framework_Exception
+     */
+    protected function runTest()
+    {
+        if ($this->name === NULL) {
+            throw new PHPUnit_Framework_Exception(
+              'PHPUnit_Framework_TestCase::$name must not be NULL.'
+            );
+        }
+
+        try {
+            $class  = new ReflectionClass($this);
+            $method = $class->getMethod($this->name);
+        }
+
+        catch (ReflectionException $e) {
+            $this->fail($e->getMessage());
+        }
+
+        try {
+            $testResult = $method->invokeArgs(
+              $this, array_merge($this->data, $this->dependencyInput)
+            );
+        }
+
+        catch (Exception $e) {
+            $checkException = FALSE;
+
+            if (is_string($this->expectedException)) {
+                $checkException = TRUE;
+
+                if ($e instanceof PHPUnit_Framework_Exception) {
+                    $checkException = FALSE;
+                }
+
+                $reflector = new ReflectionClass($this->expectedException);
+
+                if ($this->expectedException == 'PHPUnit_Framework_Exception' ||
+                    $reflector->isSubclassOf('PHPUnit_Framework_Exception')) {
+                    $checkException = TRUE;
+                }
+            }
+
+            if ($checkException) {
+                $this->assertThat(
+                  $e,
+                  new PHPUnit_Framework_Constraint_Exception(
+                    $this->expectedException
+                  )
+                );
+
+                if (is_string($this->expectedExceptionMessage) &&
+                    !empty($this->expectedExceptionMessage)) {
+                    $this->assertThat(
+                      $e,
+                      new PHPUnit_Framework_Constraint_ExceptionMessage(
+                        $this->expectedExceptionMessage
+                      )
+                    );
+                }
+
+                if ($this->expectedExceptionCode !== NULL) {
+                    $this->assertThat(
+                      $e,
+                      new PHPUnit_Framework_Constraint_ExceptionCode(
+                        $this->expectedExceptionCode
+                      )
+                    );
+                }
+
+                return;
+            } else {
+                throw $e;
+            }
+        }
+
+        if ($this->expectedException !== NULL) {
+            $this->assertThat(
+              NULL,
+              new PHPUnit_Framework_Constraint_Exception(
+                $this->expectedException
+              )
+            );
+        }
+
+        return $testResult;
+    }
+
+    /**
+     * Verifies the mock object expectations.
+     *
+     * @since Method available since Release 3.5.0
+     */
+    protected function verifyMockObjects()
+    {
+        foreach ($this->mockObjects as $mockObject) {
+            if ($mockObject->__phpunit_hasMatchers()) {
+                $this->numAssertions++;
+            }
+
+            $mockObject->__phpunit_verify();
+            $mockObject->__phpunit_cleanup();
+        }
+
+        $this->mockObjects = array();
+    }
+
+    /**
+     * Sets the name of a TestCase.
+     *
+     * @param  string
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Sets the dependencies of a TestCase.
+     *
+     * @param  array $dependencies
+     * @since  Method available since Release 3.4.0
+     */
+    public function setDependencies(array $dependencies)
+    {
+        $this->dependencies = $dependencies;
+    }
+
+    /**
+     * Sets
+     *
+     * @param  array $dependencyInput
+     * @since  Method available since Release 3.4.0
+     */
+    public function setDependencyInput(array $dependencyInput)
+    {
+        $this->dependencyInput = $dependencyInput;
+    }
+
+    /**
+     * Calling this method in setUp() has no effect!
+     *
+     * @param  boolean $backupGlobals
+     * @since  Method available since Release 3.3.0
+     */
+    public function setBackupGlobals($backupGlobals)
+    {
+        if (is_null($this->backupGlobals) && is_bool($backupGlobals)) {
+            $this->backupGlobals = $backupGlobals;
+        }
+    }
+
+    /**
+     * Calling this method in setUp() has no effect!
+     *
+     * @param  boolean $backupStaticAttributes
+     * @since  Method available since Release 3.4.0
+     */
+    public function setBackupStaticAttributes($backupStaticAttributes)
+    {
+        if (is_null($this->backupStaticAttributes) &&
+            is_bool($backupStaticAttributes)) {
+            $this->backupStaticAttributes = $backupStaticAttributes;
+        }
+    }
+
+    /**
+     * @param  boolean $runTestInSeparateProcess
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.4.0
+     */
+    public function setRunTestInSeparateProcess($runTestInSeparateProcess)
+    {
+        if (is_bool($runTestInSeparateProcess)) {
+            if ($this->runTestInSeparateProcess === NULL) {
+                $this->runTestInSeparateProcess = $runTestInSeparateProcess;
+            }
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * @param  boolean $preserveGlobalState
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.4.0
+     */
+    public function setPreserveGlobalState($preserveGlobalState)
+    {
+        if (is_bool($preserveGlobalState)) {
+            $this->preserveGlobalState = $preserveGlobalState;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * @param  boolean $inIsolation
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.4.0
+     */
+    public function setInIsolation($inIsolation)
+    {
+        if (is_bool($inIsolation)) {
+            $this->inIsolation = $inIsolation;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * @return mixed
+     * @since  Method available since Release 3.4.0
+     */
+    public function getResult()
+    {
+        return $this->testResult;
+    }
+
+    /**
+     * @param  mixed $result
+     * @since  Method available since Release 3.4.0
+     */
+    public function setResult($result)
+    {
+        $this->testResult = $result;
+    }
+
+    /**
+     * @param  callable $callback
+     * @throws PHPUnit_Framework_Exception
+     * @since Method available since Release 3.6.0
+     */
+    public function setOutputCallback($callback)
+    {
+        if (!is_callable($callback)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'callback');
+        }
+
+        $this->outputCallback = $callback;
+    }
+
+    /**
+     * @return PHPUnit_Framework_TestResult
+     * @since  Method available since Release 3.5.7
+     */
+    public function getTestResultObject()
+    {
+        return $this->result;
+    }
+
+    /**
+     * @param PHPUnit_Framework_TestResult $result
+     * @since Method available since Release 3.6.0
+     */
+    public function setTestResultObject(PHPUnit_Framework_TestResult $result)
+    {
+        $this->result = $result;
+    }
+
+    /**
+     * This method is a wrapper for the ini_set() function that automatically
+     * resets the modified php.ini setting to its original value after the
+     * test is run.
+     *
+     * @param  string  $varName
+     * @param  string  $newValue
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.0.0
+     */
+    protected function iniSet($varName, $newValue)
+    {
+        if (!is_string($varName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        $currentValue = ini_set($varName, $newValue);
+
+        if ($currentValue !== FALSE) {
+            $this->iniSettings[$varName] = $currentValue;
+        } else {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'INI setting "%s" could not be set to "%s".',
+                $varName,
+                $newValue
+              )
+            );
+        }
+    }
+
+    /**
+     * This method is a wrapper for the setlocale() function that automatically
+     * resets the locale to its original value after the test is run.
+     *
+     * @param  integer $category
+     * @param  string  $locale
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.1.0
+     */
+    protected function setLocale()
+    {
+        $args = func_get_args();
+
+        if (count($args) < 2) {
+            throw new PHPUnit_Framework_Exception;
+        }
+
+        $category = $args[0];
+        $locale   = $args[1];
+
+        $categories = array(
+          LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME
+        );
+
+        if (defined('LC_MESSAGES')) {
+            $categories[] = LC_MESSAGES;
+        }
+
+        if (!in_array($category, $categories)) {
+            throw new PHPUnit_Framework_Exception;
+        }
+
+        if (!is_array($locale) && !is_string($locale)) {
+            throw new PHPUnit_Framework_Exception;
+        }
+
+        $this->locale[$category] = setlocale($category, NULL);
+
+        $result = call_user_func_array( 'setlocale', $args );
+
+        if ($result === FALSE) {
+            throw new PHPUnit_Framework_Exception(
+              'The locale functionality is not implemented on your platform, ' .
+              'the specified locale does not exist or the category name is ' .
+              'invalid.'
+            );
+        }
+    }
+
+    /**
+     * Returns a mock object for the specified class.
+     *
+     * @param  string  $originalClassName
+     * @param  array   $methods
+     * @param  array   $arguments
+     * @param  string  $mockClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  boolean $cloneArguments
+     * @return PHPUnit_Framework_MockObject_MockObject
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.0.0
+     */
+    public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = FALSE)
+    {
+        $mockObject = PHPUnit_Framework_MockObject_Generator::getMock(
+          $originalClassName,
+          $methods,
+          $arguments,
+          $mockClassName,
+          $callOriginalConstructor,
+          $callOriginalClone,
+          $callAutoload,
+          $cloneArguments
+        );
+
+        $this->mockObjects[] = $mockObject;
+
+        return $mockObject;
+    }
+
+    /**
+     * Returns a builder object to create mock objects using a fluent interface.
+     *
+     * @param  string $className
+     * @return PHPUnit_Framework_MockObject_MockBuilder
+     * @since  Method available since Release 3.5.0
+     */
+    public function getMockBuilder($className)
+    {
+        return new PHPUnit_Framework_MockObject_MockBuilder(
+          $this, $className
+        );
+    }
+
+    /**
+     * Mocks the specified class and returns the name of the mocked class.
+     *
+     * @param  string  $originalClassName
+     * @param  array   $methods
+     * @param  array   $arguments
+     * @param  string  $mockClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  boolean $cloneArguments
+     * @return string
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.5.0
+     */
+    protected function getMockClass($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = FALSE, $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = FALSE)
+    {
+        $mock = $this->getMock(
+          $originalClassName,
+          $methods,
+          $arguments,
+          $mockClassName,
+          $callOriginalConstructor,
+          $callOriginalClone,
+          $callAutoload,
+          $cloneArguments
+        );
+
+        return get_class($mock);
+    }
+
+    /**
+     * Returns a mock object for the specified abstract class with all abstract
+     * methods of the class mocked. Concrete methods to mock can be specified with
+     * the last parameter
+     *
+     * @param  string  $originalClassName
+     * @param  array   $arguments
+     * @param  string  $mockClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  array   $mockedMethods
+     * @param  boolean $cloneArguments
+     * @return PHPUnit_Framework_MockObject_MockObject
+     * @since  Method available since Release 3.4.0
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function getMockForAbstractClass($originalClassName, array $arguments = array(), $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $mockedMethods = array(), $cloneArguments = FALSE)
+    {
+        $mockObject = PHPUnit_Framework_MockObject_Generator::getMockForAbstractClass(
+          $originalClassName,
+          $arguments,
+          $mockClassName,
+          $callOriginalConstructor,
+          $callOriginalClone,
+          $callAutoload,
+          $mockedMethods,
+          $cloneArguments
+        );
+
+        $this->mockObjects[] = $mockObject;
+
+        return $mockObject;
+    }
+
+    /**
+     * Returns a mock object based on the given WSDL file.
+     *
+     * @param  string  $wsdlFile
+     * @param  string  $originalClassName
+     * @param  string  $mockClassName
+     * @param  array   $methods
+     * @param  boolean $callOriginalConstructor
+     * @return PHPUnit_Framework_MockObject_MockObject
+     * @since  Method available since Release 3.4.0
+     */
+    protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = array(), $callOriginalConstructor = TRUE)
+    {
+        if ($originalClassName === '') {
+            $originalClassName = str_replace(
+              '.wsdl', '', basename($wsdlFile)
+            );
+        }
+
+        if (!class_exists($originalClassName)) {
+          eval(
+            PHPUnit_Framework_MockObject_Generator::generateClassFromWsdl(
+              $wsdlFile, $originalClassName, $methods
+            )
+          );
+        }
+
+        return $this->getMock(
+          $originalClassName,
+          $methods,
+          array('', array()),
+          $mockClassName,
+          $callOriginalConstructor,
+          FALSE,
+          FALSE
+        );
+    }
+
+    /**
+     * Returns an object for the specified trait.
+     *
+     * @param  string  $traitName
+     * @param  array   $arguments
+     * @param  string  $traitClassName
+     * @param  boolean $callOriginalConstructor
+     * @param  boolean $callOriginalClone
+     * @param  boolean $callAutoload
+     * @param  boolean $cloneArguments
+     * @return object
+     * @since  Method available since Release 3.6.0
+     * @throws PHPUnit_Framework_Exception
+     */
+    protected function getObjectForTrait($traitName, array $arguments = array(), $traitClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = FALSE)
+    {
+        return PHPUnit_Framework_MockObject_Generator::getObjectForTrait(
+          $traitName,
+          $arguments,
+          $traitClassName,
+          $callOriginalConstructor,
+          $callOriginalClone,
+          $callAutoload,
+          $cloneArguments
+        );
+    }
+
+    /**
+     * Adds a value to the assertion counter.
+     *
+     * @param integer $count
+     * @since Method available since Release 3.3.3
+     */
+    public function addToAssertionCount($count)
+    {
+        $this->numAssertions += $count;
+    }
+
+    /**
+     * Returns the number of assertions performed by this test.
+     *
+     * @return integer
+     * @since  Method available since Release 3.3.0
+     */
+    public function getNumAssertions()
+    {
+        return $this->numAssertions;
+    }
+
+    /**
+     * Returns a matcher that matches when the method it is evaluated for
+     * is executed zero or more times.
+     *
+     * @return PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount
+     * @since  Method available since Release 3.0.0
+     */
+    public static function any()
+    {
+        return new PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount;
+    }
+
+    /**
+     * Returns a matcher that matches when the method it is evaluated for
+     * is never executed.
+     *
+     * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
+     * @since  Method available since Release 3.0.0
+     */
+    public static function never()
+    {
+        return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(0);
+    }
+
+    /**
+     * Returns a matcher that matches when the method it is evaluated for
+     * is executed at least once.
+     *
+     * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce
+     * @since  Method available since Release 3.0.0
+     */
+    public static function atLeastOnce()
+    {
+        return new PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce;
+    }
+
+    /**
+     * Returns a matcher that matches when the method it is evaluated for
+     * is executed exactly once.
+     *
+     * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
+     * @since  Method available since Release 3.0.0
+     */
+    public static function once()
+    {
+        return new PHPUnit_Framework_MockObject_Matcher_InvokedCount(1);
+    }
+
+    /**
+     * Returns a matcher that matches when the method it is evaluated for
+     * is executed exactly $count times.
+     *
+     * @param  integer $count
+     * @return PHPUnit_Framework_MockObject_Matcher_InvokedCount
+     * @since  Method available since Release 3.0.0
+     */
+    public static function exactly($count)
+    {
+        return new PHPUnit_Framework_MockObject_Matcher_InvokedCount($count);
+    }
+
+    /**
+     * Returns a matcher that matches when the method it is evaluated for
+     * is invoked at the given $index.
+     *
+     * @param  integer $index
+     * @return PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex
+     * @since  Method available since Release 3.0.0
+     */
+    public static function at($index)
+    {
+        return new PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex($index);
+    }
+
+    /**
+     *
+     *
+     * @param  mixed $value
+     * @return PHPUnit_Framework_MockObject_Stub_Return
+     * @since  Method available since Release 3.0.0
+     */
+    public static function returnValue($value)
+    {
+        return new PHPUnit_Framework_MockObject_Stub_Return($value);
+    }
+
+    /**
+     *
+     *
+     * @param  array $valueMap
+     * @return PHPUnit_Framework_MockObject_Stub_ReturnValueMap
+     * @since  Method available since Release 3.6.0
+     */
+    public static function returnValueMap(array $valueMap)
+    {
+        return new PHPUnit_Framework_MockObject_Stub_ReturnValueMap($valueMap);
+    }
+
+    /**
+     *
+     *
+     * @param  integer $argumentIndex
+     * @return PHPUnit_Framework_MockObject_Stub_ReturnArgument
+     * @since  Method available since Release 3.3.0
+     */
+    public static function returnArgument($argumentIndex)
+    {
+        return new PHPUnit_Framework_MockObject_Stub_ReturnArgument(
+          $argumentIndex
+        );
+    }
+
+    /**
+     *
+     *
+     * @param  mixed $callback
+     * @return PHPUnit_Framework_MockObject_Stub_ReturnCallback
+     * @since  Method available since Release 3.3.0
+     */
+    public static function returnCallback($callback)
+    {
+        return new PHPUnit_Framework_MockObject_Stub_ReturnCallback($callback);
+    }
+
+    /**
+     * Returns the current object.
+     *
+     * This method is useful when mocking a fluent interface.
+     *
+     * @return PHPUnit_Framework_MockObject_Stub_ReturnSelf
+     * @since  Method available since Release 3.6.0
+     */
+    public static function returnSelf()
+    {
+        return new PHPUnit_Framework_MockObject_Stub_ReturnSelf();
+    }
+
+    /**
+     *
+     *
+     * @param  Exception $exception
+     * @return PHPUnit_Framework_MockObject_Stub_Exception
+     * @since  Method available since Release 3.1.0
+     */
+    public static function throwException(Exception $exception)
+    {
+        return new PHPUnit_Framework_MockObject_Stub_Exception($exception);
+    }
+
+    /**
+     *
+     *
+     * @param  mixed $value, ...
+     * @return PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls
+     * @since  Method available since Release 3.0.0
+     */
+    public static function onConsecutiveCalls()
+    {
+        $args = func_get_args();
+
+        return new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($args);
+    }
+
+    /**
+     * @param  mixed $data
+     * @return string
+     * @since  Method available since Release 3.2.1
+     */
+    protected function dataToString($data)
+    {
+        $result = array();
+
+        // There seems to be no other way to check arrays for recursion
+        // http://www.php.net/manual/en/language.types.array.php#73936
+        preg_match_all('/\n            \[(\w+)\] => Array\s+\*RECURSION\*/', print_r($data, TRUE), $matches);
+        $recursiveKeys = array_unique($matches[1]);
+
+        // Convert to valid array keys
+        // Numeric integer strings are automatically converted to integers
+        // by PHP
+        foreach ($recursiveKeys as $key => $recursiveKey) {
+            if ((string)(integer)$recursiveKey === $recursiveKey) {
+                $recursiveKeys[$key] = (integer)$recursiveKey;
+            }
+        }
+
+        foreach ($data as $key => $_data) {
+            if (in_array($key, $recursiveKeys, TRUE)) {
+                $result[] = '*RECURSION*';
+            }
+
+            else if (is_array($_data)) {
+                $result[] = 'array(' . $this->dataToString($_data) . ')';
+            }
+
+            else if (is_object($_data)) {
+                $object = new ReflectionObject($_data);
+
+                if ($object->hasMethod('__toString')) {
+                    $result[] = (string)$_data;
+                } else {
+                    $result[] = get_class($_data);
+                }
+            }
+
+            else if (is_resource($_data)) {
+                $result[] = '<resource>';
+            }
+
+            else {
+                $result[] = var_export($_data, TRUE);
+            }
+        }
+
+        return join(', ', $result);
+    }
+
+    /**
+     * Gets the data set description of a TestCase.
+     *
+     * @param  boolean $includeData
+     * @return string
+     * @since  Method available since Release 3.3.0
+     */
+    protected function getDataSetAsString($includeData = TRUE)
+    {
+        $buffer = '';
+
+        if (!empty($this->data)) {
+            if (is_int($this->dataName)) {
+                $buffer .= sprintf(' with data set #%d', $this->dataName);
+            } else {
+                $buffer .= sprintf(' with data set "%s"', $this->dataName);
+            }
+
+            if ($includeData) {
+                $buffer .= sprintf(' (%s)', $this->dataToString($this->data));
+            }
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Creates a default TestResult object.
+     *
+     * @return PHPUnit_Framework_TestResult
+     */
+    protected function createResult()
+    {
+        return new PHPUnit_Framework_TestResult;
+    }
+
+    /**
+     * @since Method available since Release 3.5.4
+     */
+    protected function handleDependencies()
+    {
+        if (!empty($this->dependencies) && !$this->inIsolation) {
+            $className  = get_class($this);
+            $passed     = $this->result->passed();
+            $passedKeys = array_keys($passed);
+            $numKeys    = count($passedKeys);
+
+            for ($i = 0; $i < $numKeys; $i++) {
+                $pos = strpos($passedKeys[$i], ' with data set');
+
+                if ($pos !== FALSE) {
+                    $passedKeys[$i] = substr($passedKeys[$i], 0, $pos);
+                }
+            }
+
+            $passedKeys = array_flip(array_unique($passedKeys));
+
+            foreach ($this->dependencies as $dependency) {
+                if (strpos($dependency, '::') === FALSE) {
+                    $dependency = $className . '::' . $dependency;
+                }
+
+                if (!isset($passedKeys[$dependency])) {
+                    $this->result->addError(
+                      $this,
+                      new PHPUnit_Framework_SkippedTestError(
+                        sprintf(
+                          'This test depends on "%s" to pass.', $dependency
+                        )
+                      ),
+                      0
+                    );
+
+                    return FALSE;
+                }
+
+                if (isset($passed[$dependency])) {
+                    if ($passed[$dependency]['size'] > $this->getSize()) {
+                        $this->result->addError(
+                          $this,
+                          new PHPUnit_Framework_SkippedTestError(
+                            'This test depends on a test that is larger than itself.'
+                          ),
+                          0
+                        );
+
+                        return FALSE;
+                    }
+
+                    $this->dependencyInput[] = $passed[$dependency]['result'];
+                } else {
+                    $this->dependencyInput[] = NULL;
+                }
+            }
+        }
+
+        return TRUE;
+    }
+
+    /**
+     * This method is called before the first test of this test class is run.
+     *
+     * @since Method available since Release 3.4.0
+     */
+    public static function setUpBeforeClass()
+    {
+    }
+
+    /**
+     * Sets up the fixture, for example, open a network connection.
+     * This method is called before a test is executed.
+     *
+     */
+    protected function setUp()
+    {
+    }
+
+    /**
+     * Performs assertions shared by all tests of a test case.
+     *
+     * This method is called before the execution of a test starts
+     * and after setUp() is called.
+     *
+     * @since  Method available since Release 3.2.8
+     */
+    protected function assertPreConditions()
+    {
+    }
+
+    /**
+     * Performs assertions shared by all tests of a test case.
+     *
+     * This method is called before the execution of a test ends
+     * and before tearDown() is called.
+     *
+     * @since  Method available since Release 3.2.8
+     */
+    protected function assertPostConditions()
+    {
+    }
+
+    /**
+     * Tears down the fixture, for example, close a network connection.
+     * This method is called after a test is executed.
+     */
+    protected function tearDown()
+    {
+    }
+
+    /**
+     * This method is called after the last test of this test class is run.
+     *
+     * @since Method available since Release 3.4.0
+     */
+    public static function tearDownAfterClass()
+    {
+    }
+
+    /**
+     * This method is called when a test method did not execute successfully.
+     *
+     * @param Exception $e
+     * @since Method available since Release 3.4.0
+     */
+    protected function onNotSuccessfulTest(Exception $e)
+    {
+        throw $e;
+    }
+
+    /**
+     * Performs custom preparations on the process isolation template.
+     *
+     * @param Text_Template $template
+     * @since Method available since Release 3.4.0
+     */
+    protected function prepareTemplate(Text_Template $template)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestFailure.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestFailure.php
new file mode 100644
index 0000000..bb728d5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestFailure.php
@@ -0,0 +1,180 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A TestFailure collects a failed test together with the caught exception.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_TestFailure
+{
+    /**
+     * @var    PHPUnit_Framework_Test
+     */
+    protected $failedTest;
+
+    /**
+     * @var    Exception
+     */
+    protected $thrownException;
+
+    /**
+     * Constructs a TestFailure with the given test and exception.
+     *
+     * @param  PHPUnit_Framework_Test $failedTest
+     * @param  Exception               $thrownException
+     */
+    public function __construct(PHPUnit_Framework_Test $failedTest, Exception $thrownException)
+    {
+        $this->failedTest      = $failedTest;
+        $this->thrownException = $thrownException;
+    }
+
+    /**
+     * Returns a short description of the failure.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return sprintf(
+          '%s: %s',
+
+          $this->failedTest,
+          $this->thrownException->getMessage()
+        );
+    }
+
+    /**
+     * Returns a description for the thrown exception.
+     *
+     * @return string
+     * @since  Method available since Release 3.4.0
+     */
+    public function getExceptionAsString()
+    {
+        return self::exceptionToString($this->thrownException);
+    }
+
+    /**
+     * Returns a description for an exception.
+     *
+     * @param  Exception $e
+     * @return string
+     * @since  Method available since Release 3.2.0
+     */
+    public static function exceptionToString(Exception $e)
+    {
+        if ($e instanceof PHPUnit_Framework_SelfDescribing) {
+            $buffer = $e->toString();
+
+            if ($e instanceof PHPUnit_Framework_ExpectationFailedException && $e->getComparisonFailure()) {
+                $buffer = $buffer . "\n" . $e->getComparisonFailure()->getDiff();
+            }
+
+            if (!empty($buffer)) {
+                $buffer = trim($buffer) . "\n";
+            }
+        }
+
+        else if ($e instanceof PHPUnit_Framework_Error) {
+            $buffer = $e->getMessage() . "\n";
+        }
+
+        else {
+            $buffer = get_class($e) . ': ' . $e->getMessage() . "\n";
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Gets the failed test.
+     *
+     * @return Test
+     */
+    public function failedTest()
+    {
+        return $this->failedTest;
+    }
+
+    /**
+     * Gets the thrown exception.
+     *
+     * @return Exception
+     */
+    public function thrownException()
+    {
+        return $this->thrownException;
+    }
+
+    /**
+     * Returns the exception's message.
+     *
+     * @return string
+     */
+    public function exceptionMessage()
+    {
+        return $this->thrownException()->getMessage();
+    }
+
+    /**
+     * Returns TRUE if the thrown exception
+     * is of type AssertionFailedError.
+     *
+     * @return boolean
+     */
+    public function isFailure()
+    {
+        return ($this->thrownException() instanceof PHPUnit_Framework_AssertionFailedError);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestListener.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestListener.php
new file mode 100644
index 0000000..e7bce94
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestListener.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A Listener for test progress.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 2.0.0
+ */
+interface PHPUnit_Framework_TestListener
+{
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time);
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time);
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time);
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time);
+
+    /**
+     * A test suite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite);
+
+    /**
+     * A test suite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite);
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test);
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php
new file mode 100644
index 0000000..ed5d629
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php
@@ -0,0 +1,957 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A TestResult collects the results of executing a test case.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_TestResult implements Countable
+{
+    /**
+     * @var boolean
+     */
+    protected static $xdebugLoaded = NULL;
+
+    /**
+     * @var boolean
+     */
+    protected static $useXdebug = NULL;
+
+    /**
+     * @var array
+     */
+    protected $passed = array();
+
+    /**
+     * @var array
+     */
+    protected $errors = array();
+
+    /**
+     * @var array
+     */
+    protected $deprecatedFeatures = array();
+
+    /**
+     * @var array
+     */
+    protected $failures = array();
+
+    /**
+     * @var array
+     */
+    protected $notImplemented = array();
+
+    /**
+     * @var array
+     */
+    protected $skipped = array();
+
+    /**
+     * @var array
+     */
+    protected $listeners = array();
+
+    /**
+     * @var integer
+     */
+    protected $runTests = 0;
+
+    /**
+     * @var float
+     */
+    protected $time = 0;
+
+    /**
+     * @var PHPUnit_Framework_TestSuite
+     */
+    protected $topTestSuite = NULL;
+
+    /**
+     * Code Coverage information.
+     *
+     * @var PHP_CodeCoverage
+     */
+    protected $codeCoverage;
+
+    /**
+     * @var boolean
+     */
+    protected $convertErrorsToExceptions = TRUE;
+
+    /**
+     * @var boolean
+     */
+    protected $stop = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $stopOnError = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $stopOnFailure = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $strictMode = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $stopOnIncomplete = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $stopOnSkipped = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $lastTestFailed = FALSE;
+
+    /**
+     * @var integer
+     */
+    protected $timeoutForSmallTests = 1;
+
+    /**
+     * @var integer
+     */
+    protected $timeoutForMediumTests = 10;
+
+    /**
+     * @var integer
+     */
+    protected $timeoutForLargeTests = 60;
+
+    /**
+     * Registers a TestListener.
+     *
+     * @param  PHPUnit_Framework_TestListener
+     */
+    public function addListener(PHPUnit_Framework_TestListener $listener)
+    {
+        $this->listeners[] = $listener;
+    }
+
+    /**
+     * Unregisters a TestListener.
+     *
+     * @param  PHPUnit_Framework_TestListener $listener
+     */
+    public function removeListener(PHPUnit_Framework_TestListener $listener)
+    {
+        foreach ($this->listeners as $key => $_listener) {
+            if ($listener === $_listener) {
+                unset($this->listeners[$key]);
+            }
+        }
+    }
+
+    /**
+     * Flushes all flushable TestListeners.
+     *
+     * @since  Method available since Release 3.0.0
+     */
+    public function flushListeners()
+    {
+        foreach ($this->listeners as $listener) {
+            if ($listener instanceof PHPUnit_Util_Printer) {
+                $listener->flush();
+            }
+        }
+    }
+
+    /**
+     * Adds an error to the list of errors.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($e instanceof PHPUnit_Framework_IncompleteTest) {
+            $this->notImplemented[] = new PHPUnit_Framework_TestFailure(
+              $test, $e
+            );
+
+            $notifyMethod = 'addIncompleteTest';
+
+            if ($this->stopOnIncomplete) {
+                $this->stop();
+            }
+        }
+
+        else if ($e instanceof PHPUnit_Framework_SkippedTest) {
+            $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
+            $notifyMethod    = 'addSkippedTest';
+
+            if ($this->stopOnSkipped) {
+                $this->stop();
+            }
+        }
+
+        else {
+            $this->errors[] = new PHPUnit_Framework_TestFailure($test, $e);
+            $notifyMethod   = 'addError';
+
+            if ($this->stopOnError || $this->stopOnFailure) {
+                $this->stop();
+            }
+        }
+
+        foreach ($this->listeners as $listener) {
+            $listener->$notifyMethod($test, $e, $time);
+        }
+
+        $this->lastTestFailed = TRUE;
+        $this->time          += $time;
+    }
+
+    /**
+     * Adds a failure to the list of failures.
+     * The passed in exception caused the failure.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        if ($e instanceof PHPUnit_Framework_IncompleteTest) {
+            $this->notImplemented[] = new PHPUnit_Framework_TestFailure(
+              $test, $e
+            );
+
+            $notifyMethod = 'addIncompleteTest';
+
+            if ($this->stopOnIncomplete) {
+                $this->stop();
+            }
+        }
+
+        else if ($e instanceof PHPUnit_Framework_SkippedTest) {
+            $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
+            $notifyMethod    = 'addSkippedTest';
+
+            if ($this->stopOnSkipped) {
+                $this->stop();
+            }
+        }
+
+        else {
+            $this->failures[] = new PHPUnit_Framework_TestFailure($test, $e);
+            $notifyMethod     = 'addFailure';
+
+            if ($this->stopOnFailure) {
+                $this->stop();
+            }
+        }
+
+        foreach ($this->listeners as $listener) {
+            $listener->$notifyMethod($test, $e, $time);
+        }
+
+        $this->lastTestFailed = TRUE;
+        $this->time          += $time;
+    }
+
+    /**
+     * Adds a deprecated feature notice to the list of deprecated features used during run
+     *
+     * @param PHPUnit_Util_DeprecatedFeature $deprecatedFeature
+     */
+    public function addDeprecatedFeature(PHPUnit_Util_DeprecatedFeature $deprecatedFeature)
+    {
+        $this->deprecatedFeatures[] = $deprecatedFeature;
+    }
+
+    /**
+     * Informs the result that a testsuite will be started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        if ($this->topTestSuite === NULL) {
+            $this->topTestSuite = $suite;
+        }
+
+        foreach ($this->listeners as $listener) {
+            $listener->startTestSuite($suite);
+        }
+    }
+
+    /**
+     * Informs the result that a testsuite was completed.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        foreach ($this->listeners as $listener) {
+            $listener->endTestSuite($suite);
+        }
+    }
+
+    /**
+     * Informs the result that a test will be started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        $this->lastTestFailed = FALSE;
+        $this->runTests      += count($test);
+
+        foreach ($this->listeners as $listener) {
+            $listener->startTest($test);
+        }
+    }
+
+    /**
+     * Informs the result that a test was completed.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        foreach ($this->listeners as $listener) {
+            $listener->endTest($test, $time);
+        }
+
+        if (!$this->lastTestFailed && $test instanceof PHPUnit_Framework_TestCase) {
+            $class  = get_class($test);
+            $key    =  $class . '::' . $test->getName();
+
+            $this->passed[$key] = array(
+              'result' => $test->getResult(),
+              'size'   => PHPUnit_Util_Test::getSize(
+                            $class, $test->getName(FALSE)
+                          )
+            );
+
+            $this->time += $time;
+        }
+    }
+
+    /**
+     * Returns TRUE if no incomplete test occured.
+     *
+     * @return boolean
+     */
+    public function allCompletlyImplemented()
+    {
+        return $this->notImplementedCount() == 0;
+    }
+
+    /**
+     * Gets the number of incomplete tests.
+     *
+     * @return integer
+     */
+    public function notImplementedCount()
+    {
+        return count($this->notImplemented);
+    }
+
+    /**
+     * Returns an Enumeration for the incomplete tests.
+     *
+     * @return array
+     */
+    public function notImplemented()
+    {
+        return $this->notImplemented;
+    }
+
+    /**
+     * Returns TRUE if no test has been skipped.
+     *
+     * @return boolean
+     * @since  Method available since Release 3.0.0
+     */
+    public function noneSkipped()
+    {
+        return $this->skippedCount() == 0;
+    }
+
+    /**
+     * Gets the number of skipped tests.
+     *
+     * @return integer
+     * @since  Method available since Release 3.0.0
+     */
+    public function skippedCount()
+    {
+        return count($this->skipped);
+    }
+
+    /**
+     * Returns an Enumeration for the skipped tests.
+     *
+     * @return array
+     * @since  Method available since Release 3.0.0
+     */
+    public function skipped()
+    {
+        return $this->skipped;
+    }
+
+    /**
+     * Gets the number of detected errors.
+     *
+     * @return integer
+     */
+    public function errorCount()
+    {
+        return count($this->errors);
+    }
+
+    /**
+     * Returns an Enumeration for the errors.
+     *
+     * @return array
+     */
+    public function errors()
+    {
+        return $this->errors;
+    }
+
+    /**
+     * Returns an Enumeration for the deprecated features used.
+     *
+     * @return array
+     * @since  Method available since Release 3.5.7
+     */
+    public function deprecatedFeatures()
+    {
+        return $this->deprecatedFeatures;
+    }
+
+    /**
+     * Returns an Enumeration for the deprecated features used.
+     *
+     * @return array
+     * @since  Method available since Release 3.5.7
+     */
+    public function deprecatedFeaturesCount()
+    {
+        return count($this->deprecatedFeatures);
+    }
+
+    /**
+     * Gets the number of detected failures.
+     *
+     * @return integer
+     */
+    public function failureCount()
+    {
+        return count($this->failures);
+    }
+
+    /**
+     * Returns an Enumeration for the failures.
+     *
+     * @return array
+     */
+    public function failures()
+    {
+        return $this->failures;
+    }
+
+    /**
+     * Returns the names of the tests that have passed.
+     *
+     * @return array
+     * @since  Method available since Release 3.4.0
+     */
+    public function passed()
+    {
+        return $this->passed;
+    }
+
+    /**
+     * Returns the (top) test suite.
+     *
+     * @return PHPUnit_Framework_TestSuite
+     * @since  Method available since Release 3.0.0
+     */
+    public function topTestSuite()
+    {
+        return $this->topTestSuite;
+    }
+
+    /**
+     * Returns whether code coverage information should be collected.
+     *
+     * @return boolean If code coverage should be collected
+     * @since  Method available since Release 3.2.0
+     */
+    public function getCollectCodeCoverageInformation()
+    {
+        return $this->codeCoverage !== NULL;
+    }
+
+    /**
+     * Returns the strict mode configuration option
+     *
+     * @return boolean
+     */
+    public function isStrict()
+    {
+        return $this->strictMode;
+    }
+
+    /**
+     * Runs a TestCase.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function run(PHPUnit_Framework_Test $test)
+    {
+        PHPUnit_Framework_Assert::resetCount();
+
+        $error      = FALSE;
+        $failure    = FALSE;
+        $incomplete = FALSE;
+        $skipped    = FALSE;
+
+        $this->startTest($test);
+
+        $errorHandlerSet = FALSE;
+
+        if ($this->convertErrorsToExceptions) {
+            $oldErrorHandler = set_error_handler(
+              array('PHPUnit_Util_ErrorHandler', 'handleError'),
+              E_ALL | E_STRICT
+            );
+
+            if ($oldErrorHandler === NULL) {
+                $errorHandlerSet = TRUE;
+            } else {
+                restore_error_handler();
+            }
+        }
+
+        if (self::$xdebugLoaded === NULL) {
+            self::$xdebugLoaded = extension_loaded('xdebug');
+            self::$useXdebug    = self::$xdebugLoaded;
+        }
+
+        $useXdebug = self::$useXdebug &&
+                     $this->codeCoverage !== NULL &&
+                     !$test instanceof PHPUnit_Extensions_SeleniumTestCase &&
+                     !$test instanceof PHPUnit_Framework_Warning;
+
+        if ($useXdebug) {
+            // We need to blacklist test source files when no whitelist is used.
+            if (!$this->codeCoverage->filter()->hasWhitelist()) {
+                $classes = PHPUnit_Util_Class::getHierarchy(
+                  get_class($test), TRUE
+                );
+
+                foreach ($classes as $class) {
+                    $this->codeCoverage->filter()->addFileToBlacklist(
+                      $class->getFileName()
+                    );
+                }
+            }
+
+            $this->codeCoverage->start($test);
+        }
+
+        PHP_Timer::start();
+
+        try {
+            if (!$test instanceof PHPUnit_Framework_Warning &&
+                $this->strictMode &&
+                extension_loaded('pcntl') && class_exists('PHP_Invoker')) {
+                switch ($test->getSize()) {
+                    case PHPUnit_Util_Test::SMALL: {
+                        $_timeout = $this->timeoutForSmallTests;
+                    }
+                    break;
+
+                    case PHPUnit_Util_Test::MEDIUM: {
+                        $_timeout = $this->timeoutForMediumTests;
+                    }
+                    break;
+
+                    case PHPUnit_Util_Test::LARGE: {
+                        $_timeout = $this->timeoutForLargeTests;
+                    }
+                    break;
+                }
+
+                $invoker = new PHP_Invoker;
+                $invoker->invoke(array($test, 'runBare'), array(), $_timeout);
+            } else {
+                $test->runBare();
+            }
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            $failure = TRUE;
+
+            if ($e instanceof PHPUnit_Framework_IncompleteTestError) {
+                $incomplete = TRUE;
+            }
+
+            else if ($e instanceof PHPUnit_Framework_SkippedTestError) {
+                $skipped = TRUE;
+            }
+        }
+
+        catch (Exception $e) {
+            $error = TRUE;
+        }
+
+        $time = PHP_Timer::stop();
+        $test->addToAssertionCount(PHPUnit_Framework_Assert::getCount());
+
+        if ($this->strictMode && $test->getNumAssertions() == 0) {
+            $incomplete = TRUE;
+        }
+
+        if ($useXdebug) {
+            try {
+                $this->codeCoverage->stop(!$incomplete && !$skipped);
+            }
+
+            catch (PHP_CodeCoverage_Exception $cce) {
+                $error = TRUE;
+
+                if (!isset($e)) {
+                    $e = $cce;
+                }
+            }
+        }
+
+        if ($errorHandlerSet === TRUE) {
+            restore_error_handler();
+        }
+
+        if ($error === TRUE) {
+            $this->addError($test, $e, $time);
+        }
+
+        else if ($failure === TRUE) {
+            $this->addFailure($test, $e, $time);
+        }
+
+        else if ($this->strictMode && $test->getNumAssertions() == 0) {
+            $this->addFailure(
+              $test,
+              new PHPUnit_Framework_IncompleteTestError(
+                'This test did not perform any assertions'
+              ),
+              $time
+            );
+        }
+
+        else if ($this->strictMode && $test->hasOutput()) {
+            $this->addFailure(
+              $test,
+              new PHPUnit_Framework_OutputError(
+                sprintf(
+                  'This test printed output: %s',
+                  $test->getActualOutput()
+                )
+              ),
+              $time
+            );
+        }
+
+        $this->endTest($test, $time);
+    }
+
+    /**
+     * Gets the number of run tests.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        return $this->runTests;
+    }
+
+    /**
+     * Checks whether the test run should stop.
+     *
+     * @return boolean
+     */
+    public function shouldStop()
+    {
+        return $this->stop;
+    }
+
+    /**
+     * Marks that the test run should stop.
+     *
+     */
+    public function stop()
+    {
+        $this->stop = TRUE;
+    }
+
+    /**
+     * Returns the PHP_CodeCoverage object.
+     *
+     * @return PHP_CodeCoverage
+     * @since  Method available since Release 3.5.0
+     */
+    public function getCodeCoverage()
+    {
+        return $this->codeCoverage;
+    }
+
+    /**
+     * Returns the PHP_CodeCoverage object.
+     *
+     * @return PHP_CodeCoverage
+     * @since  Method available since Release 3.6.0
+     */
+    public function setCodeCoverage(PHP_CodeCoverage $codeCoverage)
+    {
+        $this->codeCoverage = $codeCoverage;
+    }
+
+    /**
+     * Enables or disables the error-to-exception conversion.
+     *
+     * @param  boolean $flag
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.2.14
+     */
+    public function convertErrorsToExceptions($flag)
+    {
+        if (is_bool($flag)) {
+            $this->convertErrorsToExceptions = $flag;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * Returns the error-to-exception conversion setting.
+     *
+     * @return boolean
+     * @since  Method available since Release 3.4.0
+     */
+    public function getConvertErrorsToExceptions()
+    {
+        return $this->convertErrorsToExceptions;
+    }
+
+    /**
+     * Enables or disables the stopping when an error occurs.
+     *
+     * @param  boolean $flag
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.5.0
+     */
+    public function stopOnError($flag)
+    {
+        if (is_bool($flag)) {
+            $this->stopOnError = $flag;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * Enables or disables the stopping when a failure occurs.
+     *
+     * @param  boolean $flag
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.1.0
+     */
+    public function stopOnFailure($flag)
+    {
+        if (is_bool($flag)) {
+            $this->stopOnFailure = $flag;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * Enables or disables the strict mode.
+     *
+     * When active
+     *   * Tests that do not assert anything will be marked as incomplete.
+     *   * Tests that are incomplete or skipped yield no code coverage.
+     *
+     * @param  boolean $flag
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.5.2
+     */
+    public function strictMode($flag)
+    {
+        if (is_bool($flag)) {
+            $this->strictMode = $flag;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * Enables or disables the stopping for incomplete tests.
+     *
+     * @param  boolean $flag
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.5.0
+     */
+    public function stopOnIncomplete($flag)
+    {
+        if (is_bool($flag)) {
+            $this->stopOnIncomplete = $flag;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * Enables or disables the stopping for skipped tests.
+     *
+     * @param  boolean $flag
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.1.0
+     */
+    public function stopOnSkipped($flag)
+    {
+        if (is_bool($flag)) {
+            $this->stopOnSkipped = $flag;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+
+    /**
+     * Returns the time spent running the tests.
+     *
+     * @return float
+     */
+    public function time()
+    {
+        return $this->time;
+    }
+
+    /**
+     * Returns whether the entire test was successful or not.
+     *
+     * @return boolean
+     */
+    public function wasSuccessful()
+    {
+        return empty($this->errors) && empty($this->failures);
+    }
+
+    /**
+     * Sets the timeout for small tests.
+     *
+     * @param  integer $timeout
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.6.0
+     */
+    public function setTimeoutForSmallTests($timeout)
+    {
+        if (is_integer($timeout)) {
+            $this->timeoutForSmallTests = $timeout;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+        }
+    }
+
+    /**
+     * Sets the timeout for medium tests.
+     *
+     * @param  integer $timeout
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.6.0
+     */
+    public function setTimeoutForMediumTests($timeout)
+    {
+        if (is_integer($timeout)) {
+            $this->timeoutForMediumTests = $timeout;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+        }
+    }
+
+    /**
+     * Sets the timeout for large tests.
+     *
+     * @param  integer $timeout
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.6.0
+     */
+    public function setTimeoutForLargeTests($timeout)
+    {
+        if (is_integer($timeout)) {
+            $this->timeoutForLargeTests = $timeout;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php
new file mode 100644
index 0000000..92fed69
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php
@@ -0,0 +1,951 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A TestSuite is a composite of Tests. It runs a collection of test cases.
+ *
+ * Here is an example using the dynamic test definition.
+ *
+ * <code>
+ * <?php
+ * $suite = new PHPUnit_Framework_TestSuite;
+ * $suite->addTest(new MathTest('testPass'));
+ * ?>
+ * </code>
+ *
+ * Alternatively, a TestSuite can extract the tests to be run automatically.
+ * To do so you pass a ReflectionClass instance for your
+ * PHPUnit_Framework_TestCase class to the PHPUnit_Framework_TestSuite
+ * constructor.
+ *
+ * <code>
+ * <?php
+ * $suite = new PHPUnit_Framework_TestSuite(
+ *   new ReflectionClass('MathTest')
+ * );
+ * ?>
+ * </code>
+ *
+ * This constructor creates a suite with all the methods starting with
+ * "test" that take no arguments.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Framework_SelfDescribing, IteratorAggregate
+{
+    /**
+     * Enable or disable the backup and restoration of the $GLOBALS array.
+     *
+     * @var    boolean
+     */
+    protected $backupGlobals = NULL;
+
+    /**
+     * Enable or disable the backup and restoration of static attributes.
+     *
+     * @var    boolean
+     */
+    protected $backupStaticAttributes = NULL;
+
+    /**
+     * The name of the test suite.
+     *
+     * @var    string
+     */
+    protected $name = '';
+
+    /**
+     * The test groups of the test suite.
+     *
+     * @var    array
+     */
+    protected $groups = array();
+
+    /**
+     * The tests in the test suite.
+     *
+     * @var    array
+     */
+    protected $tests = array();
+
+    /**
+     * The number of tests in the test suite.
+     *
+     * @var    integer
+     */
+    protected $numTests = -1;
+
+    /**
+     * @var boolean
+     */
+    protected $testCase = FALSE;
+
+    /**
+     * Constructs a new TestSuite:
+     *
+     *   - PHPUnit_Framework_TestSuite() constructs an empty TestSuite.
+     *
+     *   - PHPUnit_Framework_TestSuite(ReflectionClass) constructs a
+     *     TestSuite from the given class.
+     *
+     *   - PHPUnit_Framework_TestSuite(ReflectionClass, String)
+     *     constructs a TestSuite from the given class with the given
+     *     name.
+     *
+     *   - PHPUnit_Framework_TestSuite(String) either constructs a
+     *     TestSuite from the given class (if the passed string is the
+     *     name of an existing class) or constructs an empty TestSuite
+     *     with the given name.
+     *
+     * @param  mixed  $theClass
+     * @param  string $name
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function __construct($theClass = '', $name = '')
+    {
+        $argumentsValid = FALSE;
+
+        if (is_object($theClass) &&
+            $theClass instanceof ReflectionClass) {
+            $argumentsValid = TRUE;
+        }
+
+        else if (is_string($theClass) &&
+                 $theClass !== '' &&
+                 class_exists($theClass, FALSE)) {
+            $argumentsValid = TRUE;
+
+            if ($name == '') {
+                $name = $theClass;
+            }
+
+            $theClass = new ReflectionClass($theClass);
+        }
+
+        else if (is_string($theClass)) {
+            $this->setName($theClass);
+            return;
+        }
+
+        if (!$argumentsValid) {
+            throw new PHPUnit_Framework_Exception;
+        }
+
+        if (!$theClass->isSubclassOf('PHPUnit_Framework_TestCase')) {
+            throw new PHPUnit_Framework_Exception(
+              'Class "' . $theClass->name . '" does not extend PHPUnit_Framework_TestCase.'
+            );
+        }
+
+        if ($name != '') {
+            $this->setName($name);
+        } else {
+            $this->setName($theClass->getName());
+        }
+
+        $constructor = $theClass->getConstructor();
+
+        if ($constructor !== NULL &&
+            !$constructor->isPublic()) {
+            $this->addTest(
+              self::warning(
+                sprintf(
+                  'Class "%s" has no public constructor.',
+
+                  $theClass->getName()
+                )
+              )
+            );
+
+            return;
+        }
+
+        foreach ($theClass->getMethods() as $method) {
+            $this->addTestMethod($theClass, $method);
+        }
+
+        if (empty($this->tests)) {
+            $this->addTest(
+              self::warning(
+                sprintf(
+                  'No tests found in class "%s".',
+
+                  $theClass->getName()
+                )
+              )
+            );
+        }
+
+        $this->testCase = TRUE;
+    }
+
+    /**
+     * Returns a string representation of the test suite.
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return $this->getName();
+    }
+
+    /**
+     * Adds a test to the suite.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  array                  $groups
+     */
+    public function addTest(PHPUnit_Framework_Test $test, $groups = array())
+    {
+        $class = new ReflectionClass($test);
+
+        if (!$class->isAbstract()) {
+            $this->tests[]  = $test;
+            $this->numTests = -1;
+
+            if ($test instanceof PHPUnit_Framework_TestSuite &&
+                empty($groups)) {
+                $groups = $test->getGroups();
+            }
+
+            if (empty($groups)) {
+                $groups = array('__nogroup__');
+            }
+
+            foreach ($groups as $group) {
+                if (!isset($this->groups[$group])) {
+                    $this->groups[$group] = array($test);
+                } else {
+                    $this->groups[$group][] = $test;
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds the tests from the given class to the suite.
+     *
+     * @param  mixed $testClass
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function addTestSuite($testClass)
+    {
+        if (is_string($testClass) && class_exists($testClass)) {
+            $testClass = new ReflectionClass($testClass);
+        }
+
+        if (!is_object($testClass)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'class name or object'
+            );
+        }
+
+        if ($testClass instanceof PHPUnit_Framework_TestSuite) {
+            $this->addTest($testClass);
+        }
+
+        else if ($testClass instanceof ReflectionClass) {
+            $suiteMethod = FALSE;
+
+            if (!$testClass->isAbstract()) {
+                if ($testClass->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) {
+                    $method = $testClass->getMethod(
+                      PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME
+                    );
+
+                    if ($method->isStatic()) {
+                        $this->addTest(
+                          $method->invoke(NULL, $testClass->getName())
+                        );
+
+                        $suiteMethod = TRUE;
+                    }
+                }
+            }
+
+            if (!$suiteMethod && !$testClass->isAbstract()) {
+                $this->addTest(new PHPUnit_Framework_TestSuite($testClass));
+            }
+        }
+
+        else {
+            throw new PHPUnit_Framework_Exception;
+        }
+    }
+
+    /**
+     * Wraps both <code>addTest()</code> and <code>addTestSuite</code>
+     * as well as the separate import statements for the user's convenience.
+     *
+     * If the named file cannot be read or there are no new tests that can be
+     * added, a <code>PHPUnit_Framework_Warning</code> will be created instead,
+     * leaving the current test run untouched.
+     *
+     * @param  string  $filename
+     * @param  array   $phptOptions Array with ini settings for the php instance
+     *                              run, key being the name if the setting,
+     *                              value the ini value.
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 2.3.0
+     * @author Stefano F. Rausch <stefano@rausch-e.net>
+     */
+    public function addTestFile($filename, $phptOptions = array())
+    {
+        if (!is_string($filename)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (file_exists($filename) && substr($filename, -5) == '.phpt') {
+            $this->addTest(
+              new PHPUnit_Extensions_PhptTestCase($filename, $phptOptions)
+            );
+
+            return;
+        }
+
+        PHPUnit_Util_Class::collectStart();
+        $filename   = PHPUnit_Util_Fileloader::checkAndLoad($filename);
+        $newClasses = PHPUnit_Util_Class::collectEnd();
+        $baseName   = str_replace('.php', '', basename($filename));
+
+        foreach ($newClasses as $className) {
+            if (substr($className, 0 - strlen($baseName)) == $baseName) {
+                $class = new ReflectionClass($className);
+
+                if ($class->getFileName() == $filename) {
+                    $newClasses = array($className);
+                    break;
+                }
+            }
+        }
+
+        $testsFound = FALSE;
+
+        foreach ($newClasses as $className) {
+            $class = new ReflectionClass($className);
+
+            if (!$class->isAbstract()) {
+                if ($class->hasMethod(PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME)) {
+                    $method = $class->getMethod(
+                      PHPUnit_Runner_BaseTestRunner::SUITE_METHODNAME
+                    );
+
+                    if ($method->isStatic()) {
+                        $this->addTest($method->invoke(NULL, $className));
+
+                        $testsFound = TRUE;
+                    }
+                }
+
+                else if ($class->implementsInterface('PHPUnit_Framework_Test')) {
+                    $this->addTestSuite($class);
+
+                    $testsFound = TRUE;
+                }
+            }
+        }
+
+        $this->numTests = -1;
+    }
+
+    /**
+     * Wrapper for addTestFile() that adds multiple test files.
+     *
+     * @param  array|Iterator $filenames
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 2.3.0
+     */
+    public function addTestFiles($filenames)
+    {
+        if (!(is_array($filenames) ||
+             (is_object($filenames) && $filenames instanceof Iterator))) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(
+              1, 'array or iterator'
+            );
+        }
+
+        foreach ($filenames as $filename) {
+            $this->addTestFile((string)$filename);
+        }
+    }
+
+    /**
+     * Counts the number of test cases that will be run by this test.
+     *
+     * @return integer
+     */
+    public function count()
+    {
+        if ($this->numTests > -1) {
+            return $this->numTests;
+        }
+
+        $this->numTests = 0;
+
+        foreach ($this->tests as $test) {
+            $this->numTests += count($test);
+        }
+
+        return $this->numTests;
+    }
+
+    /**
+     * @param  ReflectionClass $theClass
+     * @param  string          $name
+     * @return PHPUnit_Framework_Test
+     * @throws PHPUnit_Framework_Exception
+     */
+    public static function createTest(ReflectionClass $theClass, $name)
+    {
+        $className = $theClass->getName();
+
+        if (!$theClass->isInstantiable()) {
+            return self::warning(
+              sprintf('Cannot instantiate class "%s".', $className)
+            );
+        }
+
+        $backupSettings           = PHPUnit_Util_Test::getBackupSettings(
+                                      $className, $name
+                                    );
+        $preserveGlobalState      = PHPUnit_Util_Test::getPreserveGlobalStateSettings(
+                                      $className, $name
+                                    );
+        $runTestInSeparateProcess = PHPUnit_Util_Test::getProcessIsolationSettings(
+                                      $className, $name
+                                    );
+
+        $constructor = $theClass->getConstructor();
+
+        if ($constructor !== NULL) {
+            $parameters = $constructor->getParameters();
+
+            // TestCase() or TestCase($name)
+            if (count($parameters) < 2) {
+                $test = new $className;
+            }
+
+            // TestCase($name, $data)
+            else {
+                try {
+                    $data = PHPUnit_Util_Test::getProvidedData(
+                      $className, $name
+                    );
+                }
+
+                catch (Exception $e) {
+                    $message = sprintf(
+                      'The data provider specified for %s::%s is invalid.',
+                      $className,
+                      $name
+                    );
+
+                    $_message = $e->getMessage();
+
+                    if (!empty($_message)) {
+                        $message .= "\n" . $_message;
+                    }
+
+                    $data = self::warning($message);
+                }
+
+                // Test method with @dataProvider.
+                if (isset($data)) {
+                    $test = new PHPUnit_Framework_TestSuite_DataProvider(
+                      $className . '::' . $name
+                    );
+
+                    if (empty($data)) {
+                        $data = self::warning(
+                          sprintf(
+                            'No tests found in suite "%s".',
+                            $test->getName()
+                          )
+                        );
+                    }
+
+                    if ($data instanceof PHPUnit_Framework_Warning) {
+                        $test->addTest($data);
+                    }
+
+                    else {
+                        $groups = PHPUnit_Util_Test::getGroups($className, $name);
+
+                        foreach ($data as $_dataName => $_data) {
+                            $_test = new $className($name, $_data, $_dataName);
+
+                            if ($runTestInSeparateProcess) {
+                                $_test->setRunTestInSeparateProcess(TRUE);
+
+                                if ($preserveGlobalState !== NULL) {
+                                    $_test->setPreserveGlobalState($preserveGlobalState);
+                                }
+                            }
+
+                            if ($backupSettings['backupGlobals'] !== NULL) {
+                                $_test->setBackupGlobals(
+                                  $backupSettings['backupGlobals']
+                                );
+                            }
+
+                            if ($backupSettings['backupStaticAttributes'] !== NULL) {
+                                $_test->setBackupStaticAttributes(
+                                  $backupSettings['backupStaticAttributes']
+                                );
+                            }
+
+                            $test->addTest($_test, $groups);
+                        }
+                    }
+                }
+
+                else {
+                    $test = new $className;
+                }
+            }
+        }
+
+        if (!isset($test)) {
+            throw new PHPUnit_Framework_Exception('No valid test provided.');
+        }
+
+        if ($test instanceof PHPUnit_Framework_TestCase) {
+            $test->setName($name);
+
+            if ($runTestInSeparateProcess) {
+                $test->setRunTestInSeparateProcess(TRUE);
+
+                if ($preserveGlobalState !== NULL) {
+                    $test->setPreserveGlobalState($preserveGlobalState);
+                }
+            }
+
+            if ($backupSettings['backupGlobals'] !== NULL) {
+                $test->setBackupGlobals($backupSettings['backupGlobals']);
+            }
+
+            if ($backupSettings['backupStaticAttributes'] !== NULL) {
+                $test->setBackupStaticAttributes(
+                  $backupSettings['backupStaticAttributes']
+                );
+            }
+        }
+
+        return $test;
+    }
+
+    /**
+     * Creates a default TestResult object.
+     *
+     * @return PHPUnit_Framework_TestResult
+     */
+    protected function createResult()
+    {
+        return new PHPUnit_Framework_TestResult;
+    }
+
+    /**
+     * Returns the name of the suite.
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the test groups of the suite.
+     *
+     * @return array
+     * @since  Method available since Release 3.2.0
+     */
+    public function getGroups()
+    {
+        return array_keys($this->groups);
+    }
+
+    /**
+     * Runs the tests and collects their result in a TestResult.
+     *
+     * @param  PHPUnit_Framework_TestResult $result
+     * @param  mixed                        $filter
+     * @param  array                        $groups
+     * @param  array                        $excludeGroups
+     * @param  boolean                      $processIsolation
+     * @return PHPUnit_Framework_TestResult
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function run(PHPUnit_Framework_TestResult $result = NULL, $filter = FALSE, array $groups = array(), array $excludeGroups = array(), $processIsolation = FALSE)
+    {
+        if ($result === NULL) {
+            $result = $this->createResult();
+        }
+
+        $result->startTestSuite($this);
+
+        $doSetup = TRUE;
+
+        if (!empty($excludeGroups)) {
+            foreach ($this->groups as $_group => $_tests) {
+                if (in_array($_group, $excludeGroups) &&
+                    count($_tests) == count($this->tests)) {
+                    $doSetup = FALSE;
+                }
+            }
+        }
+
+        if ($doSetup) {
+            try {
+                $this->setUp();
+
+                if ($this->testCase &&
+                    // Some extensions use test names that are not classes;
+                    // The method_exists() triggers an autoload call that causes issues with die()ing autoloaders.
+                    class_exists($this->name, false) &&
+                    method_exists($this->name, 'setUpBeforeClass')) {
+                    call_user_func(array($this->name, 'setUpBeforeClass'));
+                }
+            }
+
+            catch (PHPUnit_Framework_SkippedTestSuiteError $e) {
+                $numTests = count($this);
+
+                for ($i = 0; $i < $numTests; $i++) {
+                    $result->addFailure($this, $e, 0);
+                }
+
+                return $result;
+            }
+
+            catch (Exception $e) {
+                $numTests = count($this);
+
+                for ($i = 0; $i < $numTests; $i++) {
+                    $result->addError($this, $e, 0);
+                }
+
+                return $result;
+            }
+        }
+
+        if (empty($groups)) {
+            $tests = $this->tests;
+        } else {
+            $tests = new SplObjectStorage;
+
+            foreach ($groups as $group) {
+                if (isset($this->groups[$group])) {
+                    foreach ($this->groups[$group] as $test) {
+                        $tests->attach($test);
+                    }
+                }
+            }
+        }
+
+        foreach ($tests as $test) {
+            if ($result->shouldStop()) {
+                break;
+            }
+
+            if ($test instanceof PHPUnit_Framework_TestSuite) {
+                $test->setBackupGlobals($this->backupGlobals);
+                $test->setBackupStaticAttributes($this->backupStaticAttributes);
+
+                $test->run(
+                  $result, $filter, $groups, $excludeGroups, $processIsolation
+                );
+            } else {
+                $runTest = TRUE;
+
+                if ($filter !== FALSE ) {
+                    $tmp = PHPUnit_Util_Test::describe($test, FALSE);
+
+                    if ($tmp[0] != '') {
+                        $name = join('::', $tmp);
+                    } else {
+                        $name = $tmp[1];
+                    }
+
+                    if (preg_match($filter, $name) == 0) {
+                        $runTest = FALSE;
+                    }
+                }
+
+                if ($runTest && !empty($excludeGroups)) {
+                    foreach ($this->groups as $_group => $_tests) {
+                        if (in_array($_group, $excludeGroups)) {
+                            foreach ($_tests as $_test) {
+                                if ($test === $_test) {
+                                    $runTest = FALSE;
+                                    break 2;
+                                }
+                            }
+                        }
+                    }
+                }
+
+                if ($runTest) {
+                    if ($test instanceof PHPUnit_Framework_TestCase) {
+                        $test->setBackupGlobals($this->backupGlobals);
+                        $test->setBackupStaticAttributes(
+                          $this->backupStaticAttributes
+                        );
+                        $test->setRunTestInSeparateProcess($processIsolation);
+                    }
+
+                    $this->runTest($test, $result);
+                }
+            }
+        }
+
+        if ($doSetup) {
+            if ($this->testCase &&
+                // Some extensions use test names that are not classes;
+                // The method_exists() triggers an autoload call that causes issues with die()ing autoloaders.
+                class_exists($this->name, false) &&
+                method_exists($this->name, 'tearDownAfterClass')) {
+                call_user_func(array($this->name, 'tearDownAfterClass'));
+            }
+
+            $this->tearDown();
+        }
+
+        $result->endTestSuite($this);
+
+        return $result;
+    }
+
+    /**
+     * Runs a test.
+     *
+     * @param  PHPUnit_Framework_Test        $test
+     * @param  PHPUnit_Framework_TestResult  $result
+     */
+    public function runTest(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result)
+    {
+        $test->run($result);
+    }
+
+    /**
+     * Sets the name of the suite.
+     *
+     * @param  string
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Returns the test at the given index.
+     *
+     * @param  integer
+     * @return PHPUnit_Framework_Test
+     */
+    public function testAt($index)
+    {
+        if (isset($this->tests[$index])) {
+            return $this->tests[$index];
+        } else {
+            return FALSE;
+        }
+    }
+
+    /**
+     * Returns the tests as an enumeration.
+     *
+     * @return array
+     */
+    public function tests()
+    {
+        return $this->tests;
+    }
+
+    /**
+     * Mark the test suite as skipped.
+     *
+     * @param  string  $message
+     * @throws PHPUnit_Framework_SkippedTestSuiteError
+     * @since  Method available since Release 3.0.0
+     */
+    public function markTestSuiteSkipped($message = '')
+    {
+        throw new PHPUnit_Framework_SkippedTestSuiteError($message);
+    }
+
+    /**
+     * @param ReflectionClass  $class
+     * @param ReflectionMethod $method
+     */
+    protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method)
+    {
+        $name = $method->getName();
+
+        if ($this->isPublicTestMethod($method)) {
+            $test = self::createTest($class, $name);
+
+            if ($test instanceof PHPUnit_Framework_TestCase ||
+                $test instanceof PHPUnit_Framework_TestSuite_DataProvider) {
+                $test->setDependencies(
+                  PHPUnit_Util_Test::getDependencies($class->getName(), $name)
+                );
+            }
+
+            $this->addTest($test, PHPUnit_Util_Test::getGroups(
+              $class->getName(), $name)
+            );
+        }
+
+        else if ($this->isTestMethod($method)) {
+            $this->addTest(
+              self::warning(
+                sprintf(
+                  'Test method "%s" in test class "%s" is not public.',
+                  $name,
+                  $class->getName()
+                )
+              )
+            );
+        }
+    }
+
+    /**
+     * @param  ReflectionMethod $method
+     * @return boolean
+     */
+    public static function isPublicTestMethod(ReflectionMethod $method)
+    {
+        return (self::isTestMethod($method) && $method->isPublic());
+    }
+
+    /**
+     * @param  ReflectionMethod $method
+     * @return boolean
+     */
+    public static function isTestMethod(ReflectionMethod $method)
+    {
+        if (strpos($method->name, 'test') === 0) {
+            return TRUE;
+        }
+
+        // @scenario on TestCase::testMethod()
+        // @test     on TestCase::testMethod()
+        return strpos($method->getDocComment(), '@test')     !== FALSE ||
+               strpos($method->getDocComment(), '@scenario') !== FALSE;
+    }
+
+    /**
+     * @param  string  $message
+     * @return PHPUnit_Framework_Warning
+     */
+    protected static function warning($message)
+    {
+        return new PHPUnit_Framework_Warning($message);
+    }
+
+    /**
+     * @param  boolean $backupGlobals
+     * @since  Method available since Release 3.3.0
+     */
+    public function setBackupGlobals($backupGlobals)
+    {
+        if (is_null($this->backupGlobals) && is_bool($backupGlobals)) {
+            $this->backupGlobals = $backupGlobals;
+        }
+    }
+
+    /**
+     * @param  boolean $backupStaticAttributes
+     * @since  Method available since Release 3.4.0
+     */
+    public function setBackupStaticAttributes($backupStaticAttributes)
+    {
+        if (is_null($this->backupStaticAttributes) &&
+            is_bool($backupStaticAttributes)) {
+            $this->backupStaticAttributes = $backupStaticAttributes;
+        }
+    }
+
+    /**
+     * Returns an iterator for this test suite.
+     *
+     * @return RecursiveIteratorIterator
+     * @since  Method available since Release 3.1.0
+     */
+    public function getIterator()
+    {
+        return new RecursiveIteratorIterator(
+          new PHPUnit_Util_TestSuiteIterator($this)
+        );
+    }
+
+    /**
+     * Template Method that is called before the tests
+     * of this test suite are run.
+     *
+     * @since  Method available since Release 3.1.0
+     */
+    protected function setUp()
+    {
+    }
+
+    /**
+     * Template Method that is called after the tests
+     * of this test suite have finished running.
+     *
+     * @since  Method available since Release 3.1.0
+     */
+    protected function tearDown()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite/DataProvider.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite/DataProvider.php
new file mode 100644
index 0000000..7bc74c7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite/DataProvider.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_TestSuite
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Framework_TestSuite
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Framework_TestSuite_DataProvider extends PHPUnit_Framework_TestSuite
+{
+    /**
+     * Sets the dependencies of a TestCase.
+     *
+     * @param array $dependencies
+     */
+    public function setDependencies(array $dependencies)
+    {
+        foreach ($this->tests as $test) {
+            $test->setDependencies($dependencies);
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Framework/Warning.php b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Warning.php
new file mode 100644
index 0000000..2364d32
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Framework/Warning.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A warning.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_Warning extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $message = '';
+
+    /**
+     * @var boolean
+     */
+    protected $backupGlobals = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $backupStaticAttributes = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $runTestInSeparateProcess = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $useErrorHandler = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $useOutputBuffering = FALSE;
+
+    /**
+     * @param string $message
+     */
+    public function __construct($message = '')
+    {
+        $this->message = $message;
+        parent::__construct('Warning');
+    }
+
+    /**
+     * @throws PHPUnit_Framework_Exception
+     */
+    protected function runTest()
+    {
+        $this->fail($this->message);
+    }
+
+    /**
+     * @return string
+     * @since  Method available since Release 3.0.0
+     */
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+    /**
+     * Returns a string representation of the test case.
+     *
+     * @return string
+     * @since  Method available since Release 3.4.0
+     */
+    public function toString()
+    {
+        return 'Warning';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Runner/BaseTestRunner.php b/core/vendor/phpunit/phpunit/PHPUnit/Runner/BaseTestRunner.php
new file mode 100644
index 0000000..d3e3278
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Runner/BaseTestRunner.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Base class for all test runners.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+abstract class PHPUnit_Runner_BaseTestRunner
+{
+    const STATUS_PASSED     = 0;
+    const STATUS_SKIPPED    = 1;
+    const STATUS_INCOMPLETE = 2;
+    const STATUS_FAILURE    = 3;
+    const STATUS_ERROR      = 4;
+    const SUITE_METHODNAME  = 'suite';
+
+    /**
+     * Returns the loader to be used.
+     *
+     * @return PHPUnit_Runner_TestSuiteLoader
+     */
+    public function getLoader()
+    {
+        return new PHPUnit_Runner_StandardTestSuiteLoader;
+    }
+
+    /**
+     * Returns the Test corresponding to the given suite.
+     * This is a template method, subclasses override
+     * the runFailed() and clearStatus() methods.
+     *
+     * @param  string  $suiteClassName
+     * @param  string  $suiteClassFile
+     * @param  mixed   $suffixes
+     * @return PHPUnit_Framework_Test
+     */
+    public function getTest($suiteClassName, $suiteClassFile = '', $suffixes = '')
+    {
+        if (is_dir($suiteClassName) &&
+            !is_file($suiteClassName . '.php') && empty($suiteClassFile)) {
+            $facade = new File_Iterator_Facade;
+            $files  = $facade->getFilesAsArray(
+              $suiteClassName, $suffixes
+            );
+
+            $suite = new PHPUnit_Framework_TestSuite($suiteClassName);
+            $suite->addTestFiles($files);
+
+            return $suite;
+        }
+
+        try {
+            $testClass = $this->loadSuiteClass(
+              $suiteClassName, $suiteClassFile
+            );
+        }
+
+        catch (Exception $e) {
+            $this->runFailed($e->getMessage());
+            return NULL;
+        }
+
+        try {
+            $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
+
+            if (!$suiteMethod->isStatic()) {
+                $this->runFailed(
+                  'suite() method must be static.'
+                );
+
+                return NULL;
+            }
+
+            try {
+                $test = $suiteMethod->invoke(NULL, $testClass->getName());
+            }
+
+            catch (ReflectionException $e) {
+                $this->runFailed(
+                  sprintf(
+                    "Failed to invoke suite() method.\n%s",
+
+                    $e->getMessage()
+                  )
+                );
+
+                return NULL;
+            }
+        }
+
+        catch (ReflectionException $e) {
+            try {
+                $test = new PHPUnit_Framework_TestSuite($testClass);
+            }
+
+            catch (PHPUnit_Framework_Exception $e) {
+                $test = new PHPUnit_Framework_TestSuite;
+                $test->setName($suiteClassName);
+            }
+        }
+
+        $this->clearStatus();
+
+        return $test;
+    }
+
+    /**
+     * Returns the loaded ReflectionClass for a suite name.
+     *
+     * @param  string  $suiteClassName
+     * @param  string  $suiteClassFile
+     * @return ReflectionClass
+     */
+    protected function loadSuiteClass($suiteClassName, $suiteClassFile = '')
+    {
+        $loader = $this->getLoader();
+
+        if ($loader instanceof PHPUnit_Runner_StandardTestSuiteLoader) {
+            return $loader->load($suiteClassName, $suiteClassFile);
+        } else {
+            return $loader->load($suiteClassName, $suiteClassFile);
+        }
+    }
+
+    /**
+     * Clears the status message.
+     *
+     */
+    protected function clearStatus()
+    {
+    }
+
+    /**
+     * Override to define how to handle a failed loading of
+     * a test suite.
+     *
+     * @param  string  $message
+     */
+    abstract protected function runFailed($message);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Runner/StandardTestSuiteLoader.php b/core/vendor/phpunit/phpunit/PHPUnit/Runner/StandardTestSuiteLoader.php
new file mode 100644
index 0000000..a108c5a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Runner/StandardTestSuiteLoader.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * The standard test suite loader.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Runner_StandardTestSuiteLoader implements PHPUnit_Runner_TestSuiteLoader
+{
+    /**
+     * @param  string  $suiteClassName
+     * @param  string  $suiteClassFile
+     * @return ReflectionClass
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function load($suiteClassName, $suiteClassFile = '')
+    {
+        $suiteClassName = str_replace('.php', '', $suiteClassName);
+
+        if (empty($suiteClassFile)) {
+            $suiteClassFile = PHPUnit_Util_Filesystem::classNameToFilename(
+              $suiteClassName
+            );
+        }
+
+        if (!class_exists($suiteClassName, FALSE)) {
+            PHPUnit_Util_Class::collectStart();
+            $filename = PHPUnit_Util_Fileloader::checkAndLoad($suiteClassFile);
+            $loadedClasses = PHPUnit_Util_Class::collectEnd();
+        }
+
+        if (!class_exists($suiteClassName, FALSE) && !empty($loadedClasses)) {
+            $offset = 0 - strlen($suiteClassName);
+
+            foreach ($loadedClasses as $loadedClass) {
+                $class = new ReflectionClass($loadedClass);
+                if (substr($loadedClass, $offset) === $suiteClassName &&
+                    $class->getFileName() == $filename) {
+                    $suiteClassName = $loadedClass;
+                    break;
+                }
+            }
+        }
+
+        if (!class_exists($suiteClassName, FALSE) && !empty($loadedClasses)) {
+            $testCaseClass = 'PHPUnit_Framework_TestCase';
+
+            foreach ($loadedClasses as $loadedClass) {
+                $class     = new ReflectionClass($loadedClass);
+                $classFile = $class->getFileName();
+
+                if ($class->isSubclassOf($testCaseClass) &&
+                    !$class->isAbstract()) {
+                    $suiteClassName = $loadedClass;
+                    $testCaseClass  = $loadedClass;
+
+                    if ($classFile == realpath($suiteClassFile)) {
+                        break;
+                    }
+                }
+
+                if ($class->hasMethod('suite')) {
+                    $method = $class->getMethod('suite');
+
+                    if (!$method->isAbstract() &&
+                        $method->isPublic() &&
+                        $method->isStatic()) {
+                        $suiteClassName = $loadedClass;
+
+                        if ($classFile == realpath($suiteClassFile)) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (class_exists($suiteClassName, FALSE)) {
+            $class = new ReflectionClass($suiteClassName);
+
+            if ($class->getFileName() == realpath($suiteClassFile)) {
+                return $class;
+            }
+        }
+
+        throw new PHPUnit_Framework_Exception(
+          sprintf(
+            'Class %s could not be found in %s.',
+
+            $suiteClassName,
+            $suiteClassFile
+          )
+        );
+    }
+
+    /**
+     * @param  ReflectionClass  $aClass
+     * @return ReflectionClass
+     */
+    public function reload(ReflectionClass $aClass)
+    {
+        return $aClass;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Runner/TestSuiteLoader.php b/core/vendor/phpunit/phpunit/PHPUnit/Runner/TestSuiteLoader.php
new file mode 100644
index 0000000..9774018
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Runner/TestSuiteLoader.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * An interface to define how a test suite should be loaded.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 2.0.0
+ */
+interface PHPUnit_Runner_TestSuiteLoader
+{
+    /**
+     * @param  string  $suiteClassName
+     * @param  string  $suiteClassFile
+     * @return ReflectionClass
+     */
+    public function load($suiteClassName, $suiteClassFile = '');
+
+    /**
+     * @param  ReflectionClass $aClass
+     * @return ReflectionClass
+     */
+    public function reload(ReflectionClass $aClass);
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Runner/Version.php b/core/vendor/phpunit/phpunit/PHPUnit/Runner/Version.php
new file mode 100644
index 0000000..b9414f6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Runner/Version.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * This class defines the current version of PHPUnit.
+ *
+ * @package    PHPUnit
+ * @subpackage Runner
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Runner_Version
+{
+    /**
+     * Returns the current version of PHPUnit.
+     *
+     * @return string
+     */
+    public static function id()
+    {
+        return '@package_version@';
+    }
+
+    /**
+     * @return string
+     */
+    public static function getVersionString()
+    {
+        return 'PHPUnit @package_version@ by Sebastian Bergmann.';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php b/core/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php
new file mode 100644
index 0000000..f50154f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php
@@ -0,0 +1,906 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage TextUI
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * A TestRunner for the Command Line Interface (CLI)
+ * PHP SAPI Module.
+ *
+ * @package    PHPUnit
+ * @subpackage TextUI
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_TextUI_Command
+{
+    /**
+     * @var array
+     */
+    protected $arguments = array(
+      'listGroups'              => FALSE,
+      'loader'                  => NULL,
+      'useDefaultConfiguration' => TRUE
+    );
+
+    /**
+     * @var array
+     */
+    protected $options = array();
+
+    /**
+     * @var array
+     */
+    protected $longOptions = array(
+      'colors' => NULL,
+      'bootstrap=' => NULL,
+      'configuration=' => NULL,
+      'coverage-html=' => NULL,
+      'coverage-clover=' => NULL,
+      'coverage-php=' => NULL,
+      'coverage-text==' => NULL,
+      'debug' => NULL,
+      'exclude-group=' => NULL,
+      'filter=' => NULL,
+      'testsuite=' => NULL,
+      'group=' => NULL,
+      'help' => NULL,
+      'include-path=' => NULL,
+      'list-groups' => NULL,
+      'loader=' => NULL,
+      'log-json=' => NULL,
+      'log-junit=' => NULL,
+      'log-tap=' => NULL,
+      'process-isolation' => NULL,
+      'repeat=' => NULL,
+      'stderr' => NULL,
+      'stop-on-error' => NULL,
+      'stop-on-failure' => NULL,
+      'stop-on-incomplete' => NULL,
+      'stop-on-skipped' => NULL,
+      'strict' => NULL,
+      'tap' => NULL,
+      'testdox' => NULL,
+      'testdox-html=' => NULL,
+      'testdox-text=' => NULL,
+      'test-suffix=' => NULL,
+      'no-configuration' => NULL,
+      'no-globals-backup' => NULL,
+      'printer=' => NULL,
+      'static-backup' => NULL,
+      'verbose' => NULL,
+      'version' => NULL
+    );
+
+    /**
+     * @var array
+     */
+    protected $missingExtensions = array();
+
+    /**
+     * @param boolean $exit
+     */
+    public static function main($exit = TRUE)
+    {
+        $command = new PHPUnit_TextUI_Command;
+        return $command->run($_SERVER['argv'], $exit);
+    }
+
+    /**
+     * @param array   $argv
+     * @param boolean $exit
+     */
+    public function run(array $argv, $exit = TRUE)
+    {
+        $this->handleArguments($argv);
+
+        $runner = $this->createRunner();
+
+        if (is_object($this->arguments['test']) &&
+            $this->arguments['test'] instanceof PHPUnit_Framework_Test) {
+            $suite = $this->arguments['test'];
+        } else {
+            $suite = $runner->getTest(
+              $this->arguments['test'],
+              $this->arguments['testFile'],
+              $this->arguments['testSuffixes']
+            );
+        }
+
+        if ($this->arguments['listGroups']) {
+            PHPUnit_TextUI_TestRunner::printVersionString();
+
+            print "Available test group(s):\n";
+
+            $groups = $suite->getGroups();
+            sort($groups);
+
+            foreach ($groups as $group) {
+                print " - $group\n";
+            }
+
+            if ($exit) {
+                exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
+            } else {
+                return PHPUnit_TextUI_TestRunner::SUCCESS_EXIT;
+            }
+        }
+
+        unset($this->arguments['test']);
+        unset($this->arguments['testFile']);
+
+        try {
+            $result = $runner->doRun($suite, $this->arguments);
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            print $e->getMessage() . "\n";
+        }
+
+        $ret = PHPUnit_TextUI_TestRunner::FAILURE_EXIT;
+
+        if (isset($result) && $result->wasSuccessful()) {
+            $ret = PHPUnit_TextUI_TestRunner::SUCCESS_EXIT;
+        }
+
+        else if (!isset($result) || $result->errorCount() > 0) {
+            $ret = PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT;
+        }
+
+        if ($exit) {
+            exit($ret);
+        } else {
+            return $ret;
+        }
+    }
+
+    /**
+     * Create a TestRunner, override in subclasses.
+     *
+     * @return PHPUnit_TextUI_TestRunner
+     * @since  Method available since Release 3.6.0
+     */
+    protected function createRunner()
+    {
+        return new PHPUnit_TextUI_TestRunner($this->arguments['loader']);
+    }
+
+    /**
+     * Handles the command-line arguments.
+     *
+     * A child class of PHPUnit_TextUI_Command can hook into the argument
+     * parsing by adding the switch(es) to the $longOptions array and point to a
+     * callback method that handles the switch(es) in the child class like this
+     *
+     * <code>
+     * <?php
+     * class MyCommand extends PHPUnit_TextUI_Command
+     * {
+     *     public function __construct()
+     *     {
+     *         $this->longOptions['--my-switch'] = 'myHandler';
+     *     }
+     *
+     *     // --my-switch foo -> myHandler('foo')
+     *     protected function myHandler($value)
+     *     {
+     *     }
+     * }
+     * </code>
+     *
+     * @param array $argv
+     */
+    protected function handleArguments(array $argv)
+    {
+        try {
+            $this->options = PHPUnit_Util_Getopt::getopt(
+              $argv,
+              'd:c:hv',
+              array_keys($this->longOptions)
+            );
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            PHPUnit_TextUI_TestRunner::showError($e->getMessage());
+        }
+
+        foreach ($this->options[0] as $option) {
+            switch ($option[0]) {
+                case '--colors': {
+                    $this->arguments['colors'] = TRUE;
+                }
+                break;
+
+                case '--bootstrap': {
+                    $this->arguments['bootstrap'] = $option[1];
+                }
+                break;
+
+                case 'c':
+                case '--configuration': {
+                    $this->arguments['configuration'] = $option[1];
+                }
+                break;
+
+                case '--coverage-clover':
+                case '--coverage-html':
+                case '--coverage-php':
+                case '--coverage-text': {
+                    if (!extension_loaded('tokenizer')) {
+                        $this->showExtensionNotLoadedMessage(
+                          'tokenizer', 'No code coverage will be generated.'
+                        );
+
+                        continue;
+                    }
+
+                    if (!extension_loaded('xdebug')) {
+                        $this->showExtensionNotLoadedMessage(
+                          'Xdebug', 'No code coverage will be generated.'
+                        );
+
+                        continue;
+                    }
+
+                    switch ($option[0]) {
+                        case '--coverage-clover': {
+                            $this->arguments['coverageClover'] = $option[1];
+                        }
+                        break;
+
+                        case '--coverage-html': {
+                            $this->arguments['reportDirectory'] = $option[1];
+                        }
+                        break;
+
+                        case '--coverage-php': {
+                            $this->arguments['coveragePHP'] = $option[1];
+                        }
+                        break;
+
+                        case '--coverage-text': {
+                            if ($option[1] === NULL) {
+                                $option[1] = 'php://stdout';
+                            }
+
+                            $this->arguments['coverageText'] = $option[1];
+                            $this->arguments['coverageTextShowUncoveredFiles'] = FALSE;
+                        }
+                        break;
+                    }
+                }
+                break;
+
+                case 'd': {
+                    $ini = explode('=', $option[1]);
+
+                    if (isset($ini[0])) {
+                        if (isset($ini[1])) {
+                            ini_set($ini[0], $ini[1]);
+                        } else {
+                            ini_set($ini[0], TRUE);
+                        }
+                    }
+                }
+                break;
+
+                case '--debug': {
+                    $this->arguments['debug'] = TRUE;
+                }
+                break;
+
+                case 'h':
+                case '--help': {
+                    $this->showHelp();
+                    exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
+                }
+                break;
+
+                case '--filter': {
+                    $this->arguments['filter'] = $option[1];
+                }
+                break;
+
+                case '--testsuite': {
+                    $this->arguments['testsuite'] = $option[1];
+                }
+                break;
+
+                case '--group': {
+                    $this->arguments['groups'] = explode(',', $option[1]);
+                }
+                break;
+
+                case '--exclude-group': {
+                    $this->arguments['excludeGroups'] = explode(
+                      ',', $option[1]
+                    );
+                }
+                break;
+
+                case '--test-suffix': {
+                    $this->arguments['testSuffixes'] = explode(
+                      ',', $option[1]
+                    );
+                }
+                break;
+
+                case '--include-path': {
+                    $includePath = $option[1];
+                }
+                break;
+
+                case '--list-groups': {
+                    $this->arguments['listGroups'] = TRUE;
+                }
+                break;
+
+                case '--printer': {
+                    $this->arguments['printer'] = $option[1];
+                }
+                break;
+
+                case '--loader': {
+                    $this->arguments['loader'] = $option[1];
+                }
+                break;
+
+                case '--log-json': {
+                    $this->arguments['jsonLogfile'] = $option[1];
+                }
+                break;
+
+                case '--log-junit': {
+                    $this->arguments['junitLogfile'] = $option[1];
+                }
+                break;
+
+                case '--log-tap': {
+                    $this->arguments['tapLogfile'] = $option[1];
+                }
+                break;
+
+                case '--process-isolation': {
+                    $this->arguments['processIsolation'] = TRUE;
+                }
+                break;
+
+                case '--repeat': {
+                    $this->arguments['repeat'] = (int)$option[1];
+                }
+                break;
+
+                case '--stderr': {
+                    $this->arguments['printer'] = new PHPUnit_TextUI_ResultPrinter(
+                      'php://stderr',
+                      isset($this->arguments['verbose']) ? $this->arguments['verbose'] : FALSE
+                    );
+                }
+                break;
+
+                case '--stop-on-error': {
+                    $this->arguments['stopOnError'] = TRUE;
+                }
+                break;
+
+                case '--stop-on-failure': {
+                    $this->arguments['stopOnFailure'] = TRUE;
+                }
+                break;
+
+                case '--stop-on-incomplete': {
+                    $this->arguments['stopOnIncomplete'] = TRUE;
+                }
+                break;
+
+                case '--stop-on-skipped': {
+                    $this->arguments['stopOnSkipped'] = TRUE;
+                }
+                break;
+
+                case '--tap': {
+                    $this->arguments['printer'] = new PHPUnit_Util_Log_TAP;
+                }
+                break;
+
+                case '--testdox': {
+                    $this->arguments['printer'] = new PHPUnit_Util_TestDox_ResultPrinter_Text;
+                }
+                break;
+
+                case '--testdox-html': {
+                    $this->arguments['testdoxHTMLFile'] = $option[1];
+                }
+                break;
+
+                case '--testdox-text': {
+                    $this->arguments['testdoxTextFile'] = $option[1];
+                }
+                break;
+
+                case '--no-configuration': {
+                    $this->arguments['useDefaultConfiguration'] = FALSE;
+                }
+                break;
+
+                case '--no-globals-backup': {
+                    $this->arguments['backupGlobals'] = FALSE;
+                }
+                break;
+
+                case '--static-backup': {
+                    $this->arguments['backupStaticAttributes'] = TRUE;
+                }
+                break;
+
+                case 'v':
+                case '--verbose': {
+                    $this->arguments['verbose'] = TRUE;
+                }
+                break;
+
+                case '--version': {
+                    PHPUnit_TextUI_TestRunner::printVersionString();
+                    exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
+                }
+                break;
+
+                case '--strict': {
+                    $this->arguments['strict'] = TRUE;
+                }
+                break;
+
+                default: {
+                    $optionName = str_replace('--', '', $option[0]);
+
+                    if (isset($this->longOptions[$optionName])) {
+                        $handler = $this->longOptions[$optionName];
+                    }
+
+                    else if (isset($this->longOptions[$optionName . '='])) {
+                        $handler = $this->longOptions[$optionName . '='];
+                    }
+
+                    if (isset($handler) && is_callable(array($this, $handler))) {
+                        $this->$handler($option[1]);
+                    }
+                }
+            }
+        }
+
+        $this->handleCustomTestSuite();
+
+        if (!isset($this->arguments['test'])) {
+            if (count($this->options[1]) > 2) {
+                $this->showMessage(
+                    'More than two positional arguments provided.',
+                    FALSE
+                );
+                $this->showHelp();
+                exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
+            }
+
+            if (isset($this->options[1][0])) {
+                $this->arguments['test'] = $this->options[1][0];
+            }
+
+            if (isset($this->options[1][1])) {
+                $this->arguments['testFile'] = $this->options[1][1];
+            } else {
+                $this->arguments['testFile'] = '';
+            }
+
+            if (isset($this->arguments['test']) &&
+                is_file($this->arguments['test']) &&
+                substr($this->arguments['test'], -5, 5) != '.phpt') {
+                $this->arguments['testFile'] = realpath($this->arguments['test']);
+                $this->arguments['test']     = substr($this->arguments['test'], 0, strrpos($this->arguments['test'], '.'));
+            }
+        }
+
+        if (!isset($this->arguments['testSuffixes'])) {
+            $this->arguments['testSuffixes'] = array('Test.php', '.phpt');
+        }
+
+        if (isset($includePath)) {
+            ini_set(
+              'include_path',
+              $includePath . PATH_SEPARATOR . ini_get('include_path')
+            );
+        }
+
+        if (isset($this->arguments['bootstrap'])) {
+            $this->handleBootstrap($this->arguments['bootstrap']);
+        }
+
+        if (isset($this->arguments['printer']) &&
+            is_string($this->arguments['printer'])) {
+            $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']);
+        }
+
+        if ($this->arguments['loader'] !== NULL) {
+            $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']);
+        }
+
+        if (isset($this->arguments['configuration']) &&
+            is_dir($this->arguments['configuration'])) {
+            $configurationFile = $this->arguments['configuration'] .
+                                 '/phpunit.xml';
+
+            if (file_exists($configurationFile)) {
+                $this->arguments['configuration'] = realpath(
+                  $configurationFile
+                );
+            }
+
+            else if (file_exists($configurationFile . '.dist')) {
+                $this->arguments['configuration'] = realpath(
+                  $configurationFile . '.dist'
+                );
+            }
+        }
+
+        else if (!isset($this->arguments['configuration']) &&
+                 $this->arguments['useDefaultConfiguration']) {
+            if (file_exists('phpunit.xml')) {
+                $this->arguments['configuration'] = realpath('phpunit.xml');
+            } else if (file_exists('phpunit.xml.dist')) {
+                $this->arguments['configuration'] = realpath(
+                  'phpunit.xml.dist'
+                );
+            }
+        }
+
+        if (isset($this->arguments['configuration'])) {
+            try {
+                $configuration = PHPUnit_Util_Configuration::getInstance(
+                  $this->arguments['configuration']
+                );
+            }
+
+            catch (Exception $e) {
+                print $e->getMessage() . "\n";
+                exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
+            }
+
+            $phpunit = $configuration->getPHPUnitConfiguration();
+
+            $configuration->handlePHPConfiguration();
+
+            if (!isset($this->arguments['bootstrap']) && isset($phpunit['bootstrap'])) {
+                $this->handleBootstrap($phpunit['bootstrap']);
+            }
+
+            if (isset($phpunit['printerClass'])) {
+                if (isset($phpunit['printerFile'])) {
+                    $file = $phpunit['printerFile'];
+                } else {
+                    $file = '';
+                }
+
+                $this->arguments['printer'] = $this->handlePrinter(
+                  $phpunit['printerClass'], $file
+                );
+            }
+
+            if (isset($phpunit['testSuiteLoaderClass'])) {
+                if (isset($phpunit['testSuiteLoaderFile'])) {
+                    $file = $phpunit['testSuiteLoaderFile'];
+                } else {
+                    $file = '';
+                }
+
+                $this->arguments['loader'] = $this->handleLoader(
+                  $phpunit['testSuiteLoaderClass'], $file
+                );
+            }
+
+            $logging = $configuration->getLoggingConfiguration();
+
+            if (isset($logging['coverage-html']) || isset($logging['coverage-clover']) || isset($logging['coverage-text']) ) {
+                if (!extension_loaded('tokenizer')) {
+                    $this->showExtensionNotLoadedMessage(
+                      'tokenizer', 'No code coverage will be generated.'
+                    );
+                }
+
+                else if (!extension_loaded('Xdebug')) {
+                    $this->showExtensionNotLoadedMessage(
+                      'Xdebug', 'No code coverage will be generated.'
+                    );
+                }
+            }
+
+            $browsers = $configuration->getSeleniumBrowserConfiguration();
+
+            if (!empty($browsers) &&
+                class_exists('PHPUnit_Extensions_SeleniumTestCase')) {
+                PHPUnit_Extensions_SeleniumTestCase::$browsers = $browsers;
+            }
+
+            if (!isset($this->arguments['test'])) {
+                $testSuite = $configuration->getTestSuiteConfiguration(isset($this->arguments['testsuite']) ? $this->arguments['testsuite'] : null);
+
+                if ($testSuite !== NULL) {
+                    $this->arguments['test'] = $testSuite;
+                }
+            }
+        }
+
+        if (isset($this->arguments['test']) && is_string($this->arguments['test']) && substr($this->arguments['test'], -5, 5) == '.phpt') {
+            $test = new PHPUnit_Extensions_PhptTestCase($this->arguments['test']);
+
+            $this->arguments['test'] = new PHPUnit_Framework_TestSuite;
+            $this->arguments['test']->addTest($test);
+        }
+
+        if (!isset($this->arguments['test']) ||
+            (isset($this->arguments['testDatabaseLogRevision']) && !isset($this->arguments['testDatabaseDSN']))) {
+            $this->showHelp();
+            exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
+        }
+    }
+
+    /**
+     * Handles the loading of the PHPUnit_Runner_TestSuiteLoader implementation.
+     *
+     * @param  string  $loaderClass
+     * @param  string  $loaderFile
+     * @return PHPUnit_Runner_TestSuiteLoader
+     */
+    protected function handleLoader($loaderClass, $loaderFile = '')
+    {
+        if (!class_exists($loaderClass, FALSE)) {
+            if ($loaderFile == '') {
+                $loaderFile = PHPUnit_Util_Filesystem::classNameToFilename(
+                  $loaderClass
+                );
+            }
+
+            $loaderFile = stream_resolve_include_path($loaderFile);
+
+            if ($loaderFile) {
+                require $loaderFile;
+            }
+        }
+
+        if (class_exists($loaderClass, FALSE)) {
+            $class = new ReflectionClass($loaderClass);
+
+            if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') &&
+                $class->isInstantiable()) {
+                $loader = $class->newInstance();
+            }
+        }
+
+        if (!isset($loader)) {
+            PHPUnit_TextUI_TestRunner::showError(
+              sprintf(
+                'Could not use "%s" as loader.',
+
+                $loaderClass
+              )
+            );
+        }
+
+        return $loader;
+    }
+
+    /**
+     * Handles the loading of the PHPUnit_Util_Printer implementation.
+     *
+     * @param  string $printerClass
+     * @param  string $printerFile
+     * @return PHPUnit_Util_Printer
+     */
+    protected function handlePrinter($printerClass, $printerFile = '')
+    {
+        if (!class_exists($printerClass, FALSE)) {
+            if ($printerFile == '') {
+                $printerFile = PHPUnit_Util_Filesystem::classNameToFilename(
+                  $printerClass
+                );
+            }
+
+            $printerFile = stream_resolve_include_path($printerFile);
+
+            if ($printerFile) {
+                require $printerFile;
+            }
+        }
+
+        if (class_exists($printerClass, FALSE)) {
+            $class = new ReflectionClass($printerClass);
+
+            if ($class->implementsInterface('PHPUnit_Framework_TestListener') &&
+                $class->isSubclassOf('PHPUnit_Util_Printer') &&
+                $class->isInstantiable()) {
+                $printer = $class->newInstance();
+            }
+        }
+
+        if (!isset($printer)) {
+            PHPUnit_TextUI_TestRunner::showError(
+              sprintf(
+                'Could not use "%s" as printer.',
+
+                $printerClass
+              )
+            );
+        }
+
+        return $printer;
+    }
+
+    /**
+     * Loads a bootstrap file.
+     *
+     * @param string $filename
+     */
+    protected function handleBootstrap($filename)
+    {
+        try {
+            PHPUnit_Util_Fileloader::checkAndLoad($filename);
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            PHPUnit_TextUI_TestRunner::showError($e->getMessage());
+        }
+    }
+
+    /**
+     * @param string  $message
+     * @since Method available since Release 3.6.0
+     */
+    protected function showExtensionNotLoadedMessage($extension, $message = '')
+    {
+        if (isset($this->missingExtensions[$extension])) {
+            return;
+        }
+
+        if (!empty($message)) {
+            $message = ' ' . $message;
+        }
+
+        $this->showMessage(
+          'The ' . $extension . ' extension is not loaded.' . $message . "\n",
+          FALSE
+        );
+
+        $this->missingExtensions[$extension] = TRUE;
+    }
+
+    /**
+     * Shows a message.
+     *
+     * @param string  $message
+     * @param boolean $exit
+     */
+    protected function showMessage($message, $exit = TRUE)
+    {
+        PHPUnit_TextUI_TestRunner::printVersionString();
+        print $message . "\n";
+
+        if ($exit) {
+            exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
+        } else {
+            print "\n";
+        }
+    }
+
+    /**
+     * Show the help message.
+     */
+    protected function showHelp()
+    {
+        PHPUnit_TextUI_TestRunner::printVersionString();
+
+        print <<<EOT
+Usage: phpunit [switches] UnitTest [UnitTest.php]
+       phpunit [switches] <directory>
+
+  --log-junit <file>        Log test execution in JUnit XML format to file.
+  --log-tap <file>          Log test execution in TAP format to file.
+  --log-json <file>         Log test execution in JSON format.
+
+  --coverage-clover <file>  Generate code coverage report in Clover XML format.
+  --coverage-html <dir>     Generate code coverage report in HTML format.
+  --coverage-php <file>     Serialize PHP_CodeCoverage object to file.
+  --coverage-text=<file>    Generate code coverage report in text format.
+                            Default to writing to the standard output.
+
+  --testdox-html <file>     Write agile documentation in HTML format to file.
+  --testdox-text <file>     Write agile documentation in Text format to file.
+
+  --filter <pattern>        Filter which tests to run.
+  --testsuite <pattern>     Filter which testsuite to run.
+  --group ...               Only runs tests from the specified group(s).
+  --exclude-group ...       Exclude tests from the specified group(s).
+  --list-groups             List available test groups.
+  --test-suffix ...         Only search for test in files with specified
+                            suffix(es). Default: Test.php,.phpt
+
+  --loader <loader>         TestSuiteLoader implementation to use.
+  --printer <printer>       TestSuiteListener implementation to use.
+  --repeat <times>          Runs the test(s) repeatedly.
+
+  --tap                     Report test execution progress in TAP format.
+  --testdox                 Report test execution progress in TestDox format.
+
+  --colors                  Use colors in output.
+  --stderr                  Write to STDERR instead of STDOUT.
+  --stop-on-error           Stop execution upon first error.
+  --stop-on-failure         Stop execution upon first error or failure.
+  --stop-on-skipped         Stop execution upon first skipped test.
+  --stop-on-incomplete      Stop execution upon first incomplete test.
+  --strict                  Run tests in strict mode.
+  -v|--verbose              Output more verbose information.
+  --debug                   Display debugging information during test execution.
+
+  --process-isolation       Run each test in a separate PHP process.
+  --no-globals-backup       Do not backup and restore \$GLOBALS for each test.
+  --static-backup           Backup and restore static attributes for each test.
+
+  --bootstrap <file>        A "bootstrap" PHP file that is run before the tests.
+  -c|--configuration <file> Read configuration from XML file.
+  --no-configuration        Ignore default configuration file (phpunit.xml).
+  --include-path <path(s)>  Prepend PHP's include_path with given path(s).
+  -d key[=value]            Sets a php.ini value.
+
+  -h|--help                 Prints this usage information.
+  --version                 Prints the version and exits.
+
+EOT;
+    }
+
+    /**
+     * Custom callback for test suite discovery.
+     */
+    protected function handleCustomTestSuite()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/TextUI/ResultPrinter.php b/core/vendor/phpunit/phpunit/PHPUnit/TextUI/ResultPrinter.php
new file mode 100644
index 0000000..dc4e6df
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/TextUI/ResultPrinter.php
@@ -0,0 +1,665 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage TextUI
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Prints the result of a TextUI TestRunner run.
+ *
+ * @package    PHPUnit
+ * @subpackage TextUI
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_TextUI_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
+{
+    const EVENT_TEST_START      = 0;
+    const EVENT_TEST_END        = 1;
+    const EVENT_TESTSUITE_START = 2;
+    const EVENT_TESTSUITE_END   = 3;
+
+    /**
+     * @var integer
+     */
+    protected $column = 0;
+
+    /**
+     * @var integer
+     */
+    protected $maxColumn;
+
+    /**
+     * @var boolean
+     */
+    protected $lastTestFailed = FALSE;
+
+    /**
+     * @var integer
+     */
+    protected $numAssertions = 0;
+
+    /**
+     * @var integer
+     */
+    protected $numTests = -1;
+
+    /**
+     * @var integer
+     */
+    protected $numTestsRun = 0;
+
+    /**
+     * @var integer
+     */
+    protected $numTestsWidth;
+
+    /**
+     * @var boolean
+     */
+    protected $colors = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $debug = FALSE;
+
+    /**
+     * @var boolean
+     */
+    protected $verbose = FALSE;
+
+    /**
+     * Constructor.
+     *
+     * @param  mixed   $out
+     * @param  boolean $verbose
+     * @param  boolean $colors
+     * @param  boolean $debug
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.0.0
+     */
+    public function __construct($out = NULL, $verbose = FALSE, $colors = FALSE, $debug = FALSE)
+    {
+        parent::__construct($out);
+
+        if (is_bool($verbose)) {
+            $this->verbose = $verbose;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'boolean');
+        }
+
+        if (is_bool($colors)) {
+            $this->colors = $colors;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(3, 'boolean');
+        }
+
+        if (is_bool($debug)) {
+            $this->debug = $debug;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(4, 'boolean');
+        }
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestResult $result
+     */
+    public function printResult(PHPUnit_Framework_TestResult $result)
+    {
+        $this->printHeader();
+
+        if ($result->errorCount() > 0) {
+            $this->printErrors($result);
+        }
+
+        if ($result->failureCount() > 0) {
+            if ($result->errorCount() > 0) {
+                print "\n--\n\n";
+            }
+
+            $this->printFailures($result);
+        }
+
+        if ($this->verbose) {
+            if ($result->deprecatedFeaturesCount() > 0) {
+                if ($result->failureCount() > 0) {
+                    print "\n--\n\nDeprecated PHPUnit features are being used";
+                }
+
+                foreach ($result->deprecatedFeatures() as $deprecatedFeature) {
+                    $this->write($deprecatedFeature . "\n\n");
+                }
+            }
+
+            if ($result->notImplementedCount() > 0) {
+                if ($result->failureCount() > 0) {
+                    print "\n--\n\n";
+                }
+
+                $this->printIncompletes($result);
+            }
+
+            if ($result->skippedCount() > 0) {
+                if ($result->notImplementedCount() > 0) {
+                    print "\n--\n\n";
+                }
+
+                $this->printSkipped($result);
+            }
+        }
+
+        $this->printFooter($result);
+    }
+
+    /**
+     * @param  array   $defects
+     * @param  integer $count
+     * @param  string  $type
+     */
+    protected function printDefects(array $defects, $count, $type)
+    {
+        static $called = FALSE;
+
+        if ($count == 0) {
+            return;
+        }
+
+        $this->write(
+          sprintf(
+            "%sThere %s %d %s%s:\n",
+
+            $called ? "\n" : '',
+            ($count == 1) ? 'was' : 'were',
+            $count,
+            $type,
+            ($count == 1) ? '' : 's'
+          )
+        );
+
+        $i = 1;
+
+        foreach ($defects as $defect) {
+            $this->printDefect($defect, $i++);
+        }
+
+        $called = TRUE;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestFailure $defect
+     * @param  integer                       $count
+     */
+    protected function printDefect(PHPUnit_Framework_TestFailure $defect, $count)
+    {
+        $this->printDefectHeader($defect, $count);
+        $this->printDefectTrace($defect);
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestFailure $defect
+     * @param  integer                       $count
+     */
+    protected function printDefectHeader(PHPUnit_Framework_TestFailure $defect, $count)
+    {
+        $failedTest = $defect->failedTest();
+
+        if ($failedTest instanceof PHPUnit_Framework_SelfDescribing) {
+            $testName = $failedTest->toString();
+        } else {
+            $testName = get_class($failedTest);
+        }
+
+        $this->write(
+          sprintf(
+            "\n%d) %s\n",
+
+            $count,
+            $testName
+          )
+        );
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestFailure $defect
+     */
+    protected function printDefectTrace(PHPUnit_Framework_TestFailure $defect)
+    {
+        $this->write(
+          $defect->getExceptionAsString() . "\n" .
+          PHPUnit_Util_Filter::getFilteredStacktrace(
+            $defect->thrownException()
+          )
+        );
+        
+        $e = $defect->thrownException()->getPrevious();
+
+        while ($e) {
+          $this->write(
+            "\nCaused by\n" .
+            PHPUnit_Framework_TestFailure::exceptionToString($e). "\n" .
+            PHPUnit_Util_Filter::getFilteredStacktrace($e)
+          );
+
+          $e = $e->getPrevious();
+        }
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestResult  $result
+     */
+    protected function printErrors(PHPUnit_Framework_TestResult $result)
+    {
+        $this->printDefects($result->errors(), $result->errorCount(), 'error');
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestResult  $result
+     */
+    protected function printFailures(PHPUnit_Framework_TestResult $result)
+    {
+        $this->printDefects(
+          $result->failures(),
+          $result->failureCount(),
+          'failure'
+        );
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestResult  $result
+     */
+    protected function printIncompletes(PHPUnit_Framework_TestResult $result)
+    {
+        $this->printDefects(
+          $result->notImplemented(),
+          $result->notImplementedCount(),
+          'incomplete test'
+        );
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestResult  $result
+     * @since  Method available since Release 3.0.0
+     */
+    protected function printSkipped(PHPUnit_Framework_TestResult $result)
+    {
+        $this->printDefects(
+          $result->skipped(),
+          $result->skippedCount(),
+          'skipped test'
+        );
+    }
+
+    protected function printHeader()
+    {
+        $this->write("\n\n" . PHP_Timer::resourceUsage() . "\n\n");
+    }
+
+    /**
+     * @param  PHPUnit_Framework_TestResult  $result
+     */
+    protected function printFooter(PHPUnit_Framework_TestResult $result)
+    {
+        if (count($result) === 0) {
+            if ($this->colors) {
+                $this->write("\x1b[30;43m\x1b[2K");
+            }
+
+            $this->write(
+              "No tests executed!\n"
+            );
+
+            if ($this->colors) {
+                $this->write("\x1b[0m\x1b[2K");
+            }
+        }
+
+        else if ($result->wasSuccessful() &&
+            $result->allCompletlyImplemented() &&
+            $result->noneSkipped()) {
+            if ($this->colors) {
+                $this->write("\x1b[30;42m\x1b[2K");
+            }
+
+            $this->write(
+              sprintf(
+                "OK (%d test%s, %d assertion%s)\n",
+
+                count($result),
+                (count($result) == 1) ? '' : 's',
+                $this->numAssertions,
+                ($this->numAssertions == 1) ? '' : 's'
+              )
+            );
+
+            if ($this->colors) {
+                $this->write("\x1b[0m\x1b[2K");
+            }
+        }
+
+        else if ((!$result->allCompletlyImplemented() ||
+                  !$result->noneSkipped()) &&
+                 $result->wasSuccessful()) {
+            if ($this->colors) {
+                $this->write(
+                  "\x1b[30;43m\x1b[2KOK, but incomplete or skipped tests!\n" .
+                  "\x1b[0m\x1b[30;43m\x1b[2K"
+                );
+            } else {
+                $this->write("OK, but incomplete or skipped tests!\n");
+            }
+
+            $this->write(
+              sprintf(
+                "Tests: %d, Assertions: %d%s%s.\n",
+
+                count($result),
+                $this->numAssertions,
+                $this->getCountString(
+                  $result->notImplementedCount(), 'Incomplete'
+                ),
+                $this->getCountString(
+                  $result->skippedCount(), 'Skipped'
+                )
+              )
+            );
+
+            if ($this->colors) {
+                $this->write("\x1b[0m\x1b[2K");
+            }
+        }
+
+        else {
+            $this->write("\n");
+
+            if ($this->colors) {
+                $this->write(
+                  "\x1b[37;41m\x1b[2KFAILURES!\n\x1b[0m\x1b[37;41m\x1b[2K"
+                );
+            } else {
+                $this->write("FAILURES!\n");
+            }
+
+            $this->write(
+              sprintf(
+                "Tests: %d, Assertions: %s%s%s%s%s.\n",
+
+                count($result),
+                $this->numAssertions,
+                $this->getCountString($result->failureCount(), 'Failures'),
+                $this->getCountString($result->errorCount(), 'Errors'),
+                $this->getCountString(
+                  $result->notImplementedCount(), 'Incomplete'
+                ),
+                $this->getCountString($result->skippedCount(), 'Skipped')
+              )
+            );
+
+            if ($this->colors) {
+                $this->write("\x1b[0m\x1b[2K");
+            }
+        }
+
+        if (!$this->verbose &&
+            $result->deprecatedFeaturesCount() > 0) {
+            $message = sprintf(
+              "Warning: Deprecated PHPUnit features are being used %s times!\n" .
+              "Use --verbose for more information.\n",
+              $result->deprecatedFeaturesCount()
+            );
+
+            if ($this->colors) {
+                $message = "\x1b[37;41m\x1b[2K" . $message .
+                           "\x1b[0m";
+            }
+
+            $this->write("\n" . $message);
+        }
+    }
+
+    /**
+     * @param  integer $count
+     * @param  string  $name
+     * @return string
+     * @since  Method available since Release 3.0.0
+     */
+    protected function getCountString($count, $name)
+    {
+        $string = '';
+
+        if ($count > 0) {
+            $string = sprintf(
+              ', %s: %d',
+
+              $name,
+              $count
+            );
+        }
+
+        return $string;
+    }
+
+    /**
+     */
+    public function printWaitPrompt()
+    {
+        $this->write("\n<RETURN> to continue\n");
+    }
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($this->colors) {
+            $this->writeProgress("\x1b[31;1mE\x1b[0m");
+        } else {
+            $this->writeProgress('E');
+        }
+
+        $this->lastTestFailed = TRUE;
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        if ($this->colors) {
+            $this->writeProgress("\x1b[41;37mF\x1b[0m");
+        } else {
+            $this->writeProgress('F');
+        }
+
+        $this->lastTestFailed = TRUE;
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($this->colors) {
+            $this->writeProgress("\x1b[33;1mI\x1b[0m");
+        } else {
+            $this->writeProgress('I');
+        }
+
+        $this->lastTestFailed = TRUE;
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($this->colors) {
+            $this->writeProgress("\x1b[36;1mS\x1b[0m");
+        } else {
+            $this->writeProgress('S');
+        }
+
+        $this->lastTestFailed = TRUE;
+    }
+
+    /**
+     * A testsuite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        if ($this->numTests == -1) {
+            $this->numTests      = count($suite);
+            $this->numTestsWidth = strlen((string)$this->numTests);
+            $this->maxColumn     = 69 - (2 * $this->numTestsWidth);
+        }
+    }
+
+    /**
+     * A testsuite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        if ($this->debug) {
+            $this->write(
+              sprintf(
+                "\nStarting test '%s'.\n", PHPUnit_Util_Test::describe($test)
+              )
+            );
+        }
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if (!$this->lastTestFailed) {
+            $this->writeProgress('.');
+        }
+
+        if ($test instanceof PHPUnit_Framework_TestCase) {
+            $this->numAssertions += $test->getNumAssertions();
+        }
+
+        else if ($test instanceof PHPUnit_Extensions_PhptTestCase) {
+            $this->numAssertions++;
+        }
+
+        $this->lastTestFailed = FALSE;
+
+        if ($test instanceof PHPUnit_Framework_TestCase) {
+            if (!$test->hasPerformedExpectationsOnOutput()) {
+                $this->write($test->getActualOutput());
+            }
+        }
+    }
+
+    /**
+     * @param  string $progress
+     */
+    protected function writeProgress($progress)
+    {
+        $this->write($progress);
+        $this->column++;
+        $this->numTestsRun++;
+
+        if ($this->column == $this->maxColumn) {
+            $this->write(
+              sprintf(
+                ' %' . $this->numTestsWidth . 'd / %' .
+                       $this->numTestsWidth . 'd (%3s%%)',
+
+                $this->numTestsRun,
+                $this->numTests,
+                floor(($this->numTestsRun / $this->numTests) * 100)
+              )
+            );
+
+            $this->writeNewLine();
+        }
+    }
+
+    protected function writeNewLine()
+    {
+        $this->column = 0;
+        $this->write("\n");
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php b/core/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php
new file mode 100644
index 0000000..dc30498
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php
@@ -0,0 +1,791 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage TextUI
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * A TestRunner for the Command Line Interface (CLI)
+ * PHP SAPI Module.
+ *
+ * @package    PHPUnit
+ * @subpackage TextUI
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner
+{
+    const SUCCESS_EXIT   = 0;
+    const FAILURE_EXIT   = 1;
+    const EXCEPTION_EXIT = 2;
+
+    /**
+     * @var PHP_CodeCoverage_Filter
+     */
+    protected $codeCoverageFilter;
+
+    /**
+     * @var PHPUnit_Runner_TestSuiteLoader
+     */
+    protected $loader = NULL;
+
+    /**
+     * @var PHPUnit_TextUI_ResultPrinter
+     */
+    protected $printer = NULL;
+
+    /**
+     * @var boolean
+     */
+    protected static $versionStringPrinted = FALSE;
+
+    /**
+     * @param PHPUnit_Runner_TestSuiteLoader $loader
+     * @param PHP_CodeCoverage_Filter        $filter
+     * @since Method available since Release 3.4.0
+     */
+    public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = NULL, PHP_CodeCoverage_Filter $filter = NULL)
+    {
+        if ($filter === NULL) {
+            $filter = new PHP_CodeCoverage_Filter;
+        }
+
+        $this->codeCoverageFilter = $filter;
+        $this->loader             = $loader;
+    }
+
+    /**
+     * @param  mixed $test
+     * @param  array $arguments
+     * @throws PHPUnit_Framework_Exception
+     */
+    public static function run($test, array $arguments = array())
+    {
+        if ($test instanceof ReflectionClass) {
+            $test = new PHPUnit_Framework_TestSuite($test);
+        }
+
+        if ($test instanceof PHPUnit_Framework_Test) {
+            $aTestRunner = new PHPUnit_TextUI_TestRunner;
+
+            return $aTestRunner->doRun(
+              $test,
+              $arguments
+            );
+        } else {
+            throw new PHPUnit_Framework_Exception(
+              'No test case or test suite found.'
+            );
+        }
+    }
+
+    /**
+     * @return PHPUnit_Framework_TestResult
+     */
+    protected function createTestResult()
+    {
+        return new PHPUnit_Framework_TestResult;
+    }
+
+    /**
+     * @param  PHPUnit_Framework_Test $suite
+     * @param  array                  $arguments
+     * @return PHPUnit_Framework_TestResult
+     */
+    public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array())
+    {
+        $this->handleConfiguration($arguments);
+
+        if (isset($arguments['bootstrap'])) {
+            $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap'];
+        }
+
+        if ($arguments['backupGlobals'] === FALSE) {
+            $suite->setBackupGlobals(FALSE);
+        }
+
+        if ($arguments['backupStaticAttributes'] === TRUE) {
+            $suite->setBackupStaticAttributes(TRUE);
+        }
+
+        if (is_integer($arguments['repeat'])) {
+            $suite = new PHPUnit_Extensions_RepeatedTest(
+              $suite,
+              $arguments['repeat'],
+              $arguments['filter'],
+              $arguments['groups'],
+              $arguments['excludeGroups'],
+              $arguments['processIsolation']
+            );
+        }
+
+        $result = $this->createTestResult();
+
+        if (!$arguments['convertErrorsToExceptions']) {
+            $result->convertErrorsToExceptions(FALSE);
+        }
+
+        if (!$arguments['convertNoticesToExceptions']) {
+            PHPUnit_Framework_Error_Notice::$enabled = FALSE;
+        }
+
+        if (!$arguments['convertWarningsToExceptions']) {
+            PHPUnit_Framework_Error_Warning::$enabled = FALSE;
+        }
+
+        if ($arguments['stopOnError']) {
+            $result->stopOnError(TRUE);
+        }
+
+        if ($arguments['stopOnFailure']) {
+            $result->stopOnFailure(TRUE);
+        }
+
+        if ($arguments['stopOnIncomplete']) {
+            $result->stopOnIncomplete(TRUE);
+        }
+
+        if ($arguments['stopOnSkipped']) {
+            $result->stopOnSkipped(TRUE);
+        }
+
+        if ($this->printer === NULL) {
+            if (isset($arguments['printer']) &&
+                $arguments['printer'] instanceof PHPUnit_Util_Printer) {
+                $this->printer = $arguments['printer'];
+            } else {
+                $this->printer = new PHPUnit_TextUI_ResultPrinter(
+                  NULL,
+                  $arguments['verbose'],
+                  $arguments['colors'],
+                  $arguments['debug']
+                );
+            }
+        }
+
+        if (!$this->printer instanceof PHPUnit_Util_Log_TAP &&
+            !self::$versionStringPrinted) {
+            $this->printer->write(
+              PHPUnit_Runner_Version::getVersionString() . "\n\n"
+            );
+
+            if (isset($arguments['configuration'])) {
+                $this->printer->write(
+                  sprintf(
+                    "Configuration read from %s\n\n",
+                    $arguments['configuration']->getFilename()
+                  )
+                );
+            }
+        }
+
+        foreach ($arguments['listeners'] as $listener) {
+            $result->addListener($listener);
+        }
+
+        $result->addListener($this->printer);
+
+        if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) {
+            $result->addListener(new PHPUnit_Util_DeprecatedFeature_Logger);
+        }
+
+        if (isset($arguments['testdoxHTMLFile'])) {
+            $result->addListener(
+              new PHPUnit_Util_TestDox_ResultPrinter_HTML(
+                $arguments['testdoxHTMLFile']
+              )
+            );
+        }
+
+        if (isset($arguments['testdoxTextFile'])) {
+            $result->addListener(
+              new PHPUnit_Util_TestDox_ResultPrinter_Text(
+                $arguments['testdoxTextFile']
+              )
+            );
+        }
+
+        if ((isset($arguments['coverageClover']) ||
+             isset($arguments['reportDirectory']) ||
+             isset($arguments['coveragePHP']) ||
+             isset($arguments['coverageText'])) &&
+             extension_loaded('xdebug')) {
+            $codeCoverage = new PHP_CodeCoverage(
+              NULL, $this->codeCoverageFilter
+            );
+
+            $codeCoverage->setProcessUncoveredFilesFromWhitelist(
+              $arguments['processUncoveredFilesFromWhitelist']
+            );
+
+            if (isset($arguments['cacheTokens'])) {
+                $codeCoverage->setCacheTokens($arguments['cacheTokens']);
+            }
+
+            if (isset($arguments['forceCoversAnnotation'])) {
+                $codeCoverage->setForceCoversAnnotation(
+                  $arguments['forceCoversAnnotation']
+                );
+            }
+
+            if (isset($arguments['mapTestClassNameToCoveredClassName'])) {
+                $codeCoverage->setMapTestClassNameToCoveredClassName(
+                  $arguments['mapTestClassNameToCoveredClassName']
+                );
+            }
+
+            $result->setCodeCoverage($codeCoverage);
+        }
+
+        if (isset($arguments['jsonLogfile'])) {
+            $result->addListener(
+              new PHPUnit_Util_Log_JSON($arguments['jsonLogfile'])
+            );
+        }
+
+        if (isset($arguments['tapLogfile'])) {
+            $result->addListener(
+              new PHPUnit_Util_Log_TAP($arguments['tapLogfile'])
+            );
+        }
+
+        if (isset($arguments['junitLogfile'])) {
+            $result->addListener(
+              new PHPUnit_Util_Log_JUnit(
+                $arguments['junitLogfile'], $arguments['logIncompleteSkipped']
+              )
+            );
+        }
+
+        if ($arguments['strict']) {
+            $result->strictMode(TRUE);
+
+            $result->setTimeoutForSmallTests(
+              $arguments['timeoutForSmallTests']
+            );
+
+            $result->setTimeoutForMediumTests(
+              $arguments['timeoutForMediumTests']
+            );
+
+            $result->setTimeoutForLargeTests(
+              $arguments['timeoutForLargeTests']
+            );
+        }
+
+        $suite->run(
+          $result,
+          $arguments['filter'],
+          $arguments['groups'],
+          $arguments['excludeGroups'],
+          $arguments['processIsolation']
+        );
+
+        unset($suite);
+        $result->flushListeners();
+
+        if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) {
+            $this->printer->printResult($result);
+        }
+
+        if (isset($codeCoverage)) {
+            if (isset($arguments['coverageClover'])) {
+                $this->printer->write(
+                  "\nGenerating code coverage report in Clover XML format ..."
+                );
+
+                $writer = new PHP_CodeCoverage_Report_Clover;
+                $writer->process($codeCoverage, $arguments['coverageClover']);
+
+                $this->printer->write(" done\n");
+                unset($writer);
+            }
+
+            if (isset($arguments['reportDirectory'])) {
+                $this->printer->write(
+                  "\nGenerating code coverage report in HTML format ..."
+                );
+
+                $writer = new PHP_CodeCoverage_Report_HTML(
+                  $arguments['reportCharset'],
+                  $arguments['reportHighlight'],
+                  $arguments['reportLowUpperBound'],
+                  $arguments['reportHighLowerBound'],
+                  sprintf(
+                    ' and <a href="http://phpunit.de/">PHPUnit %s</a>',
+                    PHPUnit_Runner_Version::id()
+                  )
+                );
+
+                $writer->process($codeCoverage, $arguments['reportDirectory']);
+
+                $this->printer->write(" done\n");
+                unset($writer);
+            }
+
+            if (isset($arguments['coveragePHP'])) {
+                $this->printer->write(
+                  "\nGenerating code coverage report in PHP format ..."
+                );
+
+                $writer = new PHP_CodeCoverage_Report_PHP;
+                $writer->process($codeCoverage, $arguments['coveragePHP']);
+
+                $this->printer->write(" done\n");
+                unset($writer);
+            }
+
+            if (isset($arguments['coverageText'])) {
+                if ($arguments['coverageText'] == 'php://stdout') {
+                    $outputStream = $this->printer;
+                    $colors       = (bool)$arguments['colors'];
+                } else {
+                    $outputStream = new PHPUnit_Util_Printer($arguments['coverageText']);
+                    $colors       = FALSE;
+                }
+
+                $writer = new PHP_CodeCoverage_Report_Text(
+                  $outputStream,
+                  $arguments['reportLowUpperBound'],
+                  $arguments['reportHighLowerBound'],
+                  $arguments['coverageTextShowUncoveredFiles']
+                );
+
+                $writer->process($codeCoverage, $colors);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * @param  PHPUnit_TextUI_ResultPrinter $resultPrinter
+     */
+    public function setPrinter(PHPUnit_TextUI_ResultPrinter $resultPrinter)
+    {
+        $this->printer = $resultPrinter;
+    }
+
+    /**
+     * Override to define how to handle a failed loading of
+     * a test suite.
+     *
+     * @param  string  $message
+     */
+    protected function runFailed($message)
+    {
+        self::printVersionString();
+        self::write($message);
+        exit(self::FAILURE_EXIT);
+    }
+
+    /**
+     * @param  string $buffer
+     * @since  Method available since Release 3.1.0
+     */
+    protected static function write($buffer)
+    {
+        if (PHP_SAPI != 'cli') {
+            $buffer = htmlspecialchars($buffer);
+        }
+
+        print $buffer;
+    }
+
+    /**
+     * Returns the loader to be used.
+     *
+     * @return PHPUnit_Runner_TestSuiteLoader
+     * @since  Method available since Release 2.2.0
+     */
+    public function getLoader()
+    {
+        if ($this->loader === NULL) {
+            $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader;
+        }
+
+        return $this->loader;
+    }
+
+    /**
+     */
+    public static function showError($message)
+    {
+        self::printVersionString();
+        self::write($message . "\n");
+
+        exit(self::FAILURE_EXIT);
+    }
+
+    /**
+     */
+    public static function printVersionString()
+    {
+        if (!self::$versionStringPrinted) {
+            self::write(PHPUnit_Runner_Version::getVersionString() . "\n\n");
+            self::$versionStringPrinted = TRUE;
+        }
+    }
+
+    /**
+     * @param  array $arguments
+     * @since  Method available since Release 3.2.1
+     */
+    protected function handleConfiguration(array &$arguments)
+    {
+        if (isset($arguments['configuration']) &&
+            !$arguments['configuration'] instanceof PHPUnit_Util_Configuration) {
+            $arguments['configuration'] = PHPUnit_Util_Configuration::getInstance(
+              $arguments['configuration']
+            );
+        }
+
+        $arguments['debug']     = isset($arguments['debug'])     ? $arguments['debug']     : FALSE;
+        $arguments['filter']    = isset($arguments['filter'])    ? $arguments['filter']    : FALSE;
+        $arguments['listeners'] = isset($arguments['listeners']) ? $arguments['listeners'] : array();
+
+        if (isset($arguments['configuration'])) {
+            $arguments['configuration']->handlePHPConfiguration();
+
+            $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration();
+
+            if (isset($phpunitConfiguration['backupGlobals']) &&
+                !isset($arguments['backupGlobals'])) {
+                $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals'];
+            }
+
+            if (isset($phpunitConfiguration['backupStaticAttributes']) &&
+                !isset($arguments['backupStaticAttributes'])) {
+                $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes'];
+            }
+
+            if (isset($phpunitConfiguration['bootstrap']) &&
+                !isset($arguments['bootstrap'])) {
+                $arguments['bootstrap'] = $phpunitConfiguration['bootstrap'];
+            }
+
+            if (isset($phpunitConfiguration['cacheTokens']) &&
+                !isset($arguments['cacheTokens'])) {
+                $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens'];
+            }
+
+            if (isset($phpunitConfiguration['colors']) &&
+                !isset($arguments['colors'])) {
+                $arguments['colors'] = $phpunitConfiguration['colors'];
+            }
+
+            if (isset($phpunitConfiguration['convertErrorsToExceptions']) &&
+                !isset($arguments['convertErrorsToExceptions'])) {
+                $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions'];
+            }
+
+            if (isset($phpunitConfiguration['convertNoticesToExceptions']) &&
+                !isset($arguments['convertNoticesToExceptions'])) {
+                $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions'];
+            }
+
+            if (isset($phpunitConfiguration['convertWarningsToExceptions']) &&
+                !isset($arguments['convertWarningsToExceptions'])) {
+                $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions'];
+            }
+
+            if (isset($phpunitConfiguration['processIsolation']) &&
+                !isset($arguments['processIsolation'])) {
+                $arguments['processIsolation'] = $phpunitConfiguration['processIsolation'];
+            }
+
+            if (isset($phpunitConfiguration['stopOnFailure']) &&
+                !isset($arguments['stopOnFailure'])) {
+                $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure'];
+            }
+
+            if (isset($phpunitConfiguration['timeoutForSmallTests']) &&
+                !isset($arguments['timeoutForSmallTests'])) {
+                $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests'];
+            }
+
+            if (isset($phpunitConfiguration['timeoutForMediumTests']) &&
+                !isset($arguments['timeoutForMediumTests'])) {
+                $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests'];
+            }
+
+            if (isset($phpunitConfiguration['timeoutForLargeTests']) &&
+                !isset($arguments['timeoutForLargeTests'])) {
+                $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests'];
+            }
+
+            if (isset($phpunitConfiguration['strict']) &&
+                !isset($arguments['strict'])) {
+                $arguments['strict'] = $phpunitConfiguration['strict'];
+            }
+
+            if (isset($phpunitConfiguration['verbose']) &&
+                !isset($arguments['verbose'])) {
+                $arguments['verbose'] = $phpunitConfiguration['verbose'];
+            }
+
+            if (isset($phpunitConfiguration['forceCoversAnnotation']) &&
+                !isset($arguments['forceCoversAnnotation'])) {
+                $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation'];
+            }
+
+            if (isset($phpunitConfiguration['mapTestClassNameToCoveredClassName']) &&
+                !isset($arguments['mapTestClassNameToCoveredClassName'])) {
+                $arguments['mapTestClassNameToCoveredClassName'] = $phpunitConfiguration['mapTestClassNameToCoveredClassName'];
+            }
+
+            $groupCliArgs = array();
+            if (!empty($arguments['groups'])) {
+                $groupCliArgs = $arguments['groups'];
+            }
+
+            $groupConfiguration = $arguments['configuration']->getGroupConfiguration();
+
+            if (!empty($groupConfiguration['include']) &&
+                !isset($arguments['groups'])) {
+                $arguments['groups'] = $groupConfiguration['include'];
+            }
+
+            if (!empty($groupConfiguration['exclude']) &&
+                !isset($arguments['excludeGroups'])) {
+                $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs);
+            }
+
+            foreach ($arguments['configuration']->getListenerConfiguration() as $listener) {
+                if (!class_exists($listener['class'], FALSE) &&
+                    $listener['file'] !== '') {
+                    require_once $listener['file'];
+                }
+
+                if (class_exists($listener['class'])) {
+                    if (count($listener['arguments']) == 0) {
+                        $listener = new $listener['class'];
+                    } else {
+                        $listenerClass = new ReflectionClass(
+                                           $listener['class']
+                                         );
+                        $listener      = $listenerClass->newInstanceArgs(
+                                           $listener['arguments']
+                                         );
+                    }
+
+                    if ($listener instanceof PHPUnit_Framework_TestListener) {
+                        $arguments['listeners'][] = $listener;
+                    }
+                }
+            }
+
+            $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration();
+
+            if (isset($loggingConfiguration['coverage-html']) &&
+                !isset($arguments['reportDirectory'])) {
+                if (isset($loggingConfiguration['charset']) &&
+                    !isset($arguments['reportCharset'])) {
+                    $arguments['reportCharset'] = $loggingConfiguration['charset'];
+                }
+
+                if (isset($loggingConfiguration['highlight']) &&
+                    !isset($arguments['reportHighlight'])) {
+                    $arguments['reportHighlight'] = $loggingConfiguration['highlight'];
+                }
+
+                if (isset($loggingConfiguration['lowUpperBound']) &&
+                    !isset($arguments['reportLowUpperBound'])) {
+                    $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound'];
+                }
+
+                if (isset($loggingConfiguration['highLowerBound']) &&
+                    !isset($arguments['reportHighLowerBound'])) {
+                    $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound'];
+                }
+
+                $arguments['reportDirectory'] = $loggingConfiguration['coverage-html'];
+            }
+
+            if (isset($loggingConfiguration['coverage-clover']) &&
+                !isset($arguments['coverageClover'])) {
+                $arguments['coverageClover'] = $loggingConfiguration['coverage-clover'];
+            }
+
+            if (isset($loggingConfiguration['coverage-php']) &&
+                !isset($arguments['coveragePHP'])) {
+                $arguments['coveragePHP'] = $loggingConfiguration['coverage-php'];
+            }
+
+            if (isset($loggingConfiguration['coverage-text']) &&
+                !isset($arguments['coverageText'])) {
+                $arguments['coverageText'] = $loggingConfiguration['coverage-text'];
+                if (isset($loggingConfiguration['coverageTextShowUncoveredFiles'])) {
+                    $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles'];
+                } else {
+                    $arguments['coverageTextShowUncoveredFiles'] = FALSE;
+                }
+            }
+
+            if (isset($loggingConfiguration['json']) &&
+                !isset($arguments['jsonLogfile'])) {
+                $arguments['jsonLogfile'] = $loggingConfiguration['json'];
+            }
+
+            if (isset($loggingConfiguration['plain'])) {
+                $arguments['listeners'][] = new PHPUnit_TextUI_ResultPrinter(
+                  $loggingConfiguration['plain'], TRUE
+                );
+            }
+
+            if (isset($loggingConfiguration['tap']) &&
+                !isset($arguments['tapLogfile'])) {
+                $arguments['tapLogfile'] = $loggingConfiguration['tap'];
+            }
+
+            if (isset($loggingConfiguration['junit']) &&
+                !isset($arguments['junitLogfile'])) {
+                $arguments['junitLogfile'] = $loggingConfiguration['junit'];
+
+                if (isset($loggingConfiguration['logIncompleteSkipped']) &&
+                    !isset($arguments['logIncompleteSkipped'])) {
+                    $arguments['logIncompleteSkipped'] = $loggingConfiguration['logIncompleteSkipped'];
+                }
+            }
+
+            if (isset($loggingConfiguration['testdox-html']) &&
+                !isset($arguments['testdoxHTMLFile'])) {
+                $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html'];
+            }
+
+            if (isset($loggingConfiguration['testdox-text']) &&
+                !isset($arguments['testdoxTextFile'])) {
+                $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text'];
+            }
+
+            if ((isset($arguments['coverageClover']) ||
+                isset($arguments['reportDirectory']) ||
+                isset($arguments['coveragePHP']) ||
+                isset($arguments['coverageText'])) &&
+                extension_loaded('xdebug')) {
+
+                $filterConfiguration = $arguments['configuration']->getFilterConfiguration();
+                $arguments['processUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist'];
+
+                foreach ($filterConfiguration['blacklist']['include']['directory'] as $dir) {
+                    $this->codeCoverageFilter->addDirectoryToBlacklist(
+                      $dir['path'], $dir['suffix'], $dir['prefix'], $dir['group']
+                    );
+                }
+
+                foreach ($filterConfiguration['blacklist']['include']['file'] as $file) {
+                    $this->codeCoverageFilter->addFileToBlacklist($file);
+                }
+
+                foreach ($filterConfiguration['blacklist']['exclude']['directory'] as $dir) {
+                    $this->codeCoverageFilter->removeDirectoryFromBlacklist(
+                      $dir['path'], $dir['suffix'], $dir['prefix'], $dir['group']
+                    );
+                }
+
+                foreach ($filterConfiguration['blacklist']['exclude']['file'] as $file) {
+                    $this->codeCoverageFilter->removeFileFromBlacklist($file);
+                }
+
+                foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) {
+                    $this->codeCoverageFilter->addDirectoryToWhitelist(
+                      $dir['path'], $dir['suffix'], $dir['prefix']
+                    );
+                }
+
+                foreach ($filterConfiguration['whitelist']['include']['file'] as $file) {
+                    $this->codeCoverageFilter->addFileToWhitelist($file);
+                }
+
+                foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) {
+                    $this->codeCoverageFilter->removeDirectoryFromWhitelist(
+                      $dir['path'], $dir['suffix'], $dir['prefix']
+                    );
+                }
+
+                foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) {
+                    $this->codeCoverageFilter->removeFileFromWhitelist($file);
+                }
+            }
+        }
+
+        $arguments['processUncoveredFilesFromWhitelist'] = isset($arguments['processUncoveredFilesFromWhitelist']) ? $arguments['processUncoveredFilesFromWhitelist'] : FALSE;
+        $arguments['backupGlobals']                      = isset($arguments['backupGlobals'])                      ? $arguments['backupGlobals']                      : NULL;
+        $arguments['backupStaticAttributes']             = isset($arguments['backupStaticAttributes'])             ? $arguments['backupStaticAttributes']             : NULL;
+        $arguments['cacheTokens']                        = isset($arguments['cacheTokens'])                        ? $arguments['cacheTokens']                        : TRUE;
+        $arguments['colors']                             = isset($arguments['colors'])                             ? $arguments['colors']                             : FALSE;
+        $arguments['convertErrorsToExceptions']          = isset($arguments['convertErrorsToExceptions'])          ? $arguments['convertErrorsToExceptions']          : TRUE;
+        $arguments['convertNoticesToExceptions']         = isset($arguments['convertNoticesToExceptions'])         ? $arguments['convertNoticesToExceptions']         : TRUE;
+        $arguments['convertWarningsToExceptions']        = isset($arguments['convertWarningsToExceptions'])        ? $arguments['convertWarningsToExceptions']        : TRUE;
+        $arguments['excludeGroups']                      = isset($arguments['excludeGroups'])                      ? $arguments['excludeGroups']                      : array();
+        $arguments['groups']                             = isset($arguments['groups'])                             ? $arguments['groups']                             : array();
+        $arguments['logIncompleteSkipped']               = isset($arguments['logIncompleteSkipped'])               ? $arguments['logIncompleteSkipped']               : FALSE;
+        $arguments['processIsolation']                   = isset($arguments['processIsolation'])                   ? $arguments['processIsolation']                   : FALSE;
+        $arguments['repeat']                             = isset($arguments['repeat'])                             ? $arguments['repeat']                             : FALSE;
+        $arguments['reportCharset']                      = isset($arguments['reportCharset'])                      ? $arguments['reportCharset']                      : 'UTF-8';
+        $arguments['reportHighlight']                    = isset($arguments['reportHighlight'])                    ? $arguments['reportHighlight']                    : FALSE;
+        $arguments['reportHighLowerBound']               = isset($arguments['reportHighLowerBound'])               ? $arguments['reportHighLowerBound']               : 70;
+        $arguments['reportLowUpperBound']                = isset($arguments['reportLowUpperBound'])                ? $arguments['reportLowUpperBound']                : 35;
+        $arguments['stopOnError']                        = isset($arguments['stopOnError'])                        ? $arguments['stopOnError']                        : FALSE;
+        $arguments['stopOnFailure']                      = isset($arguments['stopOnFailure'])                      ? $arguments['stopOnFailure']                      : FALSE;
+        $arguments['stopOnIncomplete']                   = isset($arguments['stopOnIncomplete'])                   ? $arguments['stopOnIncomplete']                   : FALSE;
+        $arguments['stopOnSkipped']                      = isset($arguments['stopOnSkipped'])                      ? $arguments['stopOnSkipped']                      : FALSE;
+        $arguments['timeoutForSmallTests']               = isset($arguments['timeoutForSmallTests'])               ? $arguments['timeoutForSmallTests']               : 1;
+        $arguments['timeoutForMediumTests']              = isset($arguments['timeoutForMediumTests'])              ? $arguments['timeoutForMediumTests']              : 10;
+        $arguments['timeoutForLargeTests']               = isset($arguments['timeoutForLargeTests'])               ? $arguments['timeoutForLargeTests']               : 60;
+        $arguments['strict']                             = isset($arguments['strict'])                             ? $arguments['strict']                             : FALSE;
+        $arguments['verbose']                            = isset($arguments['verbose'])                            ? $arguments['verbose']                            : FALSE;
+
+        if ($arguments['filter'] !== FALSE &&
+            preg_match('/^[a-zA-Z0-9_]/', $arguments['filter'])) {
+            // Escape delimiters in regular expression. Do NOT use preg_quote,
+            // to keep magic characters.
+            $arguments['filter'] = '/' . str_replace(
+              '/', '\\/', $arguments['filter']
+            ) . '/';
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Class.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Class.php
new file mode 100644
index 0000000..df7d24d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Class.php
@@ -0,0 +1,364 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.0
+ */
+
+/**
+ * Class helpers.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.0
+ */
+class PHPUnit_Util_Class
+{
+    protected static $buffer = array();
+
+    /**
+     * Starts the collection of loaded classes.
+     *
+     */
+    public static function collectStart()
+    {
+        self::$buffer = get_declared_classes();
+    }
+
+    /**
+     * Stops the collection of loaded classes and
+     * returns the names of the loaded classes.
+     *
+     * @return array
+     */
+    public static function collectEnd()
+    {
+        return array_values(
+          array_diff(get_declared_classes(), self::$buffer)
+        );
+    }
+
+    /**
+     * Returns the class hierarchy for a given class.
+     *
+     * @param  string  $className
+     * @param  boolean $asReflectionObjects
+     * @return array
+     */
+    public static function getHierarchy($className, $asReflectionObjects = FALSE)
+    {
+        if ($asReflectionObjects) {
+            $classes = array(new ReflectionClass($className));
+        } else {
+            $classes = array($className);
+        }
+
+        $done = FALSE;
+
+        while (!$done) {
+            if ($asReflectionObjects) {
+                $class = new ReflectionClass(
+                  $classes[count($classes)-1]->getName()
+                );
+            } else {
+                $class = new ReflectionClass($classes[count($classes)-1]);
+            }
+
+            $parent = $class->getParentClass();
+
+            if ($parent !== FALSE) {
+                if ($asReflectionObjects) {
+                    $classes[] = $parent;
+                } else {
+                    $classes[] = $parent->getName();
+                }
+            } else {
+                $done = TRUE;
+            }
+        }
+
+        return $classes;
+    }
+
+    /**
+     * Returns the parameters of a function or method.
+     *
+     * @param  ReflectionFunction|ReflectionMethod $method
+     * @param  boolean                             $forCall
+     * @return string
+     * @since  Method available since Release 3.2.0
+     */
+    public static function getMethodParameters($method, $forCall = FALSE)
+    {
+        $parameters = array();
+
+        foreach ($method->getParameters() as $i => $parameter) {
+            $name = '$' . $parameter->getName();
+
+            /* Note: PHP extensions may use empty names for reference arguments
+             * or "..." for methods taking a variable number of arguments.
+             */
+            if ($name === '$' || $name === '$...') {
+                $name = '$arg' . $i;
+            }
+
+            $default   = '';
+            $reference = '';
+            $typeHint  = '';
+
+            if (!$forCall) {
+                if ($parameter->isArray()) {
+                    $typeHint = 'array ';
+                }
+
+                else if (version_compare(PHP_VERSION, '5.4', '>') &&
+                         $parameter->isCallable()) {
+                    $typeHint = 'callable ';
+                }
+
+                else {
+                    try {
+                        $class = $parameter->getClass();
+                    }
+
+                    catch (ReflectionException $e) {
+                        $class = FALSE;
+                    }
+
+                    if ($class) {
+                        $typeHint = $class->getName() . ' ';
+                    }
+                }
+
+                if ($parameter->isDefaultValueAvailable()) {
+                    $value   = $parameter->getDefaultValue();
+                    $default = ' = ' . var_export($value, TRUE);
+                }
+
+                else if ($parameter->isOptional()) {
+                    $default = ' = null';
+                }
+
+                if ($parameter->isPassedByReference()) {
+                    $reference = '&';
+                }
+            }
+
+            $parameters[] = $typeHint . $reference . $name . $default;
+        }
+
+        return join(', ', $parameters);
+    }
+
+    /**
+     * Returns the package information of a user-defined class.
+     *
+     * @param  string $className
+     * @param  string $docComment
+     * @return array
+     */
+    public static function getPackageInformation($className, $docComment)
+    {
+        $result = array(
+          'namespace'   => '',
+          'fullPackage' => '',
+          'category'    => '',
+          'package'     => '',
+          'subpackage'  => ''
+        );
+
+        if (strpos($className, '\\') !== FALSE) {
+            $result['namespace'] = self::arrayToName(
+              explode('\\', $className)
+            );
+        }
+
+        if (preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) {
+            $result['category'] = $matches[1];
+        }
+
+        if (preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) {
+            $result['package']     = $matches[1];
+            $result['fullPackage'] = $matches[1];
+        }
+
+        if (preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) {
+            $result['subpackage']   = $matches[1];
+            $result['fullPackage'] .= '.' . $matches[1];
+        }
+
+        if (empty($result['fullPackage'])) {
+            $result['fullPackage'] = self::arrayToName(
+              explode('_', str_replace('\\', '_', $className)), '.'
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the value of a static attribute.
+     * This also works for attributes that are declared protected or private.
+     *
+     * @param  string  $className
+     * @param  string  $attributeName
+     * @return mixed
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getStaticAttribute($className, $attributeName)
+    {
+        if (!is_string($className)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'string');
+        }
+
+        if (!class_exists($className)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'class name');
+        }
+
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        $class = new ReflectionClass($className);
+
+        while ($class) {
+            $attributes = $class->getStaticProperties();
+
+            if (array_key_exists($attributeName, $attributes)) {
+                return $attributes[$attributeName];
+            }
+
+            $class = $class->getParentClass();
+        }
+
+        throw new PHPUnit_Framework_Exception(
+          sprintf(
+            'Attribute "%s" not found in class.',
+
+            $attributeName
+          )
+        );
+    }
+
+    /**
+     * Returns the value of an object's attribute.
+     * This also works for attributes that are declared protected or private.
+     *
+     * @param  object  $object
+     * @param  string  $attributeName
+     * @return mixed
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getObjectAttribute($object, $attributeName)
+    {
+        if (!is_object($object)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'object');
+        }
+
+        if (!is_string($attributeName)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        try {
+            $attribute = new ReflectionProperty($object, $attributeName);
+        }
+
+        catch (ReflectionException $e) {
+            $reflector = new ReflectionObject($object);
+
+            while ($reflector = $reflector->getParentClass()) {
+                try {
+                    $attribute = $reflector->getProperty($attributeName);
+                    break;
+                }
+
+                catch(ReflectionException $e) {
+                }
+            }
+        }
+
+        if (isset($attribute)) {
+            if (!$attribute || $attribute->isPublic()) {
+                return $object->$attributeName;
+            }
+            $attribute->setAccessible(TRUE);
+            $value = $attribute->getValue($object);
+            $attribute->setAccessible(FALSE);
+
+            return $value;
+        }
+
+        throw new PHPUnit_Framework_Exception(
+          sprintf(
+            'Attribute "%s" not found in object.',
+            $attributeName
+          )
+        );
+    }
+
+    /**
+     * Returns the package information of a user-defined class.
+     *
+     * @param  array  $parts
+     * @param  string $join
+     * @return string
+     * @since  Method available since Release 3.2.12
+     */
+    protected static function arrayToName(array $parts, $join = '\\')
+    {
+        $result = '';
+
+        if (count($parts) > 1) {
+            array_pop($parts);
+
+            $result = join($join, $parts);
+        }
+
+        return $result;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Configuration.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Configuration.php
new file mode 100644
index 0000000..256382e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Configuration.php
@@ -0,0 +1,1014 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.2.0
+ */
+
+/**
+ * Wrapper for the PHPUnit XML configuration file.
+ *
+ * Example XML configuration file:
+ * <code>
+ * <?xml version="1.0" encoding="utf-8" ?>
+ *
+ * <phpunit backupGlobals="true"
+ *          backupStaticAttributes="false"
+ *          bootstrap="/path/to/bootstrap.php"
+ *          cacheTokens="true"
+ *          colors="false"
+ *          convertErrorsToExceptions="true"
+ *          convertNoticesToExceptions="true"
+ *          convertWarningsToExceptions="true"
+ *          forceCoversAnnotation="false"
+ *          mapTestClassNameToCoveredClassName="false"
+ *          printerClass="PHPUnit_TextUI_ResultPrinter"
+ *          processIsolation="false"
+ *          stopOnError="false"
+ *          stopOnFailure="false"
+ *          stopOnIncomplete="false"
+ *          stopOnSkipped="false"
+ *          testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
+ *          timeoutForSmallTests="1"
+ *          timeoutForMediumTests="10"
+ *          timeoutForLargeTests="60"
+ *          strict="false"
+ *          verbose="false">
+ *   <testsuites>
+ *     <testsuite name="My Test Suite">
+ *       <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
+ *       <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
+ *       <exclude>/path/to/files/exclude</exclude>
+ *     </testsuite>
+ *   </testsuites>
+ *
+ *   <groups>
+ *     <include>
+ *       <group>name</group>
+ *     </include>
+ *     <exclude>
+ *       <group>name</group>
+ *     </exclude>
+ *   </groups>
+ *
+ *   <filter>
+ *     <blacklist>
+ *       <directory suffix=".php">/path/to/files</directory>
+ *       <file>/path/to/file</file>
+ *       <exclude>
+ *         <directory suffix=".php">/path/to/files</directory>
+ *         <file>/path/to/file</file>
+ *       </exclude>
+ *     </blacklist>
+ *     <whitelist processUncoveredFilesFromWhitelist="false">
+ *       <directory suffix=".php">/path/to/files</directory>
+ *       <file>/path/to/file</file>
+ *       <exclude>
+ *         <directory suffix=".php">/path/to/files</directory>
+ *         <file>/path/to/file</file>
+ *       </exclude>
+ *     </whitelist>
+ *   </filter>
+ *
+ *   <listeners>
+ *     <listener class="MyListener" file="/optional/path/to/MyListener.php">
+ *       <arguments>
+ *         <array>
+ *           <element key="0">
+ *             <string>Sebastian</string>
+ *           </element>
+ *         </array>
+ *         <integer>22</integer>
+ *         <string>April</string>
+ *         <double>19.78</double>
+ *         <null/>
+ *         <object class="stdClass"/>
+ *         <file>MyRelativeFile.php</file>
+ *         <directory>MyRelativeDir</directory>
+ *       </arguments>
+ *     </listener>
+ *   </listeners>
+ *
+ *   <logging>
+ *     <log type="coverage-html" target="/tmp/report"
+            charset="UTF-8" highlight="false"
+ *          lowUpperBound="35" highLowerBound="70"/>
+ *     <log type="coverage-clover" target="/tmp/clover.xml"/>
+ *     <log type="json" target="/tmp/logfile.json"/>
+ *     <log type="plain" target="/tmp/logfile.txt"/>
+ *     <log type="tap" target="/tmp/logfile.tap"/>
+ *     <log type="junit" target="/tmp/logfile.xml" logIncompleteSkipped="false"/>
+ *     <log type="testdox-html" target="/tmp/testdox.html"/>
+ *     <log type="testdox-text" target="/tmp/testdox.txt"/>
+ *   </logging>
+ *
+ *   <php>
+ *     <includePath>.</includePath>
+ *     <ini name="foo" value="bar"/>
+ *     <const name="foo" value="bar"/>
+ *     <var name="foo" value="bar"/>
+ *     <env name="foo" value="bar"/>
+ *     <post name="foo" value="bar"/>
+ *     <get name="foo" value="bar"/>
+ *     <cookie name="foo" value="bar"/>
+ *     <server name="foo" value="bar"/>
+ *     <files name="foo" value="bar"/>
+ *     <request name="foo" value="bar"/>
+ *   </php>
+ *
+ *   <selenium>
+ *     <browser name="Firefox on Linux"
+ *              browser="*firefox /usr/lib/firefox/firefox-bin"
+ *              host="my.linux.box"
+ *              port="4444"
+ *              timeout="30000"/>
+ *   </selenium>
+ * </phpunit>
+ * </code>
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.2.0
+ */
+class PHPUnit_Util_Configuration
+{
+    private static $instances = array();
+
+    protected $document;
+    protected $xpath;
+    protected $filename;
+
+    /**
+     * Loads a PHPUnit configuration file.
+     *
+     * @param  string $filename
+     */
+    protected function __construct($filename)
+    {
+        $this->filename = $filename;
+        $this->document = PHPUnit_Util_XML::loadFile($filename);
+        $this->xpath    = new DOMXPath($this->document);
+    }
+
+    /**
+     * @since  Method available since Release 3.4.0
+     */
+    private final function __clone()
+    {
+    }
+
+    /**
+     * Returns a PHPUnit configuration object.
+     *
+     * @param  string $filename
+     * @return PHPUnit_Util_Configuration
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getInstance($filename)
+    {
+        $realpath = realpath($filename);
+
+        if ($realpath === FALSE) {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'Could not read "%s".',
+                $filename
+              )
+            );
+        }
+
+        if (!isset(self::$instances[$realpath])) {
+            self::$instances[$realpath] = new PHPUnit_Util_Configuration($realpath);
+        }
+
+        return self::$instances[$realpath];
+    }
+
+    /**
+     * Returns the realpath to the configuration file.
+     *
+     * @return string
+     * @since  Method available since Release 3.6.0
+     */
+    public function getFilename()
+    {
+        return $this->filename;
+    }
+
+    /**
+     * Returns the configuration for SUT filtering.
+     *
+     * @return array
+     * @since  Method available since Release 3.2.1
+     */
+    public function getFilterConfiguration()
+    {
+        $processUncoveredFilesFromWhitelist = FALSE;
+
+        $tmp = $this->xpath->query('filter/whitelist');
+
+        if ($tmp->length == 1 &&
+            $tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) {
+            $processUncoveredFilesFromWhitelist = $this->getBoolean(
+              (string)$tmp->item(0)->getAttribute(
+                'processUncoveredFilesFromWhitelist'
+              ),
+              FALSE
+            );
+        }
+
+        return array(
+          'blacklist' => array(
+            'include' => array(
+              'directory' => $this->readFilterDirectories(
+                'filter/blacklist/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                'filter/blacklist/file'
+              )
+            ),
+            'exclude' => array(
+              'directory' => $this->readFilterDirectories(
+                'filter/blacklist/exclude/directory'
+               ),
+              'file' => $this->readFilterFiles(
+                'filter/blacklist/exclude/file'
+              )
+            )
+          ),
+          'whitelist' => array(
+            'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist,
+            'include' => array(
+              'directory' => $this->readFilterDirectories(
+                'filter/whitelist/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                'filter/whitelist/file'
+              )
+            ),
+            'exclude' => array(
+              'directory' => $this->readFilterDirectories(
+                'filter/whitelist/exclude/directory'
+              ),
+              'file' => $this->readFilterFiles(
+                'filter/whitelist/exclude/file'
+              )
+            )
+          )
+        );
+    }
+
+    /**
+     * Returns the configuration for groups.
+     *
+     * @return array
+     * @since  Method available since Release 3.2.1
+     */
+    public function getGroupConfiguration()
+    {
+        $groups = array(
+          'include' => array(),
+          'exclude' => array()
+        );
+
+        foreach ($this->xpath->query('groups/include/group') as $group) {
+            $groups['include'][] = (string)$group->nodeValue;
+        }
+
+        foreach ($this->xpath->query('groups/exclude/group') as $group) {
+            $groups['exclude'][] = (string)$group->nodeValue;
+        }
+
+        return $groups;
+    }
+
+    /**
+     * Returns the configuration for listeners.
+     *
+     * @return array
+     * @since  Method available since Release 3.4.0
+     */
+    public function getListenerConfiguration()
+    {
+        $result = array();
+
+        foreach ($this->xpath->query('listeners/listener') as $listener) {
+            $class     = (string)$listener->getAttribute('class');
+            $file      = '';
+            $arguments = array();
+
+            if ($listener->hasAttribute('file')) {
+                $file = $this->toAbsolutePath(
+                  (string)$listener->getAttribute('file'), TRUE
+                );
+            }
+
+            foreach ($listener->childNodes as $node) {
+              if ($node instanceof DOMElement && $node->tagName == 'arguments') {
+                foreach ($node->childNodes as $argument) {
+                    if ($argument instanceof DOMElement) {
+                        if ($argument->tagName == 'file' ||
+                            $argument->tagName == 'directory') {
+                            $arguments[] = $this->toAbsolutePath((string)$argument->nodeValue);
+                        } else {
+                            $arguments[] = PHPUnit_Util_XML::xmlToVariable($argument);
+                        }
+                    }
+                }
+              }
+            }
+
+            $result[] = array(
+              'class'     => $class,
+              'file'      => $file,
+              'arguments' => $arguments
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the logging configuration.
+     *
+     * @return array
+     */
+    public function getLoggingConfiguration()
+    {
+        $result = array();
+
+        foreach ($this->xpath->query('logging/log') as $log) {
+            $type = (string)$log->getAttribute('type');
+
+            $target = $this->toAbsolutePath(
+              (string)$log->getAttribute('target')
+            );
+
+            if ($type == 'coverage-html') {
+                if ($log->hasAttribute('title')) {
+                    $result['title'] = (string)$log->getAttribute('title');
+                }
+
+                if ($log->hasAttribute('charset')) {
+                    $result['charset'] = (string)$log->getAttribute('charset');
+                }
+
+                if ($log->hasAttribute('lowUpperBound')) {
+                    $result['lowUpperBound'] = (string)$log->getAttribute('lowUpperBound');
+                }
+
+                if ($log->hasAttribute('highLowerBound')) {
+                    $result['highLowerBound'] = (string)$log->getAttribute('highLowerBound');
+                }
+
+                if ($log->hasAttribute('highlight')) {
+                    $result['highlight'] = $this->getBoolean(
+                      (string)$log->getAttribute('highlight'),
+                      FALSE
+                    );
+                }
+            }
+
+            else if ($type == 'junit') {
+                if ($log->hasAttribute('logIncompleteSkipped')) {
+                    $result['logIncompleteSkipped'] = $this->getBoolean(
+                      (string)$log->getAttribute('logIncompleteSkipped'),
+                      FALSE
+                    );
+                }
+            }
+
+            else if ($type == 'coverage-text') {
+                if ($log->hasAttribute('showUncoveredFiles')) {
+                    $result['coverageTextShowUncoveredFiles'] = $this->getBoolean(
+                      (string)$log->getAttribute('showUncoveredFiles'),
+                      FALSE
+                    );
+                }
+            }
+
+            $result[$type] = $target;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the PHP configuration.
+     *
+     * @return array
+     * @since  Method available since Release 3.2.1
+     */
+    public function getPHPConfiguration()
+    {
+        $result = array(
+          'include_path' => array(),
+          'ini'          => array(),
+          'const'        => array(),
+          'var'          => array(),
+          'env'          => array(),
+          'post'         => array(),
+          'get'          => array(),
+          'cookie'       => array(),
+          'server'       => array(),
+          'files'        => array(),
+          'request'      => array()
+        );
+
+        foreach ($this->xpath->query('php/includePath') as $includePath) {
+            $path = (string)$includePath->nodeValue;
+
+            $result['include_path'][] = $this->toAbsolutePath($path);
+        }
+
+        foreach ($this->xpath->query('php/ini') as $ini) {
+            $name  = (string)$ini->getAttribute('name');
+            $value = (string)$ini->getAttribute('value');
+
+            $result['ini'][$name] = $value;
+        }
+
+        foreach ($this->xpath->query('php/const') as $const) {
+            $name  = (string)$const->getAttribute('name');
+            $value = (string)$const->getAttribute('value');
+
+            $result['const'][$name] = $this->getBoolean($value, $value);
+        }
+
+        foreach (array('var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
+            foreach ($this->xpath->query('php/' . $array) as $var) {
+                $name  = (string)$var->getAttribute('name');
+                $value = (string)$var->getAttribute('value');
+
+                $result[$array][$name] = $this->getBoolean($value, $value);
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Handles the PHP configuration.
+     *
+     * @since  Method available since Release 3.2.20
+     */
+    public function handlePHPConfiguration()
+    {
+        $configuration = $this->getPHPConfiguration();
+
+        if (! empty($configuration['include_path'])) {
+            ini_set(
+              'include_path',
+              implode(PATH_SEPARATOR, $configuration['include_path']) .
+              PATH_SEPARATOR .
+              ini_get('include_path')
+            );
+        }
+
+        foreach ($configuration['ini'] as $name => $value) {
+            if (defined($value)) {
+                $value = constant($value);
+            }
+
+            ini_set($name, $value);
+        }
+
+        foreach ($configuration['const'] as $name => $value) {
+            if (!defined($name)) {
+                define($name, $value);
+            }
+        }
+
+        foreach (array('var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request') as $array) {
+            if ($array == 'var') {
+                $target = &$GLOBALS;
+            } else {
+                $target = &$GLOBALS['_' . strtoupper($array)];
+            }
+
+            foreach ($configuration[$array] as $name => $value) {
+                $target[$name] = $value;
+            }
+        }
+
+        foreach ($configuration['env'] as $name => $value) {
+            putenv("$name=$value");
+        }
+    }
+
+    /**
+     * Returns the PHPUnit configuration.
+     *
+     * @return array
+     * @since  Method available since Release 3.2.14
+     */
+    public function getPHPUnitConfiguration()
+    {
+        $result = array();
+        $root   = $this->document->documentElement;
+
+        if ($root->hasAttribute('cacheTokens')) {
+            $result['cacheTokens'] = $this->getBoolean(
+              (string)$root->getAttribute('cacheTokens'), TRUE
+            );
+        }
+
+        if ($root->hasAttribute('colors')) {
+            $result['colors'] = $this->getBoolean(
+              (string)$root->getAttribute('colors'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('backupGlobals')) {
+            $result['backupGlobals'] = $this->getBoolean(
+              (string)$root->getAttribute('backupGlobals'), TRUE
+            );
+        }
+
+        if ($root->hasAttribute('backupStaticAttributes')) {
+            $result['backupStaticAttributes'] = $this->getBoolean(
+              (string)$root->getAttribute('backupStaticAttributes'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('bootstrap')) {
+            $result['bootstrap'] = $this->toAbsolutePath(
+              (string)$root->getAttribute('bootstrap')
+            );
+        }
+
+        if ($root->hasAttribute('convertErrorsToExceptions')) {
+            $result['convertErrorsToExceptions'] = $this->getBoolean(
+              (string)$root->getAttribute('convertErrorsToExceptions'), TRUE
+            );
+        }
+
+        if ($root->hasAttribute('convertNoticesToExceptions')) {
+            $result['convertNoticesToExceptions'] = $this->getBoolean(
+              (string)$root->getAttribute('convertNoticesToExceptions'), TRUE
+            );
+        }
+
+        if ($root->hasAttribute('convertWarningsToExceptions')) {
+            $result['convertWarningsToExceptions'] = $this->getBoolean(
+              (string)$root->getAttribute('convertWarningsToExceptions'), TRUE
+            );
+        }
+
+        if ($root->hasAttribute('forceCoversAnnotation')) {
+            $result['forceCoversAnnotation'] = $this->getBoolean(
+              (string)$root->getAttribute('forceCoversAnnotation'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('mapTestClassNameToCoveredClassName')) {
+            $result['mapTestClassNameToCoveredClassName'] = $this->getBoolean(
+              (string)$root->getAttribute('mapTestClassNameToCoveredClassName'),
+              FALSE
+            );
+        }
+
+        if ($root->hasAttribute('processIsolation')) {
+            $result['processIsolation'] = $this->getBoolean(
+              (string)$root->getAttribute('processIsolation'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('stopOnError')) {
+            $result['stopOnError'] = $this->getBoolean(
+              (string)$root->getAttribute('stopOnError'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('stopOnFailure')) {
+            $result['stopOnFailure'] = $this->getBoolean(
+              (string)$root->getAttribute('stopOnFailure'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('stopOnIncomplete')) {
+            $result['stopOnIncomplete'] = $this->getBoolean(
+              (string)$root->getAttribute('stopOnIncomplete'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('stopOnSkipped')) {
+            $result['stopOnSkipped'] = $this->getBoolean(
+              (string)$root->getAttribute('stopOnSkipped'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('testSuiteLoaderClass')) {
+            $result['testSuiteLoaderClass'] = (string)$root->getAttribute(
+              'testSuiteLoaderClass'
+            );
+        }
+
+        if ($root->hasAttribute('testSuiteLoaderFile')) {
+            $result['testSuiteLoaderFile'] = (string)$root->getAttribute(
+              'testSuiteLoaderFile'
+            );
+        }
+
+        if ($root->hasAttribute('printerClass')) {
+            $result['printerClass'] = (string)$root->getAttribute(
+              'printerClass'
+            );
+        }
+
+        if ($root->hasAttribute('printerFile')) {
+            $result['printerFile'] = (string)$root->getAttribute(
+              'printerFile'
+            );
+        }
+
+        if ($root->hasAttribute('timeoutForSmallTests')) {
+            $result['timeoutForSmallTests'] = $this->getInteger(
+              (string)$root->getAttribute('timeoutForSmallTests'), 1
+            );
+        }
+
+        if ($root->hasAttribute('timeoutForMediumTests')) {
+            $result['timeoutForMediumTests'] = $this->getInteger(
+              (string)$root->getAttribute('timeoutForMediumTests'), 10
+            );
+        }
+
+        if ($root->hasAttribute('timeoutForLargeTests')) {
+            $result['timeoutForLargeTests'] = $this->getInteger(
+              (string)$root->getAttribute('timeoutForLargeTests'), 60
+            );
+        }
+
+        if ($root->hasAttribute('strict')) {
+            $result['strict'] = $this->getBoolean(
+              (string)$root->getAttribute('strict'), FALSE
+            );
+        }
+
+        if ($root->hasAttribute('verbose')) {
+            $result['verbose'] = $this->getBoolean(
+              (string)$root->getAttribute('verbose'), FALSE
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the SeleniumTestCase browser configuration.
+     *
+     * @return array
+     * @since  Method available since Release 3.2.9
+     */
+    public function getSeleniumBrowserConfiguration()
+    {
+        $result = array();
+
+        foreach ($this->xpath->query('selenium/browser') as $config) {
+            $name    = (string)$config->getAttribute('name');
+            $browser = (string)$config->getAttribute('browser');
+
+            if ($config->hasAttribute('host')) {
+                $host = (string)$config->getAttribute('host');
+            } else {
+                $host = 'localhost';
+            }
+
+            if ($config->hasAttribute('port')) {
+                $port = $this->getInteger(
+                  (string)$config->getAttribute('port'), 4444
+                );
+            } else {
+                $port = 4444;
+            }
+
+            if ($config->hasAttribute('timeout')) {
+                $timeout = $this->getInteger(
+                  (string)$config->getAttribute('timeout'), 30000
+                );
+            } else {
+                $timeout = 30000;
+            }
+
+            $result[] = array(
+              'name'    => $name,
+              'browser' => $browser,
+              'host'    => $host,
+              'port'    => $port,
+              'timeout' => $timeout
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the test suite configuration.
+     *
+     * @return PHPUnit_Framework_TestSuite
+     * @since  Method available since Release 3.2.1
+     */
+    public function getTestSuiteConfiguration($testSuiteFilter=null)
+    {
+        $testSuiteNodes = $this->xpath->query('testsuites/testsuite');
+
+        if ($testSuiteNodes->length == 0) {
+            $testSuiteNodes = $this->xpath->query('testsuite');
+        }
+
+        if ($testSuiteNodes->length == 1) {
+            return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter);
+        }
+
+        if ($testSuiteNodes->length > 1) {
+            $suite = new PHPUnit_Framework_TestSuite;
+
+            foreach ($testSuiteNodes as $testSuiteNode) {
+                $suite->addTestSuite(
+                  $this->getTestSuite($testSuiteNode, $testSuiteFilter)
+                );
+            }
+
+            return $suite;
+        }
+    }
+
+    /**
+     * @param  DOMElement $testSuiteNode
+     * @return PHPUnit_Framework_TestSuite
+     * @since  Method available since Release 3.4.0
+     */
+    protected function getTestSuite(DOMElement $testSuiteNode, $testSuiteFilter=null)
+    {
+        if ($testSuiteNode->hasAttribute('name')) {
+            $suite = new PHPUnit_Framework_TestSuite(
+              (string)$testSuiteNode->getAttribute('name')
+            );
+        } else {
+            $suite = new PHPUnit_Framework_TestSuite;
+        }
+
+        $exclude = array();
+
+        foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) {
+            $exclude[] = (string)$excludeNode->nodeValue;
+        }
+
+        $fileIteratorFacade = new File_Iterator_Facade;
+
+        foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) {
+            if ($testSuiteFilter && $directoryNode->parentNode->getAttribute('name') != $testSuiteFilter) {
+                continue;
+            }
+            
+            $directory = (string)$directoryNode->nodeValue;
+
+            if (empty($directory)) {
+                continue;
+            }
+
+            if ($directoryNode->hasAttribute('phpVersion')) {
+                $phpVersion = (string)$directoryNode->getAttribute('phpVersion');
+            } else {
+                $phpVersion = PHP_VERSION;
+            }
+
+            if ($directoryNode->hasAttribute('phpVersionOperator')) {
+                $phpVersionOperator = (string)$directoryNode->getAttribute('phpVersionOperator');
+            } else {
+                $phpVersionOperator = '>=';
+            }
+
+            if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
+                continue;
+            }
+
+            if ($directoryNode->hasAttribute('prefix')) {
+                $prefix = (string)$directoryNode->getAttribute('prefix');
+            } else {
+                $prefix = '';
+            }
+
+            if ($directoryNode->hasAttribute('suffix')) {
+                $suffix = (string)$directoryNode->getAttribute('suffix');
+            } else {
+                $suffix = 'Test.php';
+            }
+
+            $files = $fileIteratorFacade->getFilesAsArray(
+              $this->toAbsolutePath($directory),
+              $suffix,
+              $prefix,
+              $exclude
+            );
+            $suite->addTestFiles($files);
+        }
+
+        foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) {
+            if ($testSuiteFilter && $fileNode->parentNode->getAttribute('name') != $testSuiteFilter) {
+                continue;
+            }
+            
+            $file = (string)$fileNode->nodeValue;
+
+            if (empty($file)) {
+                continue;
+            }
+
+            // Get the absolute path to the file
+            $file = $fileIteratorFacade->getFilesAsArray($file);
+
+            if (!isset($file[0])) {
+                continue;
+            }
+
+            $file = $file[0];
+
+            if ($fileNode->hasAttribute('phpVersion')) {
+                $phpVersion = (string)$fileNode->getAttribute('phpVersion');
+            } else {
+                $phpVersion = PHP_VERSION;
+            }
+
+            if ($fileNode->hasAttribute('phpVersionOperator')) {
+                $phpVersionOperator = (string)$fileNode->getAttribute('phpVersionOperator');
+            } else {
+                $phpVersionOperator = '>=';
+            }
+
+            if (!version_compare(PHP_VERSION, $phpVersion, $phpVersionOperator)) {
+                continue;
+            }
+
+            $suite->addTestFile($file);
+        }
+
+        return $suite;
+    }
+
+    /**
+     * @param  string  $value
+     * @param  boolean $default
+     * @return boolean
+     * @since  Method available since Release 3.2.3
+     */
+    protected function getBoolean($value, $default)
+    {
+        if (strtolower($value) == 'false') {
+            return FALSE;
+        }
+
+        else if (strtolower($value) == 'true') {
+            return TRUE;
+        }
+
+        return $default;
+    }
+
+    /**
+     * @param  string  $value
+     * @param  boolean $default
+     * @return boolean
+     * @since  Method available since Release 3.6.0
+     */
+    protected function getInteger($value, $default)
+    {
+        if (is_numeric($value)) {
+            return (int)$value;
+        }
+
+        return $default;
+    }
+
+    /**
+     * @param  string $query
+     * @return array
+     * @since  Method available since Release 3.2.3
+     */
+    protected function readFilterDirectories($query)
+    {
+        $directories = array();
+
+        foreach ($this->xpath->query($query) as $directory) {
+            if ($directory->hasAttribute('prefix')) {
+                $prefix = (string)$directory->getAttribute('prefix');
+            } else {
+                $prefix = '';
+            }
+
+            if ($directory->hasAttribute('suffix')) {
+                $suffix = (string)$directory->getAttribute('suffix');
+            } else {
+                $suffix = '.php';
+            }
+
+            if ($directory->hasAttribute('group')) {
+                $group = (string)$directory->getAttribute('group');
+            } else {
+                $group = 'DEFAULT';
+            }
+
+            $directories[] = array(
+              'path'   => $this->toAbsolutePath((string)$directory->nodeValue),
+              'prefix' => $prefix,
+              'suffix' => $suffix,
+              'group'  => $group
+            );
+        }
+
+        return $directories;
+    }
+
+    /**
+     * @param  string $query
+     * @return array
+     * @since  Method available since Release 3.2.3
+     */
+    protected function readFilterFiles($query)
+    {
+        $files = array();
+
+        foreach ($this->xpath->query($query) as $file) {
+            $files[] = $this->toAbsolutePath((string)$file->nodeValue);
+        }
+
+        return $files;
+    }
+
+    /**
+     * @param  string  $path
+     * @param  boolean $useIncludePath
+     * @return string
+     * @since  Method available since Release 3.5.0
+     */
+    protected function toAbsolutePath($path, $useIncludePath = FALSE)
+    {
+        // Check whether the path is already absolute.
+        if ($path[0] === '/' || $path[0] === '\\' ||
+            (strlen($path) > 3 && ctype_alpha($path[0]) &&
+             $path[1] === ':' && ($path[2] === '\\' || $path[2] === '/'))) {
+            return $path;
+        }
+
+        // Check whether a stream is used.
+        if (strpos($path, '://') !== FALSE) {
+            return $path;
+        }
+
+        $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path;
+
+        if ($useIncludePath && !file_exists($file)) {
+            $includePathFile = stream_resolve_include_path($path);
+
+            if ($includePathFile) {
+                $file = $includePathFile;
+            }
+        }
+
+        return $file;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/DeprecatedFeature.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/DeprecatedFeature.php
new file mode 100644
index 0000000..c3b343f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/DeprecatedFeature.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Ralph Schindler <ralph.schindler@zend.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.7
+ */
+
+/**
+ * Class to hold the information about a deprecated feature that was used
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Ralph Schindler <ralph.schindler@zend.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Interface available since Release 3.5.7
+ */
+class PHPUnit_Util_DeprecatedFeature
+{
+    /**
+     * @var array
+     */
+    protected $traceInfo = array();
+
+    /**
+     * @var string
+     */
+    protected $message = NULL;
+
+    /**
+     * @param  string $message
+     * @param  array  $traceInfo
+     */
+    public function __construct($message, array $traceInfo = array())
+    {
+        $this->message   = $message;
+        $this->traceInfo = $traceInfo;
+    }
+
+    /**
+     * Build a string representation of the deprecated feature that was raised
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        $string = '';
+
+        if (isset($this->traceInfo['file'])) {
+            $string .= $this->traceInfo['file'];
+
+            if (isset($this->traceInfo['line'])) {
+                $string .= ':' . $this->traceInfo['line'] . ' - ';
+            }
+        }
+
+        $string .= $this->message;
+
+        return $string;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/DeprecatedFeature/Logger.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/DeprecatedFeature/Logger.php
new file mode 100644
index 0000000..00f4b6d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/DeprecatedFeature/Logger.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Ralph Schindler <ralph.schindler@zend.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.7
+ */
+
+/**
+ * Test Listener that tracks the usage of deprecated features.
+ *
+ * @package    PHPUnit
+ * @subpackage Framework
+ * @author     Ralph Schindler <ralph.schindler@zend.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2010 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.7
+ */
+class PHPUnit_Util_DeprecatedFeature_Logger implements PHPUnit_Framework_TestListener
+{
+    /**
+     * @var PHPUnit_Framework_TestCase
+     */
+    protected static $currentTest = NULL;
+
+    /**
+     * This is the publically accessible API for notifying the system that a
+     * deprecated feature has been used.
+     *
+     * If it is run via a TestRunner and the test extends
+     * PHPUnit_Framework_TestCase, then this will inject the result into the
+     * test runner for display, if not, it will throw the notice to STDERR.
+     *
+     * @param string $message
+     * @param int|bool $backtraceDepth
+     */
+    public static function log($message, $backtraceDepth = 2)
+    {
+        if ($backtraceDepth !== FALSE) {
+            $trace = debug_backtrace(FALSE);
+
+            if (is_int($backtraceDepth)) {
+                $traceItem = $trace[$backtraceDepth];
+            }
+
+            if (!isset($traceItem['file'])) {
+                $reflectionClass   = new ReflectionClass($traceItem['class']);
+                $traceItem['file'] = $reflectionClass->getFileName();
+            }
+
+            if (!isset($traceItem['line']) &&
+                 isset($traceItem['class']) &&
+                 isset($traceItem['function'])) {
+                if (!isset($reflectionClass)) {
+                    $reflectionClass = new ReflectionClass($traceItem['class']);
+                }
+
+                $method = $reflectionClass->getMethod($traceItem['function']);
+                $traceItem['line'] = '(between ' . $method->getStartLine() .
+                                     ' and ' . $method->getEndLine() . ')';
+            }
+        }
+
+        $deprecatedFeature = new PHPUnit_Util_DeprecatedFeature(
+          $message, $traceItem
+        );
+
+        if (self::$currentTest instanceof PHPUnit_Framework_TestCase) {
+            $result = self::$currentTest->getTestResultObject();
+            $result->addDeprecatedFeature($deprecatedFeature);
+        } else {
+            file_put_contents('php://stderr', $deprecatedFeature);
+        }
+    }
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+    }
+
+    /**
+     * A test suite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A test suite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        self::$currentTest = $test;
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        self::$currentTest = NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Diff.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Diff.php
new file mode 100644
index 0000000..b597a6d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Diff.php
@@ -0,0 +1,293 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Kore Nordmann <mail@kore-nordmann.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Diff implementation.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Kore Nordmann <mail@kore-nordmann.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Util_Diff
+{
+    /**
+     * Returns the diff between two arrays or strings as string.
+     *
+     * @param  array|string $from
+     * @param  array|string $to
+     * @return string
+     */
+    public static function diff($from, $to)
+    {
+        $buffer= "--- Expected\n+++ Actual\n";
+        $diff  = self::diffToArray($from,$to);
+
+        $inOld = FALSE;
+        $i     = 0;
+        $old   = array();
+
+        foreach ($diff as $line) {
+            if ($line[1] ===  0 /* OLD */) {
+                if ($inOld === FALSE) {
+                    $inOld = $i;
+                }
+            }
+
+            else if ($inOld !== FALSE) {
+                if (($i - $inOld) > 5) {
+                    $old[$inOld] = $i - 1;
+                }
+
+                $inOld = FALSE;
+            }
+
+            ++$i;
+        }
+
+        $start = isset($old[0]) ? $old[0] : 0;
+        $end   = count($diff);
+        $i     = 0;
+
+        if ($tmp = array_search($end, $old)) {
+            $end = $tmp;
+        }
+
+        $newChunk = TRUE;
+
+        for ($i = $start; $i < $end; $i++) {
+            if (isset($old[$i])) {
+                $buffer  .= "\n";
+                $newChunk = TRUE;
+                $i        = $old[$i];
+            }
+
+            if ($newChunk) {
+                $buffer  .= "@@ @@\n";
+                $newChunk = FALSE;
+            }
+
+            if ($diff[$i][1] === 1 /* ADDED */) {
+                $buffer .= '+' . $diff[$i][0] . "\n";
+            }
+
+            else if ($diff[$i][1] === 2 /* REMOVED */) {
+                $buffer .= '-' . $diff[$i][0] . "\n";
+            }
+
+            else {
+                $buffer .= ' ' . $diff[$i][0] . "\n";
+            }
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Returns the diff between two arrays or strings as array.
+     *
+     * every array-entry containts two elements:
+     *   - [0] => string $token
+     *   - [1] => 2|1|0
+     *
+     * - 2: REMOVED: $token was removed from $from
+     * - 1: ADDED: $token was added to $from
+     * - 0: OLD: $token is not changed in $to
+     *
+     * @param  array|string $from
+     * @param  array|string $to
+     * @return array
+     */
+    public static function diffToArray($from, $to)
+    {
+        preg_match_all('(\r\n|\r|\n)', $from, $fromMatches);
+        preg_match_all('(\r\n|\r|\n)', $to, $toMatches);
+
+        if (is_string($from)) {
+            $from = preg_split('(\r\n|\r|\n)', $from);
+        }
+
+        if (is_string($to)) {
+            $to = preg_split('(\r\n|\r|\n)', $to);
+        }
+
+        $start      = array();
+        $end        = array();
+        $fromLength = count($from);
+        $toLength   = count($to);
+        $length     = min($fromLength, $toLength);
+
+        for ($i = 0; $i < $length; ++$i) {
+            if ($from[$i] === $to[$i]) {
+                $start[] = $from[$i];
+                unset($from[$i], $to[$i]);
+            } else {
+                break;
+            }
+        }
+
+        $length -= $i;
+
+        for ($i = 1; $i < $length; ++$i) {
+            if ($from[$fromLength - $i] === $to[$toLength - $i]) {
+                array_unshift($end, $from[$fromLength - $i]);
+                unset($from[$fromLength - $i], $to[$toLength - $i]);
+            } else {
+                break;
+            }
+        }
+
+        $common = self::longestCommonSubsequence(
+          array_values($from), array_values($to)
+        );
+
+        $diff = array();
+        $line = 0;
+
+        if (isset($fromMatches[0]) && $toMatches[0] &&
+            count($fromMatches[0]) === count($toMatches[0]) &&
+            $fromMatches[0] !== $toMatches[0]) {
+            $diff[] = array(
+              '#Warning: Strings contain different line endings!', 0
+            );
+        }
+
+        foreach ($start as $token) {
+            $diff[] = array($token, 0 /* OLD */);
+        }
+
+        reset($from);
+        reset($to);
+
+        foreach ($common as $token) {
+            while ((($fromToken = reset($from)) !== $token)) {
+                $diff[] = array(array_shift($from), 2 /* REMOVED */);
+            }
+
+            while ((($toToken = reset($to)) !== $token)) {
+                $diff[] = array(array_shift($to), 1 /* ADDED */);
+            }
+
+            $diff[] = array($token, 0 /* OLD */);
+
+            array_shift($from);
+            array_shift($to);
+        }
+
+        while (($token = array_shift($from)) !== NULL) {
+            $diff[] = array($token, 2 /* REMOVED */);
+        }
+
+        while (($token = array_shift($to)) !== NULL) {
+            $diff[] = array($token, 1 /* ADDED */);
+        }
+
+        foreach ($end as $token) {
+            $diff[] = array($token, 0 /* OLD */);
+        }
+
+        return $diff;
+    }
+
+    /**
+     * Calculates the longest common subsequence of two arrays.
+     *
+     * @param  array $from
+     * @param  array $to
+     * @return array
+     */
+    protected static function longestCommonSubsequence(array $from, array $to)
+    {
+        $common     = array();
+        $matrix     = array();
+        $fromLength = count($from);
+        $toLength   = count($to);
+
+        for ($i = 0; $i <= $fromLength; ++$i) {
+            $matrix[$i][0] = 0;
+        }
+
+        for ($j = 0; $j <= $toLength; ++$j) {
+            $matrix[0][$j] = 0;
+        }
+
+        for ($i = 1; $i <= $fromLength; ++$i) {
+            for ($j = 1; $j <= $toLength; ++$j) {
+                $matrix[$i][$j] = max(
+                  $matrix[$i-1][$j],
+                  $matrix[$i][$j-1],
+                  $from[$i-1] === $to[$j-1] ? $matrix[$i-1][$j-1] + 1 : 0
+                );
+            }
+        }
+
+        $i = $fromLength;
+        $j = $toLength;
+
+        while ($i > 0 && $j > 0) {
+            if ($from[$i-1] === $to[$j-1]) {
+                array_unshift($common, $from[$i-1]);
+                --$i;
+                --$j;
+            }
+
+            else if ($matrix[$i][$j-1] > $matrix[$i-1][$j]) {
+                --$j;
+            }
+
+            else {
+                --$i;
+            }
+        }
+
+        return $common;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/ErrorHandler.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/ErrorHandler.php
new file mode 100644
index 0000000..68f0f7f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/ErrorHandler.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+// Workaround for http://bugs.php.net/bug.php?id=47987,
+// see https://github.com/sebastianbergmann/phpunit/issues#issue/125 for details
+require_once 'PHPUnit/Framework/Error.php';
+require_once 'PHPUnit/Framework/Error/Notice.php';
+require_once 'PHPUnit/Framework/Error/Warning.php';
+require_once 'PHPUnit/Framework/Error/Deprecated.php';
+
+/**
+ * Error handler that converts PHP errors and warnings to exceptions.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class PHPUnit_Util_ErrorHandler
+{
+    protected static $errorStack = array();
+
+    /**
+     * Returns the error stack.
+     *
+     * @return array
+     */
+    public static function getErrorStack()
+    {
+        return self::$errorStack;
+    }
+
+    /**
+     * @param  integer $errno
+     * @param  string  $errstr
+     * @param  string  $errfile
+     * @param  integer $errline
+     * @throws PHPUnit_Framework_Error
+     */
+    public static function handleError($errno, $errstr, $errfile, $errline)
+    {
+        if (!($errno & error_reporting())) {
+            return FALSE;
+        }
+
+        self::$errorStack[] = array($errno, $errstr, $errfile, $errline);
+
+        $trace = debug_backtrace(FALSE);
+        array_shift($trace);
+
+        foreach ($trace as $frame) {
+            if ($frame['function'] == '__toString') {
+                return FALSE;
+            }
+        }
+
+        if ($errno == E_NOTICE || $errno == E_USER_NOTICE || $errno == E_STRICT) {
+            if (PHPUnit_Framework_Error_Notice::$enabled !== TRUE) {
+                return FALSE;
+            }
+
+            $exception = 'PHPUnit_Framework_Error_Notice';
+        }
+
+        else if ($errno == E_WARNING || $errno == E_USER_WARNING) {
+            if (PHPUnit_Framework_Error_Warning::$enabled !== TRUE) {
+                return FALSE;
+            }
+
+            $exception = 'PHPUnit_Framework_Error_Warning';
+        }
+
+        else if ($errno == E_DEPRECATED || $errno == E_USER_DEPRECATED) {
+            if (PHPUnit_Framework_Error_Deprecated::$enabled !== TRUE) {
+                return FALSE;
+            }
+
+            $exception = 'PHPUnit_Framework_Error_Deprecated';
+        }
+
+        else {
+            $exception = 'PHPUnit_Framework_Error';
+        }
+
+        throw new $exception($errstr, $errno, $errfile, $errline);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Fileloader.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Fileloader.php
new file mode 100644
index 0000000..6f95c30
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Fileloader.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ * Utility methods to load PHP sourcefiles.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.3.0
+ */
+class PHPUnit_Util_Fileloader
+{
+    /**
+     * Checks if a PHP sourcefile is readable.
+     * The sourcefile is loaded through the load() method.
+     *
+     * @param  string $filename
+     * @throws PHPUnit_Framework_Exception
+     */
+    public static function checkAndLoad($filename)
+    {
+        $includePathFilename = stream_resolve_include_path($filename);
+
+        if (!$includePathFilename || !is_readable($includePathFilename)) {
+            throw new PHPUnit_Framework_Exception(
+              sprintf('Cannot open file "%s".' . "\n", $filename)
+            );
+        }
+
+        self::load($includePathFilename);
+
+        return $includePathFilename;
+    }
+
+    /**
+     * Loads a PHP sourcefile.
+     *
+     * @param  string $filename
+     * @return mixed
+     * @since  Method available since Release 3.0.0
+     */
+    public static function load($filename)
+    {
+        $oldVariableNames = array_keys(get_defined_vars());
+
+        include_once $filename;
+
+        $newVariables     = get_defined_vars();
+        $newVariableNames = array_diff(
+                              array_keys($newVariables), $oldVariableNames
+                            );
+
+        foreach ($newVariableNames as $variableName) {
+            if ($variableName != 'oldVariableNames') {
+                $GLOBALS[$variableName] = $newVariables[$variableName];
+            }
+        }
+
+        return $filename;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Filesystem.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Filesystem.php
new file mode 100644
index 0000000..232bdd9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Filesystem.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Filesystem helpers.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Util_Filesystem
+{
+    /**
+     * @var array
+     */
+    protected static $buffer = array();
+
+    /**
+     * Maps class names to source file names:
+     *   - PEAR CS:   Foo_Bar_Baz -> Foo/Bar/Baz.php
+     *   - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php
+     *
+     * @param  string $className
+     * @return string
+     * @since  Method available since Release 3.4.0
+     */
+    public static function classNameToFilename($className)
+    {
+        return str_replace(
+          array('_', '\\'),
+          DIRECTORY_SEPARATOR,
+          $className
+        ) . '.php';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Filter.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Filter.php
new file mode 100644
index 0000000..3caa483
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Filter.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Utility class for code filtering.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Util_Filter
+{
+    /**
+     * Filters stack frames from PHPUnit classes.
+     *
+     * @param  Exception $e
+     * @param  boolean   $asString
+     * @return string
+     */
+    public static function getFilteredStacktrace(Exception $e, $asString = TRUE)
+    {
+        if (!defined('PHPUNIT_TESTSUITE')) {
+            $blacklist = PHPUnit_Util_GlobalState::phpunitFiles();
+        } else {
+            $blacklist = array();
+        }
+
+        if ($asString === TRUE) {
+            $filteredStacktrace = '';
+        } else {
+            $filteredStacktrace = array();
+        }
+
+        if ($e instanceof PHPUnit_Framework_SyntheticError) {
+            $eTrace = $e->getSyntheticTrace();
+            $eFile  = $e->getSyntheticFile();
+            $eLine  = $e->getSyntheticLine();
+        } else {
+            if ($e->getPrevious()) {
+                $eTrace = $e->getPrevious()->getTrace();
+            } else {
+                $eTrace = $e->getTrace();
+            }
+            $eFile  = $e->getFile();
+            $eLine  = $e->getLine();
+        }
+
+        if (!self::frameExists($eTrace, $eFile, $eLine)) {
+            array_unshift(
+              $eTrace, array('file' => $eFile, 'line' => $eLine)
+            );
+        }
+
+        foreach ($eTrace as $frame) {
+            if (isset($frame['file']) && is_file($frame['file']) &&
+                !isset($blacklist[$frame['file']])) {
+                if ($asString === TRUE) {
+                    $filteredStacktrace .= sprintf(
+                      "%s:%s\n",
+
+                      $frame['file'],
+                      isset($frame['line']) ? $frame['line'] : '?'
+                    );
+                } else {
+                    $filteredStacktrace[] = $frame;
+                }
+            }
+        }
+
+        return $filteredStacktrace;
+    }
+
+    /**
+     * @param  array  $trace
+     * @param  string $file
+     * @param  int    $line
+     * @return boolean
+     * @since  Method available since Release 3.3.2
+     */
+    public static function frameExists(array $trace, $file, $line)
+    {
+        foreach ($trace as $frame) {
+            if (isset($frame['file']) && $frame['file'] == $file &&
+                isset($frame['line']) && $frame['line'] == $line) {
+                return TRUE;
+            }
+        }
+
+        return FALSE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Getopt.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Getopt.php
new file mode 100644
index 0000000..72794a6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Getopt.php
@@ -0,0 +1,208 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Command-line options parsing class.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Andrei Zmievski <andrei@php.net>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Util_Getopt
+{
+    public static function getopt(array $args, $short_options, $long_options = NULL)
+    {
+        if (empty($args)) {
+            return array(array(), array());
+        }
+
+        $opts     = array();
+        $non_opts = array();
+
+        if ($long_options) {
+            sort($long_options);
+        }
+
+        if (isset($args[0][0]) && $args[0][0] != '-') {
+            array_shift($args);
+        }
+
+        reset($args);
+        array_map('trim', $args);
+
+        while (list($i, $arg) = each($args)) {
+            if ($arg == '') {
+                continue;
+            }
+
+            if ($arg == '--') {
+                $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
+                break;
+            }
+
+            if ($arg[0] != '-' ||
+                (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) {
+                $non_opts = array_merge($non_opts, array_slice($args, $i));
+                break;
+            }
+
+            elseif (strlen($arg) > 1 && $arg[1] == '-') {
+                self::parseLongOption(
+                  substr($arg, 2), $long_options, $opts, $args
+                );
+            }
+
+            else {
+                self::parseShortOption(
+                  substr($arg, 1), $short_options, $opts, $args
+                );
+            }
+        }
+
+        return array($opts, $non_opts);
+    }
+
+    protected static function parseShortOption($arg, $short_options, &$opts, &$args)
+    {
+        $argLen = strlen($arg);
+
+        for ($i = 0; $i < $argLen; $i++) {
+            $opt     = $arg[$i];
+            $opt_arg = NULL;
+
+            if (($spec = strstr($short_options, $opt)) === FALSE ||
+                $arg[$i] == ':') {
+                throw new PHPUnit_Framework_Exception(
+                  "unrecognized option -- $opt"
+                );
+            }
+
+            if (strlen($spec) > 1 && $spec[1] == ':') {
+                if (strlen($spec) > 2 && $spec[2] == ':') {
+                    if ($i + 1 < $argLen) {
+                        $opts[] = array($opt, substr($arg, $i + 1));
+                        break;
+                    }
+                } else {
+                    if ($i + 1 < $argLen) {
+                        $opts[] = array($opt, substr($arg, $i + 1));
+                        break;
+                    }
+
+                    else if (list(, $opt_arg) = each($args)) {
+                    }
+
+                    else {
+                        throw new PHPUnit_Framework_Exception(
+                          "option requires an argument -- $opt"
+                        );
+                    }
+                }
+            }
+
+            $opts[] = array($opt, $opt_arg);
+        }
+    }
+
+    protected static function parseLongOption($arg, $long_options, &$opts, &$args)
+    {
+        $count   = count($long_options);
+        $list    = explode('=', $arg);
+        $opt     = $list[0];
+        $opt_arg = NULL;
+
+        if (count($list) > 1) {
+            $opt_arg = $list[1];
+        }
+
+        $opt_len = strlen($opt);
+
+        for ($i = 0; $i < $count; $i++) {
+            $long_opt  = $long_options[$i];
+            $opt_start = substr($long_opt, 0, $opt_len);
+
+            if ($opt_start != $opt) {
+                continue;
+            }
+
+            $opt_rest = substr($long_opt, $opt_len);
+
+            if ($opt_rest != '' && $opt[0] != '=' && $i + 1 < $count &&
+                $opt == substr($long_options[$i+1], 0, $opt_len)) {
+                throw new PHPUnit_Framework_Exception(
+                  "option --$opt is ambiguous"
+                );
+            }
+
+            if (substr($long_opt, -1) == '=') {
+                if (substr($long_opt, -2) != '==') {
+                    if (!strlen($opt_arg) &&
+                        !(list(, $opt_arg) = each($args))) {
+                        throw new PHPUnit_Framework_Exception(
+                          "option --$opt requires an argument"
+                        );
+                    }
+                }
+            }
+
+            else if ($opt_arg) {
+                throw new PHPUnit_Framework_Exception(
+                  "option --$opt doesn't allow an argument"
+                );
+            }
+
+            $opts[] = array('--' . $opt, $opt_arg);
+            return;
+        }
+
+        throw new PHPUnit_Framework_Exception("unrecognized option --$opt");
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/GlobalState.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/GlobalState.php
new file mode 100644
index 0000000..2fe9c0b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/GlobalState.php
@@ -0,0 +1,449 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Util_GlobalState
+{
+    /**
+     * @var array
+     */
+    protected static $globals = array();
+
+    /**
+     * @var array
+     */
+    protected static $staticAttributes = array();
+
+    /**
+     * @var array
+     */
+    protected static $superGlobalArrays = array(
+      '_ENV',
+      '_POST',
+      '_GET',
+      '_COOKIE',
+      '_SERVER',
+      '_FILES',
+      '_REQUEST'
+    );
+
+    /**
+     * @var array
+     */
+    protected static $superGlobalArraysLong = array(
+      'HTTP_ENV_VARS',
+      'HTTP_POST_VARS',
+      'HTTP_GET_VARS',
+      'HTTP_COOKIE_VARS',
+      'HTTP_SERVER_VARS',
+      'HTTP_POST_FILES'
+    );
+
+    /**
+     * @var array
+     */
+    protected static $phpunitFiles;
+
+    public static function backupGlobals(array $blacklist)
+    {
+        self::$globals     = array();
+        $superGlobalArrays = self::getSuperGlobalArrays();
+
+        foreach ($superGlobalArrays as $superGlobalArray) {
+            if (!in_array($superGlobalArray, $blacklist)) {
+                self::backupSuperGlobalArray($superGlobalArray);
+            }
+        }
+
+        foreach (array_keys($GLOBALS) as $key) {
+            if ($key != 'GLOBALS' &&
+                !in_array($key, $superGlobalArrays) &&
+                !in_array($key, $blacklist) &&
+                !$GLOBALS[$key] instanceof Closure) {
+                self::$globals['GLOBALS'][$key] = serialize($GLOBALS[$key]);
+            }
+        }
+    }
+
+    public static function restoreGlobals(array $blacklist)
+    {
+        if (ini_get('register_long_arrays') == '1') {
+            $superGlobalArrays = array_merge(
+              self::$superGlobalArrays, self::$superGlobalArraysLong
+            );
+        } else {
+            $superGlobalArrays = self::$superGlobalArrays;
+        }
+
+        foreach ($superGlobalArrays as $superGlobalArray) {
+            if (!in_array($superGlobalArray, $blacklist)) {
+                self::restoreSuperGlobalArray($superGlobalArray);
+            }
+        }
+
+        foreach (array_keys($GLOBALS) as $key) {
+            if ($key != 'GLOBALS' &&
+                !in_array($key, $superGlobalArrays) &&
+                !in_array($key, $blacklist)) {
+                if (isset(self::$globals['GLOBALS'][$key])) {
+                    $GLOBALS[$key] = unserialize(
+                      self::$globals['GLOBALS'][$key]
+                    );
+                } else {
+                    unset($GLOBALS[$key]);
+                }
+            }
+        }
+
+        self::$globals = array();
+    }
+
+    protected static function backupSuperGlobalArray($superGlobalArray)
+    {
+        self::$globals[$superGlobalArray] = array();
+
+        if (isset($GLOBALS[$superGlobalArray]) &&
+            is_array($GLOBALS[$superGlobalArray])) {
+            foreach ($GLOBALS[$superGlobalArray] as $key => $value) {
+                self::$globals[$superGlobalArray][$key] = serialize($value);
+            }
+        }
+    }
+
+    protected static function restoreSuperGlobalArray($superGlobalArray)
+    {
+        if (isset($GLOBALS[$superGlobalArray]) &&
+            is_array($GLOBALS[$superGlobalArray]) &&
+            isset(self::$globals[$superGlobalArray])) {
+            $keys = array_keys(
+              array_merge(
+                $GLOBALS[$superGlobalArray], self::$globals[$superGlobalArray]
+              )
+            );
+
+            foreach ($keys as $key) {
+                if (isset(self::$globals[$superGlobalArray][$key])) {
+                    $GLOBALS[$superGlobalArray][$key] = unserialize(
+                      self::$globals[$superGlobalArray][$key]
+                    );
+                } else {
+                    unset($GLOBALS[$superGlobalArray][$key]);
+                }
+            }
+        }
+
+        self::$globals[$superGlobalArray] = array();
+    }
+
+    public static function getIncludedFilesAsString()
+    {
+        $blacklist = self::phpunitFiles();
+        $files     = get_included_files();
+        $result    = '';
+
+        for ($i = count($files) - 1; $i > 0; $i--) {
+            if (!isset($blacklist[$files[$i]]) && is_file($files[$i])) {
+                $result = 'require_once \'' . $files[$i] . "';\n" . $result;
+            }
+        }
+
+        return $result;
+    }
+
+    public static function getConstantsAsString()
+    {
+        $constants = get_defined_constants(TRUE);
+        $result    = '';
+
+        if (isset($constants['user'])) {
+            foreach ($constants['user'] as $name => $value) {
+                $result .= sprintf(
+                  'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n",
+                  $name,
+                  $name,
+                  self::exportVariable($value)
+                );
+            }
+        }
+
+        return $result;
+    }
+
+    public static function getGlobalsAsString()
+    {
+        $result            = '';
+        $superGlobalArrays = self::getSuperGlobalArrays();
+
+        foreach ($superGlobalArrays as $superGlobalArray) {
+            if (isset($GLOBALS[$superGlobalArray]) &&
+                is_array($GLOBALS[$superGlobalArray])) {
+                foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) {
+                    if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) {
+                        continue;
+                    }
+
+                    $result .= sprintf(
+                      '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n",
+                      $superGlobalArray,
+                      $key,
+                      self::exportVariable($GLOBALS[$superGlobalArray][$key])
+                    );
+                }
+            }
+        }
+
+        $blacklist   = $superGlobalArrays;
+        $blacklist[] = 'GLOBALS';
+        $blacklist[] = '_PEAR_Config_instance';
+
+        foreach (array_keys($GLOBALS) as $key) {
+            if (!in_array($key, $blacklist) && !$GLOBALS[$key] instanceof Closure) {
+                $result .= sprintf(
+                  '$GLOBALS[\'%s\'] = %s;' . "\n",
+                  $key,
+                  self::exportVariable($GLOBALS[$key])
+                );
+            }
+        }
+
+        return $result;
+    }
+
+    protected static function getSuperGlobalArrays()
+    {
+        if (ini_get('register_long_arrays') == '1') {
+            return array_merge(
+              self::$superGlobalArrays, self::$superGlobalArraysLong
+            );
+        } else {
+            return self::$superGlobalArrays;
+        }
+    }
+
+    public static function backupStaticAttributes(array $blacklist)
+    {
+        self::$staticAttributes = array();
+        $declaredClasses        = get_declared_classes();
+        $declaredClassesNum     = count($declaredClasses);
+
+        for ($i = $declaredClassesNum - 1; $i >= 0; $i--) {
+            if (strpos($declaredClasses[$i], 'PHPUnit') !== 0 &&
+                strpos($declaredClasses[$i], 'File_Iterator') !== 0 &&
+                strpos($declaredClasses[$i], 'PHP_CodeCoverage') !== 0 &&
+                strpos($declaredClasses[$i], 'PHP_Invoker') !== 0 &&
+                strpos($declaredClasses[$i], 'PHP_Timer') !== 0 &&
+                strpos($declaredClasses[$i], 'PHP_TokenStream') !== 0 &&
+                strpos($declaredClasses[$i], 'Symfony') !== 0 &&
+                strpos($declaredClasses[$i], 'Text_Template') !== 0 &&
+                !$declaredClasses[$i] instanceof PHPUnit_Framework_Test) {
+                $class = new ReflectionClass($declaredClasses[$i]);
+
+                if (!$class->isUserDefined()) {
+                    break;
+                }
+
+                $backup = array();
+
+                foreach ($class->getProperties() as $attribute) {
+                    if ($attribute->isStatic()) {
+                        $name = $attribute->getName();
+
+                        if (!isset($blacklist[$declaredClasses[$i]]) ||
+                           !in_array($name, $blacklist[$declaredClasses[$i]])) {
+                            $attribute->setAccessible(TRUE);
+                            $value = $attribute->getValue();
+
+                            if (!$value instanceof Closure) {
+                                $backup[$name] = serialize($value);
+                            }
+                        }
+                    }
+                }
+
+                if (!empty($backup)) {
+                    self::$staticAttributes[$declaredClasses[$i]] = $backup;
+                }
+            }
+        }
+    }
+
+    public static function restoreStaticAttributes()
+    {
+        foreach (self::$staticAttributes as $className => $staticAttributes) {
+            foreach ($staticAttributes as $name => $value) {
+                $reflector = new ReflectionProperty($className, $name);
+                $reflector->setAccessible(TRUE);
+                $reflector->setValue(unserialize($value));
+            }
+        }
+
+        self::$staticAttributes = array();
+    }
+
+    protected static function exportVariable($variable)
+    {
+        if (is_scalar($variable) || is_null($variable) ||
+           (is_array($variable) && self::arrayOnlyContainsScalars($variable))) {
+            return var_export($variable, TRUE);
+        }
+
+        return 'unserialize(\'' .
+                str_replace("'", "\'", serialize($variable)) .
+                '\')';
+    }
+
+    protected static function arrayOnlyContainsScalars(array $array)
+    {
+        $result = TRUE;
+
+        foreach ($array as $element) {
+            if (is_array($element)) {
+                $result = self::arrayOnlyContainsScalars($element);
+            }
+
+            else if (!is_scalar($element) && !is_null($element)) {
+                $result = FALSE;
+            }
+
+            if ($result === FALSE) {
+                break;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * @return array
+     * @since  Method available since Release 3.6.0
+     */
+    public static function phpunitFiles()
+    {
+        if (self::$phpunitFiles === NULL) {
+            self::$phpunitFiles = phpunit_autoload();
+
+            if (function_exists('phpunit_mockobject_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, phpunit_mockobject_autoload()
+                );
+            }
+
+            if (function_exists('file_iterator_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, file_iterator_autoload()
+                );
+            }
+
+            if (function_exists('php_codecoverage_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, php_codecoverage_autoload()
+                );
+            }
+
+            if (function_exists('php_timer_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, php_timer_autoload()
+                );
+            }
+
+            if (function_exists('php_tokenstream_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, php_tokenstream_autoload()
+                );
+            }
+
+            if (function_exists('text_template_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, text_template_autoload()
+                );
+            }
+
+            if (function_exists('phpunit_dbunit_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, phpunit_dbunit_autoload()
+                );
+            }
+
+            if (function_exists('phpunit_selenium_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, phpunit_selenium_autoload()
+                );
+            }
+
+            if (function_exists('phpunit_story_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, phpunit_story_autoload()
+                );
+            }
+
+            if (function_exists('php_invoker_autoload')) {
+                self::$phpunitFiles = array_merge(
+                  self::$phpunitFiles, php_invoker_autoload()
+                );
+            }
+
+            foreach (self::$phpunitFiles as $key => $value) {
+                self::$phpunitFiles[$key] = str_replace(
+                  '/', DIRECTORY_SEPARATOR, $value
+                );
+            }
+
+            self::$phpunitFiles = array_flip(self::$phpunitFiles);
+        }
+
+        return self::$phpunitFiles;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/InvalidArgumentHelper.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/InvalidArgumentHelper.php
new file mode 100644
index 0000000..d6899b0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/InvalidArgumentHelper.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Factory for PHPUnit_Framework_Exception objects that are used to describe
+ * invalid arguments passed to a function or method.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+class PHPUnit_Util_InvalidArgumentHelper
+{
+    /**
+     * @param integer $argument
+     * @param string  $type
+     * @param mixed   $value
+     */
+    public static function factory($argument, $type, $value = NULL)
+    {
+        $stack = debug_backtrace(FALSE);
+
+        return new PHPUnit_Framework_Exception(
+          sprintf(
+            'Argument #%d%sof %s::%s() must be a %s',
+            $argument,
+            $value !== NULL ? ' (' . $value . ')' : ' ',
+            $stack[1]['class'],
+            $stack[1]['function'],
+            $type
+          )
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/JSON.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/JSON.php
new file mode 100644
index 0000000..6cdfcd7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/JSON.php
@@ -0,0 +1,255 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_Log
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * A TestListener that generates JSON messages.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_Log
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Util_Log_JSON extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
+{
+    /**
+     * @var    string
+     */
+    protected $currentTestSuiteName = '';
+
+    /**
+     * @var    string
+     */
+    protected $currentTestName = '';
+
+    /**
+     * @var     boolean
+     * @access  private
+     */
+    protected $currentTestPass = TRUE;
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->writeCase(
+          'error',
+          $time,
+          PHPUnit_Util_Filter::getFilteredStacktrace($e, FALSE),
+          $e->getMessage(),
+          $test
+        );
+
+        $this->currentTestPass = FALSE;
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        $this->writeCase(
+          'fail',
+          $time,
+          PHPUnit_Util_Filter::getFilteredStacktrace($e, FALSE),
+          $e->getMessage(),
+          $test
+        );
+
+        $this->currentTestPass = FALSE;
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->writeCase(
+          'error',
+          $time,
+          PHPUnit_Util_Filter::getFilteredStacktrace($e, FALSE),
+          'Incomplete Test: ' . $e->getMessage(),
+          $test
+        );
+
+        $this->currentTestPass = FALSE;
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->writeCase(
+          'error',
+          $time,
+          PHPUnit_Util_Filter::getFilteredStacktrace($e, FALSE),
+          'Skipped Test: ' . $e->getMessage(),
+          $test
+        );
+
+        $this->currentTestPass = FALSE;
+    }
+
+    /**
+     * A testsuite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->currentTestSuiteName = $suite->getName();
+        $this->currentTestName      = '';
+
+        $this->write(
+          array(
+            'event' => 'suiteStart',
+            'suite' => $this->currentTestSuiteName,
+            'tests' => count($suite)
+          )
+        );
+    }
+
+    /**
+     * A testsuite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->currentTestSuiteName = '';
+        $this->currentTestName      = '';
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        $this->currentTestName = PHPUnit_Util_Test::describe($test);
+        $this->currentTestPass = TRUE;
+
+        $this->write(
+          array(
+            'event' => 'testStart',
+            'suite' => $this->currentTestSuiteName,
+            'test'  => $this->currentTestName
+          )
+        );
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if ($this->currentTestPass) {
+            $this->writeCase('pass', $time, array(), '', $test);
+        }
+    }
+
+    /**
+     * @param string $status
+     * @param float  $time
+     * @param array  $trace
+     * @param string $message
+     */
+    protected function writeCase($status, $time, array $trace = array(), $message = '', $test = NULL)
+    {
+        $output = '';
+        if ($test !== NULL && $test->hasOutput()) {
+            $output = $test->getActualOutput();
+        }
+        $this->write(
+          array(
+            'event'   => 'test',
+            'suite'   => $this->currentTestSuiteName,
+            'test'    => $this->currentTestName,
+            'status'  => $status,
+            'time'    => $time,
+            'trace'   => $trace,
+            'message' => PHPUnit_Util_String::convertToUtf8($message),
+            'output'  => $output,
+          )
+        );
+    }
+
+    /**
+     * @param string $buffer
+     */
+    public function write($buffer)
+    {
+        if (defined('JSON_PRETTY_PRINT')) {
+            parent::write(json_encode($buffer, JSON_PRETTY_PRINT));
+        } else {
+            parent::write(json_encode($buffer));
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/JUnit.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/JUnit.php
new file mode 100644
index 0000000..0de572e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/JUnit.php
@@ -0,0 +1,483 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_Log
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ * A TestListener that generates a logfile of the test execution in XML markup.
+ *
+ * The XML markup used is the same as the one that is used by the JUnit Ant task.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_Log
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.1.0
+ */
+class PHPUnit_Util_Log_JUnit extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
+{
+    /**
+     * @var    DOMDocument
+     */
+    protected $document;
+
+    /**
+     * @var    DOMElement
+     */
+    protected $root;
+
+    /**
+     * @var    boolean
+     */
+    protected $logIncompleteSkipped = FALSE;
+
+    /**
+     * @var    boolean
+     */
+    protected $writeDocument = TRUE;
+
+    /**
+     * @var    DOMElement[]
+     */
+    protected $testSuites = array();
+
+    /**
+     * @var    integer[]
+     */
+    protected $testSuiteTests = array(0);
+
+    /**
+     * @var    integer[]
+     */
+    protected $testSuiteAssertions = array(0);
+
+    /**
+     * @var    integer[]
+     */
+    protected $testSuiteErrors = array(0);
+
+    /**
+     * @var    integer[]
+     */
+    protected $testSuiteFailures = array(0);
+
+    /**
+     * @var    integer[]
+     */
+    protected $testSuiteTimes = array(0);
+
+    /**
+     * @var    integer
+     */
+    protected $testSuiteLevel = 0;
+
+    /**
+     * @var    DOMElement
+     */
+    protected $currentTestCase = NULL;
+
+    /**
+     * @var    boolean
+     */
+    protected $attachCurrentTestCase = TRUE;
+
+    /**
+     * Constructor.
+     *
+     * @param  mixed   $out
+     * @param  boolean $logIncompleteSkipped
+     */
+    public function __construct($out = NULL, $logIncompleteSkipped = FALSE)
+    {
+        $this->document = new DOMDocument('1.0', 'UTF-8');
+        $this->document->formatOutput = TRUE;
+
+        $this->root = $this->document->createElement('testsuites');
+        $this->document->appendChild($this->root);
+
+        parent::__construct($out);
+
+        $this->logIncompleteSkipped = $logIncompleteSkipped;
+    }
+
+    /**
+     * Flush buffer and close output.
+     *
+     */
+    public function flush()
+    {
+        if ($this->writeDocument === TRUE) {
+            $this->write($this->getXML());
+        }
+
+        parent::flush();
+    }
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($this->currentTestCase !== NULL) {
+            if ($test instanceof PHPUnit_Framework_SelfDescribing) {
+                $buffer = $test->toString() . "\n";
+            } else {
+                $buffer = '';
+            }
+
+            $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) .
+                       "\n" .
+                       PHPUnit_Util_Filter::getFilteredStacktrace($e);
+
+            $error = $this->document->createElement(
+              'error', PHPUnit_Util_XML::prepareString($buffer)
+            );
+
+            $error->setAttribute('type', get_class($e));
+
+            $this->currentTestCase->appendChild($error);
+
+            $this->testSuiteErrors[$this->testSuiteLevel]++;
+        }
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        if ($this->currentTestCase !== NULL) {
+            if (!$test instanceof PHPUnit_Framework_Warning) {
+                if ($test instanceof PHPUnit_Framework_SelfDescribing) {
+                    $buffer = $test->toString() . "\n";
+                } else {
+                    $buffer = '';
+                }
+
+                $buffer .= PHPUnit_Framework_TestFailure::exceptionToString($e) .
+                           "\n" .
+                           PHPUnit_Util_Filter::getFilteredStacktrace($e);
+
+                $failure = $this->document->createElement(
+                  'failure', PHPUnit_Util_XML::prepareString($buffer)
+                );
+
+                $failure->setAttribute('type', get_class($e));
+
+                $this->currentTestCase->appendChild($failure);
+
+                $this->testSuiteFailures[$this->testSuiteLevel]++;
+            }
+        }
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($this->logIncompleteSkipped && $this->currentTestCase !== NULL) {
+            $error = $this->document->createElement(
+              'error',
+              PHPUnit_Util_XML::prepareString(
+                "Incomplete Test\n" .
+                PHPUnit_Util_Filter::getFilteredStacktrace($e)
+              )
+            );
+
+            $error->setAttribute('type', get_class($e));
+
+            $this->currentTestCase->appendChild($error);
+
+            $this->testSuiteErrors[$this->testSuiteLevel]++;
+        } else {
+            $this->attachCurrentTestCase = FALSE;
+        }
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($this->logIncompleteSkipped && $this->currentTestCase !== NULL) {
+            $error = $this->document->createElement(
+              'error',
+              PHPUnit_Util_XML::prepareString(
+                "Skipped Test\n" .
+                PHPUnit_Util_Filter::getFilteredStacktrace($e)
+              )
+            );
+
+            $error->setAttribute('type', get_class($e));
+
+            $this->currentTestCase->appendChild($error);
+
+            $this->testSuiteErrors[$this->testSuiteLevel]++;
+        } else {
+            $this->attachCurrentTestCase = FALSE;
+        }
+    }
+
+    /**
+     * A testsuite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $testSuite = $this->document->createElement('testsuite');
+        $testSuite->setAttribute('name', $suite->getName());
+
+        if (class_exists($suite->getName(), FALSE)) {
+            try {
+                $class = new ReflectionClass($suite->getName());
+
+                $testSuite->setAttribute('file', $class->getFileName());
+
+                $packageInformation = PHPUnit_Util_Class::getPackageInformation(
+                  $suite->getName(), $class->getDocComment()
+                );
+
+                if (!empty($packageInformation['namespace'])) {
+                    $testSuite->setAttribute(
+                      'namespace', $packageInformation['namespace']
+                    );
+                }
+
+                if (!empty($packageInformation['fullPackage'])) {
+                    $testSuite->setAttribute(
+                      'fullPackage', $packageInformation['fullPackage']
+                    );
+                }
+
+                if (!empty($packageInformation['category'])) {
+                    $testSuite->setAttribute(
+                      'category', $packageInformation['category']
+                    );
+                }
+
+                if (!empty($packageInformation['package'])) {
+                    $testSuite->setAttribute(
+                      'package', $packageInformation['package']
+                    );
+                }
+
+                if (!empty($packageInformation['subpackage'])) {
+                    $testSuite->setAttribute(
+                      'subpackage', $packageInformation['subpackage']
+                    );
+                }
+            }
+
+            catch (ReflectionException $e) {
+            }
+        }
+
+        if ($this->testSuiteLevel > 0) {
+            $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite);
+        } else {
+            $this->root->appendChild($testSuite);
+        }
+
+        $this->testSuiteLevel++;
+        $this->testSuites[$this->testSuiteLevel]          = $testSuite;
+        $this->testSuiteTests[$this->testSuiteLevel]      = 0;
+        $this->testSuiteAssertions[$this->testSuiteLevel] = 0;
+        $this->testSuiteErrors[$this->testSuiteLevel]     = 0;
+        $this->testSuiteFailures[$this->testSuiteLevel]   = 0;
+        $this->testSuiteTimes[$this->testSuiteLevel]      = 0;
+    }
+
+    /**
+     * A testsuite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->testSuites[$this->testSuiteLevel]->setAttribute(
+          'tests', $this->testSuiteTests[$this->testSuiteLevel]
+        );
+
+        $this->testSuites[$this->testSuiteLevel]->setAttribute(
+          'assertions', $this->testSuiteAssertions[$this->testSuiteLevel]
+        );
+
+        $this->testSuites[$this->testSuiteLevel]->setAttribute(
+          'failures', $this->testSuiteFailures[$this->testSuiteLevel]
+        );
+
+        $this->testSuites[$this->testSuiteLevel]->setAttribute(
+          'errors', $this->testSuiteErrors[$this->testSuiteLevel]
+        );
+
+        $this->testSuites[$this->testSuiteLevel]->setAttribute(
+          'time', sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel])
+        );
+
+        if ($this->testSuiteLevel > 1) {
+            $this->testSuiteTests[$this->testSuiteLevel - 1]      += $this->testSuiteTests[$this->testSuiteLevel];
+            $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel];
+            $this->testSuiteErrors[$this->testSuiteLevel - 1]     += $this->testSuiteErrors[$this->testSuiteLevel];
+            $this->testSuiteFailures[$this->testSuiteLevel - 1]   += $this->testSuiteFailures[$this->testSuiteLevel];
+            $this->testSuiteTimes[$this->testSuiteLevel - 1]      += $this->testSuiteTimes[$this->testSuiteLevel];
+        }
+
+        $this->testSuiteLevel--;
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        if (!$test instanceof PHPUnit_Framework_Warning) {
+            $testCase = $this->document->createElement('testcase');
+            $testCase->setAttribute('name', $test->getName());
+
+            if ($test instanceof PHPUnit_Framework_TestCase) {
+                $class      = new ReflectionClass($test);
+                $methodName = $test->getName();
+
+                if ($class->hasMethod($methodName)) {
+                    $method = $class->getMethod($test->getName());
+
+                    $testCase->setAttribute('class', $class->getName());
+                    $testCase->setAttribute('file', $class->getFileName());
+                    $testCase->setAttribute('line', $method->getStartLine());
+                }
+            }
+
+            $this->currentTestCase = $testCase;
+        }
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if (!$test instanceof PHPUnit_Framework_Warning) {
+            if ($this->attachCurrentTestCase) {
+                if ($test instanceof PHPUnit_Framework_TestCase) {
+                    $numAssertions = $test->getNumAssertions();
+                    $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions;
+
+                    $this->currentTestCase->setAttribute(
+                      'assertions', $numAssertions
+                    );
+                }
+
+                $this->currentTestCase->setAttribute(
+                  'time', sprintf('%F', $time)
+                );
+
+                $this->testSuites[$this->testSuiteLevel]->appendChild(
+                  $this->currentTestCase
+                );
+
+                $this->testSuiteTests[$this->testSuiteLevel]++;
+                $this->testSuiteTimes[$this->testSuiteLevel] += $time;
+            }
+        }
+
+        $this->attachCurrentTestCase = TRUE;
+        $this->currentTestCase       = NULL;
+    }
+
+    /**
+     * Returns the XML as a string.
+     *
+     * @return string
+     * @since  Method available since Release 2.2.0
+     */
+    public function getXML()
+    {
+        return $this->document->saveXML();
+    }
+
+    /**
+     * Enables or disables the writing of the document
+     * in flush().
+     *
+     * This is a "hack" needed for the integration of
+     * PHPUnit with Phing.
+     *
+     * @return string
+     * @since  Method available since Release 2.2.0
+     */
+    public function setWriteDocument($flag)
+    {
+        if (is_bool($flag)) {
+            $this->writeDocument = $flag;
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/TAP.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/TAP.php
new file mode 100644
index 0000000..1767b46
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Log/TAP.php
@@ -0,0 +1,255 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_Log
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+if (!class_exists('Symfony\\Component\\Yaml\\Dumper', FALSE)) {
+    require_once 'Symfony/Component/Yaml/Dumper.php';
+}
+
+/**
+ * A TestListener that generates a logfile of the
+ * test execution using the Test Anything Protocol (TAP).
+ *
+ * @package    PHPUnit
+ * @subpackage Util_Log
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Util_Log_TAP extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
+{
+    /**
+     * @var    integer
+     */
+    protected $testNumber = 0;
+
+    /**
+     * @var    integer
+     */
+    protected $testSuiteLevel = 0;
+
+    /**
+     * @var    boolean
+     */
+    protected $testSuccessful = TRUE;
+
+    /**
+     * Constructor.
+     *
+     * @param  mixed $out
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.3.4
+     */
+    public function __construct($out = NULL)
+    {
+        parent::__construct($out);
+        $this->write("TAP version 13\n");
+    }
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->writeNotOk($test, 'Error');
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        $this->writeNotOk($test, 'Failure');
+
+        $message = explode(
+          "\n", PHPUnit_Framework_TestFailure::exceptionToString($e)
+        );
+
+        $diagnostic = array(
+          'message'  => $message[0],
+          'severity' => 'fail'
+        );
+
+        if ($e instanceof PHPUnit_Framework_ExpectationFailedException) {
+            $cf = $e->getComparisonFailure();
+
+            if ($cf !== NULL) {
+                $diagnostic['data'] = array(
+                  'got'      => $cf->getActual(),
+                  'expected' => $cf->getExpected()
+                );
+            }
+        }
+
+        $yaml = new Symfony\Component\Yaml\Dumper;
+
+        $this->write(
+          sprintf(
+            "  ---\n%s  ...\n",
+            $yaml->dump($diagnostic, 2, 2)
+          )
+        );
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->writeNotOk($test, '', 'TODO Incomplete Test');
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->write(
+          sprintf(
+            "ok %d - # SKIP%s\n",
+
+            $this->testNumber,
+            $e->getMessage() != '' ? ' ' . $e->getMessage() : ''
+          )
+        );
+
+        $this->testSuccessful = FALSE;
+    }
+
+    /**
+     * A testsuite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->testSuiteLevel++;
+    }
+
+    /**
+     * A testsuite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+        $this->testSuiteLevel--;
+
+        if ($this->testSuiteLevel == 0) {
+            $this->write(sprintf("1..%d\n", $this->testNumber));
+        }
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        $this->testNumber++;
+        $this->testSuccessful = TRUE;
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if ($this->testSuccessful === TRUE) {
+            $this->write(
+              sprintf(
+                "ok %d - %s\n",
+
+                $this->testNumber,
+                PHPUnit_Util_Test::describe($test)
+              )
+            );
+        }
+    }
+
+    /**
+     * @param  PHPUnit_Framework_Test $test
+     * @param  string                 $prefix
+     * @param  string                 $directive
+     */
+    protected function writeNotOk(PHPUnit_Framework_Test $test, $prefix = '', $directive = '')
+    {
+        $this->write(
+          sprintf(
+            "not ok %d - %s%s%s\n",
+
+            $this->testNumber,
+            $prefix != '' ? $prefix . ': ' : '',
+            PHPUnit_Util_Test::describe($test),
+            $directive != '' ? ' # ' . $directive : ''
+          )
+        );
+
+        $this->testSuccessful = FALSE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP.php
new file mode 100644
index 0000000..07fc618
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP.php
@@ -0,0 +1,333 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.4.0
+ */
+
+/**
+ * Utility methods for PHP sub-processes.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.4.0
+ */
+abstract class PHPUnit_Util_PHP
+{
+    /**
+     * @var string $phpBinary
+     */
+    protected $phpBinary;
+
+    /**
+     * Returns the path to a PHP interpreter.
+     *
+     * PHPUnit_Util_PHP::$phpBinary contains the path to the PHP
+     * interpreter.
+     *
+     * When not set, the following assumptions will be made:
+     *
+     *   1. When PHPUnit is run using the CLI SAPI and the $_SERVER['_']
+     *      variable does not contain the string "PHPUnit", $_SERVER['_']
+     *      is assumed to contain the path to the current PHP interpreter
+     *      and that will be used.
+     *
+     *   2. When PHPUnit is run using the CLI SAPI and the $_SERVER['_']
+     *      variable contains the string "PHPUnit", the file that $_SERVER['_']
+     *      points to is assumed to be the PHPUnit TextUI CLI wrapper script
+     *      "phpunit" and the binary set up using #! on that file's first
+     *      line of code is assumed to contain the path to the current PHP
+     *      interpreter and that will be used.
+     *
+     *   3. When the PHP CLI/CGI binary configured with the PEAR Installer
+     *      (php_bin configuration value) is readable, it will be used.
+     *
+     *   4. The current PHP interpreter is assumed to be in the $PATH and
+     *      to be invokable through "php".
+     *
+     * @return string
+     */
+    protected function getPhpBinary()
+    {
+        if ($this->phpBinary === NULL) {
+            if (defined("PHP_BINARY")) {
+                $this->phpBinary = PHP_BINARY;
+            } else if (PHP_SAPI == 'cli' && isset($_SERVER['_'])) {
+                if (strpos($_SERVER['_'], 'phpunit') !== FALSE) {
+                    $file = file($_SERVER['_']);
+
+                    if (strpos($file[0], ' ') !== FALSE) {
+                        $tmp = explode(' ', $file[0]);
+                        $this->phpBinary = trim($tmp[1]);
+                    } else {
+                        $this->phpBinary = ltrim(trim($file[0]), '#!');
+                    }
+                } else if (strpos(basename($_SERVER['_']), 'php') !== FALSE) {
+                    $this->phpBinary = $_SERVER['_'];
+                }
+            }
+
+            if ($this->phpBinary === NULL) {
+                $possibleBinaryLocations = array(
+                    PHP_BINDIR . '/php',
+                    PHP_BINDIR . '/php-cli.exe',
+                    PHP_BINDIR . '/php.exe',
+                    '@php_bin@',
+                );
+                foreach ($possibleBinaryLocations as $binary) {
+                    if (is_readable($binary)) {
+                        $this->phpBinary = $binary;
+                        break;
+                    }
+                }
+            }
+
+            if (!is_readable($this->phpBinary)) {
+                $this->phpBinary = 'php';
+            } else {
+                $this->phpBinary = escapeshellcmd($this->phpBinary);
+            }
+        }
+
+        return $this->phpBinary;
+    }
+
+    /**
+     * @return PHPUnit_Util_PHP
+     * @since  Method available since Release 3.5.12
+     */
+    public static function factory()
+    {
+        if (DIRECTORY_SEPARATOR == '\\') {
+            return new PHPUnit_Util_PHP_Windows;
+        }
+
+        return new PHPUnit_Util_PHP_Default;
+    }
+
+    /**
+     * Runs a single job (PHP code) using a separate PHP process.
+     *
+     * @param  string                       $job
+     * @param  PHPUnit_Framework_TestCase   $test
+     * @param  PHPUnit_Framework_TestResult $result
+     * @return array|null
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function runJob($job, PHPUnit_Framework_Test $test = NULL, PHPUnit_Framework_TestResult $result = NULL)
+    {
+        $process = proc_open(
+          $this->getPhpBinary(),
+          array(
+            0 => array('pipe', 'r'),
+            1 => array('pipe', 'w'),
+            2 => array('pipe', 'w')
+          ),
+          $pipes
+        );
+
+        if (!is_resource($process)) {
+            throw new PHPUnit_Framework_Exception(
+              'Unable to create process for process isolation.'
+            );
+        }
+
+        if ($result !== NULL) {
+            $result->startTest($test);
+        }
+
+        $this->process($pipes[0], $job);
+        fclose($pipes[0]);
+
+        $stdout = stream_get_contents($pipes[1]);
+        fclose($pipes[1]);
+
+        $stderr = stream_get_contents($pipes[2]);
+        fclose($pipes[2]);
+
+        proc_close($process);
+        $this->cleanup();
+
+        if ($result !== NULL) {
+            $this->processChildResult($test, $result, $stdout, $stderr);
+        } else {
+            return array('stdout' => $stdout, 'stderr' => $stderr);
+        }
+    }
+
+    /**
+     * @param resource $pipe
+     * @param string   $job
+     * @since Method available since Release 3.5.12
+     */
+    abstract protected function process($pipe, $job);
+
+    /**
+     * @since Method available since Release 3.5.12
+     */
+    protected function cleanup()
+    {
+    }
+
+    /**
+     * Processes the TestResult object from an isolated process.
+     *
+     * @param PHPUnit_Framework_TestCase   $test
+     * @param PHPUnit_Framework_TestResult $result
+     * @param string                       $stdout
+     * @param string                       $stderr
+     * @since Method available since Release 3.5.0
+     */
+    protected function processChildResult(PHPUnit_Framework_Test $test, PHPUnit_Framework_TestResult $result, $stdout, $stderr)
+    {
+        if (!empty($stderr)) {
+            $time = 0;
+            $result->addError(
+              $test,
+              new PHPUnit_Framework_Exception(trim($stderr)), $time
+            );
+        } else {
+            set_error_handler(function($errno, $errstr, $errfile, $errline) {
+                throw new ErrorException($errstr, $errno, $errno, $errfile, $errline);
+            });
+            try {
+                $childResult = unserialize($stdout);
+                restore_error_handler();
+            } catch (ErrorException $e) {
+                restore_error_handler();
+                $childResult = FALSE;
+
+                $time = 0;
+                $result->addError(
+                  $test, new PHPUnit_Framework_Exception(trim($stdout), 0, $e), $time
+                );
+            }
+
+            if ($childResult !== FALSE) {
+                if (!empty($childResult['output'])) {
+                    print $childResult['output'];
+                }
+
+                $test->setResult($childResult['testResult']);
+                $test->addToAssertionCount($childResult['numAssertions']);
+
+                $childResult = $childResult['result'];
+
+                if ($result->getCollectCodeCoverageInformation()) {
+                    $result->getCodeCoverage()->merge(
+                      $childResult->getCodeCoverage()
+                    );
+                }
+
+                $time           = $childResult->time();
+                $notImplemented = $childResult->notImplemented();
+                $skipped        = $childResult->skipped();
+                $errors         = $childResult->errors();
+                $failures       = $childResult->failures();
+
+                if (!empty($notImplemented)) {
+                    $result->addError(
+                      $test, $this->getException($notImplemented[0]), $time
+                    );
+                }
+
+                else if (!empty($skipped)) {
+                    $result->addError(
+                      $test, $this->getException($skipped[0]), $time
+                    );
+                }
+
+                else if (!empty($errors)) {
+                    $result->addError(
+                      $test, $this->getException($errors[0]), $time
+                    );
+                }
+
+                else if (!empty($failures)) {
+                    $result->addFailure(
+                      $test, $this->getException($failures[0]), $time
+                    );
+                }
+            }
+        }
+
+        $result->endTest($test, $time);
+    }
+
+    /**
+     * Gets the thrown exception from a PHPUnit_Framework_TestFailure.
+     *
+     * @param PHPUnit_Framework_TestFailure $error
+     * @since Method available since Release 3.6.0
+     * @see   https://github.com/sebastianbergmann/phpunit/issues/74
+     */
+    protected function getException(PHPUnit_Framework_TestFailure $error)
+    {
+        $exception = $error->thrownException();
+
+        if ($exception instanceof __PHP_Incomplete_Class) {
+            $exceptionArray = array();
+            foreach ((array)$exception as $key => $value) {
+                $key = substr($key, strrpos($key, "\0") + 1);
+                $exceptionArray[$key] = $value;
+            }
+
+            $exception = new PHPUnit_Framework_SyntheticError(
+              sprintf(
+                '%s: %s',
+                $exceptionArray['_PHP_Incomplete_Class_Name'],
+                $exceptionArray['message']
+              ),
+              $exceptionArray['code'],
+              $exceptionArray['file'],
+              $exceptionArray['line'],
+              $exceptionArray['trace']
+            );
+        }
+
+        return $exception;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP/Default.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP/Default.php
new file mode 100644
index 0000000..6c6323f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP/Default.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.12
+ */
+
+/**
+ * Default utility for PHP sub-processes.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.12
+ */
+class PHPUnit_Util_PHP_Default extends PHPUnit_Util_PHP
+{
+    /**
+     * @param resource $pipe
+     * @since Method available since Release 3.5.12
+     */
+    protected function process($pipe, $job)
+    {
+        fwrite($pipe, $job);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP/Windows.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP/Windows.php
new file mode 100644
index 0000000..0d5015f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/PHP/Windows.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.12
+ */
+
+/**
+ * Windows utility for PHP sub-processes.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.12
+ */
+class PHPUnit_Util_PHP_Windows extends PHPUnit_Util_PHP
+{
+    /**
+     * @var string
+     */
+    protected $tempFile;
+
+    /**
+     * @param resource $pipe
+     * @since Method available since Release 3.5.12
+     */
+    protected function process($pipe, $job)
+    {
+        if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) ||
+            file_put_contents($this->tempFile, $job) === FALSE) {
+            throw new PHPUnit_Framework_Exception(
+              'Unable to write temporary files for process isolation.'
+            );
+        }
+
+        fwrite(
+          $pipe,
+          "<?php require_once " . var_export($this->tempFile, TRUE) .  "; ?>"
+        );
+    }
+
+    /**
+     * @since Method available since Release 3.5.12
+     */
+    protected function cleanup()
+    {
+        unlink($this->tempFile);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Printer.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Printer.php
new file mode 100644
index 0000000..e95e437
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Printer.php
@@ -0,0 +1,209 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+/**
+ * Utility class that can print to STDOUT or write to a file.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class PHPUnit_Util_Printer
+{
+    /**
+     * If TRUE, flush output after every write.
+     *
+     * @var boolean
+     */
+    protected $autoFlush = FALSE;
+
+    /**
+     * @var    resource
+     */
+    protected $out;
+
+    /**
+     * @var    string
+     */
+    protected $outTarget;
+
+    /**
+     * @var    boolean
+     */
+    protected $printsHTML = FALSE;
+
+    /**
+     * Constructor.
+     *
+     * @param  mixed $out
+     * @throws PHPUnit_Framework_Exception
+     */
+    public function __construct($out = NULL)
+    {
+        if ($out !== NULL) {
+            if (is_string($out)) {
+                if (strpos($out, 'socket://') === 0) {
+                    $out = explode(':', str_replace('socket://', '', $out));
+
+                    if (sizeof($out) != 2) {
+                        throw new PHPUnit_Framework_Exception;
+                    }
+
+                    $this->out = fsockopen($out[0], $out[1]);
+                } else {
+                    if (strpos($out, 'php://') === FALSE &&
+                        !is_dir(dirname($out))) {
+                        mkdir(dirname($out), 0777, TRUE);
+                    }
+
+                    $this->out = fopen($out, 'wt');
+                }
+
+                $this->outTarget = $out;
+            } else {
+                $this->out = $out;
+            }
+        }
+    }
+
+    /**
+     * Flush buffer, optionally tidy up HTML, and close output if it's not to a php stream
+     */
+    public function flush()
+    {
+        if ($this->out && strncmp($this->outTarget, 'php://', 6) !== 0) {
+            fclose($this->out);
+        }
+
+        if ($this->printsHTML === TRUE &&
+            $this->outTarget !== NULL &&
+            strpos($this->outTarget, 'php://') !== 0 &&
+            strpos($this->outTarget, 'socket://') !== 0 &&
+            extension_loaded('tidy')) {
+            file_put_contents(
+              $this->outTarget,
+              tidy_repair_file(
+                $this->outTarget, array('indent' => TRUE, 'wrap' => 0), 'utf8'
+              )
+            );
+        }
+    }
+
+    /**
+     * Performs a safe, incremental flush.
+     *
+     * Do not confuse this function with the flush() function of this class,
+     * since the flush() function may close the file being written to, rendering
+     * the current object no longer usable.
+     *
+     * @since  Method available since Release 3.3.0
+     */
+    public function incrementalFlush()
+    {
+        if ($this->out) {
+            fflush($this->out);
+        } else {
+            flush();
+        }
+    }
+
+    /**
+     * @param  string $buffer
+     */
+    public function write($buffer)
+    {
+        if ($this->out) {
+            fwrite($this->out, $buffer);
+
+            if ($this->autoFlush) {
+                $this->incrementalFlush();
+            }
+        } else {
+            if (PHP_SAPI != 'cli') {
+                $buffer = htmlspecialchars($buffer);
+            }
+
+            print $buffer;
+
+            if ($this->autoFlush) {
+                $this->incrementalFlush();
+            }
+        }
+    }
+
+    /**
+     * Check auto-flush mode.
+     *
+     * @return boolean
+     * @since  Method available since Release 3.3.0
+     */
+    public function getAutoFlush()
+    {
+        return $this->autoFlush;
+    }
+
+    /**
+     * Set auto-flushing mode.
+     *
+     * If set, *incremental* flushes will be done after each write. This should
+     * not be confused with the different effects of this class' flush() method.
+     *
+     * @param boolean $autoFlush
+     * @since  Method available since Release 3.3.0
+     */
+    public function setAutoFlush($autoFlush)
+    {
+        if (is_bool($autoFlush)) {
+            $this->autoFlush = $autoFlush;
+        } else {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/String.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/String.php
new file mode 100644
index 0000000..71bc039
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/String.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * String helpers.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class PHPUnit_Util_String
+{
+    /**
+     * Converts a string to UTF-8 encoding.
+     *
+     * @param  string $string
+     * @return string
+     */
+    public static function convertToUtf8($string)
+    {
+        if (!self::isUtf8($string)) {
+            if (function_exists('mb_convert_encoding')) {
+                $string = mb_convert_encoding($string, 'UTF-8');
+            } else {
+                $string = utf8_encode($string);
+            }
+        }
+
+        return $string;
+    }
+
+    /**
+     * Checks a string for UTF-8 encoding.
+     *
+     * @param  string $string
+     * @return boolean
+     */
+    protected static function isUtf8($string)
+    {
+        $length = strlen($string);
+
+        for ($i = 0; $i < $length; $i++) {
+            if (ord($string[$i]) < 0x80) {
+                $n = 0;
+            }
+
+            else if ((ord($string[$i]) & 0xE0) == 0xC0) {
+                $n = 1;
+            }
+
+            else if ((ord($string[$i]) & 0xF0) == 0xE0) {
+                $n = 2;
+            }
+
+            else if ((ord($string[$i]) & 0xF0) == 0xF0) {
+                $n = 3;
+            }
+
+            else {
+                return FALSE;
+            }
+
+            for ($j = 0; $j < $n; $j++) {
+                if ((++$i == $length) || ((ord($string[$i]) & 0xC0) != 0x80)) {
+                    return FALSE;
+                }
+            }
+        }
+
+        return TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Test.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Test.php
new file mode 100644
index 0000000..209f806
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Test.php
@@ -0,0 +1,602 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Test helpers.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Util_Test
+{
+    const REGEX_DATA_PROVIDER      = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/';
+    const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m';
+    const REGEX_REQUIRES_VERSION   = '/@requires\s+(?P<name>PHP(?:Unit)?)\s+(?P<value>[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m';
+    const REGEX_REQUIRES           = '/@requires\s+(?P<name>function|extension)\s(?P<value>([^ ]+))\r?$/m';
+
+    const SMALL  = 0;
+    const MEDIUM = 1;
+    const LARGE  = 2;
+
+    private static $annotationCache = array();
+
+    protected static $templateMethods = array(
+      'setUp', 'assertPreConditions', 'assertPostConditions', 'tearDown'
+    );
+
+    /**
+     * @param  PHPUnit_Framework_Test $test
+     * @param  boolean                $asString
+     * @return mixed
+     */
+    public static function describe(PHPUnit_Framework_Test $test, $asString = TRUE)
+    {
+        if ($asString) {
+            if ($test instanceof PHPUnit_Framework_SelfDescribing) {
+                return $test->toString();
+            } else {
+                return get_class($test);
+            }
+        } else {
+            if ($test instanceof PHPUnit_Framework_TestCase) {
+                return array(
+                  get_class($test), $test->getName()
+                );
+            }
+
+            else if ($test instanceof PHPUnit_Framework_SelfDescribing) {
+                return array('', $test->toString());
+            }
+
+            else {
+                return array('', get_class($test));
+            }
+        }
+    }
+
+    /**
+     * Returns the requirements for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 3.6.0
+     */
+    public static function getRequirements($className, $methodName)
+    {
+        $reflector  = new ReflectionClass($className);
+        $docComment = $reflector->getDocComment();
+        $reflector  = new ReflectionMethod($className, $methodName);
+        $docComment .= "\n" . $reflector->getDocComment();
+        $requires   = array();
+
+        if ($count = preg_match_all(self::REGEX_REQUIRES_VERSION, $docComment, $matches)) {
+            for ($i = 0; $i < $count; $i++) {
+                $requires[$matches['name'][$i]] = $matches['value'][$i];
+            }
+        }
+        if ($count = preg_match_all(self::REGEX_REQUIRES, $docComment, $matches)) {
+            for ($i = 0; $i < $count; $i++) {
+                $name = $matches['name'][$i] . 's';
+                if (!isset($requires[$name])) {
+                    $requires[$name] = array();
+                }
+                $requires[$name][] = $matches['value'][$i];
+            }
+        }
+
+        return $requires;
+    }
+
+    /**
+     * Returns the expected exception for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 3.3.6
+     */
+    public static function getExpectedException($className, $methodName)
+    {
+        $reflector  = new ReflectionMethod($className, $methodName);
+        $docComment = $reflector->getDocComment();
+
+        if (preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) {
+            $annotations = self::parseTestMethodAnnotations(
+              $className, $methodName
+            );
+
+            $class   = $matches[1];
+            $code    = NULL;
+            $message = '';
+
+            if (isset($matches[2])) {
+                $message = trim($matches[2]);
+            }
+
+            else if (isset($annotations['method']['expectedExceptionMessage'])) {
+                $message = self::_parseAnnotationContent(
+                    $annotations['method']['expectedExceptionMessage'][0]
+                );
+            }
+
+            if (isset($matches[3])) {
+                $code = $matches[3];
+            }
+
+            else if (isset($annotations['method']['expectedExceptionCode'])) {
+                $code = self::_parseAnnotationContent(
+                    $annotations['method']['expectedExceptionCode'][0]
+                );
+            }
+
+            if (is_numeric($code)) {
+                $code = (int)$code;
+            }
+
+            else if (is_string($code) && defined($code)) {
+                $code = (int)constant($code);
+            }
+
+            return array(
+              'class' => $class, 'code' => $code, 'message' => $message
+            );
+        }
+
+        return FALSE;
+    }
+
+    /**
+     * Parse annotation content to use constant/class constant values
+     *
+     * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME
+     *
+     * If the constant is not found the string is used as is to ensure maximum BC.
+     *
+     * @param  string $message
+     * @return string
+     */
+    protected static function _parseAnnotationContent($message)
+    {
+        if (strpos($message, '::') !== FALSE && count(explode('::', $message) == 2)) {
+            if (defined($message)) {
+                $message = constant($message);
+            }
+        }
+        return $message;
+    }
+
+    /**
+     * Returns the provided data for a method.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @param  string $docComment
+     * @return mixed  array|Iterator when a data provider is specified and exists
+     *                false          when a data provider is specified and does not exist
+     *                null           when no data provider is specified
+     * @since  Method available since Release 3.2.0
+     */
+    public static function getProvidedData($className, $methodName)
+    {
+        $reflector  = new ReflectionMethod($className, $methodName);
+        $docComment = $reflector->getDocComment();
+        $data       = NULL;
+
+        if (preg_match(self::REGEX_DATA_PROVIDER, $docComment, $matches)) {
+            $dataProviderMethodNameNamespace = explode('\\', $matches[1]);
+            $leaf                            = explode('::', array_pop($dataProviderMethodNameNamespace));
+            $dataProviderMethodName          = array_pop($leaf);
+
+            if (!empty($dataProviderMethodNameNamespace)) {
+                $dataProviderMethodNameNamespace = join('\\', $dataProviderMethodNameNamespace) . '\\';
+            } else {
+                $dataProviderMethodNameNamespace = '';
+            }
+
+            if (!empty($leaf)) {
+                $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf);
+            } else {
+                $dataProviderClassName = $className;
+            }
+
+            $dataProviderClass  = new ReflectionClass($dataProviderClassName);
+            $dataProviderMethod = $dataProviderClass->getMethod(
+              $dataProviderMethodName
+            );
+
+            if ($dataProviderMethod->isStatic()) {
+                $object = NULL;
+            } else {
+                $object = $dataProviderClass->newInstance();
+            }
+
+            if ($dataProviderMethod->getNumberOfParameters() == 0) {
+                $data = $dataProviderMethod->invoke($object);
+            } else {
+                $data = $dataProviderMethod->invoke($object, $methodName);
+            }
+        }
+
+        if ($data !== NULL) {
+            foreach ($data as $key => $value) {
+                if (!is_array($value)) {
+                    throw new PHPUnit_Framework_Exception(
+                      sprintf(
+                        'Data set %s is invalid.',
+                        is_int($key) ? '#' . $key : '"' . $key . '"'
+                      )
+                    );
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    /**
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @throws ReflectionException
+     * @since  Method available since Release 3.4.0
+     */
+    public static function parseTestMethodAnnotations($className, $methodName = '')
+    {
+        if (!isset(self::$annotationCache[$className])) {
+            $class = new ReflectionClass($className);
+            self::$annotationCache[$className] = self::parseAnnotations($class->getDocComment());
+        }
+
+        if (!empty($methodName) && !isset(self::$annotationCache[$className . '::' . $methodName])) {
+            try {
+                $method = new ReflectionMethod($className, $methodName);
+                $annotations = self::parseAnnotations($method->getDocComment());
+            } catch (ReflectionException $e) {
+                $annotations = array();
+            }
+            self::$annotationCache[$className . '::' . $methodName] = $annotations;
+        }
+
+        return array(
+          'class'  => self::$annotationCache[$className],
+          'method' => !empty($methodName) ? self::$annotationCache[$className . '::' . $methodName] : array()
+        );
+    }
+
+    /**
+     * @param  string $docblock
+     * @return array
+     * @since  Method available since Release 3.4.0
+     */
+    private static function parseAnnotations($docblock)
+    {
+        $annotations = array();
+        // Strip away the docblock header and footer to ease parsing of one line annotations
+        $docblock = substr($docblock, 3, -2);
+
+        if (preg_match_all('/@(?P<name>[A-Za-z_-]+)(?:[ \t]+(?P<value>.*?))?[ \t]*\r?$/m', $docblock, $matches)) {
+            $numMatches = count($matches[0]);
+
+            for ($i = 0; $i < $numMatches; ++$i) {
+                $annotations[$matches['name'][$i]][] = $matches['value'][$i];
+            }
+        }
+
+        return $annotations;
+    }
+
+    /**
+     * Returns the backup settings for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getBackupSettings($className, $methodName)
+    {
+        return array(
+          'backupGlobals' => self::getBooleanAnnotationSetting(
+            $className, $methodName, 'backupGlobals'
+          ),
+          'backupStaticAttributes' => self::getBooleanAnnotationSetting(
+            $className, $methodName, 'backupStaticAttributes'
+          )
+        );
+    }
+
+    /**
+     * Returns the dependencies for a test class or method.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getDependencies($className, $methodName)
+    {
+        $annotations = self::parseTestMethodAnnotations(
+          $className, $methodName
+        );
+
+        $dependencies = array();
+
+        if (isset($annotations['class']['depends'])) {
+            $dependencies = $annotations['class']['depends'];
+        }
+
+        if (isset($annotations['method']['depends'])) {
+            $dependencies = array_merge(
+              $dependencies, $annotations['method']['depends']
+            );
+        }
+
+        return array_unique($dependencies);
+    }
+
+    /**
+     * Returns the error handler settings for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return boolean
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getErrorHandlerSettings($className, $methodName)
+    {
+        return self::getBooleanAnnotationSetting(
+          $className, $methodName, 'errorHandler'
+        );
+    }
+
+    /**
+     * Returns the groups for a test class or method.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 3.2.0
+     */
+    public static function getGroups($className, $methodName = '')
+    {
+        $annotations = self::parseTestMethodAnnotations(
+          $className, $methodName
+        );
+
+        $groups = array();
+
+        if (isset($annotations['method']['author'])) {
+            $groups = $annotations['method']['author'];
+        }
+
+        else if (isset($annotations['class']['author'])) {
+            $groups = $annotations['class']['author'];
+        }
+
+        if (isset($annotations['class']['group'])) {
+            $groups = array_merge($groups, $annotations['class']['group']);
+        }
+
+        if (isset($annotations['method']['group'])) {
+            $groups = array_merge($groups, $annotations['method']['group']);
+        }
+
+        if (isset($annotations['class']['ticket'])) {
+            $groups = array_merge($groups, $annotations['class']['ticket']);
+        }
+
+        if (isset($annotations['method']['ticket'])) {
+            $groups = array_merge($groups, $annotations['method']['ticket']);
+        }
+
+        foreach (array('small', 'medium', 'large') as $size) {
+            if (isset($annotations['method'][$size])) {
+                $groups[] = $size;
+            }
+
+            else if (isset($annotations['class'][$size])) {
+                $groups[] = $size;
+            }
+        }
+
+        return array_unique($groups);
+    }
+
+    /**
+     * Returns the size of the test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return integer
+     * @since  Method available since Release 3.6.0
+     */
+    public static function getSize($className, $methodName)
+    {
+        $groups = array_flip(self::getGroups($className, $methodName));
+        $size   = self::SMALL;
+        $class  = new ReflectionClass($className);
+
+        if ((class_exists('PHPUnit_Extensions_Database_TestCase', FALSE) &&
+             $class->isSubclassOf('PHPUnit_Extensions_Database_TestCase')) ||
+            (class_exists('PHPUnit_Extensions_SeleniumTestCase', FALSE) &&
+             $class->isSubclassOf('PHPUnit_Extensions_SeleniumTestCase'))) {
+            $size = self::LARGE;
+        }
+
+        else if (isset($groups['medium'])) {
+            $size = self::MEDIUM;
+        }
+
+        else if (isset($groups['large'])) {
+            $size = self::LARGE;
+        }
+
+        return $size;
+    }
+
+    /**
+     * Returns the tickets for a test class or method.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return array
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getTickets($className, $methodName)
+    {
+        $annotations = self::parseTestMethodAnnotations(
+          $className, $methodName
+        );
+
+        $tickets = array();
+
+        if (isset($annotations['class']['ticket'])) {
+            $tickets = $annotations['class']['ticket'];
+        }
+
+        if (isset($annotations['method']['ticket'])) {
+            $tickets = array_merge($tickets, $annotations['method']['ticket']);
+        }
+
+        return array_unique($tickets);
+    }
+
+    /**
+     * Returns the output buffering settings for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return boolean
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getOutputBufferingSettings($className, $methodName)
+    {
+        return self::getBooleanAnnotationSetting(
+          $className, $methodName, 'outputBuffering'
+        );
+    }
+
+    /**
+     * Returns the process isolation settings for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return boolean
+     * @since  Method available since Release 3.4.1
+     */
+    public static function getProcessIsolationSettings($className, $methodName)
+    {
+        $annotations = self::parseTestMethodAnnotations(
+          $className, $methodName
+        );
+
+        if (isset($annotations['class']['runTestsInSeparateProcesses']) ||
+            isset($annotations['method']['runInSeparateProcess'])) {
+            return TRUE;
+        } else {
+            return FALSE;
+        }
+    }
+
+    /**
+     * Returns the preserve global state settings for a test.
+     *
+     * @param  string $className
+     * @param  string $methodName
+     * @return boolean
+     * @since  Method available since Release 3.4.0
+     */
+    public static function getPreserveGlobalStateSettings($className, $methodName)
+    {
+        return self::getBooleanAnnotationSetting(
+          $className, $methodName, 'preserveGlobalState'
+        );
+    }
+
+    /**
+     * @param  string $className
+     * @param  string $methodName
+     * @param  string $settingName
+     * @return boolean
+     * @since  Method available since Release 3.4.0
+     */
+    private static function getBooleanAnnotationSetting($className, $methodName, $settingName)
+    {
+        $annotations = self::parseTestMethodAnnotations(
+          $className, $methodName
+        );
+
+        $result = NULL;
+
+        if (isset($annotations['class'][$settingName])) {
+            if ($annotations['class'][$settingName][0] == 'enabled') {
+                $result = TRUE;
+            }
+
+            else if ($annotations['class'][$settingName][0] == 'disabled') {
+                $result = FALSE;
+            }
+        }
+
+        if (isset($annotations['method'][$settingName])) {
+            if ($annotations['method'][$settingName][0] == 'enabled') {
+                $result = TRUE;
+            }
+
+            else if ($annotations['method'][$settingName][0] == 'disabled') {
+                $result = FALSE;
+            }
+        }
+
+        return $result;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/NamePrettifier.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/NamePrettifier.php
new file mode 100644
index 0000000..0673cd4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/NamePrettifier.php
@@ -0,0 +1,178 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ * Prettifies class and method names for use in TestDox documentation.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.1.0
+ */
+class PHPUnit_Util_TestDox_NamePrettifier
+{
+    /**
+     * @var    string
+     */
+    protected $prefix = 'Test';
+
+    /**
+     * @var    string
+     */
+    protected $suffix = 'Test';
+
+    /**
+     * @var    array
+     */
+    protected $strings = array();
+
+    /**
+     * Prettifies the name of a test class.
+     *
+     * @param  string  $name
+     * @return string
+     */
+    public function prettifyTestClass($name)
+    {
+        $title = $name;
+
+        if ($this->suffix !== NULL &&
+            $this->suffix == substr($name, -1 * strlen($this->suffix))) {
+            $title = substr($title, 0, strripos($title, $this->suffix));
+        }
+
+        if ($this->prefix !== NULL &&
+            $this->prefix == substr($name, 0, strlen($this->prefix))) {
+            $title = substr($title, strlen($this->prefix));
+        }
+
+        return $title;
+    }
+
+    /**
+     * Prettifies the name of a test method.
+     *
+     * @param  string  $name
+     * @return string
+     */
+    public function prettifyTestMethod($name)
+    {
+        $buffer = '';
+
+        if (!is_string($name) || strlen($name) == 0) {
+            return $buffer;
+        }
+
+        $string = preg_replace('#\d+$#', '', $name, -1, $count);
+
+        if (in_array($string, $this->strings)) {
+            $name = $string;
+        } else if ($count == 0) {
+            $this->strings[] = $string;
+        }
+
+        if (strpos($name, '_') !== FALSE) {
+            return str_replace('_', ' ', $name);
+        }
+
+        $max = strlen($name);
+
+        if (substr($name, 0, 4) == 'test') {
+            $offset = 4;
+        } else {
+            $offset  = 0;
+            $name[0] = strtoupper($name[0]);
+        }
+
+        $wasNumeric = FALSE;
+
+        for ($i = $offset; $i < $max; $i++) {
+            if ($i > $offset &&
+                ord($name[$i]) >= 65 &&
+                ord($name[$i]) <= 90) {
+                $buffer .= ' ' . strtolower($name[$i]);
+            } else {
+                $isNumeric = is_numeric($name[$i]);
+
+                if (!$wasNumeric && $isNumeric) {
+                    $buffer    .= ' ';
+                    $wasNumeric = TRUE;
+                }
+
+                if ($wasNumeric && !$isNumeric) {
+                    $wasNumeric = FALSE;
+                }
+
+                $buffer .= $name[$i];
+            }
+        }
+
+        return $buffer;
+    }
+
+    /**
+     * Sets the prefix of test names.
+     *
+     * @param  string  $prefix
+     */
+    public function setPrefix($prefix)
+    {
+        $this->prefix = $prefix;
+    }
+
+    /**
+     * Sets the suffix of test names.
+     *
+     * @param  string  $prefix
+     */
+    public function setSuffix($suffix)
+    {
+        $this->suffix = $suffix;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter.php
new file mode 100644
index 0000000..81b9dbf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter.php
@@ -0,0 +1,348 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ * Base class for printers of TestDox documentation.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.1.0
+ */
+abstract class PHPUnit_Util_TestDox_ResultPrinter extends PHPUnit_Util_Printer implements PHPUnit_Framework_TestListener
+{
+    /**
+     * @var PHPUnit_Util_TestDox_NamePrettifier
+     */
+    protected $prettifier;
+
+    /**
+     * @var string
+     */
+    protected $testClass = '';
+
+    /**
+     * @var integer
+     */
+    protected $testStatus = FALSE;
+
+    /**
+     * @var array
+     */
+    protected $tests = array();
+
+    /**
+     * @var integer
+     */
+    protected $successful = 0;
+
+    /**
+     * @var integer
+     */
+    protected $failed = 0;
+
+    /**
+     * @var integer
+     */
+    protected $skipped = 0;
+
+    /**
+     * @var integer
+     */
+    protected $incomplete = 0;
+
+    /**
+     * @var string
+     */
+    protected $testTypeOfInterest = 'PHPUnit_Framework_TestCase';
+
+    /**
+     * @var string
+     */
+    protected $currentTestClassPrettified;
+
+    /**
+     * @var string
+     */
+    protected $currentTestMethodPrettified;
+
+    /**
+     * Constructor.
+     *
+     * @param  resource  $out
+     */
+    public function __construct($out = NULL)
+    {
+        parent::__construct($out);
+
+        $this->prettifier = new PHPUnit_Util_TestDox_NamePrettifier;
+        $this->startRun();
+    }
+
+    /**
+     * Flush buffer and close output.
+     *
+     */
+    public function flush()
+    {
+        $this->doEndClass();
+        $this->endRun();
+
+        parent::flush();
+    }
+
+    /**
+     * An error occurred.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($test instanceof $this->testTypeOfInterest) {
+            $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
+            $this->failed++;
+        }
+    }
+
+    /**
+     * A failure occurred.
+     *
+     * @param  PHPUnit_Framework_Test                 $test
+     * @param  PHPUnit_Framework_AssertionFailedError $e
+     * @param  float                                  $time
+     */
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        if ($test instanceof $this->testTypeOfInterest) {
+            $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE;
+            $this->failed++;
+        }
+    }
+
+    /**
+     * Incomplete test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     */
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($test instanceof $this->testTypeOfInterest) {
+            $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE;
+            $this->incomplete++;
+        }
+    }
+
+    /**
+     * Skipped test.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  Exception              $e
+     * @param  float                  $time
+     * @since  Method available since Release 3.0.0
+     */
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        if ($test instanceof $this->testTypeOfInterest) {
+            $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED;
+            $this->skipped++;
+        }
+    }
+
+    /**
+     * A testsuite started.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A testsuite ended.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     * @since  Method available since Release 2.2.0
+     */
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    /**
+     * A test started.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     */
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        if ($test instanceof $this->testTypeOfInterest) {
+            $class = get_class($test);
+
+            if ($this->testClass != $class) {
+                if ($this->testClass != '') {
+                    $this->doEndClass();
+                }
+
+                $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class);
+                $this->startClass($class);
+
+                $this->testClass = $class;
+                $this->tests     = array();
+            }
+
+            $prettified = FALSE;
+
+            if ($test instanceof PHPUnit_Framework_TestCase &&
+               !$test instanceof PHPUnit_Framework_Warning) {
+                $annotations = $test->getAnnotations();
+
+                if (isset($annotations['method']['testdox'][0])) {
+                    $this->currentTestMethodPrettified = $annotations['method']['testdox'][0];
+                    $prettified                        = TRUE;
+                }
+            }
+
+            if (!$prettified) {
+                $this->currentTestMethodPrettified = $this->prettifier->prettifyTestMethod($test->getName(FALSE));
+            }
+
+            $this->testStatus = PHPUnit_Runner_BaseTestRunner::STATUS_PASSED;
+        }
+    }
+
+    /**
+     * A test ended.
+     *
+     * @param  PHPUnit_Framework_Test $test
+     * @param  float                  $time
+     */
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        if ($test instanceof $this->testTypeOfInterest) {
+            if (!isset($this->tests[$this->currentTestMethodPrettified])) {
+                if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
+                    $this->tests[$this->currentTestMethodPrettified]['success'] = 1;
+                    $this->tests[$this->currentTestMethodPrettified]['failure'] = 0;
+                } else {
+                    $this->tests[$this->currentTestMethodPrettified]['success'] = 0;
+                    $this->tests[$this->currentTestMethodPrettified]['failure'] = 1;
+                }
+            } else {
+                if ($this->testStatus == PHPUnit_Runner_BaseTestRunner::STATUS_PASSED) {
+                    $this->tests[$this->currentTestMethodPrettified]['success']++;
+                } else {
+                    $this->tests[$this->currentTestMethodPrettified]['failure']++;
+                }
+            }
+
+            $this->currentTestClassPrettified  = NULL;
+            $this->currentTestMethodPrettified = NULL;
+        }
+    }
+
+    /**
+     * @since  Method available since Release 2.3.0
+     */
+    protected function doEndClass()
+    {
+        foreach ($this->tests as $name => $data) {
+            $this->onTest($name, $data['failure'] == 0);
+        }
+
+        $this->endClass($this->testClass);
+    }
+
+    /**
+     * Handler for 'start run' event.
+     *
+     */
+    protected function startRun()
+    {
+    }
+
+    /**
+     * Handler for 'start class' event.
+     *
+     * @param  string $name
+     */
+    protected function startClass($name)
+    {
+    }
+
+    /**
+     * Handler for 'on test' event.
+     *
+     * @param  string  $name
+     * @param  boolean $success
+     */
+    protected function onTest($name, $success = TRUE)
+    {
+    }
+
+    /**
+     * Handler for 'end class' event.
+     *
+     * @param  string $name
+     */
+    protected function endClass($name)
+    {
+    }
+
+    /**
+     * Handler for 'end run' event.
+     *
+     */
+    protected function endRun()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter/HTML.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter/HTML.php
new file mode 100644
index 0000000..da25f8a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter/HTML.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ * Prints TestDox documentation in HTML format.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.1.0
+ */
+class PHPUnit_Util_TestDox_ResultPrinter_HTML extends PHPUnit_Util_TestDox_ResultPrinter
+{
+    /**
+     * @var    boolean
+     */
+    protected $printsHTML = TRUE;
+
+    /**
+     * Handler for 'start run' event.
+     *
+     */
+    protected function startRun()
+    {
+        $this->write('<html><body>');
+    }
+
+    /**
+     * Handler for 'start class' event.
+     *
+     * @param  string $name
+     */
+    protected function startClass($name)
+    {
+        $this->write(
+          '<h2 id="' . $name . '">' . $this->currentTestClassPrettified .
+          '</h2><ul>'
+        );
+    }
+
+    /**
+     * Handler for 'on test' event.
+     *
+     * @param  string  $name
+     * @param  boolean $success
+     */
+    protected function onTest($name, $success = TRUE)
+    {
+        if (!$success) {
+            $strikeOpen  = '<strike>';
+            $strikeClose = '</strike>';
+        } else {
+            $strikeOpen  = '';
+            $strikeClose = '';
+        }
+
+        $this->write('<li>' . $strikeOpen . $name . $strikeClose . '</li>');
+    }
+
+    /**
+     * Handler for 'end class' event.
+     *
+     * @param  string $name
+     */
+    protected function endClass($name)
+    {
+        $this->write('</ul>');
+    }
+
+    /**
+     * Handler for 'end run' event.
+     *
+     */
+    protected function endRun()
+    {
+        $this->write('</body></html>');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter/Text.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter/Text.php
new file mode 100644
index 0000000..d9bccf1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestDox/ResultPrinter/Text.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ * Prints TestDox documentation in text format.
+ *
+ * @package    PHPUnit
+ * @subpackage Util_TestDox
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.1.0
+ */
+class PHPUnit_Util_TestDox_ResultPrinter_Text extends PHPUnit_Util_TestDox_ResultPrinter
+{
+    /**
+     * Handler for 'start class' event.
+     *
+     * @param  string $name
+     */
+    protected function startClass($name)
+    {
+        $this->write($this->currentTestClassPrettified . "\n");
+    }
+
+    /**
+     * Handler for 'on test' event.
+     *
+     * @param  string  $name
+     * @param  boolean $success
+     */
+    protected function onTest($name, $success = TRUE)
+    {
+        if ($success) {
+            $this->write(' [x] ');
+        } else {
+            $this->write(' [ ] ');
+        }
+
+        $this->write($name . "\n");
+    }
+
+    /**
+     * Handler for 'end class' event.
+     *
+     * @param  string $name
+     */
+    protected function endClass($name)
+    {
+        $this->write("\n");
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/TestSuiteIterator.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestSuiteIterator.php
new file mode 100644
index 0000000..b5f1da6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/TestSuiteIterator.php
@@ -0,0 +1,149 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.1.0
+ */
+
+/**
+ * Iterator for test suites.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.1.0
+ */
+class PHPUnit_Util_TestSuiteIterator implements RecursiveIterator
+{
+    /**
+     * @var    integer
+     */
+    protected $position;
+
+    /**
+     * @var    PHPUnit_Framework_Test[]
+     */
+    protected $tests;
+
+    /**
+     * Constructor.
+     *
+     * @param  PHPUnit_Framework_TestSuite $suite
+     */
+    public function __construct(PHPUnit_Framework_TestSuite $testSuite)
+    {
+        $this->tests = $testSuite->tests();
+    }
+
+    /**
+     * Rewinds the Iterator to the first element.
+     *
+     */
+    public function rewind()
+    {
+        $this->position = 0;
+    }
+
+    /**
+     * Checks if there is a current element after calls to rewind() or next().
+     *
+     * @return boolean
+     */
+    public function valid()
+    {
+        return $this->position < count($this->tests);
+    }
+
+    /**
+     * Returns the key of the current element.
+     *
+     * @return integer
+     */
+    public function key()
+    {
+        return $this->position;
+    }
+
+    /**
+     * Returns the current element.
+     *
+     * @return PHPUnit_Framework_Test
+     */
+    public function current()
+    {
+        return $this->valid() ? $this->tests[$this->position] : NULL;
+    }
+
+    /**
+     * Moves forward to next element.
+     *
+     */
+    public function next()
+    {
+        $this->position++;
+    }
+
+    /**
+     * Returns the sub iterator for the current element.
+     *
+     * @return PHPUnit_Util_TestSuiteIterator
+     */
+    public function getChildren()
+    {
+        return new PHPUnit_Util_TestSuiteIterator(
+          $this->tests[$this->position]
+        );
+    }
+
+    /**
+     * Checks whether the current element has children.
+     *
+     * @return boolean
+     */
+    public function hasChildren()
+    {
+        return $this->tests[$this->position] instanceof PHPUnit_Framework_TestSuite;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/Type.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/Type.php
new file mode 100644
index 0000000..4f08ce2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/Type.php
@@ -0,0 +1,304 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+/**
+ * Utility class for textual type (and value) representation.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class PHPUnit_Util_Type
+{
+    public static function isType($type)
+    {
+        return in_array(
+          $type,
+          array(
+            'numeric',
+            'integer',
+            'int',
+            'float',
+            'string',
+            'boolean',
+            'bool',
+            'null',
+            'array',
+            'object',
+            'resource',
+            'scalar'
+          )
+        );
+    }
+
+    /**
+     * Exports a value into a string
+     *
+     * The output of this method is similar to the output of print_r(), but
+     * improved in various aspects:
+     *
+     *  - NULL is rendered as "null" (instead of "")
+     *  - TRUE is rendered as "true" (instead of "1")
+     *  - FALSE is rendered as "false" (instead of "")
+     *  - Strings are always quoted with single quotes
+     *  - Carriage returns and newlines are normalized to \n
+     *  - Recursion and repeated rendering is treated properly
+     *
+     * @param  mixed $value The value to export
+     * @param  integer $indentation The indentation level of the 2nd+ line
+     * @return string
+     * @since  Method available since Release 3.6.0
+     */
+    public static function export($value, $indentation = 0)
+    {
+        return self::recursiveExport($value, $indentation);
+    }
+
+    /**
+     * Recursive implementation of export
+     *
+     * @param  mixed $value The value to export
+     * @param  integer $indentation The indentation level of the 2nd+ line
+     * @param  array $processedObjects Contains all objects that were already
+     *                                 rendered
+     * @return string
+     * @since  Method available since Release 3.6.0
+     * @see    PHPUnit_Util_Type::export
+     */
+    protected static function recursiveExport($value, $indentation, &$processedObjects = array())
+    {
+        if ($value === NULL) {
+            return 'null';
+        }
+
+        if ($value === TRUE) {
+            return 'true';
+        }
+
+        if ($value === FALSE) {
+            return 'false';
+        }
+
+        if (is_string($value)) {
+            // Match for most non printable chars somewhat taking multibyte chars into account
+            if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) {
+                return 'Binary String: 0x' . bin2hex($value);
+            }
+
+            return "'" .
+                   str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) .
+                   "'";
+        }
+
+        $origValue = $value;
+
+        if (is_object($value)) {
+            if (in_array($value, $processedObjects, TRUE)) {
+                return sprintf(
+                  '%s Object (*RECURSION*)',
+
+                  get_class($value)
+                );
+            }
+
+            $processedObjects[] = $value;
+
+            // Convert object to array
+            $value = self::toArray($value);
+        }
+
+        if (is_array($value)) {
+            $whitespace = str_repeat('    ', $indentation);
+
+            // There seems to be no other way to check arrays for recursion
+            // http://www.php.net/manual/en/language.types.array.php#73936
+            preg_match_all('/\n            \[(\w+)\] => Array\s+\*RECURSION\*/', print_r($value, TRUE), $matches);
+            $recursiveKeys = array_unique($matches[1]);
+
+            // Convert to valid array keys
+            // Numeric integer strings are automatically converted to integers
+            // by PHP
+            foreach ($recursiveKeys as $key => $recursiveKey) {
+                if ((string)(integer)$recursiveKey === $recursiveKey) {
+                    $recursiveKeys[$key] = (integer)$recursiveKey;
+                }
+            }
+
+            $content = '';
+
+            foreach ($value as $key => $val) {
+                if (in_array($key, $recursiveKeys, TRUE)) {
+                    $val = 'Array (*RECURSION*)';
+                }
+
+                else {
+                    $val = self::recursiveExport($val, $indentation+1, $processedObjects);
+                }
+
+                $content .=  $whitespace . '    ' . self::export($key) . ' => ' . $val . "\n";
+            }
+
+            if (strlen($content) > 0) {
+                $content = "\n" . $content . $whitespace;
+            }
+
+            return sprintf(
+              "%s (%s)",
+
+              is_object($origValue) ? get_class($origValue) . ' Object' : 'Array',
+              $content
+            );
+        }
+
+        if (is_double($value) && (double)(integer)$value === $value) {
+            return $value . '.0';
+        }
+
+        return (string)$value;
+    }
+
+    /**
+     * Exports a value into a single-line string
+     *
+     * The output of this method is similar to the output of
+     * PHPUnit_Util_Type::export. This method guarantees thought that the
+     * result contains now newlines.
+     *
+     * Newlines are replaced by the visible string '\n'. Contents of arrays
+     * and objects (if any) are replaced by '...'.
+     *
+     * @param  mixed $value The value to export
+     * @param  integer $indentation The indentation level of the 2nd+ line
+     * @return string
+     * @see    PHPUnit_Util_Type::export
+     */
+    public static function shortenedExport($value)
+    {
+        if (is_string($value)) {
+            return self::shortenedString($value);
+        }
+
+        $origValue = $value;
+
+        if (is_object($value)) {
+            $value = self::toArray($value);
+        }
+
+        if (is_array($value)) {
+            return sprintf(
+              "%s (%s)",
+
+              is_object($origValue) ? get_class($origValue) . ' Object' : 'Array',
+              count($value) > 0 ? '...' : ''
+            );
+        }
+
+        return self::export($value);
+    }
+
+    /**
+     * Shortens a string and converts all new lines to '\n'
+     *
+     * @param  string $string The string to shorten
+     * @param  integer $max The maximum length for the string
+     * @return string
+     */
+    public static function shortenedString($string, $maxLength = 40)
+    {
+        $string = self::export($string);
+
+        if (strlen($string) > $maxLength) {
+            $string = substr($string, 0, $maxLength - 10) . '...' . substr($string, -7);
+        }
+
+        return str_replace("\n", '\n', $string);
+    }
+
+    /**
+     * Converts an object to an array containing all of its private, protected
+     * and public properties.
+     *
+     * @param  object $object
+     * @return array
+     * @since  Method available since Release 3.6.0
+     */
+    public static function toArray($object)
+    {
+        $array = array();
+
+        foreach ((array)$object as $key => $value) {
+            // properties are transformed to keys in the following way:
+
+            // private   $property => "\0Classname\0property"
+            // protected $property => "\0*\0property"
+            // public    $property => "property"
+
+            if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) {
+                $key = $matches[1];
+            }
+
+            $array[$key] = $value;
+        }
+
+        // Some internal classes like SplObjectStorage don't work with the
+        // above (fast) mechanism nor with reflection
+        // Format the output similarly to print_r() in this case
+        if ($object instanceof SplObjectStorage) {
+            foreach ($object as $key => $value) {
+                $array[spl_object_hash($value)] = array(
+                    'obj' => $value,
+                    'inf' => $object->getInfo(),
+                );
+            }
+        }
+
+        return $array;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/PHPUnit/Util/XML.php b/core/vendor/phpunit/phpunit/PHPUnit/Util/XML.php
new file mode 100644
index 0000000..c59a9d9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/PHPUnit/Util/XML.php
@@ -0,0 +1,902 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.2.0
+ */
+
+/**
+ * XML helpers.
+ *
+ * @package    PHPUnit
+ * @subpackage Util
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.2.0
+ */
+class PHPUnit_Util_XML
+{
+    /**
+     * @param  string $string
+     * @return string
+     * @author Kore Nordmann <mail@kore-nordmann.de>
+     * @since  Method available since Release 3.4.6
+     */
+    public static function prepareString($string)
+    {
+        return preg_replace(
+          '([\\x00-\\x04\\x0b\\x0c\\x0e-\\x1f\\x7f])e',
+          'sprintf( "&#x%02x;", ord( "\\1" ) )',
+          htmlspecialchars(
+            PHPUnit_Util_String::convertToUtf8($string), ENT_COMPAT, 'UTF-8'
+          )
+        );
+    }
+
+    /**
+     * Loads an XML (or HTML) file into a DOMDocument object.
+     *
+     * @param  string  $filename
+     * @param  boolean $isHtml
+     * @return DOMDocument
+     * @since  Method available since Release 3.3.0
+     */
+    public static function loadFile($filename, $isHtml = FALSE)
+    {
+        $reporting = error_reporting(0);
+        $contents  = file_get_contents($filename);
+        error_reporting($reporting);
+
+        if ($contents === FALSE) {
+            throw new PHPUnit_Framework_Exception(
+              sprintf(
+                'Could not read "%s".',
+                $filename
+              )
+            );
+        }
+
+        return self::load($contents, $isHtml, $filename);
+    }
+
+    /**
+     * Load an $actual document into a DOMDocument.  This is called
+     * from the selector assertions.
+     *
+     * If $actual is already a DOMDocument, it is returned with
+     * no changes.  Otherwise, $actual is loaded into a new DOMDocument
+     * as either HTML or XML, depending on the value of $isHtml.
+     *
+     * Note: prior to PHPUnit 3.3.0, this method loaded a file and
+     * not a string as it currently does.  To load a file into a
+     * DOMDocument, use loadFile() instead.
+     *
+     * @param  string|DOMDocument  $actual
+     * @param  boolean             $isHtml
+     * @param  string              $filename
+     * @return DOMDocument
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function load($actual, $isHtml = FALSE, $filename = '')
+    {
+        if ($actual instanceof DOMDocument) {
+            return $actual;
+        }
+
+        $document  = new DOMDocument;
+        $internal  = libxml_use_internal_errors(TRUE);
+        $message   = '';
+        $reporting = error_reporting(0);
+
+        if ($isHtml) {
+            $loaded = $document->loadHTML($actual);
+        } else {
+            $loaded = $document->loadXML($actual);
+        }
+
+        foreach (libxml_get_errors() as $error) {
+            $message .= $error->message;
+        }
+
+        libxml_use_internal_errors($internal);
+        error_reporting($reporting);
+
+        if ($loaded === FALSE) {
+            if ($filename != '') {
+                throw new PHPUnit_Framework_Exception(
+                  sprintf(
+                    'Could not load "%s".%s',
+
+                    $filename,
+                    $message != '' ? "\n" . $message : ''
+                  )
+                );
+            } else {
+                throw new PHPUnit_Framework_Exception($message);
+            }
+        }
+
+        return $document;
+    }
+
+    /**
+     *
+     *
+     * @param  DOMNode $node
+     * @return string
+     * @since  Method available since Release 3.4.0
+     */
+    public static function nodeToText(DOMNode $node)
+    {
+        if ($node->childNodes->length == 1) {
+            return $node->nodeValue;
+        }
+
+        $result = '';
+
+        foreach ($node->childNodes as $childNode) {
+            $result .= $node->ownerDocument->saveXML($childNode);
+        }
+
+        return $result;
+    }
+
+    /**
+     *
+     *
+     * @param  DOMNode $node
+     * @since  Method available since Release 3.3.0
+     * @author Mattis Stordalen Flister <mattis@xait.no>
+     */
+    public static function removeCharacterDataNodes(DOMNode $node)
+    {
+        if ($node->hasChildNodes()) {
+            for ($i = $node->childNodes->length - 1; $i >= 0; $i--) {
+                if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) {
+                    $node->removeChild($child);
+                }
+            }
+        }
+    }
+
+    /**
+     * "Convert" a DOMElement object into a PHP variable.
+     *
+     * @param  DOMElement $element
+     * @return mixed
+     * @since  Method available since Release 3.4.0
+     */
+    public static function xmlToVariable(DOMElement $element)
+    {
+        $variable = NULL;
+
+        switch ($element->tagName) {
+            case 'array': {
+                $variable = array();
+
+                foreach ($element->getElementsByTagName('element') as $element) {
+                    $value = self::xmlToVariable($element->childNodes->item(1));
+
+                    if ($element->hasAttribute('key')) {
+                        $variable[(string)$element->getAttribute('key')] = $value;
+                    } else {
+                        $variable[] = $value;
+                    }
+                }
+            }
+            break;
+
+            case 'object': {
+                $className = $element->getAttribute('class');
+
+                if ($element->hasChildNodes()) {
+                    $arguments       = $element->childNodes->item(1)->childNodes;
+                    $constructorArgs = array();
+
+                    foreach ($arguments as $argument) {
+                        if ($argument instanceof DOMElement) {
+                            $constructorArgs[] = self::xmlToVariable($argument);
+                        }
+                    }
+
+                    $class    = new ReflectionClass($className);
+                    $variable = $class->newInstanceArgs($constructorArgs);
+                } else {
+                    $variable = new $className;
+                }
+            }
+            break;
+
+            case 'boolean': {
+                $variable = $element->nodeValue == 'true' ? TRUE : FALSE;
+            }
+            break;
+
+            case 'integer':
+            case 'double':
+            case 'string': {
+                $variable = $element->nodeValue;
+
+                settype($variable, $element->tagName);
+            }
+            break;
+        }
+
+        return $variable;
+    }
+
+    /**
+     * Validate list of keys in the associative array.
+     *
+     * @param  array $hash
+     * @param  array $validKeys
+     * @return array
+     * @throws PHPUnit_Framework_Exception
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function assertValidKeys(array $hash, array $validKeys)
+    {
+        $valids = array();
+
+        // Normalize validation keys so that we can use both indexed and
+        // associative arrays.
+        foreach ($validKeys as $key => $val) {
+            is_int($key) ? $valids[$val] = NULL : $valids[$key] = $val;
+        }
+
+        $validKeys = array_keys($valids);
+
+        // Check for invalid keys.
+        foreach ($hash as $key => $value) {
+            if (!in_array($key, $validKeys)) {
+                $unknown[] = $key;
+            }
+        }
+
+        if (!empty($unknown)) {
+            throw new PHPUnit_Framework_Exception(
+              'Unknown key(s): ' . implode(', ', $unknown)
+            );
+        }
+
+        // Add default values for any valid keys that are empty.
+        foreach ($valids as $key => $value) {
+            if (!isset($hash[$key])) {
+                $hash[$key] = $value;
+            }
+        }
+
+        return $hash;
+    }
+
+    /**
+     * Parse a CSS selector into an associative array suitable for
+     * use with findNodes().
+     *
+     * @param  string $selector
+     * @param  mixed  $content
+     * @return array
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    public static function convertSelectToTag($selector, $content = TRUE)
+    {
+        $selector = trim(preg_replace("/\s+/", " ", $selector));
+
+        // substitute spaces within attribute value
+        while (preg_match('/\[[^\]]+"[^"]+\s[^"]+"\]/', $selector)) {
+            $selector = preg_replace(
+              '/(\[[^\]]+"[^"]+)\s([^"]+"\])/', "$1__SPACE__$2", $selector
+            );
+        }
+
+        if (strstr($selector, ' ')) {
+            $elements = explode(' ', $selector);
+        } else {
+            $elements = array($selector);
+        }
+
+        $previousTag = array();
+
+        foreach (array_reverse($elements) as $element) {
+            $element = str_replace('__SPACE__', ' ', $element);
+
+            // child selector
+            if ($element == '>') {
+                $previousTag = array('child' => $previousTag['descendant']);
+                continue;
+            }
+
+            $tag = array();
+
+            // match element tag
+            preg_match("/^([^\.#\[]*)/", $element, $eltMatches);
+
+            if (!empty($eltMatches[1])) {
+                $tag['tag'] = $eltMatches[1];
+            }
+
+            // match attributes (\[[^\]]*\]*), ids (#[^\.#\[]*),
+            // and classes (\.[^\.#\[]*))
+            preg_match_all(
+              "/(\[[^\]]*\]*|#[^\.#\[]*|\.[^\.#\[]*)/", $element, $matches
+            );
+
+            if (!empty($matches[1])) {
+                $classes = array();
+                $attrs   = array();
+
+                foreach ($matches[1] as $match) {
+                    // id matched
+                    if (substr($match, 0, 1) == '#') {
+                        $tag['id'] = substr($match, 1);
+                    }
+
+                    // class matched
+                    else if (substr($match, 0, 1) == '.') {
+                        $classes[] = substr($match, 1);
+                    }
+
+                    // attribute matched
+                    else if (substr($match, 0, 1) == '[' &&
+                             substr($match, -1, 1) == ']') {
+                        $attribute = substr($match, 1, strlen($match) - 2);
+                        $attribute = str_replace('"', '', $attribute);
+
+                        // match single word
+                        if (strstr($attribute, '~=')) {
+                            list($key, $value) = explode('~=', $attribute);
+                            $value             = "regexp:/.*\b$value\b.*/";
+                        }
+
+                        // match substring
+                        else if (strstr($attribute, '*=')) {
+                            list($key, $value) = explode('*=', $attribute);
+                            $value             = "regexp:/.*$value.*/";
+                        }
+
+                        // exact match
+                        else {
+                            list($key, $value) = explode('=', $attribute);
+                        }
+
+                        $attrs[$key] = $value;
+                    }
+                }
+
+                if ($classes) {
+                    $tag['class'] = join(' ', $classes);
+                }
+
+                if ($attrs) {
+                    $tag['attributes'] = $attrs;
+                }
+            }
+
+            // tag content
+            if (is_string($content)) {
+                $tag['content'] = $content;
+            }
+
+            // determine previous child/descendants
+            if (!empty($previousTag['descendant'])) {
+                $tag['descendant'] = $previousTag['descendant'];
+            }
+
+            else if (!empty($previousTag['child'])) {
+                $tag['child'] = $previousTag['child'];
+            }
+
+            $previousTag = array('descendant' => $tag);
+        }
+
+        return $tag;
+    }
+
+    /**
+     * Parse an $actual document and return an array of DOMNodes
+     * matching the CSS $selector.  If an error occurs, it will
+     * return FALSE.
+     *
+     * To only return nodes containing a certain content, give
+     * the $content to match as a string.  Otherwise, setting
+     * $content to TRUE will return all nodes matching $selector.
+     *
+     * The $actual document may be a DOMDocument or a string
+     * containing XML or HTML, identified by $isHtml.
+     *
+     * @param  array   $selector
+     * @param  string  $content
+     * @param  mixed   $actual
+     * @param  boolean $isHtml
+     * @return false|array
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     * @author Tobias Schlitt <toby@php.net>
+     */
+    public static function cssSelect($selector, $content, $actual, $isHtml = TRUE)
+    {
+        $matcher = self::convertSelectToTag($selector, $content);
+        $dom     = self::load($actual, $isHtml);
+        $tags    = self::findNodes($dom, $matcher, $isHtml);
+
+        return $tags;
+    }
+
+    /**
+     * Parse out the options from the tag using DOM object tree.
+     *
+     * @param  DOMDocument $dom
+     * @param  array       $options
+     * @param  boolean     $isHtml
+     * @return array
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     * @author Tobias Schlitt <toby@php.net>
+     */
+    public static function findNodes(DOMDocument $dom, array $options, $isHtml = TRUE)
+    {
+        $valid = array(
+          'id', 'class', 'tag', 'content', 'attributes', 'parent',
+          'child', 'ancestor', 'descendant', 'children'
+        );
+
+        $filtered = array();
+        $options  = self::assertValidKeys($options, $valid);
+
+        // find the element by id
+        if ($options['id']) {
+            $options['attributes']['id'] = $options['id'];
+        }
+
+        if ($options['class']) {
+            $options['attributes']['class'] = $options['class'];
+        }
+
+        // find the element by a tag type
+        if ($options['tag']) {
+            if ($isHtml) {
+                $elements = self::getElementsByCaseInsensitiveTagName(
+                  $dom, $options['tag']
+                );
+            } else {
+                $elements = $dom->getElementsByTagName($options['tag']);
+            }
+
+            foreach ($elements as $element) {
+                $nodes[] = $element;
+            }
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // no tag selected, get them all
+        else {
+            $tags = array(
+              'a', 'abbr', 'acronym', 'address', 'area', 'b', 'base', 'bdo',
+              'big', 'blockquote', 'body', 'br', 'button', 'caption', 'cite',
+              'code', 'col', 'colgroup', 'dd', 'del', 'div', 'dfn', 'dl',
+              'dt', 'em', 'fieldset', 'form', 'frame', 'frameset', 'h1', 'h2',
+              'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'html', 'i', 'iframe',
+              'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'link',
+              'map', 'meta', 'noframes', 'noscript', 'object', 'ol', 'optgroup',
+              'option', 'p', 'param', 'pre', 'q', 'samp', 'script', 'select',
+              'small', 'span', 'strong', 'style', 'sub', 'sup', 'table',
+              'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'title',
+              'tr', 'tt', 'ul', 'var'
+            );
+
+            foreach ($tags as $tag) {
+                if ($isHtml) {
+                    $elements = self::getElementsByCaseInsensitiveTagName(
+                      $dom, $tag
+                    );
+                } else {
+                    $elements = $dom->getElementsByTagName($tag);
+                }
+
+                foreach ($elements as $element) {
+                    $nodes[] = $element;
+                }
+            }
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by attributes
+        if ($options['attributes']) {
+            foreach ($nodes as $node) {
+                $invalid = FALSE;
+
+                foreach ($options['attributes'] as $name => $value) {
+                    // match by regexp if like "regexp:/foo/i"
+                    if (preg_match('/^regexp\s*:\s*(.*)/i', $value, $matches)) {
+                        if (!preg_match($matches[1], $node->getAttribute($name))) {
+                            $invalid = TRUE;
+                        }
+                    }
+
+                    // class can match only a part
+                    else if ($name == 'class') {
+                        // split to individual classes
+                        $findClasses = explode(
+                          ' ', preg_replace("/\s+/", " ", $value)
+                        );
+
+                        $allClasses = explode(
+                          ' ',
+                          preg_replace("/\s+/", " ", $node->getAttribute($name))
+                        );
+
+                        // make sure each class given is in the actual node
+                        foreach ($findClasses as $findClass) {
+                            if (!in_array($findClass, $allClasses)) {
+                                $invalid = TRUE;
+                            }
+                        }
+                    }
+
+                    // match by exact string
+                    else {
+                        if ($node->getAttribute($name) != $value) {
+                            $invalid = TRUE;
+                        }
+                    }
+                }
+
+                // if every attribute given matched
+                if (!$invalid) {
+                    $filtered[] = $node;
+                }
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by content
+        if ($options['content'] !== NULL) {
+            foreach ($nodes as $node) {
+                $invalid = FALSE;
+
+                // match by regexp if like "regexp:/foo/i"
+                if (preg_match('/^regexp\s*:\s*(.*)/i', $options['content'], $matches)) {
+                    if (!preg_match($matches[1], self::getNodeText($node))) {
+                        $invalid = TRUE;
+                    }
+                }
+
+                // match empty string
+                else if ($options['content'] === '') {
+                    if (self::getNodeText($node) !== '') {
+                        $invalid = TRUE;
+                    }
+                }
+
+                // match by exact string
+                else if (strstr(self::getNodeText($node), $options['content']) === FALSE) {
+                    $invalid = TRUE;
+                }
+
+                if (!$invalid) {
+                    $filtered[] = $node;
+                }
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by parent node
+        if ($options['parent']) {
+            $parentNodes = self::findNodes($dom, $options['parent'], $isHtml);
+            $parentNode  = isset($parentNodes[0]) ? $parentNodes[0] : NULL;
+
+            foreach ($nodes as $node) {
+                if ($parentNode !== $node->parentNode) {
+                    continue;
+                }
+
+                $filtered[] = $node;
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by child node
+        if ($options['child']) {
+            $childNodes = self::findNodes($dom, $options['child'], $isHtml);
+            $childNodes = !empty($childNodes) ? $childNodes : array();
+
+            foreach ($nodes as $node) {
+                foreach ($node->childNodes as $child) {
+                    foreach ($childNodes as $childNode) {
+                        if ($childNode === $child) {
+                            $filtered[] = $node;
+                        }
+                    }
+                }
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by ancestor
+        if ($options['ancestor']) {
+            $ancestorNodes = self::findNodes($dom, $options['ancestor'], $isHtml);
+            $ancestorNode  = isset($ancestorNodes[0]) ? $ancestorNodes[0] : NULL;
+
+            foreach ($nodes as $node) {
+                $parent = $node->parentNode;
+
+                while ($parent && $parent->nodeType != XML_HTML_DOCUMENT_NODE) {
+                    if ($parent === $ancestorNode) {
+                        $filtered[] = $node;
+                    }
+
+                    $parent = $parent->parentNode;
+                }
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by descendant
+        if ($options['descendant']) {
+            $descendantNodes = self::findNodes($dom, $options['descendant'], $isHtml);
+            $descendantNodes = !empty($descendantNodes) ? $descendantNodes : array();
+
+            foreach ($nodes as $node) {
+                foreach (self::getDescendants($node) as $descendant) {
+                    foreach ($descendantNodes as $descendantNode) {
+                        if ($descendantNode === $descendant) {
+                            $filtered[] = $node;
+                        }
+                    }
+                }
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return FALSE;
+            }
+        }
+
+        // filter by children
+        if ($options['children']) {
+            $validChild   = array('count', 'greater_than', 'less_than', 'only');
+            $childOptions = self::assertValidKeys(
+                              $options['children'], $validChild
+                            );
+
+            foreach ($nodes as $node) {
+                $childNodes = $node->childNodes;
+
+                foreach ($childNodes as $childNode) {
+                    if ($childNode->nodeType !== XML_CDATA_SECTION_NODE &&
+                        $childNode->nodeType !== XML_TEXT_NODE) {
+                        $children[] = $childNode;
+                    }
+                }
+
+                // we must have children to pass this filter
+                if (!empty($children)) {
+                    // exact count of children
+                    if ($childOptions['count'] !== NULL) {
+                        if (count($children) !== $childOptions['count']) {
+                            break;
+                        }
+                    }
+
+                    // range count of children
+                    else if ($childOptions['less_than']    !== NULL &&
+                            $childOptions['greater_than'] !== NULL) {
+                        if (count($children) >= $childOptions['less_than'] ||
+                            count($children) <= $childOptions['greater_than']) {
+                            break;
+                        }
+                    }
+
+                    // less than a given count
+                    else if ($childOptions['less_than'] !== NULL) {
+                        if (count($children) >= $childOptions['less_than']) {
+                            break;
+                        }
+                    }
+
+                    // more than a given count
+                    else if ($childOptions['greater_than'] !== NULL) {
+                        if (count($children) <= $childOptions['greater_than']) {
+                            break;
+                        }
+                    }
+
+                    // match each child against a specific tag
+                    if ($childOptions['only']) {
+                        $onlyNodes = self::findNodes(
+                          $dom, $childOptions['only'], $isHtml
+                        );
+
+                        // try to match each child to one of the 'only' nodes
+                        foreach ($children as $child) {
+                            $matched = FALSE;
+
+                            foreach ($onlyNodes as $onlyNode) {
+                                if ($onlyNode === $child) {
+                                    $matched = TRUE;
+                                }
+                            }
+
+                            if (!$matched) {
+                                break(2);
+                            }
+                        }
+                    }
+
+                    $filtered[] = $node;
+                }
+            }
+
+            $nodes    = $filtered;
+            $filtered = array();
+
+            if (empty($nodes)) {
+                return;
+            }
+        }
+
+        // return the first node that matches all criteria
+        return !empty($nodes) ? $nodes : array();
+    }
+
+    /**
+     * Recursively get flat array of all descendants of this node.
+     *
+     * @param  DOMNode $node
+     * @return array
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    protected static function getDescendants(DOMNode $node)
+    {
+        $allChildren = array();
+        $childNodes  = $node->childNodes ? $node->childNodes : array();
+
+        foreach ($childNodes as $child) {
+            if ($child->nodeType === XML_CDATA_SECTION_NODE ||
+                $child->nodeType === XML_TEXT_NODE) {
+                continue;
+            }
+
+            $children    = self::getDescendants($child);
+            $allChildren = array_merge($allChildren, $children, array($child));
+        }
+
+        return isset($allChildren) ? $allChildren : array();
+    }
+
+    /**
+     * Gets elements by case insensitive tagname.
+     *
+     * @param  DOMDocument $dom
+     * @param  string      $tag
+     * @return DOMNodeList
+     * @since  Method available since Release 3.4.0
+     */
+    protected static function getElementsByCaseInsensitiveTagName(DOMDocument $dom, $tag)
+    {
+        $elements = $dom->getElementsByTagName(strtolower($tag));
+
+        if ($elements->length == 0) {
+            $elements = $dom->getElementsByTagName(strtoupper($tag));
+        }
+
+        return $elements;
+    }
+
+    /**
+     * Get the text value of this node's child text node.
+     *
+     * @param  DOMNode $node
+     * @return string
+     * @since  Method available since Release 3.3.0
+     * @author Mike Naberezny <mike@maintainable.com>
+     * @author Derek DeVries <derek@maintainable.com>
+     */
+    protected static function getNodeText(DOMNode $node)
+    {
+        if (!$node->childNodes instanceof DOMNodeList) {
+            return '';
+        }
+
+        $result = '';
+
+        foreach ($node->childNodes as $childNode) {
+            if ($childNode->nodeType === XML_TEXT_NODE) {
+                $result .= trim($childNode->data) . ' ';
+            } else {
+                $result .= self::getNodeText($childNode);
+            }
+        }
+
+        return str_replace('  ', ' ', $result);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Extensions/RepeatedTestTest.php b/core/vendor/phpunit/phpunit/Tests/Extensions/RepeatedTestTest.php
new file mode 100644
index 0000000..13b4beb
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Extensions/RepeatedTestTest.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Success.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Extensions_RepeatedTestTest extends PHPUnit_Framework_TestCase
+{
+    protected $suite;
+
+    public function __construct()
+    {
+        $this->suite = new PHPUnit_Framework_TestSuite;
+
+        $this->suite->addTest(new Success);
+        $this->suite->addTest(new Success);
+    }
+
+    public function testRepeatedOnce()
+    {
+        $test = new PHPUnit_Extensions_RepeatedTest($this->suite, 1);
+        $this->assertEquals(2, count($test));
+
+        $result = $test->run();
+        $this->assertEquals(2, count($result));
+    }
+
+    public function testRepeatedMoreThanOnce()
+    {
+        $test = new PHPUnit_Extensions_RepeatedTest($this->suite, 3);
+        $this->assertEquals(6, count($test));
+
+        $result = $test->run();
+        $this->assertEquals(6, count($result));
+    }
+
+    public function testRepeatedZero()
+    {
+        $test = new PHPUnit_Extensions_RepeatedTest($this->suite, 0);
+        $this->assertEquals(0, count($test));
+
+        $result = $test->run();
+        $this->assertEquals(0, count($result));
+    }
+
+    public function testRepeatedNegative()
+    {
+        try {
+            $test = new PHPUnit_Extensions_RepeatedTest($this->suite, -1);
+        }
+
+        catch (Exception $e) {
+            return;
+        }
+
+        $this->fail('Should throw an Exception');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/AssertTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/AssertTest.php
new file mode 100644
index 0000000..f56139e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/AssertTest.php
@@ -0,0 +1,4159 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'SampleClass.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Struct.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'TestIterator.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Author.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Book.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithToString.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Framework_AssertTest extends PHPUnit_Framework_TestCase
+{
+    protected $filesDirectory;
+
+    protected function setUp()
+    {
+        $this->filesDirectory = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR;
+
+        $this->html = file_get_contents(
+            $this->filesDirectory . 'SelectorAssertionsFixture.html'
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::fail
+     */
+    public function testFail()
+    {
+        try {
+            $this->fail();
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        throw new PHPUnit_Framework_AssertionFailedError('Fail did not throw fail exception');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContains
+     */
+    public function testAssertSplObjectStorageContainsObject()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+        $c = new SplObjectStorage;
+        $c->attach($a);
+
+        $this->assertContains($a, $c);
+
+        try {
+            $this->assertContains($b, $c);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContains
+     */
+    public function testAssertArrayContainsObject()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $this->assertContains($a, array($a));
+
+        try {
+            $this->assertContains($a, array($b));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContains
+     */
+    public function testAssertArrayContainsString()
+    {
+        $this->assertContains('foo', array('foo'));
+
+        try {
+            $this->assertContains('foo', array('bar'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf
+     */
+    public function testAssertContainsOnlyInstancesOf()
+    {
+        $test = array(
+            new Book(),
+            new Book
+        );
+        $this->assertContainsOnlyInstancesOf('Book', $test);
+        $this->assertContainsOnlyInstancesOf('stdClass', array(new stdClass()));
+
+        $test2 = array(
+            new Author('Test')
+        );
+        try {
+            $this->assertContainsOnlyInstancesOf('Book', $test2);
+        } catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertArrayHasKey
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertArrayHasKeyThrowsException()
+    {
+        $this->assertArrayHasKey(NULL, array());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayHasKey
+     */
+    public function testAssertArrayHasIntegerKey()
+    {
+        $this->assertArrayHasKey(0, array('foo'));
+
+        try {
+            $this->assertArrayHasKey(1, array('foo'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertArrayNotHasKey
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertArrayNotHasKeyThrowsException()
+    {
+        $this->assertArrayNotHasKey(NULL, array());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey
+     */
+    public function testAssertArrayNotHasIntegerKey()
+    {
+        $this->assertArrayNotHasKey(1, array('foo'));
+
+        try {
+            $this->assertArrayNotHasKey(0, array('foo'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayHasKey
+     */
+    public function testAssertArrayHasStringKey()
+    {
+        $this->assertArrayHasKey('foo', array('foo' => 'bar'));
+
+        try {
+            $this->assertArrayHasKey('bar', array('foo' => 'bar'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey
+     */
+    public function testAssertArrayNotHasStringKey()
+    {
+        $this->assertArrayNotHasKey('bar', array('foo' => 'bar'));
+
+        try {
+            $this->assertArrayNotHasKey('foo', array('foo' => 'bar'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayHasKey
+     */
+    public function testAssertArrayHasKeyAcceptsArrayAccessValue()
+    {
+        $array = new ArrayObject();
+        $array['foo'] = 'bar';
+        $this->assertArrayHasKey('foo', $array);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayHasKey
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertArrayHasKeyProperlyFailsWithArrayAccessValue()
+    {
+        $array = new ArrayObject();
+        $array['bar'] = 'bar';
+        $this->assertArrayHasKey('foo', $array);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey
+     */
+    public function testAssertArrayNotHasKeyAcceptsArrayAccessValue()
+    {
+        $array = new ArrayObject();
+        $array['foo'] = 'bar';
+        $this->assertArrayNotHasKey('bar', $array);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertArrayNotHasKey
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertArrayNotHasKeyPropertlyFailsWithArrayAccessValue()
+    {
+        $array = new ArrayObject();
+        $array['bar'] = 'bar';
+        $this->assertArrayNotHasKey('bar', $array);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertContains
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertContainsThrowsException()
+    {
+        $this->assertContains(NULL, NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContains
+     */
+    public function testAssertIteratorContainsObject()
+    {
+        $foo = new stdClass;
+
+        $this->assertContains($foo, new TestIterator(array($foo)));
+
+        try {
+            $this->assertContains($foo, new TestIterator(array(new stdClass)));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContains
+     */
+    public function testAssertIteratorContainsString()
+    {
+        $this->assertContains('foo', new TestIterator(array('foo')));
+
+        try {
+            $this->assertContains('foo', new TestIterator(array('bar')));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContains
+     */
+    public function testAssertStringContainsString()
+    {
+        $this->assertContains('foo', 'foobar');
+
+        try {
+            $this->assertContains('foo', 'bar');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertNotContains
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertNotContainsThrowsException()
+    {
+        $this->assertNotContains(NULL, NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotContains
+     */
+    public function testAssertSplObjectStorageNotContainsObject()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+        $c = new SplObjectStorage;
+        $c->attach($a);
+
+        $this->assertNotContains($b, $c);
+
+        try {
+            $this->assertNotContains($a, $c);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotContains
+     */
+    public function testAssertArrayNotContainsObject()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $this->assertNotContains($a, array($b));
+
+        try {
+            $this->assertNotContains($a, array($a));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotContains
+     */
+    public function testAssertArrayNotContainsString()
+    {
+        $this->assertNotContains('foo', array('bar'));
+
+        try {
+            $this->assertNotContains('foo', array('foo'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotContains
+     */
+    public function testAssertStringNotContainsString()
+    {
+        $this->assertNotContains('foo', 'bar');
+
+        try {
+            $this->assertNotContains('foo', 'foo');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertContainsOnly
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertContainsOnlyThrowsException()
+    {
+        $this->assertContainsOnly(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertContainsOnlyInstancesOf
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertContainsOnlyInstancesOfThrowsException()
+    {
+        $this->assertContainsOnlyInstancesOf(NULL, NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContainsOnly
+     */
+    public function testAssertArrayContainsOnlyIntegers()
+    {
+        $this->assertContainsOnly('integer', array(1, 2, 3));
+
+        try {
+            $this->assertContainsOnly('integer', array("1", 2, 3));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotContainsOnly
+     */
+    public function testAssertArrayNotContainsOnlyIntegers()
+    {
+        $this->assertNotContainsOnly('integer', array("1", 2, 3));
+
+        try {
+            $this->assertNotContainsOnly('integer', array(1, 2, 3));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertContainsOnly
+     */
+    public function testAssertArrayContainsOnlyStdClass()
+    {
+        $this->assertContainsOnly('StdClass', array(new StdClass));
+
+        try {
+            $this->assertContainsOnly('StdClass', array('StdClass'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotContainsOnly
+     */
+    public function testAssertArrayNotContainsOnlyStdClass()
+    {
+        $this->assertNotContainsOnly('StdClass', array('StdClass'));
+
+        try {
+            $this->assertNotContainsOnly('StdClass', array(new StdClass));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    protected function createDOMDocument($content)
+    {
+        $document = new DOMDocument;
+        $document->preserveWhiteSpace = FALSE;
+        $document->loadXML($content);
+
+        return $document;
+    }
+
+    protected function sameValues()
+    {
+        $object = new SampleClass(4, 8, 15);
+        // cannot use $filesDirectory, because neither setUp() nor
+        // setUpBeforeClass() are executed before the data providers
+        $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'foo.xml';
+        $resource = fopen($file, 'r');
+
+        return array(
+            // NULL
+            array(NULL, NULL),
+            // strings
+            array('a', 'a'),
+            // integers
+            array(0, 0),
+            // floats
+            array(2.3, 2.3),
+            array(1/3, 1 - 2/3),
+            array(log(0), log(0)),
+            // arrays
+            array(array(), array()),
+            array(array(0 => 1), array(0 => 1)),
+            array(array(0 => NULL), array(0 => NULL)),
+            array(array('a', 'b' => array(1, 2)), array('a', 'b' => array(1, 2))),
+            // objects
+            array($object, $object),
+            // resources
+            array($resource, $resource),
+        );
+    }
+
+    protected function notEqualValues()
+    {
+        // cyclic dependencies
+        $book1 = new Book;
+        $book1->author = new Author('Terry Pratchett');
+        $book1->author->books[] = $book1;
+        $book2 = new Book;
+        $book2->author = new Author('Terry Pratch');
+        $book2->author->books[] = $book2;
+
+        $book3 = new Book;
+        $book3->author = 'Terry Pratchett';
+        $book4 = new stdClass;
+        $book4->author = 'Terry Pratchett';
+
+        $object1 = new SampleClass( 4,  8, 15);
+        $object2 = new SampleClass(16, 23, 42);
+        $object3 = new SampleClass( 4,  8, 15);
+        $storage1 = new SplObjectStorage;
+        $storage1->attach($object1);
+        $storage2 = new SplObjectStorage;
+        $storage2->attach($object3); // same content, different object
+
+        // cannot use $filesDirectory, because neither setUp() nor
+        // setUpBeforeClass() are executed before the data providers
+        $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'foo.xml';
+
+        return array(
+            // strings
+            array('a', 'b'),
+            array('a', 'A'),
+            // integers
+            array(1, 2),
+            array(2, 1),
+            // floats
+            array(2.3, 4.2),
+            array(2.3, 4.2, 0.5),
+            array(array(2.3), array(4.2), 0.5),
+            array(array(array(2.3)), array(array(4.2)), 0.5),
+            array(new Struct(2.3), new Struct(4.2), 0.5),
+            array(array(new Struct(2.3)), array(new Struct(4.2)), 0.5),
+            // arrays
+            array(array(), array(0 => 1)),
+            array(array(0 => 1), array()),
+            array(array(0 => NULL), array()),
+            array(array(0 => 1, 1 => 2), array(0 => 1, 1 => 3)),
+            array(array('a', 'b' => array(1, 2)), array('a', 'b' => array(2, 1))),
+            // objects
+            array(new SampleClass(4, 8, 15), new SampleClass(16, 23, 42)),
+            array($object1, $object2),
+            array($book1, $book2),
+            array($book3, $book4), // same content, different class
+            // resources
+            array(fopen($file, 'r'), fopen($file, 'r')),
+            // SplObjectStorage
+            array($storage1, $storage2),
+            // DOMDocument
+            array(
+                $this->createDOMDocument('<root></root>'),
+                $this->createDOMDocument('<bar/>'),
+            ),
+            array(
+                $this->createDOMDocument('<foo attr1="bar"/>'),
+                $this->createDOMDocument('<foo attr1="foobar"/>'),
+            ),
+            array(
+                $this->createDOMDocument('<foo> bar </foo>'),
+                $this->createDOMDocument('<foo />'),
+            ),
+            array(
+                $this->createDOMDocument('<foo xmlns="urn:myns:bar"/>'),
+                $this->createDOMDocument('<foo xmlns="urn:notmyns:bar"/>'),
+            ),
+            array(
+                $this->createDOMDocument('<foo> bar </foo>'),
+                $this->createDOMDocument('<foo> bir </foo>'),
+            ),
+            // Exception
+            //array(new Exception('Exception 1'), new Exception('Exception 2')),
+            // different types
+            array(new SampleClass(4, 8, 15), FALSE),
+            array(FALSE, new SampleClass(4, 8, 15)),
+            array(array(0 => 1, 1 => 2), FALSE),
+            array(FALSE, array(0 => 1, 1 => 2)),
+            array(array(), new stdClass),
+            array(new stdClass, array()),
+            // PHP: 0 == 'Foobar' => TRUE!
+            // We want these values to differ
+            array(0, 'Foobar'),
+            array('Foobar', 0),
+            array(3, acos(8)),
+            array(acos(8), 3)
+        );
+    }
+
+    protected function equalValues()
+    {
+        // cyclic dependencies
+        $book1 = new Book;
+        $book1->author = new Author('Terry Pratchett');
+        $book1->author->books[] = $book1;
+        $book2 = new Book;
+        $book2->author = new Author('Terry Pratchett');
+        $book2->author->books[] = $book2;
+
+        $object1 = new SampleClass(4, 8, 15);
+        $object2 = new SampleClass(4, 8, 15);
+        $storage1 = new SplObjectStorage;
+        $storage1->attach($object1);
+        $storage2 = new SplObjectStorage;
+        $storage2->attach($object1);
+
+        return array(
+            // strings
+            array('a', 'A', 0, FALSE, TRUE), // ignore case
+            // arrays
+            array(array('a' => 1, 'b' => 2), array('b' => 2, 'a' => 1)),
+            array(array(1), array('1')),
+            array(array(3, 2, 1), array(2, 3, 1), 0, TRUE), // canonicalized comparison
+            // floats
+            array(2.3, 2.5, 0.5),
+            array(array(2.3), array(2.5), 0.5),
+            array(array(array(2.3)), array(array(2.5)), 0.5),
+            array(new Struct(2.3), new Struct(2.5), 0.5),
+            array(array(new Struct(2.3)), array(new Struct(2.5)), 0.5),
+            // numeric with delta
+            array(1, 2, 1),
+            // objects
+            array($object1, $object2),
+            array($book1, $book2),
+            // SplObjectStorage
+            array($storage1, $storage2),
+            // DOMDocument
+            array(
+                $this->createDOMDocument('<root></root>'),
+                $this->createDOMDocument('<root/>'),
+            ),
+            array(
+                $this->createDOMDocument('<root attr="bar"></root>'),
+                $this->createDOMDocument('<root attr="bar"/>'),
+            ),
+            array(
+                $this->createDOMDocument('<root><foo attr="bar"></foo></root>'),
+                $this->createDOMDocument('<root><foo attr="bar"/></root>'),
+            ),
+            array(
+                $this->createDOMDocument("<root>\n  <child/>\n</root>"),
+                $this->createDOMDocument('<root><child/></root>'),
+            ),
+            // Exception
+            //array(new Exception('Exception 1'), new Exception('Exception 1')),
+            // mixed types
+            array(0, '0'),
+            array('0', 0),
+            array(2.3, '2.3'),
+            array('2.3', 2.3),
+            array((string)(1/3), 1 - 2/3),
+            array(1/3, (string)(1 - 2/3)),
+            array('string representation', new ClassWithToString),
+            array(new ClassWithToString, 'string representation'),
+        );
+    }
+
+    public function equalProvider()
+    {
+        // same |= equal
+        return array_merge($this->equalValues(), $this->sameValues());
+    }
+
+    public function notEqualProvider()
+    {
+        return $this->notEqualValues();
+    }
+
+    public function sameProvider()
+    {
+        return $this->sameValues();
+    }
+
+    public function notSameProvider()
+    {
+        // not equal |= not same
+        // equal, Â¬same |= not same
+        return array_merge($this->notEqualValues(), $this->equalValues());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEquals
+     * @dataProvider equalProvider
+     */
+    public function testAssertEqualsSucceeds($a, $b, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        $this->assertEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEquals
+     * @dataProvider notEqualProvider
+     */
+    public function testAssertEqualsFails($a, $b, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        try {
+            $this->assertEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotEquals
+     * @dataProvider notEqualProvider
+     */
+    public function testAssertNotEqualsSucceeds($a, $b, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        $this->assertNotEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotEquals
+     * @dataProvider equalProvider
+     */
+    public function testAssertNotEqualsFails($a, $b, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE)
+    {
+        try {
+            $this->assertNotEquals($a, $b, '', $delta, 10, $canonicalize, $ignoreCase);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSame
+     * @dataProvider sameProvider
+     */
+    public function testAssertSameSucceeds($a, $b)
+    {
+        $this->assertSame($a, $b);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSame
+     * @dataProvider notSameProvider
+     */
+    public function testAssertSameFails($a, $b)
+    {
+        try {
+            $this->assertSame($a, $b);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotSame
+     * @dataProvider notSameProvider
+     */
+    public function testAssertNotSameSucceeds($a, $b)
+    {
+        $this->assertNotSame($a, $b);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotSame
+     * @dataProvider sameProvider
+     */
+    public function testAssertNotSameFails($a, $b)
+    {
+        try {
+            $this->assertNotSame($a, $b);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertXmlFileEqualsXmlFile
+     */
+    public function testAssertXmlFileEqualsXmlFile()
+    {
+        $this->assertXmlFileEqualsXmlFile(
+          $this->filesDirectory . 'foo.xml',
+          $this->filesDirectory . 'foo.xml'
+        );
+
+        try {
+            $this->assertXmlFileEqualsXmlFile(
+              $this->filesDirectory . 'foo.xml',
+              $this->filesDirectory . 'bar.xml'
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertXmlFileNotEqualsXmlFile
+     */
+    public function testAssertXmlFileNotEqualsXmlFile()
+    {
+        $this->assertXmlFileNotEqualsXmlFile(
+          $this->filesDirectory . 'foo.xml',
+          $this->filesDirectory . 'bar.xml'
+        );
+
+        try {
+            $this->assertXmlFileNotEqualsXmlFile(
+              $this->filesDirectory . 'foo.xml',
+              $this->filesDirectory . 'foo.xml'
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertXmlStringEqualsXmlFile
+     */
+    public function testAssertXmlStringEqualsXmlFile()
+    {
+        $this->assertXmlStringEqualsXmlFile(
+          $this->filesDirectory . 'foo.xml',
+          file_get_contents($this->filesDirectory . 'foo.xml')
+        );
+
+        try {
+            $this->assertXmlStringEqualsXmlFile(
+              $this->filesDirectory . 'foo.xml',
+              file_get_contents($this->filesDirectory . 'bar.xml')
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlFile
+     */
+    public function testXmlStringNotEqualsXmlFile()
+    {
+        $this->assertXmlStringNotEqualsXmlFile(
+          $this->filesDirectory . 'foo.xml',
+          file_get_contents($this->filesDirectory . 'bar.xml')
+        );
+
+        try {
+            $this->assertXmlStringNotEqualsXmlFile(
+              $this->filesDirectory . 'foo.xml',
+              file_get_contents($this->filesDirectory . 'foo.xml')
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString
+     */
+    public function testAssertXmlStringEqualsXmlString()
+    {
+        $this->assertXmlStringEqualsXmlString('<root/>', '<root/>');
+
+        try {
+            $this->assertXmlStringEqualsXmlString('<foo/>', '<bar/>');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertXmlStringNotEqualsXmlString
+     */
+    public function testAssertXmlStringNotEqualsXmlString()
+    {
+        $this->assertXmlStringNotEqualsXmlString('<foo/>', '<bar/>');
+
+        try {
+            $this->assertXmlStringNotEqualsXmlString('<root/>', '<root/>');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure
+     */
+    public function testXMLStructureIsSame()
+    {
+        $expected = new DOMDocument;
+        $expected->load($this->filesDirectory . 'structureExpected.xml');
+
+        $actual = new DOMDocument;
+        $actual->load($this->filesDirectory . 'structureExpected.xml');
+
+        $this->assertEqualXMLStructure(
+          $expected->firstChild, $actual->firstChild, TRUE
+        );
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertEqualXMLStructure
+     * @expectedException PHPUnit_Framework_ExpectationFailedException
+     */
+    public function testXMLStructureWrongNumberOfAttributes()
+    {
+        $expected = new DOMDocument;
+        $expected->load($this->filesDirectory . 'structureExpected.xml');
+
+        $actual = new DOMDocument;
+        $actual->load($this->filesDirectory . 'structureWrongNumberOfAttributes.xml');
+
+        $this->assertEqualXMLStructure(
+          $expected->firstChild, $actual->firstChild, TRUE
+        );
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertEqualXMLStructure
+     * @expectedException PHPUnit_Framework_ExpectationFailedException
+     */
+    public function testXMLStructureWrongNumberOfNodes()
+    {
+        $expected = new DOMDocument;
+        $expected->load($this->filesDirectory . 'structureExpected.xml');
+
+        $actual = new DOMDocument;
+        $actual->load($this->filesDirectory . 'structureWrongNumberOfNodes.xml');
+
+        $this->assertEqualXMLStructure(
+          $expected->firstChild, $actual->firstChild, TRUE
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure
+     */
+    public function testXMLStructureIsSameButDataIsNot()
+    {
+        $expected = new DOMDocument;
+        $expected->load($this->filesDirectory . 'structureExpected.xml');
+
+        $actual = new DOMDocument;
+        $actual->load($this->filesDirectory . 'structureIsSameButDataIsNot.xml');
+
+        $this->assertEqualXMLStructure(
+          $expected->firstChild, $actual->firstChild, TRUE
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure
+     */
+    public function testXMLStructureAttributesAreSameButValuesAreNot()
+    {
+        $expected = new DOMDocument;
+        $expected->load($this->filesDirectory . 'structureExpected.xml');
+
+        $actual = new DOMDocument;
+        $actual->load($this->filesDirectory . 'structureAttributesAreSameButValuesAreNot.xml');
+
+        $this->assertEqualXMLStructure(
+          $expected->firstChild, $actual->firstChild, TRUE
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEqualXMLStructure
+     */
+    public function testXMLStructureIgnoreTextNodes()
+    {
+        $expected = new DOMDocument;
+        $expected->load($this->filesDirectory . 'structureExpected.xml');
+
+        $actual = new DOMDocument;
+        $actual->load($this->filesDirectory . 'structureIgnoreTextNodes.xml');
+
+        $this->assertEqualXMLStructure(
+          $expected->firstChild, $actual->firstChild, TRUE
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEquals
+     */
+    public function testAssertStringEqualsNumeric()
+    {
+        $this->assertEquals('0', 0);
+
+        try {
+            $this->assertEquals('0', 1);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotEquals
+     */
+    public function testAssertStringEqualsNumeric2()
+    {
+        $this->assertNotEquals('A', 0);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertFileExists
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertFileExistsThrowsException()
+    {
+        $this->assertFileExists(NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertFileExists
+     */
+    public function testAssertFileExists()
+    {
+        $this->assertFileExists(__FILE__);
+
+        try {
+            $this->assertFileExists(__DIR__ . DIRECTORY_SEPARATOR . 'NotExisting');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertFileNotExists
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertFileNotExistsThrowsException()
+    {
+        $this->assertFileNotExists(NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertFileNotExists
+     */
+    public function testAssertFileNotExists()
+    {
+        $this->assertFileNotExists(__DIR__ . DIRECTORY_SEPARATOR . 'NotExisting');
+
+        try {
+            $this->assertFileNotExists(__FILE__);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute
+     */
+    public function testAssertObjectHasAttribute()
+    {
+        $o = new Author('Terry Pratchett');
+
+        $this->assertObjectHasAttribute('name', $o);
+
+        try {
+            $this->assertObjectHasAttribute('foo', $o);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     */
+    public function testAssertObjectNotHasAttribute()
+    {
+        $o = new Author('Terry Pratchett');
+
+        $this->assertObjectNotHasAttribute('foo', $o);
+
+        try {
+            $this->assertObjectNotHasAttribute('name', $o);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNull
+     */
+    public function testAssertNull()
+    {
+        $this->assertNull(NULL);
+
+        try {
+            $this->assertNull(new stdClass);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotNull
+     */
+    public function testAssertNotNull()
+    {
+        $this->assertNotNull(new stdClass);
+
+        try {
+            $this->assertNotNull(NULL);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTrue
+     */
+    public function testAssertTrue()
+    {
+        $this->assertTrue(TRUE);
+
+        try {
+            $this->assertTrue(FALSE);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertFalse
+     */
+    public function testAssertFalse()
+    {
+        $this->assertFalse(FALSE);
+
+        try {
+            $this->assertFalse(TRUE);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertRegExp
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertRegExpThrowsException()
+    {
+        $this->assertRegExp(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertRegExp
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertRegExpThrowsException2()
+    {
+        $this->assertRegExp('', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertNotRegExp
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertNotRegExpThrowsException()
+    {
+        $this->assertNotRegExp(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertNotRegExp
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertNotRegExpThrowsException2()
+    {
+        $this->assertNotRegExp('', NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertRegExp
+     */
+    public function testAssertRegExp()
+    {
+        $this->assertRegExp('/foo/', 'foobar');
+
+        try {
+            $this->assertRegExp('/foo/', 'bar');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotRegExp
+     */
+    public function testAssertNotRegExp()
+    {
+        $this->assertNotRegExp('/foo/', 'bar');
+
+        try {
+            $this->assertNotRegExp('/foo/', 'foobar');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSame
+     */
+    public function testAssertSame()
+    {
+        $o = new stdClass;
+
+        $this->assertSame($o, $o);
+
+        try {
+            $this->assertSame(
+              new stdClass,
+              new stdClass
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSame
+     */
+    public function testAssertSame2()
+    {
+        $this->assertSame(TRUE, TRUE);
+        $this->assertSame(FALSE, FALSE);
+
+        try {
+            $this->assertSame(TRUE, FALSE);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotSame
+     */
+    public function testAssertNotSame()
+    {
+        $this->assertNotSame(
+          new stdClass,
+          NULL
+        );
+
+        $this->assertNotSame(
+          NULL,
+          new stdClass
+        );
+
+        $this->assertNotSame(
+          new stdClass,
+          new stdClass
+        );
+
+        $o = new stdClass;
+
+        try {
+            $this->assertNotSame($o, $o);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotSame
+     */
+    public function testAssertNotSame2()
+    {
+        $this->assertNotSame(TRUE, FALSE);
+        $this->assertNotSame(FALSE, TRUE);
+
+        try {
+            $this->assertNotSame(TRUE, TRUE);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotSame
+     */
+    public function testAssertNotSameFailsNull()
+    {
+        try {
+            $this->assertNotSame(NULL, NULL);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertGreaterThan
+     */
+    public function testGreaterThan()
+    {
+        $this->assertGreaterThan(1, 2);
+
+        try {
+            $this->assertGreaterThan(2, 1);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeGreaterThan
+     */
+    public function testAttributeGreaterThan()
+    {
+        $this->assertAttributeGreaterThan(
+          1, 'bar', new ClassWithNonPublicAttributes
+        );
+
+        try {
+            $this->assertAttributeGreaterThan(
+              1, 'foo', new ClassWithNonPublicAttributes
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertGreaterThanOrEqual
+     */
+    public function testGreaterThanOrEqual()
+    {
+        $this->assertGreaterThanOrEqual(1, 2);
+
+        try {
+            $this->assertGreaterThanOrEqual(2, 1);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeGreaterThanOrEqual
+     */
+    public function testAttributeGreaterThanOrEqual()
+    {
+        $this->assertAttributeGreaterThanOrEqual(
+          1, 'bar', new ClassWithNonPublicAttributes
+        );
+
+        try {
+            $this->assertAttributeGreaterThanOrEqual(
+              2, 'foo', new ClassWithNonPublicAttributes
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertLessThan
+     */
+    public function testLessThan()
+    {
+        $this->assertLessThan(2, 1);
+
+        try {
+            $this->assertLessThan(1, 2);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeLessThan
+     */
+    public function testAttributeLessThan()
+    {
+        $this->assertAttributeLessThan(
+          2, 'foo', new ClassWithNonPublicAttributes
+        );
+
+        try {
+            $this->assertAttributeLessThan(
+              1, 'bar', new ClassWithNonPublicAttributes
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertLessThanOrEqual
+     */
+    public function testLessThanOrEqual()
+    {
+        $this->assertLessThanOrEqual(2, 1);
+
+        try {
+            $this->assertLessThanOrEqual(1, 2);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeLessThanOrEqual
+     */
+    public function testAttributeLessThanOrEqual()
+    {
+        $this->assertAttributeLessThanOrEqual(
+          2, 'foo', new ClassWithNonPublicAttributes
+        );
+
+        try {
+            $this->assertAttributeLessThanOrEqual(
+              1, 'bar', new ClassWithNonPublicAttributes
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::readAttribute
+     */
+    public function testReadAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertEquals('foo', $this->readAttribute($obj, 'publicAttribute'));
+        $this->assertEquals('bar', $this->readAttribute($obj, 'protectedAttribute'));
+        $this->assertEquals('baz', $this->readAttribute($obj, 'privateAttribute'));
+        $this->assertEquals('bar', $this->readAttribute($obj, 'protectedParentAttribute'));
+        //$this->assertEquals('bar', $this->readAttribute($obj, 'privateParentAttribute'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::readAttribute
+     */
+    public function testReadAttribute2()
+    {
+        $this->assertEquals('foo', $this->readAttribute('ClassWithNonPublicAttributes', 'publicStaticAttribute'));
+        $this->assertEquals('bar', $this->readAttribute('ClassWithNonPublicAttributes', 'protectedStaticAttribute'));
+        $this->assertEquals('baz', $this->readAttribute('ClassWithNonPublicAttributes', 'privateStaticAttribute'));
+        $this->assertEquals('foo', $this->readAttribute('ClassWithNonPublicAttributes', 'protectedStaticParentAttribute'));
+        $this->assertEquals('foo', $this->readAttribute('ClassWithNonPublicAttributes', 'privateStaticParentAttribute'));
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::readAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testReadAttribute3()
+    {
+        $this->readAttribute('StdClass', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::readAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testReadAttribute4()
+    {
+        $this->readAttribute('NotExistingClass', 'foo');
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::readAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testReadAttribute5()
+    {
+        $this->readAttribute(NULL, 'foo');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeContains
+     */
+    public function testAssertPublicAttributeContains()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeContains('foo', 'publicArray', $obj);
+
+        try {
+            $this->assertAttributeContains('bar', 'publicArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeContainsOnly
+     */
+    public function testAssertPublicAttributeContainsOnly()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeContainsOnly('string', 'publicArray', $obj);
+
+        try {
+            $this->assertAttributeContainsOnly('integer', 'publicArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotContains
+     */
+    public function testAssertPublicAttributeNotContains()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotContains('bar', 'publicArray', $obj);
+
+        try {
+            $this->assertAttributeNotContains('foo', 'publicArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotContainsOnly
+     */
+    public function testAssertPublicAttributeNotContainsOnly()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotContainsOnly('integer', 'publicArray', $obj);
+
+        try {
+            $this->assertAttributeNotContainsOnly('string', 'publicArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeContains
+     */
+    public function testAssertProtectedAttributeContains()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeContains('bar', 'protectedArray', $obj);
+
+        try {
+            $this->assertAttributeContains('foo', 'protectedArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotContains
+     */
+    public function testAssertProtectedAttributeNotContains()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotContains('foo', 'protectedArray', $obj);
+
+        try {
+            $this->assertAttributeNotContains('bar', 'protectedArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeContains
+     */
+    public function testAssertPrivateAttributeContains()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeContains('baz', 'privateArray', $obj);
+
+        try {
+            $this->assertAttributeContains('foo', 'privateArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotContains
+     */
+    public function testAssertPrivateAttributeNotContains()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotContains('foo', 'privateArray', $obj);
+
+        try {
+            $this->assertAttributeNotContains('baz', 'privateArray', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEquals
+     */
+    public function testAssertPublicAttributeEquals()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeEquals('foo', 'publicAttribute', $obj);
+
+        try {
+            $this->assertAttributeEquals('bar', 'publicAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals
+     */
+    public function testAssertPublicAttributeNotEquals()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotEquals('bar', 'publicAttribute', $obj);
+
+        try {
+            $this->assertAttributeNotEquals('foo', 'publicAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeSame
+     */
+    public function testAssertPublicAttributeSame()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeSame('foo', 'publicAttribute', $obj);
+
+        try {
+            $this->assertAttributeSame('bar', 'publicAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotSame
+     */
+    public function testAssertPublicAttributeNotSame()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotSame('bar', 'publicAttribute', $obj);
+
+        try {
+            $this->assertAttributeNotSame('foo', 'publicAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEquals
+     */
+    public function testAssertProtectedAttributeEquals()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeEquals('bar', 'protectedAttribute', $obj);
+
+        try {
+            $this->assertAttributeEquals('foo', 'protectedAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals
+     */
+    public function testAssertProtectedAttributeNotEquals()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotEquals('foo', 'protectedAttribute', $obj);
+
+        try {
+            $this->assertAttributeNotEquals('bar', 'protectedAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEquals
+     */
+    public function testAssertPrivateAttributeEquals()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeEquals('baz', 'privateAttribute', $obj);
+
+        try {
+            $this->assertAttributeEquals('foo', 'privateAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals
+     */
+    public function testAssertPrivateAttributeNotEquals()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertAttributeNotEquals('foo', 'privateAttribute', $obj);
+
+        try {
+            $this->assertAttributeNotEquals('baz', 'privateAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEquals
+     */
+    public function testAssertPublicStaticAttributeEquals()
+    {
+        $this->assertAttributeEquals('foo', 'publicStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertAttributeEquals('bar', 'publicStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals
+     */
+    public function testAssertPublicStaticAttributeNotEquals()
+    {
+        $this->assertAttributeNotEquals('bar', 'publicStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertAttributeNotEquals('foo', 'publicStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEquals
+     */
+    public function testAssertProtectedStaticAttributeEquals()
+    {
+        $this->assertAttributeEquals('bar', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertAttributeEquals('foo', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals
+     */
+    public function testAssertProtectedStaticAttributeNotEquals()
+    {
+        $this->assertAttributeNotEquals('foo', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertAttributeNotEquals('bar', 'protectedStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEquals
+     */
+    public function testAssertPrivateStaticAttributeEquals()
+    {
+        $this->assertAttributeEquals('baz', 'privateStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertAttributeEquals('foo', 'privateStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEquals
+     */
+    public function testAssertPrivateStaticAttributeNotEquals()
+    {
+        $this->assertAttributeNotEquals('foo', 'privateStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertAttributeNotEquals('baz', 'privateStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassHasAttributeThrowsException()
+    {
+        $this->assertClassHasAttribute(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassHasAttributeThrowsException2()
+    {
+        $this->assertClassHasAttribute('foo', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassNotHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassNotHasAttributeThrowsException()
+    {
+        $this->assertClassNotHasAttribute(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassNotHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassNotHasAttributeThrowsException2()
+    {
+        $this->assertClassNotHasAttribute('foo', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassHasStaticAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassHasStaticAttributeThrowsException()
+    {
+        $this->assertClassHasStaticAttribute(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassHasStaticAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassHasStaticAttributeThrowsException2()
+    {
+        $this->assertClassHasStaticAttribute('foo', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassNotHasStaticAttributeThrowsException()
+    {
+        $this->assertClassNotHasStaticAttribute(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertClassNotHasStaticAttributeThrowsException2()
+    {
+        $this->assertClassNotHasStaticAttribute('foo', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertObjectHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertObjectHasAttributeThrowsException()
+    {
+        $this->assertObjectHasAttribute(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertObjectHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertObjectHasAttributeThrowsException2()
+    {
+        $this->assertObjectHasAttribute('foo', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertObjectNotHasAttributeThrowsException()
+    {
+        $this->assertObjectNotHasAttribute(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertObjectNotHasAttributeThrowsException2()
+    {
+        $this->assertObjectNotHasAttribute('foo', NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertClassHasAttribute
+     */
+    public function testClassHasPublicAttribute()
+    {
+        $this->assertClassHasAttribute('publicAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertClassHasAttribute('attribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertClassNotHasAttribute
+     */
+    public function testClassNotHasPublicAttribute()
+    {
+        $this->assertClassNotHasAttribute('attribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertClassNotHasAttribute('publicAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertClassHasStaticAttribute
+     */
+    public function testClassHasPublicStaticAttribute()
+    {
+        $this->assertClassHasStaticAttribute('publicStaticAttribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertClassHasStaticAttribute('attribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertClassNotHasStaticAttribute
+     */
+    public function testClassNotHasPublicStaticAttribute()
+    {
+        $this->assertClassNotHasStaticAttribute('attribute', 'ClassWithNonPublicAttributes');
+
+        try {
+            $this->assertClassNotHasStaticAttribute('publicStaticAttribute', 'ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute
+     */
+    public function testObjectHasPublicAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertObjectHasAttribute('publicAttribute', $obj);
+
+        try {
+            $this->assertObjectHasAttribute('attribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     */
+    public function testObjectNotHasPublicAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertObjectNotHasAttribute('attribute', $obj);
+
+        try {
+            $this->assertObjectNotHasAttribute('publicAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute
+     */
+    public function testObjectHasOnTheFlyAttribute()
+    {
+        $obj = new StdClass;
+        $obj->foo = 'bar';
+
+        $this->assertObjectHasAttribute('foo', $obj);
+
+        try {
+            $this->assertObjectHasAttribute('bar', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     */
+    public function testObjectNotHasOnTheFlyAttribute()
+    {
+        $obj = new StdClass;
+        $obj->foo = 'bar';
+
+        $this->assertObjectNotHasAttribute('bar', $obj);
+
+        try {
+            $this->assertObjectNotHasAttribute('foo', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute
+     */
+    public function testObjectHasProtectedAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertObjectHasAttribute('protectedAttribute', $obj);
+
+        try {
+            $this->assertObjectHasAttribute('attribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     */
+    public function testObjectNotHasProtectedAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertObjectNotHasAttribute('attribute', $obj);
+
+        try {
+            $this->assertObjectNotHasAttribute('protectedAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectHasAttribute
+     */
+    public function testObjectHasPrivateAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertObjectHasAttribute('privateAttribute', $obj);
+
+        try {
+            $this->assertObjectHasAttribute('attribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertObjectNotHasAttribute
+     */
+    public function testObjectNotHasPrivateAttribute()
+    {
+        $obj = new ClassWithNonPublicAttributes;
+
+        $this->assertObjectNotHasAttribute('attribute', $obj);
+
+        try {
+            $this->assertObjectNotHasAttribute('privateAttribute', $obj);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::attribute
+     * @covers PHPUnit_Framework_Assert::equalTo
+     */
+    public function testAssertThatAttributeEquals()
+    {
+        $this->assertThat(
+          new ClassWithNonPublicAttributes,
+          $this->attribute(
+            $this->equalTo('foo'),
+            'publicAttribute'
+          )
+        );
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertThat
+     * @covers            PHPUnit_Framework_Assert::attribute
+     * @covers            PHPUnit_Framework_Assert::equalTo
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertThatAttributeEquals2()
+    {
+        $this->assertThat(
+          new ClassWithNonPublicAttributes,
+          $this->attribute(
+            $this->equalTo('bar'),
+            'publicAttribute'
+          )
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::attribute
+     * @covers PHPUnit_Framework_Assert::equalTo
+     */
+    public function testAssertThatAttributeEqualTo()
+    {
+        $this->assertThat(
+          new ClassWithNonPublicAttributes,
+          $this->attributeEqualTo('publicAttribute', 'foo')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::anything
+     */
+    public function testAssertThatAnything()
+    {
+        $this->assertThat('anything', $this->anything());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Assert::logicalAnd
+     */
+    public function testAssertThatAnythingAndAnything()
+    {
+        $this->assertThat(
+          'anything',
+          $this->logicalAnd(
+            $this->anything(), $this->anything()
+          )
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Assert::logicalOr
+     */
+    public function testAssertThatAnythingOrAnything()
+    {
+        $this->assertThat(
+          'anything',
+          $this->logicalOr(
+            $this->anything(), $this->anything()
+          )
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Assert::logicalXor
+     */
+    public function testAssertThatAnythingXorNotAnything()
+    {
+        $this->assertThat(
+          'anything',
+          $this->logicalXor(
+            $this->anything(),
+            $this->logicalNot($this->anything())
+          )
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::contains
+     */
+    public function testAssertThatContains()
+    {
+        $this->assertThat(array('foo'), $this->contains('foo'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::stringContains
+     */
+    public function testAssertThatStringContains()
+    {
+        $this->assertThat('barfoobar', $this->stringContains('foo'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::containsOnly
+     */
+    public function testAssertThatContainsOnly()
+    {
+        $this->assertThat(array('foo'), $this->containsOnly('string'));
+    }
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::containsOnlyInstancesOf
+     */
+    public function testAssertThatContainsOnlyInstancesOf()
+    {
+        $this->assertThat(array(new Book), $this->containsOnlyInstancesOf('Book'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     */
+    public function testAssertThatArrayHasKey()
+    {
+        $this->assertThat(array('foo' => 'bar'), $this->arrayHasKey('foo'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     */
+    public function testAssertThatClassHasAttribute()
+    {
+        $this->assertThat(
+          new ClassWithNonPublicAttributes,
+          $this->classHasAttribute('publicAttribute')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     */
+    public function testAssertThatClassHasStaticAttribute()
+    {
+        $this->assertThat(
+          new ClassWithNonPublicAttributes,
+          $this->classHasStaticAttribute('publicStaticAttribute')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     */
+    public function testAssertThatObjectHasAttribute()
+    {
+        $this->assertThat(
+          new ClassWithNonPublicAttributes,
+          $this->objectHasAttribute('publicAttribute')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::equalTo
+     */
+    public function testAssertThatEqualTo()
+    {
+        $this->assertThat('foo', $this->equalTo('foo'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     */
+    public function testAssertThatIdenticalTo()
+    {
+        $value      = new StdClass;
+        $constraint = $this->identicalTo($value);
+
+        $this->assertThat($value, $constraint);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     */
+    public function testAssertThatIsInstanceOf()
+    {
+        $this->assertThat(new StdClass, $this->isInstanceOf('StdClass'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::isType
+     */
+    public function testAssertThatIsType()
+    {
+        $this->assertThat('string', $this->isType('string'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::fileExists
+     */
+    public function testAssertThatFileExists()
+    {
+        $this->assertThat(__FILE__, $this->fileExists());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     */
+    public function testAssertThatGreaterThan()
+    {
+        $this->assertThat(2, $this->greaterThan(1));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     */
+    public function testAssertThatGreaterThanOrEqual()
+    {
+        $this->assertThat(2, $this->greaterThanOrEqual(1));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::lessThan
+     */
+    public function testAssertThatLessThan()
+    {
+        $this->assertThat(1, $this->lessThan(2));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     */
+    public function testAssertThatLessThanOrEqual()
+    {
+        $this->assertThat(1, $this->lessThanOrEqual(2));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertThat
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     */
+    public function testAssertThatMatchesRegularExpression()
+    {
+        $this->assertThat('foobar', $this->matchesRegularExpression('/foo/'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagTypeTrue()
+    {
+        $matcher = array('tag' => 'html');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagTypeFalse()
+    {
+        $matcher = array('tag' => 'code');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagIdTrue()
+    {
+        $matcher = array('id' => 'test_text');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagIdFalse()
+    {
+        $matcher = array('id' => 'test_text_doesnt_exist');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagStringContentTrue()
+    {
+        $matcher = array('id' => 'test_text',
+                         'content' => 'My test tag content');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagStringContentFalse()
+    {
+        $matcher = array('id' => 'test_text',
+                         'content' => 'My non existent tag content');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagRegexpContentTrue()
+    {
+        $matcher = array('id' => 'test_text',
+                         'content' => 'regexp:/test tag/');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagRegexpModifierContentTrue()
+    {
+        $matcher = array('id' => 'test_text',
+                         'content' => 'regexp:/TEST TAG/i');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagRegexpContentFalse()
+    {
+        $matcher = array('id' => 'test_text',
+                         'content' => 'regexp:/asdf/');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesTrueA()
+    {
+        $matcher = array('tag' => 'span',
+                         'attributes' => array('class' => 'test_class'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesTrueB()
+    {
+        $matcher = array('tag' => 'div',
+                         'attributes' => array('id' => 'test_child_id'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagAttributesFalse()
+    {
+        $matcher = array('tag' => 'span',
+                         'attributes' => array('class' => 'test_missing_class'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesRegexpTrueA()
+    {
+        $matcher = array('tag' => 'span',
+                         'attributes' => array('class' => 'regexp:/.+_class/'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesRegexpTrueB()
+    {
+        $matcher = array('tag' => 'div',
+                         'attributes' => array('id' => 'regexp:/.+_child_.+/'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesRegexpModifierTrue()
+    {
+        $matcher = array('tag' => 'div',
+                         'attributes' => array('id' => 'regexp:/.+_CHILD_.+/i'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagAttributesRegexpModifierFalse()
+    {
+        $matcher = array('tag' => 'div',
+                         'attributes' => array('id' => 'regexp:/.+_CHILD_.+/'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagAttributesRegexpFalse()
+    {
+        $matcher = array('tag' => 'span',
+                         'attributes' => array('class' => 'regexp:/.+_missing_.+/'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesMultiPartClassTrueA()
+    {
+        $matcher = array('tag' => 'div',
+                         'id'  => 'test_multi_class',
+                         'attributes' => array('class' => 'multi class'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAttributesMultiPartClassTrueB()
+    {
+        $matcher = array('tag' => 'div',
+                         'id'  => 'test_multi_class',
+                         'attributes' => array('class' => 'multi'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagAttributesMultiPartClassFalse()
+    {
+        $matcher = array('tag' => 'div',
+                         'id'  => 'test_multi_class',
+                         'attributes' => array('class' => 'mul'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagParentTrue()
+    {
+        $matcher = array('tag' => 'head',
+                         'parent' => array('tag' => 'html'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagParentFalse()
+    {
+        $matcher = array('tag' => 'head',
+                         'parent' => array('tag' => 'div'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+    * @covers PHPUnit_Framework_Assert::assertTag
+    */
+    public function testAssertTagMultiplePossibleChildren()
+    {
+        $matcher = array(
+            'tag' => 'li',
+            'parent' => array(
+                'tag' => 'ul',
+                'id' => 'another_ul'
+            )
+        );
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagChildTrue()
+    {
+        $matcher = array('tag' => 'html',
+                         'child' => array('tag' => 'head'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagChildFalse()
+    {
+        $matcher = array('tag' => 'html',
+                         'child' => array('tag' => 'div'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagAncestorTrue()
+    {
+        $matcher = array('tag' => 'div',
+                         'ancestor' => array('tag' => 'html'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagAncestorFalse()
+    {
+        $matcher = array('tag' => 'html',
+                         'ancestor' => array('tag' => 'div'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagDescendantTrue()
+    {
+        $matcher = array('tag' => 'html',
+                         'descendant' => array('tag' => 'div'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagDescendantFalse()
+    {
+        $matcher = array('tag' => 'div',
+                         'descendant' => array('tag' => 'html'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagChildrenCountTrue()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('count' => 3));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagChildrenCountFalse()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('count' => 5));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagChildrenLessThanTrue()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('less_than' => 10));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagChildrenLessThanFalse()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('less_than' => 2));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagChildrenGreaterThanTrue()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('greater_than' => 2));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagChildrenGreaterThanFalse()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('greater_than' => 10));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagChildrenOnlyTrue()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('only' => array('tag' =>'li')));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagChildrenOnlyFalse()
+    {
+        $matcher = array('tag' => 'ul',
+                         'children' => array('only' => array('tag' =>'div')));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagTypeIdTrueA()
+    {
+        $matcher = array('tag' => 'ul', 'id' => 'my_ul');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagTypeIdTrueB()
+    {
+        $matcher = array('id' => 'my_ul', 'tag' => 'ul');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagTypeIdTrueC()
+    {
+        $matcher = array('tag' => 'input', 'id'  => 'input_test_id');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertTagTypeIdFalse()
+    {
+        $matcher = array('tag' => 'div', 'id'  => 'my_ul');
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertTagContentAttributes()
+    {
+        $matcher = array('tag' => 'div',
+                         'content'    => 'Test Id Text',
+                         'attributes' => array('id' => 'test_id',
+                                               'class' => 'my_test_class'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertParentContentAttributes()
+    {
+        $matcher = array('tag'        => 'div',
+                         'content'    => 'Test Id Text',
+                         'attributes' => array('id'    => 'test_id',
+                                               'class' => 'my_test_class'),
+                         'parent'     => array('tag' => 'body'));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertChildContentAttributes()
+    {
+        $matcher = array('tag'        => 'div',
+                         'content'    => 'Test Id Text',
+                         'attributes' => array('id'    => 'test_id',
+                                               'class' => 'my_test_class'),
+                         'child'      => array('tag'        => 'div',
+                                               'attributes' => array('id' => 'test_child_id')));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertChildSubChildren()
+    {
+        $matcher = array('id' => 'test_id',
+                         'child' => array('id' => 'test_child_id',
+                                          'child' => array('id' => 'test_subchild_id')));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertAncestorContentAttributes()
+    {
+        $matcher = array('id'         => 'test_subchild_id',
+                         'content'    => 'My Subchild',
+                         'attributes' => array('id' => 'test_subchild_id'),
+                         'ancestor'   => array('tag'        => 'div',
+                                               'attributes' => array('id' => 'test_id')));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertDescendantContentAttributes()
+    {
+        $matcher = array('id'         => 'test_id',
+                         'content'    => 'Test Id Text',
+                         'attributes' => array('id'  => 'test_id'),
+                         'descendant' => array('tag'        => 'span',
+                                               'attributes' => array('id' => 'test_subchild_id')));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertTag
+     */
+    public function testAssertChildrenContentAttributes()
+    {
+        $matcher = array('id'         => 'test_children',
+                         'content'    => 'My Children',
+                         'attributes' => array('class'  => 'children'),
+
+                         'children' => array('less_than'    => '25',
+                                             'greater_than' => '2',
+                                             'only'         => array('tag' => 'div',
+                                                                     'attributes' => array('class' => 'my_child'))
+                                            ));
+        $this->assertTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotTag
+     */
+    public function testAssertNotTagTypeIdFalse()
+    {
+        $matcher = array('tag' => 'div', 'id'  => 'my_ul');
+        $this->assertNotTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertNotTag
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertNotTagContentAttributes()
+    {
+        $matcher = array('tag' => 'div',
+                         'content'    => 'Test Id Text',
+                         'attributes' => array('id' => 'test_id',
+                                               'class' => 'my_test_class'));
+        $this->assertNotTag($matcher, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountPresentTrue()
+    {
+        $selector = 'div#test_id';
+        $count    = TRUE;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountPresentFalse()
+    {
+        $selector = 'div#non_existent';
+        $count    = TRUE;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountNotPresentTrue()
+    {
+        $selector = 'div#non_existent';
+        $count    = FALSE;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectNotPresentFalse()
+    {
+        $selector = 'div#test_id';
+        $count    = FALSE;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountChildTrue()
+    {
+        $selector = '#my_ul > li';
+        $count    = 3;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountChildFalse()
+    {
+        $selector = '#my_ul > li';
+        $count    = 4;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountDescendantTrue()
+    {
+        $selector = '#my_ul li';
+        $count    = 3;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountDescendantFalse()
+    {
+        $selector = '#my_ul li';
+        $count    = 4;
+
+        $this->assertSelectCount($selector, $count, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountGreaterThanTrue()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('>' => 2);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountGreaterThanFalse()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('>' => 3);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountGreaterThanEqualToTrue()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('>=' => 3);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountGreaterThanEqualToFalse()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('>=' => 4);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountLessThanTrue()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('<' => 4);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountLessThanFalse()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('<' => 3);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountLessThanEqualToTrue()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('<=' => 3);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountLessThanEqualToFalse()
+    {
+        $selector = '#my_ul > li';
+        $range  = array('<=' => 2);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectCount
+     */
+    public function testAssertSelectCountRangeTrue()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('>' => 2, '<' => 4);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectCount
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectCountRangeFalse()
+    {
+        $selector = '#my_ul > li';
+        $range    = array('>' => 1, '<' => 3);
+
+        $this->assertSelectCount($selector, $range, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectEquals
+     */
+    public function testAssertSelectEqualsContentPresentTrue()
+    {
+        $selector = 'span.test_class';
+        $content  = 'Test Class Text';
+
+        $this->assertSelectEquals($selector, $content, TRUE, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectEquals
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectEqualsContentPresentFalse()
+    {
+        $selector = 'span.test_class';
+        $content  = 'Test Nonexistent';
+
+        $this->assertSelectEquals($selector, $content, TRUE, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectEquals
+     */
+    public function testAssertSelectEqualsContentNotPresentTrue()
+    {
+        $selector = 'span.test_class';
+        $content  = 'Test Nonexistent';
+
+        $this->assertSelectEquals($selector, $content, FALSE, $this->html);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertSelectEquals
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertSelectEqualsContentNotPresentFalse()
+    {
+        $selector = 'span.test_class';
+        $content  = 'Test Class Text';
+
+        $this->assertSelectEquals($selector, $content, FALSE, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectRegExp
+     */
+    public function testAssertSelectRegExpContentPresentTrue()
+    {
+        $selector = 'span.test_class';
+        $regexp   = '/Test.*Text/';
+
+        $this->assertSelectRegExp($selector, $regexp, TRUE, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertSelectRegExp
+     */
+    public function testAssertSelectRegExpContentPresentFalse()
+    {
+        $selector = 'span.test_class';
+        $regexp   = '/Nonexistant/';
+
+        $this->assertSelectRegExp($selector, $regexp, FALSE, $this->html);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertFileEquals
+     */
+    public function testAssertFileEquals()
+    {
+        $this->assertFileEquals(
+          $this->filesDirectory . 'foo.xml',
+          $this->filesDirectory . 'foo.xml'
+        );
+
+        try {
+            $this->assertFileEquals(
+              $this->filesDirectory . 'foo.xml',
+              $this->filesDirectory . 'bar.xml'
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertFileNotEquals
+     */
+    public function testAssertFileNotEquals()
+    {
+        $this->assertFileNotEquals(
+          $this->filesDirectory . 'foo.xml',
+          $this->filesDirectory . 'bar.xml'
+        );
+
+        try {
+            $this->assertFileNotEquals(
+              $this->filesDirectory . 'foo.xml',
+              $this->filesDirectory . 'foo.xml'
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringEqualsFile
+     */
+    public function testAssertStringEqualsFile()
+    {
+        $this->assertStringEqualsFile(
+          $this->filesDirectory . 'foo.xml',
+          file_get_contents($this->filesDirectory . 'foo.xml')
+        );
+
+        try {
+            $this->assertStringEqualsFile(
+              $this->filesDirectory . 'foo.xml',
+              file_get_contents($this->filesDirectory . 'bar.xml')
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringNotEqualsFile
+     */
+    public function testAssertStringNotEqualsFile()
+    {
+        $this->assertStringNotEqualsFile(
+          $this->filesDirectory . 'foo.xml',
+          file_get_contents($this->filesDirectory . 'bar.xml')
+        );
+
+        try {
+            $this->assertStringNotEqualsFile(
+              $this->filesDirectory . 'foo.xml',
+              file_get_contents($this->filesDirectory . 'foo.xml')
+            );
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringStartsWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringStartsWithThrowsException()
+    {
+        $this->assertStringStartsWith(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringStartsWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringStartsWithThrowsException2()
+    {
+        $this->assertStringStartsWith('', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringStartsNotWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringStartsNotWithThrowsException()
+    {
+        $this->assertStringStartsNotWith(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringStartsNotWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringStartsNotWithThrowsException2()
+    {
+        $this->assertStringStartsNotWith('', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringEndsWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringEndsWithThrowsException()
+    {
+        $this->assertStringEndsWith(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringEndsWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringEndsWithThrowsException2()
+    {
+        $this->assertStringEndsWith('', NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringEndsNotWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringEndsNotWithThrowsException()
+    {
+        $this->assertStringEndsNotWith(NULL, NULL);
+    }
+
+    /**
+     * @covers            PHPUnit_Framework_Assert::assertStringEndsNotWith
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testAssertStringEndsNotWithThrowsException2()
+    {
+        $this->assertStringEndsNotWith('', NULL);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringStartsWith
+     */
+    public function testAssertStringStartsWith()
+    {
+        $this->assertStringStartsWith('prefix', 'prefixfoo');
+
+        try {
+            $this->assertStringStartsWith('prefix', 'foo');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringStartsNotWith
+     */
+    public function testAssertStringStartsNotWith()
+    {
+        $this->assertStringStartsNotWith('prefix', 'foo');
+
+        try {
+            $this->assertStringStartsNotWith('prefix', 'prefixfoo');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringEndsWith
+     */
+    public function testAssertStringEndsWith()
+    {
+        $this->assertStringEndsWith('suffix', 'foosuffix');
+
+        try {
+            $this->assertStringEndsWith('suffix', 'foo');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringEndsNotWith
+     */
+    public function testAssertStringEndsNotWith()
+    {
+        $this->assertStringEndsNotWith('suffix', 'foo');
+
+        try {
+            $this->assertStringEndsNotWith('suffix', 'foosuffix');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringMatchesFormat
+     */
+    public function testAssertStringMatchesFormat()
+    {
+        $this->assertStringMatchesFormat('*%s*', '***');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringMatchesFormat
+     * @expectedException PHPUnit_Framework_AssertionFailedError
+     */
+    public function testAssertStringMatchesFormatFailure()
+    {
+        $this->assertStringMatchesFormat('*%s*', '**');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertStringNotMatchesFormat
+     */
+    public function testAssertStringNotMatchesFormat()
+    {
+        $this->assertStringNotMatchesFormat('*%s*', '**');
+
+        try {
+            $this->assertStringMatchesFormat('*%s*', '**');
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertEmpty
+     */
+    public function testAssertEmpty()
+    {
+        $this->assertEmpty(array());
+
+        try {
+            $this->assertEmpty(array('foo'));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertNotEmpty
+     */
+    public function testAssertNotEmpty()
+    {
+        $this->assertNotEmpty(array('foo'));
+
+        try {
+            $this->assertNotEmpty(array());
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeEmpty
+     */
+    public function testAssertAttributeEmpty()
+    {
+        $o    = new StdClass;
+        $o->a = array();
+
+        $this->assertAttributeEmpty('a', $o);
+
+        try {
+            $o->a = array('b');
+            $this->assertAttributeEmpty('a', $o);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertAttributeNotEmpty
+     */
+    public function testAssertAttributeNotEmpty()
+    {
+        $o    = new StdClass;
+        $o->a = array('b');
+
+        $this->assertAttributeNotEmpty('a', $o);
+
+        try {
+            $o->a = array();
+            $this->assertAttributeNotEmpty('a', $o);
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::markTestIncomplete
+     */
+    public function testMarkTestIncomplete()
+    {
+        try {
+            $this->markTestIncomplete('incomplete');
+        }
+
+        catch (PHPUnit_Framework_IncompleteTestError $e) {
+            $this->assertEquals('incomplete', $e->getMessage());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::markTestSkipped
+     */
+    public function testMarkTestSkipped()
+    {
+        try {
+            $this->markTestSkipped('skipped');
+        }
+
+        catch (PHPUnit_Framework_SkippedTestError $e) {
+            $this->assertEquals('skipped', $e->getMessage());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertCount
+     */
+    public function testAssertCount()
+    {
+        $this->assertCount(2, array(1,2));
+
+        try {
+            $this->assertCount(2, array(1,2,3));
+        }
+
+        catch (PHPUnit_Framework_AssertionFailedError $e) {
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertCount
+     */
+    public function testAssertCountThrowsExceptionIfExpectedCountIsNoInteger()
+    {
+
+        try {
+            $this->assertCount('a', array());
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            $this->assertEquals('Argument #1 of PHPUnit_Framework_Assert::assertCount() must be a integer', $e->getMessage());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertCount
+     */
+    public function testAssertCountThrowsExceptionIfElementIsNotCountable()
+    {
+
+        try {
+            $this->assertCount(2, '');
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            $this->assertEquals('Argument #2 of PHPUnit_Framework_Assert::assertCount() must be a countable', $e->getMessage());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString
+     */
+    public function testAssertJsonStringEqualsJsonString()
+    {
+        $expected = '{"Mascott" : "Tux"}';
+        $actual   = '{"Mascott" : "Tux"}';
+        $message  = 'Given Json strings do not match';
+
+        $this->assertJsonStringEqualsJsonString($expected, $actual, $message);
+    }
+
+    /**
+     * @dataProvider validInvalidJsonDataprovider
+     * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonString
+     */
+    public function testAssertJsonStringEqualsJsonStringErrorRaised($expected, $actual)
+    {
+        try {
+            $this->assertJsonStringEqualsJsonString($expected, $actual);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            return;
+        }
+        $this->fail('Expected exception not found');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString
+     */
+    public function testAssertJsonStringNotEqualsJsonString()
+    {
+        $expected = '{"Mascott" : "Beastie"}';
+        $actual   = '{"Mascott" : "Tux"}';
+        $message  = 'Given Json strings do match';
+
+        $this->assertJsonStringNotEqualsJsonString($expected, $actual, $message);
+    }
+
+    /**
+     * @dataProvider validInvalidJsonDataprovider
+     * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonString
+     */
+    public function testAssertJsonStringNotEqualsJsonStringErrorRaised($expected, $actual)
+    {
+        $this->assertJsonStringNotEqualsJsonString($expected, $actual);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile
+     */
+    public function testAssertJsonStringEqualsJsonFile()
+    {
+        $file = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        $actual = json_encode(array("Mascott" => "Tux"));
+        $message = '';
+        $this->assertJsonStringEqualsJsonFile($file, $actual, $message);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile
+     */
+    public function testAssertJsonStringEqualsJsonFileExpectingExpectationFailedException()
+    {
+        $file = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        $actual = json_encode(array("Mascott" => "Beastie"));
+        $message = '';
+        try {
+            $this->assertJsonStringEqualsJsonFile($file, $actual, $message);
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+                'Failed asserting that \'{"Mascott":"Beastie"}\' matches JSON string "{"Mascott":"Tux"}".',
+                $e->getMessage()
+            );
+            return;
+        }
+
+        $this->fail('Expected Exception not thrown.');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringEqualsJsonFile
+     */
+    public function testAssertJsonStringEqualsJsonFileExpectingException()
+    {
+        $file = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        try {
+            $this->assertJsonStringEqualsJsonFile($file, NULL);
+        } catch (PHPUnit_Framework_Exception $e) {
+            return;
+        }
+        $this->fail('Expected Exception not thrown.');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile
+     */
+    public function testAssertJsonStringNotEqualsJsonFile()
+    {
+        $file = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        $actual = json_encode(array("Mascott" => "Beastie"));
+        $message = '';
+        $this->assertJsonStringNotEqualsJsonFile($file, $actual, $message);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonStringNotEqualsJsonFile
+     */
+    public function testAssertJsonStringNotEqualsJsonFileExpectingException()
+    {
+        $file = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        try {
+            $this->assertJsonStringNotEqualsJsonFile($file, NULL);
+        } catch (PHPUnit_Framework_Exception $e) {
+            return;
+        }
+        $this->fail('Expected exception not found.');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonFileNotEqualsJsonFile
+     */
+    public function testAssertJsonFileNotEqualsJsonFile()
+    {
+        $fileExpected = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        $fileActual   = __DIR__ . '/../_files/JsonData/arrayObject.js';
+        $message = '';
+        $this->assertJsonFileNotEqualsJsonFile($fileExpected, $fileActual, $message);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::assertJsonFileEqualsJsonFile
+     */
+    public function testAssertJsonFileEqualsJsonFile()
+    {
+        $file = __DIR__ . '/../_files/JsonData/simpleObject.js';
+        $message = '';
+        $this->assertJsonFileEqualsJsonFile($file, $file, $message);
+    }
+
+    public static function validInvalidJsonDataprovider()
+    {
+        return array(
+            'error syntax in expected JSON' => array('{"Mascott"::}', '{"Mascott" : "Tux"}'),
+            'error UTF-8 in actual JSON'    => array('{"Mascott" : "Tux"}', '{"Mascott" : :}'),
+        );
+    }
+
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/ComparatorTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/ComparatorTest.php
new file mode 100644
index 0000000..a8ce70d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/ComparatorTest.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithToString.php';
+
+class TestClass {}
+class TestClassComparator extends PHPUnit_Framework_Comparator_Object {}
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class Framework_ComparatorTest extends PHPUnit_Framework_TestCase
+{
+    // Don't use other test methods than ->fail() here, because the testers tested
+    // here are the foundation for the other test methods
+
+    public function instanceProvider()
+    {
+        $tmpfile = tmpfile();
+
+        return array(
+            array(NULL, NULL, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(NULL, TRUE, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(TRUE, NULL, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(TRUE, TRUE, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(FALSE, FALSE, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(TRUE, FALSE, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(FALSE, TRUE, 'PHPUnit_Framework_Comparator_Scalar'),
+            array('', '', 'PHPUnit_Framework_Comparator_Scalar'),
+            array('0', '0', 'PHPUnit_Framework_Comparator_Numeric'),
+            array('0', 0, 'PHPUnit_Framework_Comparator_Numeric'),
+            array(0, '0', 'PHPUnit_Framework_Comparator_Numeric'),
+            array(0, 0, 'PHPUnit_Framework_Comparator_Numeric'),
+            array(1.0, 0, 'PHPUnit_Framework_Comparator_Double'),
+            array(0, 1.0, 'PHPUnit_Framework_Comparator_Double'),
+            array(1.0, 1.0, 'PHPUnit_Framework_Comparator_Double'),
+            array(array(1), array(1), 'PHPUnit_Framework_Comparator_Array'),
+            array($tmpfile, $tmpfile, 'PHPUnit_Framework_Comparator_Resource'),
+            array(new stdClass, new stdClass, 'PHPUnit_Framework_Comparator_Object'),
+            array(new SplObjectStorage, new SplObjectStorage, 'PHPUnit_Framework_Comparator_SplObjectStorage'),
+            array(new Exception, new Exception, 'PHPUnit_Framework_Comparator_Exception'),
+            array(new DOMDocument, new DOMDocument, 'PHPUnit_Framework_Comparator_DOMDocument'),
+            // mixed types
+            array($tmpfile, array(1), 'PHPUnit_Framework_Comparator_Type'),
+            array(array(1), $tmpfile, 'PHPUnit_Framework_Comparator_Type'),
+            array($tmpfile, '1', 'PHPUnit_Framework_Comparator_Type'),
+            array('1', $tmpfile, 'PHPUnit_Framework_Comparator_Type'),
+            array($tmpfile, new stdClass, 'PHPUnit_Framework_Comparator_Type'),
+            array(new stdClass, $tmpfile, 'PHPUnit_Framework_Comparator_Type'),
+            array(new stdClass, array(1), 'PHPUnit_Framework_Comparator_Type'),
+            array(array(1), new stdClass, 'PHPUnit_Framework_Comparator_Type'),
+            array(new stdClass, '1', 'PHPUnit_Framework_Comparator_Type'),
+            array('1', new stdClass, 'PHPUnit_Framework_Comparator_Type'),
+            array(new ClassWithToString, '1', 'PHPUnit_Framework_Comparator_Scalar'),
+            array('1', new ClassWithToString, 'PHPUnit_Framework_Comparator_Scalar'),
+            array(1.0, new stdClass, 'PHPUnit_Framework_Comparator_Type'),
+            array(new stdClass, 1.0, 'PHPUnit_Framework_Comparator_Type'),
+            array(1.0, array(1), 'PHPUnit_Framework_Comparator_Type'),
+            array(array(1), 1.0, 'PHPUnit_Framework_Comparator_Type'),
+        );
+    }
+
+    /**
+     * @dataProvider instanceProvider
+     */
+    public function testGetInstance($a, $b, $expected)
+    {
+        $factory = new PHPUnit_Framework_ComparatorFactory;
+
+        if (get_class($factory->getComparatorFor($a, $b)) != $expected) {
+            $this->fail();
+        }
+    }
+
+    public function testRegister()
+    {
+        $comparator = new TestClassComparator;
+
+        $factory = new PHPUnit_Framework_ComparatorFactory;
+        $factory->register($comparator);
+
+        $a = new TestClass;
+        $b = new TestClass;
+        $expected = 'TestClassComparator';
+
+        if (get_class($factory->getComparatorFor($a, $b)) != $expected) {
+            $factory->unregister($comparator);
+            $this->fail();
+        }
+
+        $factory->unregister($comparator);
+    }
+
+    public function testUnregister()
+    {
+        $comparator = new TestClassComparator;
+
+        $factory = new PHPUnit_Framework_ComparatorFactory;
+        $factory->register($comparator);
+        $factory->unregister($comparator);
+
+        $a = new TestClass;
+        $b = new TestClass;
+        $expected = 'PHPUnit_Framework_Comparator_Object';
+
+        if (get_class($factory->getComparatorFor($a, $b)) != $expected) {
+            var_dump(get_class($factory->getComparatorFor($a, $b)));
+            $this->fail();
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/Constraint/JsonMatches/ErrorMessageProviderTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/Constraint/JsonMatches/ErrorMessageProviderTest.php
new file mode 100644
index 0000000..79d1bf2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/Constraint/JsonMatches/ErrorMessageProviderTest.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2002-2012 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.7.0
+ */
+
+/**
+ * @package    PHPUnit
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2011-2012 Bastian Feder <php@bastian-feder.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.7.0
+ */
+class Framework_Constraint_JsonMatches_ErrorMessageProviderTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider translateTypeToPrefixDataprovider
+     * @covers PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix
+     */
+    public function testTranslatTypeToPrefix($expected, $type)
+    {
+        $this->assertEquals(
+            $expected,
+            PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::translateTypeToPrefix($type)
+        );
+    }
+
+    /**
+     * @dataProvider determineJsonErrorDataprovider
+     * @covers PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError
+     */
+    public function testDetermineJsonError($expected, $error, $prefix)
+    {
+        $this->assertEquals(
+            $expected,
+            PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider::determineJsonError(
+                $error,
+                $prefix
+            )
+        );
+    }
+
+    public static function determineJsonErrorDataprovider()
+    {
+        return array(
+            'JSON_ERROR_NONE'  => array(
+                NULL, 'json_error_none', ''
+            ),
+            'JSON_ERROR_DEPTH' => array(
+                'Maximum stack depth exceeded', 'json_error_depth', ''
+            ),
+            'prefixed JSON_ERROR_DEPTH' => array(
+                'TUX: Maximum stack depth exceeded', 'json_error_depth', 'TUX: '
+            ),
+            'JSON_ERROR_STATE_MISMatch' => array(
+                'Underflow or the modes mismatch', 'json_error_state_mismatch', ''
+            ),
+            'JSON_ERROR_CTRL_CHAR' => array(
+                'Unexpected control character found', 'json_error_ctrl_char', ''
+            ),
+            'JSON_ERROR_SYNTAX' => array(
+                'Syntax error, malformed JSON', 'json_error_syntax', ''
+            ),
+            'JSON_ERROR_UTF8`' => array(
+                'Malformed UTF-8 characters, possibly incorrectly encoded',
+                'json_error_utf8',
+                ''
+            ),
+            'Invalid error indicator' => array(
+                'Unknown error', 'invalid_error_indicator', ''
+            ),
+        );
+    }
+
+    public static function translateTypeToPrefixDataprovider()
+    {
+        return array(
+            'expected' => array('Expected value JSON decode error - ', 'expected'),
+            'actual' => array('Actual value JSON decode error - ', 'actual'),
+            'default' => array('', ''),
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/Constraint/JsonMatchesTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/Constraint/JsonMatchesTest.php
new file mode 100644
index 0000000..de656aa
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/Constraint/JsonMatchesTest.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.7.0
+ */
+
+/**
+ * @package    PHPUnit
+ * @author     Bastian Feder <php@bastian-feder.de>
+ * @copyright  2011 Bastian Feder <php@bastian-feder.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.7.0
+ */
+class Framework_Constraint_JsonMatchesTest extends PHPUnit_Framework_TestCase
+{
+
+    /**
+     * @dataProvider evaluateDataprovider
+     * @covers PHPUnit_Framework_Constraint_JsonMatches::evaluate
+     * @covers PHPUnit_Framework_Constraint_JsonMatches::matches
+     * @covers PHPUnit_Framework_Constraint_JsonMatches::__construct
+     * @covers PHPUnit_Framework_Constraint_JsonMatches::getJsonError
+     */
+    public function testEvaluate($expected, $jsonOther, $jsonValue)
+    {
+        $constraint = new PHPUnit_Framework_Constraint_JsonMatches($jsonValue);
+        $this->assertEquals($expected, $constraint->evaluate($jsonOther, '', TRUE));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_JsonMatches::toString
+     */
+    public function testToString()
+    {
+        $jsonValue = json_encode(array('Mascott' => 'Tux'));
+        $constraint = new PHPUnit_Framework_Constraint_JsonMatches($jsonValue);
+
+        $this->assertEquals('matches JSON string "' . $jsonValue . '"', $constraint->toString());
+    }
+
+
+    public static function evaluateDataprovider()
+    {
+        return array(
+            'valid JSON' => array(TRUE, json_encode(array('Mascott' => 'Tux')), json_encode(array('Mascott' => 'Tux'))),
+            'error syntax' => array(FALSE, '{"Mascott"::}', json_encode(array('Mascott' => 'Tux'))),
+            'error UTF-8' => array(FALSE, json_encode('\xB1\x31'), json_encode(array('Mascott' => 'Tux'))),
+            'invalid JSON in class instantiation' => array(FALSE, json_encode(array('Mascott' => 'Tux')), '{"Mascott"::}'),
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/ConstraintTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/ConstraintTest.php
new file mode 100644
index 0000000..6b6d899
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/ConstraintTest.php
@@ -0,0 +1,3555 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'TestIterator.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.0.0
+ */
+class Framework_ConstraintTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Removes spaces in front of newlines
+     *
+     * @param  string $string
+     * @return string
+     */
+    public static function trimnl($string)
+    {
+        return preg_replace('/[ ]*\n/', "\n", $string);
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayHasKey()
+    {
+        $constraint = PHPUnit_Framework_Assert::arrayHasKey(0);
+
+        $this->assertFalse($constraint->evaluate(array(), '', TRUE));
+        $this->assertEquals('has the key 0', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array());
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that an array has the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayHasKey2()
+    {
+        $constraint = PHPUnit_Framework_Assert::arrayHasKey(0);
+
+        try {
+            $constraint->evaluate(array(), 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that an array has the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotHasKey()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::arrayHasKey(0)
+        );
+
+        $this->assertFalse($constraint->evaluate(array(0 => 1), '', TRUE));
+        $this->assertEquals('does not have the key 0', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array(0 => 1));
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array does not have the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ArrayHasKey
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::arrayHasKey
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotHasKey2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::arrayHasKey(0)
+        );
+
+        try {
+            $constraint->evaluate(array(0), 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an array does not have the key 0.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileExists()
+    {
+        $constraint = PHPUnit_Framework_Assert::fileExists();
+
+        $this->assertFalse($constraint->evaluate('foo', '', TRUE));
+        $this->assertEquals('file exists', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foo');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that file "foo" exists.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileExists2()
+    {
+        $constraint = PHPUnit_Framework_Assert::fileExists();
+
+        try {
+            $constraint->evaluate('foo', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that file "foo" exists.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileNotExists()
+    {
+        $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php';
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::fileExists()
+        );
+
+        $this->assertFalse($constraint->evaluate($file, '', TRUE));
+        $this->assertEquals('file does not exist', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate($file);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that file "$file" does not exist.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_FileExists
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Assert::fileExists
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintFileNotExists2()
+    {
+        $file = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ClassWithNonPublicAttributes.php';
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::fileExists()
+        );
+
+        try {
+            $constraint->evaluate($file, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that file "$file" does not exist.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThan(1);
+
+        $this->assertFalse($constraint->evaluate(0, '', TRUE));
+        $this->assertTrue($constraint->evaluate(2, '', TRUE));
+        $this->assertEquals('is greater than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThan(1);
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 0 is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThan(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(1, '', TRUE));
+        $this->assertEquals('is not greater than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(2);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 2 is not greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThan(1)
+        );
+
+        try {
+            $constraint->evaluate(2, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 2 is not greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThanOrEqual(1);
+
+        $this->assertTrue($constraint->evaluate(1, '', TRUE));
+        $this->assertFalse($constraint->evaluate(0, '', TRUE));
+        $this->assertEquals('is equal to 1 or is greater than 1', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 is equal to 1 or is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintGreaterThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::greaterThanOrEqual(1);
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 0 is equal to 1 or is greater than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThanOrEqual(1)
+        );
+
+        $this->assertFalse($constraint->evaluate(1, '', TRUE));
+        $this->assertEquals('not( is equal to 1 or is greater than 1 )', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that not( 1 is equal to 1 or is greater than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_GreaterThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::greaterThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotGreaterThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::greaterThanOrEqual(1)
+        );
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that not( 1 is equal to 1 or is greater than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsAnything
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsAnything()
+    {
+        $constraint = PHPUnit_Framework_Assert::anything();
+
+        $this->assertTrue($constraint->evaluate(NULL, '', TRUE));
+        $this->assertNull($constraint->evaluate(NULL));
+        $this->assertEquals('is anything', $constraint->toString());
+        $this->assertEquals(0, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsAnything
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::anything
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotIsAnything()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::anything()
+        );
+
+        $this->assertFalse($constraint->evaluate(NULL, '', TRUE));
+        $this->assertEquals('is not anything', $constraint->toString());
+        $this->assertEquals(0, count($constraint));
+
+        try {
+            $constraint->evaluate(NULL);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that null is not anything.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::equalTo(1);
+
+        $this->assertTrue($constraint->evaluate(1, '', TRUE));
+        $this->assertFalse($constraint->evaluate(0, '', TRUE));
+        $this->assertEquals('is equal to 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 matches expected 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    public function isEqualProvider()
+    {
+        $a = new stdClass;
+        $a->foo = 'bar';
+        $b = new stdClass;
+        $ahash = spl_object_hash($a);
+        $bhash = spl_object_hash($b);
+
+        $c = new stdClass;
+        $c->foo = 'bar';
+        $c->int = 1;
+        $c->array = array(0, array(1), array(2), 3);
+        $c->related = new stdClass;
+        $c->related->foo = "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk";
+        $c->self = $c;
+        $c->c = $c;
+        $d = new stdClass;
+        $d->foo = 'bar';
+        $d->int = 2;
+        $d->array = array(0, array(4), array(2), 3);
+        $d->related = new stdClass;
+        $d->related->foo = "a\np\nc\nd\ne\nf\ng\nh\ni\nw\nk";
+        $d->self = $d;
+        $d->c = $c;
+
+        $storage1 = new SplObjectStorage;
+        $storage1->attach($a);
+        $storage1->attach($b);
+        $storage2 = new SplObjectStorage;
+        $storage2->attach($b);
+
+        $dom1 = new DOMDocument;
+        $dom1->preserveWhiteSpace = FALSE;
+        $dom1->loadXML('<root></root>');
+        $dom2 = new DOMDocument;
+        $dom2->preserveWhiteSpace = FALSE;
+        $dom2->loadXML('<root><foo/></root>');
+
+        return array(
+            array(1, 0, <<<EOF
+Failed asserting that 0 matches expected 1.
+
+EOF
+            ),
+            array(1.1, 0, <<<EOF
+Failed asserting that 0 matches expected 1.1.
+
+EOF
+            ),
+            array('a', 'b', <<<EOF
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+-'a'
++'b'
+
+EOF
+            ),
+            array("a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk", "a\np\nc\nd\ne\nf\ng\nh\ni\nw\nk", <<<EOF
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+ 'a
+-b
++p
+
+@@ @@
+ i
+-j
++w
+ k'
+
+EOF
+            ),
+            array(1, array(0), <<<EOF
+Array (...) does not match expected type "integer".
+
+EOF
+            ),
+            array(array(0), 1, <<<EOF
+1 does not match expected type "array".
+
+EOF
+            ),
+            array(array(0), array(1), <<<EOF
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => 0
++    0 => 1
+ )
+
+EOF
+            ),
+            array(array(TRUE), array('true'), <<<EOF
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => true
++    0 => 'true'
+ )
+
+EOF
+            ),
+            array(array(0, array(1), array(2), 3), array(0, array(4), array(2), 3), <<<EOF
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+     0 => 0
+     1 => Array (
+-        0 => 1
++        0 => 4
+     )
+     2 => Array (...)
+     3 => 3
+ )
+
+EOF
+            ),
+            array($a, array(0), <<<EOF
+Array (...) does not match expected type "object".
+
+EOF
+            ),
+            array(array(0), $a, <<<EOF
+stdClass Object (...) does not match expected type "array".
+
+EOF
+            ),
+            array($a, $b, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+-    'foo' => 'bar'
+ )
+
+EOF
+            ),
+            array($c, $d, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+     'foo' => 'bar'
+-    'int' => 1
++    'int' => 2
+     'array' => Array (
+         0 => 0
+         1 => Array (
+-            0 => 1
++            0 => 4
+
+@@ @@
+         'foo' => 'a
+-        b
++        p
+
+@@ @@
+         i
+-        j
++        w
+         k'
+     )
+     'self' => stdClass Object (...)
+     'c' => stdClass Object (...)
+ )
+
+EOF
+            ),
+            array($storage1, $storage2, <<<EOF
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ SplObjectStorage Object (
+-    '$ahash' => Array (
+-        'obj' => stdClass Object (
+-            'foo' => 'bar'
+-        )
+-        'inf' => null
+-    )
+     '$bhash' => Array (
+         'obj' => stdClass Object ()
+         'inf' => null
+     )
+ )
+
+EOF
+            ),
+            array($dom1, $dom2, <<<EOF
+Failed asserting that two DOM documents are equal.
+--- Expected
++++ Actual
+@@ @@
+ <?xml version="1.0"?>
+-<root/>
++<root>
++  <foo/>
++</root>
+
+EOF
+            ),
+        );
+    }
+
+    /**
+     * @dataProvider isEqualProvider
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEqual2($expected, $actual, $message)
+    {
+        $constraint = PHPUnit_Framework_Assert::equalTo($expected);
+
+        try {
+            $constraint->evaluate($actual, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              "custom message\n$message",
+              self::trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::equalTo(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(0, '', TRUE));
+        $this->assertFalse($constraint->evaluate(1, '', TRUE));
+        $this->assertEquals('is not equal to 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 1 is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::equalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::equalTo(1)
+        );
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 1 is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsIdentical()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::identicalTo($a);
+
+        $this->assertFalse($constraint->evaluate($b, '', TRUE));
+        $this->assertTrue($constraint->evaluate($a, '', TRUE));
+        $this->assertEquals('is identical to an object of class "stdClass"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate($b);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that two variables reference the same object.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsIdentical2()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::identicalTo($a);
+
+        try {
+            $constraint->evaluate($b, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two variables reference the same object.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsIdentical3()
+    {
+        $constraint = PHPUnit_Framework_Assert::identicalTo('a');
+
+        try {
+            $constraint->evaluate('b', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two strings are identical.
+--- Expected
++++ Actual
+@@ @@
+-a
++b
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotIdentical()
+    {
+        $a = new stdClass;
+        $b = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::identicalTo($a)
+        );
+
+        $this->assertTrue($constraint->evaluate($b, '', TRUE));
+        $this->assertFalse($constraint->evaluate($a, '', TRUE));
+        $this->assertEquals('is not identical to an object of class "stdClass"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate($a);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that two variables don't reference the same object.
+
+EOF
+              ,
+              self::trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotIdentical2()
+    {
+        $a = new stdClass;
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::identicalTo($a)
+        );
+
+        try {
+            $constraint->evaluate($a, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two variables don't reference the same object.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsIdentical
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::identicalTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotIdentical3()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::identicalTo('a')
+        );
+
+        try {
+            $constraint->evaluate('a', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that two strings are not identical.
+
+EOF
+              ,
+              self::trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsInstanceOf()
+    {
+        $constraint = PHPUnit_Framework_Assert::isInstanceOf('Exception');
+
+        $this->assertFalse($constraint->evaluate(new stdClass, '', TRUE));
+        $this->assertTrue($constraint->evaluate(new Exception, '', TRUE));
+        $this->assertEquals('is instance of class "Exception"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that stdClass Object () is an instance of class "Exception".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsInstanceOf2()
+    {
+        $constraint = PHPUnit_Framework_Assert::isInstanceOf('Exception');
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that stdClass Object () is an instance of class "Exception".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotInstanceOf()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isInstanceOf('stdClass')
+        );
+
+        $this->assertFalse($constraint->evaluate(new stdClass, '', TRUE));
+        $this->assertTrue($constraint->evaluate(new Exception, '', TRUE));
+        $this->assertEquals('is not instance of class "stdClass"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that stdClass Object () is not an instance of class "stdClass".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsInstanceOf
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isInstanceOf
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotInstanceOf2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isInstanceOf('stdClass')
+        );
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that stdClass Object () is not an instance of class "stdClass".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsType()
+    {
+        $constraint = PHPUnit_Framework_Assert::isType('string');
+
+        $this->assertFalse($constraint->evaluate(0, '', TRUE));
+        $this->assertTrue($constraint->evaluate('', '', TRUE));
+        $this->assertEquals('is of type "string"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that stdClass Object () is of type "string".
+
+EOF
+              ,
+              self::trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsType2()
+    {
+        $constraint = PHPUnit_Framework_Assert::isType('string');
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that stdClass Object () is of type "string".
+
+EOF
+              ,
+              self::trimnl(PHPUnit_Framework_TestFailure::exceptionToString($e))
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotType()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isType('string')
+        );
+
+        $this->assertTrue($constraint->evaluate(0, '', TRUE));
+        $this->assertFalse($constraint->evaluate('', '', TRUE));
+        $this->assertEquals('is not of type "string"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that '' is not of type "string".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsType
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isType
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotType2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isType('string')
+        );
+
+        try {
+            $constraint->evaluate('', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that '' is not of type "string".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNull()
+    {
+        $constraint = PHPUnit_Framework_Assert::isNull();
+
+        $this->assertFalse($constraint->evaluate(0, '', TRUE));
+        $this->assertTrue($constraint->evaluate(NULL, '', TRUE));
+        $this->assertEquals('is null', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that 0 is null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNull2()
+    {
+        $constraint = PHPUnit_Framework_Assert::isNull();
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that 0 is null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotNull()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isNull()
+        );
+
+        $this->assertFalse($constraint->evaluate(NULL, '', TRUE));
+        $this->assertTrue($constraint->evaluate(0, '', TRUE));
+        $this->assertEquals('is not null', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(NULL);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+Failed asserting that null is not null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsNull
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::isNull
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsNotNull2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::isNull()
+        );
+
+        try {
+            $constraint->evaluate(NULL, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that null is not null.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThan(1);
+
+        $this->assertTrue($constraint->evaluate(0, '', TRUE));
+        $this->assertFalse($constraint->evaluate(1, '', TRUE));
+        $this->assertEquals('is less than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 1 is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThan(1);
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 1 is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThan()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThan(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(1, '', TRUE));
+        $this->assertFalse($constraint->evaluate(0, '', TRUE));
+        $this->assertEquals('is not less than 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(0);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 0 is not less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThan
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThan2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThan(1)
+        );
+
+        try {
+            $constraint->evaluate(0, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 0 is not less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThanOrEqual(1);
+
+        $this->assertTrue($constraint->evaluate(1, '', TRUE));
+        $this->assertFalse($constraint->evaluate(2, '', TRUE));
+        $this->assertEquals('is equal to 1 or is less than 1', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(2);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 2 is equal to 1 or is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     */
+    public function testConstraintCallback()
+    {
+        $closureReflect = function($parameter) {
+            return $parameter;
+        };
+
+        $closureWithoutParameter = function() {
+            return TRUE;
+        };
+
+        $constraint = PHPUnit_Framework_Assert::callback($closureWithoutParameter);
+        $this->assertTrue($constraint->evaluate('', '', TRUE));
+
+        $constraint = PHPUnit_Framework_Assert::callback($closureReflect);
+        $this->assertTrue($constraint->evaluate(TRUE, '', TRUE));
+        $this->assertFalse($constraint->evaluate(FALSE, '', TRUE));
+
+        $callback = array($this, 'callbackReturningTrue');
+        $constraint = PHPUnit_Framework_Assert::callback($callback);
+        $this->assertTrue($constraint->evaluate(FALSE,  '', TRUE));
+
+        $callback = array('Framework_ConstraintTest', 'staticCallbackReturningTrue');
+        $constraint = PHPUnit_Framework_Assert::callback($callback);
+        $this->assertTrue($constraint->evaluate(NULL, '', TRUE));
+
+        $this->assertEquals('is accepted by specified callback', $constraint->toString());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException PHPUnit_Framework_ExpectationFailedException
+     * @expectedExceptionMessage Failed asserting that 'This fails' is accepted by specified callback.
+     */
+    public function testConstraintCallbackFailure()
+    {
+        $constraint = PHPUnit_Framework_Assert::callback(function() {
+            return FALSE;
+        });
+        $constraint->evaluate('This fails');
+    }
+
+    public function callbackReturningTrue()
+    {
+        return TRUE;
+    }
+
+    public static function staticCallbackReturningTrue()
+    {
+        return TRUE;
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException InvalidArgumentException
+     * @expectedExceptionMessage Specified callback <invalid callback> is not callable.
+     */
+    public function testConstraintCallbackInvalidFunctionArgument()
+    {
+        PHPUnit_Framework_Assert::callback('invalid callback');
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException InvalidArgumentException
+     * @expectedExceptionMessage Specified callback <empty array> is not callable.
+     */
+    public function testConstraintCallbackInvalidArrayArgumentWithEmptyArray()
+    {
+        PHPUnit_Framework_Assert::callback(array());
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException InvalidArgumentException
+     * @expectedExceptionMessage Specified callback <array without indexes 0 and 1 set> is not callable.
+     */
+    public function testConstraintCallbackInvalidArrayArgumentWithBadArray()
+    {
+        PHPUnit_Framework_Assert::callback(array(3 => 'foo'));
+    }
+
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException InvalidArgumentException
+     * @expectedExceptionMessage Specified callback <Framework_ConstraintTest::invalid callback> is not callable.
+     */
+    public function testConstraintCallbackInvalidArrayArgumentWithObject()
+    {
+        PHPUnit_Framework_Assert::callback(array($this, 'invalid callback'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Callback
+     * @expectedException InvalidArgumentException
+     * @expectedExceptionMessage Specified callback <Framework_ConstraintTest::invalid callback> is not callable.
+     */
+    public function testConstraintCallbackInvalidArrayArgumentWithClassname()
+    {
+        PHPUnit_Framework_Assert::callback(array('Framework_ConstraintTest', 'invalid callback'));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintLessThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::lessThanOrEqual(1);
+
+        try {
+            $constraint->evaluate(2, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 2 is equal to 1 or is less than 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThanOrEqual()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThanOrEqual(1)
+        );
+
+        $this->assertTrue($constraint->evaluate(2, '', TRUE));
+        $this->assertFalse($constraint->evaluate(1, '', TRUE));
+        $this->assertEquals('not( is equal to 1 or is less than 1 )', $constraint->toString());
+        $this->assertEquals(2, count($constraint));
+
+        try {
+            $constraint->evaluate(1);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that not( 1 is equal to 1 or is less than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEqual
+     * @covers PHPUnit_Framework_Constraint_LessThan
+     * @covers PHPUnit_Framework_Constraint_Or
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::lessThanOrEqual
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotLessThanOrEqual2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::lessThanOrEqual(1)
+        );
+
+        try {
+            $constraint->evaluate(1, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that not( 1 is equal to 1 or is less than 1 ).
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasAttribute('privateAttribute');
+
+        $this->assertTrue($constraint->evaluate('ClassWithNonPublicAttributes', '', TRUE));
+        $this->assertFalse($constraint->evaluate('stdClass', '', TRUE));
+        $this->assertEquals('has attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('stdClass');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasAttribute('privateAttribute');
+
+        try {
+            $constraint->evaluate('stdClass', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasAttribute('privateAttribute')
+        );
+
+        $this->assertTrue($constraint->evaluate('stdClass', '', TRUE));
+        $this->assertFalse($constraint->evaluate('ClassWithNonPublicAttributes', '', TRUE));
+        $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasAttribute('privateAttribute')
+        );
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasStaticAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute');
+
+        $this->assertTrue($constraint->evaluate('ClassWithNonPublicAttributes', '', TRUE));
+        $this->assertFalse($constraint->evaluate('stdClass', '', TRUE));
+        $this->assertEquals('has static attribute "privateStaticAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('stdClass');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "stdClass" has static attribute "privateStaticAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassHasStaticAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::classHasStaticAttribute('foo');
+
+        try {
+            $constraint->evaluate('stdClass', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "stdClass" has static attribute "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasStaticAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute')
+        );
+
+        $this->assertTrue($constraint->evaluate('stdClass', '', TRUE));
+        $this->assertFalse($constraint->evaluate('ClassWithNonPublicAttributes', '', TRUE));
+        $this->assertEquals('does not have static attribute "privateStaticAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that class "ClassWithNonPublicAttributes" does not have static attribute "privateStaticAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ClassHasStaticAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::classHasStaticAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintClassNotHasStaticAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::classHasStaticAttribute('privateStaticAttribute')
+        );
+
+        try {
+            $constraint->evaluate('ClassWithNonPublicAttributes', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that class "ClassWithNonPublicAttributes" does not have static attribute "privateStaticAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute');
+
+        $this->assertTrue($constraint->evaluate(new ClassWithNonPublicAttributes, '', TRUE));
+        $this->assertFalse($constraint->evaluate(new stdClass, '', TRUE));
+        $this->assertEquals('has attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new stdClass);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that object of class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute');
+
+        try {
+            $constraint->evaluate(new stdClass, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that object of class "stdClass" has attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectNotHasAttribute()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute')
+        );
+
+        $this->assertTrue($constraint->evaluate(new stdClass, '', TRUE));
+        $this->assertFalse($constraint->evaluate(new ClassWithNonPublicAttributes, '', TRUE));
+        $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(new ClassWithNonPublicAttributes);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that object of class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_ObjectHasAttribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::objectHasAttribute
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintObjectNotHasAttribute2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::objectHasAttribute('privateAttribute')
+        );
+
+        try {
+            $constraint->evaluate(new ClassWithNonPublicAttributes, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that object of class "ClassWithNonPublicAttributes" does not have attribute "privateAttribute".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCREMatch()
+    {
+        $constraint = PHPUnit_Framework_Assert::matchesRegularExpression('/foo/');
+
+        $this->assertFalse($constraint->evaluate('barbazbar', '', TRUE));
+        $this->assertTrue($constraint->evaluate('barfoobar', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/foo/"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barbazbar');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barbazbar' matches PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCREMatch2()
+    {
+        $constraint = PHPUnit_Framework_Assert::matchesRegularExpression('/foo/');
+
+        try {
+            $constraint->evaluate('barbazbar', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that 'barbazbar' matches PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCRENotMatch()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::matchesRegularExpression('/foo/')
+        );
+
+        $this->assertTrue($constraint->evaluate('barbazbar', '', TRUE));
+        $this->assertFalse($constraint->evaluate('barfoobar', '', TRUE));
+        $this->assertEquals('does not match PCRE pattern "/foo/"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barfoobar');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barfoobar' does not match PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_PCREMatch
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::matchesRegularExpression
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintPCRENotMatch2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::matchesRegularExpression('/foo/')
+        );
+
+        try {
+            $constraint->evaluate('barfoobar', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(<<<EOF
+custom message
+Failed asserting that 'barfoobar' does not match PCRE pattern "/foo/".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%c*');
+        $this->assertFalse($constraint->evaluate('**', '', TRUE));
+        $this->assertTrue($constraint->evaluate('***', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/^\*.\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches2()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%s*');
+        $this->assertFalse($constraint->evaluate('**', '', TRUE));
+        $this->assertTrue($constraint->evaluate('***', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/^\*[^\r\n]+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches3()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%i*');
+        $this->assertFalse($constraint->evaluate('**', '', TRUE));
+        $this->assertTrue($constraint->evaluate('*0*', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/^\*[+-]?\d+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches4()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%d*');
+        $this->assertFalse($constraint->evaluate('**', '', TRUE));
+        $this->assertTrue($constraint->evaluate('*0*', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/^\*\d+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches5()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%x*');
+        $this->assertFalse($constraint->evaluate('**', '', TRUE));
+        $this->assertTrue($constraint->evaluate('*0f0f0f*', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/^\*[0-9a-fA-F]+\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringMatches
+     * @covers PHPUnit_Framework_Assert::matches
+     * @covers PHPUnit_Framework_Constraint::count
+     */
+    public function testConstraintStringMatches6()
+    {
+        $constraint = PHPUnit_Framework_Assert::matches('*%f*');
+        $this->assertFalse($constraint->evaluate('**', '', TRUE));
+        $this->assertTrue($constraint->evaluate('*1.0*', '', TRUE));
+        $this->assertEquals('matches PCRE pattern "/^\*[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?\*$/s"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringStartsWith('prefix');
+
+        $this->assertFalse($constraint->evaluate('foo', '', TRUE));
+        $this->assertTrue($constraint->evaluate('prefixfoo', '', TRUE));
+        $this->assertEquals('starts with "prefix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foo');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'foo' starts with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringStartsWith('prefix');
+
+        try {
+            $constraint->evaluate('foo', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that 'foo' starts with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsNotWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringStartsWith('prefix')
+        );
+
+        $this->assertTrue($constraint->evaluate('foo', '', TRUE));
+        $this->assertFalse($constraint->evaluate('prefixfoo', '', TRUE));
+        $this->assertEquals('starts not with "prefix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('prefixfoo');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'prefixfoo' starts not with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringStartsWith
+     * @covers PHPUnit_Framework_Assert::stringStartsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringStartsNotWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringStartsWith('prefix')
+        );
+
+        try {
+            $constraint->evaluate('prefixfoo', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'prefixfoo' starts not with "prefix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringContains()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringContains('foo');
+
+        $this->assertFalse($constraint->evaluate('barbazbar', '', TRUE));
+        $this->assertTrue($constraint->evaluate('barfoobar', '', TRUE));
+        $this->assertEquals('contains "foo"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barbazbar');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barbazbar' contains "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringContains2()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringContains('foo');
+
+        try {
+            $constraint->evaluate('barbazbar', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'barbazbar' contains "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringNotContains()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringContains('foo')
+        );
+
+        $this->assertTrue($constraint->evaluate('barbazbar', '', TRUE));
+        $this->assertFalse($constraint->evaluate('barfoobar', '', TRUE));
+        $this->assertEquals('does not contain "foo"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('barfoobar');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'barfoobar' does not contain "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringContains
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringNotContains2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringContains('foo')
+        );
+
+        try {
+            $constraint->evaluate('barfoobar', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'barfoobar' does not contain "foo".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringEndsWith('suffix');
+
+        $this->assertFalse($constraint->evaluate('foo', '', TRUE));
+        $this->assertTrue($constraint->evaluate('foosuffix', '', TRUE));
+        $this->assertEquals('ends with "suffix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foo');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'foo' ends with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::stringEndsWith('suffix');
+
+        try {
+            $constraint->evaluate('foo', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'foo' ends with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsNotWith()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringEndsWith('suffix')
+        );
+
+        $this->assertTrue($constraint->evaluate('foo', '', TRUE));
+        $this->assertFalse($constraint->evaluate('foosuffix', '', TRUE));
+        $this->assertEquals('ends not with "suffix"', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate('foosuffix');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that 'foosuffix' ends not with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_StringEndsWith
+     * @covers PHPUnit_Framework_Assert::stringEndsWith
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintStringEndsNotWith2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::stringEndsWith('suffix')
+        );
+
+        try {
+            $constraint->evaluate('foosuffix', 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that 'foosuffix' ends not with "suffix".
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayContains()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo');
+
+        $this->assertFalse($constraint->evaluate(array('bar'), '', TRUE));
+        $this->assertTrue($constraint->evaluate(array('foo'), '', TRUE));
+        $this->assertEquals("contains 'foo'", $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array('bar'));
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array contains 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayContains2()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains('foo');
+
+        try {
+            $constraint->evaluate(array('bar'), 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an array contains 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotContains()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_TraversableContains('foo')
+        );
+
+        $this->assertTrue($constraint->evaluate(array('bar'), '', TRUE));
+        $this->assertFalse($constraint->evaluate(array('foo'), '', TRUE));
+        $this->assertEquals("does not contain 'foo'", $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array('foo'));
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array does not contain 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintArrayNotContains2()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_TraversableContains('foo')
+        );
+
+        try {
+            $constraint->evaluate(array('foo'), 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an array does not contain 'foo'.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintSplObjectStorageContains()
+    {
+        $object     = new StdClass;
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains($object);
+        $this->assertEquals("contains stdClass Object ()", $constraint->toString());
+
+        $storage = new SplObjectStorage;
+        $this->assertFalse($constraint->evaluate($storage, '', TRUE));
+
+        $storage->attach($object);
+        $this->assertTrue($constraint->evaluate($storage, '', TRUE));
+
+        try {
+            $constraint->evaluate(new SplObjectStorage);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an iterator contains stdClass Object ().
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_TraversableContains
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintSplObjectStorageContains2()
+    {
+        $object     = new StdClass;
+        $constraint = new PHPUnit_Framework_Constraint_TraversableContains($object);
+
+        try {
+            $constraint->evaluate(new SplObjectStorage, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message
+Failed asserting that an iterator contains stdClass Object ().
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeEqualTo()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 1);
+
+        $this->assertTrue($constraint->evaluate($object, '', TRUE));
+        $this->assertEquals('attribute "foo" is equal to 1', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 2);
+
+        $this->assertFalse($constraint->evaluate($object, '', TRUE));
+
+        try {
+            $constraint->evaluate($object);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that attribute "foo" is equal to 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeEqualTo2()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::attributeEqualTo('foo', 2);
+
+        try {
+            $constraint->evaluate($object, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that attribute "foo" is equal to 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeNotEqualTo()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::attributeEqualTo('foo', 2)
+        );
+
+        $this->assertTrue($constraint->evaluate($object, '', TRUE));
+        $this->assertEquals('attribute "foo" is not equal to 2', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::attributeEqualTo('foo', 1)
+        );
+
+        $this->assertFalse($constraint->evaluate($object, '', TRUE));
+
+        try {
+            $constraint->evaluate($object);
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that attribute "foo" is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Assert::attributeEqualTo
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_Constraint_Attribute
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testAttributeNotEqualTo2()
+    {
+        $object     = new ClassWithNonPublicAttributes;
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          PHPUnit_Framework_Assert::attributeEqualTo('foo', 1)
+        );
+
+        try {
+            $constraint->evaluate($object, 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that attribute "foo" is not equal to 1.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEmpty
+     * @covers PHPUnit_Framework_Constraint::count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEmpty()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_IsEmpty;
+
+        $this->assertFalse($constraint->evaluate(array('foo'), '', TRUE));
+        $this->assertTrue($constraint->evaluate(array(), '', TRUE));
+        $this->assertEquals('is empty', $constraint->toString());
+        $this->assertEquals(1, count($constraint));
+
+        try {
+            $constraint->evaluate(array('foo'));
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that an array is empty.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_IsEmpty
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintIsEmpty2()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_IsEmpty;
+
+        try {
+            $constraint->evaluate(array('foo'), 'custom message');
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+custom message\nFailed asserting that an array is empty.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     */
+    public function testConstraintCountWithAnArray()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        $this->assertTrue($constraint->evaluate(array(1,2,3,4,5), '', TRUE));
+        $this->assertFalse($constraint->evaluate(array(1,2,3,4), '', TRUE));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     */
+    public function testConstraintCountWithAnIteratorWhichDoesNotImplementCountable()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        $this->assertTrue($constraint->evaluate(new TestIterator(array(1,2,3,4,5)), '', TRUE));
+        $this->assertFalse($constraint->evaluate(new TestIterator(array(1,2,3,4)), '', TRUE));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     */
+    public function testConstraintCountWithAnObjectImplementingCountable()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        $this->assertTrue($constraint->evaluate(new ArrayObject(array(1,2,3,4,5)), '', TRUE));
+        $this->assertFalse($constraint->evaluate(new ArrayObject(array(1,2,3,4)), '', TRUE));
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintCountFailing()
+    {
+        $constraint = new PHPUnit_Framework_Constraint_Count(5);
+
+        try {
+            $constraint->evaluate(array(1,2));
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that actual size 2 matches expected size 5.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers PHPUnit_Framework_Constraint_Count
+     * @covers PHPUnit_Framework_Constraint_Not
+     * @covers PHPUnit_Framework_Assert::logicalNot
+     * @covers PHPUnit_Framework_TestFailure::exceptionToString
+     */
+    public function testConstraintNotCountFailing()
+    {
+        $constraint = PHPUnit_Framework_Assert::logicalNot(
+          new PHPUnit_Framework_Constraint_Count(2)
+        );
+
+        try {
+            $constraint->evaluate(array(1,2));
+        }
+
+        catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $this->assertEquals(
+              <<<EOF
+Failed asserting that actual size 2 does not match expected size 2.
+
+EOF
+              ,
+              PHPUnit_Framework_TestFailure::exceptionToString($e)
+            );
+
+            return;
+        }
+
+        $this->fail();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/SuiteTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/SuiteTest.php
new file mode 100644
index 0000000..6293283
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/SuiteTest.php
@@ -0,0 +1,186 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'InheritedTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoTestCaseClass.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoTestCases.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NotPublicTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NotVoidTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'OneTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'OverrideTestCase.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Framework_SuiteTest extends PHPUnit_Framework_TestCase {
+    protected $result;
+
+    protected function setUp()
+    {
+        $this->result = new PHPUnit_Framework_TestResult;
+    }
+
+    public static function suite()
+    {
+        $suite = new PHPUnit_Framework_TestSuite;
+
+        $suite->addTest(new Framework_SuiteTest('testAddTestSuite'));
+        $suite->addTest(new Framework_SuiteTest('testInheritedTests'));
+        $suite->addTest(new Framework_SuiteTest('testNoTestCases'));
+        $suite->addTest(new Framework_SuiteTest('testNoTestCaseClass'));
+        $suite->addTest(new Framework_SuiteTest('testNotExistingTestCase'));
+        $suite->addTest(new Framework_SuiteTest('testNotPublicTestCase'));
+        $suite->addTest(new Framework_SuiteTest('testNotVoidTestCase'));
+        $suite->addTest(new Framework_SuiteTest('testOneTestCase'));
+        $suite->addTest(new Framework_SuiteTest('testShadowedTests'));
+
+        return $suite;
+    }
+
+    public function testAddTestSuite()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'OneTestCase'
+        );
+
+        $suite->run($this->result);
+
+        $this->assertEquals(1, count($this->result));
+    }
+
+    public function testInheritedTests()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'InheritedTestCase'
+        );
+
+        $suite->run($this->result);
+
+        $this->assertTrue($this->result->wasSuccessful());
+        $this->assertEquals(2, count($this->result));
+    }
+
+    public function testNoTestCases()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'NoTestCases'
+        );
+
+        $suite->run($this->result);
+
+        $this->assertTrue(!$this->result->wasSuccessful());
+        $this->assertEquals(1, $this->result->failureCount());
+        $this->assertEquals(1, count($this->result));
+    }
+
+    /**
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testNoTestCaseClass()
+    {
+        $suite = new PHPUnit_Framework_TestSuite('NoTestCaseClass');
+    }
+
+    public function testNotExistingTestCase()
+    {
+        $suite = new Framework_SuiteTest('notExistingMethod');
+
+        $suite->run($this->result);
+
+        $this->assertEquals(0, $this->result->errorCount());
+        $this->assertEquals(1, $this->result->failureCount());
+        $this->assertEquals(1, count($this->result));
+    }
+
+    public function testNotPublicTestCase()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'NotPublicTestCase'
+        );
+
+        $this->assertEquals(2, count($suite));
+    }
+
+    public function testNotVoidTestCase()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'NotVoidTestCase'
+        );
+
+        $this->assertEquals(1, count($suite));
+    }
+
+    public function testOneTestCase()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'OneTestCase'
+        );
+
+        $suite->run($this->result);
+
+        $this->assertEquals(0, $this->result->errorCount());
+        $this->assertEquals(0, $this->result->failureCount());
+        $this->assertEquals(1, count($this->result));
+        $this->assertTrue($this->result->wasSuccessful());
+    }
+
+    public function testShadowedTests()
+    {
+        $suite = new PHPUnit_Framework_TestSuite(
+          'OverrideTestCase'
+        );
+
+        $suite->run($this->result);
+
+        $this->assertEquals(1, count($this->result));
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/TestCaseTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/TestCaseTest.php
new file mode 100644
index 0000000..a85e1d1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/TestCaseTest.php
@@ -0,0 +1,440 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Error.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionInAssertPostConditionsTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionInAssertPreConditionsTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionInSetUpTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionInTearDownTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionInTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Failure.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NoArgTestCaseTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'OutputTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'RequirementsTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Singleton.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Success.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ThrowExceptionTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ThrowNoExceptionTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'WasRun.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ChangeCurrentWorkingDirectoryTest.php';
+
+$GLOBALS['a']  = 'a';
+$_ENV['b']     = 'b';
+$_POST['c']    = 'c';
+$_GET['d']     = 'd';
+$_COOKIE['e']  = 'e';
+$_SERVER['f']  = 'f';
+$_FILES['g']   = 'g';
+$_REQUEST['h'] = 'h';
+$GLOBALS['i']  = 'i';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Framework_TestCaseTest extends PHPUnit_Framework_TestCase
+{
+    protected $backupGlobalsBlacklist = array('i', 'singleton');
+
+    public function testCaseToString()
+    {
+        $this->assertEquals(
+          'Framework_TestCaseTest::testCaseToString',
+          $this->toString()
+        );
+    }
+
+    public function testSuccess()
+    {
+        $test   = new Success;
+        $result = $test->run();
+
+        $this->assertEquals(0, $result->errorCount());
+        $this->assertEquals(0, $result->failureCount());
+        $this->assertEquals(1, count($result));
+    }
+
+    public function testFailure()
+    {
+        $test   = new Failure;
+        $result = $test->run();
+
+        $this->assertEquals(0, $result->errorCount());
+        $this->assertEquals(1, $result->failureCount());
+        $this->assertEquals(1, count($result));
+    }
+
+    public function testError()
+    {
+        $test   = new Error;
+        $result = $test->run();
+
+        $this->assertEquals(1, $result->errorCount());
+        $this->assertEquals(0, $result->failureCount());
+        $this->assertEquals(1, count($result));
+    }
+
+    public function testExceptionInSetUp()
+    {
+        $test   = new ExceptionInSetUpTest('testSomething');
+        $result = $test->run();
+
+        $this->assertTrue($test->setUp);
+        $this->assertFalse($test->assertPreConditions);
+        $this->assertFalse($test->testSomething);
+        $this->assertFalse($test->assertPostConditions);
+        $this->assertTrue($test->tearDown);
+    }
+
+    public function testExceptionInAssertPreConditions()
+    {
+        $test   = new ExceptionInAssertPreConditionsTest('testSomething');
+        $result = $test->run();
+
+        $this->assertTrue($test->setUp);
+        $this->assertTrue($test->assertPreConditions);
+        $this->assertFalse($test->testSomething);
+        $this->assertFalse($test->assertPostConditions);
+        $this->assertTrue($test->tearDown);
+    }
+
+    public function testExceptionInTest()
+    {
+        $test   = new ExceptionInTest('testSomething');
+        $result = $test->run();
+
+        $this->assertTrue($test->setUp);
+        $this->assertTrue($test->assertPreConditions);
+        $this->assertTrue($test->testSomething);
+        $this->assertFalse($test->assertPostConditions);
+        $this->assertTrue($test->tearDown);
+    }
+
+    public function testExceptionInAssertPostConditions()
+    {
+        $test   = new ExceptionInAssertPostConditionsTest('testSomething');
+        $result = $test->run();
+
+        $this->assertTrue($test->setUp);
+        $this->assertTrue($test->assertPreConditions);
+        $this->assertTrue($test->testSomething);
+        $this->assertTrue($test->assertPostConditions);
+        $this->assertTrue($test->tearDown);
+    }
+
+    public function testExceptionInTearDown()
+    {
+        $test   = new ExceptionInTearDownTest('testSomething');
+        $result = $test->run();
+
+        $this->assertTrue($test->setUp);
+        $this->assertTrue($test->assertPreConditions);
+        $this->assertTrue($test->testSomething);
+        $this->assertTrue($test->assertPostConditions);
+        $this->assertTrue($test->tearDown);
+    }
+
+    public function testNoArgTestCasePasses()
+    {
+        $result = new PHPUnit_Framework_TestResult;
+        $t      = new PHPUnit_Framework_TestSuite('NoArgTestCaseTest');
+
+        $t->run($result);
+
+        $this->assertEquals(1, count($result));
+        $this->assertEquals(0, $result->failureCount());
+        $this->assertEquals(0, $result->errorCount());
+    }
+
+    public function testWasRun()
+    {
+        $test = new WasRun;
+        $test->run();
+
+        $this->assertTrue($test->wasRun);
+    }
+
+    public function testException()
+    {
+        $test = new ThrowExceptionTestCase('test');
+        $test->setExpectedException('RuntimeException');
+
+        $result = $test->run();
+
+        $this->assertEquals(1, count($result));
+        $this->assertTrue($result->wasSuccessful());
+    }
+
+    public function testNoException()
+    {
+        $test = new ThrowNoExceptionTestCase('test');
+        $test->setExpectedException('RuntimeException');
+
+        $result = $test->run();
+
+        $this->assertEquals(1, $result->failureCount());
+        $this->assertEquals(1, count($result));
+    }
+
+    public function testWrongException()
+    {
+        $test = new ThrowExceptionTestCase('test');
+        $test->setExpectedException('InvalidArgumentException');
+
+        $result = $test->run();
+
+        $this->assertEquals(1, $result->failureCount());
+        $this->assertEquals(1, count($result));
+    }
+
+    /**
+     * @backupGlobals enabled
+     */
+    public function testGlobalsBackupPre()
+    {
+        global $a;
+        global $i;
+
+        $this->assertEquals('a', $a);
+        $this->assertEquals('a', $GLOBALS['a']);
+        $this->assertEquals('b', $_ENV['b']);
+        $this->assertEquals('c', $_POST['c']);
+        $this->assertEquals('d', $_GET['d']);
+        $this->assertEquals('e', $_COOKIE['e']);
+        $this->assertEquals('f', $_SERVER['f']);
+        $this->assertEquals('g', $_FILES['g']);
+        $this->assertEquals('h', $_REQUEST['h']);
+        $this->assertEquals('i', $i);
+        $this->assertEquals('i', $GLOBALS['i']);
+
+        $GLOBALS['a']   = 'aa';
+        $GLOBALS['foo'] = 'bar';
+        $_ENV['b']      = 'bb';
+        $_POST['c']     = 'cc';
+        $_GET['d']      = 'dd';
+        $_COOKIE['e']   = 'ee';
+        $_SERVER['f']   = 'ff';
+        $_FILES['g']    = 'gg';
+        $_REQUEST['h']  = 'hh';
+        $GLOBALS['i']   = 'ii';
+
+        $this->assertEquals('aa', $a);
+        $this->assertEquals('aa', $GLOBALS['a']);
+        $this->assertEquals('bar', $GLOBALS['foo']);
+        $this->assertEquals('bb', $_ENV['b']);
+        $this->assertEquals('cc', $_POST['c']);
+        $this->assertEquals('dd', $_GET['d']);
+        $this->assertEquals('ee', $_COOKIE['e']);
+        $this->assertEquals('ff', $_SERVER['f']);
+        $this->assertEquals('gg', $_FILES['g']);
+        $this->assertEquals('hh', $_REQUEST['h']);
+        $this->assertEquals('ii', $i);
+        $this->assertEquals('ii', $GLOBALS['i']);
+    }
+
+    public function testGlobalsBackupPost()
+    {
+        global $a;
+        global $i;
+
+        $this->assertEquals('a', $a);
+        $this->assertEquals('a', $GLOBALS['a']);
+        $this->assertEquals('b', $_ENV['b']);
+        $this->assertEquals('c', $_POST['c']);
+        $this->assertEquals('d', $_GET['d']);
+        $this->assertEquals('e', $_COOKIE['e']);
+        $this->assertEquals('f', $_SERVER['f']);
+        $this->assertEquals('g', $_FILES['g']);
+        $this->assertEquals('h', $_REQUEST['h']);
+        $this->assertEquals('ii', $i);
+        $this->assertEquals('ii', $GLOBALS['i']);
+
+        $this->assertArrayNotHasKey('foo', $GLOBALS);
+    }
+
+    /**
+     * @backupGlobals enabled
+     * @backupStaticAttributes enabled
+     */
+    public function testStaticAttributesBackupPre()
+    {
+        $GLOBALS['singleton'] = Singleton::getInstance();
+    }
+
+    public function testStaticAttributesBackupPost()
+    {
+        $this->assertNotSame($GLOBALS['singleton'], Singleton::getInstance());
+    }
+
+    public function testExpectOutputStringFooActualFoo()
+    {
+        $test   = new OutputTestCase('testExpectOutputStringFooActualFoo');
+        $result = $test->run();
+
+        $this->assertEquals(1, count($result));
+        $this->assertTrue($result->wasSuccessful());
+    }
+
+    public function testExpectOutputStringFooActualBar()
+    {
+        $test   = new OutputTestCase('testExpectOutputStringFooActualBar');
+        $result = $test->run();
+
+        $this->assertEquals(1, count($result));
+        $this->assertFalse($result->wasSuccessful());
+    }
+
+    public function testExpectOutputRegexFooActualFoo()
+    {
+        $test   = new OutputTestCase('testExpectOutputRegexFooActualFoo');
+        $result = $test->run();
+
+        $this->assertEquals(1, count($result));
+        $this->assertTrue($result->wasSuccessful());
+    }
+
+    public function testExpectOutputRegexFooActualBar()
+    {
+        $test   = new OutputTestCase('testExpectOutputRegexFooActualBar');
+        $result = $test->run();
+
+        $this->assertEquals(1, count($result));
+        $this->assertFalse($result->wasSuccessful());
+    }
+
+    public function testSkipsIfRequiresHigherVersionOfPHPUnit()
+    {
+        $test   = new RequirementsTest('testAlwaysSkip');
+        $result = $test->run();
+
+        $this->assertEquals(1, $result->skippedCount());
+        $this->assertEquals(
+          'PHPUnit 1111111 (or later) is required.',
+          $test->getStatusMessage()
+        );
+    }
+
+    public function testSkipsIfRequiresHigherVersionOfPHP()
+    {
+        $test   = new RequirementsTest('testAlwaysSkip2');
+        $result = $test->run();
+
+        $this->assertEquals(1, $result->skippedCount());
+        $this->assertEquals(
+          'PHP 9999999 (or later) is required.',
+          $test->getStatusMessage()
+        );
+    }
+
+    public function testSkipsIfRequiresNonExistingFunction()
+    {
+        $test   = new RequirementsTest('testNine');
+        $result = $test->run();
+
+        $this->assertEquals(1, $result->skippedCount());
+        $this->assertEquals(
+          'Function testFunc is required.',
+          $test->getStatusMessage()
+        );
+    }
+
+    public function testSkipsIfRequiresNonExistingExtension()
+    {
+        $test   = new RequirementsTest('testTen');
+        $result = $test->run();
+
+        $this->assertEquals(
+          'Extension testExt is required.',
+          $test->getStatusMessage()
+        );
+    }
+
+    public function testSkipsProvidesMessagesForAllSkippingReasons()
+    {
+        $test   = new RequirementsTest('testAllPossibleRequirements');
+        $result = $test->run();
+
+        $this->assertEquals(
+          'PHP 99-dev (or later) is required.' . PHP_EOL .
+          'PHPUnit 9-dev (or later) is required.' . PHP_EOL .
+          'Function testFuncOne is required.' . PHP_EOL .
+          'Function testFuncTwo is required.' . PHP_EOL .
+          'Extension testExtOne is required.' . PHP_EOL .
+          'Extension testExtTwo is required.',
+          $test->getStatusMessage()
+        );
+    }
+
+    public function testRequiringAnExistingFunctionDoesNotSkip()
+    {
+        $test   = new RequirementsTest('testExistingFunction');
+        $result = $test->run();
+        $this->assertEquals(0, $result->skippedCount());
+    }
+
+    public function testRequiringAnExistingExtensionDoesNotSkip()
+    {
+        $test   = new RequirementsTest('testExistingExtension');
+        $result = $test->run();
+        $this->assertEquals(0, $result->skippedCount());
+    }
+
+    public function testCurrentWorkingDirectoryIsRestored()
+    {
+        $expectedCwd = getcwd();
+
+        $test = new ChangeCurrentWorkingDirectoryTest('testSomethingThatChangesTheCwd');
+        $test->run();
+
+        $this->assertSame($expectedCwd, getcwd());
+    }
+
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/TestImplementorTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/TestImplementorTest.php
new file mode 100644
index 0000000..503baa5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/TestImplementorTest.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'DoubleTestCase.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Success.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Framework_TestImplementorTest extends PHPUnit_Framework_TestCase
+{
+    protected $test;
+
+    public function __construct()
+    {
+        $this->test = new DoubleTestCase(
+          new Success
+        );
+    }
+
+    public function testSuccessfulRun()
+    {
+        $result = new PHPUnit_Framework_TestResult;
+
+        $this->test->run($result);
+
+        $this->assertEquals(count($this->test), count($result));
+        $this->assertEquals(0, $result->errorCount());
+        $this->assertEquals(0, $result->failureCount());
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Framework/TestListenerTest.php b/core/vendor/phpunit/phpunit/Tests/Framework/TestListenerTest.php
new file mode 100644
index 0000000..7911e7b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Framework/TestListenerTest.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Error.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Failure.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'Success.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Framework_TestListenerTest extends PHPUnit_Framework_TestCase implements PHPUnit_Framework_TestListener
+{
+    protected $endCount;
+    protected $errorCount;
+    protected $failureCount;
+    protected $notImplementedCount;
+    protected $skippedCount;
+    protected $result;
+    protected $startCount;
+
+    public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->errorCount++;
+    }
+
+    public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+    {
+        $this->failureCount++;
+    }
+
+    public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->notImplementedCount++;
+    }
+
+    public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
+    {
+        $this->skippedCount++;
+    }
+
+    public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+    {
+    }
+
+    public function startTest(PHPUnit_Framework_Test $test)
+    {
+        $this->startCount++;
+    }
+
+    public function endTest(PHPUnit_Framework_Test $test, $time)
+    {
+        $this->endCount++;
+    }
+
+    protected function setUp()
+    {
+        $this->result = new PHPUnit_Framework_TestResult;
+        $this->result->addListener($this);
+
+        $this->endCount            = 0;
+        $this->failureCount        = 0;
+        $this->notImplementedCount = 0;
+        $this->skippedCount        = 0;
+        $this->startCount          = 0;
+    }
+
+    public function testError()
+    {
+        $test = new Error;
+        $test->run($this->result);
+
+        $this->assertEquals(1, $this->errorCount);
+        $this->assertEquals(1, $this->endCount);
+    }
+
+    public function testFailure()
+    {
+        $test = new Failure;
+        $test->run($this->result);
+
+        $this->assertEquals(1, $this->failureCount);
+        $this->assertEquals(1, $this->endCount);
+    }
+
+    public function testStartStop()
+    {
+        $test = new Success;
+        $test->run($this->result);
+
+        $this->assertEquals(1, $this->startCount);
+        $this->assertEquals(1, $this->endCount);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/1021.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/1021.phpt
new file mode 100644
index 0000000..b3b9bc7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/1021.phpt
@@ -0,0 +1,19 @@
+--TEST--
+#1021: Depending on a test that uses a data provider does not work
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue1021Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/1021/Issue1021Test.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 1 assertion)
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/1021/Issue1021Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/1021/Issue1021Test.php
new file mode 100644
index 0000000..422d580
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/1021/Issue1021Test.php
@@ -0,0 +1,23 @@
+<?php
+class Issue1021Test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testSomething($data)
+    {
+        $this->assertTrue($data);
+    }
+
+    /**
+     * @depends testSomething
+     */
+    public function testSomethingElse()
+    {
+    }
+
+    public function provider()
+    {
+        return array(array(TRUE));
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/523.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/523.phpt
new file mode 100644
index 0000000..181c945
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/523.phpt
@@ -0,0 +1,19 @@
+--TEST--
+#523: assertAttributeEquals does not work with classes extending ArrayIterator
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue523Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/523/Issue523Test.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (1 test, 1 assertion)
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/523/Issue523Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/523/Issue523Test.php
new file mode 100644
index 0000000..80124f1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/523/Issue523Test.php
@@ -0,0 +1,13 @@
+<?php
+class Issue523Test extends PHPUnit_Framework_TestCase
+{
+    public function testAttributeEquals()
+    {
+        $this->assertAttributeEquals('foo', 'field', new Issue523());
+    }
+};
+
+class Issue523 extends ArrayIterator
+{
+    protected $field = 'foo';
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/578.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/578.phpt
new file mode 100644
index 0000000..d7e29f3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/578.phpt
@@ -0,0 +1,37 @@
+--TEST--
+#578: Double printing of trace line for exceptions from notices and warnings
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue578Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/578/Issue578Test.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+EEE
+
+Time: %i %s, Memory: %sMb
+
+There were 3 errors:
+
+1) Issue578Test::testNoticesDoublePrintStackTrace
+Invalid error type specified
+%s/Issue578Test.php:%i
+%s/578.php:%i
+
+2) Issue578Test::testWarningsDoublePrintStackTrace
+Invalid error type specified
+%s/Issue578Test.php:%i
+%s/578.php:%i
+
+3) Issue578Test::testUnexpectedExceptionsPrintsCorrectly
+Exception: Double printed exception
+%s/Issue578Test.php:%i
+%s/578.php:%i
+
+FAILURES!
+Tests: 3, Assertions: 0, Errors: 3.
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/578/Issue578Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/578/Issue578Test.php
new file mode 100644
index 0000000..262d97f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/578/Issue578Test.php
@@ -0,0 +1,20 @@
+<?php
+class Issue578Test extends PHPUnit_Framework_TestCase
+{
+    public function testNoticesDoublePrintStackTrace()
+    {
+        $this->iniSet('error_reporting', E_ALL | E_NOTICE);
+        trigger_error('Stack Trace Test Notice', E_NOTICE);
+    }
+
+    public function testWarningsDoublePrintStackTrace()
+    {
+        $this->iniSet('error_reporting', E_ALL | E_NOTICE);
+        trigger_error('Stack Trace Test Notice', E_WARNING);
+    }
+
+    public function testUnexpectedExceptionsPrintsCorrectly()
+    {
+        throw new Exception('Double printed exception');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/684.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/684.phpt
new file mode 100644
index 0000000..31b5e5f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/684.phpt
@@ -0,0 +1,26 @@
+--TEST--
+#684: Unable to find test class when no test methods exists
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue684Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/684/Issue684Test.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Warning
+No tests found in class "Foo_Bar_Issue684Test".
+%s/684.php:%i
+
+FAILURES!
+Tests: 1, Assertions: 0, Failures: 1.
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/684/Issue684Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/684/Issue684Test.php
new file mode 100644
index 0000000..e8e5d87
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/684/Issue684Test.php
@@ -0,0 +1,4 @@
+<?php
+class Foo_Bar_Issue684Test extends PHPUnit_Framework_TestCase
+{
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/783.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/783.phpt
new file mode 100644
index 0000000..1de4f1b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/783.phpt
@@ -0,0 +1,21 @@
+--TEST--
+#783: Tests getting executed twice when using multiple groups
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--group';
+$_SERVER['argv'][3] = 'foo,bar';
+$_SERVER['argv'][4] = 'ParentSuite';
+$_SERVER['argv'][5] = dirname(__FILE__).'/783/ParentSuite.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 0 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/783/ChildSuite.php b/core/vendor/phpunit/phpunit/Tests/Regression/783/ChildSuite.php
new file mode 100644
index 0000000..8bac514
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/783/ChildSuite.php
@@ -0,0 +1,15 @@
+<?php
+require_once 'OneTest.php';
+require_once 'TwoTest.php';
+
+class ChildSuite
+{
+    public static function suite()
+    {
+        $suite = new PHPUnit_Framework_TestSuite('Child');
+        $suite->addTestSuite('OneTest');
+        $suite->addTestSuite('TwoTest');
+
+        return $suite;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/783/OneTest.php b/core/vendor/phpunit/phpunit/Tests/Regression/783/OneTest.php
new file mode 100644
index 0000000..3daa91b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/783/OneTest.php
@@ -0,0 +1,10 @@
+<?php
+/**
+* @group foo
+*/
+class OneTest extends PHPUnit_Framework_TestCase
+{
+    public function testSomething()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/783/ParentSuite.php b/core/vendor/phpunit/phpunit/Tests/Regression/783/ParentSuite.php
new file mode 100644
index 0000000..6dd63e2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/783/ParentSuite.php
@@ -0,0 +1,13 @@
+<?php
+require_once 'ChildSuite.php';
+
+class ParentSuite
+{
+    public static function suite()
+    {
+        $suite = new PHPUnit_Framework_TestSuite('Parent');
+        $suite->addTest(ChildSuite::suite());
+
+        return $suite;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/783/TwoTest.php b/core/vendor/phpunit/phpunit/Tests/Regression/783/TwoTest.php
new file mode 100644
index 0000000..8fa9958
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/783/TwoTest.php
@@ -0,0 +1,10 @@
+<?php
+/**
+* @group bar
+*/
+class TwoTest extends PHPUnit_Framework_TestCase
+{
+    public function testSomething()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/244.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/244.phpt
new file mode 100644
index 0000000..97082ac
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/244.phpt
@@ -0,0 +1,40 @@
+--TEST--
+GH-244: Expected Exception should support string codes
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'Issue244Test';
+$_SERVER['argv'][4] = dirname(__FILE__).'/244/Issue244Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.FFF
+
+Time: %i %s, Memory: %sMb
+
+There were 3 failures:
+
+1) Issue244Test::testFails
+Failed asserting that '123StringCode' is equal to expected exception code 'OtherString'.
+
+%s:%i
+
+2) Issue244Test::testFailsTooIfExpectationIsANumber
+Failed asserting that '123StringCode' is equal to expected exception code 123.
+
+%s:%i
+
+3) Issue244Test::testFailsTooIfExceptionCodeIsANumber
+Failed asserting that 123 is equal to expected exception code '123String'.
+
+%s:%i
+
+FAILURES!
+Tests: 4, Assertions: 8, Failures: 3.
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/244/Issue244Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/244/Issue244Test.php
new file mode 100644
index 0000000..621c4cf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/244/Issue244Test.php
@@ -0,0 +1,55 @@
+<?php
+class Issue244Test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @expectedException Issue244Exception
+     * @expectedExceptionCode 123StringCode
+     */
+    public function testWorks()
+    {
+        throw new Issue244Exception;
+    }
+
+    /**
+     * @expectedException Issue244Exception
+     * @expectedExceptionCode OtherString
+     */
+    public function testFails()
+    {
+        throw new Issue244Exception;
+    }
+
+    /**
+     * @expectedException Issue244Exception
+     * @expectedExceptionCode 123
+     */
+    public function testFailsTooIfExpectationIsANumber()
+    {
+        throw new Issue244Exception;
+    }
+
+    /**
+     * @expectedException Issue244ExceptionIntCode
+     * @expectedExceptionCode 123String
+     */
+    public function testFailsTooIfExceptionCodeIsANumber()
+    {
+        throw new Issue244ExceptionIntCode;
+    }
+}
+
+class Issue244Exception extends Exception
+{
+    public function __construct()
+    {
+        $this->code = '123StringCode';
+    }
+}
+
+class Issue244ExceptionIntCode extends Exception
+{
+    public function __construct()
+    {
+        $this->code = 123;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322.phpt
new file mode 100644
index 0000000..ef826ac
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322.phpt
@@ -0,0 +1,28 @@
+--TEST--
+GH-322: group commandline option should override group/exclude setting in phpunit.xml
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--configuration';
+$_SERVER['argv'][2] = dirname(__FILE__).'/322/phpunit322.xml';
+$_SERVER['argv'][3] = '--debug';
+$_SERVER['argv'][4] = '--group';
+$_SERVER['argv'][5] = 'one';
+$_SERVER['argv'][6] = 'Issue322Test';
+$_SERVER['argv'][7] = dirname(__FILE__).'/322/Issue322Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+Configuration read from %s
+
+
+Starting test 'Issue322Test::testOne'.
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (1 test, 0 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322/Issue322Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322/Issue322Test.php
new file mode 100644
index 0000000..618bcaa
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322/Issue322Test.php
@@ -0,0 +1,17 @@
+<?php
+class Issue322Test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @group one
+     */
+    public function testOne()
+    {
+    }
+
+    /**
+     * @group two
+     */
+    public function testTwo()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322/phpunit322.xml b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322/phpunit322.xml
new file mode 100644
index 0000000..5a95002
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/322/phpunit322.xml
@@ -0,0 +1,11 @@
+<phpunit>
+  <testsuite name="My Test Suite">
+    <file>Test.php</file>
+  </testsuite>
+
+  <groups>
+    <exclude>
+      <group>one</group>
+    </exclude>
+  </groups>
+</phpunit>
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/433.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/433.phpt
new file mode 100644
index 0000000..876efce
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/433.phpt
@@ -0,0 +1,34 @@
+--TEST--
+GH-433: expectOutputString not completely working as expected
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue433Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/433/Issue433Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Issue433Test::testNotMatchingOutput
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+-'foo'
++'bar'
+
+%s:%i
+
+FAILURES!
+Tests: 3, Assertions: 3, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/433/Issue433Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/433/Issue433Test.php
new file mode 100644
index 0000000..e0a91b3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/433/Issue433Test.php
@@ -0,0 +1,21 @@
+<?php
+class Issue433Test extends PHPUnit_Framework_TestCase
+{
+    public function testOutputWithExpectationBefore()
+    {
+        $this->expectOutputString('test');
+        print 'test';
+    }
+
+    public function testOutputWithExpectationAfter()
+    {
+        print 'test';
+        $this->expectOutputString('test');
+    }
+
+    public function testNotMatchingOutput()
+    {
+        print 'bar';
+        $this->expectOutputString('foo');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/445.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/445.phpt
new file mode 100644
index 0000000..b35a912
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/445.phpt
@@ -0,0 +1,35 @@
+--TEST--
+GH-455: expectOutputString not working in strict mode
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--strict';
+$_SERVER['argv'][3] = 'Issue445Test';
+$_SERVER['argv'][4] = dirname(__FILE__).'/445/Issue445Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Issue445Test::testNotMatchingOutput
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+-'foo'
++'bar'
+
+%s:%i
+
+FAILURES!
+Tests: 3, Assertions: 3, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/445/Issue445Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/445/Issue445Test.php
new file mode 100644
index 0000000..c309025
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/445/Issue445Test.php
@@ -0,0 +1,21 @@
+<?php
+class Issue445Test extends PHPUnit_Framework_TestCase
+{
+    public function testOutputWithExpectationBefore()
+    {
+        $this->expectOutputString('test');
+        print 'test';
+    }
+
+    public function testOutputWithExpectationAfter()
+    {
+        print 'test';
+        $this->expectOutputString('test');
+    }
+
+    public function testNotMatchingOutput()
+    {
+        print 'bar';
+        $this->expectOutputString('foo');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/503.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/503.phpt
new file mode 100644
index 0000000..3ccff27
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/503.phpt
@@ -0,0 +1,34 @@
+--TEST--
+GH-503: assertEquals() Line Ending Differences Are Obscure
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue503Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/503/Issue503Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Issue503Test::testCompareDifferentLineEndings
+Failed asserting that two strings are identical.
+--- Expected
++++ Actual
+@@ @@
+ #Warning: Strings contain different line endings!
+ foo
+
+%s:%i
+
+FAILURES!
+Tests: 1, Assertions: 1, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/503/Issue503Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/503/Issue503Test.php
new file mode 100644
index 0000000..75ca8d4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/503/Issue503Test.php
@@ -0,0 +1,11 @@
+<?php
+class Issue503Test extends PHPUnit_Framework_TestCase
+{
+    public function testCompareDifferentLineEndings()
+    {
+        $this->assertSame(
+            "foo\n",
+            "foo\r\n"
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/581.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/581.phpt
new file mode 100644
index 0000000..9e6f304
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/581.phpt
@@ -0,0 +1,43 @@
+--TEST--
+GH-581: PHPUnit_Util_Type::export adds extra newlines in Windows
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue581Test';
+$_SERVER['argv'][3] = dirname(__FILE__).'/581/Issue581Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Issue581Test::testExportingObjectsDoesNotBreakWindowsLineFeeds
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+     0 => 1
+     1 => 2
+     2 => 'Test\n'
+     3 => 4
+-    4 => 5
++    4 => 1
+     5 => 6
+     6 => 7
+     7 => 8
+ )
+
+%s:%i
+
+FAILURES!
+Tests: 1, Assertions: 1, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/581/Issue581Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/581/Issue581Test.php
new file mode 100644
index 0000000..201780c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/581/Issue581Test.php
@@ -0,0 +1,10 @@
+<?php
+class Issue581Test extends PHPUnit_Framework_TestCase
+{
+    public function testExportingObjectsDoesNotBreakWindowsLineFeeds() {
+        $this->assertEquals(
+            (object)array(1,2,"Test\r\n",4,5,6,7,8),
+            (object)array(1,2,"Test\r\n",4,1,6,7,8)
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74.phpt b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74.phpt
new file mode 100644
index 0000000..851dfb2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74.phpt
@@ -0,0 +1,31 @@
+--TEST--
+GH-74: catchable fatal error in 3.5
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'Issue74Test';
+$_SERVER['argv'][4] = dirname(__FILE__).'/74/Issue74Test.php';
+
+require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+E
+
+Time: %i %s, Memory: %sMb
+
+There was 1 error:
+
+1) Issue74Test::testCreateAndThrowNewExceptionInProcessIsolation
+NewException: Testing GH-74
+
+%s/Tests/Regression/GitHub/74/Issue74Test.php:7
+%s
+
+FAILURES!
+Tests: 1, Assertions: 0, Errors: 1.
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74/Issue74Test.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74/Issue74Test.php
new file mode 100644
index 0000000..4d68c55
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74/Issue74Test.php
@@ -0,0 +1,9 @@
+<?php
+class Issue74Test extends PHPUnit_Framework_TestCase
+{
+    public function testCreateAndThrowNewExceptionInProcessIsolation()
+    {
+        require_once __DIR__ . '/NewException.php';
+        throw new NewException('Testing GH-74');
+    }
+}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74/NewException.php b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74/NewException.php
new file mode 100644
index 0000000..e81c0b5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Regression/GitHub/74/NewException.php
@@ -0,0 +1,4 @@
+<?php
+class NewException extends Exception
+{
+}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/Runner/BaseTestRunnerTest.php b/core/vendor/phpunit/phpunit/Tests/Runner/BaseTestRunnerTest.php
new file mode 100644
index 0000000..0b19282
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Runner/BaseTestRunnerTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.0.0
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MockRunner.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'NonStatic.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.0.0
+ */
+class Runner_BaseTestRunnerTest extends PHPUnit_Framework_TestCase
+{
+    public function testInvokeNonStaticSuite()
+    {
+        $runner = new MockRunner;
+        $runner->getTest('NonStatic');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/abstract-test-class.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/abstract-test-class.phpt
new file mode 100644
index 0000000..9f114bb
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/abstract-test-class.phpt
@@ -0,0 +1,29 @@
+--TEST--
+phpunit AbstractTest ../_files/AbstractTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'AbstractTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/AbstractTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Warning
+Cannot instantiate class "AbstractTest".
+%s/abstract-test-class.php:%i
+
+FAILURES!
+Tests: 1, Assertions: 0, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/concrete-test-class.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/concrete-test-class.phpt
new file mode 100644
index 0000000..a46e9c4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/concrete-test-class.phpt
@@ -0,0 +1,22 @@
+--TEST--
+phpunit ConcreteTest ../_files/ConcreteTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'ConcreteTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/ConcreteTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 0 assertions)
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-log-xml-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-log-xml-isolation.phpt
new file mode 100644
index 0000000..1d34333
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-log-xml-isolation.phpt
@@ -0,0 +1,49 @@
+--TEST--
+phpunit --process-isolation --log-junit php://stdout DataProviderTest ../_files/DataProviderTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = '--log-junit';
+$_SERVER['argv'][4] = 'php://stdout';
+$_SERVER['argv'][5] = 'DataProviderTest';
+$_SERVER['argv'][6] = dirname(dirname(__FILE__)) . '/_files/DataProviderTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..F.<?xml version="1.0" encoding="UTF-8"?>
+<testsuites>
+  <testsuite name="DataProviderTest" file="%s/DataProviderTest.php" tests="4" assertions="4" failures="1" errors="0" time="%f">
+    <testsuite name="DataProviderTest::testAdd" tests="4" assertions="4" failures="1" errors="0" time="%f">
+      <testcase name="testAdd with data set #0" assertions="1" time="%f"/>
+      <testcase name="testAdd with data set #1" assertions="1" time="%f"/>
+      <testcase name="testAdd with data set #2" assertions="1" time="%f">
+        <failure type="PHPUnit_Framework_ExpectationFailedException">DataProviderTest::testAdd with data set #2 (1, 1, 3)
+Failed asserting that 2 matches expected 3.
+
+%s:%i
+</failure>
+      </testcase>
+      <testcase name="testAdd with data set #3" assertions="1" time="%f"/>
+    </testsuite>
+  </testsuite>
+</testsuites>
+
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) DataProviderTest::testAdd with data set #2 (1, 1, 3)
+Failed asserting that 2 matches expected 3.
+%s:%i
+
+FAILURES!
+Tests: 4, Assertions: 4, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-log-xml.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-log-xml.phpt
new file mode 100644
index 0000000..ce91753
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-log-xml.phpt
@@ -0,0 +1,50 @@
+--TEST--
+phpunit --log-junit php://stdout DataProviderTest ../_files/DataProviderTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--log-junit';
+$_SERVER['argv'][3] = 'php://stdout';
+$_SERVER['argv'][4] = 'DataProviderTest';
+$_SERVER['argv'][5] = dirname(dirname(__FILE__)) . '/_files/DataProviderTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..F.<?xml version="1.0" encoding="UTF-8"?>
+<testsuites>
+  <testsuite name="DataProviderTest" file="%s/DataProviderTest.php" tests="4" assertions="4" failures="1" errors="0" time="%f">
+    <testsuite name="DataProviderTest::testAdd" tests="4" assertions="4" failures="1" errors="0" time="%f">
+      <testcase name="testAdd with data set #0" assertions="1" time="%f"/>
+      <testcase name="testAdd with data set #1" assertions="1" time="%f"/>
+      <testcase name="testAdd with data set #2" assertions="1" time="%f">
+        <failure type="PHPUnit_Framework_ExpectationFailedException">DataProviderTest::testAdd with data set #2 (1, 1, 3)
+Failed asserting that 2 matches expected 3.
+
+%s:%i
+%s:%i
+</failure>
+      </testcase>
+      <testcase name="testAdd with data set #3" assertions="1" time="%f"/>
+    </testsuite>
+  </testsuite>
+</testsuites>
+
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) DataProviderTest::testAdd with data set #2 (1, 1, 3)
+Failed asserting that 2 matches expected 3.
+%s:%i
+%s:%i
+
+FAILURES!
+Tests: 4, Assertions: 4, Failures: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-testdox.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-testdox.phpt
new file mode 100644
index 0000000..a9f6084
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dataprovider-testdox.phpt
@@ -0,0 +1,19 @@
+--TEST--
+phpunit --testdox DataProviderTest ../_files/DataProviderTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--testdox';
+$_SERVER['argv'][3] = 'DataProviderTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/DataProviderTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+DataProvider
+ [ ] Add
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/debug.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/debug.phpt
new file mode 100644
index 0000000..842c59d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/debug.phpt
@@ -0,0 +1,28 @@
+--TEST--
+phpunit --debug BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--debug';
+$_SERVER['argv'][3] = 'BankAccountTest';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+
+Starting test 'BankAccountTest::testBalanceIsInitiallyZero'.
+.
+Starting test 'BankAccountTest::testBalanceCannotBecomeNegative'.
+.
+Starting test 'BankAccountTest::testBalanceCannotBecomeNegative2'.
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/default-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/default-isolation.phpt
new file mode 100644
index 0000000..a18cbe5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/default-isolation.phpt
@@ -0,0 +1,22 @@
+--TEST--
+phpunit --process-isolation BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'BankAccountTest';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/default.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/default.phpt
new file mode 100644
index 0000000..9e010ed
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/default.phpt
@@ -0,0 +1,21 @@
+--TEST--
+phpunit BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'BankAccountTest';
+$_SERVER['argv'][3] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies-isolation.phpt
new file mode 100644
index 0000000..f03170a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies-isolation.phpt
@@ -0,0 +1,42 @@
+--TEST--
+phpunit --process-isolation --verbose DependencyTestSuite ../_files/DependencyTestSuite.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = '--verbose';
+$_SERVER['argv'][4] = 'DependencyTestSuite';
+$_SERVER['argv'][5] = dirname(dirname(__FILE__)) . '/_files/DependencyTestSuite.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...FSS
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) DependencyFailureTest::testOne
+
+%s:%i
+
+There were 2 skipped tests:
+
+1) DependencyFailureTest::testTwo
+This test depends on "DependencyFailureTest::testOne" to pass.
+
+%s:%i
+
+2) DependencyFailureTest::testThree
+This test depends on "DependencyFailureTest::testTwo" to pass.
+
+%s:%i
+
+FAILURES!
+Tests: 4, Assertions: 0, Failures: 1, Skipped: 2.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies.phpt
new file mode 100644
index 0000000..39dd9be
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies.phpt
@@ -0,0 +1,42 @@
+--TEST--
+phpunit --verbose DependencyTestSuite ../_files/DependencyTestSuite.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--verbose';
+$_SERVER['argv'][3] = 'DependencyTestSuite';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/DependencyTestSuite.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...FSS
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) DependencyFailureTest::testOne
+
+%s:%i
+%s:%i
+
+There were 2 skipped tests:
+
+1) DependencyFailureTest::testTwo
+This test depends on "DependencyFailureTest::testOne" to pass.
+
+%s:%i
+
+2) DependencyFailureTest::testThree
+This test depends on "DependencyFailureTest::testTwo" to pass.
+
+%s:%i
+
+FAILURES!
+Tests: 4, Assertions: 0, Failures: 1, Skipped: 2.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies2-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies2-isolation.phpt
new file mode 100644
index 0000000..5f94657
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies2-isolation.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --process-isolation StackTest ../_files/StackTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'StackTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/StackTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 5 assertions)
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies2.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies2.phpt
new file mode 100644
index 0000000..92c109e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies2.phpt
@@ -0,0 +1,22 @@
+--TEST--
+phpunit StackTest ../_files/StackTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'StackTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/StackTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 5 assertions)
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies3-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies3-isolation.phpt
new file mode 100644
index 0000000..5191dc9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies3-isolation.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --process-isolation MultiDependencyTest ../_files/MultiDependencyTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'MultiDependencyTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/MultiDependencyTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 2 assertions)
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies3.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies3.phpt
new file mode 100644
index 0000000..562b8e4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/dependencies3.phpt
@@ -0,0 +1,21 @@
+--TEST--
+phpunit MultiDependencyTest ../_files/MultiDependencyTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'MultiDependencyTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/MultiDependencyTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 2 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/empty-testcase.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/empty-testcase.phpt
new file mode 100644
index 0000000..d8e4a64
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/empty-testcase.phpt
@@ -0,0 +1,29 @@
+--TEST--
+phpunit EmptyTestCaseTest ../_files/EmptyTestCaseTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'EmptyTestCaseTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/EmptyTestCaseTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+F
+
+Time: %i %s, Memory: %sMb
+
+There was 1 failure:
+
+1) Warning
+No tests found in class "EmptyTestCaseTest".
+
+%s:%i
+
+FAILURES!
+Tests: 1, Assertions: 0, Failures: 1.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/exception-stack.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/exception-stack.phpt
new file mode 100644
index 0000000..9f3704d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/exception-stack.phpt
@@ -0,0 +1,55 @@
+--TEST--
+phpunit ExceptionStackTest ../_files/ExceptionStack.php
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'ExceptionStackTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/ExceptionStack.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+EE
+
+Time: %i %s, Memory: %sMb
+
+There were 2 errors:
+
+1) ExceptionStackTest::testPrintingChildException
+ExceptionStackTestException: Child exception
+message
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => 1
++    0 => 2
+ )
+
+%s:%i
+
+Caused by
+%s:%i
+
+2) ExceptionStackTest::testNestedExceptions
+Exception: One
+
+%s:%i
+
+Caused by
+InvalidArgumentException: Two
+
+%s:%i
+
+Caused by
+Exception: Three
+
+%s:%i
+
+FAILURES!
+Tests: 2, Assertions: 1, Errors: 2.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/exclude-group-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/exclude-group-isolation.phpt
new file mode 100644
index 0000000..c8ebbce
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/exclude-group-isolation.phpt
@@ -0,0 +1,24 @@
+--TEST--
+phpunit --process-isolation --exclude-group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = '--exclude-group';
+$_SERVER['argv'][4] = 'balanceIsInitiallyZero';
+$_SERVER['argv'][5] = 'BankAccountTest';
+$_SERVER['argv'][6] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 2 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/exclude-group.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/exclude-group.phpt
new file mode 100644
index 0000000..fa88b5e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/exclude-group.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --exclude-group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--exclude-group';
+$_SERVER['argv'][3] = 'balanceIsInitiallyZero';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+..
+
+Time: %i %s, Memory: %sMb
+
+OK (2 tests, 2 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/failure-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/failure-isolation.phpt
new file mode 100644
index 0000000..1f78cd7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/failure-isolation.phpt
@@ -0,0 +1,144 @@
+--TEST--
+phpunit --process-isolation FailureTest ../_files/FailureTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'FailureTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/FailureTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+FFFFFFFFFFFFF
+
+Time: %i %s, Memory: %sMb
+
+There were 13 failures:
+
+1) FailureTest::testAssertArrayEqualsArray
+message
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => 1
++    0 => 2
+ )
+
+%s:%i
+
+2) FailureTest::testAssertIntegerEqualsInteger
+message
+Failed asserting that 2 matches expected 1.
+
+%s:%i
+
+3) FailureTest::testAssertObjectEqualsObject
+message
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+-    'foo' => 'bar'
++    'bar' => 'foo'
+ )
+
+%s:%i
+
+4) FailureTest::testAssertNullEqualsString
+message
+Failed asserting that 'bar' matches expected null.
+
+%s:%i
+
+5) FailureTest::testAssertStringEqualsString
+message
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+-'foo'
++'bar'
+
+%s:%i
+
+6) FailureTest::testAssertTextEqualsText
+message
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+ 'foo
+-bar
++baz
+ '
+
+%s:%i
+
+7) FailureTest::testAssertStringMatchesFormat
+message
+Failed asserting that format description matches text.
+--- Expected
++++ Actual
+@@ @@
+-*%s*
++**
+
+%s:%i
+
+8) FailureTest::testAssertNumericEqualsNumeric
+message
+Failed asserting that 2 matches expected 1.
+
+%s:%i
+
+9) FailureTest::testAssertTextSameText
+message
+Failed asserting that two strings are identical.
+--- Expected
++++ Actual
+@@ @@
+-foo
++bar
+
+%s:%i
+
+10) FailureTest::testAssertObjectSameObject
+message
+Failed asserting that two variables reference the same object.
+
+%s:%i
+
+11) FailureTest::testAssertObjectSameNull
+message
+Failed asserting that null is identical to an object of class "stdClass".
+
+%s:%i
+
+12) FailureTest::testAssertFloatSameFloat
+message
+Failed asserting that 1.5 is identical to 1.0.
+
+%s:%i
+
+13) FailureTest::testAssertStringMatchesFormatFile
+Failed asserting that format description matches text.
+--- Expected
++++ Actual
+@@ @@
+-FOO
+-
++...BAR...
+
+%s:%i
+
+FAILURES!
+Tests: 13, Assertions: 14, Failures: 13.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/failure.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/failure.phpt
new file mode 100644
index 0000000..a341865
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/failure.phpt
@@ -0,0 +1,144 @@
+--TEST--
+phpunit FailureTest ../_files/FailureTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'FailureTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/FailureTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+FFFFFFFFFFFFF
+
+Time: %i %s, Memory: %sMb
+
+There were 13 failures:
+
+1) FailureTest::testAssertArrayEqualsArray
+message
+Failed asserting that two arrays are equal.
+--- Expected
++++ Actual
+@@ @@
+ Array (
+-    0 => 1
++    0 => 2
+ )
+
+%s:%i
+
+2) FailureTest::testAssertIntegerEqualsInteger
+message
+Failed asserting that 2 matches expected 1.
+
+%s:%i
+
+3) FailureTest::testAssertObjectEqualsObject
+message
+Failed asserting that two objects are equal.
+--- Expected
++++ Actual
+@@ @@
+ stdClass Object (
+-    'foo' => 'bar'
++    'bar' => 'foo'
+ )
+
+%s:%i
+
+4) FailureTest::testAssertNullEqualsString
+message
+Failed asserting that 'bar' matches expected null.
+
+%s:%i
+
+5) FailureTest::testAssertStringEqualsString
+message
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+-'foo'
++'bar'
+
+%s:%i
+
+6) FailureTest::testAssertTextEqualsText
+message
+Failed asserting that two strings are equal.
+--- Expected
++++ Actual
+@@ @@
+ 'foo
+-bar
++baz
+ '
+
+%s:%i
+
+7) FailureTest::testAssertStringMatchesFormat
+message
+Failed asserting that format description matches text.
+--- Expected
++++ Actual
+@@ @@
+-*%s*
++**
+
+%s:%i
+
+8) FailureTest::testAssertNumericEqualsNumeric
+message
+Failed asserting that 2 matches expected 1.
+
+%s:%i
+
+9) FailureTest::testAssertTextSameText
+message
+Failed asserting that two strings are identical.
+--- Expected
++++ Actual
+@@ @@
+-foo
++bar
+
+%s:%i
+
+10) FailureTest::testAssertObjectSameObject
+message
+Failed asserting that two variables reference the same object.
+
+%s:%i
+
+11) FailureTest::testAssertObjectSameNull
+message
+Failed asserting that null is identical to an object of class "stdClass".
+
+%s:%i
+
+12) FailureTest::testAssertFloatSameFloat
+message
+Failed asserting that 1.5 is identical to 1.0.
+
+%s:%i
+
+13) FailureTest::testAssertStringMatchesFormatFile
+Failed asserting that format description matches text.
+--- Expected
++++ Actual
+@@ @@
+-FOO
+-
++...BAR...
+
+%s:%i
+
+FAILURES!
+Tests: 13, Assertions: 14, Failures: 13.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/fatal-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/fatal-isolation.phpt
new file mode 100644
index 0000000..bc8cf1d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/fatal-isolation.phpt
@@ -0,0 +1,35 @@
+--TEST--
+phpunit FatalTest ../_files/FatalTest.php
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = 'FatalTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/FatalTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+E
+
+Time: %i %s, Memory: %sMb
+
+There was 1 error:
+
+1) FatalTest::testFatalError
+PHPUnit_Framework_Exception: Fatal error: Call to undefined function non_existing_function() in %s
+
+%s:%i
+
+Caused by
+ErrorException: unserialize(): Error at offset %i of %i bytes
+
+%s:%i
+
+FAILURES!
+Tests: 1, Assertions: 0, Errors: 1.
+
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/fatal.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/fatal.phpt
new file mode 100644
index 0000000..da19557
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/fatal.phpt
@@ -0,0 +1,17 @@
+--TEST--
+phpunit FatalTest ../_files/FatalTest.php
+--FILE--
+<?php
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'FatalTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/FatalTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+
+Fatal error: Call to undefined function non_existing_function() in %s
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/filter-class-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-class-isolation.phpt
new file mode 100644
index 0000000..85fff4e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-class-isolation.phpt
@@ -0,0 +1,24 @@
+--TEST--
+phpunit --process-isolation --filter BankAccountTest BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = '--filter';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = 'BankAccountTest';
+$_SERVER['argv'][6] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/filter-class.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-class.phpt
new file mode 100644
index 0000000..459cf28
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-class.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --filter BankAccountTest BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--filter';
+$_SERVER['argv'][3] = 'BankAccountTest';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/filter-method-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-method-isolation.phpt
new file mode 100644
index 0000000..aede555
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-method-isolation.phpt
@@ -0,0 +1,24 @@
+--TEST--
+phpunit --process-isolation --filter testBalanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = '--filter';
+$_SERVER['argv'][4] = 'testBalanceIsInitiallyZero';
+$_SERVER['argv'][5] = 'BankAccountTest';
+$_SERVER['argv'][6] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (1 test, 1 assertion)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/filter-method.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-method.phpt
new file mode 100644
index 0000000..e553a03
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-method.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --filter testBalanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--filter';
+$_SERVER['argv'][3] = 'testBalanceIsInitiallyZero';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (1 test, 1 assertion)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/filter-no-results.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-no-results.phpt
new file mode 100644
index 0000000..03f6995
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/filter-no-results.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --filter testBalanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--filter';
+$_SERVER['argv'][3] = 'doesNotExist';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+
+
+Time: %i %s, Memory: %sMb
+
+No tests executed!
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/group-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/group-isolation.phpt
new file mode 100644
index 0000000..5abbada
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/group-isolation.phpt
@@ -0,0 +1,24 @@
+--TEST--
+phpunit --process-isolation --group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--process-isolation';
+$_SERVER['argv'][3] = '--group';
+$_SERVER['argv'][4] = 'balanceIsInitiallyZero';
+$_SERVER['argv'][5] = 'BankAccountTest';
+$_SERVER['argv'][6] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (1 test, 1 assertion)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/group.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/group.phpt
new file mode 100644
index 0000000..77003f2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/group.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --group balanceIsInitiallyZero BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--group';
+$_SERVER['argv'][3] = 'balanceIsInitiallyZero';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.
+
+Time: %i %s, Memory: %sMb
+
+OK (1 test, 1 assertion)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/help.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/help.phpt
new file mode 100644
index 0000000..7a5ce43
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/help.phpt
@@ -0,0 +1,67 @@
+--TEST--
+phpunit
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+Usage: phpunit [switches] UnitTest [UnitTest.php]
+       phpunit [switches] <directory>
+
+  --log-junit <file>        Log test execution in JUnit XML format to file.
+  --log-tap <file>          Log test execution in TAP format to file.
+  --log-json <file>         Log test execution in JSON format.
+
+  --coverage-clover <file>  Generate code coverage report in Clover XML format.
+  --coverage-html <dir>     Generate code coverage report in HTML format.
+  --coverage-php <file>     Serialize PHP_CodeCoverage object to file.
+  --coverage-text=<file>    Generate code coverage report in text format.
+                            Default to writing to the standard output.
+
+  --testdox-html <file>     Write agile documentation in HTML format to file.
+  --testdox-text <file>     Write agile documentation in Text format to file.
+
+  --filter <pattern>        Filter which tests to run.
+  --testsuite <pattern>     Filter which testsuite to run.
+  --group ...               Only runs tests from the specified group(s).
+  --exclude-group ...       Exclude tests from the specified group(s).
+  --list-groups             List available test groups.
+  --test-suffix ...         Only search for test in files with specified
+                            suffix(es). Default: Test.php,.phpt
+
+  --loader <loader>         TestSuiteLoader implementation to use.
+  --printer <printer>       TestSuiteListener implementation to use.
+  --repeat <times>          Runs the test(s) repeatedly.
+
+  --tap                     Report test execution progress in TAP format.
+  --testdox                 Report test execution progress in TestDox format.
+
+  --colors                  Use colors in output.
+  --stderr                  Write to STDERR instead of STDOUT.
+  --stop-on-error           Stop execution upon first error.
+  --stop-on-failure         Stop execution upon first error or failure.
+  --stop-on-skipped         Stop execution upon first skipped test.
+  --stop-on-incomplete      Stop execution upon first incomplete test.
+  --strict                  Run tests in strict mode.
+  -v|--verbose              Output more verbose information.
+  --debug                   Display debugging information during test execution.
+
+  --process-isolation       Run each test in a separate PHP process.
+  --no-globals-backup       Do not backup and restore $GLOBALS for each test.
+  --static-backup           Backup and restore static attributes for each test.
+
+  --bootstrap <file>        A "bootstrap" PHP file that is run before the tests.
+  -c|--configuration <file> Read configuration from XML file.
+  --no-configuration        Ignore default configuration file (phpunit.xml).
+  --include-path <path(s)>  Prepend PHP's include_path with given path(s).
+  -d key[=value]            Sets a php.ini value.
+
+  -h|--help                 Prints this usage information.
+  --version                 Prints the version and exits.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/help2.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/help2.phpt
new file mode 100644
index 0000000..9f3d309
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/help2.phpt
@@ -0,0 +1,68 @@
+--TEST--
+phpunit --help
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--help';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+Usage: phpunit [switches] UnitTest [UnitTest.php]
+       phpunit [switches] <directory>
+
+  --log-junit <file>        Log test execution in JUnit XML format to file.
+  --log-tap <file>          Log test execution in TAP format to file.
+  --log-json <file>         Log test execution in JSON format.
+
+  --coverage-clover <file>  Generate code coverage report in Clover XML format.
+  --coverage-html <dir>     Generate code coverage report in HTML format.
+  --coverage-php <file>     Serialize PHP_CodeCoverage object to file.
+  --coverage-text=<file>    Generate code coverage report in text format.
+                            Default to writing to the standard output.
+
+  --testdox-html <file>     Write agile documentation in HTML format to file.
+  --testdox-text <file>     Write agile documentation in Text format to file.
+
+  --filter <pattern>        Filter which tests to run.
+  --testsuite <pattern>     Filter which testsuite to run.
+  --group ...               Only runs tests from the specified group(s).
+  --exclude-group ...       Exclude tests from the specified group(s).
+  --list-groups             List available test groups.
+  --test-suffix ...         Only search for test in files with specified
+                            suffix(es). Default: Test.php,.phpt
+
+  --loader <loader>         TestSuiteLoader implementation to use.
+  --printer <printer>       TestSuiteListener implementation to use.
+  --repeat <times>          Runs the test(s) repeatedly.
+
+  --tap                     Report test execution progress in TAP format.
+  --testdox                 Report test execution progress in TestDox format.
+
+  --colors                  Use colors in output.
+  --stderr                  Write to STDERR instead of STDOUT.
+  --stop-on-error           Stop execution upon first error.
+  --stop-on-failure         Stop execution upon first error or failure.
+  --stop-on-skipped         Stop execution upon first skipped test.
+  --stop-on-incomplete      Stop execution upon first incomplete test.
+  --strict                  Run tests in strict mode.
+  -v|--verbose              Output more verbose information.
+  --debug                   Display debugging information during test execution.
+
+  --process-isolation       Run each test in a separate PHP process.
+  --no-globals-backup       Do not backup and restore $GLOBALS for each test.
+  --static-backup           Backup and restore static attributes for each test.
+
+  --bootstrap <file>        A "bootstrap" PHP file that is run before the tests.
+  -c|--configuration <file> Read configuration from XML file.
+  --no-configuration        Ignore default configuration file (phpunit.xml).
+  --include-path <path(s)>  Prepend PHP's include_path with given path(s).
+  -d key[=value]            Sets a php.ini value.
+
+  -h|--help                 Prints this usage information.
+  --version                 Prints the version and exits.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/list-groups.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/list-groups.phpt
new file mode 100644
index 0000000..5b07ed0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/list-groups.phpt
@@ -0,0 +1,22 @@
+--TEST--
+phpunit --list-groups BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--list-groups';
+$_SERVER['argv'][3] = 'BankAccountTest';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+Available test group(s):
+ - Sebastian Bergmann <sebastian@phpunit.de>
+ - balanceCannotBecomeNegative
+ - balanceIsInitiallyZero
+ - specification
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/log-json.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/log-json.phpt
new file mode 100644
index 0000000..dcc348e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/log-json.phpt
@@ -0,0 +1,77 @@
+--TEST--
+phpunit --log-json php://stdout BankAccountTest ../_files/BankAccountTest.php
+--SKIPIF--
+<?php
+if (!defined("JSON_PRETTY_PRINT")) {
+    echo "Skip: Test requires JSON_PRETTY_PRINT / PHP >= 5.4";
+}
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--log-json';
+$_SERVER['argv'][3] = 'php://stdout';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+{
+    "event": "suiteStart",
+    "suite": "BankAccountTest",
+    "tests": 3
+}{
+    "event": "testStart",
+    "suite": "BankAccountTest",
+    "test": "BankAccountTest::testBalanceIsInitiallyZero"
+}.{
+    "event": "test",
+    "suite": "BankAccountTest",
+    "test": "BankAccountTest::testBalanceIsInitiallyZero",
+    "status": "pass",
+    "time": %f,
+    "trace": [
+
+    ],
+    "message": "",
+    "output": ""
+}{
+    "event": "testStart",
+    "suite": "BankAccountTest",
+    "test": "BankAccountTest::testBalanceCannotBecomeNegative"
+}.{
+    "event": "test",
+    "suite": "BankAccountTest",
+    "test": "BankAccountTest::testBalanceCannotBecomeNegative",
+    "status": "pass",
+    "time": %f,
+    "trace": [
+
+    ],
+    "message": "",
+    "output": ""
+}{
+    "event": "testStart",
+    "suite": "BankAccountTest",
+    "test": "BankAccountTest::testBalanceCannotBecomeNegative2"
+}.{
+    "event": "test",
+    "suite": "BankAccountTest",
+    "test": "BankAccountTest::testBalanceCannotBecomeNegative2",
+    "status": "pass",
+    "time": %f,
+    "trace": [
+
+    ],
+    "message": "",
+    "output": ""
+}
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/log-tap.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/log-tap.phpt
new file mode 100644
index 0000000..1d965a2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/log-tap.phpt
@@ -0,0 +1,28 @@
+--TEST--
+phpunit --log-tap php://stdout BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--log-tap';
+$_SERVER['argv'][3] = 'php://stdout';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+TAP version 13
+.ok 1 - BankAccountTest::testBalanceIsInitiallyZero
+.ok 2 - BankAccountTest::testBalanceCannotBecomeNegative
+.ok 3 - BankAccountTest::testBalanceCannotBecomeNegative2
+1..3
+
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/log-xml.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/log-xml.phpt
new file mode 100644
index 0000000..977f9c8
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/log-xml.phpt
@@ -0,0 +1,31 @@
+--TEST--
+phpunit --log-junit php://stdout BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--log-junit';
+$_SERVER['argv'][3] = 'php://stdout';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...<?xml version="1.0" encoding="UTF-8"?>
+<testsuites>
+  <testsuite name="BankAccountTest" file="%sBankAccountTest.php" fullPackage="PHPUnit" package="PHPUnit" tests="3" assertions="3" failures="0" errors="0" time="%f">
+    <testcase name="testBalanceIsInitiallyZero" class="BankAccountTest" file="%sBankAccountTest.php" line="73" assertions="1" time="%f"/>
+    <testcase name="testBalanceCannotBecomeNegative" class="BankAccountTest" file="%sBankAccountTest.php" line="83" assertions="1" time="%f"/>
+    <testcase name="testBalanceCannotBecomeNegative2" class="BankAccountTest" file="%sBankAccountTest.php" line="103" assertions="1" time="%f"/>
+  </testsuite>
+</testsuites>
+
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/positional-arguments.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/positional-arguments.phpt
new file mode 100644
index 0000000..b0c6e53
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/positional-arguments.phpt
@@ -0,0 +1,18 @@
+--TEST--
+phpunit FailureTest ../_files/FailureTest.php SomethingElse
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'FailureTest';
+$_SERVER['argv'][3] = dirname(dirname(__FILE__)) . '/_files/FailureTest.php';
+$_SERVER['argv'][4] = 'SomethingElse';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+More than two positional arguments provided.
+
+Usage: %s
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/strict-incomplete.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/strict-incomplete.phpt
new file mode 100644
index 0000000..5c41497
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/strict-incomplete.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --strict IncompleteTest ../_files/IncompleteTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--strict';
+$_SERVER['argv'][3] = 'IncompleteTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/IncompleteTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+I
+
+Time: %i %s, Memory: %sMb
+
+OK, but incomplete or skipped tests!
+Tests: 1, Assertions: 0, Incomplete: 1.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/strict-isolation.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/strict-isolation.phpt
new file mode 100644
index 0000000..ef0ae37
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/strict-isolation.phpt
@@ -0,0 +1,24 @@
+--TEST--
+phpunit --strict --process-isolation IncompleteTest ../_files/IncompleteTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--strict';
+$_SERVER['argv'][3] = '--process-isolation';
+$_SERVER['argv'][4] = 'NothingTest';
+$_SERVER['argv'][5] = dirname(dirname(__FILE__)) . '/_files/NothingTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+I
+
+Time: %i %s, Memory: %sMb
+
+OK, but incomplete or skipped tests!
+Tests: 1, Assertions: 0, Incomplete: 1.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/strict.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/strict.phpt
new file mode 100644
index 0000000..f566ef6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/strict.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --strict NothingTest ../_files/NothingTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--strict';
+$_SERVER['argv'][3] = 'NothingTest';
+$_SERVER['argv'][4] = dirname(dirname(__FILE__)) . '/_files/NothingTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+I
+
+Time: %i %s, Memory: %sMb
+
+OK, but incomplete or skipped tests!
+Tests: 1, Assertions: 0, Incomplete: 1.
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/tap.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/tap.phpt
new file mode 100644
index 0000000..f537080
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/tap.phpt
@@ -0,0 +1,20 @@
+--TEST--
+phpunit --tap BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--tap';
+$_SERVER['argv'][3] = 'BankAccountTest';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+TAP version 13
+ok 1 - BankAccountTest::testBalanceIsInitiallyZero
+ok 2 - BankAccountTest::testBalanceCannotBecomeNegative
+ok 3 - BankAccountTest::testBalanceCannotBecomeNegative2
+1..3
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/test-suffix-multiple.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/test-suffix-multiple.phpt
new file mode 100644
index 0000000..145ebeb
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/test-suffix-multiple.phpt
@@ -0,0 +1,22 @@
+--TEST--
+phpunit --test-suffix .test.php,.my.php ../_files/
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--test-suffix';
+$_SERVER['argv'][3] = '.test.php,.my.php';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+.....
+
+Time: %i %s, Memory: %sMb
+
+OK (5 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/test-suffix-single.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/test-suffix-single.phpt
new file mode 100644
index 0000000..4d63efa
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/test-suffix-single.phpt
@@ -0,0 +1,22 @@
+--TEST--
+phpunit --test-suffix .test.php ../_files/
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--test-suffix';
+$_SERVER['argv'][3] = '.test.php';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+...
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/testdox-html.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/testdox-html.phpt
new file mode 100644
index 0000000..61de71d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/testdox-html.phpt
@@ -0,0 +1,23 @@
+--TEST--
+phpunit --testdox-html php://stdout BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--testdox-html';
+$_SERVER['argv'][3] = 'php://stdout';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+<html><body><h2 id="BankAccountTest">BankAccount</h2><ul>...<li>Balance is initially zero</li><li>Balance cannot become negative</li></ul></body></html>
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/testdox-text.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/testdox-text.phpt
new file mode 100644
index 0000000..8a57c81
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/testdox-text.phpt
@@ -0,0 +1,27 @@
+--TEST--
+phpunit --testdox-text php://stdout BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--testdox-text';
+$_SERVER['argv'][3] = 'php://stdout';
+$_SERVER['argv'][4] = 'BankAccountTest';
+$_SERVER['argv'][5] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+BankAccount
+... [x] Balance is initially zero
+ [x] Balance cannot become negative
+
+
+
+Time: %i %s, Memory: %sMb
+
+OK (3 tests, 3 assertions)
diff --git a/core/vendor/phpunit/phpunit/Tests/TextUI/testdox.phpt b/core/vendor/phpunit/phpunit/Tests/TextUI/testdox.phpt
new file mode 100644
index 0000000..0d24c0e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/TextUI/testdox.phpt
@@ -0,0 +1,21 @@
+--TEST--
+phpunit --testdox php://stdout BankAccountTest ../_files/BankAccountTest.php
+--FILE--
+<?php
+define('PHPUNIT_TESTSUITE', TRUE);
+
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--testdox';
+$_SERVER['argv'][3] = 'BankAccountTest';
+$_SERVER['argv'][4] = dirname(__FILE__).'/../_files/BankAccountTest.php';
+
+require_once dirname(dirname(dirname(__FILE__))) . '/PHPUnit/Autoload.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann.
+
+BankAccount
+ [x] Balance is initially zero
+ [x] Balance cannot become negative
+
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/ClassTest.php b/core/vendor/phpunit/phpunit/Tests/Util/ClassTest.php
new file mode 100644
index 0000000..b306e62
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/ClassTest.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Ben Selby <benmatselby@gmail.com>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.5.6
+ */
+
+require_once 'PHPUnit/Framework/TestCase.php';
+
+require_once 'PHPUnit/Util/Class.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @author     Ben Selby <benmatselby@gmail.com>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.5.6
+ */
+class Util_ClassTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Test that if a dynamic variable is defined on a class then
+     * the $attribute variable will be NULL, but the variable defined
+     * will be a public one so we are safe to return it
+     *
+     * Currently $attribute is NULL but we try and call isPublic() on it.
+     * This breaks for php 5.2.10
+     *
+     * @covers PHPUnit_Util_Class::getObjectAttribute
+     *
+     * @return void
+     */
+    public function testGetObjectAttributeCanHandleDynamicVariables()
+    {
+        $attributeName = '_variable';
+        $object = new stdClass();
+        $object->$attributeName = 'Test';
+
+        $actual = PHPUnit_Util_Class::getObjectAttribute($object, $attributeName);
+        $this->assertEquals('Test', $actual);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/ConfigurationTest.php b/core/vendor/phpunit/phpunit/Tests/Util/ConfigurationTest.php
new file mode 100644
index 0000000..c14ab19
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/ConfigurationTest.php
@@ -0,0 +1,335 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class Util_ConfigurationTest extends PHPUnit_Framework_TestCase
+{
+    protected $configuration;
+
+    protected function setUp()
+    {
+        $this->configuration = PHPUnit_Util_Configuration::getInstance(
+          dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'configuration.xml'
+        );
+    }
+
+    /**
+     * @expectedException PHPUnit_Framework_Exception
+     */
+    public function testExceptionIsThrownForNotExistingConfigurationFile()
+    {
+        PHPUnit_Util_Configuration::getInstance('not_existing_file.xml');
+    }
+
+    public function testFilterConfigurationIsReadCorrectly()
+    {
+        $this->assertEquals(
+          array(
+            'blacklist' =>
+            array(
+              'include' =>
+              array(
+                'directory' =>
+                array(
+                  0 =>
+                  array(
+                    'path' => '/path/to/files',
+                    'prefix' => '',
+                    'suffix' => '.php',
+                    'group' => 'DEFAULT'
+                  ),
+                ),
+                'file' =>
+                array(
+                  0 => '/path/to/file',
+                ),
+              ),
+              'exclude' =>
+              array(
+                'directory' =>
+                array(
+                  0 =>
+                  array(
+                    'path' => '/path/to/files',
+                    'prefix' => '',
+                    'suffix' => '.php',
+                    'group' => 'DEFAULT'
+                  ),
+                ),
+                'file' =>
+                array(
+                  0 => '/path/to/file',
+                ),
+              ),
+            ),
+            'whitelist' =>
+            array(
+              'processUncoveredFilesFromWhitelist' => FALSE,
+              'include' =>
+              array(
+                'directory' =>
+                array(
+                  0 =>
+                  array(
+                    'path' => '/path/to/files',
+                    'prefix' => '',
+                    'suffix' => '.php',
+                    'group' => 'DEFAULT'
+                  ),
+                ),
+                'file' =>
+                array(
+                  0 => '/path/to/file',
+                ),
+              ),
+              'exclude' =>
+              array(
+                'directory' =>
+                array(
+                  0 =>
+                  array(
+                    'path' => '/path/to/files',
+                    'prefix' => '',
+                    'suffix' => '.php',
+                    'group' => 'DEFAULT'
+                  ),
+                ),
+                'file' =>
+                array(
+                  0 => '/path/to/file',
+                ),
+              ),
+            ),
+          ),
+          $this->configuration->getFilterConfiguration()
+        );
+    }
+
+    public function testGroupConfigurationIsReadCorrectly()
+    {
+        $this->assertEquals(
+          array(
+            'include' =>
+            array(
+              0 => 'name',
+            ),
+            'exclude' =>
+            array(
+              0 => 'name',
+            ),
+          ),
+          $this->configuration->getGroupConfiguration()
+        );
+    }
+
+    public function testListenerConfigurationIsReadCorrectly()
+    {
+        $dir = __DIR__;
+        $includePath = ini_get('include_path');
+
+        ini_set('include_path', $dir . PATH_SEPARATOR . $includePath);
+
+        $this->assertEquals(
+          array(
+            0 =>
+            array(
+              'class' => 'MyListener',
+              'file' => '/optional/path/to/MyListener.php',
+              'arguments' =>
+              array(
+                0 =>
+                array(
+                  0 => 'Sebastian',
+                ),
+                1 => 22,
+                2 => 'April',
+                3 => 19.78,
+                4 => NULL,
+                5 => new stdClass,
+                6 => dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MyTestFile.php',
+                7 => dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'MyRelativePath',
+              ),
+            ),
+            array(
+              'class' => 'IncludePathListener',
+              'file' => __FILE__,
+              'arguments' => array()
+            ),
+            array(
+              'class' => 'CompactArgumentsListener',
+              'file' => '/CompactArgumentsListener.php',
+              'arguments' =>
+              array(
+                0 => 42
+              ),
+            ),
+          ),
+          $this->configuration->getListenerConfiguration()
+        );
+
+        ini_set('include_path', $includePath);
+    }
+
+    public function testLoggingConfigurationIsReadCorrectly()
+    {
+        $this->assertEquals(
+          array(
+            'charset' => 'UTF-8',
+            'lowUpperBound' => '35',
+            'highLowerBound' => '70',
+            'highlight' => FALSE,
+            'coverage-html' => '/tmp/report',
+            'coverage-clover' => '/tmp/clover.xml',
+            'json' => '/tmp/logfile.json',
+            'plain' => '/tmp/logfile.txt',
+            'tap' => '/tmp/logfile.tap',
+            'logIncompleteSkipped' => FALSE,
+            'junit' => '/tmp/logfile.xml',
+            'testdox-html' => '/tmp/testdox.html',
+            'testdox-text' => '/tmp/testdox.txt',
+          ),
+          $this->configuration->getLoggingConfiguration()
+        );
+    }
+
+    public function testPHPConfigurationIsReadCorrectly()
+    {
+        $this->assertEquals(
+          array(
+            'include_path' =>
+            array(
+              dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . '.',
+              '/path/to/lib'
+            ),
+            'ini'=> array('foo' => 'bar'),
+            'const'=> array('FOO' => FALSE, 'BAR' => TRUE),
+            'var'=> array('foo' => FALSE),
+            'env'=> array('foo' => TRUE),
+            'post'=> array('foo' => 'bar'),
+            'get'=> array('foo' => 'bar'),
+            'cookie'=> array('foo' => 'bar'),
+            'server'=> array('foo' => 'bar'),
+            'files'=> array('foo' => 'bar'),
+            'request'=> array('foo' => 'bar'),
+          ),
+          $this->configuration->getPHPConfiguration()
+        );
+    }
+
+    /**
+     * @backupGlobals enabled
+     */
+    public function testPHPConfigurationIsHandledCorrectly()
+    {
+        $this->configuration->handlePHPConfiguration();
+
+        $path = dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . '.' . PATH_SEPARATOR . '/path/to/lib';
+        $this->assertStringStartsWith($path, ini_get('include_path'));
+        $this->assertEquals(FALSE, FOO);
+        $this->assertEquals(TRUE, BAR);
+        $this->assertEquals(FALSE, $GLOBALS['foo']);
+        $this->assertEquals(TRUE, $_ENV['foo']);
+        $this->assertEquals(TRUE, getenv('foo'));
+        $this->assertEquals('bar', $_POST['foo']);
+        $this->assertEquals('bar', $_GET['foo']);
+        $this->assertEquals('bar', $_COOKIE['foo']);
+        $this->assertEquals('bar', $_SERVER['foo']);
+        $this->assertEquals('bar', $_FILES['foo']);
+        $this->assertEquals('bar', $_REQUEST['foo']);
+    }
+
+    public function testPHPUnitConfigurationIsReadCorrectly()
+    {
+        $this->assertEquals(
+          array(
+            'backupGlobals' => TRUE,
+            'backupStaticAttributes' => FALSE,
+            'bootstrap' => '/path/to/bootstrap.php',
+            'cacheTokens' => TRUE,
+            'colors' => FALSE,
+            'convertErrorsToExceptions' => TRUE,
+            'convertNoticesToExceptions' => TRUE,
+            'convertWarningsToExceptions' => TRUE,
+            'forceCoversAnnotation' => FALSE,
+            'mapTestClassNameToCoveredClassName' => FALSE,
+            'printerClass' => 'PHPUnit_TextUI_ResultPrinter',
+            'stopOnFailure' => FALSE,
+            'strict' => FALSE,
+            'testSuiteLoaderClass' => 'PHPUnit_Runner_StandardTestSuiteLoader',
+            'verbose' => FALSE,
+            'timeoutForSmallTests' => 1,
+            'timeoutForMediumTests' => 10,
+            'timeoutForLargeTests' => 60
+          ),
+          $this->configuration->getPHPUnitConfiguration()
+        );
+    }
+
+    public function testSeleniumBrowserConfigurationIsReadCorrectly()
+    {
+        $this->assertEquals(
+          array(
+            0 =>
+            array(
+              'name' => 'Firefox on Linux',
+              'browser' => '*firefox /usr/lib/firefox/firefox-bin',
+              'host' => 'my.linux.box',
+              'port' => 4444,
+              'timeout' => 30000,
+            ),
+          ),
+          $this->configuration->getSeleniumBrowserConfiguration()
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/DiffTest.php b/core/vendor/phpunit/phpunit/Tests/Util/DiffTest.php
new file mode 100644
index 0000000..9bc669e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/DiffTest.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class Util_DiffTest extends PHPUnit_Framework_TestCase
+{
+    const REMOVED = 2;
+    const ADDED = 1;
+    const OLD = 0;
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorMessage()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-a\n+b\n",
+          PHPUnit_Util_Diff::diff('a', 'b')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorMessage_toArray()
+    {
+        $diff = array();
+        $diff[] = array('a', self::REMOVED);
+        $diff[] = array('b', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('a', 'b')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorStartSame()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-ba\n+bc\n",
+          PHPUnit_Util_Diff::diff('ba', 'bc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorStartSame_toArray()
+    {
+        $diff = array();
+        $diff[] = array('ba', self::REMOVED);
+        $diff[] = array('bc', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('ba', 'bc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorEndSame()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-ab\n+cb\n",
+          PHPUnit_Util_Diff::diff('ab', 'cb')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorEndSame_toArray()
+    {
+        $diff = array();
+        $diff[] = array('ab', self::REMOVED);
+        $diff[] = array('cb', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('ab', 'cb')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorStartAndEndSame()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-abc\n+adc\n",
+          PHPUnit_Util_Diff::diff('abc', 'adc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorStartAndEndSame_toArray()
+    {
+        $diff = array();
+        $diff[] = array('abc', self::REMOVED);
+        $diff[] = array('adc', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('abc', 'adc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorStartSameComplete()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-ab\n+abc\n",
+          PHPUnit_Util_Diff::diff('ab', 'abc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorStartSameComplete_toArray()
+    {
+        $diff = array();
+        $diff[] = array('ab', self::REMOVED);
+        $diff[] = array('abc', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('ab', 'abc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorEndSameComplete()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-bc\n+abc\n",
+          PHPUnit_Util_Diff::diff('bc', 'abc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorEndSameComplete_toArray()
+    {
+        $diff = array();
+        $diff[] = array('bc', self::REMOVED);
+        $diff[] = array('abc', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('bc', 'abc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorOverlapingMatches()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-abc\n+abbc\n",
+          PHPUnit_Util_Diff::diff('abc', 'abbc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorOverlapingMatches_toArray()
+    {
+        $diff = array();
+        $diff[] = array('abc', self::REMOVED);
+        $diff[] = array('abbc', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('abc', 'abbc')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diff
+     */
+    public function testComparisonErrorOverlapingMatches2()
+    {
+        $this->assertEquals(
+          "--- Expected\n+++ Actual\n@@ @@\n-abcdde\n+abcde\n",
+          PHPUnit_Util_Diff::diff('abcdde', 'abcde')
+        );
+    }
+
+    /**
+     * @covers PHPUnit_Util_Diff::diffToArray
+     */
+    public function testComparisonErrorOverlapingMatches2_toArray()
+    {
+        $diff = array();
+        $diff[] = array('abcdde', self::REMOVED);
+        $diff[] = array('abcde', self::ADDED);
+
+        $this->assertEquals(
+          $diff,
+          PHPUnit_Util_Diff::diffToArray('abcdde', 'abcde')
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/TestDox/NamePrettifierTest.php b/core/vendor/phpunit/phpunit/Tests/Util/TestDox/NamePrettifierTest.php
new file mode 100644
index 0000000..bf255a0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/TestDox/NamePrettifierTest.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.1.0
+ */
+class Util_TestDox_NamePrettifierTest extends PHPUnit_Framework_TestCase
+{
+    protected $namePrettifier;
+
+    protected function setUp()
+    {
+        $this->namePrettifier = new PHPUnit_Util_TestDox_NamePrettifier;
+    }
+
+    public function testTitleHasSensibleDefaults()
+    {
+        $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('FooTest'));
+        $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('TestFoo'));
+        $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('TestFooTest'));
+    }
+
+    public function testCaterForUserDefinedSuffix()
+    {
+        $this->namePrettifier->setSuffix('TestCase');
+        $this->namePrettifier->setPrefix(NULL);
+
+        $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('FooTestCase'));
+        $this->assertEquals('TestFoo', $this->namePrettifier->prettifyTestClass('TestFoo'));
+        $this->assertEquals('FooTest', $this->namePrettifier->prettifyTestClass('FooTest'));
+    }
+
+    public function testCaterForUserDefinedPrefix()
+    {
+        $this->namePrettifier->setSuffix(NULL);
+        $this->namePrettifier->setPrefix('XXX');
+
+        $this->assertEquals('Foo', $this->namePrettifier->prettifyTestClass('XXXFoo'));
+        $this->assertEquals('TestXXX', $this->namePrettifier->prettifyTestClass('TestXXX'));
+        $this->assertEquals('XXX', $this->namePrettifier->prettifyTestClass('XXXXXX'));
+    }
+
+    public function testTestNameIsConvertedToASentence()
+    {
+        $this->assertEquals('This is a test', $this->namePrettifier->prettifyTestMethod('testThisIsATest'));
+        $this->assertEquals('This is a test', $this->namePrettifier->prettifyTestMethod('testThisIsATest2'));
+        $this->assertEquals('this is a test', $this->namePrettifier->prettifyTestMethod('this_is_a_test'));
+        $this->assertEquals('Foo for bar is 0', $this->namePrettifier->prettifyTestMethod('testFooForBarIs0'));
+        $this->assertEquals('Foo for baz is 1', $this->namePrettifier->prettifyTestMethod('testFooForBazIs1'));
+    }
+
+    /**
+     * @ticket 224
+     */
+    public function testTestNameIsNotGroupedWhenNotInSequence()
+    {
+        $this->assertEquals('Sets redirect header on 301', $this->namePrettifier->prettifyTestMethod('testSetsRedirectHeaderOn301'));
+        $this->assertEquals('Sets redirect header on 302', $this->namePrettifier->prettifyTestMethod('testSetsRedirectHeaderOn302'));
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/TestTest.php b/core/vendor/phpunit/phpunit/Tests/Util/TestTest.php
new file mode 100644
index 0000000..a65cf36
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/TestTest.php
@@ -0,0 +1,237 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.6
+ */
+
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'ExceptionNamespaceTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'RequirementsTest.php';
+require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'RequirementsClassDocBlockTest.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.6
+ */
+class Util_TestTest extends PHPUnit_Framework_TestCase
+{
+    public function testGetExpectedException()
+    {
+        $this->assertSame(
+          array('class' => 'FooBarBaz', 'code' => NULL, 'message' => ''),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testOne')
+        );
+
+        $this->assertSame(
+          array('class' => 'Foo_Bar_Baz', 'code' => NULL, 'message' => ''),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testTwo')
+        );
+
+        $this->assertSame(
+          array('class' => 'Foo\Bar\Baz', 'code' => NULL, 'message' => ''),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testThree')
+        );
+
+        $this->assertSame(
+          array('class' => 'ã»ã’', 'code' => NULL, 'message' => ''),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testFour')
+        );
+
+        $this->assertSame(
+          array('class' => 'Class', 'code' => 1234, 'message' => 'Message'),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testFive')
+        );
+
+        $this->assertSame(
+          array('class' => 'Class', 'code' => 1234, 'message' => 'Message'),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSix')
+        );
+
+        $this->assertSame(
+          array('class' => 'Class', 'code' => 'ExceptionCode', 'message' => 'Message'),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testSeven')
+        );
+
+        $this->assertSame(
+          array('class' => 'Class', 'code' => 0, 'message' => 'Message'),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testEight')
+        );
+        $this->assertSame(
+          array('class' => 'Class', 'code' => ExceptionTest::ERROR_CODE, 'message' => ExceptionTest::ERROR_MESSAGE),
+          PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testNine')
+        );
+        $this->assertSame(
+            array('class' => 'Class', 'code' => My\Space\ExceptionNamespaceTest::ERROR_CODE, 'message' => My\Space\ExceptionNamespaceTest::ERROR_MESSAGE),
+            PHPUnit_Util_Test::getExpectedException('My\Space\ExceptionNamespaceTest', 'testConstants')
+        );
+        // Ensure the Class::CONST expression is only evaluated when the constant really exists
+        $this->assertSame(
+            array('class' => 'Class', 'code' => 'ExceptionTest::UNKNOWN_CODE_CONSTANT', 'message' => 'ExceptionTest::UNKNOWN_MESSAGE_CONSTANT'),
+            PHPUnit_Util_Test::getExpectedException('ExceptionTest', 'testUnknownConstants')
+        );
+        $this->assertSame(
+            array('class' => 'Class', 'code' => 'My\Space\ExceptionNamespaceTest::UNKNOWN_CODE_CONSTANT', 'message' => 'My\Space\ExceptionNamespaceTest::UNKNOWN_MESSAGE_CONSTANT'),
+            PHPUnit_Util_Test::getExpectedException('My\Space\ExceptionNamespaceTest', 'testUnknownConstants')
+        );
+    }
+
+    public function provideRequirements()
+    {
+        return array(
+            array('testOne',   array()),
+            array('testTwo',   array('PHPUnit' => '1.0')),
+            array('testThree', array('PHP' => '2.0')),
+            array('testFour',  array('PHPUnit'=>'2.0', 'PHP' => '1.0')),
+            array('testFive',  array('PHP' => '5.4.0RC6')),
+            array('testSix',   array('PHP' => '5.4.0-alpha1')),
+            array('testSeven', array('PHP' => '5.4.0beta2')),
+            array('testEight', array('PHP' => '5.4-dev')),
+            array('testNine',  array('functions' => array('testFunc'))),
+            array('testTen',   array('extensions' => array('testExt'))),
+            array(
+                'testAllPossibleRequirements',
+                array(
+                    'PHP' => '99-dev',
+                    'PHPUnit' => '9-dev',
+                    'functions' => array(
+                        'testFuncOne',
+                        'testFuncTwo',
+                    ),
+                    'extensions' => array(
+                        'testExtOne',
+                        'testExtTwo',
+                    )
+                )
+            )
+        );
+    }
+
+    /**
+     * @dataProvider provideRequirements
+     */
+    public function testGetRequirements($test, $result)
+    {
+        $this->assertEquals(
+          $result,
+          PHPUnit_Util_Test::getRequirements('RequirementsTest', $test)
+        );
+    }
+
+    public function testGetRequirementsMergesClassAndMethodDocBlocks()
+    {
+        $expectedAnnotations = array(
+            'PHP' => '5.4',
+            'PHPUnit' => '3.7',
+            'functions' => array(
+                'testFuncClass',
+                'testFuncMethod',
+            ),
+            'extensions' => array(
+                'testExtClass',
+                'testExtMethod',
+            )
+        );
+
+        $this->assertEquals(
+          $expectedAnnotations,
+          PHPUnit_Util_Test::getRequirements('RequirementsClassDocBlockTest', 'testMethod')
+        );
+    }
+
+    public function testGetProvidedDataRegEx()
+    {
+        $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider method', $matches);
+        $this->assertEquals(1, $result);
+        $this->assertEquals('method', $matches[1]);
+
+        $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider class::method', $matches);
+        $this->assertEquals(1, $result);
+        $this->assertEquals('class::method', $matches[1]);
+
+        $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider namespace\class::method', $matches);
+        $this->assertEquals(1, $result);
+        $this->assertEquals('namespace\class::method', $matches[1]);
+
+        $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider namespace\namespace\class::method', $matches);
+        $this->assertEquals(1, $result);
+        $this->assertEquals('namespace\namespace\class::method', $matches[1]);
+
+        $result = preg_match(PHPUnit_Util_Test::REGEX_DATA_PROVIDER, '@dataProvider ãƒ¡ã‚½ãƒƒãƒ‰', $matches);
+        $this->assertEquals(1, $result);
+        $this->assertEquals('ãƒ¡ã‚½ãƒƒãƒ‰', $matches[1]);
+    }
+
+    public function testParseAnnotation()
+    {
+        $this->assertEquals(
+          array('Foo', 'ã»ã’'),
+          PHPUnit_Util_Test::getDependencies(get_class($this), 'methodForTestParseAnnotation')
+        );
+    }
+
+    /**
+     * @depends Foo
+     * @depends ã»ã’
+     */
+    public function methodForTestParseAnnotation()
+    {
+    }
+
+    public function testParseAnnotationThatIsOnlyOneLine()
+    {
+        $this->assertEquals(
+          array('Bar'),
+          PHPUnit_Util_Test::getDependencies(get_class($this), 'methodForTestParseAnnotationThatIsOnlyOneLine')
+        );
+    }
+
+    /** @depends Bar */
+    public function methodForTestParseAnnotationThatIsOnlyOneLine()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/TypeTest.php b/core/vendor/phpunit/phpunit/Tests/Util/TypeTest.php
new file mode 100644
index 0000000..1adac16
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/TypeTest.php
@@ -0,0 +1,270 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+require_once 'PHPUnit/Framework/TestCase.php';
+
+require_once 'PHPUnit/Util/Type.php';
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class Util_TypeTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Removes spaces in front newlines
+     *
+     * @param  string $string
+     * @return string
+     */
+    public static function trimnl($string)
+    {
+        return preg_replace('/[ ]*\n/', "\n", $string);
+    }
+
+    public function exportProvider()
+    {
+        $obj2 = new stdClass;
+        $obj2->foo = 'bar';
+
+        $obj = new stdClass;
+        //@codingStandardsIgnoreStart 
+        $obj->null = NULL;
+        //@codingStandardsIgnoreEnd 
+        $obj->boolean = TRUE;
+        $obj->integer = 1;
+        $obj->double = 1.2;
+        $obj->string = '1';
+        $obj->text = "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext";
+        $obj->object = $obj2;
+        $obj->objectagain = $obj2;
+        $obj->array = array('foo' => 'bar');
+        $obj->self = $obj;
+
+        $array = array(
+            0 => 0,
+            'null' => NULL,
+            'boolean' => TRUE,
+            'integer' => 1,
+            'double' => 1.2,
+            'string' => '1',
+            'text' => "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext",
+            'object' => $obj2,
+            'objectagain' => $obj2,
+            'array' => array('foo' => 'bar'),
+        );
+
+        $array['self'] = &$array;
+
+        return array(
+            array(NULL, 'null'),
+            array(TRUE, 'true'),
+            array(1, '1'),
+            array(1.0, '1.0'),
+            array(1.2, '1.2'),
+            array('1', "'1'"),
+            // \n\r and \r is converted to \n
+            array("this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext",
+<<<EOF
+'this
+is
+a
+very
+very
+very
+very
+very
+very
+long
+text'
+EOF
+            ),
+            array(new stdClass, 'stdClass Object ()'),
+            array($obj,
+<<<EOF
+stdClass Object (
+    'null' => null
+    'boolean' => true
+    'integer' => 1
+    'double' => 1.2
+    'string' => '1'
+    'text' => 'this
+is
+a
+very
+very
+very
+very
+very
+very
+long
+text'
+    'object' => stdClass Object (
+        'foo' => 'bar'
+    )
+    'objectagain' => stdClass Object (*RECURSION*)
+    'array' => Array (
+        'foo' => 'bar'
+    )
+    'self' => stdClass Object (*RECURSION*)
+)
+EOF
+            ),
+            array(array(), 'Array ()'),
+            array($array,
+<<<EOF
+Array (
+    0 => 0
+    'null' => null
+    'boolean' => true
+    'integer' => 1
+    'double' => 1.2
+    'string' => '1'
+    'text' => 'this
+is
+a
+very
+very
+very
+very
+very
+very
+long
+text'
+    'object' => stdClass Object (
+        'foo' => 'bar'
+    )
+    'objectagain' => stdClass Object (*RECURSION*)
+    'array' => Array (
+        'foo' => 'bar'
+    )
+    'self' => Array (*RECURSION*)
+)
+EOF
+            ),
+            array(
+                chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5),
+                'Binary String: 0x000102030405'
+            ),
+            array(
+                implode('', array_map('chr', range(0x0e, 0x1f))),
+                'Binary String: 0x0e0f101112131415161718191a1b1c1d1e1f'
+            ),
+            array(
+                chr(0x00) . chr(0x09),
+                'Binary String: 0x0009'
+            ),
+            array(
+                '',
+                "''"
+            ),
+        );
+    }
+
+    /**
+     * @dataProvider exportProvider
+     */
+    public function testExport($value, $expected)
+    {
+        $this->assertSame($expected, self::trimnl(PHPUnit_Util_Type::export($value)));
+    }
+
+    public function shortenedExportProvider()
+    {
+        $obj = new stdClass;
+        $obj->foo = 'bar';
+
+        $array = array(
+            'foo' => 'bar',
+        );
+
+        return array(
+            array(NULL, 'null'),
+            array(TRUE, 'true'),
+            array(1, '1'),
+            array(1.0, '1.0'),
+            array(1.2, '1.2'),
+            array('1', "'1'"),
+            // \n\r and \r is converted to \n
+            array("this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", "'this\\nis\\na\\nvery\\nvery\\nvery\\nvery...g\\ntext'"),
+            array(new stdClass, 'stdClass Object ()'),
+            array($obj, 'stdClass Object (...)'),
+            array(array(), 'Array ()'),
+            array($array, 'Array (...)'),
+        );
+    }
+
+    /**
+     * @dataProvider shortenedExportProvider
+     */
+    public function testShortenedExport($value, $expected)
+    {
+        $this->assertSame($expected, self::trimnl(PHPUnit_Util_Type::shortenedExport($value)));
+    }
+
+    public function provideNonBinaryMultibyteStrings()
+    {
+        return array(
+            array(implode('', array_map('chr', range(0x09, 0x0d))), 5),
+            array(implode('', array_map('chr', range(0x20, 0x7f))), 96),
+            array(implode('', array_map('chr', range(0x80, 0xff))), 128),
+        );
+    }
+
+
+    /**
+     * @dataProvider provideNonBinaryMultibyteStrings
+     */
+    public function testNonBinaryStringExport($value, $expectedLength)
+    {
+        $this->assertRegExp("~'.{{$expectedLength}}'\$~s", PHPUnit_Util_Type::export($value));
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/Util/XMLTest.php b/core/vendor/phpunit/phpunit/Tests/Util/XMLTest.php
new file mode 100644
index 0000000..89d2701
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/Util/XMLTest.php
@@ -0,0 +1,324 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Mike Naberezny <mike@maintainable.com>
+ * @author     Derek DeVries <derek@maintainable.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.3.0
+ */
+
+/**
+ *
+ *
+ * @package    PHPUnit
+ * @author     Mike Naberezny <mike@maintainable.com>
+ * @author     Derek DeVries <derek@maintainable.com>
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.3.0
+ */
+class Util_XMLTest extends PHPUnit_Framework_TestCase
+{
+    public function testAssertValidKeysValidKeys()
+    {
+        $options   = array('testA' => 1, 'testB' => 2, 'testC' => 3);
+        $valid     = array('testA', 'testB', 'testC');
+        $expected  = array('testA' => 1, 'testB' => 2, 'testC' => 3);
+        $validated = PHPUnit_Util_XML::assertValidKeys($options, $valid);
+
+        $this->assertEquals($expected, $validated);
+    }
+
+    public function testAssertValidKeysValidKeysEmpty()
+    {
+        $options   = array('testA' => 1, 'testB' => 2);
+        $valid     = array('testA', 'testB', 'testC');
+        $expected  = array('testA' => 1, 'testB' => 2, 'testC' => NULL);
+        $validated = PHPUnit_Util_XML::assertValidKeys($options, $valid);
+
+        $this->assertEquals($expected, $validated);
+    }
+
+    public function testAssertValidKeysDefaultValuesA()
+    {
+        $options   = array('testA' => 1, 'testB' => 2);
+        $valid     = array('testA' => 23, 'testB' => 24, 'testC' => 25);
+        $expected  = array('testA' => 1, 'testB' => 2, 'testC' => 25);
+        $validated = PHPUnit_Util_XML::assertValidKeys($options, $valid);
+
+        $this->assertEquals($expected, $validated);
+    }
+
+    public function testAssertValidKeysDefaultValuesB()
+    {
+        $options   = array();
+        $valid     = array('testA' => 23, 'testB' => 24, 'testC' => 25);
+        $expected  = array('testA' => 23, 'testB' => 24, 'testC' => 25);
+        $validated = PHPUnit_Util_XML::assertValidKeys($options, $valid);
+
+        $this->assertEquals($expected, $validated);
+    }
+
+    public function testAssertValidKeysInvalidKey()
+    {
+        $options = array('testA' => 1, 'testB' => 2, 'testD' => 3);
+        $valid   = array('testA', 'testB', 'testC');
+
+        try {
+            $validated = PHPUnit_Util_XML::assertValidKeys($options, $valid);
+            $this->fail();
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            $this->assertEquals('Unknown key(s): testD', $e->getMessage());
+        }
+    }
+
+    public function testAssertValidKeysInvalidKeys()
+    {
+        $options = array('testA' => 1, 'testD' => 2, 'testE' => 3);
+        $valid   = array('testA', 'testB', 'testC');
+
+        try {
+            $validated = PHPUnit_Util_XML::assertValidKeys($options, $valid);
+            $this->fail();
+        }
+
+        catch (PHPUnit_Framework_Exception $e) {
+            $this->assertEquals('Unknown key(s): testD, testE', $e->getMessage());
+        }
+    }
+
+    public function testConvertAssertSelect()
+    {
+        $selector  = 'div#folder.open a[href="http://www.xerox.com"][title="xerox"].selected.big > span';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag'   => 'div',
+                           'id'    => 'folder',
+                           'class' => 'open',
+                           'descendant' => array('tag'        => 'a',
+                                                 'class'      => 'selected big',
+                                                 'attributes' => array('href'  => 'http://www.xerox.com',
+                                                                       'title' => 'xerox'),
+                                                 'child'      => array('tag' => 'span')));
+         $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectElt()
+    {
+        $selector  = 'div';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertClass()
+    {
+        $selector  = '.foo';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('class' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertId()
+    {
+        $selector  = '#foo';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('id' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertAttribute()
+    {
+        $selector  = '[foo="bar"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('attributes' => array('foo' => 'bar'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertAttributeSpaces()
+    {
+        $selector  = '[foo="bar baz"] div[value="foo bar"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('attributes' => array('foo' => 'bar baz'),
+                           'descendant' => array('tag'        => 'div',
+                                                 'attributes' => array('value' => 'foo bar')));
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertAttributeMultipleSpaces()
+    {
+        $selector = '[foo="bar baz"] div[value="foo bar baz"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag      = array('attributes' => array('foo' => 'bar baz'),
+                          'descendant' => array('tag' => 'div',
+                                                'attributes' => array('value' => 'foo bar baz')));
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltClass()
+    {
+        $selector  = 'div.foo';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'class' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltId()
+    {
+        $selector  = 'div#foo';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'id' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltAttrEqual()
+    {
+        $selector  = 'div[foo="bar"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'attributes' => array('foo' => 'bar'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltMultiAttrEqual()
+    {
+        $selector  = 'div[foo="bar"][baz="fob"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'attributes' => array('foo' => 'bar', 'baz' => 'fob'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltAttrHasOne()
+    {
+        $selector  = 'div[foo~="bar"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'attributes' => array('foo' => 'regexp:/.*\bbar\b.*/'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltAttrContains()
+    {
+        $selector  = 'div[foo*="bar"]';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'attributes' => array('foo' => 'regexp:/.*bar.*/'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltChild()
+    {
+        $selector  = 'div > a';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'child' => array('tag' => 'a'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectEltDescendant()
+    {
+        $selector  = 'div a';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector);
+        $tag       = array('tag' => 'div', 'descendant' => array('tag' => 'a'));
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectContent()
+    {
+        $selector  = '#foo';
+        $content   = 'div contents';
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector, $content);
+        $tag       = array('id' => 'foo', 'content' => 'div contents');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectTrue()
+    {
+        $selector  = '#foo';
+        $content   = TRUE;
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector, $content);
+        $tag       = array('id' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertSelectFalse()
+    {
+        $selector  = '#foo';
+        $content   = FALSE;
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector, $content);
+        $tag       = array('id' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertNumber()
+    {
+        $selector  = '.foo';
+        $content   = 3;
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector, $content);
+        $tag       = array('class' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+
+    public function testConvertAssertRange()
+    {
+        $selector  = '#foo';
+        $content   = array('greater_than' => 5, 'less_than' => 10);
+        $converted = PHPUnit_Util_XML::convertSelectToTag($selector, $content);
+        $tag       = array('id' => 'foo');
+
+        $this->assertEquals($tag, $converted);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/AbstractTest.php b/core/vendor/phpunit/phpunit/Tests/_files/AbstractTest.php
new file mode 100644
index 0000000..556e7db
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/AbstractTest.php
@@ -0,0 +1,7 @@
+<?php
+abstract class AbstractTest extends PHPUnit_Framework_TestCase
+{
+    public function testOne()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Author.php b/core/vendor/phpunit/phpunit/Tests/_files/Author.php
new file mode 100644
index 0000000..979ddbf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Author.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * An author.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class Author
+{
+    // the order of properties is important for testing the cycle!
+    public $books = array();
+
+    private $name = '';
+
+    public function __construct($name)
+    {
+        $this->name = $name;
+    }
+}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/BankAccount.php b/core/vendor/phpunit/phpunit/Tests/_files/BankAccount.php
new file mode 100644
index 0000000..93bc89b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/BankAccount.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+class BankAccountException extends RuntimeException {}
+
+/**
+ * A bank account.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.3.0
+ */
+class BankAccount
+{
+    /**
+     * The bank account's balance.
+     *
+     * @var    float
+     */
+    protected $balance = 0;
+
+    /**
+     * Returns the bank account's balance.
+     *
+     * @return float
+     */
+    public function getBalance()
+    {
+        return $this->balance;
+    }
+
+    /**
+     * Sets the bank account's balance.
+     *
+     * @param  float $balance
+     * @throws BankAccountException
+     */
+    protected function setBalance($balance)
+    {
+        if ($balance >= 0) {
+            $this->balance = $balance;
+        } else {
+            throw new BankAccountException;
+        }
+    }
+
+    /**
+     * Deposits an amount of money to the bank account.
+     *
+     * @param  float $balance
+     * @throws BankAccountException
+     */
+    public function depositMoney($balance)
+    {
+        $this->setBalance($this->getBalance() + $balance);
+
+        return $this->getBalance();
+    }
+
+    /**
+     * Withdraws an amount of money from the bank account.
+     *
+     * @param  float $balance
+     * @throws BankAccountException
+     */
+    public function withdrawMoney($balance)
+    {
+        $this->setBalance($this->getBalance() - $balance);
+
+        return $this->getBalance();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/BankAccountTest.php b/core/vendor/phpunit/phpunit/Tests/_files/BankAccountTest.php
new file mode 100644
index 0000000..9083086
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/BankAccountTest.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit/Framework/TestCase.php';
+require_once 'BankAccount.php';
+
+/**
+ * Tests for the BankAccount class.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.3.0
+ */
+class BankAccountTest extends PHPUnit_Framework_TestCase
+{
+    protected $ba;
+
+    protected function setUp()
+    {
+        $this->ba = new BankAccount;
+    }
+
+    /**
+     * @covers BankAccount::getBalance
+     * @group balanceIsInitiallyZero
+     * @group specification
+     */
+    public function testBalanceIsInitiallyZero()
+    {
+        $this->assertEquals(0, $this->ba->getBalance());
+    }
+
+    /**
+     * @covers BankAccount::withdrawMoney
+     * @group balanceCannotBecomeNegative
+     * @group specification
+     */
+    public function testBalanceCannotBecomeNegative()
+    {
+        try {
+            $this->ba->withdrawMoney(1);
+        }
+
+        catch (BankAccountException $e) {
+            $this->assertEquals(0, $this->ba->getBalance());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers BankAccount::depositMoney
+     * @group balanceCannotBecomeNegative
+     * @group specification
+     */
+    public function testBalanceCannotBecomeNegative2()
+    {
+        try {
+            $this->ba->depositMoney(-1);
+        }
+
+        catch (BankAccountException $e) {
+            $this->assertEquals(0, $this->ba->getBalance());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers BankAccount::getBalance
+     * @covers BankAccount::depositMoney
+     * @covers BankAccount::withdrawMoney
+     * @group balanceCannotBecomeNegative
+     */
+    /*
+    public function testDepositingAndWithdrawingMoneyWorks()
+    {
+        $this->assertEquals(0, $this->ba->getBalance());
+        $this->ba->depositMoney(1);
+        $this->assertEquals(1, $this->ba->getBalance());
+        $this->ba->withdrawMoney(1);
+        $this->assertEquals(0, $this->ba->getBalance());
+    }
+    */
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/BankAccountTest.test.php b/core/vendor/phpunit/phpunit/Tests/_files/BankAccountTest.test.php
new file mode 100644
index 0000000..117ce7a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/BankAccountTest.test.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2011, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 2.3.0
+ */
+
+require_once 'PHPUnit/Framework/TestCase.php';
+require_once 'BankAccount.php';
+
+/**
+ * Tests for the BankAccount class.
+ *
+ * @package    PHPUnit
+ * @author     Sebastian Bergmann <sebastian@phpunit.de>
+ * @copyright  2002-2011 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 2.3.0
+ */
+class BankAccountWithCustomExtensionTest extends PHPUnit_Framework_TestCase
+{
+    protected $ba;
+
+    protected function setUp()
+    {
+        $this->ba = new BankAccount;
+    }
+
+    /**
+     * @covers BankAccount::getBalance
+     * @group balanceIsInitiallyZero
+     * @group specification
+     */
+    public function testBalanceIsInitiallyZero()
+    {
+        $this->assertEquals(0, $this->ba->getBalance());
+    }
+
+    /**
+     * @covers BankAccount::withdrawMoney
+     * @group balanceCannotBecomeNegative
+     * @group specification
+     */
+    public function testBalanceCannotBecomeNegative()
+    {
+        try {
+            $this->ba->withdrawMoney(1);
+        }
+
+        catch (BankAccountException $e) {
+            $this->assertEquals(0, $this->ba->getBalance());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers BankAccount::depositMoney
+     * @group balanceCannotBecomeNegative
+     * @group specification
+     */
+    public function testBalanceCannotBecomeNegative2()
+    {
+        try {
+            $this->ba->depositMoney(-1);
+        }
+
+        catch (BankAccountException $e) {
+            $this->assertEquals(0, $this->ba->getBalance());
+
+            return;
+        }
+
+        $this->fail();
+    }
+
+    /**
+     * @covers BankAccount::getBalance
+     * @covers BankAccount::depositMoney
+     * @covers BankAccount::withdrawMoney
+     * @group balanceCannotBecomeNegative
+     */
+    /*
+    public function testDepositingAndWithdrawingMoneyWorks()
+    {
+        $this->assertEquals(0, $this->ba->getBalance());
+        $this->ba->depositMoney(1);
+        $this->assertEquals(1, $this->ba->getBalance());
+        $this->ba->withdrawMoney(1);
+        $this->assertEquals(0, $this->ba->getBalance());
+    }
+    */
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Book.php b/core/vendor/phpunit/phpunit/Tests/_files/Book.php
new file mode 100644
index 0000000..2cf4b05
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Book.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * A book.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class Book
+{
+    // the order of properties is important for testing the cycle!
+    public $author = NULL;
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Calculator.php b/core/vendor/phpunit/phpunit/Tests/_files/Calculator.php
new file mode 100644
index 0000000..e269bd6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Calculator.php
@@ -0,0 +1,14 @@
+<?php
+class Calculator
+{
+    /**
+     * @assert (0, 0) == 0
+     * @assert (0, 1) == 1
+     * @assert (1, 0) == 1
+     * @assert (1, 1) == 2
+     */
+    public function add($a, $b)
+    {
+        return $a + $b;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ChangeCurrentWorkingDirectoryTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ChangeCurrentWorkingDirectoryTest.php
new file mode 100644
index 0000000..2298c5e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ChangeCurrentWorkingDirectoryTest.php
@@ -0,0 +1,10 @@
+<?php
+class ChangeCurrentWorkingDirectoryTest extends PHPUnit_Framework_TestCase
+{
+    public function testSomethingThatChangesTheCwd()
+    {
+        chdir('../');
+        $this->assertTrue(TRUE);
+    }
+
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ClassWithNonPublicAttributes.php b/core/vendor/phpunit/phpunit/Tests/_files/ClassWithNonPublicAttributes.php
new file mode 100644
index 0000000..bb979e7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ClassWithNonPublicAttributes.php
@@ -0,0 +1,29 @@
+<?php
+class ParentClassWithPrivateAttributes
+{
+    private static $privateStaticParentAttribute = 'foo';
+    private $privateParentAttribute = 'bar';
+}
+
+class ParentClassWithProtectedAttributes extends ParentClassWithPrivateAttributes
+{
+    protected static $protectedStaticParentAttribute = 'foo';
+    protected $protectedParentAttribute = 'bar';
+}
+
+class ClassWithNonPublicAttributes extends ParentClassWithProtectedAttributes
+{
+    public static $publicStaticAttribute = 'foo';
+    protected static $protectedStaticAttribute = 'bar';
+    protected static $privateStaticAttribute = 'baz';
+
+    public $publicAttribute = 'foo';
+    public $foo = 1;
+    public $bar = 2;
+    protected $protectedAttribute = 'bar';
+    protected $privateAttribute = 'baz';
+
+    public $publicArray = array('foo');
+    protected $protectedArray = array('bar');
+    protected $privateArray = array('baz');
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ClassWithToString.php b/core/vendor/phpunit/phpunit/Tests/_files/ClassWithToString.php
new file mode 100644
index 0000000..5961602
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ClassWithToString.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @link       http://www.phpunit.de/
+ * @since      File available since Release 3.6.0
+ */
+
+/**
+ * A class with a __toString() method.
+ *
+ * @package    PHPUnit
+ * @author     Bernhard Schussek <bschussek@2bepublished.at>
+ * @copyright  2001-2012 Sebastian Bergmann <sebastian@phpunit.de>
+ * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
+ * @version    Release: @package_version@
+ * @link       http://www.phpunit.de/
+ * @since      Class available since Release 3.6.0
+ */
+class ClassWithToString
+{
+    public function __toString()
+    {
+        return 'string representation';
+    }
+}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ConcreteTest.my.php b/core/vendor/phpunit/phpunit/Tests/_files/ConcreteTest.my.php
new file mode 100644
index 0000000..ea9f8f1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ConcreteTest.my.php
@@ -0,0 +1,9 @@
+<?php
+require_once 'AbstractTest.php';
+
+class ConcreteWithMyCustomExtensionTest extends AbstractTest
+{
+    public function testTwo()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ConcreteTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ConcreteTest.php
new file mode 100644
index 0000000..b38d74d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ConcreteTest.php
@@ -0,0 +1,9 @@
+<?php
+require_once 'AbstractTest.php';
+
+class ConcreteTest extends AbstractTest
+{
+    public function testTwo()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/DataProviderTest.php b/core/vendor/phpunit/phpunit/Tests/_files/DataProviderTest.php
new file mode 100644
index 0000000..d940a05
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/DataProviderTest.php
@@ -0,0 +1,21 @@
+<?php
+class DataProviderTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider providerMethod
+     */
+    public function testAdd($a, $b, $c)
+    {
+        $this->assertEquals($c, $a + $b);
+    }
+
+    public static function providerMethod()
+    {
+        return array(
+          array(0, 0, 0),
+          array(0, 1, 1),
+          array(1, 1, 3),
+          array(1, 0, 1)
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/DependencyFailureTest.php b/core/vendor/phpunit/phpunit/Tests/_files/DependencyFailureTest.php
new file mode 100644
index 0000000..d83aecd
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/DependencyFailureTest.php
@@ -0,0 +1,22 @@
+<?php
+class DependencyFailureTest extends PHPUnit_Framework_TestCase
+{
+    public function testOne()
+    {
+        $this->fail();
+    }
+
+    /**
+     * @depends testOne
+     */
+    public function testTwo()
+    {
+    }
+
+    /**
+     * @depends testTwo
+     */
+    public function testThree()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/DependencySuccessTest.php b/core/vendor/phpunit/phpunit/Tests/_files/DependencySuccessTest.php
new file mode 100644
index 0000000..0e4b5dd
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/DependencySuccessTest.php
@@ -0,0 +1,21 @@
+<?php
+class DependencySuccessTest extends PHPUnit_Framework_TestCase
+{
+    public function testOne()
+    {
+    }
+
+    /**
+     * @depends testOne
+     */
+    public function testTwo()
+    {
+    }
+
+    /**
+     * @depends DependencySuccessTest::testTwo
+     */
+    public function testThree()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/DependencyTestSuite.php b/core/vendor/phpunit/phpunit/Tests/_files/DependencyTestSuite.php
new file mode 100644
index 0000000..7680008
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/DependencyTestSuite.php
@@ -0,0 +1,16 @@
+<?php
+require_once 'DependencyFailureTest.php';
+require_once 'DependencySuccessTest.php';
+
+class DependencyTestSuite
+{
+    public static function suite()
+    {
+        $suite = new PHPUnit_Framework_TestSuite('Test Dependencies');
+
+        $suite->addTestSuite('DependencySuccessTest');
+        $suite->addTestSuite('DependencyFailureTest');
+
+        return $suite;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/DoubleTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/DoubleTestCase.php
new file mode 100644
index 0000000..ba601a4
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/DoubleTestCase.php
@@ -0,0 +1,25 @@
+<?php
+class DoubleTestCase implements PHPUnit_Framework_Test
+{
+    protected $testCase;
+
+    public function __construct(PHPUnit_Framework_TestCase $testCase)
+    {
+        $this->testCase = $testCase;
+    }
+
+    public function count()
+    {
+        return 2;
+    }
+
+    public function run(PHPUnit_Framework_TestResult $result = NULL)
+    {
+        $result->startTest($this);
+
+        $this->testCase->runBare();
+        $this->testCase->runBare();
+
+        $result->endTest($this, 0);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/EmptyTestCaseTest.php b/core/vendor/phpunit/phpunit/Tests/_files/EmptyTestCaseTest.php
new file mode 100644
index 0000000..2a77bb2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/EmptyTestCaseTest.php
@@ -0,0 +1,4 @@
+<?php
+class EmptyTestCaseTest extends PHPUnit_Framework_TestCase
+{
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Error.php b/core/vendor/phpunit/phpunit/Tests/_files/Error.php
new file mode 100644
index 0000000..9417ba6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Error.php
@@ -0,0 +1,8 @@
+<?php
+class Error extends PHPUnit_Framework_TestCase
+{
+    protected function runTest()
+    {
+        throw new Exception;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInAssertPostConditionsTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInAssertPostConditionsTest.php
new file mode 100644
index 0000000..671403e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInAssertPostConditionsTest.php
@@ -0,0 +1,35 @@
+<?php
+class ExceptionInAssertPostConditionsTest extends PHPUnit_Framework_TestCase
+{
+    public $setUp = FALSE;
+    public $assertPreConditions = FALSE;
+    public $assertPostConditions = FALSE;
+    public $tearDown = FALSE;
+    public $testSomething = FALSE;
+
+    protected function setUp()
+    {
+        $this->setUp = TRUE;
+    }
+
+    protected function assertPreConditions()
+    {
+        $this->assertPreConditions = TRUE;
+    }
+
+    public function testSomething()
+    {
+        $this->testSomething = TRUE;
+    }
+
+    protected function assertPostConditions()
+    {
+        $this->assertPostConditions = TRUE;
+        throw new Exception;
+    }
+
+    protected function tearDown()
+    {
+        $this->tearDown = TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInAssertPreConditionsTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInAssertPreConditionsTest.php
new file mode 100644
index 0000000..01f571a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInAssertPreConditionsTest.php
@@ -0,0 +1,35 @@
+<?php
+class ExceptionInAssertPreConditionsTest extends PHPUnit_Framework_TestCase
+{
+    public $setUp = FALSE;
+    public $assertPreConditions = FALSE;
+    public $assertPostConditions = FALSE;
+    public $tearDown = FALSE;
+    public $testSomething = FALSE;
+
+    protected function setUp()
+    {
+        $this->setUp = TRUE;
+    }
+
+    protected function assertPreConditions()
+    {
+        $this->assertPreConditions = TRUE;
+        throw new Exception;
+    }
+
+    public function testSomething()
+    {
+        $this->testSomething = TRUE;
+    }
+
+    protected function assertPostConditions()
+    {
+        $this->assertPostConditions = TRUE;
+    }
+
+    protected function tearDown()
+    {
+        $this->tearDown = TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInSetUpTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInSetUpTest.php
new file mode 100644
index 0000000..e0861cd
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInSetUpTest.php
@@ -0,0 +1,35 @@
+<?php
+class ExceptionInSetUpTest extends PHPUnit_Framework_TestCase
+{
+    public $setUp = FALSE;
+    public $assertPreConditions = FALSE;
+    public $assertPostConditions = FALSE;
+    public $tearDown = FALSE;
+    public $testSomething = FALSE;
+
+    protected function setUp()
+    {
+        $this->setUp = TRUE;
+        throw new Exception;
+    }
+
+    protected function assertPreConditions()
+    {
+        $this->assertPreConditions = TRUE;
+    }
+
+    public function testSomething()
+    {
+        $this->testSomething = TRUE;
+    }
+
+    protected function assertPostConditions()
+    {
+        $this->assertPostConditions = TRUE;
+    }
+
+    protected function tearDown()
+    {
+        $this->tearDown = TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInTearDownTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInTearDownTest.php
new file mode 100644
index 0000000..3688dfc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInTearDownTest.php
@@ -0,0 +1,35 @@
+<?php
+class ExceptionInTearDownTest extends PHPUnit_Framework_TestCase
+{
+    public $setUp = FALSE;
+    public $assertPreConditions = FALSE;
+    public $assertPostConditions = FALSE;
+    public $tearDown = FALSE;
+    public $testSomething = FALSE;
+
+    protected function setUp()
+    {
+        $this->setUp = TRUE;
+    }
+
+    protected function assertPreConditions()
+    {
+        $this->assertPreConditions = TRUE;
+    }
+
+    public function testSomething()
+    {
+        $this->testSomething = TRUE;
+    }
+
+    protected function assertPostConditions()
+    {
+        $this->assertPostConditions = TRUE;
+    }
+
+    protected function tearDown()
+    {
+        $this->tearDown = TRUE;
+        throw new Exception;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInTest.php
new file mode 100644
index 0000000..2b1b66c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionInTest.php
@@ -0,0 +1,35 @@
+<?php
+class ExceptionInTest extends PHPUnit_Framework_TestCase
+{
+    public $setUp = FALSE;
+    public $assertPreConditions = FALSE;
+    public $assertPostConditions = FALSE;
+    public $tearDown = FALSE;
+    public $testSomething = FALSE;
+
+    protected function setUp()
+    {
+        $this->setUp = TRUE;
+    }
+
+    protected function assertPreConditions()
+    {
+        $this->assertPreConditions = TRUE;
+    }
+
+    public function testSomething()
+    {
+        $this->testSomething = TRUE;
+        throw new Exception;
+    }
+
+    protected function assertPostConditions()
+    {
+        $this->assertPostConditions = TRUE;
+    }
+
+    protected function tearDown()
+    {
+        $this->tearDown = TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionNamespaceTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionNamespaceTest.php
new file mode 100644
index 0000000..9644aae
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionNamespaceTest.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace My\Space;
+
+class ExceptionNamespaceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Exception message
+     *
+     * @var string
+     */
+    const ERROR_MESSAGE = 'Exception namespace message';
+
+    /**
+     * Exception code
+     *
+     * @var integer
+     */
+    const ERROR_CODE = 200;
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionMessage My\Space\ExceptionNamespaceTest::ERROR_MESSAGE
+     * @expectedExceptionCode My\Space\ExceptionNamespaceTest::ERROR_CODE
+     */
+    public function testConstants()
+    {
+    }
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionCode My\Space\ExceptionNamespaceTest::UNKNOWN_CODE_CONSTANT
+     * @expectedExceptionMessage My\Space\ExceptionNamespaceTest::UNKNOWN_MESSAGE_CONSTANT
+     */
+    public function testUnknownConstants()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionStack.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionStack.php
new file mode 100644
index 0000000..0363b9e
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionStack.php
@@ -0,0 +1,23 @@
+<?php 
+class ExceptionStackTestException extends Exception { }
+
+class ExceptionStackTest extends PHPUnit_Framework_TestCase
+{
+    public function testPrintingChildException()
+    {
+        try {
+            $this->assertEquals(array(1), array(2), 'message');
+        } catch (PHPUnit_Framework_ExpectationFailedException $e) {
+            $message = $e->getMessage() . "\n" . $e->getComparisonFailure()->getDiff();
+            throw new ExceptionStackTestException("Child exception\n$message", 101, $e);
+        }
+    }
+
+    public function testNestedExceptions()
+    {
+        $exceptionThree = new Exception('Three');
+        $exceptionTwo = new InvalidArgumentException('Two', 0, $exceptionThree);
+        $exceptionOne = new Exception('One', 0, $exceptionTwo);
+        throw $exceptionOne;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ExceptionTest.php b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionTest.php
new file mode 100644
index 0000000..3493743
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ExceptionTest.php
@@ -0,0 +1,97 @@
+<?php
+class ExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * Exception message
+     * 
+     * @var string
+     */
+    const ERROR_MESSAGE = 'Exception message';
+
+    /**
+     * Exception code
+     * 
+     * @var integer
+     */
+    const ERROR_CODE = 500;
+
+    /**
+     * @expectedException FooBarBaz
+     */
+    public function testOne()
+    {
+    }
+
+    /**
+     * @expectedException Foo_Bar_Baz
+     */
+    public function testTwo()
+    {
+    }
+
+    /**
+     * @expectedException Foo\Bar\Baz
+     */
+    public function testThree()
+    {
+    }
+
+    /**
+     * @expectedException ã»ã’
+     */
+    public function testFour()
+    {
+    }
+
+    /**
+     * @expectedException Class Message 1234
+     */
+    public function testFive()
+    {
+    }
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionMessage Message
+     * @expectedExceptionCode 1234
+     */
+    public function testSix()
+    {
+    }
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionMessage Message
+     * @expectedExceptionCode ExceptionCode
+     */
+    public function testSeven()
+    {
+    }
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionMessage Message
+     * @expectedExceptionCode 0
+     */
+    public function testEight()
+    {
+    }
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionMessage ExceptionTest::ERROR_MESSAGE
+     * @expectedExceptionCode ExceptionTest::ERROR_CODE
+     */
+    public function testNine()
+    {
+    }
+
+    /**
+     * @expectedException Class
+     * @expectedExceptionCode ExceptionTest::UNKNOWN_CODE_CONSTANT
+     * @expectedExceptionMessage ExceptionTest::UNKNOWN_MESSAGE_CONSTANT
+     */
+    public function testUnknownConstants()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Failure.php b/core/vendor/phpunit/phpunit/Tests/_files/Failure.php
new file mode 100644
index 0000000..586aa54
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Failure.php
@@ -0,0 +1,8 @@
+<?php
+class Failure extends PHPUnit_Framework_TestCase
+{
+    protected function runTest()
+    {
+        $this->fail();
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/FailureTest.php b/core/vendor/phpunit/phpunit/Tests/_files/FailureTest.php
new file mode 100644
index 0000000..89a5843
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/FailureTest.php
@@ -0,0 +1,76 @@
+<?php
+class FailureTest extends PHPUnit_Framework_TestCase
+{
+    public function testAssertArrayEqualsArray()
+    {
+        $this->assertEquals(array(1), array(2), 'message');
+    }
+
+    public function testAssertIntegerEqualsInteger()
+    {
+        $this->assertEquals(1, 2, 'message');
+    }
+
+    public function testAssertObjectEqualsObject()
+    {
+        $a = new StdClass;
+        $a->foo = 'bar';
+
+        $b = new StdClass;
+        $b->bar = 'foo';
+
+        $this->assertEquals($a, $b, 'message');
+    }
+
+    public function testAssertNullEqualsString()
+    {
+        $this->assertEquals(NULL, 'bar', 'message');
+    }
+
+    public function testAssertStringEqualsString()
+    {
+        $this->assertEquals('foo', 'bar', 'message');
+    }
+
+    public function testAssertTextEqualsText()
+    {
+        $this->assertEquals("foo\nbar\n", "foo\nbaz\n", 'message');
+    }
+
+    public function testAssertStringMatchesFormat()
+    {
+        $this->assertStringMatchesFormat('*%s*', '**', 'message');
+    }
+
+    public function testAssertNumericEqualsNumeric()
+    {
+        $this->assertEquals(1, 2, 'message');
+    }
+
+    public function testAssertTextSameText()
+    {
+        $this->assertSame('foo', 'bar', 'message');
+    }
+
+    public function testAssertObjectSameObject()
+    {
+        $this->assertSame(new StdClass, new StdClass, 'message');
+    }
+
+    public function testAssertObjectSameNull()
+    {
+        $this->assertSame(new StdClass, NULL, 'message');
+    }
+
+    public function testAssertFloatSameFloat()
+    {
+        $this->assertSame(1.0, 1.5, 'message');
+    }
+
+    // Note that due to the implementation of this assertion it counts as 2 asserts
+    public function testAssertStringMatchesFormatFile()
+    {
+        $this->assertStringMatchesFormatFile(__DIR__ . '/expectedFileFormat.txt', '...BAR...');
+    }
+
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/FatalTest.php b/core/vendor/phpunit/phpunit/Tests/_files/FatalTest.php
new file mode 100644
index 0000000..6d07437
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/FatalTest.php
@@ -0,0 +1,10 @@
+<?php
+
+class FatalTest extends PHPUnit_Framework_TestCase
+{
+    public function testFatalError()
+    {
+        non_existing_function();
+    }
+
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/IncompleteTest.php b/core/vendor/phpunit/phpunit/Tests/_files/IncompleteTest.php
new file mode 100644
index 0000000..36ca8a0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/IncompleteTest.php
@@ -0,0 +1,8 @@
+<?php
+class IncompleteTest extends PHPUnit_Framework_TestCase
+{
+    public function testIncomplete()
+    {
+        $this->markTestIncomplete('Test incomplete');
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/InheritedTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/InheritedTestCase.php
new file mode 100644
index 0000000..1a15eb6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/InheritedTestCase.php
@@ -0,0 +1,9 @@
+<?php
+require_once 'OneTestCase.php';
+
+class InheritedTestCase extends OneTestCase
+{
+    public function test2()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/JsonData/arrayObject.js b/core/vendor/phpunit/phpunit/Tests/_files/JsonData/arrayObject.js
new file mode 100644
index 0000000..8a74fc5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/JsonData/arrayObject.js
@@ -0,0 +1 @@
+["Mascott", "Tux", "OS", "Linux"]
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/JsonData/simpleObject.js b/core/vendor/phpunit/phpunit/Tests/_files/JsonData/simpleObject.js
new file mode 100644
index 0000000..27085be
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/JsonData/simpleObject.js
@@ -0,0 +1 @@
+{"Mascott":"Tux"}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/JsonData/simpleObject2.js b/core/vendor/phpunit/phpunit/Tests/_files/JsonData/simpleObject2.js
new file mode 100644
index 0000000..27085be
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/JsonData/simpleObject2.js
@@ -0,0 +1 @@
+{"Mascott":"Tux"}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/MockRunner.php b/core/vendor/phpunit/phpunit/Tests/_files/MockRunner.php
new file mode 100644
index 0000000..b3bc0cc
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/MockRunner.php
@@ -0,0 +1,7 @@
+<?php
+class MockRunner extends PHPUnit_Runner_BaseTestRunner
+{
+    protected function runFailed($message)
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/MultiDependencyTest.php b/core/vendor/phpunit/phpunit/Tests/_files/MultiDependencyTest.php
new file mode 100644
index 0000000..886a809
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/MultiDependencyTest.php
@@ -0,0 +1,23 @@
+<?php
+class MultiDependencyTest extends PHPUnit_Framework_TestCase
+{
+    public function testOne()
+    {
+        return 'foo';
+    }
+
+    public function testTwo()
+    {
+        return 'bar';
+    }
+
+    /**
+     * @depends testOne
+     * @depends testTwo
+     */
+    public function testThree($a, $b)
+    {
+        $this->assertEquals('foo', $a);
+        $this->assertEquals('bar', $b);
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NoArgTestCaseTest.php b/core/vendor/phpunit/phpunit/Tests/_files/NoArgTestCaseTest.php
new file mode 100644
index 0000000..5867ba3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NoArgTestCaseTest.php
@@ -0,0 +1,7 @@
+<?php
+class NoArgTestCaseTest extends PHPUnit_Framework_TestCase
+{
+    public function testNothing()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NoTestCaseClass.php b/core/vendor/phpunit/phpunit/Tests/_files/NoTestCaseClass.php
new file mode 100644
index 0000000..d64e4e1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NoTestCaseClass.php
@@ -0,0 +1,4 @@
+<?php
+class NoTestCaseClass
+{
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NoTestCases.php b/core/vendor/phpunit/phpunit/Tests/_files/NoTestCases.php
new file mode 100644
index 0000000..ae93233
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NoTestCases.php
@@ -0,0 +1,7 @@
+<?php
+class NoTestCases extends PHPUnit_Framework_TestCase
+{
+    public function noTestCase()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NonStatic.php b/core/vendor/phpunit/phpunit/Tests/_files/NonStatic.php
new file mode 100644
index 0000000..5355b3c
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NonStatic.php
@@ -0,0 +1,8 @@
+<?php
+class NonStatic
+{
+    public function suite()
+    {
+        return NULL;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NotPublicTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/NotPublicTestCase.php
new file mode 100644
index 0000000..a391010
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NotPublicTestCase.php
@@ -0,0 +1,11 @@
+<?php
+class NotPublicTestCase extends PHPUnit_Framework_TestCase
+{
+    public function testPublic()
+    {
+    }
+
+    protected function testNotPublic()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NotVoidTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/NotVoidTestCase.php
new file mode 100644
index 0000000..19a9567
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NotVoidTestCase.php
@@ -0,0 +1,4 @@
+<?php
+class NotVoidTestCase extends PHPUnit_Framework_TestCase
+{
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/NothingTest.php b/core/vendor/phpunit/phpunit/Tests/_files/NothingTest.php
new file mode 100644
index 0000000..b56d7d7
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/NothingTest.php
@@ -0,0 +1,7 @@
+<?php
+class NothingTest extends PHPUnit_Framework_TestCase
+{
+    public function testNothing()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/OneTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/OneTestCase.php
new file mode 100644
index 0000000..15eeed9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/OneTestCase.php
@@ -0,0 +1,11 @@
+<?php
+class OneTestCase extends PHPUnit_Framework_TestCase
+{
+    public function noTestCase()
+    {
+    }
+
+    public function testCase($arg = '')
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/OutputTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/OutputTestCase.php
new file mode 100644
index 0000000..ae972b5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/OutputTestCase.php
@@ -0,0 +1,27 @@
+<?php
+class OutputTestCase extends PHPUnit_Framework_TestCase
+{
+    public function testExpectOutputStringFooActualFoo()
+    {
+        $this->expectOutputString('foo');
+        print 'foo';
+    }
+
+    public function testExpectOutputStringFooActualBar()
+    {
+        $this->expectOutputString('foo');
+        print 'bar';
+    }
+
+    public function testExpectOutputRegexFooActualFoo()
+    {
+        $this->expectOutputRegex('/foo/');
+        print 'foo';
+    }
+
+    public function testExpectOutputRegexFooActualBar()
+    {
+        $this->expectOutputRegex('/foo/');
+        print 'bar';
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/OverrideTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/OverrideTestCase.php
new file mode 100644
index 0000000..63ca294
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/OverrideTestCase.php
@@ -0,0 +1,9 @@
+<?php
+require_once 'OneTestCase.php';
+
+class OverrideTestCase extends OneTestCase
+{
+    public function testCase($arg = '')
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/RequirementsClassDocBlockTest.php b/core/vendor/phpunit/phpunit/Tests/_files/RequirementsClassDocBlockTest.php
new file mode 100644
index 0000000..ffe2522
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/RequirementsClassDocBlockTest.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @requires PHP 5.3
+ * @requires PHPUnit 3.8
+ * @requires function testFuncClass
+ * @requires extension testExtClass
+ */
+class RequirementsClassDocBlockTest {
+
+    /**
+     * @requires PHP 5.4
+     * @requires PHPUnit 3.7
+     * @requires function testFuncMethod
+     * @requires extension testExtMethod
+     */
+    public function testMethod()
+    {
+    }
+
+}
+
+
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/RequirementsTest.php b/core/vendor/phpunit/phpunit/Tests/_files/RequirementsTest.php
new file mode 100644
index 0000000..1ac6a06
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/RequirementsTest.php
@@ -0,0 +1,112 @@
+<?php
+class RequirementsTest extends PHPUnit_Framework_TestCase
+{
+    public function testOne()
+    {
+    }
+
+    /**
+     * @requires PHPUnit 1.0
+     */
+    public function testTwo()
+    {
+    }
+
+    /**
+     * @requires PHP 2.0
+     */
+    public function testThree()
+    {
+    }
+
+    /**
+     * @requires PHPUnit 2.0
+     * @requires PHP 1.0
+     */
+    public function testFour()
+    {
+    }
+
+    /**
+     * @requires PHP 5.4.0RC6
+     */
+    public function testFive()
+    {
+    }
+
+    /**
+     * @requires PHP 5.4.0-alpha1
+     */
+    public function testSix()
+    {
+    }
+
+    /**
+     * @requires PHP 5.4.0beta2
+     */
+    public function testSeven()
+    {
+    }
+
+    /**
+     * @requires PHP 5.4-dev
+     */
+    public function testEight()
+    {
+    }
+
+
+    /**
+     * @requires function testFunc
+     */
+    public function testNine()
+    {
+    }
+
+    /**
+     * @requires extension testExt
+     */
+    public function testTen()
+    {
+    }
+
+    /**
+     * @requires PHP 99-dev
+     * @requires PHPUnit 9-dev
+     * @requires function testFuncOne
+     * @requires function testFuncTwo
+     * @requires extension testExtOne
+     * @requires extension testExtTwo
+     */
+    public function testAllPossibleRequirements()
+    {
+    }
+
+    /**
+     * @requires function array_merge
+     */
+    public function testExistingFunction()
+    {
+    }
+
+    /**
+     * @requires extension spl
+     */
+    public function testExistingExtension()
+    {
+    }
+
+    /**
+     * @requires PHPUnit 1111111
+     */
+    public function testAlwaysSkip()
+    {
+    }
+
+    /**
+     * @requires PHP 9999999
+     */
+    public function testAlwaysSkip2()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/SampleClass.php b/core/vendor/phpunit/phpunit/Tests/_files/SampleClass.php
new file mode 100644
index 0000000..06c51c5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/SampleClass.php
@@ -0,0 +1,14 @@
+<?php
+class SampleClass
+{
+    public $a;
+    protected $b;
+    protected $c;
+
+    public function __construct($a, $b, $c)
+    {
+        $this->a = $a;
+        $this->b = $b;
+        $this->c = $c;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/SelectorAssertionsFixture.html b/core/vendor/phpunit/phpunit/Tests/_files/SelectorAssertionsFixture.html
new file mode 100644
index 0000000..b8e908f
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/SelectorAssertionsFixture.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+        "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+  <title>Login</title>
+  <link type="text/css" rel="Stylesheet" href="/stylesheets/screen.css">
+  <script type="text/javaScript" src="/javascripts/login.js">
+ </head>
+ <body id="login">
+  <ul id="my_ul" class="my_ul_class">
+    <li class="my_li">Test LI 1</li>
+    <li class="my_li">Test LI 2</li>
+    <li class="my_li">Test LI 3</li>
+  </ul>
+  <ul id="another_ul" class="my_ul_class">
+    <li class="my_li">Test LI 4</li>
+  </ul>
+  <div id="test_id" class="my_test_class">
+    <div id="test_child_id">
+      <span id="test_subchild_id">My Subchild</span>
+      My Child
+    </div>
+
+    Test Id Text
+  </div>
+  <div id="test_children" class="children">
+    My Children
+    <div class="my_child">1</div>
+    <div class="my_child">2</div>
+    <div class="my_child">3</div>
+    <div class="my_child">4</div>
+  </div>
+  <span class="test_class">
+    Test Class Text
+  </span>
+  <img src="/images/login_logo.gif" alt="Login Logo">
+  <input id="input_test_id" type="text" class="full">
+  <div id="test_text">
+    My test tag content
+    <div class="another_node">more text</div>
+  </div>
+  <div id="test_multi_class" class="multi part class">test</div>
+ </body>
+</html>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Singleton.php b/core/vendor/phpunit/phpunit/Tests/_files/Singleton.php
new file mode 100644
index 0000000..7724086
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Singleton.php
@@ -0,0 +1,22 @@
+<?php
+class Singleton
+{
+    private static $uniqueInstance = NULL;
+
+    protected function __construct()
+    {
+    }
+
+    private final function __clone()
+    {
+    }
+
+    public static function getInstance()
+    {
+        if (self::$uniqueInstance === NULL) {
+            self::$uniqueInstance = new Singleton;
+        }
+
+        return self::$uniqueInstance;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/StackTest.php b/core/vendor/phpunit/phpunit/Tests/_files/StackTest.php
new file mode 100644
index 0000000..2e29e87
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/StackTest.php
@@ -0,0 +1,24 @@
+<?php
+class StackTest extends PHPUnit_Framework_TestCase
+{
+    public function testPush()
+    {
+        $stack = array();
+        $this->assertEquals(0, count($stack));
+
+        array_push($stack, 'foo');
+        $this->assertEquals('foo', $stack[count($stack)-1]);
+        $this->assertEquals(1, count($stack));
+
+        return $stack;
+    }
+
+    /**
+     * @depends testPush
+     */
+    public function testPop(array $stack)
+    {
+        $this->assertEquals('foo', array_pop($stack));
+        $this->assertEquals(0, count($stack));
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Struct.php b/core/vendor/phpunit/phpunit/Tests/_files/Struct.php
new file mode 100644
index 0000000..12977a9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Struct.php
@@ -0,0 +1,10 @@
+<?php
+class Struct
+{
+    public $var;
+
+    public function __construct($var)
+    {
+        $this->var = $var;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/Success.php b/core/vendor/phpunit/phpunit/Tests/_files/Success.php
new file mode 100644
index 0000000..6d3dd61
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/Success.php
@@ -0,0 +1,7 @@
+<?php
+class Success extends PHPUnit_Framework_TestCase
+{
+    protected function runTest()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/TemplateMethodsTest.php b/core/vendor/phpunit/phpunit/Tests/_files/TemplateMethodsTest.php
new file mode 100644
index 0000000..8977956
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/TemplateMethodsTest.php
@@ -0,0 +1,52 @@
+<?php
+class TemplateMethodsTest extends PHPUnit_Framework_TestCase
+{
+    public static function setUpBeforeClass()
+    {
+        print __METHOD__ . "\n";
+    }
+
+    protected function setUp()
+    {
+        print __METHOD__ . "\n";
+    }
+
+    protected function assertPreConditions()
+    {
+        print __METHOD__ . "\n";
+    }
+
+    public function testOne()
+    {
+        print __METHOD__ . "\n";
+        $this->assertTrue(TRUE);
+    }
+
+    public function testTwo()
+    {
+        print __METHOD__ . "\n";
+        $this->assertTrue(FALSE);
+    }
+
+    protected function assertPostConditions()
+    {
+        print __METHOD__ . "\n";
+    }
+
+    protected function tearDown()
+    {
+        print __METHOD__ . "\n";
+    }
+
+    public static function tearDownAfterClass()
+    {
+        print __METHOD__ . "\n";
+    }
+
+    protected function onNotSuccessfulTest(Exception $e)
+    {
+        print __METHOD__ . "\n";
+        throw $e;
+    }
+}
+?>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/TestIterator.php b/core/vendor/phpunit/phpunit/Tests/_files/TestIterator.php
new file mode 100644
index 0000000..c834efb
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/TestIterator.php
@@ -0,0 +1,36 @@
+<?php
+class TestIterator implements Iterator
+{
+    protected $array;
+    protected $position;
+
+    public function __construct($array = array())
+    {
+        $this->array = $array;
+    }
+
+    public function rewind()
+    {
+        $this->position = 0;
+    }
+
+    public function valid()
+    {
+        return $this->position < count($this->array);
+    }
+
+    public function key()
+    {
+        return $this->position;
+    }
+
+    public function current()
+    {
+        return $this->array[$this->position];
+    }
+
+    public function next()
+    {
+        $this->position++;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ThrowExceptionTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/ThrowExceptionTestCase.php
new file mode 100644
index 0000000..0f8af55
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ThrowExceptionTestCase.php
@@ -0,0 +1,8 @@
+<?php
+class ThrowExceptionTestCase extends PHPUnit_Framework_TestCase
+{
+    public function test()
+    {
+        throw new RuntimeException;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/ThrowNoExceptionTestCase.php b/core/vendor/phpunit/phpunit/Tests/_files/ThrowNoExceptionTestCase.php
new file mode 100644
index 0000000..76958cb
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/ThrowNoExceptionTestCase.php
@@ -0,0 +1,7 @@
+<?php
+class ThrowNoExceptionTestCase extends PHPUnit_Framework_TestCase
+{
+    public function test()
+    {
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/WasRun.php b/core/vendor/phpunit/phpunit/Tests/_files/WasRun.php
new file mode 100644
index 0000000..8e4612b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/WasRun.php
@@ -0,0 +1,10 @@
+<?php
+class WasRun extends PHPUnit_Framework_TestCase
+{
+    public $wasRun = FALSE;
+
+    protected function runTest()
+    {
+        $this->wasRun = TRUE;
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/bar.xml b/core/vendor/phpunit/phpunit/Tests/_files/bar.xml
new file mode 100644
index 0000000..5d3fa28
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/bar.xml
@@ -0,0 +1 @@
+<bar/>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/configuration.xml b/core/vendor/phpunit/phpunit/Tests/_files/configuration.xml
new file mode 100644
index 0000000..1b5cb6d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/configuration.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<phpunit backupGlobals="true"
+         backupStaticAttributes="false"
+         bootstrap="/path/to/bootstrap.php"
+         cacheTokens="true"
+         colors="false"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         forceCoversAnnotation="false"
+         mapTestClassNameToCoveredClassName="false"
+         printerClass="PHPUnit_TextUI_ResultPrinter"
+         stopOnFailure="false"
+         testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
+         timeoutForSmallTests="1"
+         timeoutForMediumTests="10"
+         timeoutForLargeTests="60"
+         strict="false"
+         verbose="false">
+  <testsuites>
+    <testsuite name="My Test Suite">
+      <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">/path/to/files</directory>
+      <file phpVersion="5.3.0" phpVersionOperator=">=">/path/to/MyTest.php</file>
+    </testsuite>
+  </testsuites>
+
+  <groups>
+    <include>
+      <group>name</group>
+    </include>
+    <exclude>
+      <group>name</group>
+    </exclude>
+  </groups>
+
+  <filter>
+    <blacklist>
+      <directory suffix=".php">/path/to/files</directory>
+      <file>/path/to/file</file>
+      <exclude>
+        <directory suffix=".php">/path/to/files</directory>
+        <file>/path/to/file</file>
+      </exclude>
+    </blacklist>
+    <whitelist processUncoveredFilesFromWhitelist="false">
+      <directory suffix=".php">/path/to/files</directory>
+      <file>/path/to/file</file>
+      <exclude>
+        <directory suffix=".php">/path/to/files</directory>
+        <file>/path/to/file</file>
+      </exclude>
+    </whitelist>
+  </filter>
+
+  <listeners>
+    <listener class="MyListener" file="/optional/path/to/MyListener.php">
+      <arguments>
+        <array>
+          <element key="0">
+            <string>Sebastian</string>
+          </element>
+        </array>
+        <integer>22</integer>
+        <string>April</string>
+        <double>19.78</double>
+        <null/>
+        <object class="stdClass"/>
+        <file>MyTestFile.php</file>
+        <directory>MyRelativePath</directory>
+      </arguments>
+    </listener>
+    <listener class="IncludePathListener" file="ConfigurationTest.php" />
+    <listener class="CompactArgumentsListener" file="/CompactArgumentsListener.php"><arguments><integer>42</integer></arguments></listener>
+  </listeners>
+
+  <logging>
+    <log type="coverage-html" target="/tmp/report"
+         charset="UTF-8" highlight="false"
+         lowUpperBound="35" highLowerBound="70"/>
+    <log type="coverage-clover" target="/tmp/clover.xml"/>
+    <log type="json" target="/tmp/logfile.json"/>
+    <log type="plain" target="/tmp/logfile.txt"/>
+    <log type="tap" target="/tmp/logfile.tap"/>
+    <log type="junit" target="/tmp/logfile.xml" logIncompleteSkipped="false"/>
+    <log type="testdox-html" target="/tmp/testdox.html"/>
+    <log type="testdox-text" target="/tmp/testdox.txt"/>
+  </logging>
+
+  <php>
+    <includePath>.</includePath>
+    <includePath>/path/to/lib</includePath>
+    <ini name="foo" value="bar"/>
+    <const name="FOO" value="false"/>
+    <const name="BAR" value="true"/>
+    <var name="foo" value="false"/>
+    <env name="foo" value="true"/>
+    <post name="foo" value="bar"/>
+    <get name="foo" value="bar"/>
+    <cookie name="foo" value="bar"/>
+    <server name="foo" value="bar"/>
+    <files name="foo" value="bar"/>
+    <request name="foo" value="bar"/>
+  </php>
+
+  <selenium>
+    <browser name="Firefox on Linux"
+             browser="*firefox /usr/lib/firefox/firefox-bin"
+             host="my.linux.box"
+             port="4444"
+             timeout="30000"/>
+  </selenium>
+</phpunit>
+
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/expectedFileFormat.txt b/core/vendor/phpunit/phpunit/Tests/_files/expectedFileFormat.txt
new file mode 100644
index 0000000..b7d6715
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/expectedFileFormat.txt
@@ -0,0 +1 @@
+FOO
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/foo.xml b/core/vendor/phpunit/phpunit/Tests/_files/foo.xml
new file mode 100644
index 0000000..f1999f8
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/foo.xml
@@ -0,0 +1 @@
+<foo/>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/structureAttributesAreSameButValuesAreNot.xml b/core/vendor/phpunit/phpunit/Tests/_files/structureAttributesAreSameButValuesAreNot.xml
new file mode 100644
index 0000000..a5d9ab3
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/structureAttributesAreSameButValuesAreNot.xml
@@ -0,0 +1,10 @@
+<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+  <draw:frame xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" svg:width="12.567708175cm" svg:height="16.848541467cm" draw:style-name="Frame">
+    <draw:text-box>
+      <draw:frame svg:width="12.567708175cm" svg:height="15.848541467cm" draw:style-name="Image">
+        <draw:image xmlns:xlink="notthesame" xlink:href="Pictures/kristian.jpg"/>
+      </draw:frame>
+      <text:p text:style-name="Text">Image <text:sequence xmlns:style="notthesame" text:ref-name="refImage1" style:num-format="1" text:formula="ooow:Image+1" text:name="Image">1</text:sequence>: Dette er en test caption</text:p>
+    </draw:text-box>
+  </draw:frame>
+</text:p>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/structureExpected.xml b/core/vendor/phpunit/phpunit/Tests/_files/structureExpected.xml
new file mode 100644
index 0000000..d900105
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/structureExpected.xml
@@ -0,0 +1,10 @@
+<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+  <draw:frame xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" svg:width="12.567708175cm" svg:height="16.848541467cm" draw:style-name="Frame">
+    <draw:text-box>
+      <draw:frame svg:width="12.567708175cm" svg:height="15.848541467cm" draw:style-name="Image">
+        <draw:image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="Pictures/kristian.jpg"/>
+      </draw:frame>
+      <text:p text:style-name="Text">Image <text:sequence xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" text:ref-name="refImage1" style:num-format="1" text:formula="ooow:Image+1" text:name="Image">1</text:sequence>: Dette er en test caption</text:p>
+    </draw:text-box>
+  </draw:frame>
+</text:p>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/structureIgnoreTextNodes.xml b/core/vendor/phpunit/phpunit/Tests/_files/structureIgnoreTextNodes.xml
new file mode 100644
index 0000000..177e2bf
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/structureIgnoreTextNodes.xml
@@ -0,0 +1,13 @@
+<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+  <draw:frame xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" svg:width="12.567708175cm" svg:height="16.848541467cm" draw:style-name="Frame">
+    <draw:text-box>
+	textnode
+      <draw:frame svg:width="12.567708175cm" svg:height="15.848541467cm" draw:style-name="Image">
+        <draw:image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="Pictures/kristian.jpg"/> textnode
+      </draw:frame>
+	  textnode
+      <text:p text:style-name="Text">Image <text:sequence xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" text:ref-name="refImage1" style:num-format="1" text:formula="ooow:Image+1" text:name="Image">1</text:sequence>: Dette er en test caption</text:p>
+	  textnode
+    </draw:text-box>
+  </draw:frame>
+</text:p>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/structureIsSameButDataIsNot.xml b/core/vendor/phpunit/phpunit/Tests/_files/structureIsSameButDataIsNot.xml
new file mode 100644
index 0000000..2ba21b9
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/structureIsSameButDataIsNot.xml
@@ -0,0 +1,10 @@
+<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+  <draw:frame xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" svg:width="12.567708175cm" svg:height="16.848541467cm" draw:style-name="Frame">
+    <draw:text-box>
+      <draw:frame svg:width="12.567708175cm" svg:height="15.848541467cm" draw:style-name="Image">
+        <draw:image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="Pictures/kristian.jpg"/>
+      </draw:frame>
+      <text:p text:style-name="Text">Image is not the same <text:sequence xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" text:ref-name="refImage1" style:num-format="1" text:formula="ooow:Image+1" text:name="Image">1</text:sequence>: Dette er en test caption</text:p>
+    </draw:text-box>
+  </draw:frame>
+</text:p>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/structureWrongNumberOfAttributes.xml b/core/vendor/phpunit/phpunit/Tests/_files/structureWrongNumberOfAttributes.xml
new file mode 100644
index 0000000..af9b974
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/structureWrongNumberOfAttributes.xml
@@ -0,0 +1,10 @@
+<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+  <draw:frame xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" svg:width="12.567708175cm" svg:height="16.848541467cm" draw:style-name="Frame">
+    <draw:text-box>
+      <draw:frame svg:width="12.567708175cm" svg:height="15.848541467cm" draw:style-name="Image">
+        <draw:image/>
+      </draw:frame>
+      <text:p text:style-name="Text">Image <text:sequence xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" text:ref-name="refImage1" style:num-format="1" text:formula="ooow:Image+1" text:name="Image">1</text:sequence>: Dette er en test caption</text:p>
+    </draw:text-box>
+  </draw:frame>
+</text:p>
diff --git a/core/vendor/phpunit/phpunit/Tests/_files/structureWrongNumberOfNodes.xml b/core/vendor/phpunit/phpunit/Tests/_files/structureWrongNumberOfNodes.xml
new file mode 100644
index 0000000..9a394e2
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/Tests/_files/structureWrongNumberOfNodes.xml
@@ -0,0 +1,9 @@
+<text:p xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
+  <draw:frame xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" svg:width="12.567708175cm" svg:height="16.848541467cm" draw:style-name="Frame">
+    <draw:text-box>
+      <draw:frame svg:width="12.567708175cm" svg:height="15.848541467cm" draw:style-name="Image">
+        <draw:image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="Pictures/kristian.jpg"/>
+      </draw:frame>
+    </draw:text-box>
+  </draw:frame>
+</text:p>
diff --git a/core/vendor/phpunit/phpunit/build.xml b/core/vendor/phpunit/phpunit/build.xml
new file mode 100644
index 0000000..85af784
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build.xml
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project name="PHPUnit" default="build">
+ <property name="php" value="php"/>
+
+ <target name="build"
+   depends="prepare,lint,phploc,pdepend,phpmd-ci,phpcs-ci,phpcpd,phpunit,phpcb"/>
+
+ <target name="build-parallel"
+   depends="prepare,lint,tools-parallel,phpunit,phpcb"/>
+
+ <target name="tools-parallel"
+         description="Run tools in parallel">
+  <parallel threadCount="2">
+   <sequential>
+    <antcall target="pdepend"/>
+    <antcall target="phpmd-ci"/>
+   </sequential>
+   <antcall target="phpcpd"/>
+   <antcall target="phpcs-ci"/>
+   <antcall target="phploc"/>
+  </parallel>
+ </target>
+
+ <target name="clean" description="Cleanup build artifacts">
+  <delete dir="${basedir}/build/api"/>
+  <delete dir="${basedir}/build/code-browser"/>
+  <delete dir="${basedir}/build/coverage"/>
+  <delete dir="${basedir}/build/logs"/>
+  <delete dir="${basedir}/build/pdepend"/>
+  <delete dir="${basedir}/build/phar"/>
+  <delete file="${basedir}/build/phpunit.phar"/>
+ </target>
+
+ <target name="prepare" depends="clean,phpab"
+         description="Prepare for build">
+  <mkdir dir="${basedir}/build/api"/>
+  <mkdir dir="${basedir}/build/code-browser"/>
+  <mkdir dir="${basedir}/build/coverage"/>
+  <mkdir dir="${basedir}/build/logs"/>
+  <mkdir dir="${basedir}/build/pdepend"/>
+  <mkdir dir="${basedir}/build/phar"/>
+  <mkdir dir="${basedir}/build/phpdox"/>
+ </target>
+
+ <target name="phpab" description="Generate autoloader scripts">
+  <exec executable="phpab">
+   <arg value="--output" />
+   <arg path="PHPUnit/Autoload.php" />
+   <arg value="--compat" />
+   <arg value="--template" />
+   <arg path="PHPUnit/Autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="          " />
+   <arg path="PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="lint">
+  <apply executable="${php}" failonerror="true">
+   <arg value="-l" />
+
+   <fileset dir="${basedir}/PHPUnit">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+
+   <fileset dir="${basedir}/Tests">
+    <include name="**/*.php" />
+    <modified />
+   </fileset>
+  </apply>
+ </target>
+
+ <target name="phploc" description="Measure project size using PHPLOC">
+  <exec executable="phploc">
+   <arg value="--log-csv" />
+   <arg value="${basedir}/build/logs/phploc.csv" />
+   <arg path="${basedir}/PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="pdepend"
+         description="Calculate software metrics using PHP_Depend">
+  <exec executable="pdepend">
+   <arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
+   <arg value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
+   <arg value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
+   <arg path="${basedir}/PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="phpmd"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHPUnit" />
+   <arg value="text" />
+   <arg value="${basedir}/build/phpmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpmd-ci"
+         description="Perform project mess detection using PHPMD">
+  <exec executable="phpmd">
+   <arg path="${basedir}/PHPUnit" />
+   <arg value="xml" />
+   <arg value="${basedir}/build/phpmd.xml" />
+   <arg value="--reportfile" />
+   <arg value="${basedir}/build/logs/pmd.xml" />
+  </exec>
+ </target>
+
+ <target name="phpcs"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs">
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHPUnit" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcs-ci"
+         description="Find coding standard violations using PHP_CodeSniffer">
+  <exec executable="phpcs" output="/dev/null">
+   <arg value="--report=checkstyle" />
+   <arg value="--report-file=${basedir}/build/logs/checkstyle.xml" />
+   <arg value="--standard=${basedir}/build/PHPCS" />
+   <arg value="--extensions=php" />
+   <arg value="--ignore=Autoload.php" />
+   <arg path="${basedir}/PHPUnit" />
+   <arg path="${basedir}/Tests" />
+  </exec>
+ </target>
+
+ <target name="phpcpd" description="Find duplicate code using PHPCPD">
+  <exec executable="phpcpd">
+   <arg value="--log-pmd" />
+   <arg value="${basedir}/build/logs/pmd-cpd.xml" />
+   <arg path="${basedir}/PHPUnit" />
+  </exec>
+ </target>
+
+ <target name="phpunit" description="Run unit tests with PHPUnit">
+  <exec executable="${php}" failonerror="true">
+   <arg path="${basedir}/phpunit.php" />
+  </exec>
+ </target>
+
+ <target name="phpcb"
+         description="Aggregate tool output with PHP_CodeBrowser">
+  <exec executable="phpcb">
+   <arg value="--log" />
+   <arg path="${basedir}/build/logs" />
+   <arg value="--source" />
+   <arg path="${basedir}/PHPUnit" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/code-browser" />
+  </exec>
+ </target>
+
+ <target name="phar"
+         description="Create PHAR archive of PHPUnit and all its dependencies"
+         depends="clean,prepare">
+  <exec executable="pear">
+   <arg value="config-set" />
+   <arg value="auto_discover" />
+   <arg value="1" />
+  </exec>
+
+  <exec executable="pear">
+   <arg value="install" />
+   <arg value="--force" />
+   <arg value="--alldeps" />
+   <arg value="--installroot" />
+   <arg path="${basedir}/build/phar" />
+   <arg value="pear.phpunit.de/PHPUnit" />
+   <arg value="pear.phpunit.de/PHPUnit_Selenium" />
+   <arg value="pear.phpunit.de/DbUnit" />
+  </exec>
+
+  <delete dir="${basedir}/build/phar/tmp"/>
+
+  <move todir="${basedir}/build/phar/File">
+   <fileset dir="${basedir}/build/phar/usr/local/php-5.4/lib/php/File"/>
+  </move>
+
+  <move todir="${basedir}/build/phar/PHP">
+   <fileset dir="${basedir}/build/phar/usr/local/php-5.4/lib/php/PHP"/>
+  </move>
+
+  <move todir="${basedir}/build/phar/PHPUnit">
+   <fileset dir="${basedir}/build/phar/usr/local/php-5.4/lib/php/PHPUnit"/>
+  </move>
+
+  <move todir="${basedir}/build/phar/SymfonyComponents">
+   <fileset dir="${basedir}/build/phar/usr/local/php-5.4/lib/php/SymfonyComponents"/>
+  </move>
+
+  <move todir="${basedir}/build/phar/Text">
+   <fileset dir="${basedir}/build/phar/usr/local/php-5.4/lib/php/Text"/>
+  </move>
+
+  <delete dir="${basedir}/build/phar/usr"/>
+
+  <delete>
+   <fileset dir="${basedir}/build/phar">
+    <include name="**/Autoload.php" />
+   </fileset>
+  </delete>
+
+  <exec executable="phpab">
+   <arg value="--all" />
+   <arg value="--phar" />
+   <arg value="--output" />
+   <arg path="${basedir}/build/phpunit.phar" />
+   <arg value="--template" />
+   <arg path="${basedir}/build/phar-autoload.php.in" />
+   <arg value="--indent" />
+   <arg value="          " />
+   <arg path="${basedir}/build/phar" />
+  </exec>
+
+  <chmod file="${basedir}/build/phpunit.phar" perm="ugo+rx"/>
+ </target>
+</project>
diff --git a/core/vendor/phpunit/phpunit/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php b/core/vendor/phpunit/phpunit/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
new file mode 100644
index 0000000..31a2c87
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build/PHPCS/Sniffs/ControlStructures/ControlSignatureSniff.php
@@ -0,0 +1,23 @@
+<?php
+class PHPCS_Sniffs_ControlStructures_ControlSignatureSniff extends PHP_CodeSniffer_Standards_AbstractPatternSniff
+{
+    public function __construct()
+    {
+        parent::__construct(true);
+    }
+
+    protected function getPatterns()
+    {
+        return array(
+          'do {EOL...} while (...);EOL',
+          'while (...) {EOL',
+          'for (...) {EOL',
+          'if (...) {EOL',
+          'foreach (...) {EOL',
+          // Decide wether to use '}EOLelse' or '} else'
+          #'}EOLelse if (...) {EOL',
+          #'}EOLelse {EOL',
+          'do {EOL',
+        );
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php b/core/vendor/phpunit/phpunit/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
new file mode 100644
index 0000000..e91d6c6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build/PHPCS/Sniffs/Whitespace/ConcatenationSpacingSniff.php
@@ -0,0 +1,22 @@
+<?php
+class PHPCS_Sniffs_Whitespace_ConcatenationSpacingSniff implements PHP_CodeSniffer_Sniff
+{
+    public function register()
+    {
+        return array(T_STRING_CONCAT);
+    }
+
+    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
+    {
+        $tokens = $phpcsFile->getTokens();
+
+        if ($tokens[($stackPtr - 1)]['code'] !== T_WHITESPACE ||
+            $tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
+
+            $phpcsFile->addError(
+              'Concatenation operator must be surrounded by whitespace',
+              $stackPtr
+            );
+        }
+    }
+}
diff --git a/core/vendor/phpunit/phpunit/build/PHPCS/ruleset.xml b/core/vendor/phpunit/phpunit/build/PHPCS/ruleset.xml
new file mode 100644
index 0000000..402f214
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build/PHPCS/ruleset.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset name="Sebastian">
+ <description>Sebastian Bergmann's coding standard</description>
+
+ <rule ref="Generic.CodeAnalysis.ForLoopShouldBeWhileLoop"/>
+ <rule ref="Generic.CodeAnalysis.ForLoopWithTestFunctionCall"/>
+ <rule ref="Generic.CodeAnalysis.JumbledIncrementer"/>
+ <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement"/>
+ <rule ref="Generic.CodeAnalysis.UnnecessaryFinalModifier"/>
+ <rule ref="Generic.CodeAnalysis.UselessOverridingMethod"/>
+
+ <rule ref="Generic.Commenting.Todo"/>
+
+ <rule ref="Generic.ControlStructures.InlineControlStructure"/>
+
+ <rule ref="Generic.Files.LineEndings"/>
+
+ <rule ref="Generic.Formatting.DisallowMultipleStatements"/>
+ <rule ref="Generic.Formatting.NoSpaceAfterCast"/>
+
+ <rule ref="Generic.Functions.OpeningFunctionBraceBsdAllman"/>
+ <rule ref="PEAR.Functions.ValidDefaultValue"/>
+
+ <rule ref="Generic.NamingConventions.ConstructorName"/>
+ <rule ref="Generic.NamingConventions.UpperCaseConstantName"/>
+ <rule ref="PEAR.NamingConventions.ValidClassName"/>
+
+ <rule ref="Generic.PHP.DisallowShortOpenTag"/>
+ <rule ref="Generic.PHP.NoSilencedErrors"/>
+ <rule ref="Generic.PHP.UpperCaseConstant"/>
+
+ <rule ref="Generic.WhiteSpace.DisallowTabIndent"/>
+ <rule ref="Generic.WhiteSpace.ScopeIndent"/>
+ <rule ref="Squiz.WhiteSpace.SuperfluousWhitespace"/>
+</ruleset>
diff --git a/core/vendor/phpunit/phpunit/build/assertions.php b/core/vendor/phpunit/phpunit/build/assertions.php
new file mode 100644
index 0000000..acaa822
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build/assertions.php
@@ -0,0 +1,65 @@
+#!/usr/bin/env php
+<?php
+require dirname(__DIR__) . '/PHPUnit/Autoload.php';
+
+$buffer  = '';
+$class   = new ReflectionClass('PHPUnit_Framework_Assert');
+$methods = array();
+
+foreach ($class->getMethods() as $method) {
+    $docblock = $method->getDocComment();
+    $name     = $method->getName();
+
+    if (strpos($name, 'assert') === 0 ||
+        strpos($docblock, '@return PHPUnit_Framework_Constraint') !== FALSE) {
+        $methods[$name] = array(
+          'class'    => 'PHPUnit_Framework_Assert',
+          'docblock' => $docblock,
+          'sigDecl'  => str_replace(
+            array('= false', '= true'),
+            array('= FALSE', '= TRUE'),
+            PHPUnit_Util_Class::getMethodParameters($method)
+          ),
+          'sigCall'  => PHPUnit_Util_Class::getMethodParameters($method, TRUE)
+        );
+    }
+}
+
+$class = new ReflectionClass('PHPUnit_Framework_TestCase');
+
+foreach ($class->getMethods() as $method) {
+    $docblock = $method->getDocComment();
+    $name     = $method->getName();
+
+    if (strpos($docblock, '@return PHPUnit_Framework_MockObject_Matcher') !== FALSE ||
+        strpos($docblock, '@return PHPUnit_Framework_MockObject_Stub') !== FALSE) {
+        $methods[$name] = array(
+          'class'    => 'PHPUnit_Framework_TestCase',
+          'docblock' => $docblock,
+          'sigDecl'  => str_replace(
+            array('= false', '= true'),
+            array('= FALSE', '= TRUE'),
+            PHPUnit_Util_Class::getMethodParameters($method)
+          ),
+          'sigCall'  => PHPUnit_Util_Class::getMethodParameters($method, TRUE)
+        );
+    }
+}
+
+ksort($methods);
+
+foreach ($methods as $name => $data) {
+    $buffer .= sprintf(
+      "\n\n%s\nfunction %s(%s)\n{\n    return %s::%s(%s);\n}",
+      str_replace('    ', '', $data['docblock']),
+      $name,
+      $data['sigDecl'],
+      $data['class'],
+      $name,
+      $data['sigCall']
+    );
+}
+
+$template = new Text_Template(dirname(__DIR__) . '/PHPUnit/Framework/Assert/Functions.php.in');
+$template->setVar(array('functions' => $buffer));
+$template->renderTo(dirname(__DIR__) . '/PHPUnit/Framework/Assert/Functions.php');
diff --git a/core/vendor/phpunit/phpunit/build/phar-autoload.php.in b/core/vendor/phpunit/phpunit/build/phar-autoload.php.in
new file mode 100644
index 0000000..3a0f82a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build/phar-autoload.php.in
@@ -0,0 +1,34 @@
+#!/usr/bin/env php
+<?php
+function phpunit_autoload($class = NULL)
+{
+    static $classes = NULL;
+
+    if ($classes === NULL) {
+        $classes = array(
+          ___CLASSLIST___
+        );
+    }
+
+    if ($class === NULL) {
+        $result = array(__FILE__);
+
+        foreach ($classes as $file) {
+            $result[] = 'phar://___PHAR___' . $file;
+        }
+
+        return $result;
+    }
+
+    $class = strtolower($class);
+
+    if (isset($classes[$class])) {
+        require 'phar://___PHAR___' . $classes[$class];
+    }
+}
+
+spl_autoload_register('phpunit_autoload');
+
+PHPUnit_TextUI_Command::main();
+
+__HALT_COMPILER();
diff --git a/core/vendor/phpunit/phpunit/build/phpmd.xml b/core/vendor/phpunit/phpunit/build/phpmd.xml
new file mode 100644
index 0000000..23ecb8b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/build/phpmd.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<ruleset name="Sebastian"
+         xmlns="http://pmd.sf.net/ruleset/1.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+  <description>Sebastian Bergmann's ruleset</description>
+
+  <rule ref="rulesets/codesize.xml/CyclomaticComplexity" />
+  <rule ref="rulesets/codesize.xml/NPathComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassComplexity" />
+  <rule ref="rulesets/codesize.xml/ExcessiveClassLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveMethodLength" />
+  <rule ref="rulesets/codesize.xml/ExcessiveParameterList" />
+
+  <rule ref="rulesets/design.xml/EvalExpression" />
+  <rule ref="rulesets/design.xml/ExitExpression" />
+  <rule ref="rulesets/design.xml/GotoStatement" />
+
+  <rule ref="rulesets/naming.xml/ConstructorWithNameAsEnclosingClass" />
+
+  <rule ref="rulesets/unusedcode.xml/UnusedFormalParameter" />
+  <rule ref="rulesets/unusedcode.xml/UnusedLocalVariable" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateField" />
+  <rule ref="rulesets/unusedcode.xml/UnusedPrivateMethod" />
+</ruleset>
diff --git a/core/vendor/phpunit/phpunit/composer.json b/core/vendor/phpunit/phpunit/composer.json
new file mode 100644
index 0000000..8cf3ef5
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/composer.json
@@ -0,0 +1,62 @@
+{
+    "name": "phpunit/phpunit",
+    "description": "The PHP Unit Testing framework.",
+    "type": "library",
+    "keywords": [
+        "phpunit",
+        "xunit",
+        "testing"
+    ],
+    "homepage": "http://www.phpunit.de/",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Sebastian Bergmann",
+            "email": "sebastian@phpunit.de",
+            "role": "lead"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "require": {
+        "php": ">=5.3.3",
+        "phpunit/php-file-iterator": ">=1.3.1@stable",
+        "phpunit/php-text-template": ">=1.1.1@stable",
+        "phpunit/php-code-coverage": ">=1.2.0@stable",
+        "phpunit/php-timer": ">=1.0.2@stable",
+        "phpunit/phpunit-mock-objects": ">=1.2.0@stable",
+        "symfony/yaml": ">=2.1.0@stable",
+        "ext-dom": "*",
+        "ext-pcre": "*",
+        "ext-reflection": "*",
+        "ext-spl": "*"
+    },
+    "suggest": {
+        "phpunit/php-invoker": ">=1.1.0@stable",
+        "ext-json": "*",
+        "ext-simplexml": "*",
+        "ext-tokenizer": "*"
+    },
+    "bin": [
+        "composer/bin/phpunit"
+    ],
+    "config": {
+        "bin-dir": "bin"
+    },
+    "autoload": {
+        "files": [
+            "PHPUnit/Autoload.php"
+        ]
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.7.x-dev"
+        }
+    },
+    "include-path": [
+        "",
+        "../../symfony/yaml/"
+    ]
+}
diff --git a/core/vendor/phpunit/phpunit/composer/bin/phpunit b/core/vendor/phpunit/phpunit/composer/bin/phpunit
new file mode 100755
index 0000000..1cfe331
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/composer/bin/phpunit
@@ -0,0 +1,42 @@
+#!/usr/bin/env php
+<?php
+/* PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ */
+define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
+
+// pull in vendor/autoload.php as defined by composer
+require __DIR__ .'/../../../../autoload.php';
+
+PHPUnit_TextUI_Command::main();
diff --git a/core/vendor/phpunit/phpunit/package-composer.json b/core/vendor/phpunit/phpunit/package-composer.json
new file mode 100644
index 0000000..87df4ac
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/package-composer.json
@@ -0,0 +1,33 @@
+{
+    "keywords": [ "phpunit", "xunit", "testing" ],
+    "license": "BSD-3-Clause",
+    "homepage": "http://www.phpunit.de/",
+    "dependency_map": {
+        "pear.phpunit.de/File_Iterator":      "phpunit/php-file-iterator",
+        "pear.phpunit.de/Text_Template":      "phpunit/php-text-template",
+        "pear.phpunit.de/PHP_CodeCoverage":   "phpunit/php-code-coverage",
+        "pear.phpunit.de/PHP_Timer":          "phpunit/php-timer",
+        "pear.phpunit.de/PHPUnit_MockObject": "phpunit/phpunit-mock-objects",
+        "pear.phpunit.de/PHP_Invoker":        "phpunit/php-invoker",
+        "pear.symfony.com/Yaml":              "symfony/yaml"
+    },
+    "support": {
+        "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+        "irc": "irc://irc.freenode.net/phpunit"
+    },
+    "autoload": {
+        "files": [ "PHPUnit/Autoload.php" ]
+    },
+    "include_path": [
+        "",
+        "../../symfony/yaml/"
+    ],
+    "bin": [
+        "composer/bin/phpunit"
+    ],
+    "branch-alias": {
+        "dev-master": "3.7.x-dev"
+    },
+    "version": false,
+    "time": false
+}
\ No newline at end of file
diff --git a/core/vendor/phpunit/phpunit/package.xml b/core/vendor/phpunit/phpunit/package.xml
new file mode 100644
index 0000000..42ad8e1
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/package.xml
@@ -0,0 +1,527 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.10" version="2.0"
+  xmlns="http://pear.php.net/dtd/package-2.0"
+  xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+                      http://pear.php.net/dtd/tasks-1.0.xsd
+                      http://pear.php.net/dtd/package-2.0
+                      http://pear.php.net/dtd/package-2.0.xsd">
+ <name>PHPUnit</name>
+ <channel>pear.phpunit.de</channel>
+ <summary>The PHP Unit Testing framework.</summary>
+ <description>The PHP Unit Testing framework.</description>
+ <lead>
+  <name>Sebastian Bergmann</name>
+  <user>sb</user>
+  <email>sebastian@phpunit.de</email>
+  <active>yes</active>
+ </lead>
+ <date>2012-09-19</date>
+ <version>
+  <release>3.7.0</release>
+  <api>3.7.0</api>
+ </version>
+ <stability>
+  <release>stable</release>
+  <api>stable</api>
+ </stability>
+ <license>The BSD 3-Clause License</license>
+ <notes>http://github.com/sebastianbergmann/phpunit/blob/master/README.md</notes>
+ <contents>
+  <dir name="/">
+   <dir name="PHPUnit">
+    <dir name="Extensions">
+     <dir name="PhptTestCase">
+      <file baseinstalldir="/" name="Logger.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <file baseinstalldir="/" name="GroupTestSuite.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="PhptTestCase.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="PhptTestSuite.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="RepeatedTest.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestDecorator.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TicketListener.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <dir name="Framework">
+     <dir name="Assert">
+      <file baseinstalldir="/" name="Functions.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="Comparator">
+      <file baseinstalldir="/" name="Array.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="DOMDocument.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Double.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Exception.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="MockObject.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Numeric.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Object.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Resource.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Scalar.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="SplObjectStorage.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Type.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="Constraint">
+      <file baseinstalldir="/" name="And.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ArrayHasKey.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Attribute.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ClassHasAttribute.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ClassHasStaticAttribute.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Composite.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Count.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Exception.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ExceptionCode.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ExceptionMessage.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="FileExists.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="GreaterThan.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsAnything.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsEmpty.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsEqual.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsFalse.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsIdentical.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsInstanceOf.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsNull.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsTrue.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="IsType.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="LessThan.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Not.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ObjectHasAttribute.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Or.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="PCREMatch.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="SameSize.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="StringContains.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="StringEndsWith.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="StringMatches.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="StringStartsWith.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="TraversableContains.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="TraversableContainsOnly.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Xor.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="Error">
+      <file baseinstalldir="/" name="Deprecated.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Notice.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Warning.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="Process">
+      <file baseinstalldir="/" name="TestCaseMethod.tpl.dist" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="TestSuite">
+      <file baseinstalldir="/" name="DataProvider.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <file baseinstalldir="/" name="AssertionFailedError.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Assert.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="ComparatorFactory.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Comparator.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="ComparisonFailure.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Constraint.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Error.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Exception.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="ExpectationFailedException.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="IncompleteTestError.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="IncompleteTest.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="OutputError.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="SelfDescribing.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="SkippedTestError.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="SkippedTest.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="SkippedTestSuiteError.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="SyntheticError.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestCase.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestFailure.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestListener.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Test.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestResult.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestSuite.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Warning.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <dir name="Runner">
+     <file baseinstalldir="/" name="BaseTestRunner.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="StandardTestSuiteLoader.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestSuiteLoader.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Version.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <dir name="TextUI">
+     <file baseinstalldir="/" name="Command.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="ResultPrinter.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestRunner.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <dir name="Util">
+     <dir name="DeprecatedFeature">
+      <file baseinstalldir="/" name="Logger.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="Log">
+      <file baseinstalldir="/" name="JSON.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="JUnit.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="TAP.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="PHP">
+      <file baseinstalldir="/" name="Default.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="Windows.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <dir name="TestDox">
+      <dir name="ResultPrinter">
+       <file baseinstalldir="/" name="HTML.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+       <file baseinstalldir="/" name="Text.php" role="php">
+        <tasks:replace from="@package_version@" to="version" type="package-info" />
+       </file>
+      </dir>
+      <file baseinstalldir="/" name="NamePrettifier.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+      <file baseinstalldir="/" name="ResultPrinter.php" role="php">
+       <tasks:replace from="@package_version@" to="version" type="package-info" />
+      </file>
+     </dir>
+     <file baseinstalldir="/" name="Class.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Configuration.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="DeprecatedFeature.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Diff.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="ErrorHandler.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Fileloader.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+      <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
+     </file>
+     <file baseinstalldir="/" name="Filesystem.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Filter.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Getopt.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="GlobalState.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="InvalidArgumentHelper.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="PHP.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+      <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
+     </file>
+     <file baseinstalldir="/" name="Printer.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="String.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Test.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="TestSuiteIterator.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="Type.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+     <file baseinstalldir="/" name="XML.php" role="php">
+      <tasks:replace from="@package_version@" to="version" type="package-info" />
+     </file>
+    </dir>
+    <file baseinstalldir="/" name="Autoload.php" role="php">
+     <tasks:replace from="@package_version@" to="version" type="package-info" />
+    </file>
+   </dir>
+   <file baseinstalldir="/" name="ChangeLog.md" role="doc"/>
+   <file baseinstalldir="/" name="CONTRIBUTING.md" role="doc"/>
+   <file baseinstalldir="/" name="LICENSE" role="doc"/>
+   <file baseinstalldir="/" name="README.md" role="doc"/>
+   <file baseinstalldir="/" name="phpunit.php" role="script">
+    <tasks:replace from="/usr/bin/env php" to="php_bin" type="pear-config"/>
+    <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
+    <tasks:replace from="@php_dir@" to="php_dir" type="pear-config" />
+    <tasks:replace from="@package_version@" to="version" type="package-info" />
+   </file>
+   <file baseinstalldir="/" name="phpunit.bat" role="script">
+    <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
+    <tasks:replace from="@bin_dir@" to="bin_dir" type="pear-config" />
+    <tasks:replace from="@package_version@" to="version" type="package-info" />
+   </file>
+  </dir>
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.3.3</min>
+   </php>
+   <pearinstaller>
+    <min>1.9.4</min>
+   </pearinstaller>
+   <package>
+    <name>File_Iterator</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.3.1</min>
+   </package>
+   <package>
+    <name>Text_Template</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.1.1</min>
+   </package>
+   <package>
+    <name>PHP_CodeCoverage</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.2.0</min>
+   </package>
+   <package>
+    <name>PHP_Timer</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.0.2</min>
+   </package>
+   <package>
+    <name>PHPUnit_MockObject</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.2.0</min>
+   </package>
+   <package>
+    <name>Yaml</name>
+    <channel>pear.symfony.com</channel>
+    <min>2.1.0</min>
+   </package>
+   <extension>
+    <name>dom</name>
+   </extension>
+   <extension>
+    <name>pcre</name>
+   </extension>
+   <extension>
+    <name>reflection</name>
+   </extension>
+   <extension>
+    <name>spl</name>
+   </extension>
+  </required>
+  <optional>
+   <package>
+    <name>PHP_Invoker</name>
+    <channel>pear.phpunit.de</channel>
+    <min>1.1.0</min>
+   </package>
+   <extension>
+    <name>json</name>
+   </extension>
+   <extension>
+    <name>simplexml</name>
+   </extension>
+   <extension>
+    <name>tokenizer</name>
+   </extension>
+  </optional>
+ </dependencies>
+ <phprelease>
+  <installconditions>
+   <os>
+    <name>windows</name>
+   </os>
+  </installconditions>
+  <filelist>
+   <install as="phpunit" name="phpunit.php" />
+   <install as="phpunit.bat" name="phpunit.bat" />
+  </filelist>
+ </phprelease>
+ <phprelease>
+  <filelist>
+   <install as="phpunit" name="phpunit.php" />
+   <ignore name="phpunit.bat" />
+  </filelist>
+ </phprelease>
+</package>
diff --git a/core/vendor/phpunit/phpunit/phpdox.xml.dist b/core/vendor/phpunit/phpunit/phpdox.xml.dist
new file mode 100644
index 0000000..04af02a
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/phpdox.xml.dist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<phpdox xmlns="http://phpdox.de/config">
+ <project name="PHPUnit" source="PHPUnit" workdir="build/phpdox">
+  <collector publiconly="false">
+   <include mask="*.php" />
+   <exclude mask="*Autoload.php" />
+  </collector>
+
+  <generator output="build">
+   <build engine="html" enabled="true" output="api"/>
+  </generator>
+ </project>
+</phpdox>
diff --git a/core/vendor/phpunit/phpunit/phpunit.bat b/core/vendor/phpunit/phpunit/phpunit.bat
new file mode 100644
index 0000000..9bc942b
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/phpunit.bat
@@ -0,0 +1,43 @@
+@echo off
+REM PHPUnit
+REM
+REM Copyright (c) 2002-2010, Sebastian Bergmann <sebastian@phpunit.de>.
+REM All rights reserved.
+REM
+REM Redistribution and use in source and binary forms, with or without
+REM modification, are permitted provided that the following conditions
+REM are met:
+REM
+REM   * Redistributions of source code must retain the above copyright
+REM     notice, this list of conditions and the following disclaimer.
+REM
+REM   * Redistributions in binary form must reproduce the above copyright
+REM     notice, this list of conditions and the following disclaimer in
+REM     the documentation and/or other materials provided with the
+REM     distribution.
+REM
+REM   * Neither the name of Sebastian Bergmann nor the names of his
+REM     contributors may be used to endorse or promote products derived
+REM     from this software without specific prior written permission.
+REM
+REM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+REM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+REM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+REM FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+REM COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+REM INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+REM BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+REM LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+REM CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
+REM LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+REM ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+REM POSSIBILITY OF SUCH DAMAGE.
+REM
+
+if "%PHPBIN%" == "" set PHPBIN=@php_bin@
+if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
+GOTO RUN
+:USE_PEAR_PATH
+set PHPBIN=%PHP_PEAR_PHP_BIN%
+:RUN
+"%PHPBIN%" "@bin_dir@\phpunit" %*
diff --git a/core/vendor/phpunit/phpunit/phpunit.php b/core/vendor/phpunit/phpunit/phpunit.php
new file mode 100644
index 0000000..7dcb43d
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/phpunit.php
@@ -0,0 +1,46 @@
+#!/usr/bin/env php
+<?php
+/* PHPUnit
+ *
+ * Copyright (c) 2001-2012, Sebastian Bergmann <sebastian@phpunit.de>.
+ * All rights reserved.
+ *
+ * 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 Sebastian Bergmann 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
+ * COPYRIGHT OWNER 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.
+ */
+
+define('PHPUnit_MAIN_METHOD', 'PHPUnit_TextUI_Command::main');
+
+if (strpos('@php_bin@', '@php_bin') === 0) {
+    require dirname(__FILE__) . DIRECTORY_SEPARATOR . 'PHPUnit' . DIRECTORY_SEPARATOR . 'Autoload.php';
+} else {
+    require '@php_dir@' . DIRECTORY_SEPARATOR . 'PHPUnit' . DIRECTORY_SEPARATOR . 'Autoload.php';
+}
+
+PHPUnit_TextUI_Command::main();
diff --git a/core/vendor/phpunit/phpunit/phpunit.xml.dist b/core/vendor/phpunit/phpunit/phpunit.xml.dist
new file mode 100644
index 0000000..a45f5d6
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/phpunit.xml.dist
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by PHP Project Wizard (PPW) 1.1.0-dev on Sat Mar 12 12:47:10 CET 2011 -->
+
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="http://phpunit.de/phpunit.xsd"
+         bootstrap="PHPUnit/Autoload.php"
+         backupGlobals="false"
+         verbose="true">
+  <testsuites>
+    <testsuite name="PHPUnit">
+      <directory suffix="Test.php">Tests/Framework</directory>
+      <directory suffix=".phpt">Tests/Framework/MockObject</directory>
+      <directory suffix="Test.php">Tests/Extensions</directory>
+      <directory suffix=".phpt">Tests/Regression</directory>
+      <directory suffix="Test.php">Tests/Runner</directory>
+      <directory suffix=".phpt">Tests/TextUI</directory>
+      <directory suffix="Test.php">Tests/Util</directory>
+    </testsuite>
+  </testsuites>
+
+  <logging>
+    <log type="coverage-html" target="build/coverage" title="PHPUnit"
+         charset="UTF-8" yui="true" highlight="true"
+         lowUpperBound="35" highLowerBound="70"/>
+    <log type="coverage-clover" target="build/logs/clover.xml"/>
+    <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
+  </logging>
+
+  <filter>
+    <whitelist processUncoveredFilesFromWhitelist="true">
+      <directory suffix=".php">PHPUnit</directory>
+      <exclude>
+       <file>PHPUnit/Autoload.php</file>
+       <file>PHPUnit/Framework/Assert/Functions.php</file>
+      </exclude>
+    </whitelist>
+  </filter>
+
+  <php>
+    <const name="PHPUNIT_TESTSUITE" value="true"/>
+  </php>
+</phpunit>
diff --git a/core/vendor/phpunit/phpunit/phpunit.xsd b/core/vendor/phpunit/phpunit/phpunit.xsd
new file mode 100644
index 0000000..0348bc0
--- /dev/null
+++ b/core/vendor/phpunit/phpunit/phpunit.xsd
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:annotation>
+    <xs:documentation source="http://www.phpunit.de/manual/3.7/en/appendixes.configuration.html">
+      This Schema file defines the rules by which the XML configuration file of PHPUnit 3.7 may be structured.
+    </xs:documentation>
+    <xs:appinfo source="http://www.phpunit.de/manual/current/en/appendixes.configuration.html"/>
+  </xs:annotation>
+  <xs:element name="phpunit" type="phpUnitType">
+    <xs:annotation>
+      <xs:documentation>Root Element</xs:documentation>
+    </xs:annotation>
+  </xs:element>
+  <xs:complexType name="filtersType">
+    <xs:choice>
+      <xs:sequence>
+        <xs:element name="blacklist" type="filterType"/>
+        <xs:element name="whitelist" type="whiteListType" minOccurs="0"/>
+      </xs:sequence>
+      <xs:sequence>
+        <xs:element name="whitelist" type="whiteListType"/>
+      </xs:sequence>
+    </xs:choice>
+  </xs:complexType>
+  <xs:complexType name="filterType">
+    <xs:sequence>
+      <xs:group ref="pathGroup"/>
+      <xs:element name="exclude" maxOccurs="unbounded" minOccurs="0">
+        <xs:complexType>
+          <xs:group ref="pathGroup"/>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="whiteListType">
+    <xs:complexContent>
+      <xs:extension base="filterType">
+        <xs:attribute name="processUncoveredFilesFromWhitelist" default="true" type="xs:boolean"/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <xs:complexType name="groupsType">
+    <xs:choice>
+      <xs:sequence>
+        <xs:element name="include" type="groupType"/>
+        <xs:element name="exclude" type="groupType" minOccurs="0"/>
+      </xs:sequence>
+      <xs:sequence>
+        <xs:element name="exclude" type="groupType"/>
+      </xs:sequence>
+    </xs:choice>
+  </xs:complexType>
+  <xs:complexType name="groupType">
+    <xs:sequence>
+      <xs:element name="group" type="xs:string" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="listenersType">
+    <xs:sequence>
+      <xs:element name="listener" type="objectType" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="objectType">
+    <xs:sequence>
+      <xs:element name="arguments" minOccurs="0">
+        <xs:complexType>
+          <xs:group ref="argumentsGroup"/>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+    <xs:attribute name="class" type="xs:string" use="required"/>
+    <xs:attribute name="file" type="xs:anyURI"/>
+  </xs:complexType>
+  <xs:complexType name="arrayType">
+    <xs:sequence>
+      <xs:element name="element" type="argumentType" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="argumentType">
+    <xs:group ref="argumentChoice"/>
+    <xs:attribute name="key" use="required"/>
+  </xs:complexType>
+  <xs:group name="argumentsGroup">
+    <xs:sequence>
+      <xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="integer" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="string" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="double" type="xs:double" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="null" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="object" type="objectType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="file" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="directory" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="argumentChoice">
+    <xs:choice>
+      <xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="integer" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="string" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="double" type="xs:double" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="null" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="object" type="objectType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="file" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="directory" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:choice>
+  </xs:group>
+  <xs:complexType name="loggersType">
+    <xs:sequence>
+      <xs:element name="log" type="loggerType" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="loggerType">
+    <xs:attribute name="type">
+      <xs:simpleType>
+        <xs:restriction base="xs:string">
+          <xs:enumeration value="coverage-html"/>
+          <xs:enumeration value="coverage-clover"/>
+          <xs:enumeration value="json"/>
+          <xs:enumeration value="plain"/>
+          <xs:enumeration value="tap"/>
+          <xs:enumeration value="junit"/>
+          <xs:enumeration value="testdox-html"/>
+          <xs:enumeration value="testdox-text"/>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="target" type="xs:anyURI"/>
+    <xs:attribute name="title" type="xs:string"/>
+    <xs:attribute name="charset" type="xs:string" default="UTF-8"/>
+    <xs:attribute name="yui" type="xs:boolean" default="true"/>
+    <xs:attribute name="highlight" type="xs:boolean" default="false"/>
+    <xs:attribute name="lowUpperBound" type="xs:nonNegativeInteger" default="35"/>
+    <xs:attribute name="highLowerBound" type="xs:nonNegativeInteger" default="70"/>
+    <xs:attribute name="logIncompleteSkipped" type="xs:boolean" default="false"/>
+  </xs:complexType>
+  <xs:group name="pathGroup">
+    <xs:sequence>
+      <xs:element name="directory" type="directoryFilterType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="file" type="fileFilterType" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:complexType name="directoryFilterType">
+    <xs:simpleContent>
+      <xs:extension base="xs:anyURI">
+        <xs:attribute type="xs:string" name="suffix" default="Test.php"/>
+        <xs:attributeGroup ref="phpVersionGroup"/>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+  <xs:complexType name="fileFilterType">
+    <xs:simpleContent>
+      <xs:extension base="xs:anyURI">
+        <xs:attributeGroup ref="phpVersionGroup"/>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+  <xs:attributeGroup name="phpVersionGroup">
+    <xs:attribute name="phpVersion" type="xs:string" default="5.3.0"/>
+    <xs:attribute name="phpVersionOperator" type="xs:string" default="&gt;="/>
+  </xs:attributeGroup>
+  <xs:complexType name="phpType">
+    <xs:sequence>
+      <xs:element name="includePath" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="ini" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="const" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="var" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="env" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="post" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="get" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="cookie" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="server" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="files" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+      <xs:element name="request" type="namedValueType" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="namedValueType">
+    <xs:attribute name="name" use="required" type="xs:string"/>
+    <xs:attribute name="value" use="required" type="xs:anySimpleType"/>
+  </xs:complexType>
+  <xs:complexType name="phpUnitType">
+    <xs:annotation>
+      <xs:documentation>The main type specifying the document structure</xs:documentation>
+    </xs:annotation>
+    <xs:group ref="configGroup"/>
+    <xs:attributeGroup ref="configAttributeGroup"/>
+  </xs:complexType>
+  <xs:attributeGroup name="configAttributeGroup">
+    <xs:attribute name="backupGlobals" type="xs:boolean" default="true"/>
+    <xs:attribute name="backupStaticAttributes" type="xs:boolean" default="false"/>
+    <xs:attribute name="bootstrap" type="xs:anyURI"/>
+    <xs:attribute name="cacheTokens" type="xs:boolean"/>
+    <xs:attribute name="colors" type="xs:boolean" default="false"/>
+    <xs:attribute name="convertErrorsToExceptions" type="xs:boolean" default="true"/>
+    <xs:attribute name="convertNoticesToExceptions" type="xs:boolean" default="true"/>
+    <xs:attribute name="convertWarningsToExceptions" type="xs:boolean" default="true"/>
+    <xs:attribute name="forceCoversAnnotation" type="xs:boolean" default="false"/>
+    <xs:attribute name="mapTestClassNameToCoveredClassName" type="xs:boolean" default="false"/>
+    <xs:attribute name="printerClass" type="xs:string" default="PHPUnit_TextUI_ResultPrinter"/>
+    <xs:attribute name="printerFile" type="xs:anyURI"/>
+    <xs:attribute name="processIsolation" type="xs:boolean" default="false"/>
+    <xs:attribute name="stopOnError" type="xs:boolean" default="false"/>
+    <xs:attribute name="stopOnFailure" type="xs:boolean" default="false"/>
+    <xs:attribute name="stopOnIncomplete" type="xs:boolean" default="false"/>
+    <xs:attribute name="stopOnSkipped" type="xs:boolean" default="false"/>
+    <xs:attribute name="strict" type="xs:boolean" default="false"/>
+    <xs:attribute name="testSuiteLoaderClass" type="xs:string" default="PHPUnit_Runner_StandardTestSuiteLoader"/>
+    <xs:attribute name="testSuiteLoaderFile" type="xs:anyURI"/>
+    <xs:attribute name="timeoutForSmallTests" type="xs:integer" default="1"/>
+    <xs:attribute name="timeoutForMediumTests" type="xs:integer" default="10"/>
+    <xs:attribute name="timeoutForLargeTests" type="xs:integer" default="60"/>
+    <xs:attribute name="verbose" type="xs:boolean" default="false"/>
+  </xs:attributeGroup>
+  <xs:group name="configGroup">
+    <xs:all>
+      <xs:element ref="testSuiteFacet" minOccurs="0"/>
+      <xs:element name="groups" type="groupsType" minOccurs="0"/>
+      <xs:element name="filter" type="filtersType" minOccurs="0"/>
+      <xs:element name="logging" type="loggersType" minOccurs="0"/>
+      <xs:element name="listeners" type="listenersType" minOccurs="0"/>
+      <xs:element name="php" type="phpType" minOccurs="0"/>
+      <xs:element name="selenium" type="seleniumType" minOccurs="0"/>
+    </xs:all>
+  </xs:group>
+  <xs:complexType name="seleniumType">
+    <xs:sequence>
+      <xs:element name="browser" type="browserType"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="browserType">
+    <xs:attribute name="name" type="xs:string"/>
+    <xs:attribute name="browser" type="xs:string"/>
+    <xs:attribute name="host" type="xs:anyURI"/>
+    <xs:attribute name="port" type="xs:nonNegativeInteger"/>
+    <xs:attribute name="timeout" type="xs:nonNegativeInteger"/>
+  </xs:complexType>
+  <xs:element name="testSuiteFacet" abstract="true"/>
+  <xs:element name="testsuite" type="testSuiteType" substitutionGroup="testSuiteFacet"/>
+  <xs:element name="testsuites" type="testSuitesType" substitutionGroup="testSuiteFacet"/>
+  <xs:complexType name="testSuitesType">
+    <xs:sequence>
+      <xs:element name="testsuite" type="testSuiteType"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:complexType name="testSuiteType">
+    <xs:sequence>
+      <xs:group ref="pathGroup"/>
+      <xs:element name="exclude" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:string" use="required"/>
+  </xs:complexType>
+</xs:schema>
diff --git a/core/vendor/symfony/yaml/Symfony/Component/Yaml/.gitignore b/core/vendor/symfony/yaml/Symfony/Component/Yaml/.gitignore
deleted file mode 100644
index 44de97a..0000000
--- a/core/vendor/symfony/yaml/Symfony/Component/Yaml/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-vendor/
-composer.lock
-phpunit.xml
-
diff --git a/core/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php b/core/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php
deleted file mode 100644
index 3573bf1..0000000
--- a/core/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-/*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Yaml\Exception;
-
-/**
- * Exception class thrown when an error occurs during parsing.
- *
- * @author Romain Neutron <imprec@gmail.com>
- *
- * @api
- */
-class RuntimeException extends \RuntimeException implements ExceptionInterface
-{
-}
