diff --git a/app/Config/Routes.php b/app/Config/Routes.php
index dbdb709701c76dfb5ee061e737b175cf713c78d3..f87b1d60bb59c34090f9218a96ed4b139aca10b1 100644
--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -46,6 +46,13 @@ $routes->group('(:podcastSlug)', function ($routes) {
     ]);
 });
 
+// Route for podcast audio file analytics (/stats/podcast_id/episode_id/podcast_folder/filename.mp3)
+$routes->add('/stats/(:num)/(:num)/(:any)', 'Analytics::hit/$1/$2/$3');
+
+// Show the Unknown UserAgents
+$routes->add('/.well-known/unknown-useragents', 'UnknownUserAgents');
+$routes->add('/.well-known/unknown-useragents/(:num)', 'UnknownUserAgents/$1');
+
 /**
  * --------------------------------------------------------------------
  * Additional Routing
diff --git a/app/Controllers/Analytics.php b/app/Controllers/Analytics.php
new file mode 100644
index 0000000000000000000000000000000000000000..76bf580bbdaabe6b3cf31c4279fcf4e41af7f163
--- /dev/null
+++ b/app/Controllers/Analytics.php
@@ -0,0 +1,113 @@
+<?php namespace App\Controllers;
+/**
+ * Class Analytics
+ * Creates Analytics controller
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+use CodeIgniter\Controller;
+
+class Analytics extends Controller
+{
+    function __construct()
+    {
+        $session = \Config\Services::session();
+        $session->start();
+        $db = \Config\Database::connect();
+        $country = 'N/A';
+
+        // Finds country:
+        if (!$session->has('country')) {
+            try {
+                $reader = new \GeoIp2\Database\Reader(
+                    WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb'
+                );
+                $geoip = $reader->country($_SERVER['REMOTE_ADDR']);
+                $country = $geoip->country->isoCode;
+            } catch (\Exception $e) {
+                // If things go wrong the show must go on and the user must be able to download the file
+            }
+            $session->set('country', $country);
+        }
+
+        // Finds player:
+        if (!$session->has('player')) {
+            $playerName = '-unknown-';
+            $error = '';
+
+            try {
+                $useragent = $_SERVER['HTTP_USER_AGENT'];
+                $jsonUserAgents = json_decode(
+                    file_get_contents(
+                        WRITEPATH . 'uploads/user-agents/src/user-agents.json'
+                    ),
+                    true
+                );
+
+                //Search for current HTTP_USER_AGENT in json file:
+                foreach ($jsonUserAgents as $player) {
+                    foreach ($player['user_agents'] as $useragentsRegexp) {
+                        //Does the HTTP_USER_AGENT match this regexp:
+                        if (preg_match("#{$useragentsRegexp}#", $useragent)) {
+                            if (isset($player['bot'])) {
+                                //It’s a bot!
+                                $playerName = '-bot-';
+                            } else {
+                                //It isn’t a bot, we store device/os/app:
+                                $playerName =
+                                    (isset($player['device'])
+                                        ? $player['device'] . '/'
+                                        : '') .
+                                    (isset($player['os'])
+                                        ? $player['os'] . '/'
+                                        : '') .
+                                    (isset($player['app'])
+                                        ? $player['app']
+                                        : '?');
+                            }
+                            //We found it!
+                            break 2;
+                        }
+                    }
+                }
+            } catch (\Exception $e) {
+                // If things go wrong the show must go on and the user must be able to download the file
+            }
+            if ($playerName == '-unknown-') {
+                // Add to unknown list
+                try {
+                    $procedureNameAUU = $db->prefixTable(
+                        'analytics_unknown_useragents'
+                    );
+                    $db->query("CALL $procedureNameAUU(?)", [$useragent]);
+                } catch (\Exception $e) {
+                    // If things go wrong the show must go on and the user must be able to download the file
+                }
+            }
+            $session->set('player', $playerName);
+        }
+    }
+
+    // Add one hit to this episode:
+    public function hit($p_podcast_id, $p_episode_id, ...$filename)
+    {
+        $session = \Config\Services::session();
+        $db = \Config\Database::connect();
+        $procedureName = $db->prefixTable('analytics_podcasts');
+        $p_country_code = $session->get('country');
+        $p_player = $session->get('player');
+        try {
+            $db->query("CALL $procedureName(?,?,?,?);", [
+                $p_podcast_id,
+                $p_episode_id,
+                $p_country_code,
+                $p_player,
+            ]);
+        } catch (\Exception $e) {
+            // If things go wrong the show must go on and the user must be able to download the file
+        }
+        return redirect()->to(media_url(implode('/', $filename)));
+    }
+}
diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php
index 22c55eb72eeda6f82bc0d88592f88f274ed7eafa..834792c1b3fd7b2e34e039dbf87b5066efcae2e2 100644
--- a/app/Controllers/BaseController.php
+++ b/app/Controllers/BaseController.php
@@ -44,5 +44,56 @@ class BaseController extends Controller
         //--------------------------------------------------------------------
         // E.g.:
         // $this->session = \Config\Services::session();
+
+        $session = \Config\Services::session();
+        $session->start();
+
+        // Defines country
+        if (!$session->has('country')) {
+            try {
+                $reader = new \GeoIp2\Database\Reader(
+                    WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb'
+                );
+                $geoip = $reader->country($_SERVER['REMOTE_ADDR']);
+                $session->set('country', $geoip->country->isoCode);
+            } catch (\Exception $e) {
+                $session->set('country', 'N/A');
+            }
+        }
+        // Defines browser
+        if (!$session->has('browser')) {
+            try {
+                $whichbrowser = new \WhichBrowser\Parser(getallheaders());
+                $session->set('browser', $whichbrowser->browser->name);
+            } catch (\Exception $e) {
+                $session->set('browser', 'Other');
+            }
+        }
+
+        // Defines referrer
+        $newreferer = isset($_SERVER['HTTP_REFERER'])
+            ? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)
+            : '- Direct -';
+        $newreferer =
+            $newreferer == parse_url(current_url(false), PHP_URL_HOST)
+                ? '- Direct -'
+                : $newreferer;
+        if (!$session->has('referer') or $newreferer != '- Direct -') {
+            $session->set('referer', $newreferer);
+        }
+    }
+
+    protected function stats($postcast_id)
+    {
+        $session = \Config\Services::session();
+        $session->start();
+        $db = \Config\Database::connect();
+        $procedureName = $db->prefixTable('analytics_website');
+        $db->query("call $procedureName(?,?,?,?)", [
+            $postcast_id,
+            $session->get('country'),
+            $session->get('browser'),
+            $session->get('referer'),
+        ]);
     }
 }
diff --git a/app/Controllers/Episodes.php b/app/Controllers/Episodes.php
index df0d1cb1d97202b2cec41fa57abea7d6328dab24..90b1d5e766bcb037ac5b546ce84af54f33d40c54 100644
--- a/app/Controllers/Episodes.php
+++ b/app/Controllers/Episodes.php
@@ -125,6 +125,7 @@ class Episodes extends BaseController
                 ->first(),
             'episode' => $episode_model->where('slug', $episode_slug)->first(),
         ];
+        self::stats($data['podcast']->id);
 
         return view('episodes/view.php', $data);
     }
diff --git a/app/Controllers/Podcasts.php b/app/Controllers/Podcasts.php
index e190eb28bce8aa6b900346708c4fe03bc1fc98d3..eb29154ec28852c51719404ff874d089d2e12ddc 100644
--- a/app/Controllers/Podcasts.php
+++ b/app/Controllers/Podcasts.php
@@ -96,6 +96,7 @@ class Podcasts extends BaseController
                 ->where('podcast_id', $podcast->id)
                 ->findAll(),
         ];
+        self::stats($podcast->id);
 
         return view('podcasts/view', $data);
     }
diff --git a/app/Controllers/UnknownUserAgents.php b/app/Controllers/UnknownUserAgents.php
new file mode 100644
index 0000000000000000000000000000000000000000..220daf8650c528cf240f61dbba2a3d339066f6a4
--- /dev/null
+++ b/app/Controllers/UnknownUserAgents.php
@@ -0,0 +1,19 @@
+<?php namespace App\Controllers;
+use CodeIgniter\Controller;
+
+class UnknownUserAgents extends Controller
+{
+    public function index($p_id = 0)
+    {
+        $model = new \App\Models\UnknownUserAgentsModel();
+
+        $data = [
+            'useragents' => $model->getUserAgents($p_id),
+        ];
+
+        $this->response->setContentType('application/json');
+        $this->response->setStatusCode(\CodeIgniter\HTTP\Response::HTTP_OK);
+
+        echo view('json/unknownuseragents', $data);
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-160000_add_platformlinks.php b/app/Database/Migrations/2020-06-08-160000_add_platform_links.php
similarity index 100%
rename from app/Database/Migrations/2020-06-08-160000_add_platformlinks.php
rename to app/Database/Migrations/2020-06-08-160000_add_platform_links.php
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_country.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_country.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c4217696a071c8e49f56fdb7ad35d374a32a62d
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_country.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Class AddAnalyticsEpisodesByCountry
+ * Creates analytics_episodes_by_country table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsEpisodesByCountry extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'episode_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The episode ID',
+            ],
+            'country_code' => [
+                'type' => 'VARCHAR',
+                'constraint' => 3,
+                'comment' => 'ISO 3166-1 code.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey([
+            'podcast_id',
+            'episode_id',
+            'country_code',
+            'date',
+        ]);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->addForeignKey('episode_id', 'episodes', 'id');
+        $this->forge->createTable('analytics_episodes_by_country');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_episodes_by_country');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_player.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_player.php
new file mode 100644
index 0000000000000000000000000000000000000000..89cead4509a51ea3cb89346f6d9ec89f0b9b5b43
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_episodes_by_player.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Class AddAnalyticsEpisodesByPlayer
+ * Creates analytics_episodes_by_player table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsEpisodesByPlayer extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'episode_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The episode ID',
+            ],
+            'player' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+                'comment' => 'Podcast player name.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey([
+            'podcast_id',
+            'episode_id',
+            'player',
+            'date',
+        ]);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->addForeignKey('episode_id', 'episodes', 'id');
+        $this->forge->createTable('analytics_episodes_by_player');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_episodes_by_player');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_country.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_country.php
new file mode 100644
index 0000000000000000000000000000000000000000..72cc32b071a63a925857302d18c58396c5862d0c
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_country.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Class AddAnalyticsPodcastsByCountry
+ * Creates analytics_podcasts_by_country table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsPodcastsByCountry extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'country_code' => [
+                'type' => 'VARCHAR',
+                'constraint' => 3,
+                'comment' => 'ISO 3166-1 code.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey(['podcast_id', 'country_code', 'date']);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->createTable('analytics_podcasts_by_country');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_podcasts_by_country');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_player.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_player.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cbaca7518cc8fa2d4490872cbd42f967dc2cb6a
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_podcasts_by_player.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Class AddAnalyticsPodcastsByPlayer
+ * Creates analytics_podcasts_by_player table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsPodcastsByPlayer extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'player' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+                'comment' => 'Podcast player name.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey(['podcast_id', 'player', 'date']);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->createTable('analytics_podcasts_by_player');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_podcasts_by_player');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php
new file mode 100644
index 0000000000000000000000000000000000000000..8960323c2366f8ff13057944be9337e04cd08188
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Class AddAnalyticsUnknownUseragents
+ * Creates analytics_unknown_useragents table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsUnknownUseragents extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'useragent' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+                'unique' => true,
+                'comment' => 'The unknown user-agent.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        // `created_at` and `updated_at` are created with SQL because Model class won’t be used for insertion (Stored Procedure will be used instead)
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->createTable('analytics_unknown_useragents');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_unknown_useragents');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_browser.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_browser.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c6763913ae830f5493b3fd26ac1d492f35eb83b
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_browser.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Class AddAnalyticsWebsiteByBrowser
+ * Creates analytics_website_by_browser table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsWebsiteByBrowser extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'browser' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+                'comment' => 'The Web Browser.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey(['podcast_id', 'browser', 'date']);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->createTable('analytics_website_by_browser');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_website_by_browser');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_country.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_country.php
new file mode 100644
index 0000000000000000000000000000000000000000..a531781ea1f34b5482af3d09222b41b9279436be
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_country.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Class AddAnalyticsWebsiteByCountry
+ * Creates analytics_website_by_country table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsWebsiteByCountry extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'country_code' => [
+                'type' => 'VARCHAR',
+                'constraint' => 3,
+                'comment' => 'ISO 3166-1 code.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey(['podcast_id', 'country_code', 'date']);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->createTable('analytics_website_by_country');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_website_by_country');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_referer.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_referer.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c5f27fcfc813c2631582dc27b022f7dbb0176e1
--- /dev/null
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_website_by_referer.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Class AddAnalyticsWebsiteByReferer
+ * Creates analytics_website_by_referer table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsWebsiteByReferer extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'auto_increment' => true,
+                'comment' => 'The line ID',
+            ],
+            'podcast_id' => [
+                'type' => 'BIGINT',
+                'constraint' => 20,
+                'unsigned' => true,
+                'comment' => 'The podcast ID',
+            ],
+            'referer' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+                'comment' => 'Referer URL.',
+            ],
+            'date' => [
+                'type' => 'date',
+                'comment' => 'Line date.',
+            ],
+            'hits' => [
+                'type' => 'INT',
+                'constraint' => 10,
+                'default' => 1,
+                'comment' => 'Number of hits.',
+            ],
+        ]);
+        $this->forge->addKey('id', true);
+        $this->forge->addUniqueKey(['podcast_id', 'referer', 'date']);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+        );
+        $this->forge->addField(
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+        );
+        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->createTable('analytics_website_by_referer');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('analytics_website_by_referer');
+    }
+}
diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_stored_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_stored_procedure.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab327728a5332cbf967eee7526efbfdd76a5263e
--- /dev/null
+++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_stored_procedure.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Class AddAnalyticsPodcastsStoredProcedure
+ * Creates analytics_podcasts stored procedure in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsPodcastsStoredProcedure extends Migration
+{
+    public function up()
+    {
+        // Creates Stored Procedure for data insertion
+        // Example: CALL analytics_podcasts(1,2,'FR','phone/android/Deezer');
+        $procedureName = $this->db->prefixTable('analytics_podcasts');
+        $episodesTableName = $this->db->prefixTable('analytics_episodes');
+        $createQuery = <<<EOD
+CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` BIGINT(20) UNSIGNED, IN `p_episode_id` BIGINT(20) UNSIGNED, IN `p_country_code` VARCHAR(3) CHARSET utf8mb4, IN `p_player` VARCHAR(191) CHARSET utf8mb4)  MODIFIES SQL DATA
+DETERMINISTIC
+SQL SECURITY INVOKER
+COMMENT 'Add one hit in podcast logs tables.'
+BEGIN
+INSERT INTO `{$procedureName}_by_country`(`podcast_id`, `country_code`, `date`) 
+VALUES (p_podcast_id, p_country_code, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+INSERT INTO `{$procedureName}_by_player`(`podcast_id`, `player`, `date`) 
+VALUES (p_podcast_id, p_player, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+INSERT INTO `{$episodesTableName}_by_country`(`podcast_id`, `episode_id`, `country_code`, `date`) 
+VALUES (p_podcast_id, p_episode_id, p_country_code, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+INSERT INTO `{$episodesTableName}_by_player`(`podcast_id`, `episode_id`,  `player`, `date`) 
+VALUES (p_podcast_id, p_episode_id, p_player, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+END
+EOD;
+        $this->db->query($createQuery);
+    }
+
+    public function down()
+    {
+        $procedureName = $this->db->prefixTable('analytics_podcasts');
+        $this->db->query("DROP PROCEDURE IF EXISTS `$procedureName`");
+    }
+}
diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_stored_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_stored_procedure.php
new file mode 100644
index 0000000000000000000000000000000000000000..683078b90e376c2a0712d2d5a303168e6e8e965f
--- /dev/null
+++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_stored_procedure.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Class AddAnalyticsUnknownUseragentsStoredProcedure
+ * Creates analytics_unknown_useragents stored procedure in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsUnknownUseragentsStoredProcedure extends Migration
+{
+    public function up()
+    {
+        // Creates Stored Procedure for data insertion
+        // Example: CALL analytics_unknown_useragents('Podcasts/1430.46 CFNetwork/1125.2 Darwin/19.4.0');
+        $procedureName = $this->db->prefixTable('analytics_unknown_useragents');
+        $createQuery = <<<EOD
+CREATE PROCEDURE `$procedureName` (IN `p_useragent` VARCHAR(191) CHARSET utf8mb4)  MODIFIES SQL DATA
+DETERMINISTIC
+SQL SECURITY INVOKER
+COMMENT 'Add an unknown useragent to table $procedureName.'
+INSERT INTO `$procedureName`(`useragent`) 
+VALUES (p_useragent) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1
+EOD;
+        $this->db->query($createQuery);
+    }
+
+    public function down()
+    {
+        $procedureName = $this->db->prefixTable('analytics_unknown_useragents');
+        $this->db->query("DROP PROCEDURE IF EXISTS `$procedureName`");
+    }
+}
diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_website_stored_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_stored_procedure.php
new file mode 100644
index 0000000000000000000000000000000000000000..e66739cd4998bbdd991c872d830c763e0662ce57
--- /dev/null
+++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_stored_procedure.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Class AddAnalyticsWebsiteStoredProcedure
+ * Creates analytics_website stored procedure in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddAnalyticsWebsiteStoredProcedure extends Migration
+{
+    public function up()
+    {
+        // Creates Stored Procedure for data insertion
+        // Example: CALL analytics_website(1,'FR','Firefox');
+        $procedureName = $this->db->prefixTable('analytics_website');
+        $createQuery = <<<EOD
+CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` BIGINT(20) UNSIGNED, IN `p_country_code` VARCHAR(3) CHARSET utf8mb4, IN `p_browser` VARCHAR(191) CHARSET utf8mb4, IN `p_referer` VARCHAR(191) CHARSET utf8mb4)  MODIFIES SQL DATA
+DETERMINISTIC
+SQL SECURITY INVOKER
+COMMENT 'Add one hit in website logs tables.'
+BEGIN
+INSERT INTO {$procedureName}_by_country(`podcast_id`, `country_code`, `date`) 
+VALUES (p_podcast_id, p_country_code, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+INSERT INTO {$procedureName}_by_browser(`podcast_id`, `browser`, `date`) 
+VALUES (p_podcast_id, p_browser, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+INSERT INTO {$procedureName}_by_referer(`podcast_id`, `referer`, `date`) 
+VALUES (p_podcast_id, p_referer, DATE(NOW())) 
+ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+END
+EOD;
+        $this->db->query($createQuery);
+    }
+
+    public function down()
+    {
+        $procedureName = $this->db->prefixTable('analytics_website');
+        $this->db->query("DROP PROCEDURE IF EXISTS `$procedureName`");
+    }
+}
diff --git a/app/Entities/AnalyticsEpisodesByCountry.php b/app/Entities/AnalyticsEpisodesByCountry.php
new file mode 100644
index 0000000000000000000000000000000000000000..b22542b293a090d4295ffed753ed68c73bee8b1b
--- /dev/null
+++ b/app/Entities/AnalyticsEpisodesByCountry.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Class AnalyticsEpisodesByCountry
+ * Entity for AnalyticsEpisodesByCountry
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsEpisodesByCountry extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'episode_id' => 'integer',
+        'country_code' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsEpisodesByPlayer.php b/app/Entities/AnalyticsEpisodesByPlayer.php
new file mode 100644
index 0000000000000000000000000000000000000000..35a5518215ad26f9bee1f9e5c029185287e94f8e
--- /dev/null
+++ b/app/Entities/AnalyticsEpisodesByPlayer.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Class AnalyticsEpisodesByPlayer
+ * Entity for AnalyticsEpisodesByPlayer
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsEpisodesByPlayer extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'episode_id' => 'integer',
+        'player' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsPodcastsByCountry.php b/app/Entities/AnalyticsPodcastsByCountry.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcdfe0378808adb3163b54dbd4ec9852de081f0e
--- /dev/null
+++ b/app/Entities/AnalyticsPodcastsByCountry.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Class AnalyticsPodcastsByCountry
+ * Entity for AnalyticsPodcastsByCountry
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsPodcastsByCountry extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'country_code' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsPodcastsByPlayer.php b/app/Entities/AnalyticsPodcastsByPlayer.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b2d52273c40a84a0e13a26a6c712da104836beb
--- /dev/null
+++ b/app/Entities/AnalyticsPodcastsByPlayer.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Class AnalyticsPodcastsByPlayer
+ * Entity for AnalyticsPodcastsByPlayer
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsPodcastsByPlayer extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'player' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsUnknownUseragents.php b/app/Entities/AnalyticsUnknownUseragents.php
new file mode 100644
index 0000000000000000000000000000000000000000..2aee6c1b1ca41cbfda261fd31d464d5e5f574fc6
--- /dev/null
+++ b/app/Entities/AnalyticsUnknownUseragents.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Class AnalyticsUnknownUseragents
+ * Entity for AnalyticsUnknownUseragents
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsUnknownUseragents extends Entity
+{
+    protected $casts = [
+        'useragent' => 'integer',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsWebsiteByBrowser.php b/app/Entities/AnalyticsWebsiteByBrowser.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ade4dcf34a7f5ce5f83b04ab98a83528f5a915c
--- /dev/null
+++ b/app/Entities/AnalyticsWebsiteByBrowser.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Class AnalyticsWebsiteByBrowser
+ * Entity for AnalyticsWebsiteByBrowser
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsWebsiteByBrowser extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'browser' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsWebsiteByCountry.php b/app/Entities/AnalyticsWebsiteByCountry.php
new file mode 100644
index 0000000000000000000000000000000000000000..996c61d09bfa1ef49c27b106398f99cf61d93f66
--- /dev/null
+++ b/app/Entities/AnalyticsWebsiteByCountry.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Class AnalyticsWebsiteByCountry
+ * Entity for AnalyticsWebsiteByCountry
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsWebsiteByCountry extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'country_code' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Entities/AnalyticsWebsiteByReferer.php b/app/Entities/AnalyticsWebsiteByReferer.php
new file mode 100644
index 0000000000000000000000000000000000000000..0244076cfb1dcd468a19cb0716cb171bae1a145c
--- /dev/null
+++ b/app/Entities/AnalyticsWebsiteByReferer.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Class class AnalyticsWebsiteByReferer
+ * Entity for AnalyticsWebsiteByReferer
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Entities;
+
+use CodeIgniter\Entity;
+
+class AnalyticsWebsiteByReferer extends Entity
+{
+    protected $casts = [
+        'podcast_id' => 'integer',
+        'referer' => 'string',
+        'date' => 'datetime',
+        'hits' => 'integer',
+    ];
+}
diff --git a/app/Language/en/Countries.php b/app/Language/en/Countries.php
index 1e91d66f60a5e3e08d825d64b8d772ac5b363646..9bd81808bc4328e0c972c86c1d5456f7e8b2491c 100644
--- a/app/Language/en/Countries.php
+++ b/app/Language/en/Countries.php
@@ -1,7 +1,6 @@
 <?
 /**
  * ISO 3166 country codes
- * @author     Benjamin Bellamy <ben@podlibre.org>
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
diff --git a/app/Language/fr/Countries.php b/app/Language/fr/Countries.php
index b9cd78e3b1ad9cf72ec52c5aaea405a484e3d376..8b25fff791fe09ea367bfb3160b04e6db00235e4 100644
--- a/app/Language/fr/Countries.php
+++ b/app/Language/fr/Countries.php
@@ -1,7 +1,6 @@
 <?
 /**
  * ISO 3166 country codes
- * @author     Benjamin Bellamy <ben@podlibre.org>
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
diff --git a/app/Models/AnalyticsEpisodesByCountryModel.php b/app/Models/AnalyticsEpisodesByCountryModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..c43e3d348f41adfcb1d578ecacd6ce4bbce48221
--- /dev/null
+++ b/app/Models/AnalyticsEpisodesByCountryModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsEpisodesByCountry
+ * Model for analytics_episodes_by_country table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsEpisodesByCountryModel extends Model
+{
+    protected $table = 'analytics_episodes_by_country';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsEpisodesByCountry';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsEpisodesByPlayerModel.php b/app/Models/AnalyticsEpisodesByPlayerModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..21670392f5e23f4ee10899e7706fc22c640aec09
--- /dev/null
+++ b/app/Models/AnalyticsEpisodesByPlayerModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsEpisodesByPlayerModel
+ * Model for analytics_episodes_by_player table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsEpisodesByPlayerModel extends Model
+{
+    protected $table = 'analytics_episodes_by_player';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsEpisodesByPlayer';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsPodcastsByCountryModel.php b/app/Models/AnalyticsPodcastsByCountryModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fe8f0421b94e9b0aeccec05150a79261d8f2163
--- /dev/null
+++ b/app/Models/AnalyticsPodcastsByCountryModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsPodcastsByCountryModel
+ * Model for analytics_episodes_by_country table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsPodcastsByCountryModel extends Model
+{
+    protected $table = 'analytics_episodes_by_country';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsPodcastsByCountry';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsPodcastsByPlayerModel.php b/app/Models/AnalyticsPodcastsByPlayerModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..cba3075374518dd766bbc0a0c8f6ed5f22202c1d
--- /dev/null
+++ b/app/Models/AnalyticsPodcastsByPlayerModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsPodcastsByPlayerModel
+ * Model for analytics_podcasts_by_player table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsPodcastsByPlayerModel extends Model
+{
+    protected $table = 'analytics_podcasts_by_player';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsPodcastsByPlayer';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsUnknownUseragentsModel.php b/app/Models/AnalyticsUnknownUseragentsModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..97514735ad55b9b4a8876d7513e929e4f1539ffd
--- /dev/null
+++ b/app/Models/AnalyticsUnknownUseragentsModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsUnknownUseragentsModel
+ * Model for analytics_unknown_useragents table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsUnknownUseragentsModel extends Model
+{
+    protected $table = 'analytics_unknown_useragents';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsUnknownUseragents';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsWebsiteByBrowserModel.php b/app/Models/AnalyticsWebsiteByBrowserModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2ac29fb3f8dbae35da8311388cee65eea76eb40
--- /dev/null
+++ b/app/Models/AnalyticsWebsiteByBrowserModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsWebsiteByBrowserModel
+ * Model for analytics_website_by_browser table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsWebsiteByBrowserModel extends Model
+{
+    protected $table = 'analytics_website_by_browser';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsWebsiteByBrowser';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsWebsiteByCountryModel.php b/app/Models/AnalyticsWebsiteByCountryModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c9a25f033a2fc8596f6b6ff0fc453f950cddf10
--- /dev/null
+++ b/app/Models/AnalyticsWebsiteByCountryModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsWebsiteByCountryModel
+ * Model for analytics_website_by_country table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsWebsiteByCountryModel extends Model
+{
+    protected $table = 'analytics_website_by_country';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsWebsiteByCountry';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/AnalyticsWebsiteByRefererModel.php b/app/Models/AnalyticsWebsiteByRefererModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..488b0cc9c3740a1056d8a912ac2e2280eb084ff5
--- /dev/null
+++ b/app/Models/AnalyticsWebsiteByRefererModel.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Class AnalyticsWebsiteByRefererModel
+ * Model for analytics_website_by_referer table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class AnalyticsWebsiteByRefererModel extends Model
+{
+    protected $table = 'analytics_website_by_referer';
+    protected $primaryKey = 'id';
+
+    protected $allowedFields = [];
+
+    protected $returnType = 'App\Entities\AnalyticsWebsiteByReferer';
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = false;
+}
diff --git a/app/Models/UnknownUserAgentsModel.php b/app/Models/UnknownUserAgentsModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..ba6e69ef10a807d32b2a2eda6909494a56e545dd
--- /dev/null
+++ b/app/Models/UnknownUserAgentsModel.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Class UnknownUserAgentsModel
+ * Model for analytics_unknown_useragents table in database
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+namespace App\Models;
+
+use CodeIgniter\Model;
+
+class UnknownUserAgentsModel extends Model
+{
+    protected $table = 'analytics_unknown_useragents';
+
+    protected $allowedFields = [];
+
+    public function getUserAgents($p_id = 0)
+    {
+        return $this->where('id>', $p_id)->findAll();
+    }
+}
diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php
index 6588932ce0b277a117e3b37fdc147c93a109873f..a91a3f6a6575e38a91c40efc8c19177dacdbbdc0 100644
--- a/app/Views/errors/cli/error_exception.php
+++ b/app/Views/errors/cli/error_exception.php
@@ -1,17 +1,19 @@
 An uncaught Exception was encountered
 
-Type: <?= get_class($exception), "\n"; ?>
-Message: <?= $message, "\n"; ?>
-Filename: <?= $exception->getFile(), "\n"; ?>
-Line Number: <?= $exception->getLine(); ?>
+Type: <?= get_class($exception), "\n" ?>
+Message: <?= $message, "\n" ?>
+Filename: <?= $exception->getFile(), "\n" ?>
+Line Number: <?= $exception->getLine() ?>
 
-<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true) : ?>
+<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true): ?>
 
 	Backtrace:
-	<?php foreach ($exception->getTrace() as $error) : ?>
-		<?php if (isset($error['file'])) : ?>
-			<?= trim('-' . $error['line'] . ' - ' . $error['file'] . '::' . $error['function']) . "\n" ?>
-		<?php endif ?>
-	<?php endforeach ?>
+	<?php foreach ($exception->getTrace() as $error): ?>
+		<?php if (isset($error['file'])): ?>
+			<?= trim(
+       '-' . $error['line'] . ' - ' . $error['file'] . '::' . $error['function']
+   ) . "\n" ?>
+		<?php endif; ?>
+	<?php endforeach; ?>
 
-<?php endif ?>
\ No newline at end of file
+<?php endif; ?>
diff --git a/app/Views/errors/html/error_404.php b/app/Views/errors/html/error_404.php
index 2bb33f87569f968d954ce8bfb09849c096f855dc..35017d337eb493aefc97eb28a318dfd280887a99 100644
--- a/app/Views/errors/html/error_404.php
+++ b/app/Views/errors/html/error_404.php
@@ -83,11 +83,11 @@
 		<h1>404 - File Not Found</h1>
 
 		<p>
-			<?php if (!empty($message) && $message !== '(null)') : ?>
+			<?php if (!empty($message) && $message !== '(null)'): ?>
 				<?= esc($message) ?>
-			<?php else : ?>
+			<?php else: ?>
 				Sorry! Cannot seem to find the page you were looking for.
-			<?php endif ?>
+			<?php endif; ?>
 		</p>
 	</div>
 </body>
diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php
index dd6f6dafa2378461a14ea5ac55b0e26bda944e0e..7eb3736a5004ee4677f01280bf9a04c4ebfd5168 100644
--- a/app/Views/errors/html/error_exception.php
+++ b/app/Views/errors/html/error_exception.php
@@ -8,7 +8,11 @@
 
 	<title><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?></title>
 	<style type="text/css">
-		<?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
+		<?= preg_replace(
+      '#[\r\n\t ]+#',
+      ' ',
+      file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
+  ) ?>
 	</style>
 
 	<script type="text/javascript">
@@ -21,10 +25,15 @@
 	<!-- Header -->
 	<div class="header">
 		<div class="container">
-			<h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'), ($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
+			<h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'),
+       $exception->getCode() ? ' #' . $exception->getCode() : '' ?></h1>
 			<p>
 				<?= $exception->getMessage() ?>
-				<a href="https://www.google.com/search?q=<?= urlencode($title . ' ' . preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())) ?>" rel="noreferrer" target="_blank">search &rarr;</a>
+				<a href="https://www.google.com/search?q=<?= urlencode(
+        $title .
+            ' ' .
+            preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())
+    ) ?>" rel="noreferrer" target="_blank">search &rarr;</a>
 			</p>
 		</div>
 	</div>
@@ -33,9 +42,9 @@
 	<div class="container">
 		<p><b><?= static::cleanPath($file, $line) ?></b> at line <b><?= $line ?></b></p>
 
-		<?php if (is_file($file)) : ?>
+		<?php if (is_file($file)): ?>
 			<div class="source">
-				<?= static::highlightFile($file, $line, 15); ?>
+				<?= static::highlightFile($file, $line, 15) ?>
 			</div>
 		<?php endif; ?>
 	</div>
@@ -58,62 +67,81 @@
 			<div class="content" id="backtrace">
 
 				<ol class="trace">
-					<?php foreach ($trace as $index => $row) : ?>
+					<?php foreach ($trace as $index => $row): ?>
 
 						<li>
 							<p>
 								<!-- Trace info -->
-								<?php if (isset($row['file']) && is_file($row['file'])) : ?>
-									<?php
-									if (isset($row['function']) && in_array($row['function'], ['include', 'include_once', 'require', 'require_once'])) {
-										echo $row['function'] . ' ' . static::cleanPath($row['file']);
-									} else {
-										echo static::cleanPath($row['file']) . ' : ' . $row['line'];
-									}
-									?>
-								<?php else : ?>
+								<?php if (isset($row['file']) && is_file($row['file'])): ?>
+									<?php if (
+             isset($row['function']) &&
+             in_array($row['function'], [
+                 'include',
+                 'include_once',
+                 'require',
+                 'require_once',
+             ])
+         ) {
+             echo $row['function'] . ' ' . static::cleanPath($row['file']);
+         } else {
+             echo static::cleanPath($row['file']) . ' : ' . $row['line'];
+         } ?>
+								<?php else: ?>
 									{PHP internal code}
 								<?php endif; ?>
 
 								<!-- Class/Method -->
-								<?php if (isset($row['class'])) : ?>
-									&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= $row['class'] . $row['type'] . $row['function'] ?>
-									<?php if (!empty($row['args'])) : ?>
-										<?php $args_id = $error_id . 'args' . $index ?>
+								<?php if (isset($row['class'])): ?>
+									&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= $row['class'] .
+             $row['type'] .
+             $row['function'] ?>
+									<?php if (!empty($row['args'])): ?>
+										<?php $args_id = $error_id . 'args' . $index; ?>
 										( <a href="#" onclick="return toggle('<?= $args_id ?>');">arguments</a> )
 										<div class="args" id="<?= $args_id ?>">
 											<table cellspacing="0">
 
 												<?php
-												$params = null;
-												// Reflection by name is not available for closure function
-												if (substr($row['function'], -1) !== '}') {
-													$mirror = isset($row['class']) ? new \ReflectionMethod($row['class'], $row['function']) : new \ReflectionFunction($row['function']);
-													$params = $mirror->getParameters();
-												}
-												foreach ($row['args'] as $key => $value) : ?>
+            $params = null;
+            // Reflection by name is not available for closure function
+            if (substr($row['function'], -1) !== '}') {
+                $mirror = isset($row['class'])
+                    ? new \ReflectionMethod($row['class'], $row['function'])
+                    : new \ReflectionFunction($row['function']);
+                $params = $mirror->getParameters();
+            }
+            foreach ($row['args'] as $key => $value): ?>
 													<tr>
-														<td><code><?= htmlspecialchars(isset($params[$key]) ? '$' . $params[$key]->name : "#$key", ENT_SUBSTITUTE, 'UTF-8') ?></code></td>
+														<td><code><?= htmlspecialchars(
+                  isset($params[$key]) ? '$' . $params[$key]->name : "#$key",
+                  ENT_SUBSTITUTE,
+                  'UTF-8'
+              ) ?></code></td>
 														<td>
 															<pre><?= print_r($value, true) ?></pre>
 														</td>
 													</tr>
-												<?php endforeach ?>
+												<?php endforeach;
+            ?>
 
 											</table>
 										</div>
-									<?php else : ?>
+									<?php else: ?>
 										()
 									<?php endif; ?>
 								<?php endif; ?>
 
-								<?php if (!isset($row['class']) && isset($row['function'])) : ?>
+								<?php if (!isset($row['class']) && isset($row['function'])): ?>
 									&nbsp;&nbsp;&mdash;&nbsp;&nbsp; <?= $row['function'] ?>()
 								<?php endif; ?>
 							</p>
 
 							<!-- Source? -->
-							<?php if (isset($row['file']) && is_file($row['file']) &&  isset($row['class'])) : ?>
+							<?php if (
+           isset($row['file']) &&
+           is_file($row['file']) &&
+           isset($row['class'])
+       ): ?>
 								<div class="source">
 									<?= static::highlightFile($row['file'], $row['line']) ?>
 								</div>
@@ -127,10 +155,10 @@
 
 			<!-- Server -->
 			<div class="content" id="server">
-				<?php foreach (['_SERVER', '_SESSION'] as $var) : ?>
+				<?php foreach (['_SERVER', '_SESSION'] as $var): ?>
 					<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
-						continue;
-					} ?>
+         continue;
+     } ?>
 
 					<h3>$<?= $var ?></h3>
 
@@ -142,13 +170,13 @@
 							</tr>
 						</thead>
 						<tbody>
-							<?php foreach ($GLOBALS[$var] as $key => $value) : ?>
+							<?php foreach ($GLOBALS[$var] as $key => $value): ?>
 								<tr>
 									<td><?= htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?></td>
 									<td>
-										<?php if (is_string($value)) : ?>
+										<?php if (is_string($value)): ?>
 											<?= htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?>
-										<?php else : ?>
+										<?php else: ?>
 											<?= '<pre>' . print_r($value, true) ?>
 										<?php endif; ?>
 									</td>
@@ -157,11 +185,11 @@
 						</tbody>
 					</table>
 
-				<?php endforeach ?>
+				<?php endforeach; ?>
 
 				<!-- Constants -->
 				<?php $constants = get_defined_constants(true); ?>
-				<?php if (!empty($constants['user'])) : ?>
+				<?php if (!empty($constants['user'])): ?>
 					<h3>Constants</h3>
 
 					<table>
@@ -172,13 +200,13 @@
 							</tr>
 						</thead>
 						<tbody>
-							<?php foreach ($constants['user'] as $key => $value) : ?>
+							<?php foreach ($constants['user'] as $key => $value): ?>
 								<tr>
 									<td><?= htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?></td>
 									<td>
-										<?php if (!is_array($value) && !is_object($value)) : ?>
+										<?php if (!is_array($value) && !is_object($value)): ?>
 											<?= htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?>
-										<?php else : ?>
+										<?php else: ?>
 											<?= '<pre>' . print_r($value, true) ?>
 										<?php endif; ?>
 									</td>
@@ -229,10 +257,10 @@
 
 
 				<?php $empty = true; ?>
-				<?php foreach (['_GET', '_POST', '_COOKIE'] as $var) : ?>
+				<?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
 					<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
-						continue;
-					} ?>
+         continue;
+     } ?>
 
 					<?php $empty = false; ?>
 
@@ -246,13 +274,13 @@
 							</tr>
 						</thead>
 						<tbody>
-							<?php foreach ($GLOBALS[$var] as $key => $value) : ?>
+							<?php foreach ($GLOBALS[$var] as $key => $value): ?>
 								<tr>
 									<td><?= htmlspecialchars($key, ENT_IGNORE, 'UTF-8') ?></td>
 									<td>
-										<?php if (!is_array($value) && !is_object($value)) : ?>
+										<?php if (!is_array($value) && !is_object($value)): ?>
 											<?= htmlspecialchars($value, ENT_SUBSTITUTE, 'UTF-8') ?>
-										<?php else : ?>
+										<?php else: ?>
 											<?= '<pre>' . print_r($value, true) ?>
 										<?php endif; ?>
 									</td>
@@ -261,9 +289,9 @@
 						</tbody>
 					</table>
 
-				<?php endforeach ?>
+				<?php endforeach; ?>
 
-				<?php if ($empty) : ?>
+				<?php if ($empty): ?>
 
 					<div class="alert">
 						No $_GET, $_POST, or $_COOKIE Information to show.
@@ -272,7 +300,7 @@
 				<?php endif; ?>
 
 				<?php $headers = $request->getHeaders(); ?>
-				<?php if (!empty($headers)) : ?>
+				<?php if (!empty($headers)): ?>
 
 					<h3>Headers</h3>
 
@@ -284,14 +312,14 @@
 							</tr>
 						</thead>
 						<tbody>
-							<?php foreach ($headers as $value) : ?>
+							<?php foreach ($headers as $value): ?>
 								<?php if (empty($value)) {
-									continue;
-								} ?>
+            continue;
+        } ?>
 								<?php if (!is_array($value)) {
-									$value = [$value];
-								} ?>
-								<?php foreach ($value as $h) : ?>
+            $value = [$value];
+        } ?>
+								<?php foreach ($value as $h): ?>
 									<tr>
 										<td><?= esc($h->getName(), 'html') ?></td>
 										<td><?= esc($h->getValueLine(), 'html') ?></td>
@@ -306,9 +334,9 @@
 
 			<!-- Response -->
 			<?php
-			$response = \Config\Services::response();
-			$response->setStatusCode(http_response_code());
-			?>
+   $response = \Config\Services::response();
+   $response->setStatusCode(http_response_code());
+   ?>
 			<div class="content" id="response">
 				<table>
 					<tr>
@@ -318,8 +346,8 @@
 				</table>
 
 				<?php $headers = $response->getHeaders(); ?>
-				<?php if (!empty($headers)) : ?>
-					<?php natsort($headers) ?>
+				<?php if (!empty($headers)): ?>
+					<?php natsort($headers); ?>
 
 					<h3>Headers</h3>
 
@@ -331,7 +359,7 @@
 							</tr>
 						</thead>
 						<tbody>
-							<?php foreach ($headers as $name => $value) : ?>
+							<?php foreach ($headers as $name => $value): ?>
 								<tr>
 									<td><?= esc($name, 'html') ?></td>
 									<td><?= esc($response->getHeaderLine($name), 'html') ?></td>
@@ -348,9 +376,13 @@
 				<?php $files = get_included_files(); ?>
 
 				<ol>
-					<?php foreach ($files as $file) : ?>
-						<li><?= htmlspecialchars(static::cleanPath($file), ENT_SUBSTITUTE, 'UTF-8') ?></li>
-					<?php endforeach ?>
+					<?php foreach ($files as $file): ?>
+						<li><?= htmlspecialchars(
+          static::cleanPath($file),
+          ENT_SUBSTITUTE,
+          'UTF-8'
+      ) ?></li>
+					<?php endforeach; ?>
 				</ol>
 			</div>
 
diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php
index f2cc36b4e5fd3f0056765af9d45b7bcd1c4c0dbe..983f519fa1e4df70363447bdce43a37de3912078 100644
--- a/app/Views/errors/html/production.php
+++ b/app/Views/errors/html/production.php
@@ -8,7 +8,11 @@
 	<title>Whoops!</title>
 
 	<style type="text/css">
-		<?= preg_replace('#[\r\n\t ]+#', ' ', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')) ?>
+		<?= preg_replace(
+      '#[\r\n\t ]+#',
+      ' ',
+      file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
+  ) ?>
 	</style>
 </head>
 
diff --git a/app/Views/json/unknownuseragents.php b/app/Views/json/unknownuseragents.php
new file mode 100644
index 0000000000000000000000000000000000000000..9014c0df08d1a2bc1f03a1b7da2a095d4ac7727d
--- /dev/null
+++ b/app/Views/json/unknownuseragents.php
@@ -0,0 +1,5 @@
+<?php
+if (!empty($useragents) && is_array($useragents)) {
+    echo json_encode($useragents);
+}
+?>
diff --git a/composer.json b/composer.json
index fd9651f445a47fcb32c44625d10114f1d5bf0555..15ed68bb9039bab5ed1a527f334638bb89d526ac 100644
--- a/composer.json
+++ b/composer.json
@@ -7,7 +7,9 @@
   "require": {
     "php": ">=7.2",
     "codeigniter4/framework": "^4",
-    "james-heinrich/getid3": "~2.0.0-dev"
+    "james-heinrich/getid3": "~2.0.0-dev",
+    "whichbrowser/parser": "^2.0",
+    "geoip2/geoip2": "~2.0"
   },
   "require-dev": {
     "mikey179/vfsstream": "1.6.*",
diff --git a/composer.lock b/composer.lock
index 58dd0941ace14748da83878867f34ac06011b087..7f2dba26a4a1c04fea92704d3099cbd8785598b3 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1,1970 +1,2049 @@
 {
-    "_readme": [
-        "This file locks the dependencies of your project to a known state",
-        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
-        "This file is @generated automatically"
-    ],
-    "content-hash": "a524161e65f809ee6dcfd5f842f4031c",
-    "packages": [
-        {
-            "name": "codeigniter4/framework",
-            "version": "v4.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/codeigniter4/framework.git",
-                "reference": "edd88b18483e309bab1411651d846aace255ab36"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/codeigniter4/framework/zipball/edd88b18483e309bab1411651d846aace255ab36",
-                "reference": "edd88b18483e309bab1411651d846aace255ab36",
-                "shasum": ""
-            },
-            "require": {
-                "ext-curl": "*",
-                "ext-intl": "*",
-                "ext-json": "*",
-                "ext-mbstring": "*",
-                "kint-php/kint": "^3.3",
-                "laminas/laminas-escaper": "^2.6",
-                "php": ">=7.2",
-                "psr/log": "^1.1"
-            },
-            "require-dev": {
-                "codeigniter4/codeigniter4-standard": "^1.0",
-                "mikey179/vfsstream": "1.6.*",
-                "phpunit/phpunit": "^8.5",
-                "squizlabs/php_codesniffer": "^3.3"
-            },
-            "type": "project",
-            "autoload": {
-                "psr-4": {
-                    "CodeIgniter\\": "system/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "description": "The CodeIgniter framework v4",
-            "homepage": "https://codeigniter.com",
-            "time": "2020-05-01T05:01:20+00:00"
-        },
+  "_readme": [
+    "This file locks the dependencies of your project to a known state",
+    "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+    "This file is @generated automatically"
+  ],
+  "content-hash": "8db0ba517a2c2b9718293a386c05c746",
+  "packages": [
+    {
+      "name": "codeigniter4/framework",
+      "version": "v4.0.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/codeigniter4/framework.git",
+        "reference": "edd88b18483e309bab1411651d846aace255ab36"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/codeigniter4/framework/zipball/edd88b18483e309bab1411651d846aace255ab36",
+        "reference": "edd88b18483e309bab1411651d846aace255ab36",
+        "shasum": ""
+      },
+      "require": {
+        "ext-curl": "*",
+        "ext-intl": "*",
+        "ext-json": "*",
+        "ext-mbstring": "*",
+        "kint-php/kint": "^3.3",
+        "laminas/laminas-escaper": "^2.6",
+        "php": ">=7.2",
+        "psr/log": "^1.1"
+      },
+      "require-dev": {
+        "codeigniter4/codeigniter4-standard": "^1.0",
+        "mikey179/vfsstream": "1.6.*",
+        "phpunit/phpunit": "^8.5",
+        "squizlabs/php_codesniffer": "^3.3"
+      },
+      "type": "project",
+      "autoload": {
+        "psr-4": {
+          "CodeIgniter\\": "system/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "description": "The CodeIgniter framework v4",
+      "homepage": "https://codeigniter.com",
+      "time": "2020-05-01T05:01:20+00:00"
+    },
+    {
+      "name": "composer/ca-bundle",
+      "version": "1.2.7",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/composer/ca-bundle.git",
+        "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd",
+        "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd",
+        "shasum": ""
+      },
+      "require": {
+        "ext-openssl": "*",
+        "ext-pcre": "*",
+        "php": "^5.3.2 || ^7.0 || ^8.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
+        "psr/log": "^1.0",
+        "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Composer\\CaBundle\\": "src"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
         {
-            "name": "james-heinrich/getid3",
-            "version": "2.0.x-dev",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/JamesHeinrich/getID3.git",
-                "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/8cf765ec4c42ed732993a9aa60b638ee398df154",
-                "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4.0"
-            },
-            "require-dev": {
-                "jakub-onderka/php-parallel-lint": "^0.9 || ^1.0",
-                "phpunit/phpunit": "^4.8|^5.0"
-            },
-            "suggest": {
-                "ext-SimpleXML": "SimpleXML extension is required to analyze RIFF/WAV/BWF audio files (also requires `ext-libxml`).",
-                "ext-com_dotnet": "COM extension is required when loading files larger than 2GB on Windows.",
-                "ext-ctype": "ctype extension is required when loading files larger than 2GB on 32-bit PHP (also on 64-bit PHP on Windows) or executing `getid3_lib::CopyTagsToComments`.",
-                "ext-dba": "DBA extension is required to use the DBA database as a cache storage.",
-                "ext-exif": "EXIF extension is required for graphic modules.",
-                "ext-iconv": "iconv extension is required to work with different character sets (when `ext-mbstring` is not available).",
-                "ext-json": "JSON extension is required to analyze Apple Quicktime videos.",
-                "ext-libxml": "libxml extension is required to analyze RIFF/WAV/BWF audio files.",
-                "ext-mbstring": "mbstring extension is required to work with different character sets.",
-                "ext-mysql": "MySQL extension is required to use the MySQL database as a cache storage (deprecated in PHP 5.5, removed in PHP >= 7.0, use `ext-mysqli` instead).",
-                "ext-mysqli": "MySQLi extension is required to use the MySQL database as a cache storage.",
-                "ext-rar": "RAR extension is required for RAR archive module.",
-                "ext-sqlite3": "SQLite3 extension is required to use the SQLite3 database as a cache storage.",
-                "ext-xml": "XML extension is required for graphic modules to analyze the XML metadata.",
-                "ext-zlib": "Zlib extension is required for archive modules and compressed metadata."
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "JamesHeinrich\\GetID3\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "GPL-1.0-or-later",
-                "LGPL-3.0-only",
-                "MPL-2.0"
-            ],
-            "authors": [
-                {
-                    "name": "James Heinrich",
-                    "email": "info@getid3.org",
-                    "homepage": "https://github.com/JamesHeinrich",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Craig Duncan",
-                    "email": "git@duncanc.co.uk",
-                    "homepage": "https://github.com/duncan3dc",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Extract and write useful information to/from popular multimedia file formats",
-            "homepage": "https://www.getid3.org/",
-            "keywords": [
-                "audio",
-                "codecs",
-                "id3",
-                "metadata",
-                "tags",
-                "video"
-            ],
-            "time": "2019-07-22T12:33:16+00:00"
-        },
+          "name": "Jordi Boggiano",
+          "email": "j.boggiano@seld.be",
+          "homepage": "http://seld.be"
+        }
+      ],
+      "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+      "keywords": ["cabundle", "cacert", "certificate", "ssl", "tls"],
+      "funding": [
         {
-            "name": "kint-php/kint",
-            "version": "3.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/kint-php/kint.git",
-                "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b",
-                "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.6"
-            },
-            "require-dev": {
-                "friendsofphp/php-cs-fixer": "^2.0",
-                "phpunit/phpunit": "^4.0",
-                "seld/phar-utils": "^1.0",
-                "symfony/finder": "^2.0 || ^3.0 || ^4.0",
-                "vimeo/psalm": "^3.0"
-            },
-            "suggest": {
-                "ext-ctype": "Simple data type tests",
-                "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages",
-                "ext-mbstring": "Provides string encoding detection",
-                "kint-php/kint-js": "Provides a simplified dump to console.log()",
-                "kint-php/kint-twig": "Provides d() and s() functions in twig templates",
-                "symfony/polyfill-ctype": "Replacement for ext-ctype if missing",
-                "symfony/polyfill-iconv": "Replacement for ext-iconv if missing",
-                "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing"
-            },
-            "type": "library",
-            "autoload": {
-                "files": [
-                    "init.php"
-                ],
-                "psr-4": {
-                    "Kint\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jonathan Vollebregt",
-                    "homepage": "https://github.com/jnvsor"
-                },
-                {
-                    "name": "Rokas Å leinius",
-                    "homepage": "https://github.com/raveren"
-                },
-                {
-                    "name": "Contributors",
-                    "homepage": "https://github.com/kint-php/kint/graphs/contributors"
-                }
-            ],
-            "description": "Kint - debugging tool for PHP developers",
-            "homepage": "https://kint-php.github.io/kint/",
-            "keywords": [
-                "debug",
-                "kint",
-                "php"
-            ],
-            "time": "2019-10-17T18:05:24+00:00"
+          "url": "https://packagist.com",
+          "type": "custom"
         },
         {
-            "name": "laminas/laminas-escaper",
-            "version": "2.6.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/laminas/laminas-escaper.git",
-                "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70",
-                "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70",
-                "shasum": ""
-            },
-            "require": {
-                "laminas/laminas-zendframework-bridge": "^1.0",
-                "php": "^5.6 || ^7.0"
-            },
-            "replace": {
-                "zendframework/zend-escaper": "self.version"
-            },
-            "require-dev": {
-                "laminas/laminas-coding-standard": "~1.0.0",
-                "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.6.x-dev",
-                    "dev-develop": "2.7.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Laminas\\Escaper\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs",
-            "homepage": "https://laminas.dev",
-            "keywords": [
-                "escaper",
-                "laminas"
-            ],
-            "time": "2019-12-31T16:43:30+00:00"
-        },
+          "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+          "type": "tidelift"
+        }
+      ],
+      "time": "2020-04-08T08:27:21+00:00"
+    },
+    {
+      "name": "geoip2/geoip2",
+      "version": "v2.10.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/maxmind/GeoIP2-php.git",
+        "reference": "419557cd21d9fe039721a83490701a58c8ce784a"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/419557cd21d9fe039721a83490701a58c8ce784a",
+        "reference": "419557cd21d9fe039721a83490701a58c8ce784a",
+        "shasum": ""
+      },
+      "require": {
+        "ext-json": "*",
+        "maxmind-db/reader": "~1.5",
+        "maxmind/web-service-common": "~0.6",
+        "php": ">=5.6"
+      },
+      "require-dev": {
+        "friendsofphp/php-cs-fixer": "2.*",
+        "phpunit/phpunit": "5.*",
+        "squizlabs/php_codesniffer": "3.*"
+      },
+      "type": "library",
+      "autoload": {
+        "psr-4": {
+          "GeoIp2\\": "src"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["Apache-2.0"],
+      "authors": [
         {
-            "name": "laminas/laminas-zendframework-bridge",
-            "version": "1.0.4",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/laminas/laminas-zendframework-bridge.git",
-                "reference": "fcd87520e4943d968557803919523772475e8ea3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/fcd87520e4943d968557803919523772475e8ea3",
-                "reference": "fcd87520e4943d968557803919523772475e8ea3",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1",
-                "squizlabs/php_codesniffer": "^3.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev",
-                    "dev-develop": "1.1.x-dev"
-                },
-                "laminas": {
-                    "module": "Laminas\\ZendFrameworkBridge"
-                }
-            },
-            "autoload": {
-                "files": [
-                    "src/autoload.php"
-                ],
-                "psr-4": {
-                    "Laminas\\ZendFrameworkBridge\\": "src//"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "description": "Alias legacy ZF class names to Laminas Project equivalents.",
-            "keywords": [
-                "ZendFramework",
-                "autoloading",
-                "laminas",
-                "zf"
-            ],
-            "funding": [
-                {
-                    "url": "https://funding.communitybridge.org/projects/laminas-project",
-                    "type": "community_bridge"
-                }
-            ],
-            "time": "2020-05-20T16:45:56+00:00"
-        },
+          "name": "Gregory J. Oschwald",
+          "email": "goschwald@maxmind.com",
+          "homepage": "https://www.maxmind.com/"
+        }
+      ],
+      "description": "MaxMind GeoIP2 PHP API",
+      "homepage": "https://github.com/maxmind/GeoIP2-php",
+      "keywords": ["IP", "geoip", "geoip2", "geolocation", "maxmind"],
+      "time": "2019-12-12T18:48:39+00:00"
+    },
+    {
+      "name": "james-heinrich/getid3",
+      "version": "2.0.x-dev",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/JamesHeinrich/getID3.git",
+        "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/8cf765ec4c42ed732993a9aa60b638ee398df154",
+        "reference": "8cf765ec4c42ed732993a9aa60b638ee398df154",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.4.0"
+      },
+      "require-dev": {
+        "jakub-onderka/php-parallel-lint": "^0.9 || ^1.0",
+        "phpunit/phpunit": "^4.8|^5.0"
+      },
+      "suggest": {
+        "ext-SimpleXML": "SimpleXML extension is required to analyze RIFF/WAV/BWF audio files (also requires `ext-libxml`).",
+        "ext-com_dotnet": "COM extension is required when loading files larger than 2GB on Windows.",
+        "ext-ctype": "ctype extension is required when loading files larger than 2GB on 32-bit PHP (also on 64-bit PHP on Windows) or executing `getid3_lib::CopyTagsToComments`.",
+        "ext-dba": "DBA extension is required to use the DBA database as a cache storage.",
+        "ext-exif": "EXIF extension is required for graphic modules.",
+        "ext-iconv": "iconv extension is required to work with different character sets (when `ext-mbstring` is not available).",
+        "ext-json": "JSON extension is required to analyze Apple Quicktime videos.",
+        "ext-libxml": "libxml extension is required to analyze RIFF/WAV/BWF audio files.",
+        "ext-mbstring": "mbstring extension is required to work with different character sets.",
+        "ext-mysql": "MySQL extension is required to use the MySQL database as a cache storage (deprecated in PHP 5.5, removed in PHP >= 7.0, use `ext-mysqli` instead).",
+        "ext-mysqli": "MySQLi extension is required to use the MySQL database as a cache storage.",
+        "ext-rar": "RAR extension is required for RAR archive module.",
+        "ext-sqlite3": "SQLite3 extension is required to use the SQLite3 database as a cache storage.",
+        "ext-xml": "XML extension is required for graphic modules to analyze the XML metadata.",
+        "ext-zlib": "Zlib extension is required for archive modules and compressed metadata."
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.0.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "JamesHeinrich\\GetID3\\": "src/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["GPL-1.0-or-later", "LGPL-3.0-only", "MPL-2.0"],
+      "authors": [
         {
-            "name": "psr/log",
-            "version": "1.1.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/php-fig/log.git",
-                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
-                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.1.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Psr\\Log\\": "Psr/Log/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/"
-                }
-            ],
-            "description": "Common interface for logging libraries",
-            "homepage": "https://github.com/php-fig/log",
-            "keywords": [
-                "log",
-                "psr",
-                "psr-3"
-            ],
-            "time": "2020-03-23T09:12:05+00:00"
-        }
-    ],
-    "packages-dev": [
-        {
-            "name": "doctrine/instantiator",
-            "version": "1.3.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/doctrine/instantiator.git",
-                "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
-                "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1 || ^8.0"
-            },
-            "require-dev": {
-                "doctrine/coding-standard": "^6.0",
-                "ext-pdo": "*",
-                "ext-phar": "*",
-                "phpbench/phpbench": "^0.13",
-                "phpstan/phpstan-phpunit": "^0.11",
-                "phpstan/phpstan-shim": "^0.11",
-                "phpunit/phpunit": "^7.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.2.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Marco Pivetta",
-                    "email": "ocramius@gmail.com",
-                    "homepage": "http://ocramius.github.com/"
-                }
-            ],
-            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
-            "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
-            "keywords": [
-                "constructor",
-                "instantiate"
-            ],
-            "funding": [
-                {
-                    "url": "https://www.doctrine-project.org/sponsorship.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://www.patreon.com/phpdoctrine",
-                    "type": "patreon"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-29T17:27:14+00:00"
+          "name": "James Heinrich",
+          "email": "info@getid3.org",
+          "homepage": "https://github.com/JamesHeinrich",
+          "role": "Developer"
         },
         {
-            "name": "mikey179/vfsstream",
-            "version": "v1.6.8",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/bovigo/vfsStream.git",
-                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
-                "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.5|^5.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.6.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-0": {
-                    "org\\bovigo\\vfs\\": "src/main/php"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Frank Kleine",
-                    "homepage": "http://frankkleine.de/",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Virtual file system to mock the real file system in unit tests.",
-            "homepage": "http://vfs.bovigo.org/",
-            "time": "2019-10-30T15:31:00+00:00"
-        },
+          "name": "Craig Duncan",
+          "email": "git@duncanc.co.uk",
+          "homepage": "https://github.com/duncan3dc",
+          "role": "Developer"
+        }
+      ],
+      "description": "Extract and write useful information to/from popular multimedia file formats",
+      "homepage": "https://www.getid3.org/",
+      "keywords": ["audio", "codecs", "id3", "metadata", "tags", "video"],
+      "time": "2019-07-22T12:33:16+00:00"
+    },
+    {
+      "name": "kint-php/kint",
+      "version": "3.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/kint-php/kint.git",
+        "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/kint-php/kint/zipball/335ac1bcaf04d87df70d8aa51e8887ba2c6d203b",
+        "reference": "335ac1bcaf04d87df70d8aa51e8887ba2c6d203b",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.3.6"
+      },
+      "require-dev": {
+        "friendsofphp/php-cs-fixer": "^2.0",
+        "phpunit/phpunit": "^4.0",
+        "seld/phar-utils": "^1.0",
+        "symfony/finder": "^2.0 || ^3.0 || ^4.0",
+        "vimeo/psalm": "^3.0"
+      },
+      "suggest": {
+        "ext-ctype": "Simple data type tests",
+        "ext-iconv": "Provides fallback detection for ambiguous legacy string encodings such as the Windows and ISO 8859 code pages",
+        "ext-mbstring": "Provides string encoding detection",
+        "kint-php/kint-js": "Provides a simplified dump to console.log()",
+        "kint-php/kint-twig": "Provides d() and s() functions in twig templates",
+        "symfony/polyfill-ctype": "Replacement for ext-ctype if missing",
+        "symfony/polyfill-iconv": "Replacement for ext-iconv if missing",
+        "symfony/polyfill-mbstring": "Replacement for ext-mbstring if missing"
+      },
+      "type": "library",
+      "autoload": {
+        "files": ["init.php"],
+        "psr-4": {
+          "Kint\\": "src/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
         {
-            "name": "myclabs/deep-copy",
-            "version": "1.9.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/myclabs/DeepCopy.git",
-                "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
-                "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1"
-            },
-            "replace": {
-                "myclabs/deep-copy": "self.version"
-            },
-            "require-dev": {
-                "doctrine/collections": "^1.0",
-                "doctrine/common": "^2.6",
-                "phpunit/phpunit": "^7.1"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "DeepCopy\\": "src/DeepCopy/"
-                },
-                "files": [
-                    "src/DeepCopy/deep_copy.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "description": "Create deep copies (clones) of your objects",
-            "keywords": [
-                "clone",
-                "copy",
-                "duplicate",
-                "object",
-                "object graph"
-            ],
-            "time": "2020-01-17T21:11:47+00:00"
+          "name": "Jonathan Vollebregt",
+          "homepage": "https://github.com/jnvsor"
         },
         {
-            "name": "phar-io/manifest",
-            "version": "1.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phar-io/manifest.git",
-                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
-                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
-                "shasum": ""
-            },
-            "require": {
-                "ext-dom": "*",
-                "ext-phar": "*",
-                "phar-io/version": "^2.0",
-                "php": "^5.6 || ^7.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Arne Blankerts",
-                    "email": "arne@blankerts.de",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Sebastian Heuer",
-                    "email": "sebastian@phpeople.de",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
-            "time": "2018-07-08T19:23:20+00:00"
+          "name": "Rokas Å leinius",
+          "homepage": "https://github.com/raveren"
         },
         {
-            "name": "phar-io/version",
-            "version": "2.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phar-io/version.git",
-                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
-                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Arne Blankerts",
-                    "email": "arne@blankerts.de",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Sebastian Heuer",
-                    "email": "sebastian@phpeople.de",
-                    "role": "Developer"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "Developer"
-                }
-            ],
-            "description": "Library for handling version information and constraints",
-            "time": "2018-07-08T19:19:57+00:00"
+          "name": "Contributors",
+          "homepage": "https://github.com/kint-php/kint/graphs/contributors"
+        }
+      ],
+      "description": "Kint - debugging tool for PHP developers",
+      "homepage": "https://kint-php.github.io/kint/",
+      "keywords": ["debug", "kint", "php"],
+      "time": "2019-10-17T18:05:24+00:00"
+    },
+    {
+      "name": "laminas/laminas-escaper",
+      "version": "2.6.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/laminas/laminas-escaper.git",
+        "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/25f2a053eadfa92ddacb609dcbbc39362610da70",
+        "reference": "25f2a053eadfa92ddacb609dcbbc39362610da70",
+        "shasum": ""
+      },
+      "require": {
+        "laminas/laminas-zendframework-bridge": "^1.0",
+        "php": "^5.6 || ^7.0"
+      },
+      "replace": {
+        "zendframework/zend-escaper": "self.version"
+      },
+      "require-dev": {
+        "laminas/laminas-coding-standard": "~1.0.0",
+        "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.6.x-dev",
+          "dev-develop": "2.7.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Laminas\\Escaper\\": "src/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs",
+      "homepage": "https://laminas.dev",
+      "keywords": ["escaper", "laminas"],
+      "time": "2019-12-31T16:43:30+00:00"
+    },
+    {
+      "name": "laminas/laminas-zendframework-bridge",
+      "version": "1.0.4",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/laminas/laminas-zendframework-bridge.git",
+        "reference": "fcd87520e4943d968557803919523772475e8ea3"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/fcd87520e4943d968557803919523772475e8ea3",
+        "reference": "fcd87520e4943d968557803919523772475e8ea3",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^5.6 || ^7.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1",
+        "squizlabs/php_codesniffer": "^3.5"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.0.x-dev",
+          "dev-develop": "1.1.x-dev"
         },
+        "laminas": {
+          "module": "Laminas\\ZendFrameworkBridge"
+        }
+      },
+      "autoload": {
+        "files": ["src/autoload.php"],
+        "psr-4": {
+          "Laminas\\ZendFrameworkBridge\\": "src//"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "description": "Alias legacy ZF class names to Laminas Project equivalents.",
+      "keywords": ["ZendFramework", "autoloading", "laminas", "zf"],
+      "funding": [
+        {
+          "url": "https://funding.communitybridge.org/projects/laminas-project",
+          "type": "community_bridge"
+        }
+      ],
+      "time": "2020-05-20T16:45:56+00:00"
+    },
+    {
+      "name": "maxmind-db/reader",
+      "version": "v1.6.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
+        "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/febd4920bf17c1da84cef58e56a8227dfb37fbe4",
+        "reference": "febd4920bf17c1da84cef58e56a8227dfb37fbe4",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.6"
+      },
+      "conflict": {
+        "ext-maxminddb": "<1.6.0,>=2.0.0"
+      },
+      "require-dev": {
+        "friendsofphp/php-cs-fixer": "2.*",
+        "php-coveralls/php-coveralls": "^2.1",
+        "phpunit/phpcov": "^3.0",
+        "phpunit/phpunit": "5.*",
+        "squizlabs/php_codesniffer": "3.*"
+      },
+      "suggest": {
+        "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
+        "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
+        "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
+      },
+      "type": "library",
+      "autoload": {
+        "psr-4": {
+          "MaxMind\\Db\\": "src/MaxMind/Db"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["Apache-2.0"],
+      "authors": [
+        {
+          "name": "Gregory J. Oschwald",
+          "email": "goschwald@maxmind.com",
+          "homepage": "https://www.maxmind.com/"
+        }
+      ],
+      "description": "MaxMind DB Reader API",
+      "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
+      "keywords": ["database", "geoip", "geoip2", "geolocation", "maxmind"],
+      "time": "2019-12-19T22:59:03+00:00"
+    },
+    {
+      "name": "maxmind/web-service-common",
+      "version": "v0.7.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/maxmind/web-service-common-php.git",
+        "reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
+        "reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
+        "shasum": ""
+      },
+      "require": {
+        "composer/ca-bundle": "^1.0.3",
+        "ext-curl": "*",
+        "ext-json": "*",
+        "php": ">=5.6"
+      },
+      "require-dev": {
+        "friendsofphp/php-cs-fixer": "2.*",
+        "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
+        "squizlabs/php_codesniffer": "3.*"
+      },
+      "type": "library",
+      "autoload": {
+        "psr-4": {
+          "MaxMind\\Exception\\": "src/Exception",
+          "MaxMind\\WebService\\": "src/WebService"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["Apache-2.0"],
+      "authors": [
+        {
+          "name": "Gregory Oschwald",
+          "email": "goschwald@maxmind.com"
+        }
+      ],
+      "description": "Internal MaxMind Web Service API",
+      "homepage": "https://github.com/maxmind/web-service-common-php",
+      "time": "2020-05-06T14:07:26+00:00"
+    },
+    {
+      "name": "psr/cache",
+      "version": "1.0.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/php-fig/cache.git",
+        "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+        "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.3.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.0.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Psr\\Cache\\": "src/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "PHP-FIG",
+          "homepage": "http://www.php-fig.org/"
+        }
+      ],
+      "description": "Common interface for caching libraries",
+      "keywords": ["cache", "psr", "psr-6"],
+      "time": "2016-08-06T20:24:11+00:00"
+    },
+    {
+      "name": "psr/log",
+      "version": "1.1.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/php-fig/log.git",
+        "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+        "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.3.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.1.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Psr\\Log\\": "Psr/Log/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "PHP-FIG",
+          "homepage": "http://www.php-fig.org/"
+        }
+      ],
+      "description": "Common interface for logging libraries",
+      "homepage": "https://github.com/php-fig/log",
+      "keywords": ["log", "psr", "psr-3"],
+      "time": "2020-03-23T09:12:05+00:00"
+    },
+    {
+      "name": "whichbrowser/parser",
+      "version": "v2.0.42",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/WhichBrowser/Parser-PHP.git",
+        "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/4899110cd2f87b01e04ced62dbb9dec541031dee",
+        "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.4.0",
+        "psr/cache": "^1.0"
+      },
+      "require-dev": {
+        "icomefromthenet/reverse-regex": "0.0.6.3",
+        "phpunit/php-code-coverage": "^2.2 || ^3.0",
+        "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0",
+        "satooshi/php-coveralls": "^1.0",
+        "squizlabs/php_codesniffer": "2.5.*",
+        "symfony/yaml": "~2.8 || ~3.4 || ~4.2 || ~5.0"
+      },
+      "suggest": {
+        "cache/array-adapter": "Allows testing of the caching functionality"
+      },
+      "type": "library",
+      "autoload": {
+        "psr-4": {
+          "WhichBrowser\\": ["src/", "tests/src/"]
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Niels Leenheer",
+          "email": "niels@leenheer.nl",
+          "role": "Developer"
+        }
+      ],
+      "description": "Useragent sniffing library for PHP",
+      "homepage": "http://whichbrowser.net",
+      "keywords": ["browser", "sniffing", "ua", "useragent"],
+      "time": "2020-02-12T10:54:23+00:00"
+    }
+  ],
+  "packages-dev": [
+    {
+      "name": "doctrine/instantiator",
+      "version": "1.3.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/doctrine/instantiator.git",
+        "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
+        "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1 || ^8.0"
+      },
+      "require-dev": {
+        "doctrine/coding-standard": "^6.0",
+        "ext-pdo": "*",
+        "ext-phar": "*",
+        "phpbench/phpbench": "^0.13",
+        "phpstan/phpstan-phpunit": "^0.11",
+        "phpstan/phpstan-shim": "^0.11",
+        "phpunit/phpunit": "^7.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.2.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Marco Pivetta",
+          "email": "ocramius@gmail.com",
+          "homepage": "http://ocramius.github.com/"
+        }
+      ],
+      "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+      "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+      "keywords": ["constructor", "instantiate"],
+      "funding": [
         {
-            "name": "phpdocumentor/reflection-common",
-            "version": "2.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
-                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
-                "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=7.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "phpDocumentor\\Reflection\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Jaap van Otterdijk",
-                    "email": "opensource@ijaap.nl"
-                }
-            ],
-            "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
-            "homepage": "http://www.phpdoc.org",
-            "keywords": [
-                "FQSEN",
-                "phpDocumentor",
-                "phpdoc",
-                "reflection",
-                "static analysis"
-            ],
-            "time": "2020-04-27T09:25:28+00:00"
+          "url": "https://www.doctrine-project.org/sponsorship.html",
+          "type": "custom"
         },
         {
-            "name": "phpdocumentor/reflection-docblock",
-            "version": "5.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
-                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
-                "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
-                "shasum": ""
-            },
-            "require": {
-                "ext-filter": "^7.1",
-                "php": "^7.2",
-                "phpdocumentor/reflection-common": "^2.0",
-                "phpdocumentor/type-resolver": "^1.0",
-                "webmozart/assert": "^1"
-            },
-            "require-dev": {
-                "doctrine/instantiator": "^1",
-                "mockery/mockery": "^1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "5.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "phpDocumentor\\Reflection\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Mike van Riel",
-                    "email": "me@mikevanriel.com"
-                },
-                {
-                    "name": "Jaap van Otterdijk",
-                    "email": "account@ijaap.nl"
-                }
-            ],
-            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
-            "time": "2020-02-22T12:28:44+00:00"
+          "url": "https://www.patreon.com/phpdoctrine",
+          "type": "patreon"
         },
         {
-            "name": "phpdocumentor/type-resolver",
-            "version": "1.1.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpDocumentor/TypeResolver.git",
-                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
-                "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.2",
-                "phpdocumentor/reflection-common": "^2.0"
-            },
-            "require-dev": {
-                "ext-tokenizer": "^7.2",
-                "mockery/mockery": "~1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "phpDocumentor\\Reflection\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Mike van Riel",
-                    "email": "me@mikevanriel.com"
-                }
-            ],
-            "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
-            "time": "2020-02-18T18:59:58+00:00"
+          "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+          "type": "tidelift"
+        }
+      ],
+      "time": "2020-05-29T17:27:14+00:00"
+    },
+    {
+      "name": "mikey179/vfsstream",
+      "version": "v1.6.8",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/bovigo/vfsStream.git",
+        "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+        "reference": "231c73783ebb7dd9ec77916c10037eff5a2b6efe",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.3.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^4.5|^5.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.6.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-0": {
+          "org\\bovigo\\vfs\\": "src/main/php"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Frank Kleine",
+          "homepage": "http://frankkleine.de/",
+          "role": "Developer"
+        }
+      ],
+      "description": "Virtual file system to mock the real file system in unit tests.",
+      "homepage": "http://vfs.bovigo.org/",
+      "time": "2019-10-30T15:31:00+00:00"
+    },
+    {
+      "name": "myclabs/deep-copy",
+      "version": "1.9.5",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/myclabs/DeepCopy.git",
+        "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
+        "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1"
+      },
+      "replace": {
+        "myclabs/deep-copy": "self.version"
+      },
+      "require-dev": {
+        "doctrine/collections": "^1.0",
+        "doctrine/common": "^2.6",
+        "phpunit/phpunit": "^7.1"
+      },
+      "type": "library",
+      "autoload": {
+        "psr-4": {
+          "DeepCopy\\": "src/DeepCopy/"
         },
+        "files": ["src/DeepCopy/deep_copy.php"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "description": "Create deep copies (clones) of your objects",
+      "keywords": ["clone", "copy", "duplicate", "object", "object graph"],
+      "time": "2020-01-17T21:11:47+00:00"
+    },
+    {
+      "name": "phar-io/manifest",
+      "version": "1.0.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/phar-io/manifest.git",
+        "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+        "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+        "shasum": ""
+      },
+      "require": {
+        "ext-dom": "*",
+        "ext-phar": "*",
+        "phar-io/version": "^2.0",
+        "php": "^5.6 || ^7.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.0.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
         {
-            "name": "phpspec/prophecy",
-            "version": "v1.10.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "451c3cd1418cf640de218914901e51b064abb093"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
-                "reference": "451c3cd1418cf640de218914901e51b064abb093",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/instantiator": "^1.0.2",
-                "php": "^5.3|^7.0",
-                "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
-                "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
-                "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
-            },
-            "require-dev": {
-                "phpspec/phpspec": "^2.5 || ^3.2",
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.10.x-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Prophecy\\": "src/Prophecy"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Konstantin Kudryashov",
-                    "email": "ever.zet@gmail.com",
-                    "homepage": "http://everzet.com"
-                },
-                {
-                    "name": "Marcello Duarte",
-                    "email": "marcello.duarte@gmail.com"
-                }
-            ],
-            "description": "Highly opinionated mocking framework for PHP 5.3+",
-            "homepage": "https://github.com/phpspec/prophecy",
-            "keywords": [
-                "Double",
-                "Dummy",
-                "fake",
-                "mock",
-                "spy",
-                "stub"
-            ],
-            "time": "2020-03-05T15:02:03+00:00"
+          "name": "Arne Blankerts",
+          "email": "arne@blankerts.de",
+          "role": "Developer"
         },
         {
-            "name": "phpunit/php-code-coverage",
-            "version": "7.0.10",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
-                "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
-                "shasum": ""
-            },
-            "require": {
-                "ext-dom": "*",
-                "ext-xmlwriter": "*",
-                "php": "^7.2",
-                "phpunit/php-file-iterator": "^2.0.2",
-                "phpunit/php-text-template": "^1.2.1",
-                "phpunit/php-token-stream": "^3.1.1",
-                "sebastian/code-unit-reverse-lookup": "^1.0.1",
-                "sebastian/environment": "^4.2.2",
-                "sebastian/version": "^2.0.1",
-                "theseer/tokenizer": "^1.1.3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^8.2.2"
-            },
-            "suggest": {
-                "ext-xdebug": "^2.7.2"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "7.0-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.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": [
-                "coverage",
-                "testing",
-                "xunit"
-            ],
-            "time": "2019-11-20T13:55:58+00:00"
+          "name": "Sebastian Heuer",
+          "email": "sebastian@phpeople.de",
+          "role": "Developer"
         },
         {
-            "name": "phpunit/php-file-iterator",
-            "version": "2.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "050bedf145a257b1ff02746c31894800e5122946"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
-                "reference": "050bedf145a257b1ff02746c31894800e5122946",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.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"
-            ],
-            "time": "2018-09-13T20:33:42+00:00"
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "Developer"
+        }
+      ],
+      "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+      "time": "2018-07-08T19:23:20+00:00"
+    },
+    {
+      "name": "phar-io/version",
+      "version": "2.0.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/phar-io/version.git",
+        "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+        "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^5.6 || ^7.0"
+      },
+      "type": "library",
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Arne Blankerts",
+          "email": "arne@blankerts.de",
+          "role": "Developer"
         },
         {
-            "name": "phpunit/php-text-template",
-            "version": "1.2.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-text-template.git",
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Simple template engine.",
-            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
-            "keywords": [
-                "template"
-            ],
-            "time": "2015-06-21T13:50:34+00:00"
+          "name": "Sebastian Heuer",
+          "email": "sebastian@phpeople.de",
+          "role": "Developer"
         },
         {
-            "name": "phpunit/php-timer",
-            "version": "2.1.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-timer.git",
-                "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
-                "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.1-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Utility class for timing",
-            "homepage": "https://github.com/sebastianbergmann/php-timer/",
-            "keywords": [
-                "timer"
-            ],
-            "time": "2019-06-07T04:22:29+00:00"
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "Developer"
+        }
+      ],
+      "description": "Library for handling version information and constraints",
+      "time": "2018-07-08T19:19:57+00:00"
+    },
+    {
+      "name": "phpdocumentor/reflection-common",
+      "version": "2.1.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+        "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
+        "reference": "6568f4687e5b41b054365f9ae03fcb1ed5f2069b",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=7.1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "phpDocumentor\\Reflection\\": "src/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Jaap van Otterdijk",
+          "email": "opensource@ijaap.nl"
+        }
+      ],
+      "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+      "homepage": "http://www.phpdoc.org",
+      "keywords": [
+        "FQSEN",
+        "phpDocumentor",
+        "phpdoc",
+        "reflection",
+        "static analysis"
+      ],
+      "time": "2020-04-27T09:25:28+00:00"
+    },
+    {
+      "name": "phpdocumentor/reflection-docblock",
+      "version": "5.1.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+        "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
+        "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
+        "shasum": ""
+      },
+      "require": {
+        "ext-filter": "^7.1",
+        "php": "^7.2",
+        "phpdocumentor/reflection-common": "^2.0",
+        "phpdocumentor/type-resolver": "^1.0",
+        "webmozart/assert": "^1"
+      },
+      "require-dev": {
+        "doctrine/instantiator": "^1",
+        "mockery/mockery": "^1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "5.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "phpDocumentor\\Reflection\\": "src"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Mike van Riel",
+          "email": "me@mikevanriel.com"
         },
         {
-            "name": "phpunit/php-token-stream",
-            "version": "3.1.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
-                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
-                "shasum": ""
-            },
-            "require": {
-                "ext-tokenizer": "*",
-                "php": "^7.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.1-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Wrapper around PHP's tokenizer extension.",
-            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
-            "keywords": [
-                "tokenizer"
-            ],
-            "time": "2019-09-17T06:23:10+00:00"
+          "name": "Jaap van Otterdijk",
+          "email": "account@ijaap.nl"
+        }
+      ],
+      "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+      "time": "2020-02-22T12:28:44+00:00"
+    },
+    {
+      "name": "phpdocumentor/type-resolver",
+      "version": "1.1.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/phpDocumentor/TypeResolver.git",
+        "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
+        "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.2",
+        "phpdocumentor/reflection-common": "^2.0"
+      },
+      "require-dev": {
+        "ext-tokenizer": "^7.2",
+        "mockery/mockery": "~1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "phpDocumentor\\Reflection\\": "src"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Mike van Riel",
+          "email": "me@mikevanriel.com"
+        }
+      ],
+      "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+      "time": "2020-02-18T18:59:58+00:00"
+    },
+    {
+      "name": "phpspec/prophecy",
+      "version": "v1.10.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/phpspec/prophecy.git",
+        "reference": "451c3cd1418cf640de218914901e51b064abb093"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+        "reference": "451c3cd1418cf640de218914901e51b064abb093",
+        "shasum": ""
+      },
+      "require": {
+        "doctrine/instantiator": "^1.0.2",
+        "php": "^5.3|^7.0",
+        "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+        "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+        "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
+      },
+      "require-dev": {
+        "phpspec/phpspec": "^2.5 || ^3.2",
+        "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.10.x-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Prophecy\\": "src/Prophecy"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Konstantin Kudryashov",
+          "email": "ever.zet@gmail.com",
+          "homepage": "http://everzet.com"
         },
         {
-            "name": "phpunit/phpunit",
-            "version": "8.5.5",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/63dda3b212a0025d380a745f91bdb4d8c985adb7",
-                "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7",
-                "shasum": ""
-            },
-            "require": {
-                "doctrine/instantiator": "^1.2.0",
-                "ext-dom": "*",
-                "ext-json": "*",
-                "ext-libxml": "*",
-                "ext-mbstring": "*",
-                "ext-xml": "*",
-                "ext-xmlwriter": "*",
-                "myclabs/deep-copy": "^1.9.1",
-                "phar-io/manifest": "^1.0.3",
-                "phar-io/version": "^2.0.1",
-                "php": "^7.2",
-                "phpspec/prophecy": "^1.8.1",
-                "phpunit/php-code-coverage": "^7.0.7",
-                "phpunit/php-file-iterator": "^2.0.2",
-                "phpunit/php-text-template": "^1.2.1",
-                "phpunit/php-timer": "^2.1.2",
-                "sebastian/comparator": "^3.0.2",
-                "sebastian/diff": "^3.0.2",
-                "sebastian/environment": "^4.2.2",
-                "sebastian/exporter": "^3.1.1",
-                "sebastian/global-state": "^3.0.0",
-                "sebastian/object-enumerator": "^3.0.3",
-                "sebastian/resource-operations": "^2.0.1",
-                "sebastian/type": "^1.1.3",
-                "sebastian/version": "^2.0.1"
-            },
-            "require-dev": {
-                "ext-pdo": "*"
-            },
-            "suggest": {
-                "ext-soap": "*",
-                "ext-xdebug": "*",
-                "phpunit/php-invoker": "^2.0.0"
-            },
-            "bin": [
-                "phpunit"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "8.5-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "The PHP Unit Testing framework.",
-            "homepage": "https://phpunit.de/",
-            "keywords": [
-                "phpunit",
-                "testing",
-                "xunit"
-            ],
-            "funding": [
-                {
-                    "url": "https://phpunit.de/donate.html",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/sebastianbergmann",
-                    "type": "github"
-                }
-            ],
-            "time": "2020-05-22T13:51:52+00:00"
+          "name": "Marcello Duarte",
+          "email": "marcello.duarte@gmail.com"
+        }
+      ],
+      "description": "Highly opinionated mocking framework for PHP 5.3+",
+      "homepage": "https://github.com/phpspec/prophecy",
+      "keywords": ["Double", "Dummy", "fake", "mock", "spy", "stub"],
+      "time": "2020-03-05T15:02:03+00:00"
+    },
+    {
+      "name": "phpunit/php-code-coverage",
+      "version": "7.0.10",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+        "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
+        "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
+        "shasum": ""
+      },
+      "require": {
+        "ext-dom": "*",
+        "ext-xmlwriter": "*",
+        "php": "^7.2",
+        "phpunit/php-file-iterator": "^2.0.2",
+        "phpunit/php-text-template": "^1.2.1",
+        "phpunit/php-token-stream": "^3.1.1",
+        "sebastian/code-unit-reverse-lookup": "^1.0.1",
+        "sebastian/environment": "^4.2.2",
+        "sebastian/version": "^2.0.1",
+        "theseer/tokenizer": "^1.1.3"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^8.2.2"
+      },
+      "suggest": {
+        "ext-xdebug": "^2.7.2"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "7.0-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.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": ["coverage", "testing", "xunit"],
+      "time": "2019-11-20T13:55:58+00:00"
+    },
+    {
+      "name": "phpunit/php-file-iterator",
+      "version": "2.0.2",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+        "reference": "050bedf145a257b1ff02746c31894800e5122946"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
+        "reference": "050bedf145a257b1ff02746c31894800e5122946",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^7.1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.0.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.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"],
+      "time": "2018-09-13T20:33:42+00:00"
+    },
+    {
+      "name": "phpunit/php-text-template",
+      "version": "1.2.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/php-text-template.git",
+        "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+        "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.3.3"
+      },
+      "type": "library",
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "lead"
+        }
+      ],
+      "description": "Simple template engine.",
+      "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+      "keywords": ["template"],
+      "time": "2015-06-21T13:50:34+00:00"
+    },
+    {
+      "name": "phpunit/php-timer",
+      "version": "2.1.2",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/php-timer.git",
+        "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
+        "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^7.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.1-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "lead"
+        }
+      ],
+      "description": "Utility class for timing",
+      "homepage": "https://github.com/sebastianbergmann/php-timer/",
+      "keywords": ["timer"],
+      "time": "2019-06-07T04:22:29+00:00"
+    },
+    {
+      "name": "phpunit/php-token-stream",
+      "version": "3.1.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+        "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
+        "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
+        "shasum": ""
+      },
+      "require": {
+        "ext-tokenizer": "*",
+        "php": "^7.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^7.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.1-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Wrapper around PHP's tokenizer extension.",
+      "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+      "keywords": ["tokenizer"],
+      "time": "2019-09-17T06:23:10+00:00"
+    },
+    {
+      "name": "phpunit/phpunit",
+      "version": "8.5.5",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/phpunit.git",
+        "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/63dda3b212a0025d380a745f91bdb4d8c985adb7",
+        "reference": "63dda3b212a0025d380a745f91bdb4d8c985adb7",
+        "shasum": ""
+      },
+      "require": {
+        "doctrine/instantiator": "^1.2.0",
+        "ext-dom": "*",
+        "ext-json": "*",
+        "ext-libxml": "*",
+        "ext-mbstring": "*",
+        "ext-xml": "*",
+        "ext-xmlwriter": "*",
+        "myclabs/deep-copy": "^1.9.1",
+        "phar-io/manifest": "^1.0.3",
+        "phar-io/version": "^2.0.1",
+        "php": "^7.2",
+        "phpspec/prophecy": "^1.8.1",
+        "phpunit/php-code-coverage": "^7.0.7",
+        "phpunit/php-file-iterator": "^2.0.2",
+        "phpunit/php-text-template": "^1.2.1",
+        "phpunit/php-timer": "^2.1.2",
+        "sebastian/comparator": "^3.0.2",
+        "sebastian/diff": "^3.0.2",
+        "sebastian/environment": "^4.2.2",
+        "sebastian/exporter": "^3.1.1",
+        "sebastian/global-state": "^3.0.0",
+        "sebastian/object-enumerator": "^3.0.3",
+        "sebastian/resource-operations": "^2.0.1",
+        "sebastian/type": "^1.1.3",
+        "sebastian/version": "^2.0.1"
+      },
+      "require-dev": {
+        "ext-pdo": "*"
+      },
+      "suggest": {
+        "ext-soap": "*",
+        "ext-xdebug": "*",
+        "phpunit/php-invoker": "^2.0.0"
+      },
+      "bin": ["phpunit"],
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "8.5-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "lead"
+        }
+      ],
+      "description": "The PHP Unit Testing framework.",
+      "homepage": "https://phpunit.de/",
+      "keywords": ["phpunit", "testing", "xunit"],
+      "funding": [
+        {
+          "url": "https://phpunit.de/donate.html",
+          "type": "custom"
         },
         {
-            "name": "sebastian/code-unit-reverse-lookup",
-            "version": "1.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.6 || ^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^5.7 || ^6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Looks up which function or method a line of code belongs to",
-            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
-            "time": "2017-03-04T06:30:41+00:00"
+          "url": "https://github.com/sebastianbergmann",
+          "type": "github"
+        }
+      ],
+      "time": "2020-05-22T13:51:52+00:00"
+    },
+    {
+      "name": "sebastian/code-unit-reverse-lookup",
+      "version": "1.0.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+        "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+        "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^5.6 || ^7.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^5.7 || ^6.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.0.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Looks up which function or method a line of code belongs to",
+      "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+      "time": "2017-03-04T06:30:41+00:00"
+    },
+    {
+      "name": "sebastian/comparator",
+      "version": "3.0.2",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/comparator.git",
+        "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+        "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1",
+        "sebastian/diff": "^3.0",
+        "sebastian/exporter": "^3.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^7.1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.0-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Jeff Welch",
+          "email": "whatthejeff@gmail.com"
         },
         {
-            "name": "sebastian/comparator",
-            "version": "3.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
-                "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1",
-                "sebastian/diff": "^3.0",
-                "sebastian/exporter": "^3.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
-                {
-                    "name": "Volker Dusch",
-                    "email": "github@wallbash.com"
-                },
-                {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@2bepublished.at"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Provides the functionality to compare PHP values for equality",
-            "homepage": "https://github.com/sebastianbergmann/comparator",
-            "keywords": [
-                "comparator",
-                "compare",
-                "equality"
-            ],
-            "time": "2018-07-12T15:12:46+00:00"
+          "name": "Volker Dusch",
+          "email": "github@wallbash.com"
         },
         {
-            "name": "sebastian/diff",
-            "version": "3.0.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
-                "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.5 || ^8.0",
-                "symfony/process": "^2 || ^3.3 || ^4"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Diff implementation",
-            "homepage": "https://github.com/sebastianbergmann/diff",
-            "keywords": [
-                "diff",
-                "udiff",
-                "unidiff",
-                "unified diff"
-            ],
-            "time": "2019-02-04T06:01:07+00:00"
+          "name": "Bernhard Schussek",
+          "email": "bschussek@2bepublished.at"
         },
         {
-            "name": "sebastian/environment",
-            "version": "4.2.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
-                "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^7.5"
-            },
-            "suggest": {
-                "ext-posix": "*"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "4.2-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Provides functionality to handle HHVM/PHP environments",
-            "homepage": "http://www.github.com/sebastianbergmann/environment",
-            "keywords": [
-                "Xdebug",
-                "environment",
-                "hhvm"
-            ],
-            "time": "2019-11-20T08:46:58+00:00"
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Provides the functionality to compare PHP values for equality",
+      "homepage": "https://github.com/sebastianbergmann/comparator",
+      "keywords": ["comparator", "compare", "equality"],
+      "time": "2018-07-12T15:12:46+00:00"
+    },
+    {
+      "name": "sebastian/diff",
+      "version": "3.0.2",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/diff.git",
+        "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+        "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^7.5 || ^8.0",
+        "symfony/process": "^2 || ^3.3 || ^4"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.0-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Kore Nordmann",
+          "email": "mail@kore-nordmann.de"
         },
         {
-            "name": "sebastian/exporter",
-            "version": "3.1.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
-                "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0",
-                "sebastian/recursion-context": "^3.0"
-            },
-            "require-dev": {
-                "ext-mbstring": "*",
-                "phpunit/phpunit": "^6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.1.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                },
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
-                {
-                    "name": "Volker Dusch",
-                    "email": "github@wallbash.com"
-                },
-                {
-                    "name": "Adam Harvey",
-                    "email": "aharvey@php.net"
-                },
-                {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@gmail.com"
-                }
-            ],
-            "description": "Provides the functionality to export PHP variables for visualization",
-            "homepage": "http://www.github.com/sebastianbergmann/exporter",
-            "keywords": [
-                "export",
-                "exporter"
-            ],
-            "time": "2019-09-14T09:02:43+00:00"
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Diff implementation",
+      "homepage": "https://github.com/sebastianbergmann/diff",
+      "keywords": ["diff", "udiff", "unidiff", "unified diff"],
+      "time": "2019-02-04T06:01:07+00:00"
+    },
+    {
+      "name": "sebastian/environment",
+      "version": "4.2.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/environment.git",
+        "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+        "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^7.5"
+      },
+      "suggest": {
+        "ext-posix": "*"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "4.2-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Provides functionality to handle HHVM/PHP environments",
+      "homepage": "http://www.github.com/sebastianbergmann/environment",
+      "keywords": ["Xdebug", "environment", "hhvm"],
+      "time": "2019-11-20T08:46:58+00:00"
+    },
+    {
+      "name": "sebastian/exporter",
+      "version": "3.1.2",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/exporter.git",
+        "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
+        "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.0",
+        "sebastian/recursion-context": "^3.0"
+      },
+      "require-dev": {
+        "ext-mbstring": "*",
+        "phpunit/phpunit": "^6.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.1.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
         },
         {
-            "name": "sebastian/global-state",
-            "version": "3.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/global-state.git",
-                "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
-                "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.2",
-                "sebastian/object-reflector": "^1.1.1",
-                "sebastian/recursion-context": "^3.0"
-            },
-            "require-dev": {
-                "ext-dom": "*",
-                "phpunit/phpunit": "^8.0"
-            },
-            "suggest": {
-                "ext-uopz": "*"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Snapshotting of global state",
-            "homepage": "http://www.github.com/sebastianbergmann/global-state",
-            "keywords": [
-                "global state"
-            ],
-            "time": "2019-02-01T05:30:01+00:00"
+          "name": "Jeff Welch",
+          "email": "whatthejeff@gmail.com"
         },
         {
-            "name": "sebastian/object-enumerator",
-            "version": "3.0.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
-                "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
-                "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0",
-                "sebastian/object-reflector": "^1.1.1",
-                "sebastian/recursion-context": "^3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
-            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
-            "time": "2017-08-03T12:35:26+00:00"
+          "name": "Volker Dusch",
+          "email": "github@wallbash.com"
         },
         {
-            "name": "sebastian/object-reflector",
-            "version": "1.1.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/object-reflector.git",
-                "reference": "773f97c67f28de00d397be301821b06708fca0be"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
-                "reference": "773f97c67f28de00d397be301821b06708fca0be",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.1-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Allows reflection of object attributes, including inherited and non-public ones",
-            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
-            "time": "2017-03-29T09:07:27+00:00"
+          "name": "Adam Harvey",
+          "email": "aharvey@php.net"
         },
         {
-            "name": "sebastian/recursion-context",
-            "version": "3.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
-                "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^6.0"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                },
-                {
-                    "name": "Adam Harvey",
-                    "email": "aharvey@php.net"
-                }
-            ],
-            "description": "Provides functionality to recursively process PHP variables",
-            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
-            "time": "2017-03-03T06:23:57+00:00"
+          "name": "Bernhard Schussek",
+          "email": "bschussek@gmail.com"
+        }
+      ],
+      "description": "Provides the functionality to export PHP variables for visualization",
+      "homepage": "http://www.github.com/sebastianbergmann/exporter",
+      "keywords": ["export", "exporter"],
+      "time": "2019-09-14T09:02:43+00:00"
+    },
+    {
+      "name": "sebastian/global-state",
+      "version": "3.0.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/global-state.git",
+        "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
+        "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.2",
+        "sebastian/object-reflector": "^1.1.1",
+        "sebastian/recursion-context": "^3.0"
+      },
+      "require-dev": {
+        "ext-dom": "*",
+        "phpunit/phpunit": "^8.0"
+      },
+      "suggest": {
+        "ext-uopz": "*"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.0-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Snapshotting of global state",
+      "homepage": "http://www.github.com/sebastianbergmann/global-state",
+      "keywords": ["global state"],
+      "time": "2019-02-01T05:30:01+00:00"
+    },
+    {
+      "name": "sebastian/object-enumerator",
+      "version": "3.0.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+        "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+        "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.0",
+        "sebastian/object-reflector": "^1.1.1",
+        "sebastian/recursion-context": "^3.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^6.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.0.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+      "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+      "time": "2017-08-03T12:35:26+00:00"
+    },
+    {
+      "name": "sebastian/object-reflector",
+      "version": "1.1.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/object-reflector.git",
+        "reference": "773f97c67f28de00d397be301821b06708fca0be"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
+        "reference": "773f97c67f28de00d397be301821b06708fca0be",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^6.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.1-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Allows reflection of object attributes, including inherited and non-public ones",
+      "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+      "time": "2017-03-29T09:07:27+00:00"
+    },
+    {
+      "name": "sebastian/recursion-context",
+      "version": "3.0.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/recursion-context.git",
+        "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+        "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.0"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^6.0"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "3.0.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Jeff Welch",
+          "email": "whatthejeff@gmail.com"
         },
         {
-            "name": "sebastian/resource-operations",
-            "version": "2.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/resource-operations.git",
-                "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
-                "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.1"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
-                }
-            ],
-            "description": "Provides a list of PHP built-in functions that operate on resources",
-            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
-            "time": "2018-10-04T04:07:39+00:00"
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
         },
         {
-            "name": "sebastian/type",
-            "version": "1.1.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/type.git",
-                "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
-                "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^7.2"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^8.2"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.1-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Collection of value objects that represent the types of the PHP type system",
-            "homepage": "https://github.com/sebastianbergmann/type",
-            "time": "2019-07-02T08:10:15+00:00"
+          "name": "Adam Harvey",
+          "email": "aharvey@php.net"
+        }
+      ],
+      "description": "Provides functionality to recursively process PHP variables",
+      "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+      "time": "2017-03-03T06:23:57+00:00"
+    },
+    {
+      "name": "sebastian/resource-operations",
+      "version": "2.0.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/resource-operations.git",
+        "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+        "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.1"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.0-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de"
+        }
+      ],
+      "description": "Provides a list of PHP built-in functions that operate on resources",
+      "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+      "time": "2018-10-04T04:07:39+00:00"
+    },
+    {
+      "name": "sebastian/type",
+      "version": "1.1.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/type.git",
+        "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
+        "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^7.2"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^8.2"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.1-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "lead"
+        }
+      ],
+      "description": "Collection of value objects that represent the types of the PHP type system",
+      "homepage": "https://github.com/sebastianbergmann/type",
+      "time": "2019-07-02T08:10:15+00:00"
+    },
+    {
+      "name": "sebastian/version",
+      "version": "2.0.1",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/sebastianbergmann/version.git",
+        "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+        "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.6"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "2.0.x-dev"
+        }
+      },
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Sebastian Bergmann",
+          "email": "sebastian@phpunit.de",
+          "role": "lead"
+        }
+      ],
+      "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+      "homepage": "https://github.com/sebastianbergmann/version",
+      "time": "2016-10-03T07:35:21+00:00"
+    },
+    {
+      "name": "symfony/polyfill-ctype",
+      "version": "v1.17.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/symfony/polyfill-ctype.git",
+        "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
+        "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
+        "shasum": ""
+      },
+      "require": {
+        "php": ">=5.3.3"
+      },
+      "suggest": {
+        "ext-ctype": "For best performance"
+      },
+      "type": "library",
+      "extra": {
+        "branch-alias": {
+          "dev-master": "1.17-dev"
+        }
+      },
+      "autoload": {
+        "psr-4": {
+          "Symfony\\Polyfill\\Ctype\\": ""
         },
+        "files": ["bootstrap.php"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
         {
-            "name": "sebastian/version",
-            "version": "2.0.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/version.git",
-                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
-                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.6"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de",
-                    "role": "lead"
-                }
-            ],
-            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
-            "homepage": "https://github.com/sebastianbergmann/version",
-            "time": "2016-10-03T07:35:21+00:00"
+          "name": "Gert de Pagter",
+          "email": "BackEndTea@gmail.com"
         },
         {
-            "name": "symfony/polyfill-ctype",
-            "version": "v1.17.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
-                "reference": "e94c8b1bbe2bc77507a1056cdb06451c75b427f9",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "suggest": {
-                "ext-ctype": "For best performance"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.17-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Polyfill\\Ctype\\": ""
-                },
-                "files": [
-                    "bootstrap.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Gert de Pagter",
-                    "email": "BackEndTea@gmail.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony polyfill for ctype functions",
-            "homepage": "https://symfony.com",
-            "keywords": [
-                "compatibility",
-                "ctype",
-                "polyfill",
-                "portable"
-            ],
-            "funding": [
-                {
-                    "url": "https://symfony.com/sponsor",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/fabpot",
-                    "type": "github"
-                },
-                {
-                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
-                    "type": "tidelift"
-                }
-            ],
-            "time": "2020-05-12T16:14:59+00:00"
+          "name": "Symfony Community",
+          "homepage": "https://symfony.com/contributors"
+        }
+      ],
+      "description": "Symfony polyfill for ctype functions",
+      "homepage": "https://symfony.com",
+      "keywords": ["compatibility", "ctype", "polyfill", "portable"],
+      "funding": [
+        {
+          "url": "https://symfony.com/sponsor",
+          "type": "custom"
         },
         {
-            "name": "theseer/tokenizer",
-            "version": "1.1.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/theseer/tokenizer.git",
-                "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
-                "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
-                "shasum": ""
-            },
-            "require": {
-                "ext-dom": "*",
-                "ext-tokenizer": "*",
-                "ext-xmlwriter": "*",
-                "php": "^7.0"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Arne Blankerts",
-                    "email": "arne@blankerts.de",
-                    "role": "Developer"
-                }
-            ],
-            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
-            "time": "2019-06-13T22:48:21+00:00"
+          "url": "https://github.com/fabpot",
+          "type": "github"
         },
         {
-            "name": "webmozart/assert",
-            "version": "1.8.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/webmozart/assert.git",
-                "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
-                "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.3.3 || ^7.0",
-                "symfony/polyfill-ctype": "^1.8"
-            },
-            "conflict": {
-                "vimeo/psalm": "<3.9.1"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
-            },
-            "type": "library",
-            "autoload": {
-                "psr-4": {
-                    "Webmozart\\Assert\\": "src/"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@gmail.com"
-                }
-            ],
-            "description": "Assertions to validate method input/output with nice error messages.",
-            "keywords": [
-                "assert",
-                "check",
-                "validate"
-            ],
-            "time": "2020-04-18T12:12:48+00:00"
-        }
-    ],
-    "aliases": [],
-    "minimum-stability": "stable",
-    "stability-flags": {
-        "james-heinrich/getid3": 20
+          "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+          "type": "tidelift"
+        }
+      ],
+      "time": "2020-05-12T16:14:59+00:00"
     },
-    "prefer-stable": false,
-    "prefer-lowest": false,
-    "platform": {
-        "php": ">=7.2"
+    {
+      "name": "theseer/tokenizer",
+      "version": "1.1.3",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/theseer/tokenizer.git",
+        "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+        "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+        "shasum": ""
+      },
+      "require": {
+        "ext-dom": "*",
+        "ext-tokenizer": "*",
+        "ext-xmlwriter": "*",
+        "php": "^7.0"
+      },
+      "type": "library",
+      "autoload": {
+        "classmap": ["src/"]
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["BSD-3-Clause"],
+      "authors": [
+        {
+          "name": "Arne Blankerts",
+          "email": "arne@blankerts.de",
+          "role": "Developer"
+        }
+      ],
+      "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+      "time": "2019-06-13T22:48:21+00:00"
     },
-    "platform-dev": [],
-    "plugin-api-version": "1.1.0"
+    {
+      "name": "webmozart/assert",
+      "version": "1.8.0",
+      "source": {
+        "type": "git",
+        "url": "https://github.com/webmozart/assert.git",
+        "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6"
+      },
+      "dist": {
+        "type": "zip",
+        "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
+        "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
+        "shasum": ""
+      },
+      "require": {
+        "php": "^5.3.3 || ^7.0",
+        "symfony/polyfill-ctype": "^1.8"
+      },
+      "conflict": {
+        "vimeo/psalm": "<3.9.1"
+      },
+      "require-dev": {
+        "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+      },
+      "type": "library",
+      "autoload": {
+        "psr-4": {
+          "Webmozart\\Assert\\": "src/"
+        }
+      },
+      "notification-url": "https://packagist.org/downloads/",
+      "license": ["MIT"],
+      "authors": [
+        {
+          "name": "Bernhard Schussek",
+          "email": "bschussek@gmail.com"
+        }
+      ],
+      "description": "Assertions to validate method input/output with nice error messages.",
+      "keywords": ["assert", "check", "validate"],
+      "time": "2020-04-18T12:12:48+00:00"
+    }
+  ],
+  "aliases": [],
+  "minimum-stability": "stable",
+  "stability-flags": {
+    "james-heinrich/getid3": 20
+  },
+  "prefer-stable": false,
+  "prefer-lowest": false,
+  "platform": {
+    "php": ">=7.2"
+  },
+  "platform-dev": [],
+  "plugin-api-version": "1.1.0"
 }