From 868050bcbe228b932707baa078229389d89c6dd7 Mon Sep 17 00:00:00 2001 From: Clement Date: Wed, 22 Jul 2020 12:54:04 +0200 Subject: [PATCH] :sparkles: Hello world! --- .gitignore | 2 + README.md | 15 + badge.php | 12 + composer.json | 20 + composer.lock | 373 ++++++ index.php | 34 + vendor/autoload.php | 7 + vendor/composer/ClassLoader.php | 445 +++++++ vendor/composer/LICENSE | 19 + vendor/composer/autoload_classmap.php | 9 + vendor/composer/autoload_files.php | 10 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 10 + vendor/composer/autoload_real.php | 73 ++ vendor/composer/autoload_static.php | 35 + vendor/composer/installed.json | 356 ++++++ .../donatj/phpuseragentparser/.editorconfig | 4 + .../phpuseragentparser/.github/FUNDING.yml | 2 + .../.github/workflows/ci.yml | 32 + vendor/donatj/phpuseragentparser/.gitignore | 5 + .../phpuseragentparser/.helpers/constants.php | 15 + vendor/donatj/phpuseragentparser/.mddoc.xml | 108 ++ vendor/donatj/phpuseragentparser/.travis.yml | 23 + .../donatj/phpuseragentparser/CONTRIBUTING.md | 18 + vendor/donatj/phpuseragentparser/LICENSE.md | 22 + vendor/donatj/phpuseragentparser/Makefile | 13 + vendor/donatj/phpuseragentparser/README.md | 180 +++ .../phpuseragentparser/bin/benchmark.php | 24 + .../bin/constant_generator.php | 77 ++ .../bin/init_user_agent.php | 13 + .../bin/user_agent_sorter.php | 100 ++ .../donatj/phpuseragentparser/composer.json | 38 + .../phpuseragentparser/phpunit.xml.dist | 11 + .../src/UserAgent/Browsers.php | 51 + .../src/UserAgent/Platforms.php | 39 + .../src/UserAgent/UserAgent.php | 57 + .../src/UserAgent/UserAgentInterface.php | 25 + .../src/UserAgent/UserAgentParser.php | 39 + .../src/UserAgentParser.php | 210 ++++ .../tests/UserAgentParserFunctionTest.php | 50 + .../tests/UserAgentParserObjectTest.php | 45 + .../phpuseragentparser/tests/user_agents.json | 1027 +++++++++++++++++ 42 files changed, 3657 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 badge.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 index.php create mode 100644 vendor/autoload.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/donatj/phpuseragentparser/.editorconfig create mode 100644 vendor/donatj/phpuseragentparser/.github/FUNDING.yml create mode 100644 vendor/donatj/phpuseragentparser/.github/workflows/ci.yml create mode 100644 vendor/donatj/phpuseragentparser/.gitignore create mode 100644 vendor/donatj/phpuseragentparser/.helpers/constants.php create mode 100644 vendor/donatj/phpuseragentparser/.mddoc.xml create mode 100644 vendor/donatj/phpuseragentparser/.travis.yml create mode 100644 vendor/donatj/phpuseragentparser/CONTRIBUTING.md create mode 100644 vendor/donatj/phpuseragentparser/LICENSE.md create mode 100644 vendor/donatj/phpuseragentparser/Makefile create mode 100644 vendor/donatj/phpuseragentparser/README.md create mode 100644 vendor/donatj/phpuseragentparser/bin/benchmark.php create mode 100644 vendor/donatj/phpuseragentparser/bin/constant_generator.php create mode 100644 vendor/donatj/phpuseragentparser/bin/init_user_agent.php create mode 100644 vendor/donatj/phpuseragentparser/bin/user_agent_sorter.php create mode 100644 vendor/donatj/phpuseragentparser/composer.json create mode 100644 vendor/donatj/phpuseragentparser/phpunit.xml.dist create mode 100644 vendor/donatj/phpuseragentparser/src/UserAgent/Browsers.php create mode 100644 vendor/donatj/phpuseragentparser/src/UserAgent/Platforms.php create mode 100644 vendor/donatj/phpuseragentparser/src/UserAgent/UserAgent.php create mode 100644 vendor/donatj/phpuseragentparser/src/UserAgent/UserAgentInterface.php create mode 100644 vendor/donatj/phpuseragentparser/src/UserAgent/UserAgentParser.php create mode 100644 vendor/donatj/phpuseragentparser/src/UserAgentParser.php create mode 100644 vendor/donatj/phpuseragentparser/tests/UserAgentParserFunctionTest.php create mode 100644 vendor/donatj/phpuseragentparser/tests/UserAgentParserObjectTest.php create mode 100644 vendor/donatj/phpuseragentparser/tests/user_agents.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ebadaf9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +database.sqlite diff --git a/README.md b/README.md new file mode 100644 index 0000000..000478b --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Simple counter + +## Install + +`git clone` it anywhere you want then +`touch database.sqlite` in the same folder with the write right + +## Usage + +`![My Counter](https://shikiryu.alwaysdata.net/github_counter/)` +![My Counter](https://shikiryu.alwaysdata.net/github_counter/) + +## Details + +I live in Europe where the GDPR is very important, so the IP is anonymized (the last 2 parts of the IP address are removed) and the UA agent is parsed to delete details. \ No newline at end of file diff --git a/badge.php b/badge.php new file mode 100644 index 0000000..66e1b5a --- /dev/null +++ b/badge.php @@ -0,0 +1,12 @@ + + Profile views: + + + + + + + Profile views + + + \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..b02d083 --- /dev/null +++ b/composer.json @@ -0,0 +1,20 @@ +{ + "name": "shikiryu/github_counter", + "description": "Add a visitor counter for github", + "minimum-stability": "stable", + "license": "proprietary", + "authors": [ + { + "name": "Clément", + "email": "projets@shiki.fr" + } + ], + "require": { + "donatj/phpuseragentparser": "^1.0", + "ext-pdo": "*" + } + , + "require-dev": { + "roave/security-advisories": "dev-master" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..de0396e --- /dev/null +++ b/composer.lock @@ -0,0 +1,373 @@ +{ + "_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": "4c11cbef52aa0ade1f26e3b72b007026", + "packages": [ + { + "name": "donatj/phpuseragentparser", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/donatj/PhpUserAgent.git", + "reference": "1431382850017ac017d194f2a6f6cacb35212888" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/donatj/PhpUserAgent/zipball/1431382850017ac017d194f2a6f6cacb35212888", + "reference": "1431382850017ac017d194f2a6f6cacb35212888", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "camspiers/json-pretty": "~1.0", + "donatj/drop": "*", + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "files": [ + "src/UserAgentParser.php" + ], + "psr-4": { + "donatj\\UserAgent\\": "src/UserAgent" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jesse G. Donat", + "email": "donatj@gmail.com", + "homepage": "https://donatstudios.com", + "role": "Developer" + } + ], + "description": "Lightning fast, minimalist PHP UserAgent string parser.", + "homepage": "http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT", + "keywords": [ + "browser", + "browser detection", + "parser", + "user agent", + "useragent" + ], + "funding": [ + { + "url": "https://www.paypal.me/donatj/15", + "type": "custom" + }, + { + "url": "https://github.com/donatj", + "type": "github" + } + ], + "time": "2020-04-24T18:07:07+00:00" + } + ], + "packages-dev": [ + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "9f386dba391018e90a5f1e51abeffc6bf27583db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9f386dba391018e90a5f1e51abeffc6bf27583db", + "reference": "9f386dba391018e90a5f1e51abeffc6bf27583db", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "bolt/bolt": "<3.7.1", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", + "drupal/drupal": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/october": ">=1.0.319,<1.0.467", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.2", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.8", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.3", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/gamification": "<2.3.2", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.49", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", + "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2020-07-16T05:17:29+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "roave/security-advisories": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..89dfafa --- /dev/null +++ b/index.php @@ -0,0 +1,34 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + $tables = $db_handle->query("SELECT name FROM sqlite_master WHERE type='table'")->fetch(PDO::FETCH_ASSOC); + + if (!in_array('counter', $tables, true)) { + $db_handle->exec("CREATE TABLE `counter` ( ID INTEGER PRIMARY KEY, ua TEXT, ip TEXT, created_at DATE );"); + } + + $anonymized_ip = sprintf('%s.0.0', implode('.', array_slice(explode('.', $_SERVER['REMOTE_ADDR']), 0, 2))); + $parser = new UserAgentParser(); + $ua = $parser->parse(); + $insert_request = $db_handle->prepare('INSERT INTO `counter` ( ua, ip, created_at ) VALUES (:ua, :ip, :created_at)'); + $query = $insert_request->execute([ + 'ua' => sprintf('%s / %s / %s', $ua->platform(), $ua->browser(), $ua->browserVersion()), + 'ip' => $anonymized_ip, + 'created_at' => date('Y-m-d H:i:s'), + ]); + + $count = $db_handle->query('SELECT count(*) as `count` from `counter`')->fetch(PDO::FETCH_ASSOC)['count']; + include 'badge.php'; + header('Content-Type: image/svg+xml'); + header('Cache-Control: max-age=0, must-revalidate, no-cache, no-store, private'); + + exit; +} catch (Exception $e) { + die('Erreur : '.$e->getMessage()); +} diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..7a599fa --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 0000000..62ecfd8 --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..7a91153 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + $vendorDir . '/donatj/phpuseragentparser/src/UserAgentParser.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..b7fc012 --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/donatj/phpuseragentparser/src/UserAgent'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..27ab2a3 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,73 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInitce10b31d6b9265573dd36d44a870aac8::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInitce10b31d6b9265573dd36d44a870aac8::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequirece10b31d6b9265573dd36d44a870aac8($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequirece10b31d6b9265573dd36d44a870aac8($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 0000000..8011010 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,35 @@ + __DIR__ . '/..' . '/donatj/phpuseragentparser/src/UserAgentParser.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'd' => + array ( + 'donatj\\UserAgent\\' => 17, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'donatj\\UserAgent\\' => + array ( + 0 => __DIR__ . '/..' . '/donatj/phpuseragentparser/src/UserAgent', + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitce10b31d6b9265573dd36d44a870aac8::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitce10b31d6b9265573dd36d44a870aac8::$prefixDirsPsr4; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..2b0b1d1 --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,356 @@ +[ + { + "name": "donatj/phpuseragentparser", + "version": "v1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/donatj/PhpUserAgent.git", + "reference": "1431382850017ac017d194f2a6f6cacb35212888" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/donatj/PhpUserAgent/zipball/1431382850017ac017d194f2a6f6cacb35212888", + "reference": "1431382850017ac017d194f2a6f6cacb35212888", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "camspiers/json-pretty": "~1.0", + "donatj/drop": "*", + "phpunit/phpunit": "~4.8" + }, + "time": "2020-04-24T18:07:07+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/UserAgentParser.php" + ], + "psr-4": { + "donatj\\UserAgent\\": "src/UserAgent" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jesse G. Donat", + "email": "donatj@gmail.com", + "homepage": "https://donatstudios.com", + "role": "Developer" + } + ], + "description": "Lightning fast, minimalist PHP UserAgent string parser.", + "homepage": "http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT", + "keywords": [ + "browser", + "browser detection", + "parser", + "user agent", + "useragent" + ], + "funding": [ + { + "url": "https://www.paypal.me/donatj/15", + "type": "custom" + }, + { + "url": "https://github.com/donatj", + "type": "github" + } + ] + }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "9f386dba391018e90a5f1e51abeffc6bf27583db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9f386dba391018e90a5f1e51abeffc6bf27583db", + "reference": "9f386dba391018e90a5f1e51abeffc6bf27583db", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "bolt/bolt": "<3.7.1", + "brightlocal/phpwhois": "<=4.2.5", + "buddypress/buddypress": "<5.1.2", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "centreon/centreon": "<18.10.8|>=19,<19.4.5", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.46|>=4.5,<4.8.6", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dolibarr/dolibarr": "<11.0.4", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", + "drupal/drupal": ">=7,<7.72|>=8,<8.8.8|>=8.9,<8.9.1|>=9,<9.0.1", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.13.1", + "erusev/parsedown": "<1.7.2", + "ezsystems/demobundle": ">=5.4,<5.4.6.1", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1|>=5.4,<5.4.11.1|>=2017.12,<2017.12.0.1", + "ezsystems/ezplatform": ">=1.7,<1.7.9.1|>=1.13,<1.13.5.1|>=2.5,<2.5.4", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2", + "ezsystems/ezplatform-kernel": ">=1,<1.0.2.1", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.14.2|>=6,<6.7.9.1|>=6.8,<6.13.6.3|>=7,<7.2.4.1|>=7.3,<7.3.2.1|>=7.5,<7.5.7.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.14.1|>=2011,<2017.12.7.2|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3|>=2019.3,<2019.3.4.2", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "getgrav/grav": "<1.7-beta.8", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": ">=7,<7.1.2", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30|>=7,<7.1.2", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "librenms/librenms": "<1.53", + "magento/community-edition": ">=2,<2.2.10|>=2.3,<2.3.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2-p.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "nystudio107/craft-seomatic": "<3.3", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/october": ">=1.0.319,<1.0.467", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpfastcache/phpfastcache": ">=5,<5.0.13", + "phpmailer/phpmailer": "<6.1.6", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<4.9.2", + "phpoffice/phpexcel": "<1.8.2", + "phpoffice/phpspreadsheet": "<1.8", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "pimcore/pimcore": "<6.3", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/gamification": "<2.3.2", + "prestashop/ps_facetedsearch": "<3.4.1", + "privatebin/privatebin": "<1.2.2|>=1.3,<1.3.2", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "rainlab/debugbar-plugin": "<3.1", + "robrichards/xmlseclibs": "<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/admin": ">=1.0.3,<1.0.4|>=1.1,<1.1.1", + "silverstripe/assets": ">=1,<1.4.7|>=1.5,<1.5.2", + "silverstripe/cms": "<4.3.6|>=4.4,<4.4.4", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.4.7|>=4.5,<4.5.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2|>=3.2,<3.2.4", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/subsites": ">=2,<2.1.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplito/elliptic-php": "<1.0.6", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<0.29.2", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.49", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/resource-bundle": "<1.3.13|>=1.4,<1.4.6|>=1.5,<1.5.1|>=1.6,<1.6.3", + "sylius/sylius": "<1.3.16|>=1.4,<1.4.12|>=1.5,<1.5.9|>=1.6,<1.6.5", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3g/svg-sanitizer": "<1.0.3", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", + "typo3/cms-core": ">=8,<8.7.30|>=9,<9.5.17|>=10,<10.4.2", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yourls/yourls": "<1.7.4", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "time": "2020-07-16T05:17:29+00:00", + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ] + } +] diff --git a/vendor/donatj/phpuseragentparser/.editorconfig b/vendor/donatj/phpuseragentparser/.editorconfig new file mode 100644 index 0000000..276f6d3 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.editorconfig @@ -0,0 +1,4 @@ +[*.php] +charset = utf-8 +indent_style = tab +indent_size = 4 diff --git a/vendor/donatj/phpuseragentparser/.github/FUNDING.yml b/vendor/donatj/phpuseragentparser/.github/FUNDING.yml new file mode 100644 index 0000000..3120558 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.github/FUNDING.yml @@ -0,0 +1,2 @@ +custom: https://www.paypal.me/donatj/15 +github: donatj diff --git a/vendor/donatj/phpuseragentparser/.github/workflows/ci.yml b/vendor/donatj/phpuseragentparser/.github/workflows/ci.yml new file mode 100644 index 0000000..315a4dc --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +on: + - pull_request + - push + +name: CI + +jobs: + run: + name: Tests + + strategy: + matrix: + operating-system: [ubuntu-latest] + php-versions: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4'] + + runs-on: ${{ matrix.operating-system }} + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: sockets, json, curl + + - name: Install dependencies with composer + run: composer install + + - name: Run tests + run: make test diff --git a/vendor/donatj/phpuseragentparser/.gitignore b/vendor/donatj/phpuseragentparser/.gitignore new file mode 100644 index 0000000..d426ba8 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.gitignore @@ -0,0 +1,5 @@ +.idea +vendor/ +composer.lock +coverage.xml +phpunit.xml diff --git a/vendor/donatj/phpuseragentparser/.helpers/constants.php b/vendor/donatj/phpuseragentparser/.helpers/constants.php new file mode 100644 index 0000000..dc750a9 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.helpers/constants.php @@ -0,0 +1,15 @@ +getName()}`\n\n"; + +echo "| Constant | {$argv[2]} | \n|----------|----------| \n"; + +foreach( $class->getConstants() as $constant => $value ) { + echo "| `{$class->getShortName()}::{$constant}` | {$value} | \n"; +} + +echo "\n"; \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/.mddoc.xml b/vendor/donatj/phpuseragentparser/.mddoc.xml new file mode 100644 index 0000000..d7d610e --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.mddoc.xml @@ -0,0 +1,108 @@ + + +
+ + + + + + +
+ +
+
+ +
+
+ +
+
+ + +
+ +
+
+ +
+
+
+ +
+
+ PHP User Agent is available through Packagist via Composer. + +
+
+ '[Detected Platform]', + 'browser' => '[Detected Browser]', + 'version' => '[Detected Browser Version]', +); +*/ +``` +]]> + parse(); +// or +$ua = $parser(); + +$ua->platform(); +$ua->browser(); +$ua->browserVersion(); +``` +]]> +
+
+ +
+
+ +
+ +
+
+
diff --git a/vendor/donatj/phpuseragentparser/.travis.yml b/vendor/donatj/phpuseragentparser/.travis.yml new file mode 100644 index 0000000..79c1f59 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/.travis.yml @@ -0,0 +1,23 @@ +language: php +sudo: false +dist: precise + +php: + - "5.3" + - "5.4" + - "5.5" + - "5.6" + - "7.0" + - "7.1" + - "7.2" + - "7.3" + - "nightly" + - "hhvm" + +matrix: + allow_failures: + - php: nightly + - php: hhvm + +install: composer install +script: make test diff --git a/vendor/donatj/phpuseragentparser/CONTRIBUTING.md b/vendor/donatj/phpuseragentparser/CONTRIBUTING.md new file mode 100644 index 0000000..27a5cc3 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# How to Contribute + +## Reporting Issues + +Issues can be reported via the [Github Issues](https://github.com/donatj/PhpUserAgent/issues) page. + +- **Detail is key**: If a browser is being misidentified, one or more sample user agent strings are key to getting it resolved. +- **Missing Browser**: Is it modern? What is it being misidentified as? There are a lot of dead browsers out there that there is no reason to support. + +Please do not file any requests for OS version identification. It is not a desired feature. + +## Pull Requests + +Pull requests are truly appreciated. While I try my best to stay on top of browsers hitting the market it is still a difficult task. + +- **Formatting**: Indentation **must** use tabs. Please try to match internal formatting and spacing to existing code. +- **Tests**: If you're adding support for a new browser be sure to add test user agents for if at all possible ***every platform*** the browser is available on. Untested code will take much longer to be merged. +- **Terseness**: Try to be terse. Be clever. Take up as little space as possible. The point of this project initially was to be smaller than the other guys. diff --git a/vendor/donatj/phpuseragentparser/LICENSE.md b/vendor/donatj/phpuseragentparser/LICENSE.md new file mode 100644 index 0000000..305b699 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/LICENSE.md @@ -0,0 +1,22 @@ +The MIT License +=============== + +Copyright (c) 2013 Jesse G. Donat + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/Makefile b/vendor/donatj/phpuseragentparser/Makefile new file mode 100644 index 0000000..9281366 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/Makefile @@ -0,0 +1,13 @@ +.PHONY: test +test: + ./vendor/bin/phpunit --coverage-text + +.PHONY: generate +generate: + php bin/user_agent_sorter.php > tests/user_agents.tmp.json && mv tests/user_agents.tmp.json tests/user_agents.json + php bin/constant_generator.php + +.PHONY: init +init: + php bin/init_user_agent.php > tests/user_agents.tmp.json && mv tests/user_agents.tmp.json tests/user_agents.json + make generate \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/README.md b/vendor/donatj/phpuseragentparser/README.md new file mode 100644 index 0000000..d2e5fe1 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/README.md @@ -0,0 +1,180 @@ +# PHP User Agent Parser + +[![Join the chat at https://gitter.im/PhpUserAgentParser/Lobby](https://badges.gitter.im/PhpUserAgentParser/Lobby.svg)](https://gitter.im/PhpUserAgentParser/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + + +[![Latest Stable Version](https://poser.pugx.org/donatj/phpuseragentparser/version)](https://packagist.org/packages/donatj/phpuseragentparser) +[![Total Downloads](https://poser.pugx.org/donatj/phpuseragentparser/downloads)](https://packagist.org/packages/donatj/phpuseragentparser) +[![License](https://poser.pugx.org/donatj/phpuseragentparser/license)](https://packagist.org/packages/donatj/phpuseragentparser) +[![Build Status](https://travis-ci.org/donatj/phpUserAgent.svg?branch=master)](https://travis-ci.org/donatj/phpUserAgent) +[![Build Status](https://github.com/donatj/phpUserAgent/workflows/CI/badge.svg?)](https://github.com/donatj/phpUserAgent/actions?query=workflow%3ACI) + + +## What It Is + +A simple, streamlined PHP user-agent parser! + +Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php + +## Upgrading to `1.*` + +The new `1.*` release **does not break compatibility** with `0.*` and nothing need to change to upgrade. However, the global `parse_user_agent` is now deprecated; it has been replaced with the namespaced `\donatj\UserAgent\parse_user_agent` and functions exactly the same. You can easily replace any existing call to `parse_user_agent` with `\donatj\UserAgent\parse_user_agent` + +In addition, 1.x adds a convenience object wrapper you may use should you prefer. More information on this is in the Usage section below. + +## Why Use This + +You have your choice in user-agent parsers. This one detects **all modern browsers** in a very light, quick, understandable fashion. +It is less than 200 lines of code, and consists of just three regular expressions! +It can also correctly identify exotic versions of IE others fail on. + +It offers 100% unit test coverage, is installable via Composer, and is very easy to use. + +## What It Does Not Do + +This is not meant as a browser "knowledge engine" but rather a simple parser. Anything not adequately provided directly by the user agent string itself will simply not be provided by this. + + +### OS Versions + +User-agent strings **are not** a reliable source of OS Version! + +- Many agents simply don't send the information. +- Others provide varying levels of accuracy. +- Parsing Windows versions alone almost nearly doubles the size of the code. + +I'm much more interested in keeping this thing *tiny* and accurate than adding niché features and would rather focus on things that can be **done well**. + +All that said, there is the start of a [branch to do it](https://github.com/donatj/PhpUserAgent/tree/os_version_detection) I created for a client if you want to poke it, I update it from time to time, but frankly if you need to *reliably detect OS Version*, using user-agent isn't the way to do it. I'd go with JavaScript. + +### Undetectable Browsers + +- **Brave** - Brave is simply not differentiable from Chrome. This was a design decision on their part. + +## Requirements + +- **php**: >=5.3.0 + +## Installing + +PHP User Agent is available through Packagist via Composer. + +Install the latest version with: + +```bash +composer require 'donatj/phpuseragentparser' +``` + +## Usage + +The classic procedural use is as simple as: + +```php +$ua_info = parse_user_agent(); +/* +array( + 'platform' => '[Detected Platform]', + 'browser' => '[Detected Browser]', + 'version' => '[Detected Browser Version]', +); +*/ +``` + + +The new object oriented wrapper form: + +```php +$parser = new UserAgentParser(); + +$ua = $parser->parse(); +// or +$ua = $parser(); + +$ua->platform(); +$ua->browser(); +$ua->browserVersion(); +``` + +## Currently Detected Platforms + +Predefined helper constants from `donatj\UserAgent\Platforms` + +| Constant | Platform | +|----------|----------| +| `Platforms::MACINTOSH` | Macintosh | +| `Platforms::CHROME_OS` | Chrome OS | +| `Platforms::LINUX` | Linux | +| `Platforms::WINDOWS` | Windows | +| `Platforms::ANDROID` | Android | +| `Platforms::BLACKBERRY` | BlackBerry | +| `Platforms::FREEBSD` | FreeBSD | +| `Platforms::IPAD` | iPad | +| `Platforms::IPHONE` | iPhone | +| `Platforms::IPOD` | iPod | +| `Platforms::KINDLE` | Kindle | +| `Platforms::KINDLE_FIRE` | Kindle Fire | +| `Platforms::NETBSD` | NetBSD | +| `Platforms::NEW_NINTENDO_3DS` | New Nintendo 3DS | +| `Platforms::NINTENDO_3DS` | Nintendo 3DS | +| `Platforms::NINTENDO_DS` | Nintendo DS | +| `Platforms::NINTENDO_SWITCH` | Nintendo Switch | +| `Platforms::NINTENDO_WII` | Nintendo Wii | +| `Platforms::NINTENDO_WIIU` | Nintendo WiiU | +| `Platforms::OPENBSD` | OpenBSD | +| `Platforms::PLAYBOOK` | PlayBook | +| `Platforms::PLAYSTATION_3` | PlayStation 3 | +| `Platforms::PLAYSTATION_4` | PlayStation 4 | +| `Platforms::PLAYSTATION_VITA` | PlayStation Vita | +| `Platforms::TIZEN` | Tizen | +| `Platforms::WINDOWS_PHONE` | Windows Phone | +| `Platforms::XBOX` | Xbox | +| `Platforms::XBOX_ONE` | Xbox One | + +## Currently Detected Browsers + +Predefined helper constants from `donatj\UserAgent\Browsers` + +| Constant | Browser | +|----------|----------| +| `Browsers::ADSBOT_GOOGLE` | AdsBot-Google | +| `Browsers::ANDROID_BROWSER` | Android Browser | +| `Browsers::BAIDUSPIDER` | Baiduspider | +| `Browsers::BINGBOT` | bingbot | +| `Browsers::BLACKBERRY_BROWSER` | BlackBerry Browser | +| `Browsers::BROWSER` | Browser | +| `Browsers::BUNJALLOO` | Bunjalloo | +| `Browsers::CAMINO` | Camino | +| `Browsers::CHROME` | Chrome | +| `Browsers::CURL` | curl | +| `Browsers::EDGE` | Edge | +| `Browsers::FACEBOOKEXTERNALHIT` | facebookexternalhit | +| `Browsers::FEEDVALIDATOR` | FeedValidator | +| `Browsers::FIREFOX` | Firefox | +| `Browsers::GOOGLEBOT` | Googlebot | +| `Browsers::GOOGLEBOT_IMAGE` | Googlebot-Image | +| `Browsers::GOOGLEBOT_VIDEO` | Googlebot-Video | +| `Browsers::HEADLESSCHROME` | HeadlessChrome | +| `Browsers::IEMOBILE` | IEMobile | +| `Browsers::KINDLE` | Kindle | +| `Browsers::LYNX` | Lynx | +| `Browsers::MIDORI` | Midori | +| `Browsers::MSIE` | MSIE | +| `Browsers::MSNBOT_MEDIA` | msnbot-media | +| `Browsers::NETFRONT` | NetFront | +| `Browsers::NINTENDOBROWSER` | NintendoBrowser | +| `Browsers::OCULUSBROWSER` | OculusBrowser | +| `Browsers::OPERA` | Opera | +| `Browsers::PUFFIN` | Puffin | +| `Browsers::SAFARI` | Safari | +| `Browsers::SAMSUNGBROWSER` | SamsungBrowser | +| `Browsers::SILK` | Silk | +| `Browsers::TIZENBROWSER` | TizenBrowser | +| `Browsers::UC_BROWSER` | UC Browser | +| `Browsers::VALVE_STEAM_TENFOOT` | Valve Steam Tenfoot | +| `Browsers::VIVALDI` | Vivaldi | +| `Browsers::WGET` | Wget | +| `Browsers::WORDPRESS` | WordPress | +| `Browsers::YANDEX` | Yandex | +| `Browsers::YANDEXBOT` | YandexBot | + +More information is available at [Donat Studios](http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT). \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/bin/benchmark.php b/vendor/donatj/phpuseragentparser/bin/benchmark.php new file mode 100644 index 0000000..a47ea30 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/bin/benchmark.php @@ -0,0 +1,24 @@ + $junk ) { + $uatime = microtime(true); + for( $i = 0; $i <= 1000; $i++ ) { + \parse_user_agent($ua); + } + + + echo microtime(true) - $uatime; + echo " : $ua\n"; +} + + +echo microtime(true) - $time; +echo " : TOTAL\n"; + diff --git a/vendor/donatj/phpuseragentparser/bin/constant_generator.php b/vendor/donatj/phpuseragentparser/bin/constant_generator.php new file mode 100644 index 0000000..34c2540 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/bin/constant_generator.php @@ -0,0 +1,77 @@ + $val ) { + $kex = strtoupper($val['browser']); + if( $kex !== '' ) { + $kex = preg_replace('/\W+/', '_', $kex); + if( !isset($browsers[$kex][$val['browser']]) ) { + $browsers[$kex][$val['browser']] = 0; + } + + $browsers[$kex][$val['browser']]++; + } + + $kex = strtoupper($val['platform']); + if( $kex !== '' ) { + $kex = preg_replace('/\W+/', '_', $kex); + + if( !isset($platforms[$kex][$val['platform']]) ) { + $platforms[$kex][$val['platform']] = 0; + } + + $platforms[$kex][$val['platform']]++; + } +} + +ksort($browsers); +$file = basename(__FILE__); +$header = << $val ) { + $browserBody .= sprintf("\tconst %-{$maxKey}s = %s;\n", $const, var_export(key($val), true)); +} +$browserBody .= "\n}\n\n"; + +foreach( $platforms as $platform ) { + if( count($platform) !== 1 ) { + echo "bad platform count\n"; + die(2); + } +} + +$platformBody = "{$header}namespace donatj\UserAgent;\n\ninterface Platforms {\n\n"; +$maxKey = max(array_map('strlen', array_keys($platforms))); +foreach( $platforms as $const => $val ) { + $platformBody .= sprintf("\tconst %-{$maxKey}s = %s;\n", $const, var_export(key($val), true)); +} +$platformBody .= "\n}\n\n"; + +file_put_contents(__DIR__ . '/../src/UserAgent/Browsers.php', $browserBody); +file_put_contents(__DIR__ . '/../src/UserAgent/Platforms.php', $platformBody); \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/bin/init_user_agent.php b/vendor/donatj/phpuseragentparser/bin/init_user_agent.php new file mode 100644 index 0000000..80598c0 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/bin/init_user_agent.php @@ -0,0 +1,13 @@ + &$val ) { + $val = parse_user_agent($key); +} + +echo json_encode($uas); diff --git a/vendor/donatj/phpuseragentparser/bin/user_agent_sorter.php b/vendor/donatj/phpuseragentparser/bin/user_agent_sorter.php new file mode 100644 index 0000000..07c6fb8 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/bin/user_agent_sorter.php @@ -0,0 +1,100 @@ + &$val ) { + $val['key'] = $key; +} +unset($val); + +uasort($uas, function ( $a, $b ) { + + if( $a['platform'] === null && $b['platform'] !== null ) { + return 1; + } + if( $b['platform'] === null && $a['platform'] !== null ) { + return -1; + } + + $desktop = array( 'Windows', 'Linux', 'Macintosh', 'Chrome OS' ); + + $ad = in_array($a['platform'], $desktop, true); + $bd = in_array($b['platform'], $desktop, true); + + if( !$ad && $bd ) { + return 1; + } + + if( $ad && !$bd ) { + return -1; + } + + if( $ad ) { + $result = strnatcasecmp($a['browser'], $b['browser']); + if( $result == 0 ) { + + $result = strnatcasecmp($a['platform'], $b['platform']); + + if( $result == 0 ) { + $result = compare_version($a['version'], $b['version']); + } + } + } else { + $result = strnatcasecmp($a['platform'], $b['platform']); + if( $result == 0 ) { + + $result = strnatcasecmp($a['browser'], $b['browser']); + + if( $result == 0 ) { + $result = compare_version($a['version'], $b['version']); + } + } + } + + if( $result == 0 ) { + $result = strnatcasecmp($a['key'], $b['key']); + } + + return $result; +}); + +foreach( $uas as &$val ) { + unset($val['key']); +} +unset($val); + +$jsonPretty = new Camspiers\JsonPretty\JsonPretty; + +$json = $jsonPretty->prettify($uas) . "\n"; +echo $json; + + +function compare_version( $a, $b ) { + $cmp_a = explode('.', $a); + $cmp_b = explode('.', $b); + + $max = max(count($cmp_a), count($cmp_b)); + + $value = 0; + + for( $i = 0; $i < $max; $i++ ) { + $aa = strtolower(isset($cmp_a[$i]) ? $cmp_a[$i] : '0'); + $bb = strtolower(isset($cmp_b[$i]) ? $cmp_b[$i] : '0'); + + if( is_numeric($aa) && is_numeric($bb) && $aa !== $bb ) { + $value = ($aa > $bb ? 1 : -1); + break; + } + + if( $cmp = strcmp($aa, $bb) ) { + $value = $cmp / abs($cmp); + break; + } + } + + return $value; +} \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/composer.json b/vendor/donatj/phpuseragentparser/composer.json new file mode 100644 index 0000000..3a4246a --- /dev/null +++ b/vendor/donatj/phpuseragentparser/composer.json @@ -0,0 +1,38 @@ +{ + "name": "donatj/phpuseragentparser", + "type": "library", + "description": "Lightning fast, minimalist PHP UserAgent string parser.", + "keywords": [ + "user agent", + "useragent", + "parser", + "browser", + "browser detection" + ], + "homepage": "http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT", + "license": "MIT", + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "camspiers/json-pretty": "~1.0", + "phpunit/phpunit": "~4.8", + "donatj/drop": "*" + }, + "authors": [ + { + "name": "Jesse G. Donat", + "email": "donatj@gmail.com", + "homepage": "https://donatstudios.com", + "role": "Developer" + } + ], + "autoload": { + "files": [ + "src/UserAgentParser.php" + ], + "psr-4": { + "donatj\\UserAgent\\": "src/UserAgent" + } + } +} diff --git a/vendor/donatj/phpuseragentparser/phpunit.xml.dist b/vendor/donatj/phpuseragentparser/phpunit.xml.dist new file mode 100644 index 0000000..6cb6e97 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/phpunit.xml.dist @@ -0,0 +1,11 @@ + + + + tests + + + + + + + diff --git a/vendor/donatj/phpuseragentparser/src/UserAgent/Browsers.php b/vendor/donatj/phpuseragentparser/src/UserAgent/Browsers.php new file mode 100644 index 0000000..99e3ca0 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/src/UserAgent/Browsers.php @@ -0,0 +1,51 @@ +platform = $platform; + $this->browser = $browser; + $this->browserVersion = $browserVersion; + } + + /** + * @return string|null + * @see \donatj\UserAgent\Platforms for a list of tested platforms + */ + public function platform() { + return $this->platform; + } + + /** + * @return string|null + * @see \donatj\UserAgent\Browsers for a list of tested browsers. + */ + public function browser() { + return $this->browser; + } + + /** + * The version string. Formatting depends on the browser. + * + * @return string|null + */ + public function browserVersion() { + return $this->browserVersion; + } +} diff --git a/vendor/donatj/phpuseragentparser/src/UserAgent/UserAgentInterface.php b/vendor/donatj/phpuseragentparser/src/UserAgent/UserAgentInterface.php new file mode 100644 index 0000000..645d62b --- /dev/null +++ b/vendor/donatj/phpuseragentparser/src/UserAgent/UserAgentInterface.php @@ -0,0 +1,25 @@ +parse($u_agent); + } + +} diff --git a/vendor/donatj/phpuseragentparser/src/UserAgentParser.php b/vendor/donatj/phpuseragentparser/src/UserAgentParser.php new file mode 100644 index 0000000..ee5bc6f --- /dev/null +++ b/vendor/donatj/phpuseragentparser/src/UserAgentParser.php @@ -0,0 +1,210 @@ + + * + * @link https://donatstudios.com/PHP-Parser-HTTP_USER_AGENT + * @link https://github.com/donatj/PhpUserAgent + * + * @license MIT https://github.com/donatj/PhpUserAgent/blob/master/LICENSE.md + */ + +namespace { + + /** + * Parses a user agent string into its important parts + * + * This method is defined for backwards comparability with the old global method. + * + * @param string|null $u_agent User agent string to parse or null. Uses $_SERVER['HTTP_USER_AGENT'] on NULL + * @return string[] an array with 'browser', 'version' and 'platform' keys + * @throws \InvalidArgumentException on not having a proper user agent to parse. + * + * @deprecated This exists for backwards compatibility with 0.x and will likely be removed in 2.x + * @see \donatj\UserAgent\parse_user_agent + */ + function parse_user_agent( $u_agent = null ) { + return \donatj\UserAgent\parse_user_agent($u_agent); + } +} + +namespace donatj\UserAgent { + + const PLATFORM = 'platform'; + const BROWSER = 'browser'; + const BROWSER_VERSION = 'version'; + + /** + * Parses a user agent string into its important parts + * + * @param string|null $u_agent User agent string to parse or null. Uses $_SERVER['HTTP_USER_AGENT'] on NULL + * @return string[] an array with 'browser', 'version' and 'platform' keys + * @throws \InvalidArgumentException on not having a proper user agent to parse. + */ + function parse_user_agent( $u_agent = null ) { + if( $u_agent === null && isset($_SERVER['HTTP_USER_AGENT']) ) { + $u_agent = (string)$_SERVER['HTTP_USER_AGENT']; + } + + if( $u_agent === null ) { + throw new \InvalidArgumentException('parse_user_agent requires a user agent'); + } + + $platform = null; + $browser = null; + $version = null; + + $empty = array( PLATFORM => $platform, BROWSER => $browser, BROWSER_VERSION => $version ); + + if( !$u_agent ) { + return $empty; + } + + if( preg_match('/\((.*?)\)/m', $u_agent, $parent_matches) ) { + preg_match_all(<<<'REGEX' +/(?PBB\d+;|Android|CrOS|Tizen|iPhone|iPad|iPod|Linux|(Open|Net|Free)BSD|Macintosh|Windows(\ Phone)?|Silk|linux-gnu|BlackBerry|PlayBook|X11|(New\ )?Nintendo\ (WiiU?|3?DS|Switch)|Xbox(\ One)?) +(?:\ [^;]*)? +(?:;|$)/imx +REGEX + , $parent_matches[1], $result); + + $priority = array( 'Xbox One', 'Xbox', 'Windows Phone', 'Tizen', 'Android', 'FreeBSD', 'NetBSD', 'OpenBSD', 'CrOS', 'X11' ); + + $result[PLATFORM] = array_unique($result[PLATFORM]); + if( count($result[PLATFORM]) > 1 ) { + if( $keys = array_intersect($priority, $result[PLATFORM]) ) { + $platform = reset($keys); + } else { + $platform = $result[PLATFORM][0]; + } + } elseif( isset($result[PLATFORM][0]) ) { + $platform = $result[PLATFORM][0]; + } + } + + if( $platform == 'linux-gnu' || $platform == 'X11' ) { + $platform = 'Linux'; + } elseif( $platform == 'CrOS' ) { + $platform = 'Chrome OS'; + } + + preg_match_all(<<<'REGEX' +%(?PCamino|Kindle(\ Fire)?|Firefox|Iceweasel|IceCat|Safari|MSIE|Trident|AppleWebKit| +TizenBrowser|(?:Headless)?Chrome|YaBrowser|Vivaldi|IEMobile|Opera|OPR|Silk|Midori|Edge|Edg|CriOS|UCBrowser|Puffin|OculusBrowser|SamsungBrowser| +Baiduspider|Googlebot|YandexBot|bingbot|Lynx|Version|Wget|curl| +Valve\ Steam\ Tenfoot| +NintendoBrowser|PLAYSTATION\ (\d|Vita)+) +(?:\)?;?) +(?:(?:[:/ ])(?P[0-9A-Z.]+)|/(?:[A-Z]*))%ix +REGEX + , $u_agent, $result); + + // If nothing matched, return null (to avoid undefined index errors) + if( !isset($result[BROWSER][0]) || !isset($result[BROWSER_VERSION][0]) ) { + if( preg_match('%^(?!Mozilla)(?P[A-Z0-9\-]+)(/(?P[0-9A-Z.]+))?%ix', $u_agent, $result) ) { + return array( PLATFORM => $platform ?: null, BROWSER => $result[BROWSER], BROWSER_VERSION => empty($result[BROWSER_VERSION]) ? null : $result[BROWSER_VERSION] ); + } + + return $empty; + } + + if( preg_match('/rv:(?P[0-9A-Z.]+)/i', $u_agent, $rv_result) ) { + $rv_result = $rv_result[BROWSER_VERSION]; + } + + $browser = $result[BROWSER][0]; + $version = $result[BROWSER_VERSION][0]; + + $lowerBrowser = array_map('strtolower', $result[BROWSER]); + + $find = function ( $search, &$key = null, &$value = null ) use ( $lowerBrowser ) { + $search = (array)$search; + + foreach( $search as $val ) { + $xkey = array_search(strtolower($val), $lowerBrowser); + if( $xkey !== false ) { + $value = $val; + $key = $xkey; + + return true; + } + } + + return false; + }; + + $findT = function ( array $search, &$key = null, &$value = null ) use ( $find ) { + $value2 = null; + if( $find(array_keys($search), $key, $value2) ) { + $value = $search[$value2]; + + return true; + } + + return false; + }; + + $key = 0; + $val = ''; + if( $findT(array( 'OPR' => 'Opera', 'UCBrowser' => 'UC Browser', 'YaBrowser' => 'Yandex', 'Iceweasel' => 'Firefox', 'Icecat' => 'Firefox', 'CriOS' => 'Chrome', 'Edg' => 'Edge' ), $key, $browser) ) { + $version = $result[BROWSER_VERSION][$key]; + } elseif( $find('Playstation Vita', $key, $platform) ) { + $platform = 'PlayStation Vita'; + $browser = 'Browser'; + } elseif( $find(array( 'Kindle Fire', 'Silk' ), $key, $val) ) { + $browser = $val == 'Silk' ? 'Silk' : 'Kindle'; + $platform = 'Kindle Fire'; + if( !($version = $result[BROWSER_VERSION][$key]) || !is_numeric($version[0]) ) { + $version = $result[BROWSER_VERSION][array_search('Version', $result[BROWSER])]; + } + } elseif( $find('NintendoBrowser', $key) || $platform == 'Nintendo 3DS' ) { + $browser = 'NintendoBrowser'; + $version = $result[BROWSER_VERSION][$key]; + } elseif( $find('Kindle', $key, $platform) ) { + $browser = $result[BROWSER][$key]; + $version = $result[BROWSER_VERSION][$key]; + } elseif( $find('Opera', $key, $browser) ) { + $find('Version', $key); + $version = $result[BROWSER_VERSION][$key]; + } elseif( $find('Puffin', $key, $browser) ) { + $version = $result[BROWSER_VERSION][$key]; + if( strlen($version) > 3 ) { + $part = substr($version, -2); + if( ctype_upper($part) ) { + $version = substr($version, 0, -2); + + $flags = array( 'IP' => 'iPhone', 'IT' => 'iPad', 'AP' => 'Android', 'AT' => 'Android', 'WP' => 'Windows Phone', 'WT' => 'Windows' ); + if( isset($flags[$part]) ) { + $platform = $flags[$part]; + } + } + } + } elseif( $find(array( 'IEMobile', 'Edge', 'Midori', 'Vivaldi', 'OculusBrowser', 'SamsungBrowser', 'Valve Steam Tenfoot', 'Chrome', 'HeadlessChrome' ), $key, $browser) ) { + $version = $result[BROWSER_VERSION][$key]; + } elseif( $rv_result && $find('Trident') ) { + $browser = 'MSIE'; + $version = $rv_result; + } elseif( $browser == 'AppleWebKit' ) { + if( $platform == 'Android' ) { + $browser = 'Android Browser'; + } elseif( strpos($platform, 'BB') === 0 ) { + $browser = 'BlackBerry Browser'; + $platform = 'BlackBerry'; + } elseif( $platform == 'BlackBerry' || $platform == 'PlayBook' ) { + $browser = 'BlackBerry Browser'; + } else { + $find('Safari', $key, $browser) || $find('TizenBrowser', $key, $browser); + } + + $find('Version', $key); + $version = $result[BROWSER_VERSION][$key]; + } elseif( $pKey = preg_grep('/playstation \d/i', $result[BROWSER]) ) { + $pKey = reset($pKey); + + $platform = 'PlayStation ' . preg_replace('/\D/', '', $pKey); + $browser = 'NetFront'; + } + + return array( PLATFORM => $platform ?: null, BROWSER => $browser ?: null, BROWSER_VERSION => $version ?: null ); + } +} diff --git a/vendor/donatj/phpuseragentparser/tests/UserAgentParserFunctionTest.php b/vendor/donatj/phpuseragentparser/tests/UserAgentParserFunctionTest.php new file mode 100644 index 0000000..7bb5b34 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/tests/UserAgentParserFunctionTest.php @@ -0,0 +1,50 @@ +assertSame($expected, $result, $string . " test failed!"); + } + + public function userAgentDataProvider() { + $out = array(); + $uas = json_decode(file_get_contents(__DIR__ . '/user_agents.json'), true); + foreach( $uas as $string => $parts ) { + $out[] = array( $string, $parts ); + } + + return $out; + } + + public function test_parse_user_agent_empty() { + $expected = array( + 'platform' => null, + 'browser' => null, + 'version' => null, + ); + + $result = parse_user_agent(''); + $this->assertSame($result, $expected); + + $result = parse_user_agent('Mozilla (asdjkakljasdkljasdlkj) BlahBlah'); + $this->assertSame($result, $expected); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function test_no_user_agent_exception() { + unset($_SERVER['HTTP_USER_AGENT']); + parse_user_agent(); + } + + public function test_global_user_agent() { + $_SERVER['HTTP_USER_AGENT'] = 'Test/1.0'; + $this->assertSame(array( 'platform' => null, 'browser' => 'Test', 'version' => '1.0' ), parse_user_agent()); + } + +} diff --git a/vendor/donatj/phpuseragentparser/tests/UserAgentParserObjectTest.php b/vendor/donatj/phpuseragentparser/tests/UserAgentParserObjectTest.php new file mode 100644 index 0000000..be4190f --- /dev/null +++ b/vendor/donatj/phpuseragentparser/tests/UserAgentParserObjectTest.php @@ -0,0 +1,45 @@ + $parts ) { + $out[] = array( $string ); + } + + return $out; + } + + /** + * @dataProvider userAgentDataProvider + */ + public function test_parse( $string ) { + $parser = new UserAgentParser; + $result = $parser->parse($string); + + $expected = parse_user_agent($string); + + $this->assertSame($expected[\donatj\UserAgent\PLATFORM], $result->platform()); + $this->assertSame($expected[\donatj\UserAgent\BROWSER], $result->browser()); + $this->assertSame($expected[\donatj\UserAgent\BROWSER_VERSION], $result->browserVersion()); + } + + /** + * @dataProvider userAgentDataProvider + */ + public function test_invoke( $string ) { + $parser = new UserAgentParser; + $result = $parser($string); + + $expected = parse_user_agent($string); + + $this->assertSame($expected[\donatj\UserAgent\PLATFORM], $result->platform()); + $this->assertSame($expected[\donatj\UserAgent\BROWSER], $result->browser()); + $this->assertSame($expected[\donatj\UserAgent\BROWSER_VERSION], $result->browserVersion()); + } + +} diff --git a/vendor/donatj/phpuseragentparser/tests/user_agents.json b/vendor/donatj/phpuseragentparser/tests/user_agents.json new file mode 100644 index 0000000..15973e2 --- /dev/null +++ b/vendor/donatj/phpuseragentparser/tests/user_agents.json @@ -0,0 +1,1027 @@ +{ + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.11) Gecko\/20071128 Camino\/1.5.4": { + "platform": "Macintosh", + "browser": "Camino", + "version": "1.5.4" + }, + "Mozilla\/5.0 (Macintosh; U; PPC Mac OS X Mach-O; it; rv:1.8.1.21) Gecko\/20090327 Camino\/1.6.7 (MultiLang) (like Firefox\/2.0.0.21pre)": { + "platform": "Macintosh", + "browser": "Camino", + "version": "1.6.7" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10.6; en; rv:1.9.0.18) Gecko\/2010021619 Camino\/2.0.2 (like Firefox\/3.0.18)": { + "platform": "Macintosh", + "browser": "Camino", + "version": "2.0.2" + }, + "Mozilla\/5.0 (Macintosh; U; PPC Mac OS X 10.5; it; rv:1.9.0.19) Gecko\/2010111021 Camino\/2.0.6 (MultiLang) (like Firefox\/3.0.19)": { + "platform": "Macintosh", + "browser": "Camino", + "version": "2.0.6" + }, + "Mozilla\/5.0 (Macintosh; U; PPC Mac OS X 10.5; de; rv:1.9.2.28) Gecko\/20120308 Camino\/2.1.2 (MultiLang) (like Firefox\/3.6.28)": { + "platform": "Macintosh", + "browser": "Camino", + "version": "2.1.2" + }, + "Mozilla\/5.0 (X11; U; CrOS i686 0.9.128; en-US) AppleWebKit\/534.10 (KHTML, like Gecko) Chrome\/8.0.552.339": { + "platform": "Chrome OS", + "browser": "Chrome", + "version": "8.0.552.339" + }, + "Mozilla\/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit\/536.11 (KHTML, like Gecko) Chrome\/20.0.1132.57 Safari\/536.11": { + "platform": "Chrome OS", + "browser": "Chrome", + "version": "20.0.1132.57" + }, + "Mozilla\/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.116 Safari\/537.36": { + "platform": "Chrome OS", + "browser": "Chrome", + "version": "27.0.1453.116" + }, + "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/535.19 (KHTML, like Gecko) Ubuntu\/12.04 Chromium\/18.0.1025.151 Chrome\/18.0.1025.151 Safari\/535.19": { + "platform": "Linux", + "browser": "Chrome", + "version": "18.0.1025.151" + }, + "Mozilla\/5.0 (X11; Linux i686) AppleWebKit\/536.11 (KHTML, like Gecko) Chrome\/20.0.1132.57 Safari\/536.11": { + "platform": "Linux", + "browser": "Chrome", + "version": "20.0.1132.57" + }, + "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.52 Safari\/537.36": { + "platform": "Linux", + "browser": "Chrome", + "version": "28.0.1500.52" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10_6_1; en-US) AppleWebKit\/532.0 (KHTML, like Gecko) Chrome\/4.0.209.0 Safari\/532.0": { + "platform": "Macintosh", + "browser": "Chrome", + "version": "4.0.209.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit\/535.1 (KHTML, like Gecko) Chrome\/14.0.813.0 Safari\/535.1": { + "platform": "Macintosh", + "browser": "Chrome", + "version": "14.0.813.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/27.0.1453.93 Safari\/537.36": { + "platform": "Macintosh", + "browser": "Chrome", + "version": "27.0.1453.93" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit\/534.7 (KHTML, like Gecko) Chrome\/7.0.517.41 Safari\/534.7": { + "platform": "Windows", + "browser": "Chrome", + "version": "7.0.517.41" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit\/534.13 (KHTML, like Gecko) Chrome\/9.0.597.98 Safari\/534.13": { + "platform": "Windows", + "browser": "Chrome", + "version": "9.0.597.98" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit\/534.16 (KHTML, like Gecko) Chrome\/10.0.648.114 Safari\/534.16": { + "platform": "Windows", + "browser": "Chrome", + "version": "10.0.648.114" + }, + "Mozilla\/5.0 (Windows NT 6.2; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.17 Safari\/537.36": { + "platform": "Windows", + "browser": "Chrome", + "version": "30.0.1599.17" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/79.0.3915.0 Safari\/537.36 Edg\/79.0.287.0": { + "platform": "Macintosh", + "browser": "Edge", + "version": "79.0.287.0" + }, + "Mozilla\/5.0 (Windows NT 6.4; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/36.0.1985.143 Safari\/537.36 Edge\/12.0": { + "platform": "Windows", + "browser": "Edge", + "version": "12.0" + }, + "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.135 Safari\/537.36 Edge\/12.10240": { + "platform": "Windows", + "browser": "Edge", + "version": "12.10240" + }, + "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/52.0.2743.116 Safari\/537.36 Edge\/15.15063": { + "platform": "Windows", + "browser": "Edge", + "version": "15.15063" + }, + "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/77.0.3865.90 Safari\/537.36 Edg\/44.18362.387.0": { + "platform": "Windows", + "browser": "Edge", + "version": "44.18362.387.0" + }, + "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/77.0.3865.19 Safari\/537.36 Edg\/77.0.235.9": { + "platform": "Windows", + "browser": "Edge", + "version": "77.0.235.9" + }, + "Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/79.0.3915.0 Safari\/537.36 Edg\/79.0.284.0": { + "platform": "Windows", + "browser": "Edge", + "version": "79.0.284.0" + }, + "Mozilla\/5.0 (X11; U; Linux i386; en-US; rv:1.7.5) Gecko\/20041109 Firefox\/1.0": { + "platform": "Linux", + "browser": "Firefox", + "version": "1.0" + }, + "Mozilla\/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko\/20061024 Iceweasel\/2.0 (Debian-2.0+dfsg-1)": { + "platform": "Linux", + "browser": "Firefox", + "version": "2.0" + }, + "Mozilla\/5.0 (X11; U; Linux sparc64; es-PY; rv:5.0) Gecko\/20100101 IceCat\/5.0 (like Firefox\/5.0; Debian-6.0.1)": { + "platform": "Linux", + "browser": "Firefox", + "version": "5.0" + }, + "Mozilla\/5.0 (X11; Linux i686; rv:7.0.1) Gecko\/20111106 IceCat\/7.0.1": { + "platform": "Linux", + "browser": "Firefox", + "version": "7.0.1" + }, + "Mozilla\/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko\/20100101 Firefox\/12.0": { + "platform": "Linux", + "browser": "Firefox", + "version": "12.0" + }, + "Mozilla\/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko\/20100101 Firefox\/14.0.1": { + "platform": "Linux", + "browser": "Firefox", + "version": "14.0.1" + }, + "Mozilla\/5.0 (X11; Linux x86_64; rv:17.0) Gecko\/20121201 icecat\/17.0.1": { + "platform": "Linux", + "browser": "Firefox", + "version": "17.0.1" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.3) Gecko\/20100401 Firefox\/3.6.3": { + "platform": "Macintosh", + "browser": "Firefox", + "version": "3.6.3" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.6; rv:11.0) Gecko\/20100101 Firefox\/11.0": { + "platform": "Macintosh", + "browser": "Firefox", + "version": "11.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko\/20100101 Firefox\/25.0": { + "platform": "Macintosh", + "browser": "Firefox", + "version": "25.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.13; rv:57.0) Gecko\/20100101 Firefox\/57.0": { + "platform": "Macintosh", + "browser": "Firefox", + "version": "57.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko\/20100101 Firefox\/70.0": { + "platform": "Macintosh", + "browser": "Firefox", + "version": "70.0" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.21022)": { + "platform": "Windows", + "browser": "Firefox", + "version": "3.5.5" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko\/20110303 Firefox\/3.6.15 FirePHP\/0.5": { + "platform": "Windows", + "browser": "Firefox", + "version": "3.6.15" + }, + "Mozilla\/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko\/20100101 Firefox\/25.0": { + "platform": "Windows", + "browser": "Firefox", + "version": "25.0" + }, + "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/64.0.3282.119 Safari\/537.36": { + "platform": "Linux", + "browser": "HeadlessChrome", + "version": "64.0.3282.119" + }, + "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/65.0.3312.0 Safari\/537.36": { + "platform": "Linux", + "browser": "HeadlessChrome", + "version": "65.0.3312.0" + }, + "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) HeadlessChrome\/69.0.3452.0 Safari\/537.36": { + "platform": "Linux", + "browser": "HeadlessChrome", + "version": "69.0.3452.0" + }, + "Mozilla\/5.0 (X11; U; Linux i686; de-DE; rv:1.8.1.9) Gecko\/20071103 Midori\/0.0.10": { + "platform": "Linux", + "browser": "Midori", + "version": "0.0.10" + }, + "Mozilla\/5.0 (X11; U; Linux i686; de) AppleWebKit\/523+ (KHTML like Gecko) midori\/0.1": { + "platform": "Linux", + "browser": "Midori", + "version": "0.1" + }, + "Midori\/0.3 (X11; Linux; U; en-us) WebKit\/531.2+": { + "platform": "Linux", + "browser": "Midori", + "version": "0.3" + }, + "Mozilla\/5.0 (X11; Linux) AppleWebKit\/537.6 (KHTML, like Gecko) Chrome\/18.0.1025.133 Safari\/537.6 Midori\/0.4": { + "platform": "Linux", + "browser": "Midori", + "version": "0.4" + }, + "Mozilla\/5.0 (X11; Linux; rv:2.0.1) Gecko\/20100101 Firefox\/4.0.1 Midori\/0.4": { + "platform": "Linux", + "browser": "Midori", + "version": "0.4" + }, + "Mozilla\/5.0 (X11; Linux) AppleWebKit\/535.22 (KHTML, like Gecko) Chrome\/18.0.1025.133 Safari\/535.22 Midori\/0.5": { + "platform": "Linux", + "browser": "Midori", + "version": "0.5" + }, + "Midori\/0.3 (Windows; Windows; U; en-en) WebKit\/532+ ": { + "platform": "Windows", + "browser": "Midori", + "version": "0.3" + }, + "Mozilla\/4.0 (compatible;MSIE 6.0;Windows 98;Q312461)": { + "platform": "Windows", + "browser": "MSIE", + "version": "6.0" + }, + "Mozilla\/4.0 (compatible; U; MSIE 6.0; Windows NT 5.1)": { + "platform": "Windows", + "browser": "MSIE", + "version": "6.0" + }, + "Mozilla\/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)": { + "platform": "Windows", + "browser": "MSIE", + "version": "6.0" + }, + "Mozilla\/4.0 (MSIE 6.0; Windows NT 5.0)": { + "platform": "Windows", + "browser": "MSIE", + "version": "6.0" + }, + "Mozilla\/4.0 (MSIE 6.0; Windows NT 5.1)": { + "platform": "Windows", + "browser": "MSIE", + "version": "6.0" + }, + "Mozilla\/4.0 (Windows; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)": { + "platform": "Windows", + "browser": "MSIE", + "version": "6.0" + }, + "Mozilla\/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)": { + "platform": "Windows", + "browser": "MSIE", + "version": "7.0" + }, + "Mozilla\/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident\/4.0; Mozilla\/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; Tablet PC 2.0)": { + "platform": "Windows", + "browser": "MSIE", + "version": "8.0" + }, + "Mozilla\/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident\/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)": { + "platform": "Windows", + "browser": "MSIE", + "version": "8.0" + }, + "Mozilla\/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident\/5.0)": { + "platform": "Windows", + "browser": "MSIE", + "version": "9.0" + }, + "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident\/6.0)": { + "platform": "Windows", + "browser": "MSIE", + "version": "10.0" + }, + "Mozilla\/5.0 (Windows NT 6.3; Trident\/7.0; rv:11.0) like Gecko": { + "platform": "Windows", + "browser": "MSIE", + "version": "11.0" + }, + "Mozilla\/5.0 (Windows NT 6.3; Win64, x64; Trident\/7.0; Touch; rv:11.0) like Gecko": { + "platform": "Windows", + "browser": "MSIE", + "version": "11.0" + }, + "Mozilla\/5.0 (Windows NT 6.3; WOW64; Trident\/7.0; Touch; rv:11.0) like Gecko": { + "platform": "Windows", + "browser": "MSIE", + "version": "11.0" + }, + "Mozilla\/5.0 (X11; Linux x86_64) AppleWebKit\/537.36 (KHTML, like Gecko) OculusBrowser\/5.5.10.137831012 SamsungBrowser\/4.0 Chrome\/66.0.3359.203 Safari\/537.36": { + "platform": "Linux", + "browser": "OculusBrowser", + "version": "5.5.10.137831012" + }, + "Opera\/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition MacAppStore; en) Presto\/2.10.229 Version\/11.61": { + "platform": "Macintosh", + "browser": "Opera", + "version": "11.61" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/28.0.1500.20 Safari\/537.36 OPR\/15.0.1147.18 (Edition Next)": { + "platform": "Macintosh", + "browser": "Opera", + "version": "15.0.1147.18" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/30.0.1599.66 Safari\/537.36 OPR\/17.0.1241.36 (Edition Next)": { + "platform": "Macintosh", + "browser": "Opera", + "version": "17.0.1241.36" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/79.0.3945.117 Safari\/537.36 OPR\/66.0.3515.36": { + "platform": "Macintosh", + "browser": "Opera", + "version": "66.0.3515.36" + }, + "Mozilla\/4.0 (compatible; MSIE 8.0; Windows NT 6.1; de) Opera 11.01": { + "platform": "Windows", + "browser": "Opera", + "version": "11.01" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko\/20101213 Opera\/9.80 (Windows NT 6.1; U; zh-tw) Presto\/2.7.62 Version\/11.01": { + "platform": "Windows", + "browser": "Opera", + "version": "11.01" + }, + "Mozilla\/5.0 (Windows NT 6.1; U; nl; rv:1.9.1.6) Gecko\/20091201 Firefox\/3.5.6 Opera 11.01": { + "platform": "Windows", + "browser": "Opera", + "version": "11.01" + }, + "Opera\/9.80 (Windows NT 5.1; U; cs) Presto\/2.7.62 Version\/11.01": { + "platform": "Windows", + "browser": "Opera", + "version": "11.01" + }, + "Opera\/9.80 (Windows NT 6.0; U; en) Presto\/2.8.99 Version\/11.10": { + "platform": "Windows", + "browser": "Opera", + "version": "11.10" + }, + "Mozilla\/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit\/531.22.7 (KHTML, like Gecko) Version\/4.0.5 Safari\/531.22.7": { + "platform": "Macintosh", + "browser": "Safari", + "version": "4.0.5" + }, + "Mozilla\/5.0 (Macintosh; U; PPC Mac OS X 10_4_11; en) AppleWebKit\/533.18.1 (KHTML, like Gecko) Version\/4.1.2 Safari\/533.18.5": { + "platform": "Macintosh", + "browser": "Safari", + "version": "4.1.2" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit\/533.16 (KHTML, like Gecko) Version\/5.0 Safari\/533.16": { + "platform": "Macintosh", + "browser": "Safari", + "version": "5.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit\/537.71 (KHTML, like Gecko) Version\/7.0 Safari\/537.71": { + "platform": "Macintosh", + "browser": "Safari", + "version": "7.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10) AppleWebKit\/600.1.25 (KHTML, like Gecko) Version\/8.0 Safari\/600.1.25": { + "platform": "Macintosh", + "browser": "Safari", + "version": "8.0" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/13.0.1 Safari\/605.1.15": { + "platform": "Macintosh", + "browser": "Safari", + "version": "13.0.1" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit\/533.20.25 (KHTML, like Gecko) Version\/5.0.4 Safari\/533.20.27": { + "platform": "Windows", + "browser": "Safari", + "version": "5.0.4" + }, + "Mozilla\/5.0 (X11; U; X11; en-US; Valve Steam Tenfoot\/1352503901; ) AppleWebKit\/535.15 (KHTML, like Gecko) Chrome\/18.0.989.0 Safari\/535.11": { + "platform": "Linux", + "browser": "Valve Steam Tenfoot", + "version": "1352503901" + }, + "Mozilla\/5.0 (Macintosh; U; MacOS X 10_11_3; en-US; Valve Steam Tenfoot\/1456366706; ) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/47.0.2526.80 Safari\/537.36": { + "platform": "Macintosh", + "browser": "Valve Steam Tenfoot", + "version": "1456366706" + }, + "Mozilla\/5.0 (Windows; U; Windows NT 6.2; en-US; Valve Steam Tenfoot\/1451690000; ) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/47.0.2526.49 Safari\/537.36": { + "platform": "Windows", + "browser": "Valve Steam Tenfoot", + "version": "1451690000" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10.6; en; rv:1.9.0.18) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Vivaldi\/1.0.83.38 Safari\/537.36": { + "platform": "Macintosh", + "browser": "Vivaldi", + "version": "1.0.83.38" + }, + "Mozilla\/5.0 (Windows NT 6.3; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/40.0.2214.89 Vivaldi\/1.0.83.38 Safari\/537.36": { + "platform": "Windows", + "browser": "Vivaldi", + "version": "1.0.83.38" + }, + "Wget\/1.12 (linux-gnu)": { + "platform": "Linux", + "browser": "Wget", + "version": "1.12" + }, + "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/68.0.3440.106 YaBrowser\/18.9.0.3363 Yowser\/2.5 Safari\/537.36": { + "platform": "Macintosh", + "browser": "Yandex", + "version": "18.9.0.3363" + }, + "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/52.0.2743.116 YaBrowser\/16.9.1.1131 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "16.9.1.1131" + }, + "Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/57.0.2987.137 YaBrowser\/17.4.1.919 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "17.4.1.919" + }, + "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/64.0.3282.186 YaBrowser\/18.3.1.1232 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.3.1.1232" + }, + "Mozilla\/5.0 (Windows NT 6.1) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/68.0.3440.106 YaBrowser\/18.9.1.954 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.9.1.954" + }, + "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/68.0.3440.106 YaBrowser\/18.9.1.954 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.9.1.954" + }, + "Mozilla\/5.0 (Windows NT 6.3; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/68.0.3440.106 YaBrowser\/18.9.1.954 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.9.1.954" + }, + "Mozilla\/5.0 (Windows NT 10.0; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/68.0.3440.106 YaBrowser\/18.9.1.954 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.9.1.954" + }, + "Mozilla\/5.0 (Windows NT 10.0; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/68.0.3440.106 YaBrowser\/18.9.1.1021 Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.9.1.1021" + }, + "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/69.0.3497.100 YaBrowser\/18.10.1.385 (beta) Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.10.1.385" + }, + "Mozilla\/5.0 (Windows NT 10.0; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/69.0.3497.100 YaBrowser\/18.10.1.385 (beta) Yowser\/2.5 Safari\/537.36": { + "platform": "Windows", + "browser": "Yandex", + "version": "18.10.1.385" + }, + "Mozilla\/5.0 (Linux; U; Android 2.2; en-us; SGH-T959 Build\/FROYO) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1": { + "platform": "Android", + "browser": "Android Browser", + "version": "4.0" + }, + "Mozilla\/5.0 (Linux; U; Android 3.2.1; hu-hu; Transformer TF101 Build\/HTK75) AppleWebKit\/534.13 (KHTML, like Gecko) Version\/4.0 Safari\/534.13": { + "platform": "Android", + "browser": "Android Browser", + "version": "4.0" + }, + "Mozilla\/5.0 (Linux; U; Android Itfunz2.1_Eclipse_Terminator_II_Final; zh-cn; Milestone Build\/SHOLS_U2_02.36.0) AppleWebKit\/530.17 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/530.17": { + "platform": "Android", + "browser": "Android Browser", + "version": "4.0" + }, + "Mozilla\/5.0 (Linux; Android 4.2.2; de-at; SAMSUNG GT-I9195\/I9195XXUAMF6 Build\/JDQ39) AppleWebKit\/535.19 (KHTML, like Gecko) Version\/1.0 Chrome\/18.0.1025.308 Mobile Safari\/535.19": { + "platform": "Android", + "browser": "Chrome", + "version": "18.0.1025.308" + }, + "Mozilla\/5.0 (Linux; Android 7.1.2; Pacific Build\/N2G48H) AppleWebKit\/537.36 (KHTML, like Gecko) OculusBrowser\/5.5.10.137831012 SamsungBrowser\/4.0 Chrome\/66.0.3359.203 Mobile VR Safari\/537.36": { + "platform": "Android", + "browser": "OculusBrowser", + "version": "5.5.10.137831012" + }, + "Mozilla\/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit\/534.35 (KHTML, like Gecko) Chrome\/11.0.696.65 Safari\/534.35 Puffin\/2.9174AP": { + "platform": "Android", + "browser": "Puffin", + "version": "2.9174" + }, + "Mozilla\/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit\/534.35 (KHTML, like Gecko) Chrome\/11.0.696.65 Safari\/534.35 Puffin\/2.9174AT": { + "platform": "Android", + "browser": "Puffin", + "version": "2.9174" + }, + "Mozilla\/5.0 (Linux; Android 7.1.1; Nexus 5X Build\/N4F26O; en-us) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.135 Mobile Safari\/537.36 Puffin\/6.0.7.15747AP": { + "platform": "Android", + "browser": "Puffin", + "version": "6.0.7.15747" + }, + "Mozilla\/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build\/LRX22G) AppleWebKit\/537.36 (KHTML, like Gecko) SamsungBrowser\/4.0 Chrome\/44.0.2403.133 Mobile Safari\/537.36": { + "platform": "Android", + "browser": "SamsungBrowser", + "version": "4.0" + }, + "Mozilla\/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925K Build\/LRX22G) AppleWebKit\/537.36 (KHTML, like Gecko) SamsungBrowser\/4.0 Chrome\/44.0.2403.133 Mobile VR Safari\/537.36": { + "platform": "Android", + "browser": "SamsungBrowser", + "version": "4.0" + }, + "Mozilla\/5.0 (Linux; U; Android 4.4.2; en-US; LG-D325 Build\/KOT49I.A1411471607) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 UCBrowser\/10.2.0.535 U3\/0.8.0 Mobile Safari\/534.30": { + "platform": "Android", + "browser": "UC Browser", + "version": "10.2.0.535" + }, + "Mozilla\/5.0 (Linux; U; Android 5.1.1; en-US; SM-G925F Build\/LMY47X) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 UCBrowser\/10.7.5.658 U3\/0.8.0 Mobile Safari\/534.30": { + "platform": "Android", + "browser": "UC Browser", + "version": "10.7.5.658" + }, + "Mozilla\/5.0 (Linux; U; Android 6.0; en-US; ZTE BLADE V7 Build\/MRA58K) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/57.0.2987.108 UCBrowser\/13.0.8.1291 Mobile Safari\/537.36": { + "platform": "Android", + "browser": "UC Browser", + "version": "13.0.8.1291" + }, + "Mozilla\/5.0 (BlackBerry; U; BlackBerry 9780; en) AppleWebKit\/534.8+ (KHTML, like Gecko) Version\/6.0.0.723 Mobile Safari\/534.8+": { + "platform": "BlackBerry", + "browser": "BlackBerry Browser", + "version": "6.0.0.723" + }, + "Mozilla\/5.0 (BB10; Touch) AppleWebKit\/537.10+ (KHTML, like Gecko) Version\/10.0.9.2372 Mobile Safari\/537.10+": { + "platform": "BlackBerry", + "browser": "BlackBerry Browser", + "version": "10.0.9.2372" + }, + "Mozilla\/5.0 (X11; FreeBSD amd64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/38.0.2125.104 Safari\/537.36": { + "platform": "FreeBSD", + "browser": "Chrome", + "version": "38.0.2125.104" + }, + "Mozilla\/5.0 (X11; FreeBSD amd64; rv:43.0) Gecko\/20100101 Firefox\/43.0": { + "platform": "FreeBSD", + "browser": "Firefox", + "version": "43.0" + }, + "Mozilla\/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) CriOS\/29.0.1547.11 Mobile\/9B206 Safari\/7534.48.3": { + "platform": "iPad", + "browser": "Chrome", + "version": "29.0.1547.11" + }, + "Mozilla\/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) CriOS\/30.0.1599.12 Mobile\/11A465 Safari\/8536.25": { + "platform": "iPad", + "browser": "Chrome", + "version": "30.0.1599.12" + }, + "Mozilla\/5.0 (X11; U; Linux x86_64; en-AU) AppleWebKit\/534.35 (KHTML, like Gecko) Chrome\/11.0.696.65 Safari\/534.35 Puffin\/3.9174IT": { + "platform": "iPad", + "browser": "Puffin", + "version": "3.9174" + }, + "Mozilla\/5.0 (iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit\/531.21.10 (KHTML, like Gecko) Version\/4.0.4 Mobile\/7B314 Safari\/531.21.10": { + "platform": "iPad", + "browser": "Safari", + "version": "4.0.4" + }, + "Mozilla\/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit\/531.21.10 (KHTML, like Gecko) Version\/4.0.4 Mobile\/7B334b Safari\/531.21.10": { + "platform": "iPad", + "browser": "Safari", + "version": "4.0.4" + }, + "Mozilla\/5.0 (iPad; U; CPU OS 7 like Mac OS X; en-us; iPad3,3) AppleWebKit\/534.46 (KHTML, like Gecko) UCBrowser\/2.4.0.367 U3\/1 Safari\/7543.48.3": { + "platform": "iPad", + "browser": "UC Browser", + "version": "2.4.0.367" + }, + "Mozilla\/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit\/534.46.0 (KHTML, like Gecko) CriOS\/19.0.1084.60 Mobile\/9B206 Safari\/7534.48.3": { + "platform": "iPhone", + "browser": "Chrome", + "version": "19.0.1084.60" + }, + "Mozilla\/5.0 (iPhone; CPU iPhone OS 7_0_2 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) CriOS\/30.0.1599.12 Mobile\/11A501 Safari\/8536.25": { + "platform": "iPhone", + "browser": "Chrome", + "version": "30.0.1599.12" + }, + "Mozilla\/5.0 (iPod; U; CPU iPhone OS 6_1 like Mac OS X; en-HK) AppleWebKit\/534.35 (KHTML, like Gecko) Chrome\/11.0.696.65 Safari\/534.35 Puffin\/3.9174IP Mobile": { + "platform": "iPhone", + "browser": "Puffin", + "version": "3.9174" + }, + "Mozilla\/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit\/420+ (KHTML, like Gecko) Version\/3.0 Mobile\/1C25 Safari\/419.3": { + "platform": "iPhone", + "browser": "Safari", + "version": "3.0" + }, + "Mozilla\/5.0 (iPhone; U; CPU iPhone OS 4_2_6 like Mac OS X; en-us) AppleWebKit\/533.17.9 (KHTML, like Gecko) Version\/5.0.2 Mobile\/8E200 Safari\/6533.18.5": { + "platform": "iPhone", + "browser": "Safari", + "version": "5.0.2" + }, + "Mozilla\/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit\/420.1 (KHTML, like Gecko) Version\/3.0 Mobile\/3A101a Safari\/419.3": { + "platform": "iPod", + "browser": "Safari", + "version": "3.0" + }, + "Mozilla\/5.0 (iPod; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit\/534.46 (KHTML, like Gecko) Version\/5.1 Mobile\/9A405 Safari\/7534.48.3": { + "platform": "iPod", + "browser": "Safari", + "version": "5.1" + }, + "Mozilla\/5.0 (iPod touch; CPU iPhone OS 7_0_3 like Mac OS X) AppleWebKit\/537.51.1 (KHTML, like Gecko) Version\/7.0 Mobile\/11B511 Safari\/9537.53": { + "platform": "iPod", + "browser": "Safari", + "version": "7.0" + }, + "Mozilla\/4.0 (compatible; Linux 2.6.10) NetFront\/3.3 Kindle\/1.0 (screen 600x800)": { + "platform": "Kindle", + "browser": "Kindle", + "version": "1.0" + }, + "Mozilla\/5.0 (Linux; U; en-US) AppleWebKit\/528.5+ (KHTML, like Gecko, Safari\/528.5+) Version\/4.0 Kindle\/3.0 (screen 600x800; rotate)": { + "platform": "Kindle", + "browser": "Kindle", + "version": "3.0" + }, + "Mozilla\/5.0 (Linux; U; en-US) AppleWebKit\/528.5+ (KHTML, like Gecko, Safari\/538.5+) Version\/4.0 Kindle\/3.0 (screen 600x800; rotate)": { + "platform": "Kindle", + "browser": "Kindle", + "version": "3.0" + }, + "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build\/GINGERBREAD) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1": { + "platform": "Kindle Fire", + "browser": "Kindle", + "version": "4.0" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk\/1.0.13.81_10003810) AppleWebKit\/533.16 (KHTML, like Gecko) Version\/5.0 Safari\/533.16 Silk-Accelerated=true": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "1.0.13.81" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk\/1.0.146.3-Gen4_12000410) AppleWebKit\/533.16 (KHTML, like Gecko) Version\/5.0 Safari\/533.16 Silk-Accelerated=true": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "1.0.146.3" + }, + "Mozilla\/5.0 (Linux; U; Android 2.3.4; en-us; Silk\/1.1.0-84) AppleWebKit\/533.1 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/533.1 Silk-Accelerated=false": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "1.1.0" + }, + "Mozilla\/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk\/1.1.0-80) AppleWebKit\/533.16 (KHTML, like Gecko) Version\/5.0 Safari\/533.16 Silk-Accelerated=true": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "1.1.0" + }, + "Mozilla\/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/2.1 Mobile Safari\/535.19 Silk-Accelerated=true": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "2.1" + }, + "Mozilla\/5.0 (Linux; U; en-us; KFTT Build\/IML74K) AppleWebKit\/535.19 (KHTML, like Gecko) Silk\/2.2 Safari\/535.19 Silk-Accelerated=true": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "2.2" + }, + "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; KFTHWI Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Silk\/3.22 like Chrome\/34.0.1847.137 Mobile Safari\/537.36": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "3.22" + }, + "Mozilla\/5.0 (Linux; U; Android 4.2.2; en-us; KFTHWI Build\/JDQ39) AppleWebKit\/537.36 (KHTML, like Gecko) Silk\/3.22 like Chrome\/34.0.1847.137 Safari\/537.36": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "3.22" + }, + "Mozilla\/5.0 (X11; Linux x86_64; U; en-us) AppleWebKit\/537.36 (KHTML, like Gecko) Silk\/3.22 like Chrome\/34.0.1847.137 Safari\/537.36": { + "platform": "Kindle Fire", + "browser": "Silk", + "version": "3.22" + }, + "Mozilla\/5.0 (X11; NetBSD i386) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.124 Safari\/537.36": { + "platform": "NetBSD", + "browser": "Chrome", + "version": "43.0.2357.124" + }, + "Mozilla\/5.0 (X11; NetBSD amd64; rv:42.0) Gecko\/20100101 Firefox\/42.0": { + "platform": "NetBSD", + "browser": "Firefox", + "version": "42.0" + }, + "Mozilla\/5.0 (New Nintendo 3DS like iPhone) AppleWebKit\/536.30 (KHTML, like Gecko) NX\/3.0.0.5.8 Mobile NintendoBrowser\/1.0.9934.JP": { + "platform": "New Nintendo 3DS", + "browser": "NintendoBrowser", + "version": "1.0.9934.JP" + }, + "Mozilla\/5.0 (New Nintendo 3DS like iPhone) AppleWebKit\/536.30 (KHTML, like Gecko) NX\/3.0.0.5.22 Mobile NintendoBrowser\/1.10.10166.US": { + "platform": "New Nintendo 3DS", + "browser": "NintendoBrowser", + "version": "1.10.10166.US" + }, + "Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7498.US": { + "platform": "Nintendo 3DS", + "browser": "NintendoBrowser", + "version": "1.7498.US" + }, + "Mozilla\/5.0 (Nintendo 3DS; U; ; en) Version\/1.7552.EU": { + "platform": "Nintendo 3DS", + "browser": "NintendoBrowser", + "version": "1.7552.EU" + }, + "Bunjalloo\/0.7.6(Nintendo DS;U;en)": { + "platform": "Nintendo DS", + "browser": "Bunjalloo", + "version": "0.7.6" + }, + "Mozilla\/5.0 (Nintendo Switch; LoginApplet) AppleWebKit\/601.6 (KHTML, like Gecko) NF\/4.0.0.5.9 NintendoBrowser\/5.1.0.13341": { + "platform": "Nintendo Switch", + "browser": "NintendoBrowser", + "version": "5.1.0.13341" + }, + "Mozilla\/5.0 (Nintendo Switch; ShareApplet) AppleWebKit\/601.6 (KHTML, like Gecko) NF\/4.0.0.5.9 NintendoBrowser\/5.1.0.13341": { + "platform": "Nintendo Switch", + "browser": "NintendoBrowser", + "version": "5.1.0.13341" + }, + "Opera\/9.00 (Nintendo Wii; U; ; 1038-58; Wii Shop Channel\/1.0; en)": { + "platform": "Nintendo Wii", + "browser": "Opera", + "version": "9.00" + }, + "Opera\/9.30 (Nintendo Wii; U; ; 2071; Wii Shop Channel\/1.0; en)": { + "platform": "Nintendo Wii", + "browser": "Opera", + "version": "9.30" + }, + "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/534.52 (KHTML, like Gecko) NX\/2.1.0.8.21 NintendoBrowser\/1.0.0.7494.US": { + "platform": "Nintendo WiiU", + "browser": "NintendoBrowser", + "version": "1.0.0.7494.US" + }, + "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/534.52 (KHTML, like Gecko) NX\/2.1.0.10.9 NintendoBrowser\/1.5.0.8047.US": { + "platform": "Nintendo WiiU", + "browser": "NintendoBrowser", + "version": "1.5.0.8047.US" + }, + "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/536.30 (KHTML, like Gecko) NX\/3.0.4.2.13 NintendoBrowser\/4.3.2.11274.EU": { + "platform": "Nintendo WiiU", + "browser": "NintendoBrowser", + "version": "4.3.2.11274.EU" + }, + "Mozilla\/5.0 (Nintendo WiiU) AppleWebKit\/536.30 (KHTML, like Gecko) NX\/3.0.4.2.13 NintendoBrowser\/4.3.2.11274.US": { + "platform": "Nintendo WiiU", + "browser": "NintendoBrowser", + "version": "4.3.2.11274.US" + }, + "Mozilla\/5.0 (X11; OpenBSD i386) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/43.0.2357.81 Safari\/537.36": { + "platform": "OpenBSD", + "browser": "Chrome", + "version": "43.0.2357.81" + }, + "Mozilla\/5.0 (X11; OpenBSD amd64; rv:43.0) Gecko\/20100101 Firefox\/43.0 SeaMonkey\/2.40": { + "platform": "OpenBSD", + "browser": "Firefox", + "version": "43.0" + }, + "Mozilla\/5.0 (PlayBook; U; RIM Tablet OS 2.0.1; en-US) AppleWebKit\/535.8+ (KHTML, like Gecko) Version\/7.2.0.1 Safari\/535.8+": { + "platform": "PlayBook", + "browser": "BlackBerry Browser", + "version": "7.2.0.1" + }, + "Mozilla\/4.0 (PS3 (PlayStation 3); 1.00)": { + "platform": "PlayStation 3", + "browser": "NetFront", + "version": "1.00" + }, + "Mozilla\/5.0 (PLAYSTATION 3; 1.00)": { + "platform": "PlayStation 3", + "browser": "NetFront", + "version": "1.00" + }, + "Mozilla\/5.0 (PLAYSTATION 3; 3.55)": { + "platform": "PlayStation 3", + "browser": "NetFront", + "version": "3.55" + }, + "Mozilla\/5.0 (PLAYSTATION 3 4.20) AppleWebKit\/531.22.8 (KHTML, like Gecko)": { + "platform": "PlayStation 3", + "browser": "NetFront", + "version": "4.20" + }, + "Mozilla\/5.0 (PlayStation 4 1.50) AppleWebKit\/536.26 (KHTML, like Gecko)": { + "platform": "PlayStation 4", + "browser": "NetFront", + "version": "1.50" + }, + "Mozilla\/5.0 (Playstation Vita 1.50) AppleWebKit\/531.22.8 (KHTML, like Gecko) Silk\/3.2": { + "platform": "PlayStation Vita", + "browser": "Browser", + "version": "1.50" + }, + "Mozilla\/5.0 (PlayStation Vita 1.69) AppleWebKit\/531.22.8 (KHTML, like Gecko) Silk\/3.2": { + "platform": "PlayStation Vita", + "browser": "Browser", + "version": "1.69" + }, + "Mozilla\/5.0 (Linux; Tizen 2.3; SAMSUNG SM-Z130H) AppleWebKit\/537.3 (KHTML, like Gecko) SamsungBrowser\/1.0 ": { + "platform": "Tizen", + "browser": "SamsungBrowser", + "version": "1.0" + }, + "Mozilla\/5.0 (Linux; U; Tizen 2.0; en-us) AppleWebKit\/537.1 (KHTML, like Gecko) Mobile TizenBrowser\/2": { + "platform": "Tizen", + "browser": "TizenBrowser", + "version": "2" + }, + "Mozilla\/5.0 (Windows Phone 10.0; Android 4.2.1; Nokia; Lumia 520) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/42.0.2311.135 Mobile Safari\/537.36 Edge\/12.10130": { + "platform": "Windows Phone", + "browser": "Edge", + "version": "12.10130" + }, + "Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident\/3.1; IEMobile\/7.0) Asus;Galaxy6": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "7.0" + }, + "Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident\/3.1; IEMobile\/7.0) LG;LG-E900h)": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "7.0" + }, + "Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident\/3.1; IEMobile\/7.0; LG; GW910)": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "7.0" + }, + "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0)": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "9.0" + }, + "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; SAMSUNG; SGH-i917)": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "9.0" + }, + "Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident\/6.0; IEMobile\/10.0; ARM; Touch; NOKIA; Lumia 820)": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "10.0" + }, + "Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident\/6.0; IEMobile\/10.0; ARM; Touch; rv:11; NOKIA; Lumia 920) like Gecko": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "10.0" + }, + "Mozilla\/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident\/7.0; Touch; rv:11.0; IEMobile\/11.0; NOKIA; Lumia 520) like iPhone OS 7_0_3 Mac OS X AppleWebKit\/537 (KHTML, like Gecko) Mobile Safari\/537": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "11.0" + }, + "Mozilla\/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident\/7.0; Touch; rv:11.0; IEMobile\/11.0; NOKIA; Lumia 920; Vodafone ES) like iPhone OS 7_0_3 Mac OS X AppleWebkit\/537 (KHTML, like Gecko) Mobile Safari\/537": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "11.0" + }, + "Mozilla\/5.0 (Windows Phone 8.1; ARM; Trident\/7.0;Touch; rv:11.0; IEMobile\/11.0; Microsoft; Virtual) like Gecko": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "11.0" + }, + "Mozilla\/5.0 (Windows Phone 8.1; ARM; Trident\/7.0; Touch; rv:11; IEMobile\/11.0) like Android 4.1.2; compatible) like iPhone OS 7_0_3 Mac OS X WebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari\/537.36": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "11.0" + }, + "Mozilla\/5.0 (Windows Phone 8.1; ARM; Trident\/7.0; Touch; rv:11; IEMobile\/11.0) like Android 4.1.2; compatible) like iPhone OS 7_0_3 MacWebKit\/537.36 (KHTML, like Gecko) Chrome\/32.0.1700.99 Mobile Safari \/537.36": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "11.0" + }, + "Mozilla\/5.0 (Windows Phone 8.1; ARM; Trident\/7.0; Touch; rv:11; IEMobile\/11.0; NOKIA; Lumia 928) like Gecko": { + "platform": "Windows Phone", + "browser": "IEMobile", + "version": "11.0" + }, + "Mozilla\/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.5; Trident\/3.1; IEMobile\/7.0; Xbox)": { + "platform": "Xbox", + "browser": "IEMobile", + "version": "7.0" + }, + "Mozilla\/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident\/5.0; Xbox), or Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Xbox)": { + "platform": "Xbox", + "browser": "IEMobile", + "version": "9.0" + }, + "Mozilla\/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/9.0; Xbox)": { + "platform": "Xbox", + "browser": "IEMobile", + "version": "9.0" + }, + "Mozilla\/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident\/3.1; Xbox)": { + "platform": "Xbox", + "browser": "MSIE", + "version": "7.0" + }, + "Mozilla\/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident\/5.0; Xbox)": { + "platform": "Xbox", + "browser": "MSIE", + "version": "9.0" + }, + "Mozilla\/5.0 (Windows NT 10.0; Win64; x64; Xbox; Xbox One) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/77.0.3865.90 Safari\/537.36 Edge\/40.15063.0\n": { + "platform": "Xbox One", + "browser": "Edge", + "version": "40.15063.0" + }, + "Mozilla\/5.0 (compatible; MSIE 10.0; Windows Phone OS 7.5; Trident\/5.0; IEMobile\/10.0; Xbox; Xbox One)": { + "platform": "Xbox One", + "browser": "IEMobile", + "version": "10.0" + }, + "Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident\/6.0; Xbox; Xbox One)": { + "platform": "Xbox One", + "browser": "MSIE", + "version": "10.0" + }, + "AdsBot-Google (+http:\/\/www.google.com\/adsbot.html)": { + "platform": null, + "browser": "AdsBot-Google", + "version": null + }, + "Mozilla\/5.0 (compatible; Baiduspider\/2.0; +http:\/\/www.baidu.com\/search\/spider.html)": { + "platform": null, + "browser": "Baiduspider", + "version": "2.0" + }, + "Mozilla\/5.0 (compatible; bingbot\/2.0; +http:\/\/www.bing.com\/bingbot.htm)": { + "platform": null, + "browser": "bingbot", + "version": "2.0" + }, + "curl\/7.19.7 (universal-apple-darwin10.0) libcurl\/7.19.7 OpenSSL\/0.9.8r zlib\/1.2.3": { + "platform": null, + "browser": "curl", + "version": "7.19.7" + }, + "facebookexternalhit\/1.1 (+http:\/\/www.facebook.com\/externalhit_uatext.php)": { + "platform": null, + "browser": "facebookexternalhit", + "version": "1.1" + }, + "FeedValidator\/1.3": { + "platform": null, + "browser": "FeedValidator", + "version": "1.3" + }, + "Googlebot\/1.3": { + "platform": null, + "browser": "Googlebot", + "version": "1.3" + }, + "Mozilla\/5.0 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)": { + "platform": null, + "browser": "Googlebot", + "version": "2.1" + }, + "Googlebot-Image\/1.0": { + "platform": null, + "browser": "Googlebot-Image", + "version": "1.0" + }, + "Googlebot-Video\/1.0": { + "platform": null, + "browser": "Googlebot-Video", + "version": "1.0" + }, + "Lynx\/2.8.6rel.4 libwww-FM\/2.14 SSL-MM\/1.4.1 OpenSSL\/0.9.7l Lynxlet\/0.7.0": { + "platform": null, + "browser": "Lynx", + "version": "2.8.6rel.4" + }, + "msnbot-media\/1.1 (+http:\/\/search.msn.com\/msnbot.htm)": { + "platform": null, + "browser": "msnbot-media", + "version": "1.1" + }, + "WordPress\/3.7.1; http:\/\/wordpress.com": { + "platform": null, + "browser": "WordPress", + "version": "3.7.1" + }, + "Mozilla\/5.0 (compatible; YandexBot\/3.0; +http:\/\/yandex.com\/bots)": { + "platform": null, + "browser": "YandexBot", + "version": "3.0" + } +}